diff --git a/.github/.assets/aggkit-logo.svg b/.github/.assets/aggkit-logo.svg new file mode 100644 index 00000000..cba03359 --- /dev/null +++ b/.github/.assets/aggkit-logo.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..c290aa02 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +@agglayer/aggkit diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..0f319476 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,41 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG] " +labels: bug +assignees: '' + +--- + +# Bug Report + +## Description + +A clear and concise description of what the bug is. + +## To Reproduce + +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +## Expected behavior + +A clear and concise description of what you expected to happen. + +## Screenshots + +If applicable, add screenshots to help explain your problem. + +## Environment (please complete the following information): + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] + +## Additional context + +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..ffe5c81a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,26 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[FEATURE] " +labels: enhancement +assignees: '' + +--- + +# Feature Request + +## Is your feature request related to a problem? Please describe + +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +## Describe the solution you'd like + +A clear and concise description of what you want to happen. + +## Describe alternatives you've considered + +A clear and concise description of any alternative solutions or features you've considered. + +## Additional context + +Add any other context or screenshots about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..dcee3469 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,5 @@ +## Description + +Please include a summary of the change and which issue is fixed. Also, include relevant motivation and context. List any dependencies that are required for this change. + +Fixes # (issue) diff --git a/.github/assets/cdk-logo-name.png b/.github/assets/cdk-logo-name.png new file mode 100644 index 00000000..4b205936 Binary files /dev/null and b/.github/assets/cdk-logo-name.png differ diff --git a/.github/assets/cdk-logo.svg b/.github/assets/cdk-logo.svg new file mode 100644 index 00000000..cba03359 --- /dev/null +++ b/.github/assets/cdk-logo.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.github/workflows/arm_deb_packager.yml b/.github/workflows/arm_deb_packager.yml new file mode 100644 index 00000000..4a11e6e5 --- /dev/null +++ b/.github/workflows/arm_deb_packager.yml @@ -0,0 +1,89 @@ +name: arm_deb_packager + + +on: + push: + branches: + - 'main' + paths: + - '**' + tags: + - 'v*.*.*' + - 'v*.*.*-*' + +jobs: + build: + permissions: + id-token: write + contents: write + runs-on: + labels: arm-runner-2204 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up Go + uses: actions/setup-go@master + with: + go-version: 1.22.x + # Variables + - name: Adding TAG to ENV + run: echo "GIT_TAG=`echo $(git describe --tags --abbrev=0)`" >> $GITHUB_ENV + - name: adding version + run: | + NUMERIC_VERSION=$( echo ${{ env.GIT_TAG }} | sed 's/[^0-9.]//g' ) + echo "VERSION=$NUMERIC_VERSION" >> $GITHUB_ENV + + - name: go mod download + run: go mod download + + - name: Build the binary + run: make build + + - name: Build the rust binary + run: | + BUILD_SCRIPT_DISABLED=1 + cargo build --release --bin aggkit-cli + + - name: making directory structure + run: mkdir -p packaging/deb/aggkit/usr/bin/ + - name: copying necessary binary for arm64 + run: cp -rp target/aggkit packaging/deb/aggkit/usr/bin/aggkit + - name: copying rust binary for arm64 + run: cp -rp target/release/aggkit-cli packaging/deb/aggkit-cli/usr/bin/aggkit-cli + + # Control file creation + - name: Create control file + run: | + echo "Package: aggkit" >> packaging/deb/aggkit/DEBIAN/control + echo "Version: ${{ env.VERSION }}" >> packaging/deb/aggkit/DEBIAN/control + echo "Section: base" >> packaging/deb/aggkit/DEBIAN/control + echo "Priority: optional" >> packaging/deb/aggkit/DEBIAN/control + echo "Architecture: arm64" >> packaging/deb/aggkit/DEBIAN/control + echo "Maintainer: devops@polygon.technology" >> packaging/deb/aggkit/DEBIAN/control + echo "Description: aggkit binary package" >> packaging/deb/aggkit/DEBIAN/control + + - name: Creating package for binary for aggkit ${{ env.ARCH }} + run: cp -rp packaging/deb/aggkit packaging/deb/aggkit-${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + + - name: Running package build + run: dpkg-deb --build --root-owner-group packaging/deb/aggkit-${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: arm64 + + - name: create checksum for the arm64 package + run: cd packaging/deb/ && sha256sum aggkit-${{ env.GIT_TAG }}-${{ env.ARCH }}.deb > aggkit-${{ env.GIT_TAG }}-${{ env.ARCH }}.deb.checksum + env: + ARCH: arm64 + + - name: Release aggkit Packages + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.GIT_TAG }} + prerelease: true + files: | + packaging/deb/aggkit**.deb + packaging/deb/aggkit**.deb.checksum diff --git a/.github/workflows/arm_rpm_packager.yml b/.github/workflows/arm_rpm_packager.yml new file mode 100644 index 00000000..c513a24a --- /dev/null +++ b/.github/workflows/arm_rpm_packager.yml @@ -0,0 +1,103 @@ +name: arm_rpm_packager + +on: + push: + branches: + - 'main' + paths: + - '**' + tags: + - 'v*.*.*' + - 'v*.*.*-*' + +jobs: + build: + permissions: + id-token: write + contents: write + runs-on: + labels: arm-runner-2204 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up Go + uses: actions/setup-go@master + with: + go-version: 1.22.x + - name: Adding TAG to ENV + run: echo "GIT_TAG=`echo $(git describe --tags --abbrev=0)`" >> $GITHUB_ENV + + - name: Adding a TAG.1 to the env + run: echo "GIT_TAG1=`echo $(git describe --tags --abbrev=0)`" | sed 's/-/./g' >> $GITHUB_ENV + + - name: Download deps for project + run: go mod download + + - name: Building aggkit for amd64 + run: make build + + - name: Building the aggkit for arm64 + run: | + BUILD_SCRIPT_DISABLED=1 + cargo build --release --bin aggkit-cli + + - name: Installing some dependencies + run: sudo apt-get update && sudo apt-get install -y rpm + + - name: Setup rpm package for binary + run: | + mkdir -p packaging/rpm/SPECS + mkdir -p packaging/rpm/BUILD + mkdir -p packaging/rpm/RPMS + mkdir -p packaging/rpm/SRPMS + + touch packaging/rpm/aggkit.spec + echo "Name: aggkit" >> packaging/rpm/SPECS/aggkit.spec + echo "Version: ${{ env.GIT_TAG1 }}" >> packaging/rpm/SPECS/aggkit.spec + echo "Release: 1%{?dist}" >> packaging/rpm/SPECS/aggkit.spec + echo "License: GPL/AGPL" >> packaging/rpm/SPECS/aggkit.spec + echo "BuildArch: aarch64" >> packaging/rpm/SPECS/aggkit.spec + echo "Summary: aggkit rpm package" >> packaging/rpm/SPECS/aggkit.spec + + echo "%description" >> packaging/rpm/SPECS/aggkit.spec + echo "aggkit rpm package" >> packaging/rpm/SPECS/aggkit.spec + + echo "%pre" >> packaging/rpm/SPECS/aggkit.spec + echo "getent group aggkit >/dev/null || groupadd -r aggkit" >> packaging/rpm/SPECS/aggkit.spec + echo "getent passwd aggkit >/dev/null || useradd -s /bin/false -d /opt/aggkit -r aggkit -g aggkit" >> packaging/rpm/SPECS/aggkit.spec + + echo "%install" >> packaging/rpm/SPECS/aggkit.spec + echo "mkdir -p %{buildroot}/usr/bin" >> packaging/rpm/SPECS/aggkit.spec + echo "cp /home/runner/work/aggkit/aggkit/target/aggkit %{buildroot}/usr/bin/aggkit" >> packaging/rpm/SPECS/aggkit.spec + echo "cp /home/runner/work/aggkit/aggkit/target/release/aggkit %{buildroot}/usr/bin/aggkit" >> packaging/rpm/SPECS/aggkit.spec + + echo "%files" >> packaging/rpm/SPECS/aggkit.spec + echo "/usr/bin/aggkit" >> packaging/rpm/SPECS/aggkit.spec + echo "/usr/bin/aggkit" >> packaging/rpm/SPECS/aggkit.spec + + + - name: Construct rpm package + run: | + rpmbuild --define "_topdir /home/runner/work/aggkit/aggkit/packaging/rpm_build" \ + --define "_builddir %{_topdir}/BUILD" \ + --define "_rpmdir %{_topdir}/RPMS" \ + --define "_srcrpmdir %{_topdir}/SRPMS" \ + --define "__spec_install_post /bin/true" \ + -bb packaging/rpm/SPECS/aggkit.spec + + - name: Rename file for post rpm build and for checksum + run: mv /home/runner/work/aggkit/aggkit/packaging/rpm_build/RPMS/aarch64/aggkit-${{ env.GIT_TAG1 }}-1.aarch64.rpm /home/runner/work/aggkit/aggkit/packaging/rpm_build/RPMS/aarch64/aggkit-${{ env.GIT_TAG1 }}.aarch64.rpm + + - name: Checksum for the rpm package + run: sha256sum /home/runner/work/aggkit/aggkit/packaging/rpm_build/RPMS/aarch64/aggkit-${{ env.GIT_TAG1 }}.aarch64.rpm > /home/runner/work/aggkit/aggkit/packaging/rpm_build/RPMS/aarch64/aggkit-${{ env.GIT_TAG1 }}.aarch64.rpm.checksum + + - name: Release aggkit Packages + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.GIT_TAG }} + prerelease: true + files: | + packaging/rpm_build/RPMS/aarch64/aggkit-**.rpm + packaging/rpm_build/RPMS/aarch64/aggkit-**.rpm.checksum diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..f6205e61 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,44 @@ +name: "CodeQL" + +on: + push: + branches: + - develop + - main + pull_request: + +jobs: + analyze: + name: Analyze + runs-on: ${{ matrix.language == 'swift' && 'macos-latest' || 'ubuntu-latest' }} + timeout-minutes: ${{ matrix.language == 'swift' && 120 || 360 }} + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: + - go + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v2 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{ matrix.language }}" diff --git a/.github/workflows/lint-pr.yml b/.github/workflows/lint-pr.yml new file mode 100644 index 00000000..9a24eaf2 --- /dev/null +++ b/.github/workflows/lint-pr.yml @@ -0,0 +1,22 @@ +name: Checking PR semantic + +on: + pull_request: + types: [opened, synchronize, reopened] + +permissions: + contents: read + pull-requests: read + statuses: write + +jobs: + title: + name: Validate PR title + runs-on: ubuntu-latest + steps: + - uses: amannn/action-semantic-pull-request@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + ignoreLabels: | + release diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..77255d39 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,24 @@ +name: Lint +on: + push: + branches: + - main + - develop + - update-external-dependencies + - 'release/**' + pull_request: +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: 1.21.x + - name: Checkout code + uses: actions/checkout@v4 + - name: golangci-lint + uses: golangci/golangci-lint-action@v6 + with: + version: v1.61 + args: --timeout=30m diff --git a/.github/workflows/mdbook.yml b/.github/workflows/mdbook.yml new file mode 100644 index 00000000..8ea4f496 --- /dev/null +++ b/.github/workflows/mdbook.yml @@ -0,0 +1,62 @@ +# Sample workflow for building and deploying a mdBook site to GitHub Pages +# +# To get started with mdBook see: https://rust-lang.github.io/mdBook/index.html +# +name: Deploy mdBook site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["develop"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + env: + MDBOOK_VERSION: 0.4.36 + steps: + - uses: actions/checkout@v4 + - name: Install mdBook + run: | + curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh + rustup update + cargo install --version ${MDBOOK_VERSION} mdbook + cargo install mdbook-alerts + cargo install mdbook-mermaid + - name: Setup Pages + id: pages + uses: actions/configure-pages@v5 + - name: Build with mdBook + run: mdbook build + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./book + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..f388cdd0 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,130 @@ +name: Release + +on: + push: + tags: + - 'v*.*.*' + - 'v*.*.*-*' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: write + packages: write + +env: + REGISTRY: ghcr.io + REGISTRY_IMAGE: ghcr.io/${{ github.repository }} + REGEX_IMAGE: ${{ github.repository }}:\\d+.\\d+.\\d+ + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm64 + outputs: + IMAGE_NAME: ${{ steps.image_builder.outputs.IMAGE }} + TAGS: ${{ steps.meta.outputs.tags }} + VERSION: ${{ steps.meta.outputs.version }} + steps: + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - name: Checkout + uses: actions/checkout@v4 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY_IMAGE }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + + - name: Image name builder + id: image_builder + run: | + IMAGE=$(jq -ecr '.tags | map(select(match("${{ env.REGEX_IMAGE }}", "i"))) | first| sub(":.*$";"")' <<< "$DOCKER_METADATA_OUTPUT_JSON") + echo "IMAGE=$IMAGE" >> $GITHUB_OUTPUT + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 + with: + context: . + push: false + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + outputs: type=image,name=${{ steps.image_builder.outputs.IMAGE }},push-by-digest=true,push=true + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + needs: + - build + steps: + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cRr 'split("\n") | map(gsub("\\s+";"")) | map("-t "+ .) | join(" ")' <<< '${{ needs.build.outputs.TAGS }}') \ + $(printf '${{ needs.build.outputs.IMAGE_NAME }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ needs.build.outputs.IMAGE_NAME }}:${{ needs.build.outputs.VERSION }} diff --git a/.github/workflows/test-e2e-multi_pp.yml b/.github/workflows/test-e2e-multi_pp.yml new file mode 100644 index 00000000..a04cc183 --- /dev/null +++ b/.github/workflows/test-e2e-multi_pp.yml @@ -0,0 +1,86 @@ +# based on: https://github.com/0xPolygon/kurtosis-cdk/blob/jhilliard/multi-pp-testing/multi-pp-test.sh.md +name: Test e2e multi pp +on: + push: + branches: + - '**' + workflow_dispatch: {} + + +jobs: + test-e2e-multi_pp: + strategy: + fail-fast: false + matrix: + go-version: [ 1.22.x ] + goarch: [ "amd64" ] + e2e-group: + - "fork12-pessimistic" + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + env: + GOARCH: ${{ matrix.goarch }} + + + - name: Build Docker + run: make build-docker + + - name: Build Tools + run: make build-tools + + - name: Checkout kurtosis-cdk + uses: actions/checkout@v4 + with: + repository: 0xPolygon/kurtosis-cdk + path: kurtosis-cdk + ref: jhilliard/multi-pp-testing + + - name: Install Kurtosis CDK tools + uses: ./kurtosis-cdk/.github/actions/setup-kurtosis-cdk + + - name: Install polycli + run: | + git clone https://github.com/0xPolygon/polygon-cli -b jhilliard/alonso + cd polygon-cli + make install + cp ~/go/bin/polycli /usr/local/bin/polycli + /usr/local/bin/polycli version + + - name: Setup Bats and bats libs + uses: bats-core/bats-action@2.0.0 + + - name: Test + run: make test-e2e-fork12-multi-pessimistic + + working-directory: test + env: + KURTOSIS_FOLDER: ${{ github.workspace }}/kurtosis-cdk + BATS_LIB_PATH: /usr/lib/ + agglayer_prover_sp1_key: ${{ secrets.SP1_PRIVATE_KEY }} + + - name: Dump enclave logs + if: failure() + run: kurtosis dump ./dump + + - name: Generate archive name + if: failure() + run: | + archive_name="dump_run_with_args_${{matrix.e2e-group}}_${{ github.run_id }}" + echo "ARCHIVE_NAME=${archive_name}" >> "$GITHUB_ENV" + echo "Generated archive name: ${archive_name}" + kurtosis service exec aggkit cdk-node-001 'cat /etc/cdk/cdk-node-config.toml' > ./dump/cdk-node-config.toml + + - name: Upload logs + if: failure() + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARCHIVE_NAME }} + path: ./dump diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml new file mode 100644 index 00000000..76d2b078 --- /dev/null +++ b/.github/workflows/test-e2e.yml @@ -0,0 +1,116 @@ +name: Test e2e +on: + push: + branches: + - '**' + workflow_dispatch: {} + + +jobs: + build-aggkit-image: + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: 1.22.x + + - name: Build aggkit docker image + run: make build-docker + + - name: Save aggkit image to archive + run: docker save --output /tmp/aggkit.tar aggkit + + - name: Upload archive + uses: actions/upload-artifact@v4 + with: + name: aggkit + path: /tmp/aggkit.tar + + test-e2e: + runs-on: ubuntu-latest + timeout-minutes: 30 + needs: build-aggkit-image + strategy: + fail-fast: false + matrix: + e2e-group: + - "fork9-validium" + - "fork11-rollup" + - "fork12-validium" + - "fork12-rollup" + - "fork12-pessimistic" + steps: + - uses: actions/checkout@v4 + + - name: Checkout kurtosis-cdk repository + uses: actions/checkout@v4 + with: + go-version: ${{ matrix.go-version }} + env: + GOARCH: ${{ matrix.goarch }} + + - name: Build Docker + run: make build-docker + + - name: Checkout kurtosis-cdk + uses: actions/checkout@v4 + with: + repository: 0xPolygon/kurtosis-cdk + path: kurtosis-cdk + ref: v0.2.24 + + - name: Install Kurtosis CDK tools + uses: ./kurtosis-cdk/.github/actions/setup-kurtosis-cdk + + - name: Install polycli + run: | + POLYCLI_VERSION="${{ vars.POLYCLI_VERSION }}" + tmp_dir=$(mktemp -d) + curl -L "https://github.com/0xPolygon/polygon-cli/releases/download/${POLYCLI_VERSION}/polycli_${POLYCLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C "$tmp_dir" + mv "$tmp_dir"/* /usr/local/bin/polycli + rm -rf "$tmp_dir" + sudo chmod +x /usr/local/bin/polycli + /usr/local/bin/polycli version + + - name: Setup Bats and bats libs + uses: bats-core/bats-action@2.0.0 + + - name: Download aggkit archive + uses: actions/download-artifact@v4 + with: + name: aggkit + path: /tmp + + - name: Load aggkit image + run: | + docker load --input /tmp/aggkit.tar + docker image ls -a + + - name: Run e2e tests + run: make test-e2e-${{ matrix.e2e-group }} + working-directory: test + env: + KURTOSIS_FOLDER: ${{ github.workspace }}/kurtosis-cdk + BATS_LIB_PATH: /usr/lib/ + agglayer_prover_sp1_key: ${{ secrets.SP1_PRIVATE_KEY }} + + - name: Dump enclave logs + if: failure() + run: kurtosis dump ./dump + + - name: Generate archive name + if: failure() + run: | + archive_name="dump_run_with_args_${{matrix.e2e-group}}_${{ github.run_id }}" + echo "ARCHIVE_NAME=${archive_name}" >> "$GITHUB_ENV" + echo "Generated archive name: ${archive_name}" + kurtosis service exec aggkit cdk-node-001 'cat /etc/cdk/cdk-node-config.toml' > ./dump/cdk-node-config.toml + + - name: Upload logs + if: failure() + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARCHIVE_NAME }} + path: ./dump diff --git a/.github/workflows/test-resequence.yml b/.github/workflows/test-resequence.yml new file mode 100644 index 00000000..d65d9506 --- /dev/null +++ b/.github/workflows/test-resequence.yml @@ -0,0 +1,94 @@ +name: Resequence test +on: + push: + branches: + # Disable test for the moment as it takes too long + - "test_disabled" + +concurrency: + group: ${{ github.ref }} + cancel-in-progress: true + +jobs: + Resequence: + runs-on: ubuntu-latest + # TODO: Add "cdk-validium" once it's ready + # strategy: + # matrix: + # da-mode: [ "rollup" ] + steps: + - name: Checkout aggkit + uses: actions/checkout@v4 + with: + path: aggkit + + - name: Checkout cdk-erigon + uses: actions/checkout@v4 + with: + repository: 0xPolygonHermez/cdk-erigon + ref: banana + path: cdk-erigon + + - name: Checkout kurtosis-cdk + uses: actions/checkout@v4 + with: + repository: 0xPolygon/kurtosis-cdk + path: kurtosis-cdk + ref: v0.2.24 + + - name: Install Kurtosis CDK tools + uses: ./kurtosis-cdk/.github/actions/setup-kurtosis-cdk + + - name: Install polycli + run: | + POLYCLI_VERSION="${{ vars.POLYCLI_VERSION }}" + tmp_dir=$(mktemp -d) + curl -L "https://github.com/0xPolygon/polygon-cli/releases/download/${POLYCLI_VERSION}/polycli_${POLYCLI_VERSION}_linux_amd64.tar.gz" | tar -xz -C "$tmp_dir" + mv "$tmp_dir"/* /usr/local/bin/polycli + rm -rf "$tmp_dir" + sudo chmod +x /usr/local/bin/polycli + /usr/local/bin/polycli version + + - name: Build docker image + working-directory: ./aggkit + run: docker build -t aggkit:local --file Dockerfile . + + - name: Remove unused flags + working-directory: ./kurtosis-cdk + run: | + sed -i '/zkevm.sequencer-batch-seal-time:/d' templates/cdk-erigon/config.yml + sed -i '/zkevm.sequencer-non-empty-batch-seal-time:/d' templates/cdk-erigon/config.yml + + - name: Configure Kurtosis CDK + working-directory: ./kurtosis-cdk + run: | + /usr/local/bin/yq -i '.args.cdk_node_image = "aggkit:local"' params.yml + /usr/local/bin/yq -i '.args.zkevm_rollup_fork_id = "12"' params.yml + /usr/local/bin/yq -i '.args.zkevm_prover_image = "hermeznetwork/zkevm-prover:v8.0.0-RC5-fork.12"' params.yml + /usr/local/bin/yq -i '.args.cdk_erigon_node_image = "jerrycgh/cdk-erigon:d5d04906f723f3f1d8c43c9e6baf3e18c27ff348"' params.yml + + - name: Deploy Kurtosis CDK package + working-directory: ./kurtosis-cdk + run: kurtosis run --enclave cdk-v1 --args-file params.yml --image-download always . + + - name: Test resequence + working-directory: ./cdk-erigon + run: .github/scripts/test_resequence.sh + + - name: Dump enclave logs + if: failure() + run: kurtosis dump ./dump + + - name: Generate archive name + if: failure() + run: | + archive_name="dump_run_with_args_${{matrix.e2e-group}}_${{ github.run_id }}" + echo "ARCHIVE_NAME=${archive_name}" >> "$GITHUB_ENV" + echo "Generated archive name: ${archive_name}" + + - name: Upload logs + if: failure() + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARCHIVE_NAME }} + path: ./dump diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml new file mode 100644 index 00000000..66cfc010 --- /dev/null +++ b/.github/workflows/test-unit.yml @@ -0,0 +1,40 @@ +name: Test Unit and SonarCloud analysis + +on: + push: + branches: + - main + - develop + - 'release/**' + pull_request: + workflow_dispatch: {} + +jobs: + test-unit: + strategy: + fail-fast: false + matrix: + go-version: [1.22.4] + goarch: ["amd64"] + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + + - name: Install Go + uses: actions/setup-go@v5 + with: + go-version: ${{ matrix.go-version }} + env: + GOARCH: ${{ matrix.goarch }} + + - name: Test + run: make test-unit + + - name: Analyze with SonarCloud + uses: sonarsource/sonarcloud-github-action@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/x86_deb_packager.yml b/.github/workflows/x86_deb_packager.yml new file mode 100644 index 00000000..13320570 --- /dev/null +++ b/.github/workflows/x86_deb_packager.yml @@ -0,0 +1,89 @@ +name: x86_deb_packager + + +on: + push: + branches: + - 'main' + paths: + - '**' + tags: + - 'v*.*.*' + - 'v*.*.*-*' + +jobs: + build: + permissions: + id-token: write + contents: write + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up Go + uses: actions/setup-go@master + with: + go-version: 1.22.x + # Variables + - name: Adding TAG to ENV + run: echo "GIT_TAG=`echo $(git describe --tags --abbrev=0)`" >> $GITHUB_ENV + - name: adding version + run: | + NUMERIC_VERSION=$( echo ${{ env.GIT_TAG }} | sed 's/[^0-9.]//g' ) + echo "VERSION=$NUMERIC_VERSION" >> $GITHUB_ENV + + - name: go mod download + run: go mod download + + - name: Build the binary + run: make build + + - name: Build the rust binary + run: | + BUILD_SCRIPT_DISABLED=1 + cargo build --release --bin aggkit-cli + + - name: making directory structure + run: mkdir -p packaging/deb/aggkit/usr/bin/ + - name: copying necessary binary for amd64 + run: cp -rp target/aggkit packaging/deb/aggkit/usr/bin/aggkit + - name: copying rust binary for amd64 + run: cp -rp target/release/aggkit-cli packaging/deb/aggkit/usr/bin/aggkit-cli + + # Control file creation + - name: Create control file + run: | + echo "Package: aggkit" >> packaging/deb/aggkit/DEBIAN/control + echo "Version: ${{ env.VERSION }}" >> packaging/deb/aggkit/DEBIAN/control + echo "Section: base" >> packaging/deb/aggkit/DEBIAN/control + echo "Priority: optional" >> packaging/deb/aggkit/DEBIAN/control + echo "Architecture: amd64" >> packaging/deb/aggkit/DEBIAN/control + echo "Maintainer: devops@polygon.technology" >> packaging/deb/aggkit/DEBIAN/control + echo "Description: aggkit binary package" >> packaging/deb/aggkit/DEBIAN/control + + - name: Creating package for binary for aggkit ${{ env.ARCH }} + run: cp -rp packaging/deb/aggkit packaging/deb/aggkit-${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + + - name: Running package build + run: dpkg-deb --build --root-owner-group packaging/deb/aggkit-${{ env.GIT_TAG }}-${{ env.ARCH }} + env: + ARCH: amd64 + + - name: Create checksum for the amd64 package + run: cd packaging/deb/ && sha256sum aggkit-${{ env.GIT_TAG }}-${{ env.ARCH }}.deb > aggkit-${{ env.GIT_TAG }}-${{ env.ARCH }}.deb.checksum + env: + ARCH: amd64 + + + - name: Release aggkit Packages + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.GIT_TAG }} + prerelease: true + files: | + packaging/deb/aggkit**.deb + packaging/deb/aggkit**.deb.checksum diff --git a/.github/workflows/x86_rpm_packager.yml b/.github/workflows/x86_rpm_packager.yml new file mode 100644 index 00000000..9f06fb64 --- /dev/null +++ b/.github/workflows/x86_rpm_packager.yml @@ -0,0 +1,102 @@ +name: x86_rpm_packager + +on: + push: + branches: + - 'main' + paths: + - '**' + tags: + - 'v*.*.*' + - 'v*.*.*-*' + +jobs: + build: + permissions: + id-token: write + contents: write + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up Go + uses: actions/setup-go@master + with: + go-version: 1.22.x + - name: Adding TAG to ENV + run: echo "GIT_TAG=`echo $(git describe --tags --abbrev=0)`" >> $GITHUB_ENV + + - name: Adding a TAG.1 to the env + run: echo "GIT_TAG1=`echo $(git describe --tags --abbrev=0)`" | sed 's/-/./g' >> $GITHUB_ENV + + - name: Download deps for project + run: go mod download + + - name: Building cdk-node for amd64 + run: make build + + - name: Building the cdk + run: | + BUILD_SCRIPT_DISABLED=1 + cargo build --release --bin cdk + + - name: Installing some dependencies + run: sudo apt-get update && sudo apt-get install -y rpm + + - name: Setup rpm package for binary + run: | + mkdir -p packaging/rpm/SPECS + mkdir -p packaging/rpm/BUILD + mkdir -p packaging/rpm/RPMS + mkdir -p packaging/rpm/SRPMS + + touch packaging/rpm/cdk.spec + echo "Name: cdk" >> packaging/rpm/SPECS/cdk.spec + echo "Version: ${{ env.GIT_TAG1 }}" >> packaging/rpm/SPECS/cdk.spec + echo "Release: 1%{?dist}" >> packaging/rpm/SPECS/cdk.spec + echo "License: GPL/AGPL" >> packaging/rpm/SPECS/cdk.spec + echo "BuildArch: x86_64" >> packaging/rpm/SPECS/cdk.spec + echo "Summary: cdk rpm package" >> packaging/rpm/SPECS/cdk.spec + + echo "%description" >> packaging/rpm/SPECS/cdk.spec + echo "cdk rpm package" >> packaging/rpm/SPECS/cdk.spec + + echo "%pre" >> packaging/rpm/SPECS/cdk.spec + echo "getent group cdk >/dev/null || groupadd -r cdk" >> packaging/rpm/SPECS/cdk.spec + echo "getent passwd cdk >/dev/null || useradd -s /bin/false -d /opt/cdk -r cdk -g cdk" >> packaging/rpm/SPECS/cdk.spec + + echo "%install" >> packaging/rpm/SPECS/cdk.spec + echo "mkdir -p %{buildroot}/usr/bin" >> packaging/rpm/SPECS/cdk.spec + echo "cp /home/runner/work/cdk/cdk/target/cdk-node %{buildroot}/usr/bin/cdk-node" >> packaging/rpm/SPECS/cdk.spec + echo "cp /home/runner/work/cdk/cdk/target/release/cdk %{buildroot}/usr/bin/cdk" >> packaging/rpm/SPECS/cdk.spec + + echo "%files" >> packaging/rpm/SPECS/cdk.spec + echo "/usr/bin/cdk" >> packaging/rpm/SPECS/cdk.spec + echo "/usr/bin/cdk-node" >> packaging/rpm/SPECS/cdk.spec + + + - name: Construct rpm package + run: | + rpmbuild --define "_topdir /home/runner/work/cdk/cdk/packaging/rpm_build" \ + --define "_builddir %{_topdir}/BUILD" \ + --define "_rpmdir %{_topdir}/RPMS" \ + --define "_srcrpmdir %{_topdir}/SRPMS" \ + --define "__spec_install_post /bin/true" \ + -bb packaging/rpm/SPECS/cdk.spec + + - name: Rename file for post rpm build and for checksum + run: mv /home/runner/work/cdk/cdk/packaging/rpm_build/RPMS/x86_64/cdk-${{ env.GIT_TAG1 }}-1.x86_64.rpm /home/runner/work/cdk/cdk/packaging/rpm_build/RPMS/x86_64/cdk-${{ env.GIT_TAG1 }}.x86_64.rpm + + - name: Checksum for the rpm package + run: sha256sum /home/runner/work/cdk/cdk/packaging/rpm_build/RPMS/x86_64/cdk-${{ env.GIT_TAG1 }}.x86_64.rpm > /home/runner/work/cdk/cdk/packaging/rpm_build/RPMS/x86_64/cdk-${{ env.GIT_TAG1 }}.x86_64.rpm.checksum + + - name: Release cdk Packages + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.GIT_TAG }} + prerelease: true + files: | + packaging/rpm_build/RPMS/x86_64/cdk-**.rpm + packaging/rpm_build/RPMS/x86_64/cdk-**.rpm.checksum diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..ce4e0058 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +**/.DS_Store +.vscode +.env +/dist/ +cmd/__debug_bin +**__debug** +target/ +book/ +index.html +tmp +.vscode +coverage.out +coverage.html +.idea +.idea/* + +data diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..00f17235 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,84 @@ +# This file configures github.com/golangci/golangci-lint. + +run: + timeout: 3m + tests: true + skip-dirs-use-default: true + +service: + golangci-lint-version: 1.61.0 + +linters: + disable-all: true + enable: + - whitespace # Tool for detection of leading and trailing whitespace + # - wsl # Forces you to use empty lines + - wastedassign # Finds wasted assignment statements + - unconvert # Unnecessary type conversions + - tparallel # Detects inappropriate usage of t.Parallel() method in your Go test codes + - thelper # Detects golang test helpers without t.Helper() call and checks the consistency of test helpers + - stylecheck # Stylecheck is a replacement for golint + - prealloc # Finds slice declarations that could potentially be pre-allocated + - predeclared # Finds code that shadows one of Go's predeclared identifiers + - nolintlint # Ill-formed or insufficient nolint directives + # - nlreturn # Checks for a new line before return and branch statements to increase code clarity + - misspell # Misspelled English words in comments + - makezero # Finds slice declarations with non-zero initial length + - lll # Long lines + - importas # Enforces consistent import aliases + - gosec # Security problems + - gofmt # Whether the code was gofmt-ed + - goimports # Unused imports + - goconst # Repeated strings that could be replaced by a constant + - forcetypeassert # Finds forced type assertions + - dogsled # Checks assignments with too many blank identifiers (e.g. x, , , _, := f()) + - dupl # Code clone detection + - errname # Checks that sentinel errors are prefixed with Err and error types are suffixed with Error + - errorlint # Error wrapping introduced in Go 1.13 + - gocritic # gocritic is a Go source code linter that maintains checks that are not in other linters + - errcheck # Errcheck is a go lint rule for checking for unchecked errors + # - godox # Linter for TODOs and FIXMEs left in the code + - gci # Gci checks the consistency of the code with the Go code style guide + - mnd # mnd is a linter for magic numbers + # - revive + - unparam # Unused function parameters + +linters-settings: + gofmt: + simplify: true + gocritic: + enabled-checks: + - ruleguard + disabled-checks: + - ifElseChain + revive: + rules: + - name: exported + arguments: + - disableStutteringCheck + goconst: + min-len: 3 + min-occurrences: 3 + gosec: + excludes: + - G115 # Potential integer overflow when converting between integer types + +issues: + whole-files: true + exclude-rules: + - path: '(_test\.go|^test/.*)' + linters: + - gosec + - unparam + - lll + - path: 'etherman/contracts/contracts_(banana|elderberry)\.go' + linters: + - dupl + exclude-dirs: + - tests + - aggregator/db/migrations + include: + - EXC0012 # Exported (.+) should have comment( \(or a comment on this block\))? or be unexported + - EXC0013 # Package comment should be of the form "(.+)... + - EXC0014 # Comment on exported (.+) should be of the form "(.+)..." + - EXC0015 # Should have a package comment diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..81547bae --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,5479 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[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 = "addr2line" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[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 = "aggkit" +version = "0.1.0" +dependencies = [ + "aggkit-config", + "alloy-json-rpc", + "alloy-rpc-client", + "alloy-transport-http", + "anyhow", + "clap", + "colored", + "dotenvy", + "execute", + "regex", + "reqwest 0.12.8", + "serde", + "serde_json", + "tempfile", + "tokio", + "toml", + "tracing", + "tracing-subscriber", + "url", +] + +[[package]] +name = "aggkit-config" +version = "0.1.0" +dependencies = [ + "ethers", + "jsonrpsee", + "serde", + "serde_json", + "serde_with", + "thiserror", + "toml", + "tracing", + "tracing-appender", + "tracing-subscriber", + "url", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloy-json-rpc" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af5979e0d5a7bf9c7eb79749121e8256e59021af611322aee56e77e20776b4b3" +dependencies = [ + "alloy-primitives", + "alloy-sol-types", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "alloy-primitives" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 1.0.0", + "hashbrown 0.14.5", + "hex-literal", + "indexmap 2.6.0", + "itoa", + "k256", + "keccak-asm", + "paste", + "proptest", + "rand", + "ruint", + "rustc-hash", + "serde", + "sha3", + "tiny-keccak", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" +dependencies = [ + "arrayvec", + "bytes", +] + +[[package]] +name = "alloy-rpc-client" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fc2bd1e7403463a5f2c61e955bcc9d3072b63aa177442b0f9aa6a6d22a941e3" +dependencies = [ + "alloy-json-rpc", + "alloy-primitives", + "alloy-transport", + "alloy-transport-http", + "futures", + "pin-project", + "reqwest 0.12.8", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower 0.5.1", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" +dependencies = [ + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap 2.6.0", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.68", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" +dependencies = [ + "const-hex", + "dunce", + "heck", + "proc-macro2", + "quote", + "syn 2.0.68", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" +dependencies = [ + "alloy-primitives", + "alloy-sol-macro", + "const-hex", +] + +[[package]] +name = "alloy-transport" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be77579633ebbc1266ae6fd7694f75c408beb1aeb6865d0b18f22893c265a061" +dependencies = [ + "alloy-json-rpc", + "base64 0.22.1", + "futures-util", + "futures-utils-wasm", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower 0.5.1", + "tracing", + "url", + "wasmtimer", +] + +[[package]] +name = "alloy-transport-http" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91fd1a5d0827939847983b46f2f79510361f901dc82f8e3c38ac7397af142c6e" +dependencies = [ + "alloy-json-rpc", + "alloy-transport", + "reqwest 0.12.8", + "serde_json", + "tower 0.5.1", + "tracing", + "url", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[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.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" + +[[package]] +name = "anstyle-parse" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[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", + "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", + "num-traits", + "paste", + "rustc_version 0.4.0", + "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", + "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", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[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-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "async-trait" +version = "0.1.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version 0.4.0", +] + +[[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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "backtrace" +version = "0.3.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[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 = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +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.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "camino" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0ec6b951b160caa93cc0c7b209e5a3bff7aae9062213451ac99493cd844c239" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver 1.0.23", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cc" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907d8581360765417f8f2e0e7d602733bbed60156b4465b7617243689ef9b83d" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.6", +] + +[[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 = "clap" +version = "4.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "clap_lex" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" + +[[package]] +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest 0.10.7", + "hmac", + "k256", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "digest 0.10.7", + "generic-array 0.14.7", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror", +] + +[[package]] +name = "colorchoice" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" + +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "const-hex" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +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.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array 0.14.7", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array 0.14.7", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.68", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[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 = "derive_more" +version = "0.99.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", + "unicode-xid", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +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.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[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", + "winapi", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[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", + "spki", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[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 0.14.7", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" +dependencies = [ + "base64 0.21.7", + "bytes", + "hex", + "k256", + "log", + "rand", + "rlp", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "eth-keystore" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest 0.10.7", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror", + "uuid", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest 0.11.27", + "serde", + "serde_json", + "syn 2.0.68", + "toml", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.68", +] + +[[package]] +name = "ethers-core" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array 0.14.7", + "k256", + "num_enum", + "once_cell", + "open-fastrlp", + "rand", + "rlp", + "serde", + "serde_json", + "strum", + "syn 2.0.68", + "tempfile", + "thiserror", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" +dependencies = [ + "chrono", + "ethers-core", + "reqwest 0.11.27", + "semver 1.0.23", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.7", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http 0.2.12", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest 0.11.27", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "rand", + "sha2", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver 1.0.23", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "execute" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a82608ee96ce76aeab659e9b8d3c2b787bffd223199af88c674923d861ada10" +dependencies = [ + "execute-command-macro", + "execute-command-tokens", + "generic-array 1.0.0", +] + +[[package]] +name = "execute-command-macro" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90dec53d547564e911dc4ff3ecb726a64cf41a6fa01a2370ebc0d95175dd08bd" +dependencies = [ + "execute-command-macro-impl", +] + +[[package]] +name = "execute-command-macro-impl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8cd46a041ad005ab9c71263f9a0ff5b529eac0fe4cc9b4a20f4f0765d8cf4b" +dependencies = [ + "execute-command-tokens", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "execute-command-tokens" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69dc321eb6be977f44674620ca3aa21703cb20ffbe560e1ae97da08401ffbcad" + +[[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 = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[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 = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "futures-utils-wasm" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[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 = "generic-array" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe739944a5406424e080edccb6add95685130b9f160d5407c639c7df0c5836b0" +dependencies = [ + "typenum", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gloo-net" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06f627b1a58ca3d42b45d6104bf1e1a03799df472df00988b6ba21accc10580" +dependencies = [ + "futures-channel", + "futures-core", + "futures-sink", + "gloo-utils", + "http 1.1.0", + "js-sys", + "pin-project", + "serde", + "serde_json", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "gloo-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5555354113b18c547c1d3a98fbf7fb32a9ff4f6fa112ce823a21641a0ba3aa" +dependencies = [ + "js-sys", + "serde", + "serde_json", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap 2.6.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.6.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "serde", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + +[[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.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[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 = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[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.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", + "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.30", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.4.1", + "hyper-util", + "log", + "rustls 0.23.11", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.0", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.4.1", + "pin-project-lite", + "socket2", + "tokio", + "tower 0.4.13", + "tower-service", + "tracing", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "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 = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[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-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown 0.15.0", + "serde", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array 0.14.7", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[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.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jsonrpsee" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126b48a5acc3c52fbd5381a77898cb60e145123179588a29e7ac48f9c06e401b" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-proc-macros", + "jsonrpsee-server", + "jsonrpsee-types", + "jsonrpsee-wasm-client", + "jsonrpsee-ws-client", + "tokio", + "tracing", +] + +[[package]] +name = "jsonrpsee-client-transport" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf679a8e0e083c77997f7c4bb4ca826577105906027ae462aac70ff348d02c6a" +dependencies = [ + "base64 0.22.1", + "futures-channel", + "futures-util", + "gloo-net", + "http 1.1.0", + "jsonrpsee-core", + "pin-project", + "rustls 0.23.11", + "rustls-pki-types", + "rustls-platform-verifier", + "soketto", + "thiserror", + "tokio", + "tokio-rustls 0.26.0", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-core" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0e503369a76e195b65af35058add0e6900b794a4e9a9316900ddd3a87a80477" +dependencies = [ + "async-trait", + "bytes", + "futures-timer", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "jsonrpsee-types", + "parking_lot", + "pin-project", + "rand", + "rustc-hash", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "wasm-bindgen-futures", +] + +[[package]] +name = "jsonrpsee-http-client" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2c0caba4a6a8efbafeec9baa986aa22a75a96c29d3e4b0091b0098d6470efb5" +dependencies = [ + "async-trait", + "base64 0.22.1", + "http-body 1.0.0", + "hyper 1.4.1", + "hyper-rustls 0.27.2", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "rustls 0.23.11", + "rustls-platform-verifier", + "serde", + "serde_json", + "thiserror", + "tokio", + "tower 0.4.13", + "tracing", + "url", +] + +[[package]] +name = "jsonrpsee-proc-macros" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc660a9389e2748e794a40673a4155d501f32db667757cdb80edeff0306b489b" +dependencies = [ + "heck", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "jsonrpsee-server" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af6e6c9b6d975edcb443565d648b605f3e85a04ec63aa6941811a8894cc9cded" +dependencies = [ + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.4.1", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "pin-project", + "route-recognizer", + "serde", + "serde_json", + "soketto", + "thiserror", + "tokio", + "tokio-stream", + "tokio-util", + "tower 0.4.13", + "tracing", +] + +[[package]] +name = "jsonrpsee-types" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8fb16314327cbc94fdf7965ef7e4422509cd5597f76d137bd104eb34aeede67" +dependencies = [ + "http 1.1.0", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "jsonrpsee-wasm-client" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0da62b43702bd5640ea305d35df95da30abc878e79a7b4b01feda3beaf35d3c" +dependencies = [ + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", +] + +[[package]] +name = "jsonrpsee-ws-client" +version = "0.24.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39aabf5d6c6f22da8d5b808eea1fab0736059f11fb42f71f141b14f404e5046a" +dependencies = [ + "http 1.1.0", + "jsonrpsee-client-transport", + "jsonrpsee-core", + "jsonrpsee-types", + "url", +] + +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.7", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "k256" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set", + "ena", + "itertools 0.11.0", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.8.5", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata 0.4.8", +] + +[[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.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys 0.52.0", +] + +[[package]] +name = "native-tls" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[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-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[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-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.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "object" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "openssl" +version = "0.10.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +dependencies = [ + "bitflags 2.6.0", + "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.68", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "parity-scale-codec" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pest" +version = "2.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.6.0", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version 0.4.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[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.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +dependencies = [ + "proc-macro2", + "syn 2.0.68", +] + +[[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", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[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.68", +] + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.6.0", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax 0.8.5", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "serde", +] + +[[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", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.26", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.30", + "hyper-rustls 0.24.2", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tokio-rustls 0.24.1", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.4", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.4.5", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.4.1", + "hyper-rustls 0.27.2", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile 2.1.2", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.1", + "system-configuration 0.6.1", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "route-recognizer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" + +[[package]] +name = "ruint" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand", + "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.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver 1.0.23", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" +dependencies = [ + "log", + "once_cell", + "ring 0.17.8", + "rustls-pki-types", + "rustls-webpki 0.102.5", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba" +dependencies = [ + "openssl-probe", + "rustls-pemfile 2.1.2", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + +[[package]] +name = "rustls-platform-verifier" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e3beb939bcd33c269f4bf946cc829fcd336370267c4a927ac0399c84a3151a1" +dependencies = [ + "core-foundation", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls 0.23.11", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki 0.102.5", + "security-framework", + "security-framework-sys", + "webpki-roots 0.26.3", + "winapi", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84e217e7fdc8466b5b35d30f8c0a30febd29173df4a3a0c2115d306b9c4117ad" + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" +dependencies = [ + "ring 0.17.8", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[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 = "scale-info" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +dependencies = [ + "cfg-if", + "derive_more 0.99.18", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "schannel" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array 0.14.7", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "num-bigint", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +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.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "serde_json" +version = "1.0.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[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.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9720086b3357bcb44fce40117d769a4d068c70ecfa190850a980a71755f66fcc" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.6.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f1abbfe725f27678f4663bcacb75a83e829fd464c25d78dd038a3a29e307cec" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[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.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[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 = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + +[[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 = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core", +] + +[[package]] +name = "simple_asn1" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror", + "time", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "soketto" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37468c595637c10857701c990f93a40ce0e357cedb0953d1c26c8d8027f9bb53" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures", + "http 1.1.0", + "httparse", + "log", + "rand", + "sha1", +] + +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools 0.11.0", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.68", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest 0.11.27", + "semver 1.0.23", + "serde", + "serde_json", + "sha2", + "thiserror", + "url", + "zip", +] + +[[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.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn-solidity" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys 0.6.0", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +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 = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +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.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.11", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[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.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-io", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.22", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.6.0", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap 2.6.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.20", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 0.1.2", + "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.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[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-serde" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" +dependencies = [ + "serde", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "serde", + "serde_json", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", + "tracing-serde", +] + +[[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", + "rustls 0.21.12", + "sha1", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[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-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +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 = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[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.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.68", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "wasmtimer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7ed9d8b15c7fb594d72bfb4b5a276f3d2029333cd93a932f376f5937f6f80ee" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[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 = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" +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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[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.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[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.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[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", + "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_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[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 = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version 0.4.0", + "send_wrapper 0.6.0", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.68", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +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.68", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.12+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..9d60c985 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,22 @@ +[workspace] +resolver = "2" +default-members = ["crates/aggkit"] +members = ["crates/*"] + +[workspace.package] +version = "0.1.0" +edition = "2021" + +[workspace.dependencies] +serde = { version = "1.0.210", features = ["derive"] } +serde_json = "1.0.128" +serde_with = "3.10.0" +thiserror = "1.0.64" +toml = "0.8.19" +tracing = "0.1.40" +tracing-appender = "0.2.3" +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +url = { version = "2.5.2", features = ["serde"] } +ethers = "2.0.14" +jsonrpsee = { version = "0.24.5", features = ["full"] } + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..45fbf18d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,51 @@ +# CONTAINER FOR BUILDING BINARY +FROM --platform=${BUILDPLATFORM} golang:1.22.4 AS build + +WORKDIR $GOPATH/src/github.com/agglayer/aggkit + +# INSTALL DEPENDENCIES +COPY go.mod go.sum ./ +RUN go mod download + +# BUILD BINARY +COPY . . +RUN make build-go build-tools + +# BUILD RUST BIN +FROM --platform=${BUILDPLATFORM} rust:slim-bookworm AS chef +USER root +RUN apt-get update && apt-get install -y openssl pkg-config libssl-dev +RUN cargo install cargo-chef +WORKDIR /app + +FROM chef AS planner + +COPY --link crates crates +COPY --link Cargo.toml Cargo.toml +COPY --link Cargo.lock Cargo.lock + +RUN cargo chef prepare --recipe-path recipe.json --bin aggkit + +FROM chef AS builder + +COPY --from=planner /app/recipe.json recipe.json +# Notice that we are specifying the --target flag! +RUN cargo chef cook --release --recipe-path recipe.json + +COPY --link crates crates +COPY --link Cargo.toml Cargo.toml +COPY --link Cargo.lock Cargo.lock + +ENV BUILD_SCRIPT_DISABLED=1 +RUN cargo build --release --bin aggkit + +# CONTAINER FOR RUNNING BINARY +FROM --platform=${BUILDPLATFORM} debian:bookworm-slim + +RUN apt-get update && apt-get install -y ca-certificates sqlite3 procps libssl-dev && rm -rf /var/lib/apt/lists/* +COPY --from=builder /app/target/release/aggkit /usr/local/bin/ +COPY --from=build /go/src/github.com/agglayer/aggkit/target/aggkit /usr/local/bin/ + +EXPOSE 5576/tcp + +CMD ["/bin/sh", "-c", "aggkit"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..ca9b0551 --- /dev/null +++ b/LICENSE @@ -0,0 +1,619 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..1c1a3bc2 --- /dev/null +++ b/Makefile @@ -0,0 +1,112 @@ +include version.mk + +ARCH := $(shell arch) + +ifeq ($(ARCH),x86_64) + ARCH = amd64 +else + ifeq ($(ARCH),aarch64) + ARCH = arm64 + endif +endif +GOBASE := $(shell pwd) +GOBIN := $(GOBASE)/target +GOENVVARS := GOBIN=$(GOBIN) CGO_ENABLED=1 GOARCH=$(ARCH) +GOBINARY := aggkit +GOCMD := $(GOBASE)/cmd + +LDFLAGS += -X 'github.com/agglayer/aggkit.Version=$(VERSION)' +LDFLAGS += -X 'github.com/agglayer/aggkit.GitRev=$(GITREV)' +LDFLAGS += -X 'github.com/agglayer/aggkit.GitBranch=$(GITBRANCH)' +LDFLAGS += -X 'github.com/agglayer/aggkit.BuildDate=$(DATE)' + +# Check dependencies +# Check for Go +.PHONY: check-go +check-go: + @which go > /dev/null || (echo "Error: Go is not installed" && exit 1) + +# Check for Docker +.PHONY: check-docker +check-docker: + @which docker > /dev/null || (echo "Error: docker is not installed" && exit 1) + +# Check for Docker-compose +.PHONY: check-docker-compose +check-docker-compose: + @which docker-compose > /dev/null || (echo "Error: docker-compose is not installed" && exit 1) + +# Check for Protoc +.PHONY: check-protoc +check-protoc: + @which protoc > /dev/null || (echo "Error: Protoc is not installed" && exit 1) + +# Check for Curl +.PHONY: check-curl +check-curl: + @which curl > /dev/null || (echo "Error: curl is not installed" && exit 1) + +# Targets that require the checks +build: check-go +lint: check-go +build-docker: check-docker +build-docker-nc: check-docker +stop: check-docker check-docker-compose +install-linter: check-go check-curl +generate-code-from-proto: check-protoc + +.PHONY: build +build: build-rust build-go build-tools## Builds the binaries locally into ./target + +.PHONY: build-rust +build-rust: + cargo build --release --jobs $(shell nproc) + +.PHONY: build-go +build-go: + $(GOENVVARS) go build -ldflags "all=$(LDFLAGS)" -o $(GOBIN)/$(GOBINARY) $(GOCMD) + +.PHONY: build-tools +build-tools: ## Builds the tools + $(GOENVVARS) go build -o $(GOBIN)/aggsender_find_imported_bridge ./tools/aggsender_find_imported_bridge + +.PHONY: build-docker +build-docker: ## Builds a docker image with the aggkit binary + docker build -t aggkit -f ./Dockerfile . + +.PHONY: build-docker-nc +build-docker-nc: ## Builds a docker image with the aggkit binary - but without build cache + docker build --no-cache=true -t aggkit -f ./Dockerfile . + +.PHONY: stop +stop: ## Stops all services + docker-compose down + +.PHONY: test-unit +test-unit: + trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -short -race -p 1 -covermode=atomic -coverprofile=coverage.out -coverpkg ./... -timeout 15m ./... + +.PHONY: test-seq_sender +test-seq_sender: + trap '$(STOP)' EXIT; MallocNanoZone=0 go test -count=1 -short -race -p 1 -covermode=atomic -coverprofile=../coverage.out -timeout 200s ./sequencesender/... + +.PHONY: lint +lint: ## Runs the linter + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/golangci-lint run --timeout 5m + +.PHONY: generate-code-from-proto +generate-code-from-proto: ## Generates code from proto files + cd proto/src/proto/aggregator/v1 && protoc --proto_path=. --proto_path=../../../../include --go_out=../../../../../aggregator/prover --go-grpc_out=../../../../../aggregator/prover --go-grpc_opt=paths=source_relative --go_opt=paths=source_relative aggregator.proto + cd proto/src/proto/datastream/v1 && protoc --proto_path=. --proto_path=../../../../include --go_out=../../../../../state/datastream --go-grpc_out=../../../../../state/datastream --go-grpc_opt=paths=source_relative --go_opt=paths=source_relative datastream.proto + + +## Help display. +## Pulls comments from beside commands and prints a nicely formatted +## display with the commands and their usage information. +.DEFAULT_GOAL := help + +.PHONY: help +help: ## Prints this help + @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \ + | sort \ + | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/README.md b/README.md index 0a208d8a..76e396dc 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,76 @@ -# aggkit -# aggkit -# aggkit +
+ +
+
+ +Logo +Logo + +## Polygon AggKit + +**Polygon AggKit** is a modular framework that developers can use to build and deploy Pessimistic Proofs enabled chains (TBD). + +
+ +
+ +## Getting Started + +### Pre-requisites + +Setup Kurtosis following these instructions: [Kurtosis CDK Getting Started](https://github.com/0xPolygon/kurtosis-cdk?tab=readme-ov-file#getting-started) + +### Local Testing + +- You can run locally against kurtosis-cdk environment using: [docs/local_debug.md](docs/local_debug.md) + +### Build locally + +You can locally build a production release of AggKit CLI + AggKit with: + +``` +make build +``` + +### Run locally + +You can build and run a debug release locally using: + +``` +cargo run +``` + +It will build and run both binaries. +### Running with Kurtosis + +1. Run your kurtosis environment +2. build `cdk-erigon` and make it available in your system's PATH +3. Run `scripts/local_config` +4. cargo run -- --config ./tmp/aggkit/local_config/test.kurtosis.toml --chain ./tmp/aggkit/local_config/genesis.json erigon + +## Contributing + +Contributions are very welcomed, the guidelines are currently not available (WIP) + +## Support + +Feel free to [open an issue](https://github.com/agglayer/aggkit/issues/new) if you have any feature request or bug report.
+ + +## License + +Polygon AggKit +Copyright (c) 2024 PT Services DMCC + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as published +by the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..e5d17798 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,17 @@ +# Polygon Technology Security Information + +## Link to vulnerability disclosure details (Bug Bounty). +- Websites and Applications: https://hackerone.com/polygon-technology +- Smart Contracts & Blockchain: https://immunefi.com/bounty/polygon + +## Languages that our team speaks and understands. +Preferred-Languages: en + +## Security-related job openings at Polygon. +https://polygon.technology/careers + +## Polygon security contact details. +security@polygon.technology + +## The URL for accessing the security.txt file. +Canonical: https://polygon.technology/security.txt diff --git a/agglayer/client.go b/agglayer/client.go new file mode 100644 index 00000000..8a186be4 --- /dev/null +++ b/agglayer/client.go @@ -0,0 +1,182 @@ +package agglayer + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "strings" + "time" + + "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/0xPolygon/cdk-rpc/types" + "github.com/ethereum/go-ethereum/common" +) + +const errCodeAgglayerRateLimitExceeded int = -10007 + +var ( + ErrAgglayerRateLimitExceeded = fmt.Errorf("agglayer rate limit exceeded") + jSONRPCCall = rpc.JSONRPCCall +) + +type AggLayerClientGetEpochConfiguration interface { + GetEpochConfiguration() (*ClockConfiguration, error) +} + +// AgglayerClientInterface is the interface that defines the methods that the AggLayerClient will implement +type AgglayerClientInterface interface { + SendTx(signedTx SignedTx) (common.Hash, error) + WaitTxToBeMined(hash common.Hash, ctx context.Context) error + SendCertificate(certificate *SignedCertificate) (common.Hash, error) + GetCertificateHeader(certificateHash common.Hash) (*CertificateHeader, error) + GetLatestKnownCertificateHeader(networkID uint32) (*CertificateHeader, error) + AggLayerClientGetEpochConfiguration +} + +// AggLayerClient is the client that will be used to interact with the AggLayer +type AggLayerClient struct { + url string +} + +// NewAggLayerClient returns a client ready to be used +func NewAggLayerClient(url string) *AggLayerClient { + return &AggLayerClient{ + url: url, + } +} + +// SendTx sends a signed transaction to the AggLayer +func (c *AggLayerClient) SendTx(signedTx SignedTx) (common.Hash, error) { + response, err := rpc.JSONRPCCall(c.url, "interop_sendTx", signedTx) + if err != nil { + return common.Hash{}, err + } + + if response.Error != nil { + if response.Error.Code == errCodeAgglayerRateLimitExceeded { + return common.Hash{}, ErrAgglayerRateLimitExceeded + } + return common.Hash{}, fmt.Errorf("%v %v", response.Error.Code, response.Error.Message) + } + + var result types.ArgHash + err = json.Unmarshal(response.Result, &result) + if err != nil { + return common.Hash{}, err + } + + return result.Hash(), nil +} + +// WaitTxToBeMined waits for a transaction to be mined +func (c *AggLayerClient) WaitTxToBeMined(hash common.Hash, ctx context.Context) error { + ticker := time.NewTicker(time.Second) + for { + select { + case <-ctx.Done(): + return errors.New("context finished before tx was mined") + case <-ticker.C: + response, err := rpc.JSONRPCCall(c.url, "interop_getTxStatus", hash) + if err != nil { + return err + } + + if response.Error != nil { + return fmt.Errorf("%v %v", response.Error.Code, response.Error.Message) + } + + var result string + err = json.Unmarshal(response.Result, &result) + if err != nil { + return err + } + if strings.ToLower(result) == "done" { + return nil + } + } + } +} + +// SendCertificate sends a certificate to the AggLayer +func (c *AggLayerClient) SendCertificate(certificate *SignedCertificate) (common.Hash, error) { + certificateToSend := certificate.CopyWithDefaulting() + + response, err := rpc.JSONRPCCall(c.url, "interop_sendCertificate", certificateToSend) + if err != nil { + return common.Hash{}, err + } + + if response.Error != nil { + return common.Hash{}, fmt.Errorf("%d %s", response.Error.Code, response.Error.Message) + } + + var result types.ArgHash + err = json.Unmarshal(response.Result, &result) + if err != nil { + return common.Hash{}, err + } + + return result.Hash(), nil +} + +// GetCertificateHeader returns the certificate header associated to the hash +func (c *AggLayerClient) GetCertificateHeader(certificateHash common.Hash) (*CertificateHeader, error) { + response, err := rpc.JSONRPCCall(c.url, "interop_getCertificateHeader", certificateHash) + if err != nil { + return nil, err + } + + if response.Error != nil { + return nil, fmt.Errorf("%d %s", response.Error.Code, response.Error.Message) + } + + var result *CertificateHeader + err = json.Unmarshal(response.Result, &result) + if err != nil { + return nil, err + } + + return result, nil +} + +// GetEpochConfiguration returns the clock configuration of AggLayer +func (c *AggLayerClient) GetEpochConfiguration() (*ClockConfiguration, error) { + response, err := jSONRPCCall(c.url, "interop_getEpochConfiguration") + if err != nil { + return nil, err + } + + if response.Error != nil { + return nil, fmt.Errorf("GetEpochConfiguration code=%d msg=%s", response.Error.Code, response.Error.Message) + } + + var result *ClockConfiguration + err = json.Unmarshal(response.Result, &result) + if err != nil { + return nil, err + } + + return result, nil +} + +// GetLatestKnownCertificateHeader returns the last certificate header submitted by networkID +func (c *AggLayerClient) GetLatestKnownCertificateHeader(networkID uint32) (*CertificateHeader, error) { + response, err := jSONRPCCall(c.url, "interop_getLatestKnownCertificateHeader", networkID) + if err != nil { + return nil, fmt.Errorf("GetLatestKnownCertificateHeader error jSONRPCCall. Err: %w", err) + } + + if response.Error != nil { + return nil, fmt.Errorf("GetLatestKnownCertificateHeader rpc returns an error: code=%d msg=%s", + response.Error.Code, response.Error.Message) + } + + var result *CertificateHeader + err = json.Unmarshal(response.Result, &result) + if err != nil { + return nil, fmt.Errorf("GetLatestKnownCertificateHeader error Unmashal. Err: %w", err) + } + + return result, nil +} diff --git a/agglayer/client_test.go b/agglayer/client_test.go new file mode 100644 index 00000000..91ec98c5 --- /dev/null +++ b/agglayer/client_test.go @@ -0,0 +1,163 @@ +package agglayer + +import ( + "fmt" + "testing" + + "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +const ( + testURL = "http://localhost:8080" +) + +func TestExploratoryClient(t *testing.T) { + t.Skip("This test is for exploratory purposes only") + sut := NewAggLayerClient("http://127.0.0.1:32781") + config, err := sut.GetEpochConfiguration() + require.NoError(t, err) + require.NotNil(t, config) + fmt.Printf("Config: %s", config.String()) + + lastCert, err := sut.GetLatestKnownCertificateHeader(1) + require.NoError(t, err) + require.NotNil(t, lastCert) + fmt.Printf("LastCert: %s", lastCert.String()) +} + +func TestExploratoryGetCertificateHeader(t *testing.T) { + t.Skip("This test is exploratory and should be skipped") + aggLayerClient := NewAggLayerClient("http://localhost:32796") + certificateID := common.HexToHash("0xf153e75e24591432ac5deafaeaafba3fec0fd851261c86051b9c0d540b38c369") + certificateHeader, err := aggLayerClient.GetCertificateHeader(certificateID) + require.NoError(t, err) + fmt.Print(certificateHeader) +} +func TestExploratoryGetEpochConfiguration(t *testing.T) { + t.Skip("This test is exploratory and should be skipped") + aggLayerClient := NewAggLayerClient("http://localhost:32796") + clockConfig, err := aggLayerClient.GetEpochConfiguration() + require.NoError(t, err) + fmt.Print(clockConfig) +} + +func TestExploratoryGetLatestKnownCertificateHeader(t *testing.T) { + t.Skip("This test is exploratory and should be skipped") + aggLayerClient := NewAggLayerClient("http://localhost:32843") + cert, err := aggLayerClient.GetLatestKnownCertificateHeader(1) + require.NoError(t, err) + fmt.Print(cert) +} + +func TestGetEpochConfigurationResponseWithError(t *testing.T) { + sut := NewAggLayerClient(testURL) + response := rpc.Response{ + Error: &rpc.ErrorObject{}, + } + jSONRPCCall = func(url, method string, params ...interface{}) (rpc.Response, error) { + return response, nil + } + clockConfig, err := sut.GetEpochConfiguration() + require.Nil(t, clockConfig) + require.Error(t, err) +} + +func TestGetEpochConfigurationResponseBadJson(t *testing.T) { + sut := NewAggLayerClient(testURL) + response := rpc.Response{ + Result: []byte(`{`), + } + jSONRPCCall = func(url, method string, params ...interface{}) (rpc.Response, error) { + return response, nil + } + clockConfig, err := sut.GetEpochConfiguration() + require.Nil(t, clockConfig) + require.Error(t, err) +} + +func TestGetEpochConfigurationErrorResponse(t *testing.T) { + sut := NewAggLayerClient(testURL) + + jSONRPCCall = func(url, method string, params ...interface{}) (rpc.Response, error) { + return rpc.Response{}, fmt.Errorf("unittest error") + } + clockConfig, err := sut.GetEpochConfiguration() + require.Nil(t, clockConfig) + require.Error(t, err) +} + +func TestGetEpochConfigurationOkResponse(t *testing.T) { + sut := NewAggLayerClient(testURL) + response := rpc.Response{ + Result: []byte(`{"epoch_duration": 1, "genesis_block": 1}`), + } + jSONRPCCall = func(url, method string, params ...interface{}) (rpc.Response, error) { + return response, nil + } + clockConfig, err := sut.GetEpochConfiguration() + require.NotNil(t, clockConfig) + require.NoError(t, err) + require.Equal(t, ClockConfiguration{ + EpochDuration: 1, + GenesisBlock: 1, + }, *clockConfig) +} + +func TestGetLatestKnownCertificateHeaderOkResponse(t *testing.T) { + sut := NewAggLayerClient(testURL) + response := rpc.Response{ + Result: []byte(`{"network_id":1,"height":0,"epoch_number":223,"certificate_index":0,"certificate_id":"0xf9179d2fbe535814b5a14496e2eed474f49c6131227a9dfc5d2d8caf9e212054","new_local_exit_root":"0x7ae06f4a5d0b6da7dd4973fb6ef40d82c9f2680899b3baaf9e564413b59cc160","metadata":"0x00000000000000000000000000000000000000000000000000000000000001a7","status":"Settled"}`), + } + jSONRPCCall = func(url, method string, params ...interface{}) (rpc.Response, error) { + return response, nil + } + cert, err := sut.GetLatestKnownCertificateHeader(1) + require.NotNil(t, cert) + require.NoError(t, err) + require.Nil(t, cert.PreviousLocalExitRoot) +} + +func TestGetLatestKnownCertificateHeaderErrorResponse(t *testing.T) { + sut := NewAggLayerClient(testURL) + jSONRPCCall = func(url, method string, params ...interface{}) (rpc.Response, error) { + return rpc.Response{}, fmt.Errorf("unittest error") + } + + cert, err := sut.GetLatestKnownCertificateHeader(1) + + require.Nil(t, cert) + require.Error(t, err) +} + +func TestGetLatestKnownCertificateHeaderResponseBadJson(t *testing.T) { + sut := NewAggLayerClient(testURL) + response := rpc.Response{ + Result: []byte(`{`), + } + jSONRPCCall = func(url, method string, params ...interface{}) (rpc.Response, error) { + return response, nil + } + + cert, err := sut.GetLatestKnownCertificateHeader(1) + + require.Nil(t, cert) + require.Error(t, err) +} + +func TestGetLatestKnownCertificateHeaderWithPrevLERResponse(t *testing.T) { + sut := NewAggLayerClient(testURL) + response := rpc.Response{ + Result: []byte(`{"network_id":1,"height":0,"epoch_number":223,"certificate_index":0,"certificate_id":"0xf9179d2fbe535814b5a14496e2eed474f49c6131227a9dfc5d2d8caf9e212054","prev_local_exit_root":"0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757","new_local_exit_root":"0x7ae06f4a5d0b6da7dd4973fb6ef40d82c9f2680899b3baaf9e564413b59cc160","metadata":"0x00000000000000000000000000000000000000000000000000000000000001a7","status":"Settled"}`), + } + jSONRPCCall = func(_, _ string, _ ...interface{}) (rpc.Response, error) { + return response, nil + } + cert, err := sut.GetLatestKnownCertificateHeader(1) + + require.NoError(t, err) + require.NotNil(t, cert) + + require.Equal(t, "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", cert.PreviousLocalExitRoot.String()) +} diff --git a/agglayer/errors_test.go b/agglayer/errors_test.go new file mode 100644 index 00000000..14293026 --- /dev/null +++ b/agglayer/errors_test.go @@ -0,0 +1,225 @@ +package agglayer + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestConvertMapValue_String(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + data map[string]interface{} + key string + want string + errString string + }{ + { + name: "Key exists and type matches", + data: map[string]interface{}{ + "key1": "value1", + }, + key: "key1", + want: "value1", + }, + { + name: "Key exists but type does not match", + data: map[string]interface{}{ + "key1": 1, + }, + key: "key1", + want: "", + errString: "is not of type", + }, + { + name: "Key does not exist", + data: map[string]interface{}{ + "key1": "value1", + }, + key: "key2", + want: "", + errString: "key key2 not found in map", + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + got, err := convertMapValue[string](tt.data, tt.key) + if tt.errString != "" { + require.ErrorContains(t, err, tt.errString) + } else { + require.Equal(t, tt.want, got) + } + }) + } +} + +//nolint:dupl +func TestConvertMapValue_Uint32(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + data map[string]interface{} + key string + want uint32 + errString string + }{ + { + name: "Key exists and type matches", + data: map[string]interface{}{ + "key1": uint32(123), + }, + key: "key1", + want: uint32(123), + }, + { + name: "Key exists but type does not match", + data: map[string]interface{}{ + "key1": "value1", + }, + key: "key1", + want: 0, + errString: "is not of type", + }, + { + name: "Key does not exist", + data: map[string]interface{}{ + "key1": uint32(123), + }, + key: "key2", + want: 0, + errString: "key key2 not found in map", + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + got, err := convertMapValue[uint32](tt.data, tt.key) + if tt.errString != "" { + require.ErrorContains(t, err, tt.errString) + } else { + require.Equal(t, tt.want, got) + } + }) + } +} + +//nolint:dupl +func TestConvertMapValue_Uint64(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + data map[string]interface{} + key string + want uint64 + errString string + }{ + { + name: "Key exists and type matches", + data: map[string]interface{}{ + "key1": uint64(3411), + }, + key: "key1", + want: uint64(3411), + }, + { + name: "Key exists but type does not match", + data: map[string]interface{}{ + "key1": "not a number", + }, + key: "key1", + want: 0, + errString: "is not of type", + }, + { + name: "Key does not exist", + data: map[string]interface{}{ + "key1": uint64(123555), + }, + key: "key22", + want: 0, + errString: "key key22 not found in map", + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + got, err := convertMapValue[uint64](tt.data, tt.key) + if tt.errString != "" { + require.ErrorContains(t, err, tt.errString) + } else { + require.Equal(t, tt.want, got) + } + }) + } +} + +func TestConvertMapValue_Bool(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + data map[string]interface{} + key string + want bool + errString string + }{ + { + name: "Key exists and type matches", + data: map[string]interface{}{ + "key1": true, + }, + key: "key1", + want: true, + }, + { + name: "Key exists but type does not match", + data: map[string]interface{}{ + "key1": "value1", + }, + key: "key1", + want: false, + errString: "is not of type", + }, + { + name: "Key does not exist", + data: map[string]interface{}{ + "key1": true, + }, + key: "key2", + want: false, + errString: "key key2 not found in map", + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + got, err := convertMapValue[bool](tt.data, tt.key) + if tt.errString != "" { + require.ErrorContains(t, err, tt.errString) + } else { + require.Equal(t, tt.want, got) + } + }) + } +} diff --git a/agglayer/mock_agglayer_client.go b/agglayer/mock_agglayer_client.go new file mode 100644 index 00000000..8b8c8689 --- /dev/null +++ b/agglayer/mock_agglayer_client.go @@ -0,0 +1,374 @@ +// Code generated by mockery. DO NOT EDIT. + +package agglayer + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" +) + +// AgglayerClientMock is an autogenerated mock type for the AgglayerClientInterface type +type AgglayerClientMock struct { + mock.Mock +} + +type AgglayerClientMock_Expecter struct { + mock *mock.Mock +} + +func (_m *AgglayerClientMock) EXPECT() *AgglayerClientMock_Expecter { + return &AgglayerClientMock_Expecter{mock: &_m.Mock} +} + +// GetCertificateHeader provides a mock function with given fields: certificateHash +func (_m *AgglayerClientMock) GetCertificateHeader(certificateHash common.Hash) (*CertificateHeader, error) { + ret := _m.Called(certificateHash) + + if len(ret) == 0 { + panic("no return value specified for GetCertificateHeader") + } + + var r0 *CertificateHeader + var r1 error + if rf, ok := ret.Get(0).(func(common.Hash) (*CertificateHeader, error)); ok { + return rf(certificateHash) + } + if rf, ok := ret.Get(0).(func(common.Hash) *CertificateHeader); ok { + r0 = rf(certificateHash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*CertificateHeader) + } + } + + if rf, ok := ret.Get(1).(func(common.Hash) error); ok { + r1 = rf(certificateHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AgglayerClientMock_GetCertificateHeader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCertificateHeader' +type AgglayerClientMock_GetCertificateHeader_Call struct { + *mock.Call +} + +// GetCertificateHeader is a helper method to define mock.On call +// - certificateHash common.Hash +func (_e *AgglayerClientMock_Expecter) GetCertificateHeader(certificateHash interface{}) *AgglayerClientMock_GetCertificateHeader_Call { + return &AgglayerClientMock_GetCertificateHeader_Call{Call: _e.mock.On("GetCertificateHeader", certificateHash)} +} + +func (_c *AgglayerClientMock_GetCertificateHeader_Call) Run(run func(certificateHash common.Hash)) *AgglayerClientMock_GetCertificateHeader_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash)) + }) + return _c +} + +func (_c *AgglayerClientMock_GetCertificateHeader_Call) Return(_a0 *CertificateHeader, _a1 error) *AgglayerClientMock_GetCertificateHeader_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AgglayerClientMock_GetCertificateHeader_Call) RunAndReturn(run func(common.Hash) (*CertificateHeader, error)) *AgglayerClientMock_GetCertificateHeader_Call { + _c.Call.Return(run) + return _c +} + +// GetEpochConfiguration provides a mock function with no fields +func (_m *AgglayerClientMock) GetEpochConfiguration() (*ClockConfiguration, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetEpochConfiguration") + } + + var r0 *ClockConfiguration + var r1 error + if rf, ok := ret.Get(0).(func() (*ClockConfiguration, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *ClockConfiguration); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*ClockConfiguration) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AgglayerClientMock_GetEpochConfiguration_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetEpochConfiguration' +type AgglayerClientMock_GetEpochConfiguration_Call struct { + *mock.Call +} + +// GetEpochConfiguration is a helper method to define mock.On call +func (_e *AgglayerClientMock_Expecter) GetEpochConfiguration() *AgglayerClientMock_GetEpochConfiguration_Call { + return &AgglayerClientMock_GetEpochConfiguration_Call{Call: _e.mock.On("GetEpochConfiguration")} +} + +func (_c *AgglayerClientMock_GetEpochConfiguration_Call) Run(run func()) *AgglayerClientMock_GetEpochConfiguration_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *AgglayerClientMock_GetEpochConfiguration_Call) Return(_a0 *ClockConfiguration, _a1 error) *AgglayerClientMock_GetEpochConfiguration_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AgglayerClientMock_GetEpochConfiguration_Call) RunAndReturn(run func() (*ClockConfiguration, error)) *AgglayerClientMock_GetEpochConfiguration_Call { + _c.Call.Return(run) + return _c +} + +// GetLatestKnownCertificateHeader provides a mock function with given fields: networkID +func (_m *AgglayerClientMock) GetLatestKnownCertificateHeader(networkID uint32) (*CertificateHeader, error) { + ret := _m.Called(networkID) + + if len(ret) == 0 { + panic("no return value specified for GetLatestKnownCertificateHeader") + } + + var r0 *CertificateHeader + var r1 error + if rf, ok := ret.Get(0).(func(uint32) (*CertificateHeader, error)); ok { + return rf(networkID) + } + if rf, ok := ret.Get(0).(func(uint32) *CertificateHeader); ok { + r0 = rf(networkID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*CertificateHeader) + } + } + + if rf, ok := ret.Get(1).(func(uint32) error); ok { + r1 = rf(networkID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AgglayerClientMock_GetLatestKnownCertificateHeader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLatestKnownCertificateHeader' +type AgglayerClientMock_GetLatestKnownCertificateHeader_Call struct { + *mock.Call +} + +// GetLatestKnownCertificateHeader is a helper method to define mock.On call +// - networkID uint32 +func (_e *AgglayerClientMock_Expecter) GetLatestKnownCertificateHeader(networkID interface{}) *AgglayerClientMock_GetLatestKnownCertificateHeader_Call { + return &AgglayerClientMock_GetLatestKnownCertificateHeader_Call{Call: _e.mock.On("GetLatestKnownCertificateHeader", networkID)} +} + +func (_c *AgglayerClientMock_GetLatestKnownCertificateHeader_Call) Run(run func(networkID uint32)) *AgglayerClientMock_GetLatestKnownCertificateHeader_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32)) + }) + return _c +} + +func (_c *AgglayerClientMock_GetLatestKnownCertificateHeader_Call) Return(_a0 *CertificateHeader, _a1 error) *AgglayerClientMock_GetLatestKnownCertificateHeader_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AgglayerClientMock_GetLatestKnownCertificateHeader_Call) RunAndReturn(run func(uint32) (*CertificateHeader, error)) *AgglayerClientMock_GetLatestKnownCertificateHeader_Call { + _c.Call.Return(run) + return _c +} + +// SendCertificate provides a mock function with given fields: certificate +func (_m *AgglayerClientMock) SendCertificate(certificate *SignedCertificate) (common.Hash, error) { + ret := _m.Called(certificate) + + if len(ret) == 0 { + panic("no return value specified for SendCertificate") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(*SignedCertificate) (common.Hash, error)); ok { + return rf(certificate) + } + if rf, ok := ret.Get(0).(func(*SignedCertificate) common.Hash); ok { + r0 = rf(certificate) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(*SignedCertificate) error); ok { + r1 = rf(certificate) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AgglayerClientMock_SendCertificate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendCertificate' +type AgglayerClientMock_SendCertificate_Call struct { + *mock.Call +} + +// SendCertificate is a helper method to define mock.On call +// - certificate *SignedCertificate +func (_e *AgglayerClientMock_Expecter) SendCertificate(certificate interface{}) *AgglayerClientMock_SendCertificate_Call { + return &AgglayerClientMock_SendCertificate_Call{Call: _e.mock.On("SendCertificate", certificate)} +} + +func (_c *AgglayerClientMock_SendCertificate_Call) Run(run func(certificate *SignedCertificate)) *AgglayerClientMock_SendCertificate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*SignedCertificate)) + }) + return _c +} + +func (_c *AgglayerClientMock_SendCertificate_Call) Return(_a0 common.Hash, _a1 error) *AgglayerClientMock_SendCertificate_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AgglayerClientMock_SendCertificate_Call) RunAndReturn(run func(*SignedCertificate) (common.Hash, error)) *AgglayerClientMock_SendCertificate_Call { + _c.Call.Return(run) + return _c +} + +// SendTx provides a mock function with given fields: signedTx +func (_m *AgglayerClientMock) SendTx(signedTx SignedTx) (common.Hash, error) { + ret := _m.Called(signedTx) + + if len(ret) == 0 { + panic("no return value specified for SendTx") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(SignedTx) (common.Hash, error)); ok { + return rf(signedTx) + } + if rf, ok := ret.Get(0).(func(SignedTx) common.Hash); ok { + r0 = rf(signedTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(SignedTx) error); ok { + r1 = rf(signedTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AgglayerClientMock_SendTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendTx' +type AgglayerClientMock_SendTx_Call struct { + *mock.Call +} + +// SendTx is a helper method to define mock.On call +// - signedTx SignedTx +func (_e *AgglayerClientMock_Expecter) SendTx(signedTx interface{}) *AgglayerClientMock_SendTx_Call { + return &AgglayerClientMock_SendTx_Call{Call: _e.mock.On("SendTx", signedTx)} +} + +func (_c *AgglayerClientMock_SendTx_Call) Run(run func(signedTx SignedTx)) *AgglayerClientMock_SendTx_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(SignedTx)) + }) + return _c +} + +func (_c *AgglayerClientMock_SendTx_Call) Return(_a0 common.Hash, _a1 error) *AgglayerClientMock_SendTx_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AgglayerClientMock_SendTx_Call) RunAndReturn(run func(SignedTx) (common.Hash, error)) *AgglayerClientMock_SendTx_Call { + _c.Call.Return(run) + return _c +} + +// WaitTxToBeMined provides a mock function with given fields: hash, ctx +func (_m *AgglayerClientMock) WaitTxToBeMined(hash common.Hash, ctx context.Context) error { + ret := _m.Called(hash, ctx) + + if len(ret) == 0 { + panic("no return value specified for WaitTxToBeMined") + } + + var r0 error + if rf, ok := ret.Get(0).(func(common.Hash, context.Context) error); ok { + r0 = rf(hash, ctx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AgglayerClientMock_WaitTxToBeMined_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WaitTxToBeMined' +type AgglayerClientMock_WaitTxToBeMined_Call struct { + *mock.Call +} + +// WaitTxToBeMined is a helper method to define mock.On call +// - hash common.Hash +// - ctx context.Context +func (_e *AgglayerClientMock_Expecter) WaitTxToBeMined(hash interface{}, ctx interface{}) *AgglayerClientMock_WaitTxToBeMined_Call { + return &AgglayerClientMock_WaitTxToBeMined_Call{Call: _e.mock.On("WaitTxToBeMined", hash, ctx)} +} + +func (_c *AgglayerClientMock_WaitTxToBeMined_Call) Run(run func(hash common.Hash, ctx context.Context)) *AgglayerClientMock_WaitTxToBeMined_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash), args[1].(context.Context)) + }) + return _c +} + +func (_c *AgglayerClientMock_WaitTxToBeMined_Call) Return(_a0 error) *AgglayerClientMock_WaitTxToBeMined_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *AgglayerClientMock_WaitTxToBeMined_Call) RunAndReturn(run func(common.Hash, context.Context) error) *AgglayerClientMock_WaitTxToBeMined_Call { + _c.Call.Return(run) + return _c +} + +// NewAgglayerClientMock creates a new instance of AgglayerClientMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAgglayerClientMock(t interface { + mock.TestingT + Cleanup(func()) +}) *AgglayerClientMock { + mock := &AgglayerClientMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/agglayer/tx.go b/agglayer/tx.go new file mode 100644 index 00000000..f024f570 --- /dev/null +++ b/agglayer/tx.go @@ -0,0 +1,65 @@ +package agglayer + +import ( + "crypto/ecdsa" + + "github.com/0xPolygon/cdk-rpc/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +// ZKP is the struct that contains the zero-knowledge proof +type ZKP struct { + NewStateRoot common.Hash `json:"newStateRoot"` + NewLocalExitRoot common.Hash `json:"newLocalExitRoot"` + Proof types.ArgBytes `json:"proof"` +} + +// Tx is the struct that contains the verified batch transaction +type Tx struct { + RollupID uint32 + LastVerifiedBatch types.ArgUint64 `json:"lastVerifiedBatch"` + NewVerifiedBatch types.ArgUint64 `json:"newVerifiedBatch"` + ZKP ZKP `json:"ZKP"` +} + +// Hash returns a hash that uniquely identifies the tx +func (t *Tx) Hash() common.Hash { + return common.BytesToHash(crypto.Keccak256( + []byte(t.LastVerifiedBatch.Hex()), + []byte(t.NewVerifiedBatch.Hex()), + t.ZKP.NewStateRoot[:], + t.ZKP.NewLocalExitRoot[:], + []byte(t.ZKP.Proof.Hex()), + )) +} + +// Sign returns a signed batch by the private key +func (t *Tx) Sign(privateKey *ecdsa.PrivateKey) (*SignedTx, error) { + hashToSign := t.Hash() + sig, err := crypto.Sign(hashToSign.Bytes(), privateKey) + if err != nil { + return nil, err + } + + return &SignedTx{ + Tx: *t, + Signature: sig, + }, nil +} + +// SignedTx is the struct that contains the signed batch transaction +type SignedTx struct { + Tx Tx `json:"tx"` + Signature types.ArgBytes `json:"signature"` +} + +// Signer returns the address of the signer +func (s *SignedTx) Signer() (common.Address, error) { + pubKey, err := crypto.SigToPub(s.Tx.Hash().Bytes(), s.Signature) + if err != nil { + return common.Address{}, err + } + + return crypto.PubkeyToAddress(*pubKey), nil +} diff --git a/agglayer/types.go b/agglayer/types.go new file mode 100644 index 00000000..869c6c98 --- /dev/null +++ b/agglayer/types.go @@ -0,0 +1,897 @@ +package agglayer + +import ( + "encoding/json" + "errors" + "fmt" + "math/big" + "reflect" + "slices" + "strings" + + "github.com/agglayer/aggkit/bridgesync" + aggkitcommon "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +type CertificateStatus int + +const ( + Pending CertificateStatus = iota + Proven + Candidate + InError + Settled + + nilStr = "nil" + nullStr = "null" + base10 = 10 +) + +var ( + NonSettledStatuses = []CertificateStatus{Pending, Candidate, Proven} + ClosedStatuses = []CertificateStatus{Settled, InError} +) + +// String representation of the enum +func (c CertificateStatus) String() string { + return [...]string{"Pending", "Proven", "Candidate", "InError", "Settled"}[c] +} + +// IsClosed returns true if the certificate is closed (settled or inError) +func (c CertificateStatus) IsClosed() bool { + return !c.IsOpen() +} + +// IsSettled returns true if the certificate is settled +func (c CertificateStatus) IsSettled() bool { + return c == Settled +} + +// IsInError returns true if the certificate is in error +func (c CertificateStatus) IsInError() bool { + return c == InError +} + +// IsOpen returns true if the certificate is open (pending, candidate or proven) +func (c CertificateStatus) IsOpen() bool { + return slices.Contains(NonSettledStatuses, c) +} + +// UnmarshalJSON is the implementation of the json.Unmarshaler interface +func (c *CertificateStatus) UnmarshalJSON(rawStatus []byte) error { + status := strings.Trim(string(rawStatus), "\"") + if strings.Contains(status, "InError") { + status = "InError" + } + + switch status { + case "Pending": + *c = Pending + case "InError": + *c = InError + case "Proven": + *c = Proven + case "Candidate": + *c = Candidate + case "Settled": + *c = Settled + default: + // Maybe the status is numeric: + var statusInt int + if _, err := fmt.Sscanf(status, "%d", &statusInt); err == nil { + *c = CertificateStatus(statusInt) + } else { + return fmt.Errorf("invalid status: %s", status) + } + } + + return nil +} + +type LeafType uint8 + +func (l LeafType) Uint8() uint8 { + return uint8(l) +} + +func (l LeafType) String() string { + return [...]string{"Transfer", "Message"}[l] +} + +func (l *LeafType) UnmarshalJSON(raw []byte) error { + rawStr := strings.Trim(string(raw), "\"") + switch rawStr { + case "Transfer": + *l = LeafTypeAsset + case "Message": + *l = LeafTypeMessage + default: + var value int + if _, err := fmt.Sscanf(rawStr, "%d", &value); err != nil { + return fmt.Errorf("invalid LeafType: %s", rawStr) + } + *l = LeafType(value) + } + return nil +} + +const ( + LeafTypeAsset LeafType = iota + LeafTypeMessage +) + +// Certificate is the data structure that will be sent to the agglayer +type Certificate struct { + NetworkID uint32 `json:"network_id"` + Height uint64 `json:"height"` + PrevLocalExitRoot common.Hash `json:"prev_local_exit_root"` + NewLocalExitRoot common.Hash `json:"new_local_exit_root"` + BridgeExits []*BridgeExit `json:"bridge_exits"` + ImportedBridgeExits []*ImportedBridgeExit `json:"imported_bridge_exits"` + Metadata common.Hash `json:"metadata"` +} + +// Brief returns a string with a brief cert +func (c *Certificate) Brief() string { + if c == nil { + return nilStr + } + res := fmt.Sprintf("agglayer.Cert {height: %d prevLER: %s newLER: %s exits: %d imported_exits: %d}", c.Height, + c.PrevLocalExitRoot.String(), c.NewLocalExitRoot.String(), + len(c.BridgeExits), len(c.ImportedBridgeExits)) + return res +} + +// Hash returns a hash that uniquely identifies the certificate +func (c *Certificate) Hash() common.Hash { + bridgeExitsHashes := make([][]byte, len(c.BridgeExits)) + for i, bridgeExit := range c.BridgeExits { + bridgeExitsHashes[i] = bridgeExit.Hash().Bytes() + } + + importedBridgeExitsHashes := make([][]byte, len(c.ImportedBridgeExits)) + for i, importedBridgeExit := range c.ImportedBridgeExits { + importedBridgeExitsHashes[i] = importedBridgeExit.Hash().Bytes() + } + + bridgeExitsPart := crypto.Keccak256(bridgeExitsHashes...) + importedBridgeExitsPart := crypto.Keccak256(importedBridgeExitsHashes...) + + return crypto.Keccak256Hash( + aggkitcommon.Uint32ToBytes(c.NetworkID), + aggkitcommon.Uint64ToBytes(c.Height), + c.PrevLocalExitRoot.Bytes(), + c.NewLocalExitRoot.Bytes(), + bridgeExitsPart, + importedBridgeExitsPart, + ) +} + +// HashToSign is the actual hash that needs to be signed by the aggsender +// as expected by the agglayer +func (c *Certificate) HashToSign() common.Hash { + globalIndexHashes := make([][]byte, len(c.ImportedBridgeExits)) + for i, importedBridgeExit := range c.ImportedBridgeExits { + globalIndexHashes[i] = importedBridgeExit.GlobalIndex.Hash().Bytes() + } + + return crypto.Keccak256Hash( + c.NewLocalExitRoot.Bytes(), + crypto.Keccak256Hash(globalIndexHashes...).Bytes(), + ) +} + +// SignedCertificate is the struct that contains the certificate and the signature of the signer +type SignedCertificate struct { + *Certificate + Signature *Signature `json:"signature"` +} + +func (s *SignedCertificate) Brief() string { + return fmt.Sprintf("Certificate:%s,\nSignature: %s", s.Certificate.Brief(), s.Signature.String()) +} + +// CopyWithDefaulting returns a shallow copy of the signed certificate +func (s *SignedCertificate) CopyWithDefaulting() *SignedCertificate { + certificateCopy := *s.Certificate + + if certificateCopy.BridgeExits == nil { + certificateCopy.BridgeExits = make([]*BridgeExit, 0) + } + + if certificateCopy.ImportedBridgeExits == nil { + certificateCopy.ImportedBridgeExits = make([]*ImportedBridgeExit, 0) + } + + signature := s.Signature + if signature == nil { + signature = &Signature{} + } + + return &SignedCertificate{ + Certificate: &certificateCopy, + Signature: signature, + } +} + +// Signature is the data structure that will hold the signature of the given certificate +type Signature struct { + R common.Hash `json:"r"` + S common.Hash `json:"s"` + OddParity bool `json:"odd_y_parity"` +} + +func (s *Signature) String() string { + return fmt.Sprintf("R: %s, S: %s, OddParity: %t", s.R.String(), s.S.String(), s.OddParity) +} + +// TokenInfo encapsulates the information to uniquely identify a token on the origin network. +type TokenInfo struct { + OriginNetwork uint32 `json:"origin_network"` + OriginTokenAddress common.Address `json:"origin_token_address"` +} + +// String returns a string representation of the TokenInfo struct +func (t *TokenInfo) String() string { + return fmt.Sprintf("OriginNetwork: %d, OriginTokenAddress: %s", t.OriginNetwork, t.OriginTokenAddress.String()) +} + +// GlobalIndex represents the global index of an imported bridge exit +type GlobalIndex struct { + MainnetFlag bool `json:"mainnet_flag"` + RollupIndex uint32 `json:"rollup_index"` + LeafIndex uint32 `json:"leaf_index"` +} + +// String returns a string representation of the GlobalIndex struct +func (g *GlobalIndex) String() string { + return fmt.Sprintf("MainnetFlag: %t, RollupIndex: %d, LeafIndex: %d", g.MainnetFlag, g.RollupIndex, g.LeafIndex) +} + +func (g *GlobalIndex) Hash() common.Hash { + return crypto.Keccak256Hash( + aggkitcommon.BigIntToLittleEndianBytes( + bridgesync.GenerateGlobalIndex(g.MainnetFlag, g.RollupIndex, g.LeafIndex), + ), + ) +} + +func (g *GlobalIndex) UnmarshalFromMap(data map[string]interface{}) error { + rollupIndex, err := convertMapValue[uint32](data, "rollup_index") + if err != nil { + return err + } + + leafIndex, err := convertMapValue[uint32](data, "leaf_index") + if err != nil { + return err + } + + mainnetFlag, err := convertMapValue[bool](data, "mainnet_flag") + if err != nil { + return err + } + + g.RollupIndex = rollupIndex + g.LeafIndex = leafIndex + g.MainnetFlag = mainnetFlag + + return nil +} + +// BridgeExit represents a token bridge exit +type BridgeExit struct { + LeafType LeafType `json:"leaf_type"` + TokenInfo *TokenInfo `json:"token_info"` + DestinationNetwork uint32 `json:"dest_network"` + DestinationAddress common.Address `json:"dest_address"` + Amount *big.Int `json:"amount"` + IsMetadataHashed bool `json:"-"` + Metadata []byte `json:"metadata"` +} + +func (b *BridgeExit) String() string { + res := fmt.Sprintf("LeafType: %s, DestinationNetwork: %d, DestinationAddress: %s, Amount: %s, Metadata: %s", + b.LeafType.String(), b.DestinationNetwork, b.DestinationAddress.String(), + b.Amount.String(), common.Bytes2Hex(b.Metadata)) + + if b.TokenInfo == nil { + res += ", TokenInfo: nil" + } else { + res += fmt.Sprintf(", TokenInfo: %s", b.TokenInfo.String()) + } + + return res +} + +// Hash returns a hash that uniquely identifies the bridge exit +func (b *BridgeExit) Hash() common.Hash { + if b.Amount == nil { + b.Amount = big.NewInt(0) + } + var metaDataHash []byte + if b.IsMetadataHashed { + metaDataHash = b.Metadata + } else { + metaDataHash = crypto.Keccak256(b.Metadata) + } + + return crypto.Keccak256Hash( + []byte{b.LeafType.Uint8()}, + aggkitcommon.Uint32ToBytes(b.TokenInfo.OriginNetwork), + b.TokenInfo.OriginTokenAddress.Bytes(), + aggkitcommon.Uint32ToBytes(b.DestinationNetwork), + b.DestinationAddress.Bytes(), + common.BigToHash(b.Amount).Bytes(), + metaDataHash, + ) +} + +// MarshalJSON is the implementation of the json.Marshaler interface +func (b *BridgeExit) MarshalJSON() ([]byte, error) { + var metadataString interface{} + if b.IsMetadataHashed { + metadataString = common.Bytes2Hex(b.Metadata) + } else if len(b.Metadata) > 0 { + metadataString = bytesToUints(b.Metadata) + } else { + metadataString = nil + } + + return json.Marshal(&struct { + LeafType string `json:"leaf_type"` + TokenInfo *TokenInfo `json:"token_info"` + DestinationNetwork uint32 `json:"dest_network"` + DestinationAddress common.Address `json:"dest_address"` + Amount string `json:"amount"` + Metadata interface{} `json:"metadata"` + }{ + LeafType: b.LeafType.String(), + TokenInfo: b.TokenInfo, + DestinationNetwork: b.DestinationNetwork, + DestinationAddress: b.DestinationAddress, + Amount: b.Amount.String(), + Metadata: metadataString, + }) +} + +func (b *BridgeExit) UnmarshalJSON(data []byte) error { + aux := &struct { + LeafType LeafType `json:"leaf_type"` + TokenInfo *TokenInfo `json:"token_info"` + DestinationNetwork uint32 `json:"dest_network"` + DestinationAddress common.Address `json:"dest_address"` + Amount string `json:"amount"` + Metadata interface{} `json:"metadata"` + }{} + + if err := json.Unmarshal(data, &aux); err != nil { + return err + } + b.LeafType = aux.LeafType + b.TokenInfo = aux.TokenInfo + b.DestinationNetwork = aux.DestinationNetwork + b.DestinationAddress = aux.DestinationAddress + var ok bool + if !strings.Contains(aux.Amount, nilStr) { + b.Amount, ok = new(big.Int).SetString(aux.Amount, base10) + if !ok { + return fmt.Errorf("failed to convert amount to big.Int: %s", aux.Amount) + } + } + if s, ok := aux.Metadata.(string); ok { + b.IsMetadataHashed = true + b.Metadata = common.Hex2Bytes(s) + } else if uints, ok := aux.Metadata.([]interface{}); ok { + b.IsMetadataHashed = false + b.Metadata = make([]byte, len(uints)) + for k, v := range uints { + value, ok := v.(float64) + if !ok { + return fmt.Errorf("failed to convert metadata to byte: %v", v) + } + b.Metadata[k] = byte(value) + } + } else { + b.Metadata = nil + } + return nil +} + +// bytesToUints converts a byte slice to a slice of uints +func bytesToUints(data []byte) []uint { + uints := make([]uint, len(data)) + for i, b := range data { + uints[i] = uint(b) + } + return uints +} + +// MerkleProof represents an inclusion proof of a leaf in a Merkle tree +type MerkleProof struct { + Root common.Hash `json:"root"` + Proof [types.DefaultHeight]common.Hash `json:"proof"` +} + +// MarshalJSON is the implementation of the json.Marshaler interface +func (m *MerkleProof) MarshalJSON() ([]byte, error) { + return json.Marshal(&struct { + Root common.Hash `json:"root"` + Proof map[string][types.DefaultHeight]common.Hash `json:"proof"` + }{ + Root: m.Root, + Proof: map[string][types.DefaultHeight]common.Hash{ + "siblings": m.Proof, + }, + }) +} + +func (m *MerkleProof) UnmarshalJSON(data []byte) error { + aux := &struct { + Root common.Hash `json:"root"` + Proof map[string][types.DefaultHeight]common.Hash `json:"proof"` + }{} + + if err := json.Unmarshal(data, &aux); err != nil { + return err + } + m.Root = aux.Root + m.Proof = aux.Proof["siblings"] + return nil +} + +// Hash returns the hash of the Merkle proof struct +func (m *MerkleProof) Hash() common.Hash { + proofsAsSingleSlice := make([]byte, 0) + + for _, proof := range m.Proof { + proofsAsSingleSlice = append(proofsAsSingleSlice, proof.Bytes()...) + } + + return crypto.Keccak256Hash( + m.Root.Bytes(), + proofsAsSingleSlice, + ) +} + +func (m *MerkleProof) String() string { + return fmt.Sprintf("Root: %s, Proof: %v", m.Root.String(), m.Proof) +} + +// L1InfoTreeLeafInner represents the inner part of the L1 info tree leaf +type L1InfoTreeLeafInner struct { + GlobalExitRoot common.Hash `json:"global_exit_root"` + BlockHash common.Hash `json:"block_hash"` + Timestamp uint64 `json:"timestamp"` +} + +// Hash returns the hash of the L1InfoTreeLeafInner struct +func (l *L1InfoTreeLeafInner) Hash() common.Hash { + return crypto.Keccak256Hash( + l.GlobalExitRoot.Bytes(), + l.BlockHash.Bytes(), + aggkitcommon.Uint64ToBytes(l.Timestamp), + ) +} + +func (l *L1InfoTreeLeafInner) String() string { + return fmt.Sprintf("GlobalExitRoot: %s, BlockHash: %s, Timestamp: %d", + l.GlobalExitRoot.String(), l.BlockHash.String(), l.Timestamp) +} + +// L1InfoTreeLeaf represents the leaf of the L1 info tree +type L1InfoTreeLeaf struct { + L1InfoTreeIndex uint32 `json:"l1_info_tree_index"` + RollupExitRoot common.Hash `json:"rer"` + MainnetExitRoot common.Hash `json:"mer"` + Inner *L1InfoTreeLeafInner `json:"inner"` +} + +// Hash returns the hash of the L1InfoTreeLeaf struct +func (l *L1InfoTreeLeaf) Hash() common.Hash { + return l.Inner.Hash() +} + +func (l *L1InfoTreeLeaf) String() string { + return fmt.Sprintf("L1InfoTreeIndex: %d, RollupExitRoot: %s, MainnetExitRoot: %s, Inner: %s", + l.L1InfoTreeIndex, + l.RollupExitRoot.String(), + l.MainnetExitRoot.String(), + l.Inner.String(), + ) +} + +// Claim is the interface that will be implemented by the different types of claims +type Claim interface { + Type() string + Hash() common.Hash + MarshalJSON() ([]byte, error) + String() string +} + +// ClaimFromMainnnet represents a claim originating from the mainnet +type ClaimFromMainnnet struct { + ProofLeafMER *MerkleProof `json:"proof_leaf_mer"` + ProofGERToL1Root *MerkleProof `json:"proof_ger_l1root"` + L1Leaf *L1InfoTreeLeaf `json:"l1_leaf"` +} + +// Type is the implementation of Claim interface +func (c ClaimFromMainnnet) Type() string { + return "Mainnet" +} + +// MarshalJSON is the implementation of Claim interface +func (c *ClaimFromMainnnet) MarshalJSON() ([]byte, error) { + return json.Marshal(&struct { + Child map[string]interface{} `json:"Mainnet"` + }{ + Child: map[string]interface{}{ + "proof_leaf_mer": c.ProofLeafMER, + "proof_ger_l1root": c.ProofGERToL1Root, + "l1_leaf": c.L1Leaf, + }, + }) +} + +func (c *ClaimFromMainnnet) UnmarshalJSON(data []byte) error { + if string(data) == nullStr { + return nil + } + + claimData := &struct { + Child struct { + ProofLeafMER *MerkleProof `json:"proof_leaf_mer"` + ProofGERToL1Root *MerkleProof `json:"proof_ger_l1root"` + L1Leaf *L1InfoTreeLeaf `json:"l1_leaf"` + } `json:"Mainnet"` + }{} + if err := json.Unmarshal(data, &claimData); err != nil { + return fmt.Errorf("failed to unmarshal the subobject: %w", err) + } + c.ProofLeafMER = claimData.Child.ProofLeafMER + c.ProofGERToL1Root = claimData.Child.ProofGERToL1Root + c.L1Leaf = claimData.Child.L1Leaf + + return nil +} + +// Hash is the implementation of Claim interface +func (c *ClaimFromMainnnet) Hash() common.Hash { + return crypto.Keccak256Hash( + c.ProofLeafMER.Hash().Bytes(), + c.ProofGERToL1Root.Hash().Bytes(), + c.L1Leaf.Hash().Bytes(), + ) +} + +func (c *ClaimFromMainnnet) String() string { + return fmt.Sprintf("ProofLeafMER: %s, ProofGERToL1Root: %s, L1Leaf: %s", + c.ProofLeafMER.String(), c.ProofGERToL1Root.String(), c.L1Leaf.String()) +} + +// ClaimFromRollup represents a claim originating from a rollup +type ClaimFromRollup struct { + ProofLeafLER *MerkleProof `json:"proof_leaf_ler"` + ProofLERToRER *MerkleProof `json:"proof_ler_rer"` + ProofGERToL1Root *MerkleProof `json:"proof_ger_l1root"` + L1Leaf *L1InfoTreeLeaf `json:"l1_leaf"` +} + +// Type is the implementation of Claim interface +func (c ClaimFromRollup) Type() string { + return "Rollup" +} + +// MarshalJSON is the implementation of Claim interface +func (c *ClaimFromRollup) MarshalJSON() ([]byte, error) { + return json.Marshal(&struct { + Child map[string]interface{} `json:"Rollup"` + }{ + Child: map[string]interface{}{ + "proof_leaf_ler": c.ProofLeafLER, + "proof_ler_rer": c.ProofLERToRER, + "proof_ger_l1root": c.ProofGERToL1Root, + "l1_leaf": c.L1Leaf, + }, + }) +} + +func (c *ClaimFromRollup) UnmarshalJSON(data []byte) error { + if string(data) == nullStr { + return nil + } + + claimData := &struct { + Child struct { + ProofLeafLER *MerkleProof `json:"proof_leaf_ler"` + ProofLERToRER *MerkleProof `json:"proof_ler_rer"` + ProofGERToL1Root *MerkleProof `json:"proof_ger_l1root"` + L1Leaf *L1InfoTreeLeaf `json:"l1_leaf"` + } `json:"Rollup"` + }{} + + if err := json.Unmarshal(data, &claimData); err != nil { + return fmt.Errorf("failed to unmarshal the subobject: %w", err) + } + c.ProofLeafLER = claimData.Child.ProofLeafLER + c.ProofLERToRER = claimData.Child.ProofLERToRER + c.ProofGERToL1Root = claimData.Child.ProofGERToL1Root + c.L1Leaf = claimData.Child.L1Leaf + + return nil +} + +// Hash is the implementation of Claim interface +func (c *ClaimFromRollup) Hash() common.Hash { + return crypto.Keccak256Hash( + c.ProofLeafLER.Hash().Bytes(), + c.ProofLERToRER.Hash().Bytes(), + c.ProofGERToL1Root.Hash().Bytes(), + c.L1Leaf.Hash().Bytes(), + ) +} + +func (c *ClaimFromRollup) String() string { + return fmt.Sprintf("ProofLeafLER: %s, ProofLERToRER: %s, ProofGERToL1Root: %s, L1Leaf: %s", + c.ProofLeafLER.String(), c.ProofLERToRER.String(), c.ProofGERToL1Root.String(), c.L1Leaf.String()) +} + +// ClaimSelector is a helper struct that allow to decice which type of claim to unmarshal +type ClaimSelector struct { + obj Claim +} + +func (c *ClaimSelector) GetObject() Claim { + return c.obj +} + +func (c *ClaimSelector) UnmarshalJSON(data []byte) error { + var obj map[string]interface{} + if string(data) == nullStr { + return nil + } + if err := json.Unmarshal(data, &obj); err != nil { + return err + } + var ok bool + if _, ok = obj["Mainnet"]; ok { + c.obj = &ClaimFromMainnnet{} + } else if _, ok = obj["Rollup"]; ok { + c.obj = &ClaimFromRollup{} + } else { + return errors.New("invalid claim type") + } + + return json.Unmarshal(data, &c.obj) +} + +// ImportedBridgeExit represents a token bridge exit originating on another network but claimed on the current network. +type ImportedBridgeExit struct { + BridgeExit *BridgeExit `json:"bridge_exit"` + ClaimData Claim `json:"claim_data"` + GlobalIndex *GlobalIndex `json:"global_index"` +} + +func (c *ImportedBridgeExit) String() string { + var res string + + if c.BridgeExit == nil { + res = "BridgeExit: nil" + } else { + res = fmt.Sprintf("BridgeExit: %s", c.BridgeExit.String()) + } + + if c.GlobalIndex == nil { + res += ", GlobalIndex: nil" + } else { + res += fmt.Sprintf(", GlobalIndex: %s", c.GlobalIndex.String()) + } + + res += fmt.Sprintf("ClaimData: %s", c.ClaimData.String()) + + return res +} + +func (c *ImportedBridgeExit) UnmarshalJSON(data []byte) error { + aux := &struct { + BridgeExit *BridgeExit `json:"bridge_exit"` + ClaimData ClaimSelector `json:"claim_data"` + GlobalIndex *GlobalIndex `json:"global_index"` + }{} + if err := json.Unmarshal(data, &aux); err != nil { + return err + } + c.BridgeExit = aux.BridgeExit + c.ClaimData = aux.ClaimData.GetObject() + c.GlobalIndex = aux.GlobalIndex + return nil +} + +// Hash returns a hash that uniquely identifies the imported bridge exit +func (c *ImportedBridgeExit) Hash() common.Hash { + return crypto.Keccak256Hash( + c.BridgeExit.Hash().Bytes(), + c.ClaimData.Hash().Bytes(), + c.GlobalIndex.Hash().Bytes(), + ) +} + +var _ error = (*GenericError)(nil) + +type GenericError struct { + Key string + Value string +} + +func (p *GenericError) Error() string { + return fmt.Sprintf("[Agglayer Error] %s: %s", p.Key, p.Value) +} + +// CertificateHeader is the structure returned by the interop_getCertificateHeader RPC call +type CertificateHeader struct { + NetworkID uint32 `json:"network_id"` + Height uint64 `json:"height"` + EpochNumber *uint64 `json:"epoch_number"` + CertificateIndex *uint64 `json:"certificate_index"` + CertificateID common.Hash `json:"certificate_id"` + PreviousLocalExitRoot *common.Hash `json:"prev_local_exit_root,omitempty"` + NewLocalExitRoot common.Hash `json:"new_local_exit_root"` + Status CertificateStatus `json:"status"` + Metadata common.Hash `json:"metadata"` + Error error `json:"-"` +} + +// ID returns a string with the ident of this cert (height/certID) +func (c *CertificateHeader) ID() string { + if c == nil { + return nilStr + } + return fmt.Sprintf("%d/%s", c.Height, c.CertificateID.String()) +} + +func (c *CertificateHeader) String() string { + if c == nil { + return nilStr + } + errors := "" + if c.Error != nil { + errors = c.Error.Error() + } + previousLocalExitRoot := nilStr + if c.PreviousLocalExitRoot != nil { + previousLocalExitRoot = c.PreviousLocalExitRoot.String() + } + return fmt.Sprintf("Height: %d, CertificateID: %s, PreviousLocalExitRoot: %s, NewLocalExitRoot: %s. Status: %s."+ + " Errors: [%s]", + c.Height, c.CertificateID.String(), previousLocalExitRoot, c.NewLocalExitRoot.String(), c.Status.String(), errors) +} + +func (c *CertificateHeader) UnmarshalJSON(data []byte) error { + // we define an alias to avoid infinite recursion + type Alias CertificateHeader + aux := &struct { + Status interface{} `json:"status"` + *Alias + }{ + Alias: (*Alias)(c), + } + + if err := json.Unmarshal(data, &aux); err != nil { + return err + } + + // Process Status field + switch status := aux.Status.(type) { + case string: // certificate not InError + if err := c.Status.UnmarshalJSON([]byte(status)); err != nil { + return err + } + case map[string]interface{}: // certificate has errors + inErrMap, err := convertMapValue[map[string]interface{}](status, "InError") + if err != nil { + return err + } + + inErrDataMap, err := convertMapValue[map[string]interface{}](inErrMap, "error") + if err != nil { + return err + } + + var agglayerErr error + + for errKey, errValueRaw := range inErrDataMap { + if errValueJSON, err := json.Marshal(errValueRaw); err != nil { + agglayerErr = &GenericError{ + Key: errKey, + Value: fmt.Sprintf("failed to marshal the agglayer error to the JSON. Raw value: %+v\nReason: %+v", + errValueRaw, err), + } + } else { + agglayerErr = &GenericError{Key: errKey, Value: string(errValueJSON)} + } + } + + c.Status = InError + c.Error = agglayerErr + default: + return errors.New("invalid status type") + } + + return nil +} + +// convertMapValue converts the value of a key in a map to a target type. +func convertMapValue[T any](data map[string]interface{}, key string) (T, error) { + value, ok := data[key] + if !ok { + var zero T + return zero, fmt.Errorf("key %s not found in map", key) + } + + // Try a direct type assertion + if convertedValue, ok := value.(T); ok { + return convertedValue, nil + } + + // If direct assertion fails, handle numeric type conversions + var target T + targetType := reflect.TypeOf(target) + + // Check if value is a float64 (default JSON number type) and target is a numeric type + if floatValue, ok := value.(float64); ok && targetType.Kind() >= reflect.Int && targetType.Kind() <= reflect.Uint64 { + convertedValue, err := convertNumeric(floatValue, targetType) + if err != nil { + return target, fmt.Errorf("conversion error for key %s: %w", key, err) + } + return convertedValue.(T), nil //nolint:forcetypeassert + } + + return target, fmt.Errorf("value of key %s is not of type %T", key, target) +} + +// convertNumeric converts a float64 to the specified numeric type. +func convertNumeric(value float64, targetType reflect.Type) (interface{}, error) { + switch targetType.Kind() { + case reflect.Int: + return int(value), nil + case reflect.Int8: + return int8(value), nil + case reflect.Int16: + return int16(value), nil + case reflect.Int32: + return int32(value), nil + case reflect.Int64: + return int64(value), nil + case reflect.Uint: + return uint(value), nil + case reflect.Uint8: + return uint8(value), nil + case reflect.Uint16: + return uint16(value), nil + case reflect.Uint32: + return uint32(value), nil + case reflect.Uint64: + return uint64(value), nil + case reflect.Float32: + return float32(value), nil + case reflect.Float64: + return value, nil + default: + return nil, fmt.Errorf("unsupported target type %v", targetType) + } +} + +// ClockConfiguration represents the configuration of the epoch clock +// returned by the interop_GetEpochConfiguration RPC call +type ClockConfiguration struct { + EpochDuration uint64 `json:"epoch_duration"` + GenesisBlock uint64 `json:"genesis_block"` +} + +func (c ClockConfiguration) String() string { + return fmt.Sprintf("EpochDuration: %d, GenesisBlock: %d", c.EpochDuration, c.GenesisBlock) +} diff --git a/agglayer/types_helpers_test.go b/agglayer/types_helpers_test.go new file mode 100644 index 00000000..843033a8 --- /dev/null +++ b/agglayer/types_helpers_test.go @@ -0,0 +1,71 @@ +package agglayer + +import ( + "fmt" + "testing" + + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" +) + +// Helper function to create a dummy TokenInfo +func createDummyTokenInfo(t *testing.T) *TokenInfo { + t.Helper() + + return &TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x2345"), + } +} + +// Helper function to create a dummy GlobalIndex +func createDummyGlobalIndex(t *testing.T) *GlobalIndex { + t.Helper() + + return &GlobalIndex{ + MainnetFlag: false, + RollupIndex: 10, + LeafIndex: 1, + } +} + +// Helper function to create a dummy Claim +func createDummyClaim(t *testing.T) *ClaimFromMainnnet { + t.Helper() + + return &ClaimFromMainnnet{ + ProofLeafMER: &MerkleProof{ + Root: common.HexToHash("0x1234"), + Proof: [common.HashLength]common.Hash{ + common.HexToHash("0x1234"), + common.HexToHash("0x5678"), + }, + }, + ProofGERToL1Root: &MerkleProof{ + Root: common.HexToHash("0x5678"), + Proof: [common.HashLength]common.Hash{ + common.HexToHash("0x5678"), + common.HexToHash("0x1234"), + }, + }, + L1Leaf: &L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + RollupExitRoot: common.HexToHash("0x987654321"), + MainnetExitRoot: common.HexToHash("0x123456789"), + Inner: &L1InfoTreeLeafInner{}, + }, + } +} + +// Helper function to create a dummy proof +func createDummyProof(t *testing.T) types.Proof { + t.Helper() + + proof := types.Proof{} + + for i := 0; i < int(types.DefaultHeight); i++ { + proof[i] = common.HexToHash(fmt.Sprintf("0x%x", i)) + } + + return proof +} diff --git a/agglayer/types_test.go b/agglayer/types_test.go new file mode 100644 index 00000000..0cefc3ec --- /dev/null +++ b/agglayer/types_test.go @@ -0,0 +1,1203 @@ +package agglayer + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "math/big" + "reflect" + "testing" + + aggkitcommon "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" +) + +const ( + expectedSignedCertificateEmptyMetadataJSON = `{"network_id":1,"height":1,"prev_local_exit_root":"0x0000000000000000000000000000000000000000000000000000000000000000","new_local_exit_root":"0x0000000000000000000000000000000000000000000000000000000000000000","bridge_exits":[{"leaf_type":"Transfer","token_info":null,"dest_network":0,"dest_address":"0x0000000000000000000000000000000000000000","amount":"1","metadata":null}],"imported_bridge_exits":[{"bridge_exit":{"leaf_type":"Transfer","token_info":null,"dest_network":0,"dest_address":"0x0000000000000000000000000000000000000000","amount":"1","metadata":null},"claim_data":null,"global_index":{"mainnet_flag":false,"rollup_index":1,"leaf_index":1}}],"metadata":"0x0000000000000000000000000000000000000000000000000000000000000000","signature":{"r":"0x0000000000000000000000000000000000000000000000000000000000000000","s":"0x0000000000000000000000000000000000000000000000000000000000000000","odd_y_parity":false}}` + expectedSignedCertificateMetadataJSON = `{"network_id":1,"height":1,"prev_local_exit_root":"0x0000000000000000000000000000000000000000000000000000000000000000","new_local_exit_root":"0x0000000000000000000000000000000000000000000000000000000000000000","bridge_exits":[{"leaf_type":"Transfer","token_info":null,"dest_network":0,"dest_address":"0x0000000000000000000000000000000000000000","amount":"1","metadata":[1,2,3]}],"imported_bridge_exits":[{"bridge_exit":{"leaf_type":"Transfer","token_info":null,"dest_network":0,"dest_address":"0x0000000000000000000000000000000000000000","amount":"1","metadata":null},"claim_data":null,"global_index":{"mainnet_flag":false,"rollup_index":1,"leaf_index":1}}],"metadata":"0x0000000000000000000000000000000000000000000000000000000000000000","signature":{"r":"0x0000000000000000000000000000000000000000000000000000000000000000","s":"0x0000000000000000000000000000000000000000000000000000000000000000","odd_y_parity":false}}` + fullCertificateJSON = `{"network_id":1,"height":0,"prev_local_exit_root":"0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757","new_local_exit_root":"0x79011be874bf6f229d8473eb251aa932210bc3ab843a316492d5bc0e4b9e945b","bridge_exits":[{"leaf_type":"Transfer","token_info":{"origin_network":0,"origin_token_address":"0x0000000000000000000000000000000000000000"},"dest_network":0,"dest_address":"0xbece3a31343c6019cde0d5a4df2af8df17ebcb0f","amount":"10000005400000000","metadata":null}],"imported_bridge_exits":[{"bridge_exit":{"leaf_type":"Transfer","token_info":{"origin_network":0,"origin_token_address":"0x0000000000000000000000000000000000000000"},"dest_network":1,"dest_address":"0xbece3a31343c6019cde0d5a4df2af8df17ebcb0f","amount":"20000005400000000","metadata":null},"claim_data":{"Mainnet":{"l1_leaf":{"l1_info_tree_index":3,"rer":"0x0000000000000000000000000000000000000000000000000000000000000000","mer":"0x34c7e5206c4c793171805029b5a3a5c6f2d3e5344731cd69912142dc083768bf","inner":{"global_exit_root":"0xefb4efc883a8d7ab7c414684a4f44fac0f522d5eef9144dbad85a6b7756d770d","block_hash":"0x02224ad091ae2762001610174fb70885734761b3518aca77b8af63308f3c0b67","timestamp":1734434917}},"proof_ger_l1root":{"root":"0x73011c89c4cb976b1feeec2185dba22ecdac6d424afeb83ed5cacfdaae735e95","proof":{"siblings":["0x628d0adbb4d8c80a15f0743fa32385efd0798189228dd83c73e09409d94c2273","0x0ffee9fcedabc3f74d1b86e97c2b3039f7b2c617a100d6ca1ad5c0e613939b05","0xe7dcc1ef21d4705f16b0c2976a5358719a60361f2435bd342e3f97c287ae5040","0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85","0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344","0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d","0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968","0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83","0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af","0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0","0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5","0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892","0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c","0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb","0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc","0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2","0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f","0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a","0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0","0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0","0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2","0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9","0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377","0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652","0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef","0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d","0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0","0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e","0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e","0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322","0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735","0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9"]}},"proof_leaf_mer":{"root":"0x34c7e5206c4c793171805029b5a3a5c6f2d3e5344731cd69912142dc083768bf","proof":{"siblings":["0x7e5dddb55a966fa6ccd6d470bb326a4fcef563567d6897c45b7ed885de710757","0x4b274df9344e005bfd46536d791100a85234bef4fab0348d1b2ffc0e7a709d33","0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30","0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85","0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344","0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d","0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968","0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83","0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af","0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0","0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5","0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892","0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c","0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb","0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc","0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2","0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f","0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a","0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0","0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0","0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2","0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9","0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377","0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652","0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef","0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d","0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0","0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e","0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e","0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322","0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735","0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9"]}}}},"global_index":{"mainnet_flag":true,"rollup_index":0,"leaf_index":2}},{"bridge_exit":{"leaf_type":"Transfer","token_info":{"origin_network":0,"origin_token_address":"0x0000000000000000000000000000000000000000"},"dest_network":1,"dest_address":"0xbece3a31343c6019cde0d5a4df2af8df17ebcb0f","amount":"1234567","metadata":null},"claim_data":{"Rollup":{"l1_leaf":{"l1_info_tree_index":4,"rer":"0x33267c0646fee979e59af1cd62f9e46cd0917f62aba82658e1a92a50e1d7b4d1","mer":"0x34c7e5206c4c793171805029b5a3a5c6f2d3e5344731cd69912142dc083768bf","inner":{"global_exit_root":"0x6df4684b75569ffa9c0d352d1293c5d98950ecc1ea34226194842d10b14f47d0","block_hash":"0x52bbc4079dcaaac2f6e950a0fe5aed613473faf48a721709ce347c4ddfe0b50d","timestamp":1734435263}},"proof_ger_l1root":{"root":"0x73011c89c4cb976b1feeec2185dba22ecdac6d424afeb83ed5cacfdaae735e95","proof":{"siblings":["0x0000000000000000000000000000000000000000000000000000000000000000","0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","0x20a8c649fbea68114dca04c42bf16e23c6b39d4eafcc54378c5b7516c3a3c9d2","0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85","0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344","0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d","0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968","0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83","0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af","0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0","0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5","0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892","0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c","0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb","0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc","0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2","0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f","0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a","0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0","0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0","0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2","0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9","0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377","0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652","0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef","0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d","0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0","0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e","0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e","0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322","0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735","0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9"]}},"proof_leaf_ler":{"root":"0x156ab7795d0bb31ed548c43f90e71b8f06f71e5776a5ba444f3f3cb0935b4647","proof":{"siblings":["0x0000000000000000000000000000000000000000000000000000000000000000","0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30","0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85","0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344","0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d","0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968","0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83","0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af","0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0","0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5","0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892","0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c","0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb","0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc","0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2","0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f","0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a","0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0","0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0","0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2","0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9","0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377","0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652","0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef","0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d","0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0","0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e","0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e","0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322","0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735","0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9"]}},"proof_ler_rer":{"root":"0x33267c0646fee979e59af1cd62f9e46cd0917f62aba82658e1a92a50e1d7b4d1","proof":{"siblings":["0x0000000000000000000000000000000000000000000000000000000000000000","0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5","0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30","0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85","0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344","0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d","0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968","0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83","0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af","0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0","0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5","0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892","0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c","0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb","0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc","0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2","0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f","0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a","0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0","0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0","0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2","0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9","0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377","0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652","0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef","0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d","0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0","0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e","0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e","0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322","0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735","0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9"]}}}},"global_index":{"mainnet_flag":false,"rollup_index":1,"leaf_index":0}}],"metadata":"0x0100000000000000010000047867616580000000000000000000000000000000","signature":{"r":"0x4798dc4c299dfa4299c1992624271e2f1953cac3a909742ec4ca9549582c9273","s":"0x29762f0418ab0fc6019c1ea4c0722fe19477708e29e3d1416727339deba5660e","odd_y_parity":false}}` +) + +func TestBridgeExit_Hash(t *testing.T) { + t.Parallel() + + MetadaHash := common.HexToHash("0x1234") + bridge := BridgeExit{ + TokenInfo: &TokenInfo{}, + IsMetadataHashed: true, + Metadata: MetadaHash[:], + } + require.Equal(t, "0xaa57e4bf430fe25ca5068f9e1a25e8aef15744905cdf7635e0d5a468bd26bb18", + bridge.Hash().String(), "use the hashed metadata, instead of calculating hash") + + bridge.IsMetadataHashed = false + require.Equal(t, "0x79d5362ad609e06e022277ede4fd10899dc189c0ed56e1a2c6982d0563fe1be7", + bridge.Hash().String(), "metadata is not hashed, calculate hash") + + bridge.IsMetadataHashed = false + bridge.Metadata = []byte{} + require.Equal(t, "0xe3e297278c7df4ae4f235be10155ac62c53b08e2a14ed09b7dd6b688952ee883", + bridge.Hash().String(), "metadata is not hashed and it's empty, calculate hash") + + bridge.IsMetadataHashed = true + bridge.Metadata = []byte{} + require.Equal(t, "0x51980562e41978f15369c21f26920284ac6836d53b02cd89edf4fedc97e68215", + bridge.Hash().String(), "metadata is a hashed and it's empty,use it") +} + +func TestGenericError_Error(t *testing.T) { + t.Parallel() + + err := GenericError{"test", "value"} + require.Equal(t, "[Agglayer Error] test: value", err.Error()) +} + +func TestCertificateHeader_ID(t *testing.T) { + t.Parallel() + + certificate := CertificateHeader{ + Height: 1, + CertificateID: common.HexToHash("0x123"), + } + require.Equal(t, "1/0x0000000000000000000000000000000000000000000000000000000000000123", certificate.ID()) + + var certNil *CertificateHeader + require.Equal(t, "nil", certNil.ID()) +} + +func TestCertificateHeaderString(t *testing.T) { + t.Parallel() + + certificate := CertificateHeader{ + Height: 1, + CertificateID: common.HexToHash("0x123"), + } + require.Equal(t, "Height: 1, CertificateID: 0x0000000000000000000000000000000000000000000000000000000000000123, PreviousLocalExitRoot: nil, NewLocalExitRoot: 0x0000000000000000000000000000000000000000000000000000000000000000. Status: Pending. Errors: []", + certificate.String()) + + var certNil *CertificateHeader + require.Equal(t, "nil", certNil.String()) +} + +func TestMarshalJSON(t *testing.T) { + t.Parallel() + + t.Run("MarshalJSON with empty proofs", func(t *testing.T) { + t.Parallel() + + cert := SignedCertificate{ + Certificate: &Certificate{ + NetworkID: 1, + Height: 1, + PrevLocalExitRoot: common.Hash{}, + NewLocalExitRoot: common.Hash{}, + BridgeExits: []*BridgeExit{ + { + LeafType: LeafTypeAsset, + DestinationAddress: common.Address{}, + Amount: big.NewInt(1), + }, + }, + ImportedBridgeExits: []*ImportedBridgeExit{ + { + BridgeExit: &BridgeExit{ + LeafType: LeafTypeAsset, + DestinationAddress: common.Address{}, + Amount: big.NewInt(1), + Metadata: []byte{}, + }, + ClaimData: nil, + GlobalIndex: &GlobalIndex{ + MainnetFlag: false, + RollupIndex: 1, + LeafIndex: 1, + }, + }, + }, + }, + + Signature: &Signature{ + R: common.Hash{}, + S: common.Hash{}, + OddParity: false, + }, + } + data, err := json.Marshal(cert) + require.NoError(t, err) + log.Info(string(data)) + require.Equal(t, expectedSignedCertificateEmptyMetadataJSON, string(data)) + + cert.BridgeExits[0].Metadata = []byte{1, 2, 3} + data, err = json.Marshal(cert) + require.NoError(t, err) + log.Info(string(data)) + require.Equal(t, expectedSignedCertificateMetadataJSON, string(data)) + }) + + t.Run("MarshalJSON with proofs", func(t *testing.T) { + t.Parallel() + + cert := SignedCertificate{ + Certificate: &Certificate{ + NetworkID: 11, + Height: 111, + PrevLocalExitRoot: common.HexToHash("0x111"), + NewLocalExitRoot: common.HexToHash("0x222"), + BridgeExits: []*BridgeExit{ + { + LeafType: LeafTypeAsset, + TokenInfo: &TokenInfo{OriginNetwork: 1, OriginTokenAddress: common.HexToAddress("0x123")}, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(1000), + Metadata: []byte{}, // we leave it empty on purpose to see when marshaled it will be null + }, + }, + ImportedBridgeExits: []*ImportedBridgeExit{ + { + BridgeExit: &BridgeExit{ + LeafType: LeafTypeMessage, + TokenInfo: &TokenInfo{OriginNetwork: 1, OriginTokenAddress: common.HexToAddress("0x789")}, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0xabc"), + Amount: big.NewInt(2000), + Metadata: []byte{0x03, 0x04}, + }, + GlobalIndex: &GlobalIndex{ + MainnetFlag: true, + RollupIndex: 0, + LeafIndex: 1, + }, + ClaimData: &ClaimFromMainnnet{ + ProofLeafMER: &MerkleProof{ + Root: common.HexToHash("0x333"), + Proof: createDummyProof(t), + }, + ProofGERToL1Root: &MerkleProof{ + Root: common.HexToHash("0x444"), + Proof: createDummyProof(t), + }, + L1Leaf: &L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + RollupExitRoot: common.HexToHash("0x555"), + MainnetExitRoot: common.HexToHash("0x123456"), + Inner: &L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x777"), + BlockHash: common.HexToHash("0x888"), + Timestamp: 12345678, + }, + }, + }, + }, + { + BridgeExit: &BridgeExit{ + LeafType: LeafTypeAsset, + TokenInfo: &TokenInfo{OriginNetwork: 1, OriginTokenAddress: common.HexToAddress("0x789")}, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0xabcdef"), + Amount: big.NewInt(2201), + Metadata: []byte{0x05, 0x08}, + }, + GlobalIndex: &GlobalIndex{ + MainnetFlag: false, + RollupIndex: 1, + LeafIndex: 2, + }, + ClaimData: &ClaimFromRollup{ + ProofLeafLER: &MerkleProof{ + Root: common.HexToHash("0x333"), + Proof: createDummyProof(t), + }, + ProofLERToRER: &MerkleProof{ + Root: common.HexToHash("0x444"), + Proof: createDummyProof(t), + }, + ProofGERToL1Root: &MerkleProof{ + Root: common.HexToHash("0x555"), + Proof: createDummyProof(t), + }, + L1Leaf: &L1InfoTreeLeaf{ + L1InfoTreeIndex: 2, + RollupExitRoot: common.HexToHash("0x532"), + MainnetExitRoot: common.HexToHash("0x654321"), + Inner: &L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x777"), + BlockHash: common.HexToHash("0x888"), + Timestamp: 12345678, + }, + }, + }, + }, + }, + Metadata: common.HexToHash("0xdef"), + }, + Signature: &Signature{ + R: common.HexToHash("0x111"), + S: common.HexToHash("0x222"), + OddParity: true, + }, + } + + expectedJSON := `{"network_id":11,"height":111,"prev_local_exit_root":"0x0000000000000000000000000000000000000000000000000000000000000111","new_local_exit_root":"0x0000000000000000000000000000000000000000000000000000000000000222","bridge_exits":[{"leaf_type":"Transfer","token_info":{"origin_network":1,"origin_token_address":"0x0000000000000000000000000000000000000123"},"dest_network":2,"dest_address":"0x0000000000000000000000000000000000000456","amount":"1000","metadata":null}],"imported_bridge_exits":[{"bridge_exit":{"leaf_type":"Message","token_info":{"origin_network":1,"origin_token_address":"0x0000000000000000000000000000000000000789"},"dest_network":2,"dest_address":"0x0000000000000000000000000000000000000abc","amount":"2000","metadata":[3,4]},"claim_data":{"Mainnet":{"l1_leaf":{"l1_info_tree_index":1,"rer":"0x0000000000000000000000000000000000000000000000000000000000000555","mer":"0x0000000000000000000000000000000000000000000000000000000000123456","inner":{"global_exit_root":"0x0000000000000000000000000000000000000000000000000000000000000777","block_hash":"0x0000000000000000000000000000000000000000000000000000000000000888","timestamp":12345678}},"proof_ger_l1root":{"root":"0x0000000000000000000000000000000000000000000000000000000000000444","proof":{"siblings":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000014","0x0000000000000000000000000000000000000000000000000000000000000015","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000017","0x0000000000000000000000000000000000000000000000000000000000000018","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a","0x000000000000000000000000000000000000000000000000000000000000001b","0x000000000000000000000000000000000000000000000000000000000000001c","0x000000000000000000000000000000000000000000000000000000000000001d","0x000000000000000000000000000000000000000000000000000000000000001e","0x000000000000000000000000000000000000000000000000000000000000001f"]}},"proof_leaf_mer":{"root":"0x0000000000000000000000000000000000000000000000000000000000000333","proof":{"siblings":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000014","0x0000000000000000000000000000000000000000000000000000000000000015","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000017","0x0000000000000000000000000000000000000000000000000000000000000018","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a","0x000000000000000000000000000000000000000000000000000000000000001b","0x000000000000000000000000000000000000000000000000000000000000001c","0x000000000000000000000000000000000000000000000000000000000000001d","0x000000000000000000000000000000000000000000000000000000000000001e","0x000000000000000000000000000000000000000000000000000000000000001f"]}}}},"global_index":{"mainnet_flag":true,"rollup_index":0,"leaf_index":1}},{"bridge_exit":{"leaf_type":"Transfer","token_info":{"origin_network":1,"origin_token_address":"0x0000000000000000000000000000000000000789"},"dest_network":2,"dest_address":"0x0000000000000000000000000000000000abcdef","amount":"2201","metadata":[5,8]},"claim_data":{"Rollup":{"l1_leaf":{"l1_info_tree_index":2,"rer":"0x0000000000000000000000000000000000000000000000000000000000000532","mer":"0x0000000000000000000000000000000000000000000000000000000000654321","inner":{"global_exit_root":"0x0000000000000000000000000000000000000000000000000000000000000777","block_hash":"0x0000000000000000000000000000000000000000000000000000000000000888","timestamp":12345678}},"proof_ger_l1root":{"root":"0x0000000000000000000000000000000000000000000000000000000000000555","proof":{"siblings":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000014","0x0000000000000000000000000000000000000000000000000000000000000015","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000017","0x0000000000000000000000000000000000000000000000000000000000000018","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a","0x000000000000000000000000000000000000000000000000000000000000001b","0x000000000000000000000000000000000000000000000000000000000000001c","0x000000000000000000000000000000000000000000000000000000000000001d","0x000000000000000000000000000000000000000000000000000000000000001e","0x000000000000000000000000000000000000000000000000000000000000001f"]}},"proof_leaf_ler":{"root":"0x0000000000000000000000000000000000000000000000000000000000000333","proof":{"siblings":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000014","0x0000000000000000000000000000000000000000000000000000000000000015","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000017","0x0000000000000000000000000000000000000000000000000000000000000018","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a","0x000000000000000000000000000000000000000000000000000000000000001b","0x000000000000000000000000000000000000000000000000000000000000001c","0x000000000000000000000000000000000000000000000000000000000000001d","0x000000000000000000000000000000000000000000000000000000000000001e","0x000000000000000000000000000000000000000000000000000000000000001f"]}},"proof_ler_rer":{"root":"0x0000000000000000000000000000000000000000000000000000000000000444","proof":{"siblings":["0x0000000000000000000000000000000000000000000000000000000000000000","0x0000000000000000000000000000000000000000000000000000000000000001","0x0000000000000000000000000000000000000000000000000000000000000002","0x0000000000000000000000000000000000000000000000000000000000000003","0x0000000000000000000000000000000000000000000000000000000000000004","0x0000000000000000000000000000000000000000000000000000000000000005","0x0000000000000000000000000000000000000000000000000000000000000006","0x0000000000000000000000000000000000000000000000000000000000000007","0x0000000000000000000000000000000000000000000000000000000000000008","0x0000000000000000000000000000000000000000000000000000000000000009","0x000000000000000000000000000000000000000000000000000000000000000a","0x000000000000000000000000000000000000000000000000000000000000000b","0x000000000000000000000000000000000000000000000000000000000000000c","0x000000000000000000000000000000000000000000000000000000000000000d","0x000000000000000000000000000000000000000000000000000000000000000e","0x000000000000000000000000000000000000000000000000000000000000000f","0x0000000000000000000000000000000000000000000000000000000000000010","0x0000000000000000000000000000000000000000000000000000000000000011","0x0000000000000000000000000000000000000000000000000000000000000012","0x0000000000000000000000000000000000000000000000000000000000000013","0x0000000000000000000000000000000000000000000000000000000000000014","0x0000000000000000000000000000000000000000000000000000000000000015","0x0000000000000000000000000000000000000000000000000000000000000016","0x0000000000000000000000000000000000000000000000000000000000000017","0x0000000000000000000000000000000000000000000000000000000000000018","0x0000000000000000000000000000000000000000000000000000000000000019","0x000000000000000000000000000000000000000000000000000000000000001a","0x000000000000000000000000000000000000000000000000000000000000001b","0x000000000000000000000000000000000000000000000000000000000000001c","0x000000000000000000000000000000000000000000000000000000000000001d","0x000000000000000000000000000000000000000000000000000000000000001e","0x000000000000000000000000000000000000000000000000000000000000001f"]}}}},"global_index":{"mainnet_flag":false,"rollup_index":1,"leaf_index":2}}],"metadata":"0x0000000000000000000000000000000000000000000000000000000000000def","signature":{"r":"0x0000000000000000000000000000000000000000000000000000000000000111","s":"0x0000000000000000000000000000000000000000000000000000000000000222","odd_y_parity":true}}` + + data, err := json.Marshal(cert) + require.NoError(t, err) + require.Equal(t, expectedJSON, string(data)) + + require.Equal(t, "0xda355a601420351a0c950ebb34b6278580978d7b6a215338531d543a8f03574a", cert.Hash().String()) + require.Equal(t, "0x2f01782930cbf2bc2ab4ec16759a2288ad7df865dea387aadf55f96136269cf4", cert.BridgeExits[0].Hash().String()) + require.Equal(t, "0xac83b106ad2ca491828d49613c8356a15e3de298c794e1abd9632dc4d03b7c79", cert.ImportedBridgeExits[0].Hash().String()) + require.Equal(t, "0x6d9dc59396058ef7845fd872a87e77f1a58d010a760957f8814bd3d2ca5914a1", cert.ImportedBridgeExits[1].Hash().String()) + }) +} + +func TestSignedCertificate_Copy(t *testing.T) { + t.Parallel() + + t.Run("copy with non-nil fields", func(t *testing.T) { + t.Parallel() + + original := &SignedCertificate{ + Certificate: &Certificate{ + NetworkID: 1, + Height: 100, + PrevLocalExitRoot: [32]byte{0x01}, + NewLocalExitRoot: [32]byte{0x02}, + BridgeExits: []*BridgeExit{ + { + LeafType: LeafTypeAsset, + TokenInfo: &TokenInfo{OriginNetwork: 1, OriginTokenAddress: common.HexToAddress("0x123")}, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(1000), + Metadata: []byte{0x01, 0x02}, + }, + }, + ImportedBridgeExits: []*ImportedBridgeExit{ + { + BridgeExit: &BridgeExit{ + LeafType: LeafTypeMessage, + TokenInfo: &TokenInfo{OriginNetwork: 1, OriginTokenAddress: common.HexToAddress("0x789")}, + DestinationNetwork: 3, + DestinationAddress: common.HexToAddress("0xabc"), + Amount: big.NewInt(2000), + Metadata: []byte{0x03, 0x04}, + }, + ClaimData: &ClaimFromMainnnet{}, + GlobalIndex: &GlobalIndex{MainnetFlag: true, RollupIndex: 1, LeafIndex: 2}, + }, + }, + Metadata: common.HexToHash("0xdef"), + }, + Signature: &Signature{ + R: common.HexToHash("0x111"), + S: common.HexToHash("0x222"), + OddParity: true, + }, + } + + certificateCopy := original.CopyWithDefaulting() + + require.NotNil(t, certificateCopy) + require.NotSame(t, original, certificateCopy) + require.NotSame(t, original.Certificate, certificateCopy.Certificate) + require.Same(t, original.Signature, certificateCopy.Signature) + require.Equal(t, original, certificateCopy) + }) + + t.Run("copy with nil BridgeExits, ImportedBridgeExits and Signature", func(t *testing.T) { + t.Parallel() + + original := &SignedCertificate{ + Certificate: &Certificate{ + NetworkID: 1, + Height: 100, + PrevLocalExitRoot: [32]byte{0x01}, + NewLocalExitRoot: [32]byte{0x02}, + BridgeExits: nil, + ImportedBridgeExits: nil, + Metadata: common.HexToHash("0xdef"), + }, + Signature: nil, + } + + certificateCopy := original.CopyWithDefaulting() + + require.NotNil(t, certificateCopy) + require.NotSame(t, original, certificateCopy) + require.NotSame(t, original.Certificate, certificateCopy.Certificate) + require.NotNil(t, certificateCopy.Signature) + require.Equal(t, original.NetworkID, certificateCopy.NetworkID) + require.Equal(t, original.Height, certificateCopy.Height) + require.Equal(t, original.PrevLocalExitRoot, certificateCopy.PrevLocalExitRoot) + require.Equal(t, original.NewLocalExitRoot, certificateCopy.NewLocalExitRoot) + require.Equal(t, original.Metadata, certificateCopy.Metadata) + require.NotNil(t, certificateCopy.BridgeExits) + require.NotNil(t, certificateCopy.ImportedBridgeExits) + require.Empty(t, certificateCopy.BridgeExits) + require.Empty(t, certificateCopy.ImportedBridgeExits) + }) +} + +func TestGlobalIndex_UnmarshalFromMap(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + data map[string]interface{} + want *GlobalIndex + wantErr bool + }{ + { + name: "valid data", + data: map[string]interface{}{ + "rollup_index": uint32(0), + "leaf_index": uint32(2), + "mainnet_flag": true, + }, + want: &GlobalIndex{ + RollupIndex: 0, + LeafIndex: 2, + MainnetFlag: true, + }, + wantErr: false, + }, + { + name: "missing rollup_index", + data: map[string]interface{}{ + "leaf_index": uint32(2), + "mainnet_flag": true, + }, + want: &GlobalIndex{}, + wantErr: true, + }, + { + name: "invalid rollup_index type", + data: map[string]interface{}{ + "rollup_index": "invalid", + "leaf_index": uint32(2), + "mainnet_flag": true, + }, + want: &GlobalIndex{}, + wantErr: true, + }, + { + name: "missing leaf_index", + data: map[string]interface{}{ + "rollup_index": uint32(1), + "mainnet_flag": true, + }, + want: &GlobalIndex{}, + wantErr: true, + }, + { + name: "invalid leaf_index type", + data: map[string]interface{}{ + "rollup_index": uint32(1), + "leaf_index": "invalid", + "mainnet_flag": true, + }, + want: &GlobalIndex{}, + wantErr: true, + }, + { + name: "missing mainnet_flag", + data: map[string]interface{}{ + "rollup_index": uint32(1), + "leaf_index": uint32(2), + }, + want: &GlobalIndex{}, + wantErr: true, + }, + { + name: "invalid mainnet_flag type", + data: map[string]interface{}{ + "rollup_index": uint32(1), + "leaf_index": uint32(2), + "mainnet_flag": "invalid", + }, + want: &GlobalIndex{}, + wantErr: true, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + g := &GlobalIndex{} + err := g.UnmarshalFromMap(tt.data) + if tt.wantErr { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.want, g) + } + }) + } +} + +func TestUnmarshalCertificateHeader_UnknownError(t *testing.T) { + t.Parallel() + + rawCertificateHeader := `{ + "network_id": 14, + "height": 0, + "epoch_number": null, + "certificate_index": null, + "certificate_id": "0x3af88c9ca106822bd141fdc680dcb888f4e9d4997fad1645ba3d5d747059eb32", + "new_local_exit_root": "0x625e889ced3c31277c6653229096374d396a2fd3564a8894aaad2ff935d2fc8c", + "metadata": "0x0000000000000000000000000000000000000000000000000000000000002f3d", + "status": { + "InError": { + "error": { + "ProofVerificationFailed": { + "Plonk": "the verifying key does not match the inner plonk bn254 proof's committed verifying key" + } + } + } + } + }` + + var result *CertificateHeader + err := json.Unmarshal([]byte(rawCertificateHeader), &result) + require.NoError(t, err) + require.NotNil(t, result) + + expectedErr := &GenericError{ + Key: "ProofVerificationFailed", + Value: "{\"Plonk\":\"the verifying key does not match the inner plonk bn254 proof's committed verifying key\"}", + } + + require.Equal(t, expectedErr, result.Error) +} + +func TestConvertNumeric(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + value float64 + target reflect.Type + expected interface{} + expectedErr error + }{ + // Integer conversions + {"FloatToInt", 42.5, reflect.TypeOf(int(0)), int(42), nil}, + {"FloatToInt8", 127.5, reflect.TypeOf(int8(0)), int8(127), nil}, + {"FloatToInt16", 32767.5, reflect.TypeOf(int16(0)), int16(32767), nil}, + {"FloatToInt32", 2147483647.5, reflect.TypeOf(int32(0)), int32(2147483647), nil}, + {"FloatToInt64", -10000000000000000.9, reflect.TypeOf(int64(0)), int64(-10000000000000000), nil}, + + // Unsigned integer conversions + {"FloatToUint", 42.5, reflect.TypeOf(uint(0)), uint(42), nil}, + {"FloatToUint8", 255.5, reflect.TypeOf(uint8(0)), uint8(255), nil}, + {"FloatToUint16", 65535.5, reflect.TypeOf(uint16(0)), uint16(65535), nil}, + {"FloatToUint32", 4294967295.5, reflect.TypeOf(uint32(0)), uint32(4294967295), nil}, + {"FloatToUint64", 10000000000000000.9, reflect.TypeOf(uint64(0)), uint64(10000000000000000), nil}, + + // Float conversions + {"FloatToFloat32", 3.14, reflect.TypeOf(float32(0)), float32(3.14), nil}, + {"FloatToFloat64", 3.14, reflect.TypeOf(float64(0)), float64(3.14), nil}, + + // Unsupported type + {"UnsupportedType", 3.14, reflect.TypeOf("string"), nil, errors.New("unsupported target type string")}, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + result, err := convertNumeric(tt.value, tt.target) + if tt.expectedErr != nil { + require.ErrorContains(t, err, tt.expectedErr.Error()) + } else { + require.NoError(t, err) + } + require.Equal(t, tt.expected, result) + }) + } +} + +func TestCertificate_Hash(t *testing.T) { + t.Parallel() + + // Test inputs + prevLocalExitRoot := [common.HashLength]byte{} + newLocalExitRoot := [common.HashLength]byte{} + copy(prevLocalExitRoot[:], bytes.Repeat([]byte{0x01}, common.HashLength)) + copy(newLocalExitRoot[:], bytes.Repeat([]byte{0x02}, common.HashLength)) + + // Create dummy BridgeExits + bridgeExits := []*BridgeExit{ + { + LeafType: LeafTypeAsset, + TokenInfo: createDummyTokenInfo(t), + DestinationNetwork: 1, + DestinationAddress: common.HexToAddress("0x0000000000000000000000000000000000000001"), + Amount: big.NewInt(100), + Metadata: []byte("metadata1"), + }, + { + LeafType: LeafTypeMessage, + TokenInfo: createDummyTokenInfo(t), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x0000000000000000000000000000000000000002"), + Amount: big.NewInt(200), + Metadata: []byte("metadata2"), + }, + } + + // Create dummy ImportedBridgeExits + importedBridgeExits := []*ImportedBridgeExit{ + { + BridgeExit: &BridgeExit{ + LeafType: LeafTypeAsset, + TokenInfo: createDummyTokenInfo(t), + DestinationNetwork: 3, + DestinationAddress: common.HexToAddress("0x0000000000000000000000000000000000000003"), + Amount: big.NewInt(300), + Metadata: []byte("metadata3"), + }, + ClaimData: createDummyClaim(t), + GlobalIndex: createDummyGlobalIndex(t), + }, + { + BridgeExit: &BridgeExit{ + LeafType: LeafTypeAsset, + TokenInfo: createDummyTokenInfo(t), + DestinationNetwork: 4, + DestinationAddress: common.HexToAddress("0x0000000000000000000000000000000000000004"), + Amount: big.NewInt(400), + Metadata: []byte("metadata4"), + }, + ClaimData: createDummyClaim(t), + GlobalIndex: createDummyGlobalIndex(t), + }, + } + + metadata := common.HexToHash("0x123456789abcdef123456789abcdef123456789abcdef123456789abcdef1234") + + // Create the certificate + certificate := &Certificate{ + NetworkID: 1, + Height: 100, + PrevLocalExitRoot: prevLocalExitRoot, + NewLocalExitRoot: newLocalExitRoot, + BridgeExits: bridgeExits, + ImportedBridgeExits: importedBridgeExits, + Metadata: metadata, + } + + // Manually calculate the expected hash + bridgeExitsHashes := [][]byte{ + bridgeExits[0].Hash().Bytes(), + bridgeExits[1].Hash().Bytes(), + } + importedBridgeExitsHashes := [][]byte{ + importedBridgeExits[0].Hash().Bytes(), + importedBridgeExits[1].Hash().Bytes(), + } + + bridgeExitsPart := crypto.Keccak256(bridgeExitsHashes...) + importedBridgeExitsPart := crypto.Keccak256(importedBridgeExitsHashes...) + + expectedHash := crypto.Keccak256Hash( + aggkitcommon.Uint32ToBytes(1), + aggkitcommon.Uint64ToBytes(100), + prevLocalExitRoot[:], + newLocalExitRoot[:], + bridgeExitsPart, + importedBridgeExitsPart, + ) + + // Test the certificate hash + calculatedHash := certificate.Hash() + + require.Equal(t, calculatedHash, expectedHash) +} + +func TestCertificate_HashToSign(t *testing.T) { + t.Parallel() + + c := &Certificate{ + NewLocalExitRoot: common.HexToHash("0xabcd"), + ImportedBridgeExits: []*ImportedBridgeExit{ + { + GlobalIndex: &GlobalIndex{ + MainnetFlag: true, + RollupIndex: 23, + LeafIndex: 1, + }, + }, + { + GlobalIndex: &GlobalIndex{ + MainnetFlag: false, + RollupIndex: 15, + LeafIndex: 2, + }, + }, + }, + } + + globalIndexHashes := make([][]byte, len(c.ImportedBridgeExits)) + for i, importedBridgeExit := range c.ImportedBridgeExits { + globalIndexHashes[i] = importedBridgeExit.GlobalIndex.Hash().Bytes() + } + + expectedHash := crypto.Keccak256Hash( + c.NewLocalExitRoot[:], + crypto.Keccak256Hash(globalIndexHashes...).Bytes(), + ) + + certHash := c.HashToSign() + require.Equal(t, expectedHash, certHash) +} + +func TestClaimFromMainnnet_MarshalJSON(t *testing.T) { + t.Parallel() + + // Test data + merkleProof := &MerkleProof{ + Root: common.HexToHash("0x1"), + Proof: [types.DefaultHeight]common.Hash{ + common.HexToHash("0x2"), + common.HexToHash("0x3"), + }, + } + + l1InfoTreeLeaf := &L1InfoTreeLeaf{ + L1InfoTreeIndex: 42, + RollupExitRoot: [common.HashLength]byte{0xaa, 0xbb, 0xcc}, + MainnetExitRoot: [common.HashLength]byte{0xdd, 0xee, 0xff}, + Inner: &L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x1"), + BlockHash: common.HexToHash("0x2"), + Timestamp: 1672531200, // Example timestamp + }, + } + + claim := &ClaimFromMainnnet{ + ProofLeafMER: merkleProof, + ProofGERToL1Root: merkleProof, + L1Leaf: l1InfoTreeLeaf, + } + + // Marshal the ClaimFromMainnnet struct to JSON + expectedJSON, err := claim.MarshalJSON() + require.NoError(t, err) + + var actualClaim ClaimFromMainnnet + err = json.Unmarshal(expectedJSON, &actualClaim) + require.NoError(t, err) +} + +func TestBridgeExit_String(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + bridgeExit *BridgeExit + expectedOutput string + }{ + { + name: "With TokenInfo", + bridgeExit: &BridgeExit{ + LeafType: LeafTypeAsset, + TokenInfo: createDummyTokenInfo(t), + DestinationNetwork: 100, + DestinationAddress: common.HexToAddress("0x2"), + Amount: big.NewInt(1000), + Metadata: []byte{0x01, 0x02, 0x03}, + }, + expectedOutput: "LeafType: Transfer, DestinationNetwork: 100, DestinationAddress: 0x0000000000000000000000000000000000000002, Amount: 1000, Metadata: 010203, TokenInfo: OriginNetwork: 1, OriginTokenAddress: 0x0000000000000000000000000000000000002345", + }, + { + name: "Without TokenInfo", + bridgeExit: &BridgeExit{ + LeafType: LeafTypeMessage, + DestinationNetwork: 200, + DestinationAddress: common.HexToAddress("0x1"), + Amount: big.NewInt(5000), + Metadata: []byte{0xff, 0xee, 0xdd}, + }, + expectedOutput: "LeafType: Message, DestinationNetwork: 200, DestinationAddress: 0x0000000000000000000000000000000000000001, Amount: 5000, Metadata: ffeedd, TokenInfo: nil", + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + actualOutput := tt.bridgeExit.String() + require.Equal(t, tt.expectedOutput, actualOutput) + }) + } +} + +func TestCertificateStatus_UnmarshalJSON(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + input string + expected CertificateStatus + expectError bool + }{ + { + name: "Valid status - Pending", + input: `"Pending"`, + expected: Pending, + expectError: false, + }, + { + name: "Valid status - Proven", + input: `"Proven"`, + expected: Proven, + expectError: false, + }, + { + name: "Valid status - Candidate", + input: `"Candidate"`, + expected: Candidate, + expectError: false, + }, + { + name: "Valid status - InError", + input: `"InError"`, + expected: InError, + expectError: false, + }, + { + name: "Valid status - Settled", + input: `"Settled"`, + expected: Settled, + expectError: false, + }, + { + name: "Invalid status", + input: `"InvalidStatus"`, + expected: 0, // Unchanged (default value of CertificateStatus) + expectError: true, + }, + { + name: "Contains 'InError' string", + input: `"SomeStringWithInError"`, + expected: InError, + expectError: false, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + var status CertificateStatus + err := json.Unmarshal([]byte(tt.input), &status) + + if tt.expectError { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expected, status) + } + }) + } +} + +func TestMerkleProof_String(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + proof MerkleProof + expected string + }{ + { + name: "Empty Root and Empty Proof", + proof: MerkleProof{ + Root: common.Hash{}, + Proof: [types.DefaultHeight]common.Hash{}, + }, + expected: fmt.Sprintf("Root: %s, Proof: %v", common.Hash{}.String(), [types.DefaultHeight]common.Hash{}), + }, + { + name: "Non-Empty Root and Empty Proof", + proof: MerkleProof{ + Root: common.HexToHash("0xabc123"), + Proof: [types.DefaultHeight]common.Hash{}, + }, + expected: fmt.Sprintf("Root: %s, Proof: %v", common.HexToHash("0xabc123").String(), [types.DefaultHeight]common.Hash{}), + }, + { + name: "Non-Empty Root and Partially Populated Proof", + proof: MerkleProof{ + Root: common.HexToHash("0xabc123"), + Proof: [types.DefaultHeight]common.Hash{ + common.HexToHash("0xdef456"), + common.HexToHash("0x123789"), + }, + }, + expected: fmt.Sprintf("Root: %s, Proof: %v", + common.HexToHash("0xabc123").String(), + [types.DefaultHeight]common.Hash{ + common.HexToHash("0xdef456"), + common.HexToHash("0x123789"), + }), + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + result := tt.proof.String() + require.Equal(t, tt.expected, result) + }) + } +} + +func TestGlobalIndexString(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + input GlobalIndex + expected string + }{ + { + name: "All fields zero", + input: GlobalIndex{ + MainnetFlag: false, + RollupIndex: 0, + LeafIndex: 0, + }, + expected: "MainnetFlag: false, RollupIndex: 0, LeafIndex: 0", + }, + { + name: "MainnetFlag true, non-zero indices", + input: GlobalIndex{ + MainnetFlag: true, + RollupIndex: 123, + LeafIndex: 456, + }, + expected: "MainnetFlag: true, RollupIndex: 123, LeafIndex: 456", + }, + { + name: "MainnetFlag false, large indices", + input: GlobalIndex{ + MainnetFlag: false, + RollupIndex: 4294967295, // Maximum value of uint32 + LeafIndex: 2147483647, // Large but within uint32 range + }, + expected: "MainnetFlag: false, RollupIndex: 4294967295, LeafIndex: 2147483647", + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + result := tt.input.String() + require.Equal(t, tt.expected, result) + }) + } +} + +func TestL1InfoTreeLeafString(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + input L1InfoTreeLeaf + expected string + }{ + { + name: "With valid Inner", + input: L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + RollupExitRoot: common.HexToHash("0x01"), + MainnetExitRoot: common.HexToHash("0x02"), + Inner: &L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x03"), + BlockHash: common.HexToHash("0x04"), + Timestamp: 1234567890, + }, + }, + expected: "L1InfoTreeIndex: 1, RollupExitRoot: 0x0000000000000000000000000000000000000000000000000000000000000001, " + + "MainnetExitRoot: 0x0000000000000000000000000000000000000000000000000000000000000002, " + + "Inner: GlobalExitRoot: 0x0000000000000000000000000000000000000000000000000000000000000003, " + + "BlockHash: 0x0000000000000000000000000000000000000000000000000000000000000004, Timestamp: 1234567890", + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + result := tt.input.String() + require.Equal(t, tt.expected, result) + }) + } +} + +func TestClaimType(t *testing.T) { + t.Parallel() + + cases := []struct { + name string + claim Claim + expectedType string + }{ + { + name: "Mainnet claim", + claim: &ClaimFromMainnnet{}, + expectedType: "Mainnet", + }, + { + name: "Rollup claim", + claim: &ClaimFromRollup{}, + expectedType: "Rollup", + }, + } + + for _, c := range cases { + c := c + + t.Run(c.name, func(t *testing.T) { + t.Parallel() + + actualType := c.claim.Type() + require.Equal(t, c.expectedType, actualType) + }) + } +} + +func Test_ProblematicBridgeExitHash(t *testing.T) { + bridgeExit := &BridgeExit{ + LeafType: LeafTypeAsset, + TokenInfo: &TokenInfo{ + OriginNetwork: 0, + OriginTokenAddress: common.HexToAddress("0x0000000000000000000000000000000000000000"), + }, + DestinationNetwork: 1, + DestinationAddress: common.HexToAddress("0xc949254d682d8c9ad5682521675b8f43b102aec4"), + Amount: new(big.Int).SetUint64(10000000000000000000), + IsMetadataHashed: false, + } + + require.Equal(t, "0x22ed288677b4c2afd83a6d7d55f7df7f4eaaf60f7310210c030fd27adacbc5e0", bridgeExit.Hash().Hex()) +} + +func Test_UnmarshalCertificate(t *testing.T) { + var cert SignedCertificate + err := json.Unmarshal([]byte(fullCertificateJSON), &cert) + require.NoError(t, err) + marshalData, err := json.Marshal(cert) + require.NoError(t, err) + require.JSONEq(t, fullCertificateJSON, string(marshalData)) +} + +func Test_UnmarshalImportedBridgeExit(t *testing.T) { + cases := []struct { + name string + importedBridge ImportedBridgeExit + }{ + { + name: "Empty", + importedBridge: ImportedBridgeExit{}, + }, + { + name: "Empty/BridgeExit", + importedBridge: ImportedBridgeExit{ + BridgeExit: &BridgeExit{}, + }, + }, + { + name: "Empty/GlobalIndex", + importedBridge: ImportedBridgeExit{ + GlobalIndex: &GlobalIndex{}, + }, + }, + { + name: "Empty/ClaimFromRollup", + importedBridge: ImportedBridgeExit{ + GlobalIndex: &GlobalIndex{}, + ClaimData: &ClaimFromRollup{}, + }, + }, + { + name: "Empty/ClaimFromMainnnet", + importedBridge: ImportedBridgeExit{ + ClaimData: &ClaimFromMainnnet{ + ProofLeafMER: &MerkleProof{ + Root: common.HexToHash("0x1"), + Proof: [types.DefaultHeight]common.Hash{common.HexToHash("0x2"), common.HexToHash("0x3")}, + }, + ProofGERToL1Root: &MerkleProof{}, + L1Leaf: &L1InfoTreeLeaf{}, + }, + }, + }, + + { + name: "Mainnet claim", + importedBridge: ImportedBridgeExit{ + BridgeExit: &BridgeExit{ + LeafType: LeafTypeAsset, + TokenInfo: &TokenInfo{ + OriginNetwork: 0, + OriginTokenAddress: common.HexToAddress("0x1234"), + }, + DestinationNetwork: 1, + DestinationAddress: common.HexToAddress("0x1234"), + Amount: big.NewInt(1000), + IsMetadataHashed: false, + Metadata: []byte{0x01, 0x02, 0x03}, + }, + ClaimData: &ClaimFromMainnnet{}, + GlobalIndex: &GlobalIndex{ + MainnetFlag: true, + RollupIndex: 1, + LeafIndex: 2, + }, + }, + }, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + ser, err := json.Marshal(tt.importedBridge) + require.NoError(t, err) + unmarshallBridge := &ImportedBridgeExit{} + err = json.Unmarshal(ser, unmarshallBridge) + require.NoError(t, err) + require.Equal(t, tt.importedBridge, *unmarshallBridge) + }) + } +} + +func Test_UnmarshalMerkleProof(t *testing.T) { + mp := &MerkleProof{ + Root: common.HexToHash("0x1"), + Proof: [types.DefaultHeight]common.Hash{common.HexToHash("0x2"), common.HexToHash("0x3")}, + } + ser, err := json.Marshal(mp) + require.NoError(t, err) + unmarshallMp := &MerkleProof{} + err = json.Unmarshal(ser, unmarshallMp) + require.NoError(t, err) + require.Equal(t, mp, unmarshallMp) +} + +func Test_UnmarshalL1InfoTreeLeaf(t *testing.T) { + data := L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + RollupExitRoot: [common.HashLength]byte{0xaa, 0xbb, 0xcc}, + MainnetExitRoot: [common.HashLength]byte{0xdd, 0xee, 0xff}, + Inner: &L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x1"), + BlockHash: common.HexToHash("0x2"), + Timestamp: 1672531200, // Example timestamp + }, + } + ser, err := json.Marshal(data) + require.NoError(t, err) + unmarshalled := &L1InfoTreeLeaf{} + err = json.Unmarshal(ser, unmarshalled) + require.NoError(t, err) + require.Equal(t, data, *unmarshalled) +} + +func Test_UnmarshalBridgeExit(t *testing.T) { + cases := []struct { + name string + data *BridgeExit + }{ + { + name: "metadataHashed", + data: &BridgeExit{ + LeafType: LeafTypeAsset, + IsMetadataHashed: true, + Metadata: []byte{0x01, 0x02, 0x03}, + }, + }, + { + name: "metadata no hashed", + data: &BridgeExit{ + LeafType: LeafTypeAsset, + IsMetadataHashed: false, + Metadata: []byte{0x01, 0x02, 0x03}, + }, + }, + } + + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + ser, err := json.Marshal(tt.data) + require.NoError(t, err) + unmarshalled := &BridgeExit{} + err = json.Unmarshal(ser, unmarshalled) + require.NoError(t, err) + require.Equal(t, tt.data, unmarshalled) + }) + } +} + +func Test_UnmarshalClaimFromMainnnet(t *testing.T) { + claim := &ClaimFromMainnnet{ + ProofLeafMER: &MerkleProof{ + Root: common.HexToHash("0x1"), + Proof: [types.DefaultHeight]common.Hash{common.HexToHash("0x2"), common.HexToHash("0x3")}, + }, + ProofGERToL1Root: &MerkleProof{}, + L1Leaf: &L1InfoTreeLeaf{}, + } + ser, err := json.Marshal(claim) + require.NoError(t, err) + unmarshalled := &ClaimFromMainnnet{} + err = json.Unmarshal(ser, unmarshalled) + require.NoError(t, err) + require.Equal(t, claim, unmarshalled) +} + +func Test_UnmarshalClaimFromRollup(t *testing.T) { + claim := &ClaimFromRollup{ + ProofLeafLER: &MerkleProof{ + Root: common.HexToHash("0x1"), + Proof: [types.DefaultHeight]common.Hash{common.HexToHash("0x2"), common.HexToHash("0x3")}, + }, + ProofLERToRER: &MerkleProof{ + Root: common.HexToHash("0x4"), + }, + ProofGERToL1Root: &MerkleProof{ + Root: common.HexToHash("0x5"), + }, + + L1Leaf: &L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + }, + } + ser, err := json.Marshal(claim) + require.NoError(t, err) + unmarshalled := &ClaimFromRollup{} + err = json.Unmarshal(ser, unmarshalled) + require.NoError(t, err) + require.Equal(t, claim, unmarshalled) +} diff --git a/aggoracle/chaingersender/evm.go b/aggoracle/chaingersender/evm.go new file mode 100644 index 00000000..fd3100c0 --- /dev/null +++ b/aggoracle/chaingersender/evm.go @@ -0,0 +1,155 @@ +package chaingersender + +import ( + "context" + "fmt" + "math/big" + "time" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/globalexitrootmanagerl2sovereignchain" + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + ethtxtypes "github.com/0xPolygon/zkevm-ethtx-manager/types" + aggkitcommon "github.com/agglayer/aggkit/common" + cfgtypes "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +const insertGERFuncName = "insertGlobalExitRoot" + +type EthClienter interface { + ethereum.LogFilterer + ethereum.BlockNumberReader + ethereum.ChainReader + bind.ContractBackend +} + +type EthTxManager interface { + Remove(ctx context.Context, id common.Hash) error + ResultsByStatus(ctx context.Context, + statuses []ethtxtypes.MonitoredTxStatus, + ) ([]ethtxtypes.MonitoredTxResult, error) + Result(ctx context.Context, id common.Hash) (ethtxtypes.MonitoredTxResult, error) + Add(ctx context.Context, + to *common.Address, + value *big.Int, + data []byte, + gasOffset uint64, + sidecar *types.BlobTxSidecar, + ) (common.Hash, error) +} + +type L2GERManager interface { + GlobalExitRootMap(opts *bind.CallOpts, ger [common.HashLength]byte) (*big.Int, error) +} + +type EVMConfig struct { + GlobalExitRootL2Addr common.Address `mapstructure:"GlobalExitRootL2"` + URLRPCL2 string `mapstructure:"URLRPCL2"` + ChainIDL2 uint64 `mapstructure:"ChainIDL2"` + GasOffset uint64 `mapstructure:"GasOffset"` + WaitPeriodMonitorTx cfgtypes.Duration `mapstructure:"WaitPeriodMonitorTx"` + EthTxManager ethtxmanager.Config `mapstructure:"EthTxManager"` +} + +type EVMChainGERSender struct { + logger *log.Logger + + l2GERManager L2GERManager + l2GERManagerAddr common.Address + l2GERManagerAbi *abi.ABI + + ethTxMan EthTxManager + gasOffset uint64 + waitPeriodMonitorTx time.Duration +} + +func NewEVMChainGERSender( + logger *log.Logger, + l2GERManagerAddr common.Address, + l2Client EthClienter, + ethTxMan EthTxManager, + gasOffset uint64, + waitPeriodMonitorTx time.Duration, +) (*EVMChainGERSender, error) { + l2GERManager, err := globalexitrootmanagerl2sovereignchain.NewGlobalexitrootmanagerl2sovereignchain( + l2GERManagerAddr, l2Client) + if err != nil { + return nil, err + } + + l2GERAbi, err := globalexitrootmanagerl2sovereignchain.Globalexitrootmanagerl2sovereignchainMetaData.GetAbi() + if err != nil { + return nil, err + } + + return &EVMChainGERSender{ + logger: logger, + l2GERManager: l2GERManager, + l2GERManagerAddr: l2GERManagerAddr, + l2GERManagerAbi: l2GERAbi, + ethTxMan: ethTxMan, + gasOffset: gasOffset, + waitPeriodMonitorTx: waitPeriodMonitorTx, + }, nil +} + +func (c *EVMChainGERSender) IsGERInjected(ger common.Hash) (bool, error) { + blockHashBigInt, err := c.l2GERManager.GlobalExitRootMap(&bind.CallOpts{Pending: false}, ger) + if err != nil { + return false, fmt.Errorf("failed to check if global exit root is injected %s: %w", ger, err) + } + + return common.BigToHash(blockHashBigInt) != aggkitcommon.ZeroHash, nil +} + +func (c *EVMChainGERSender) InjectGER(ctx context.Context, ger common.Hash) error { + ticker := time.NewTicker(c.waitPeriodMonitorTx) + defer ticker.Stop() + + updateGERTxInput, err := c.l2GERManagerAbi.Pack(insertGERFuncName, ger) + if err != nil { + return err + } + + id, err := c.ethTxMan.Add(ctx, &c.l2GERManagerAddr, common.Big0, updateGERTxInput, c.gasOffset, nil) + if err != nil { + return err + } + + for { + select { + case <-ctx.Done(): + c.logger.Infof("context cancelled") + return nil + + case <-ticker.C: + c.logger.Debugf("waiting for tx %s to be mined", id.Hex()) + res, err := c.ethTxMan.Result(ctx, id) + if err != nil { + c.logger.Errorf("failed to check the transaction %s status: %s", id.Hex(), err) + return err + } + + switch res.Status { + case ethtxtypes.MonitoredTxStatusCreated, + ethtxtypes.MonitoredTxStatusSent: + continue + case ethtxtypes.MonitoredTxStatusFailed: + return fmt.Errorf("inject GER tx %s failed", id.Hex()) + case ethtxtypes.MonitoredTxStatusMined, + ethtxtypes.MonitoredTxStatusSafe, + ethtxtypes.MonitoredTxStatusFinalized: + c.logger.Debugf("inject GER tx %s was successfully mined at block %d", id.Hex(), res.MinedAtBlockNumber) + + return nil + default: + c.logger.Error("unexpected tx status:", res.Status) + } + } + } +} diff --git a/aggoracle/chaingersender/evm_test.go b/aggoracle/chaingersender/evm_test.go new file mode 100644 index 00000000..8999c138 --- /dev/null +++ b/aggoracle/chaingersender/evm_test.go @@ -0,0 +1,169 @@ +package chaingersender + +import ( + "context" + "errors" + "math/big" + "strings" + "testing" + "time" + + "github.com/0xPolygon/zkevm-ethtx-manager/types" + "github.com/agglayer/aggkit/aggoracle/mocks" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestEVMChainGERSender_InjectGER(t *testing.T) { + insertGERFuncABI := `[{ + "inputs": [ + { + "internalType": "bytes32", + "name": "_newRoot", + "type": "bytes32" + } + ], + "name": "insertGlobalExitRoot", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }]` + l2GERManagerAddr := common.HexToAddress("0x123") + l2GERManagerAbi, err := abi.JSON(strings.NewReader(insertGERFuncABI)) + require.NoError(t, err) + + ger := common.HexToHash("0x456") + txID := common.HexToHash("0x789") + + tests := []struct { + name string + addReturnTxID common.Hash + addReturnErr error + resultReturn types.MonitoredTxResult + resultReturnErr error + expectedErr string + }{ + { + name: "successful injection", + addReturnTxID: txID, + addReturnErr: nil, + resultReturn: types.MonitoredTxResult{Status: types.MonitoredTxStatusMined, MinedAtBlockNumber: big.NewInt(123)}, + resultReturnErr: nil, + expectedErr: "", + }, + { + name: "injection fails due to transaction failure", + addReturnTxID: txID, + addReturnErr: nil, + resultReturn: types.MonitoredTxResult{Status: types.MonitoredTxStatusFailed}, + resultReturnErr: nil, + expectedErr: "inject GER tx", + }, + { + name: "injection fails due to Add method error", + addReturnTxID: common.Hash{}, + addReturnErr: errors.New("add error"), + resultReturn: types.MonitoredTxResult{}, + resultReturnErr: nil, + expectedErr: "add error", + }, + { + name: "injection fails due to Result method error", + addReturnTxID: txID, + addReturnErr: nil, + resultReturn: types.MonitoredTxResult{}, + resultReturnErr: errors.New("result error"), + expectedErr: "result error", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx, cancelFn := context.WithTimeout(context.Background(), time.Millisecond*500) + defer cancelFn() + + ethTxMan := new(mocks.EthTxManagerMock) + ethTxMan. + On("Add", ctx, &l2GERManagerAddr, common.Big0, mock.Anything, mock.Anything, mock.Anything). + Return(tt.addReturnTxID, tt.addReturnErr) + ethTxMan. + On("Result", ctx, tt.addReturnTxID). + Return(tt.resultReturn, tt.resultReturnErr) + + sender := &EVMChainGERSender{ + logger: log.GetDefaultLogger(), + l2GERManagerAddr: l2GERManagerAddr, + l2GERManagerAbi: &l2GERManagerAbi, + ethTxMan: ethTxMan, + waitPeriodMonitorTx: time.Millisecond * 10, + } + + err := sender.InjectGER(ctx, ger) + if tt.expectedErr == "" { + require.NoError(t, err) + } else { + require.Error(t, err) + require.Contains(t, err.Error(), tt.expectedErr) + } + }) + } +} + +func TestEVMChainGERSender_IsGERInjected(t *testing.T) { + tests := []struct { + name string + mockReturn *big.Int + mockError error + expectedResult bool + expectedErrMsg string + }{ + { + name: "GER is injected", + mockReturn: big.NewInt(1), + mockError: nil, + expectedResult: true, + expectedErrMsg: "", + }, + { + name: "GER is not injected", + mockReturn: big.NewInt(0), + mockError: nil, + expectedResult: false, + expectedErrMsg: "", + }, + { + name: "Error checking GER injection", + mockReturn: nil, + mockError: errors.New("some error"), + expectedResult: false, + expectedErrMsg: "failed to check if global exit root is injected", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mockL2GERManager := new(mocks.L2GERManagerMock) + mockL2GERManager.On("GlobalExitRootMap", mock.Anything, mock.Anything). + Return(tt.mockReturn, tt.mockError) + + evmChainGERSender := &EVMChainGERSender{ + l2GERManager: mockL2GERManager, + } + + ger := common.HexToHash("0x12345") + result, err := evmChainGERSender.IsGERInjected(ger) + if tt.expectedErrMsg != "" { + require.ErrorContains(t, err, tt.expectedErrMsg) + } else { + require.NoError(t, err) + } + + require.Equal(t, tt.expectedResult, result) + + mockL2GERManager.AssertExpectations(t) + }) + } +} diff --git a/aggoracle/config.go b/aggoracle/config.go new file mode 100644 index 00000000..427ae368 --- /dev/null +++ b/aggoracle/config.go @@ -0,0 +1,25 @@ +package aggoracle + +import ( + "github.com/agglayer/aggkit/aggoracle/chaingersender" + "github.com/agglayer/aggkit/config/types" +) + +type TargetChainType string + +const ( + EVMChain TargetChainType = "EVM" +) + +var ( + SupportedChainTypes = []TargetChainType{EVMChain} +) + +type Config struct { + TargetChainType TargetChainType `mapstructure:"TargetChainType"` + URLRPCL1 string `mapstructure:"URLRPCL1"` + // BlockFinality indicates the status of the blocks that will be queried in order to sync + BlockFinality string `jsonschema:"enum=LatestBlock, enum=SafeBlock, enum=PendingBlock, enum=FinalizedBlock, enum=EarliestBlock" mapstructure:"BlockFinality"` //nolint:lll + WaitPeriodNextGER types.Duration `mapstructure:"WaitPeriodNextGER"` + EVMSender chaingersender.EVMConfig `mapstructure:"EVMSender"` +} diff --git a/aggoracle/e2e_test.go b/aggoracle/e2e_test.go new file mode 100644 index 00000000..22dfd1a6 --- /dev/null +++ b/aggoracle/e2e_test.go @@ -0,0 +1,33 @@ +package aggoracle_test + +import ( + "fmt" + "strconv" + "testing" + "time" + + "github.com/agglayer/aggkit/test/helpers" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestEVM(t *testing.T) { + setup := helpers.NewE2EEnvWithEVML2(t) + + for i := 0; i < 10; i++ { + _, err := setup.L1Environment.GERContract.UpdateExitRoot(setup.L1Environment.Auth, common.HexToHash(strconv.Itoa(i))) + require.NoError(t, err) + setup.L1Environment.SimBackend.Commit() + + // wait for the GER to be processed by the InfoTree syncer + time.Sleep(time.Millisecond * 100) + expectedGER, err := setup.L1Environment.GERContract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + + isInjected, err := setup.L2Environment.AggoracleSender.IsGERInjected(expectedGER) + require.NoError(t, err) + + require.True(t, isInjected, fmt.Sprintf("iteration %d, GER: %s", i, common.Bytes2Hex(expectedGER[:]))) + } +} diff --git a/aggoracle/mocks/mock_ethtxmanager.go b/aggoracle/mocks/mock_ethtxmanager.go new file mode 100644 index 00000000..b011f568 --- /dev/null +++ b/aggoracle/mocks/mock_ethtxmanager.go @@ -0,0 +1,270 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + context "context" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" + + zkevm_ethtx_managertypes "github.com/0xPolygon/zkevm-ethtx-manager/types" +) + +// EthTxManagerMock is an autogenerated mock type for the EthTxManager type +type EthTxManagerMock struct { + mock.Mock +} + +type EthTxManagerMock_Expecter struct { + mock *mock.Mock +} + +func (_m *EthTxManagerMock) EXPECT() *EthTxManagerMock_Expecter { + return &EthTxManagerMock_Expecter{mock: &_m.Mock} +} + +// Add provides a mock function with given fields: ctx, to, value, data, gasOffset, sidecar +func (_m *EthTxManagerMock) Add(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar) (common.Hash, error) { + ret := _m.Called(ctx, to, value, data, gasOffset, sidecar) + + if len(ret) == 0 { + panic("no return value specified for Add") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) (common.Hash, error)); ok { + return rf(ctx, to, value, data, gasOffset, sidecar) + } + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) common.Hash); ok { + r0 = rf(ctx, to, value, data, gasOffset, sidecar) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) error); ok { + r1 = rf(ctx, to, value, data, gasOffset, sidecar) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerMock_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add' +type EthTxManagerMock_Add_Call struct { + *mock.Call +} + +// Add is a helper method to define mock.On call +// - ctx context.Context +// - to *common.Address +// - value *big.Int +// - data []byte +// - gasOffset uint64 +// - sidecar *types.BlobTxSidecar +func (_e *EthTxManagerMock_Expecter) Add(ctx interface{}, to interface{}, value interface{}, data interface{}, gasOffset interface{}, sidecar interface{}) *EthTxManagerMock_Add_Call { + return &EthTxManagerMock_Add_Call{Call: _e.mock.On("Add", ctx, to, value, data, gasOffset, sidecar)} +} + +func (_c *EthTxManagerMock_Add_Call) Run(run func(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar)) *EthTxManagerMock_Add_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*common.Address), args[2].(*big.Int), args[3].([]byte), args[4].(uint64), args[5].(*types.BlobTxSidecar)) + }) + return _c +} + +func (_c *EthTxManagerMock_Add_Call) Return(_a0 common.Hash, _a1 error) *EthTxManagerMock_Add_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerMock_Add_Call) RunAndReturn(run func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) (common.Hash, error)) *EthTxManagerMock_Add_Call { + _c.Call.Return(run) + return _c +} + +// Remove provides a mock function with given fields: ctx, id +func (_m *EthTxManagerMock) Remove(ctx context.Context, id common.Hash) error { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for Remove") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) error); ok { + r0 = rf(ctx, id) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EthTxManagerMock_Remove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Remove' +type EthTxManagerMock_Remove_Call struct { + *mock.Call +} + +// Remove is a helper method to define mock.On call +// - ctx context.Context +// - id common.Hash +func (_e *EthTxManagerMock_Expecter) Remove(ctx interface{}, id interface{}) *EthTxManagerMock_Remove_Call { + return &EthTxManagerMock_Remove_Call{Call: _e.mock.On("Remove", ctx, id)} +} + +func (_c *EthTxManagerMock_Remove_Call) Run(run func(ctx context.Context, id common.Hash)) *EthTxManagerMock_Remove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthTxManagerMock_Remove_Call) Return(_a0 error) *EthTxManagerMock_Remove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthTxManagerMock_Remove_Call) RunAndReturn(run func(context.Context, common.Hash) error) *EthTxManagerMock_Remove_Call { + _c.Call.Return(run) + return _c +} + +// Result provides a mock function with given fields: ctx, id +func (_m *EthTxManagerMock) Result(ctx context.Context, id common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error) { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for Result") + } + + var r0 zkevm_ethtx_managertypes.MonitoredTxResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error)); ok { + return rf(ctx, id) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) zkevm_ethtx_managertypes.MonitoredTxResult); ok { + r0 = rf(ctx, id) + } else { + r0 = ret.Get(0).(zkevm_ethtx_managertypes.MonitoredTxResult) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerMock_Result_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Result' +type EthTxManagerMock_Result_Call struct { + *mock.Call +} + +// Result is a helper method to define mock.On call +// - ctx context.Context +// - id common.Hash +func (_e *EthTxManagerMock_Expecter) Result(ctx interface{}, id interface{}) *EthTxManagerMock_Result_Call { + return &EthTxManagerMock_Result_Call{Call: _e.mock.On("Result", ctx, id)} +} + +func (_c *EthTxManagerMock_Result_Call) Run(run func(ctx context.Context, id common.Hash)) *EthTxManagerMock_Result_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthTxManagerMock_Result_Call) Return(_a0 zkevm_ethtx_managertypes.MonitoredTxResult, _a1 error) *EthTxManagerMock_Result_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerMock_Result_Call) RunAndReturn(run func(context.Context, common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error)) *EthTxManagerMock_Result_Call { + _c.Call.Return(run) + return _c +} + +// ResultsByStatus provides a mock function with given fields: ctx, statuses +func (_m *EthTxManagerMock) ResultsByStatus(ctx context.Context, statuses []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error) { + ret := _m.Called(ctx, statuses) + + if len(ret) == 0 { + panic("no return value specified for ResultsByStatus") + } + + var r0 []zkevm_ethtx_managertypes.MonitoredTxResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error)); ok { + return rf(ctx, statuses) + } + if rf, ok := ret.Get(0).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) []zkevm_ethtx_managertypes.MonitoredTxResult); ok { + r0 = rf(ctx, statuses) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]zkevm_ethtx_managertypes.MonitoredTxResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) error); ok { + r1 = rf(ctx, statuses) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerMock_ResultsByStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ResultsByStatus' +type EthTxManagerMock_ResultsByStatus_Call struct { + *mock.Call +} + +// ResultsByStatus is a helper method to define mock.On call +// - ctx context.Context +// - statuses []zkevm_ethtx_managertypes.MonitoredTxStatus +func (_e *EthTxManagerMock_Expecter) ResultsByStatus(ctx interface{}, statuses interface{}) *EthTxManagerMock_ResultsByStatus_Call { + return &EthTxManagerMock_ResultsByStatus_Call{Call: _e.mock.On("ResultsByStatus", ctx, statuses)} +} + +func (_c *EthTxManagerMock_ResultsByStatus_Call) Run(run func(ctx context.Context, statuses []zkevm_ethtx_managertypes.MonitoredTxStatus)) *EthTxManagerMock_ResultsByStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]zkevm_ethtx_managertypes.MonitoredTxStatus)) + }) + return _c +} + +func (_c *EthTxManagerMock_ResultsByStatus_Call) Return(_a0 []zkevm_ethtx_managertypes.MonitoredTxResult, _a1 error) *EthTxManagerMock_ResultsByStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerMock_ResultsByStatus_Call) RunAndReturn(run func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error)) *EthTxManagerMock_ResultsByStatus_Call { + _c.Call.Return(run) + return _c +} + +// NewEthTxManagerMock creates a new instance of EthTxManagerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthTxManagerMock(t interface { + mock.TestingT + Cleanup(func()) +}) *EthTxManagerMock { + mock := &EthTxManagerMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggoracle/mocks/mock_l2germanager.go b/aggoracle/mocks/mock_l2germanager.go new file mode 100644 index 00000000..a7ec0296 --- /dev/null +++ b/aggoracle/mocks/mock_l2germanager.go @@ -0,0 +1,97 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + + mock "github.com/stretchr/testify/mock" +) + +// L2GERManagerMock is an autogenerated mock type for the L2GERManager type +type L2GERManagerMock struct { + mock.Mock +} + +type L2GERManagerMock_Expecter struct { + mock *mock.Mock +} + +func (_m *L2GERManagerMock) EXPECT() *L2GERManagerMock_Expecter { + return &L2GERManagerMock_Expecter{mock: &_m.Mock} +} + +// GlobalExitRootMap provides a mock function with given fields: opts, ger +func (_m *L2GERManagerMock) GlobalExitRootMap(opts *bind.CallOpts, ger [32]byte) (*big.Int, error) { + ret := _m.Called(opts, ger) + + if len(ret) == 0 { + panic("no return value specified for GlobalExitRootMap") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, [32]byte) (*big.Int, error)); ok { + return rf(opts, ger) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, [32]byte) *big.Int); ok { + r0 = rf(opts, ger) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, [32]byte) error); ok { + r1 = rf(opts, ger) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2GERManagerMock_GlobalExitRootMap_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GlobalExitRootMap' +type L2GERManagerMock_GlobalExitRootMap_Call struct { + *mock.Call +} + +// GlobalExitRootMap is a helper method to define mock.On call +// - opts *bind.CallOpts +// - ger [32]byte +func (_e *L2GERManagerMock_Expecter) GlobalExitRootMap(opts interface{}, ger interface{}) *L2GERManagerMock_GlobalExitRootMap_Call { + return &L2GERManagerMock_GlobalExitRootMap_Call{Call: _e.mock.On("GlobalExitRootMap", opts, ger)} +} + +func (_c *L2GERManagerMock_GlobalExitRootMap_Call) Run(run func(opts *bind.CallOpts, ger [32]byte)) *L2GERManagerMock_GlobalExitRootMap_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].([32]byte)) + }) + return _c +} + +func (_c *L2GERManagerMock_GlobalExitRootMap_Call) Return(_a0 *big.Int, _a1 error) *L2GERManagerMock_GlobalExitRootMap_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2GERManagerMock_GlobalExitRootMap_Call) RunAndReturn(run func(*bind.CallOpts, [32]byte) (*big.Int, error)) *L2GERManagerMock_GlobalExitRootMap_Call { + _c.Call.Return(run) + return _c +} + +// NewL2GERManagerMock creates a new instance of L2GERManagerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewL2GERManagerMock(t interface { + mock.TestingT + Cleanup(func()) +}) *L2GERManagerMock { + mock := &L2GERManagerMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggoracle/oracle.go b/aggoracle/oracle.go new file mode 100644 index 00000000..7f1fdafe --- /dev/null +++ b/aggoracle/oracle.go @@ -0,0 +1,138 @@ +package aggoracle + +import ( + "context" + "errors" + "fmt" + "math/big" + "time" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" +) + +type L1InfoTreer interface { + GetLatestInfoUntilBlock(ctx context.Context, blockNum uint64) (*l1infotreesync.L1InfoTreeLeaf, error) +} + +type ChainSender interface { + IsGERInjected(ger common.Hash) (bool, error) + InjectGER(ctx context.Context, ger common.Hash) error +} + +type AggOracle struct { + logger *log.Logger + waitPeriodNextGER time.Duration + l1Client ethereum.ChainReader + l1Info L1InfoTreer + chainSender ChainSender + blockFinality *big.Int +} + +func New( + logger *log.Logger, + chainSender ChainSender, + l1Client ethereum.ChainReader, + l1InfoTreeSyncer L1InfoTreer, + blockFinalityType etherman.BlockNumberFinality, + waitPeriodNextGER time.Duration, +) (*AggOracle, error) { + finality, err := blockFinalityType.ToBlockNum() + if err != nil { + return nil, err + } + + return &AggOracle{ + logger: logger, + chainSender: chainSender, + l1Client: l1Client, + l1Info: l1InfoTreeSyncer, + blockFinality: finality, + waitPeriodNextGER: waitPeriodNextGER, + }, nil +} + +func (a *AggOracle) Start(ctx context.Context) { + ticker := time.NewTicker(a.waitPeriodNextGER) + defer ticker.Stop() + + var blockNumToFetch uint64 + + for { + select { + case <-ticker.C: + if err := a.processLatestGER(ctx, &blockNumToFetch); err != nil { + a.handleGERProcessingError(err, blockNumToFetch) + } + + case <-ctx.Done(): + return + } + } +} + +// processLatestGER fetches the latest finalized GER, checks if it is already injected and injects it if not +func (a *AggOracle) processLatestGER(ctx context.Context, blockNumToFetch *uint64) error { + // Fetch the latest GER + blockNum, gerToInject, err := a.getLastFinalizedGER(ctx, *blockNumToFetch) + if err != nil { + return err + } + + // Update the block number for the next iteration + *blockNumToFetch = blockNum + + isGERInjected, err := a.chainSender.IsGERInjected(gerToInject) + if err != nil { + return fmt.Errorf("error checking if GER is already injected: %w", err) + } + + if isGERInjected { + a.logger.Debugf("GER %s is already injected", gerToInject.Hex()) + return nil + } + + a.logger.Infof("injecting new GER: %s", gerToInject.Hex()) + if err := a.chainSender.InjectGER(ctx, gerToInject); err != nil { + return fmt.Errorf("error injecting GER %s: %w", gerToInject.Hex(), err) + } + + a.logger.Infof("GER %s is injected successfully", gerToInject.Hex()) + return nil +} + +// handleGERProcessingError handles global exit root processing error +func (a *AggOracle) handleGERProcessingError(err error, blockNumToFetch uint64) { + switch { + case errors.Is(err, l1infotreesync.ErrBlockNotProcessed): + a.logger.Debugf("syncer is not ready for the block %d", blockNumToFetch) + case errors.Is(err, l1infotreesync.ErrNotFound): + a.logger.Debugf("syncer has not found any GER until block %d", blockNumToFetch) + default: + a.logger.Error("unexpected error processing GER: ", err) + } +} + +// getLastFinalizedGER tries to return a finalised GER: +// If targetBlockNum != 0: it will try to fetch it until the given block +// Else it will ask the L1 client for the latest finalised block and use that. +// If it fails to get the GER from the syncer, it will return the block number that used to query +func (a *AggOracle) getLastFinalizedGER(ctx context.Context, targetBlockNum uint64) (uint64, common.Hash, error) { + if targetBlockNum == 0 { + header, err := a.l1Client.HeaderByNumber(ctx, a.blockFinality) + if err != nil { + return 0, common.Hash{}, err + } + targetBlockNum = header.Number.Uint64() + } + + info, err := a.l1Info.GetLatestInfoUntilBlock(ctx, targetBlockNum) + if err != nil { + return targetBlockNum, common.Hash{}, err + } + + return 0, info.GlobalExitRoot, nil +} diff --git a/aggregator/aggregator.go b/aggregator/aggregator.go new file mode 100644 index 00000000..37017216 --- /dev/null +++ b/aggregator/aggregator.go @@ -0,0 +1,1665 @@ +package aggregator + +import ( + "context" + "crypto/ecdsa" + "encoding/json" + "errors" + "fmt" + "math" + "math/big" + "net" + "strings" + "sync" + "sync/atomic" + "time" + "unicode" + + aggkittypes "github.com/0xPolygon/cdk-rpc/types" + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + ethtxlog "github.com/0xPolygon/zkevm-ethtx-manager/log" + ethtxtypes "github.com/0xPolygon/zkevm-ethtx-manager/types" + synclog "github.com/0xPolygonHermez/zkevm-synchronizer-l1/log" + "github.com/0xPolygonHermez/zkevm-synchronizer-l1/state/entities" + "github.com/0xPolygonHermez/zkevm-synchronizer-l1/synchronizer" + "github.com/0xPolygonHermez/zkevm-synchronizer-l1/synchronizer/l1_check_block" + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/aggregator/db/dbstorage" + ethmanTypes "github.com/agglayer/aggkit/aggregator/ethmantypes" + "github.com/agglayer/aggkit/aggregator/prover" + aggkitcommon "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/l1infotree" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/rpc" + "github.com/agglayer/aggkit/state" + "github.com/ethereum/go-ethereum/common" + "go.uber.org/zap/zapcore" + "google.golang.org/grpc" + grpchealth "google.golang.org/grpc/health/grpc_health_v1" + "google.golang.org/grpc/peer" +) + +const ( + mockedStateRoot = "0x090bcaf734c4f06c93954a827b45a6e8c67b8e0fd1e0a35a1c5982d6961828f9" + mockedLocalExitRoot = "0x17c04c3760510b48c6012742c540a81aba4bca2f78b9d14bfd2f123e2e53ea3e" + maxDBBigIntValue = 9223372036854775807 +) + +type finalProofMsg struct { + proverName string + proverID string + recursiveProof *state.Proof + finalProof *prover.FinalProof +} + +// Aggregator represents an aggregator +type Aggregator struct { + prover.UnimplementedAggregatorServiceServer + + cfg Config + logger *log.Logger + + storage StorageInterface + etherman Etherman + ethTxManager EthTxManagerClient + l1Syncr synchronizer.Synchronizer + halted atomic.Bool + accInputHashes map[uint64]common.Hash + accInputHashesMutex *sync.Mutex + + timeSendFinalProof time.Time + timeCleanupLockedProofs types.Duration + storageMutex *sync.Mutex + timeSendFinalProofMutex *sync.RWMutex + + finalProof chan finalProofMsg + verifyingProof bool + + witnessRetrievalChan chan state.DBBatch + + srv *grpc.Server + ctx context.Context + exit context.CancelFunc + + sequencerPrivateKey *ecdsa.PrivateKey + aggLayerClient agglayer.AgglayerClientInterface + + rpcClient RPCInterface +} + +// New creates a new aggregator. +func New( + ctx context.Context, + cfg Config, + logger *log.Logger, + etherman Etherman) (*Aggregator, error) { + // Create ethtxmanager client + cfg.EthTxManager.Log = ethtxlog.Config{ + Environment: ethtxlog.LogEnvironment(cfg.Log.Environment), + Level: cfg.Log.Level, + Outputs: cfg.Log.Outputs, + } + ethTxManager, err := ethtxmanager.New(cfg.EthTxManager) + if err != nil { + logger.Fatalf("error creating ethtxmanager client: %v", err) + } + + // Synchonizer logs + syncLogConfig := synclog.Config{ + Environment: synclog.LogEnvironment(cfg.Log.Environment), + Level: cfg.Log.Level, + Outputs: cfg.Log.Outputs, + } + + cfg.Synchronizer.Log = syncLogConfig + + // Create L1 synchronizer client + cfg.Synchronizer.Etherman.L1URL = cfg.EthTxManager.Etherman.URL + logger.Debugf("Creating synchronizer client with config: %+v", cfg.Synchronizer) + l1Syncr, err := synchronizer.NewSynchronizer(ctx, cfg.Synchronizer) + if err != nil { + logger.Fatalf("failed to create synchronizer client, error: %v", err) + } + + var ( + aggLayerClient agglayer.AgglayerClientInterface + sequencerPrivateKey *ecdsa.PrivateKey + ) + + if !cfg.SyncModeOnlyEnabled && cfg.SettlementBackend == AggLayer { + aggLayerClient = agglayer.NewAggLayerClient(cfg.AggLayerURL) + + sequencerPrivateKey, err = aggkitcommon.NewKeyFromKeystore(cfg.SequencerPrivateKey) + if err != nil { + return nil, err + } + } + + storage, err := dbstorage.NewDBStorage(cfg.DBPath) + if err != nil { + return nil, err + } + + a := &Aggregator{ + ctx: ctx, + cfg: cfg, + logger: logger, + storage: storage, + etherman: etherman, + ethTxManager: ethTxManager, + l1Syncr: l1Syncr, + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + storageMutex: &sync.Mutex{}, + timeSendFinalProofMutex: &sync.RWMutex{}, + timeCleanupLockedProofs: cfg.CleanupLockedProofsInterval, + finalProof: make(chan finalProofMsg), + aggLayerClient: aggLayerClient, + sequencerPrivateKey: sequencerPrivateKey, + witnessRetrievalChan: make(chan state.DBBatch), + rpcClient: rpc.NewBatchEndpoints(cfg.RPCURL), + } + + if a.ctx == nil { + a.ctx, a.exit = context.WithCancel(a.ctx) + } + + // Set function to handle events on L1 + if !cfg.SyncModeOnlyEnabled { + a.l1Syncr.SetCallbackOnReorgDone(a.handleReorg) + a.l1Syncr.SetCallbackOnRollbackBatches(a.handleRollbackBatches) + } + + return a, nil +} + +func (a *Aggregator) getAccInputHash(batchNumber uint64) common.Hash { + a.accInputHashesMutex.Lock() + defer a.accInputHashesMutex.Unlock() + return a.accInputHashes[batchNumber] +} + +func (a *Aggregator) setAccInputHash(batchNumber uint64, accInputHash common.Hash) { + a.accInputHashesMutex.Lock() + defer a.accInputHashesMutex.Unlock() + a.accInputHashes[batchNumber] = accInputHash +} + +func (a *Aggregator) removeAccInputHashes(firstBatch, lastBatch uint64) { + a.accInputHashesMutex.Lock() + defer a.accInputHashesMutex.Unlock() + for i := firstBatch; i <= lastBatch; i++ { + delete(a.accInputHashes, i) + } +} + +func (a *Aggregator) handleReorg(reorgData synchronizer.ReorgExecutionResult) { + a.logger.Warnf("Reorg detected, reorgData: %+v", reorgData) + + // Get new latest verified batch number + lastVBatchNumber, err := a.l1Syncr.GetLastestVirtualBatchNumber(a.ctx) + if err != nil { + a.logger.Errorf("Error getting last virtual batch number: %v", err) + } else { + // Delete wip proofs + err = a.storage.DeleteUngeneratedProofs(a.ctx, nil) + if err != nil { + a.logger.Errorf("Error deleting ungenerated proofs: %v", err) + } else { + a.logger.Info("Deleted ungenerated proofs") + } + + // Delete any proof for the batches that have been rolled back + err = a.storage.DeleteGeneratedProofs(a.ctx, lastVBatchNumber+1, maxDBBigIntValue, nil) + if err != nil { + a.logger.Errorf("Error deleting generated proofs: %v", err) + } else { + a.logger.Infof("Deleted generated proofs for batches newer than %d", lastVBatchNumber) + } + } + + // Halt the aggregator + a.halted.Store(true) + for { + a.logger.Warnf( + "Halting the aggregator due to a L1 reorg. " + + "Reorged data has been deleted, so it is safe to manually restart the aggregator.", + ) + time.Sleep(10 * time.Second) //nolint:mnd + } +} + +func (a *Aggregator) handleRollbackBatches(rollbackData synchronizer.RollbackBatchesData) { + a.logger.Warnf("Rollback batches event, rollbackBatchesData: %+v", rollbackData) + + var err error + var accInputHash *common.Hash + + // Get new last verified batch number from L1 + lastVerifiedBatchNumber, err := a.etherman.GetLatestVerifiedBatchNum() + if err != nil { + a.logger.Errorf("Error getting latest verified batch number: %v", err) + } + + a.logger.Infof("Last Verified Batch Number:%v", lastVerifiedBatchNumber) + + // Check lastVerifiedBatchNumber makes sense + if err == nil && lastVerifiedBatchNumber > rollbackData.LastBatchNumber { + err = fmt.Errorf( + "last verified batch number %d is greater than the last batch number %d in the rollback data", + lastVerifiedBatchNumber, rollbackData.LastBatchNumber, + ) + } + + if err == nil { + accInputHash, err = a.getVerifiedBatchAccInputHash(a.ctx, lastVerifiedBatchNumber) + if err == nil { + a.accInputHashesMutex.Lock() + a.accInputHashes = make(map[uint64]common.Hash) + a.accInputHashesMutex.Unlock() + a.logger.Infof("Starting AccInputHash:%v", accInputHash.String()) + a.setAccInputHash(lastVerifiedBatchNumber, *accInputHash) + } + } + + // Delete wip proofs + if err == nil { + err = a.storage.DeleteUngeneratedProofs(a.ctx, nil) + if err != nil { + a.logger.Errorf("Error deleting ungenerated proofs: %v", err) + } else { + a.logger.Info("Deleted ungenerated proofs") + } + } + + // Delete any proof for the batches that have been rolled back + if err == nil { + err = a.storage.DeleteGeneratedProofs(a.ctx, rollbackData.LastBatchNumber+1, maxDBBigIntValue, nil) + if err != nil { + a.logger.Errorf("Error deleting generated proofs: %v", err) + } else { + a.logger.Infof("Deleted generated proofs for batches newer than %d", rollbackData.LastBatchNumber) + } + } + + if err == nil { + a.logger.Info("Handling rollback batches event finished successfully") + } else { + // Halt the aggregator + a.halted.Store(true) + for { + a.logger.Errorf("Halting the aggregator due to an error handling rollback batches event: %v", err) + time.Sleep(10 * time.Second) //nolint:mnd + } + } +} + +// Start starts the aggregator +func (a *Aggregator) Start() error { + // Initial L1 Sync blocking + err := a.l1Syncr.Sync(true) + if err != nil { + a.logger.Fatalf("Failed to synchronize from L1: %v", err) + return err + } + + // Keep syncing L1 + go func() { + err := a.l1Syncr.Sync(false) + if err != nil { + a.logger.Fatalf("Failed to synchronize from L1: %v", err) + } + }() + + if !a.cfg.SyncModeOnlyEnabled { + address := fmt.Sprintf("%s:%d", a.cfg.Host, a.cfg.Port) + lis, err := net.Listen("tcp", address) + if err != nil { + a.logger.Fatalf("Failed to listen: %v", err) + } + + a.srv = grpc.NewServer() + prover.RegisterAggregatorServiceServer(a.srv, a) + + healthService := newHealthChecker() + grpchealth.RegisterHealthServer(a.srv, healthService) + + // Get last verified batch number to set the starting point for verifications + lastVerifiedBatchNumber, err := a.etherman.GetLatestVerifiedBatchNum() + if err != nil { + return err + } + + a.logger.Infof("Last Verified Batch Number:%v", lastVerifiedBatchNumber) + + accInputHash, err := a.getVerifiedBatchAccInputHash(a.ctx, lastVerifiedBatchNumber) + if err != nil { + return err + } + + a.logger.Infof("Starting AccInputHash:%v", accInputHash.String()) + a.setAccInputHash(lastVerifiedBatchNumber, *accInputHash) + + // Delete existing proofs + err = a.storage.DeleteGeneratedProofs(a.ctx, lastVerifiedBatchNumber, maxDBBigIntValue, nil) + if err != nil { + return fmt.Errorf("failed to delete proofs table %w", err) + } + + a.resetVerifyProofTime() + + go a.cleanupLockedProofs() + go a.sendFinalProof() + go a.ethTxManager.Start() + + // A this point everything is ready, so start serving + go func() { + a.logger.Infof("Server listening on port %d", a.cfg.Port) + if err := a.srv.Serve(lis); err != nil { + a.exit() + a.logger.Fatalf("Failed to serve: %v", err) + } + }() + } + + <-a.ctx.Done() + + return a.ctx.Err() +} + +// Stop stops the Aggregator server. +func (a *Aggregator) Stop() { + a.exit() + a.srv.Stop() +} + +// Channel implements the bi-directional communication channel between the +// Prover client and the Aggregator server. +func (a *Aggregator) Channel(stream prover.AggregatorService_ChannelServer) error { + ctx := stream.Context() + var proverAddr net.Addr + p, ok := peer.FromContext(ctx) + if ok { + proverAddr = p.Addr + } + proverLogger := log.WithFields("module", aggkitcommon.PROVER) + prover, err := prover.New(proverLogger, stream, proverAddr, a.cfg.ProofStatePollingInterval) + if err != nil { + return err + } + + tmpLogger := proverLogger.WithFields( + "prover", prover.Name(), + "proverId", prover.ID(), + "proverAddr", prover.Addr(), + ) + tmpLogger.Info("Establishing stream connection with prover") + + // Check if prover supports the required Fork ID + if !prover.SupportsForkID(a.cfg.ForkId) { + err := errors.New("prover does not support required fork ID") + tmpLogger.Warn(FirstToUpper(err.Error())) + + return err + } + + for { + select { + case <-a.ctx.Done(): + // server disconnected + return a.ctx.Err() + case <-ctx.Done(): + // client disconnected + return ctx.Err() + + default: + if !a.halted.Load() { + isIdle, err := prover.IsIdle() + if err != nil { + tmpLogger.Errorf("Failed to check if prover is idle: %v", err) + time.Sleep(a.cfg.RetryTime.Duration) + + continue + } + if !isIdle { + tmpLogger.Debug("Prover is not idle") + time.Sleep(a.cfg.RetryTime.Duration) + + continue + } + + _, err = a.tryBuildFinalProof(ctx, prover, nil) + if err != nil { + tmpLogger.Errorf("Error checking proofs to verify: %v", err) + } + + proofGenerated, err := a.tryAggregateProofs(ctx, prover) + if err != nil { + tmpLogger.Errorf("Error trying to aggregate proofs: %v", err) + } + + if !proofGenerated { + proofGenerated, err = a.tryGenerateBatchProof(ctx, prover) + if err != nil { + tmpLogger.Errorf("Error trying to generate proof: %v", err) + } + } + if !proofGenerated { + // if no proof was generated (aggregated or batch) wait some time before retry + time.Sleep(a.cfg.RetryTime.Duration) + } // if proof was generated we retry immediately as probably we have more proofs to process + } + } + } +} + +// This function waits to receive a final proof from a prover. Once it receives +// the proof, it performs these steps in order: +// - send the final proof to L1 +// - wait for the synchronizer to catch up +// - clean up the cache of recursive proofs +func (a *Aggregator) sendFinalProof() { + for { + select { + case <-a.ctx.Done(): + return + case msg := <-a.finalProof: + ctx := a.ctx + proof := msg.recursiveProof + + tmpLogger := a.logger.WithFields( + "proofId", proof.ProofID, + "batches", fmt.Sprintf("%d-%d", proof.BatchNumber, proof.BatchNumberFinal)) + tmpLogger.Info("Verifying final proof with ethereum smart contract") + + a.startProofVerification() + + // Get Batch from RPC + rpcFinalBatch, err := a.rpcClient.GetBatch(proof.BatchNumberFinal) + if err != nil { + a.logger.Errorf("error getting batch %d from RPC: %v.", proof.BatchNumberFinal, err) + a.endProofVerification() + continue + } + + inputs := ethmanTypes.FinalProofInputs{ + FinalProof: msg.finalProof, + NewLocalExitRoot: rpcFinalBatch.LocalExitRoot().Bytes(), + NewStateRoot: rpcFinalBatch.StateRoot().Bytes(), + } + + switch a.cfg.SettlementBackend { + case AggLayer: + if success := a.settleWithAggLayer(ctx, proof, inputs); !success { + continue + } + default: + if success := a.settleDirect(ctx, proof, inputs); !success { + continue + } + } + + a.resetVerifyProofTime() + a.endProofVerification() + } + } +} + +func (a *Aggregator) settleWithAggLayer( + ctx context.Context, + proof *state.Proof, + inputs ethmanTypes.FinalProofInputs) bool { + proofStrNo0x := strings.TrimPrefix(inputs.FinalProof.Proof, "0x") + proofBytes := common.Hex2Bytes(proofStrNo0x) + tx := agglayer.Tx{ + LastVerifiedBatch: aggkittypes.ArgUint64(proof.BatchNumber - 1), + NewVerifiedBatch: aggkittypes.ArgUint64(proof.BatchNumberFinal), + ZKP: agglayer.ZKP{ + NewStateRoot: common.BytesToHash(inputs.NewStateRoot), + NewLocalExitRoot: common.BytesToHash(inputs.NewLocalExitRoot), + Proof: aggkittypes.ArgBytes(proofBytes), + }, + RollupID: a.etherman.GetRollupId(), + } + signedTx, err := tx.Sign(a.sequencerPrivateKey) + if err != nil { + a.logger.Errorf("failed to sign tx: %v", err) + a.handleFailureToAddVerifyBatchToBeMonitored(ctx, proof) + + return false + } + + a.logger.Debug("final proof: %+v", tx) + a.logger.Debug("final proof signedTx: ", signedTx.Tx.ZKP.Proof.Hex()) + txHash, err := a.aggLayerClient.SendTx(*signedTx) + if err != nil { + if errors.Is(err, agglayer.ErrAgglayerRateLimitExceeded) { + a.logger.Errorf("%s. Config param VerifyProofInterval should match the agglayer configured rate limit.", err) + } else { + a.logger.Errorf("failed to send tx to the agglayer: %v", err) + } + a.handleFailureToAddVerifyBatchToBeMonitored(ctx, proof) + return false + } + + a.logger.Infof("tx %s sent to agglayer, waiting to be mined", txHash.Hex()) + a.logger.Debugf("Timeout set to %f seconds", a.cfg.AggLayerTxTimeout.Duration.Seconds()) + waitCtx, cancelFunc := context.WithDeadline(ctx, time.Now().Add(a.cfg.AggLayerTxTimeout.Duration)) + defer cancelFunc() + if err := a.aggLayerClient.WaitTxToBeMined(txHash, waitCtx); err != nil { + a.logger.Errorf("agglayer didn't mine the tx: %v", err) + a.handleFailureToAddVerifyBatchToBeMonitored(ctx, proof) + + return false + } + + return true +} + +// settleDirect sends the final proof to the L1 smart contract directly. +func (a *Aggregator) settleDirect( + ctx context.Context, + proof *state.Proof, + inputs ethmanTypes.FinalProofInputs) bool { + // add batch verification to be monitored + sender := common.HexToAddress(a.cfg.SenderAddress) + to, data, err := a.etherman.BuildTrustedVerifyBatchesTxData( + proof.BatchNumber-1, proof.BatchNumberFinal, &inputs, sender, + ) + if err != nil { + a.logger.Errorf("Error estimating batch verification to add to eth tx manager: %v", err) + a.handleFailureToAddVerifyBatchToBeMonitored(ctx, proof) + + return false + } + + monitoredTxID, err := a.ethTxManager.Add(ctx, to, big.NewInt(0), data, a.cfg.GasOffset, nil) + if err != nil { + a.logger.Errorf("Error Adding TX to ethTxManager: %v", err) + mTxLogger := ethtxmanager.CreateLogger(monitoredTxID, sender, to) + mTxLogger.Errorf("Error to add batch verification tx to eth tx manager: %v", err) + a.handleFailureToAddVerifyBatchToBeMonitored(ctx, proof) + + return false + } + + // process monitored batch verifications before starting a next cycle + a.ethTxManager.ProcessPendingMonitoredTxs(ctx, func(result ethtxtypes.MonitoredTxResult) { + a.handleMonitoredTxResult(result, proof.BatchNumber, proof.BatchNumberFinal) + }) + + return true +} + +func (a *Aggregator) handleFailureToAddVerifyBatchToBeMonitored(ctx context.Context, proof *state.Proof) { + tmpLogger := a.logger.WithFields( + "proofId", proof.ProofID, + "batches", fmt.Sprintf("%d-%d", proof.BatchNumber, proof.BatchNumberFinal), + ) + proof.GeneratingSince = nil + err := a.storage.UpdateGeneratedProof(ctx, proof, nil) + if err != nil { + tmpLogger.Errorf("Failed updating proof state (false): %v", err) + } + a.endProofVerification() +} + +// buildFinalProof builds and return the final proof for an aggregated/batch proof. +func (a *Aggregator) buildFinalProof( + ctx context.Context, prover ProverInterface, proof *state.Proof) (*prover.FinalProof, error) { + tmpLogger := a.logger.WithFields( + "prover", prover.Name(), + "proverId", prover.ID(), + "proverAddr", prover.Addr(), + "recursiveProofId", *proof.ProofID, + "batches", fmt.Sprintf("%d-%d", proof.BatchNumber, proof.BatchNumberFinal), + ) + + finalProofID, err := prover.FinalProof(proof.Proof, a.cfg.SenderAddress) + if err != nil { + return nil, fmt.Errorf("failed to get final proof id: %w", err) + } + proof.ProofID = finalProofID + + tmpLogger.Infof("Final proof ID for batches [%d-%d]: %s", proof.BatchNumber, proof.BatchNumberFinal, *proof.ProofID) + tmpLogger = tmpLogger.WithFields("finalProofId", finalProofID) + + finalProof, err := prover.WaitFinalProof(ctx, *proof.ProofID) + if err != nil { + return nil, fmt.Errorf("failed to get final proof from prover: %w", err) + } + + // mock prover sanity check + if string(finalProof.Public.NewStateRoot) == mockedStateRoot && + string(finalProof.Public.NewLocalExitRoot) == mockedLocalExitRoot { + // This local exit root and state root come from the mock + // prover, use the one captured by the executor instead + rpcFinalBatch, err := a.rpcClient.GetBatch(proof.BatchNumberFinal) + if err != nil { + return nil, fmt.Errorf("error getting batch %d from RPC: %w", proof.BatchNumberFinal, err) + } + + tmpLogger.Warnf( + "NewLocalExitRoot and NewStateRoot look like a mock values, using values from executor instead: LER: %v, SR: %v", + rpcFinalBatch.LocalExitRoot().TerminalString(), rpcFinalBatch.StateRoot().TerminalString()) + finalProof.Public.NewStateRoot = rpcFinalBatch.StateRoot().Bytes() + finalProof.Public.NewLocalExitRoot = rpcFinalBatch.LocalExitRoot().Bytes() + } + + return finalProof, nil +} + +// tryBuildFinalProof checks if the provided proof is eligible to be used to +// build the final proof. If no proof is provided it looks for a previously +// generated proof. If the proof is eligible, then the final proof generation +// is triggered. +func (a *Aggregator) tryBuildFinalProof(ctx context.Context, prover ProverInterface, proof *state.Proof) (bool, error) { + proverName := prover.Name() + proverID := prover.ID() + + tmpLogger := a.logger.WithFields( + "prover", proverName, + "proverId", proverID, + "proverAddr", prover.Addr(), + ) + tmpLogger.Debug("tryBuildFinalProof start") + + if !a.canVerifyProof() { + tmpLogger.Debug("Time to verify proof not reached or proof verification in progress") + return false, nil + } + tmpLogger.Debug("Send final proof time reached") + + lastVerifiedBatchNumber, err := a.etherman.GetLatestVerifiedBatchNum() + if err != nil { + return false, err + } + + if proof == nil { + // we don't have a proof generating at the moment, check if we + // have a proof ready to verify + proof, err = a.getAndLockProofReadyToVerify(ctx, lastVerifiedBatchNumber) + if errors.Is(err, state.ErrNotFound) { + // nothing to verify, swallow the error + tmpLogger.Debug("No proof ready to verify") + return false, nil + } + if err != nil { + return false, err + } + + defer func() { + if err != nil { + // Set the generating state to false for the proof ("unlock" it) + proof.GeneratingSince = nil + err2 := a.storage.UpdateGeneratedProof(a.ctx, proof, nil) + if err2 != nil { + tmpLogger.Errorf("Failed to unlock proof: %v", err2) + } + } + }() + } else { + // we do have a proof generating at the moment, check if it is + // eligible to be verified + eligible, err := a.validateEligibleFinalProof(ctx, proof, lastVerifiedBatchNumber) + if err != nil { + return false, fmt.Errorf("failed to validate eligible final proof, %w", err) + } + if !eligible { + return false, nil + } + } + + tmpLogger = tmpLogger.WithFields( + "proofId", *proof.ProofID, + "batches", fmt.Sprintf("%d-%d", proof.BatchNumber, proof.BatchNumberFinal), + ) + + // at this point we have an eligible proof, build the final one using it + finalProof, err := a.buildFinalProof(ctx, prover, proof) + if err != nil { + err = fmt.Errorf("failed to build final proof, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + msg := finalProofMsg{ + proverName: proverName, + proverID: proverID, + recursiveProof: proof, + finalProof: finalProof, + } + + select { + case <-a.ctx.Done(): + return false, a.ctx.Err() + case a.finalProof <- msg: + } + + tmpLogger.Debug("tryBuildFinalProof end") + return true, nil +} + +func (a *Aggregator) validateEligibleFinalProof( + ctx context.Context, proof *state.Proof, lastVerifiedBatchNum uint64, +) (bool, error) { + batchNumberToVerify := lastVerifiedBatchNum + 1 + + if proof.BatchNumber != batchNumberToVerify { + if proof.BatchNumber < batchNumberToVerify && + proof.BatchNumberFinal >= batchNumberToVerify { + // We have a proof that contains some batches below the last batch verified, anyway can be eligible as final proof + a.logger.Warnf("Proof %d-%d contains some batches lower than last batch verified %d. Check anyway if it is eligible", + proof.BatchNumber, proof.BatchNumberFinal, lastVerifiedBatchNum) + } else if proof.BatchNumberFinal < batchNumberToVerify { + // We have a proof that contains batches below that the last batch verified, we need to delete this proof + a.logger.Warnf("Proof %d-%d lower than next batch to verify %d. Deleting it", + proof.BatchNumber, proof.BatchNumberFinal, batchNumberToVerify) + err := a.storage.DeleteGeneratedProofs(ctx, proof.BatchNumber, proof.BatchNumberFinal, nil) + if err != nil { + return false, fmt.Errorf("failed to delete discarded proof, err: %w", err) + } + + return false, nil + } else { + a.logger.Debugf("Proof batch number %d is not the following to last verfied batch number %d", + proof.BatchNumber, lastVerifiedBatchNum) + return false, nil + } + } + + bComplete, err := a.storage.CheckProofContainsCompleteSequences(ctx, proof, nil) + if err != nil { + return false, fmt.Errorf("failed to check if proof contains complete sequences, %w", err) + } + if !bComplete { + a.logger.Infof("Recursive proof %d-%d not eligible to be verified: not containing complete sequences", + proof.BatchNumber, proof.BatchNumberFinal) + return false, nil + } + + return true, nil +} + +func (a *Aggregator) getAndLockProofReadyToVerify( + ctx context.Context, lastVerifiedBatchNum uint64, +) (*state.Proof, error) { + a.storageMutex.Lock() + defer a.storageMutex.Unlock() + + // Get proof ready to be verified + proofToVerify, err := a.storage.GetProofReadyToVerify(ctx, lastVerifiedBatchNum, nil) + if err != nil { + return nil, err + } + + now := time.Now().Round(time.Microsecond) + proofToVerify.GeneratingSince = &now + + err = a.storage.UpdateGeneratedProof(ctx, proofToVerify, nil) + if err != nil { + return nil, err + } + + return proofToVerify, nil +} + +func (a *Aggregator) unlockProofsToAggregate(ctx context.Context, proof1 *state.Proof, proof2 *state.Proof) error { + // Release proofs from generating state in a single transaction + dbTx, err := a.storage.BeginTx(ctx, nil) + if err != nil { + a.logger.Warnf("Failed to begin transaction to release proof aggregation state, err: %v", err) + return err + } + + proof1.GeneratingSince = nil + err = a.storage.UpdateGeneratedProof(ctx, proof1, dbTx) + if err == nil { + proof2.GeneratingSince = nil + err = a.storage.UpdateGeneratedProof(ctx, proof2, dbTx) + } + + if err != nil { + if err := dbTx.Rollback(); err != nil { + err := fmt.Errorf("failed to rollback proof aggregation state: %w", err) + a.logger.Error(FirstToUpper(err.Error())) + return err + } + + return fmt.Errorf("failed to release proof aggregation state: %w", err) + } + + err = dbTx.Commit() + if err != nil { + return fmt.Errorf("failed to release proof aggregation state %w", err) + } + + return nil +} + +func (a *Aggregator) getAndLockProofsToAggregate( + ctx context.Context, prover ProverInterface) (*state.Proof, *state.Proof, error) { + tmpLogger := a.logger.WithFields( + "prover", prover.Name(), + "proverId", prover.ID(), + "proverAddr", prover.Addr(), + ) + + a.storageMutex.Lock() + defer a.storageMutex.Unlock() + + proof1, proof2, err := a.storage.GetProofsToAggregate(ctx, nil) + if err != nil { + return nil, nil, err + } + + // Set proofs in generating state in a single transaction + dbTx, err := a.storage.BeginTx(ctx, nil) + if err != nil { + tmpLogger.Errorf("Failed to begin transaction to set proof aggregation state, err: %v", err) + return nil, nil, err + } + + now := time.Now().Round(time.Microsecond) + proof1.GeneratingSince = &now + err = a.storage.UpdateGeneratedProof(ctx, proof1, dbTx) + if err == nil { + proof2.GeneratingSince = &now + err = a.storage.UpdateGeneratedProof(ctx, proof2, dbTx) + } + + if err != nil { + if err := dbTx.Rollback(); err != nil { + err := fmt.Errorf("failed to rollback proof aggregation state %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return nil, nil, err + } + + return nil, nil, fmt.Errorf("failed to set proof aggregation state %w", err) + } + + err = dbTx.Commit() + if err != nil { + return nil, nil, fmt.Errorf("failed to set proof aggregation state %w", err) + } + + return proof1, proof2, nil +} + +func (a *Aggregator) tryAggregateProofs(ctx context.Context, prover ProverInterface) (bool, error) { + proverName := prover.Name() + proverID := prover.ID() + + tmpLogger := a.logger.WithFields( + "prover", proverName, + "proverId", proverID, + "proverAddr", prover.Addr(), + ) + tmpLogger.Debug("tryAggregateProofs start") + + proof1, proof2, err0 := a.getAndLockProofsToAggregate(ctx, prover) + if errors.Is(err0, state.ErrNotFound) { + // nothing to aggregate, swallow the error + tmpLogger.Debug("Nothing to aggregate") + return false, nil + } + if err0 != nil { + return false, err0 + } + + var ( + aggrProofID *string + err error + ) + + defer func() { + if err != nil { + err2 := a.unlockProofsToAggregate(a.ctx, proof1, proof2) + if err2 != nil { + tmpLogger.Errorf("Failed to release aggregated proofs, err: %v", err2) + } + } + tmpLogger.Debug("tryAggregateProofs end") + }() + + tmpLogger.Infof("Aggregating proofs: %d-%d and %d-%d", + proof1.BatchNumber, proof1.BatchNumberFinal, proof2.BatchNumber, proof2.BatchNumberFinal) + + batches := fmt.Sprintf("%d-%d", proof1.BatchNumber, proof2.BatchNumberFinal) + tmpLogger = tmpLogger.WithFields("batches", batches) + + inputProver := map[string]interface{}{ + "recursive_proof_1": proof1.Proof, + "recursive_proof_2": proof2.Proof, + } + b, err := json.Marshal(inputProver) + if err != nil { + err = fmt.Errorf("failed to serialize input prover, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + proof := &state.Proof{ + BatchNumber: proof1.BatchNumber, + BatchNumberFinal: proof2.BatchNumberFinal, + Prover: &proverName, + ProverID: &proverID, + InputProver: string(b), + } + + aggrProofID, err = prover.AggregatedProof(proof1.Proof, proof2.Proof) + if err != nil { + err = fmt.Errorf("failed to get aggregated proof id, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + proof.ProofID = aggrProofID + + tmpLogger.Infof("Proof ID for aggregated proof: %v", *proof.ProofID) + tmpLogger = tmpLogger.WithFields("proofId", *proof.ProofID) + + recursiveProof, _, _, err := prover.WaitRecursiveProof(ctx, *proof.ProofID) + if err != nil { + err = fmt.Errorf("failed to get aggregated proof from prover, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + tmpLogger.Info("Aggregated proof generated") + + proof.Proof = recursiveProof + + // update the state by removing the 2 aggregated proofs and storing the + // newly generated recursive proof + dbTx, err := a.storage.BeginTx(ctx, nil) + if err != nil { + err = fmt.Errorf("failed to begin transaction to update proof aggregation state, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + err = a.storage.DeleteGeneratedProofs(ctx, proof1.BatchNumber, proof2.BatchNumberFinal, dbTx) + if err != nil { + if err := dbTx.Rollback(); err != nil { + err := fmt.Errorf("failed to rollback proof aggregation state, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + err = fmt.Errorf("failed to delete previously aggregated proofs, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + now := time.Now().Round(time.Microsecond) + proof.GeneratingSince = &now + + err = a.storage.AddGeneratedProof(ctx, proof, dbTx) + if err != nil { + if err := dbTx.Rollback(); err != nil { + err := fmt.Errorf("failed to rollback proof aggregation state, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + err = fmt.Errorf("failed to store the recursive proof, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + err = dbTx.Commit() + if err != nil { + err = fmt.Errorf("failed to store the recursive proof, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + // NOTE(pg): the defer func is useless from now on, use a different variable + // name for errors (or shadow err in inner scopes) to not trigger it. + + // state is up to date, check if we can send the final proof using the + // one just crafted. + finalProofBuilt, finalProofErr := a.tryBuildFinalProof(ctx, prover, proof) + if finalProofErr != nil { + // just log the error and continue to handle the aggregated proof + tmpLogger.Errorf("Failed trying to check if recursive proof can be verified: %v", finalProofErr) + } + + // NOTE(pg): prover is done, use a.ctx from now on + + if !finalProofBuilt { + proof.GeneratingSince = nil + + // final proof has not been generated, update the recursive proof + err := a.storage.UpdateGeneratedProof(a.ctx, proof, nil) + if err != nil { + err = fmt.Errorf("failed to store batch proof result, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + } + + return true, nil +} + +func (a *Aggregator) getVerifiedBatchAccInputHash(ctx context.Context, batchNumber uint64) (*common.Hash, error) { + accInputHash, err := a.etherman.GetBatchAccInputHash(ctx, batchNumber) + if err != nil { + return nil, err + } + + return &accInputHash, nil +} + +func (a *Aggregator) getAndLockBatchToProve( + ctx context.Context, prover ProverInterface, +) (*state.Batch, []byte, *state.Proof, error) { + proverID := prover.ID() + proverName := prover.Name() + + tmpLogger := a.logger.WithFields( + "prover", proverName, + "proverId", proverID, + "proverAddr", prover.Addr(), + ) + + a.storageMutex.Lock() + defer a.storageMutex.Unlock() + + // Get last virtual batch number from L1 + lastVerifiedBatchNumber, err := a.etherman.GetLatestVerifiedBatchNum() + if err != nil { + return nil, nil, nil, err + } + + proofExists := true + batchNumberToVerify := lastVerifiedBatchNumber + + // Look for the batch number to verify + for proofExists { + batchNumberToVerify++ + proofExists, err = a.storage.CheckProofExistsForBatch(ctx, batchNumberToVerify, nil) + if err != nil { + tmpLogger.Infof("Error checking proof exists for batch %d", batchNumberToVerify) + + return nil, nil, nil, err + } + + if proofExists { + accInputHash := a.getAccInputHash(batchNumberToVerify - 1) + if accInputHash == (common.Hash{}) && batchNumberToVerify > 1 { + tmpLogger.Warnf("AccInputHash for batch %d is not in memory, "+ + "deleting proofs to regenerate acc input hash chain in memory", batchNumberToVerify) + + err := a.storage.CleanupGeneratedProofs(ctx, math.MaxInt, nil) + if err != nil { + tmpLogger.Infof("Error cleaning up generated proofs for batch %d", batchNumberToVerify) + return nil, nil, nil, err + } + batchNumberToVerify-- + break + } + } + } + + // Check if the batch has been sequenced + sequence, err := a.l1Syncr.GetSequenceByBatchNumber(ctx, batchNumberToVerify) + if err != nil && !errors.Is(err, entities.ErrNotFound) { + return nil, nil, nil, err + } + + // Not found, so it it not possible to verify the batch yet + if sequence == nil || errors.Is(err, entities.ErrNotFound) { + tmpLogger.Infof("Sequencing event for batch %d has not been synced yet, "+ + "so it is not possible to verify it yet. Waiting ...", batchNumberToVerify) + + return nil, nil, nil, state.ErrNotFound + } + + stateSequence := state.Sequence{ + FromBatchNumber: sequence.FromBatchNumber, + ToBatchNumber: sequence.ToBatchNumber, + } + + // Get Batch from L1 Syncer + virtualBatch, err := a.l1Syncr.GetVirtualBatchByBatchNumber(a.ctx, batchNumberToVerify) + if err != nil && !errors.Is(err, entities.ErrNotFound) { + a.logger.Errorf("Error getting virtual batch: %v", err) + return nil, nil, nil, err + } else if errors.Is(err, entities.ErrNotFound) { + a.logger.Infof("Virtual batch %d has not been synced yet, "+ + "so it is not possible to verify it yet. Waiting ...", batchNumberToVerify) + return nil, nil, nil, state.ErrNotFound + } + + // Get Batch from RPC + rpcBatch, err := a.rpcClient.GetBatch(batchNumberToVerify) + if err != nil { + a.logger.Errorf("error getting batch %d from RPC: %v.", batchNumberToVerify, err) + return nil, nil, nil, err + } + + // Compare BatchL2Data from virtual batch and rpcBatch (skipping injected batch (1)) + if batchNumberToVerify != 1 && (common.Bytes2Hex(virtualBatch.BatchL2Data) != common.Bytes2Hex(rpcBatch.L2Data())) { + a.logger.Warnf("BatchL2Data from virtual batch %d does not match the one from RPC", batchNumberToVerify) + a.logger.Warnf("VirtualBatch BatchL2Data:%v", common.Bytes2Hex(virtualBatch.BatchL2Data)) + a.logger.Warnf("RPC BatchL2Data:%v", common.Bytes2Hex(rpcBatch.L2Data())) + } + + l1InfoRoot := common.Hash{} + + if virtualBatch.L1InfoRoot == nil { + log.Debugf("L1InfoRoot is nil for batch %d", batchNumberToVerify) + virtualBatch.L1InfoRoot = &l1InfoRoot + } + + // Ensure the old acc input hash is in memory + oldAccInputHash := a.getAccInputHash(batchNumberToVerify - 1) + if oldAccInputHash == (common.Hash{}) && batchNumberToVerify > 1 { + tmpLogger.Warnf("AccInputHash for previous batch (%d) is not in memory. Waiting ...", batchNumberToVerify-1) + return nil, nil, nil, state.ErrNotFound + } + + forcedBlockHashL1 := rpcBatch.ForcedBlockHashL1() + l1InfoRoot = *virtualBatch.L1InfoRoot + + if batchNumberToVerify == 1 { + l1Block, err := a.l1Syncr.GetL1BlockByNumber(ctx, virtualBatch.BlockNumber) + if err != nil { + a.logger.Errorf("Error getting l1 block: %v", err) + return nil, nil, nil, err + } + + forcedBlockHashL1 = l1Block.ParentHash + l1InfoRoot = rpcBatch.GlobalExitRoot() + } + + // Calculate acc input hash as the RPC is not returning the correct one at the moment + accInputHash := aggkitcommon.CalculateAccInputHash( + a.logger, + oldAccInputHash, + virtualBatch.BatchL2Data, + l1InfoRoot, + uint64(sequence.Timestamp.Unix()), + rpcBatch.LastCoinbase(), + forcedBlockHashL1, + ) + // Store the acc input hash + a.setAccInputHash(batchNumberToVerify, accInputHash) + + // Log params to calculate acc input hash + a.logger.Debugf("Calculated acc input hash for batch %d: %v", batchNumberToVerify, accInputHash) + a.logger.Debugf("OldAccInputHash: %v", oldAccInputHash) + a.logger.Debugf("L1InfoRoot: %v", virtualBatch.L1InfoRoot) + a.logger.Debugf("TimestampLimit: %v", uint64(sequence.Timestamp.Unix())) + a.logger.Debugf("LastCoinbase: %v", rpcBatch.LastCoinbase()) + a.logger.Debugf("ForcedBlockHashL1: %v", rpcBatch.ForcedBlockHashL1()) + + // Create state batch + stateBatch := &state.Batch{ + BatchNumber: rpcBatch.BatchNumber(), + Coinbase: rpcBatch.LastCoinbase(), + // Use L1 batch data + BatchL2Data: virtualBatch.BatchL2Data, + StateRoot: rpcBatch.StateRoot(), + LocalExitRoot: rpcBatch.LocalExitRoot(), + // Use calculated acc input + AccInputHash: accInputHash, + L1InfoTreeIndex: rpcBatch.L1InfoTreeIndex(), + L1InfoRoot: *virtualBatch.L1InfoRoot, + Timestamp: sequence.Timestamp, + GlobalExitRoot: rpcBatch.GlobalExitRoot(), + ChainID: a.cfg.ChainID, + ForkID: a.cfg.ForkId, + } + + // Request the witness from the server, if it is busy just keep looping until it is available + start := time.Now() + witness, err := a.rpcClient.GetWitness(batchNumberToVerify, a.cfg.UseFullWitness) + for err != nil { + if errors.Is(err, rpc.ErrBusy) { + a.logger.Debugf( + "Witness server is busy, retrying get witness for batch %d in %v", + batchNumberToVerify, a.cfg.RetryTime.Duration, + ) + } else { + a.logger.Errorf("Failed to get witness for batch %d, err: %v", batchNumberToVerify, err) + } + time.Sleep(a.cfg.RetryTime.Duration) + } + end := time.Now() + a.logger.Debugf("Time to get witness for batch %d: %v", batchNumberToVerify, end.Sub(start)) + + // Store the sequence in aggregator DB + err = a.storage.AddSequence(ctx, stateSequence, nil) + if err != nil { + tmpLogger.Infof("Error storing sequence for batch %d", batchNumberToVerify) + + return nil, nil, nil, err + } + + // All the data required to generate a proof is ready + tmpLogger.Infof("All information to generate proof for batch %d is ready", virtualBatch.BatchNumber) + tmpLogger = tmpLogger.WithFields("batch", virtualBatch.BatchNumber) + + now := time.Now().Round(time.Microsecond) + proof := &state.Proof{ + BatchNumber: virtualBatch.BatchNumber, + BatchNumberFinal: virtualBatch.BatchNumber, + Prover: &proverName, + ProverID: &proverID, + GeneratingSince: &now, + } + + // Avoid other prover to process the same batch + err = a.storage.AddGeneratedProof(ctx, proof, nil) + if err != nil { + tmpLogger.Errorf("Failed to add batch proof to DB for batch %d, err: %v", virtualBatch.BatchNumber, err) + + return nil, nil, nil, err + } + + return stateBatch, witness, proof, nil +} + +func (a *Aggregator) tryGenerateBatchProof(ctx context.Context, prover ProverInterface) (bool, error) { + tmpLogger := a.logger.WithFields( + "prover", prover.Name(), + "proverId", prover.ID(), + "proverAddr", prover.Addr(), + ) + tmpLogger.Debug("tryGenerateBatchProof start") + + batchToProve, witness, proof, err0 := a.getAndLockBatchToProve(ctx, prover) + if errors.Is(err0, state.ErrNotFound) || errors.Is(err0, entities.ErrNotFound) { + // nothing to proof, swallow the error + tmpLogger.Debug("Nothing to generate proof") + return false, nil + } + if err0 != nil { + return false, err0 + } + + tmpLogger = tmpLogger.WithFields("batch", batchToProve.BatchNumber) + + var ( + genProofID *string + err error + ) + + defer func() { + if err != nil { + tmpLogger.Debug("Deleting proof in progress") + err2 := a.storage.DeleteGeneratedProofs(a.ctx, proof.BatchNumber, proof.BatchNumberFinal, nil) + if err2 != nil { + tmpLogger.Errorf("Failed to delete proof in progress, err: %v", err2) + } + } + tmpLogger.Debug("tryGenerateBatchProof end") + }() + + tmpLogger.Infof("Sending zki + batch to the prover, batchNumber [%d]", batchToProve.BatchNumber) + inputProver, err := a.buildInputProver(ctx, batchToProve, witness) + if err != nil { + err = fmt.Errorf("failed to build input prover, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + tmpLogger.Infof("Sending a batch to the prover. OldAccInputHash [%#x], L1InfoRoot [%#x]", + inputProver.PublicInputs.OldAccInputHash, inputProver.PublicInputs.L1InfoRoot) + + genProofID, err = prover.BatchProof(inputProver) + if err != nil { + err = fmt.Errorf("failed to get batch proof id, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + proof.ProofID = genProofID + + tmpLogger = tmpLogger.WithFields("proofId", *proof.ProofID) + + resGetProof, stateRoot, accInputHash, err := prover.WaitRecursiveProof(ctx, *proof.ProofID) + if err != nil { + err = fmt.Errorf("failed to get proof from prover, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + + tmpLogger.Info("Batch proof generated") + + // Sanity Check: state root from the proof must match the one from the batch + if a.cfg.BatchProofSanityCheckEnabled { + a.performSanityChecks(tmpLogger, stateRoot, accInputHash, batchToProve) + } + proof.Proof = resGetProof + + // NOTE(pg): the defer func is useless from now on, use a different variable + // name for errors (or shadow err in inner scopes) to not trigger it. + + finalProofBuilt, finalProofErr := a.tryBuildFinalProof(ctx, prover, proof) + if finalProofErr != nil { + // just log the error and continue to handle the generated proof + tmpLogger.Errorf("Error trying to build final proof: %v", finalProofErr) + } + + // NOTE(pg): prover is done, use a.ctx from now on + + if !finalProofBuilt { + proof.GeneratingSince = nil + + // final proof has not been generated, update the batch proof + err := a.storage.UpdateGeneratedProof(a.ctx, proof, nil) + if err != nil { + err = fmt.Errorf("failed to store batch proof result, %w", err) + tmpLogger.Error(FirstToUpper(err.Error())) + return false, err + } + } + + return true, nil +} + +func (a *Aggregator) performSanityChecks(tmpLogger *log.Logger, stateRoot, accInputHash common.Hash, + batchToProve *state.Batch) { + // Sanity Check: state root from the proof must match the one from the batch + if (stateRoot != common.Hash{}) && (stateRoot != batchToProve.StateRoot) { + for { + tmpLogger.Errorf("HALTING: "+ + "State root from the proof does not match the expected for batch %d: Proof = [%s] Expected = [%s]", + batchToProve.BatchNumber, stateRoot.String(), batchToProve.StateRoot.String(), + ) + time.Sleep(a.cfg.RetryTime.Duration) + } + } else { + tmpLogger.Infof("State root sanity check for batch %d passed", batchToProve.BatchNumber) + } + + // Sanity Check: acc input hash from the proof must match the one from the batch + if (accInputHash != common.Hash{}) && (accInputHash != batchToProve.AccInputHash) { + for { + tmpLogger.Errorf("HALTING: Acc input hash from the proof does not match the expected for "+ + "batch %d: Proof = [%s] Expected = [%s]", + batchToProve.BatchNumber, accInputHash.String(), batchToProve.AccInputHash.String(), + ) + time.Sleep(a.cfg.RetryTime.Duration) + } + } else { + tmpLogger.Infof("Acc input hash sanity check for batch %d passed", batchToProve.BatchNumber) + } +} + +// canVerifyProof returns true if we have reached the timeout to verify a proof +// and no other prover is verifying a proof (verifyingProof = false). +func (a *Aggregator) canVerifyProof() bool { + a.timeSendFinalProofMutex.RLock() + defer a.timeSendFinalProofMutex.RUnlock() + + return a.timeSendFinalProof.Before(time.Now()) && !a.verifyingProof +} + +// startProofVerification sets the verifyingProof variable to true +// to indicate that there is a proof verification in progress. +func (a *Aggregator) startProofVerification() { + a.timeSendFinalProofMutex.Lock() + defer a.timeSendFinalProofMutex.Unlock() + a.verifyingProof = true +} + +// endProofVerification set verifyingProof to false to indicate that there is not proof verification in progress +func (a *Aggregator) endProofVerification() { + a.timeSendFinalProofMutex.Lock() + defer a.timeSendFinalProofMutex.Unlock() + a.verifyingProof = false +} + +// resetVerifyProofTime updates the timeout to verify a proof. +func (a *Aggregator) resetVerifyProofTime() { + a.timeSendFinalProofMutex.Lock() + defer a.timeSendFinalProofMutex.Unlock() + a.timeSendFinalProof = time.Now().Add(a.cfg.VerifyProofInterval.Duration) +} + +func (a *Aggregator) buildInputProver( + ctx context.Context, batchToVerify *state.Batch, witness []byte, +) (*prover.StatelessInputProver, error) { + isForcedBatch := false + batchRawData := &state.BatchRawV2{} + var err error + + if batchToVerify.BatchNumber == 1 || batchToVerify.ForcedBatchNum != nil { + isForcedBatch = true + } else { + batchRawData, err = state.DecodeBatchV2(batchToVerify.BatchL2Data) + if err != nil { + a.logger.Errorf("Failed to decode batch data, err: %v", err) + return nil, err + } + } + + l1InfoTreeData := map[uint32]*prover.L1Data{} + forcedBlockhashL1 := common.Hash{} + l1InfoRoot := batchToVerify.L1InfoRoot.Bytes() + //nolint:gocritic + if !isForcedBatch { + tree, err := l1infotree.NewL1InfoTree(a.logger, 32, [][32]byte{}) //nolint:mnd + if err != nil { + return nil, err + } + + leaves, err := a.l1Syncr.GetLeafsByL1InfoRoot(ctx, batchToVerify.L1InfoRoot) + if err != nil && !errors.Is(err, entities.ErrNotFound) { + return nil, err + } + + aLeaves := make([][32]byte, len(leaves)) + for i, leaf := range leaves { + aLeaves[i] = l1infotree.HashLeafData( + leaf.GlobalExitRoot, + leaf.PreviousBlockHash, + uint64(leaf.Timestamp.Unix())) + } + + for _, l2blockRaw := range batchRawData.Blocks { + _, contained := l1InfoTreeData[l2blockRaw.IndexL1InfoTree] + if !contained && l2blockRaw.IndexL1InfoTree != 0 { + leaves, err := a.l1Syncr.GetL1InfoTreeLeaves(ctx, []uint32{l2blockRaw.IndexL1InfoTree}) + if err != nil { + a.logger.Errorf("Error getting l1InfoTreeLeaf: %v", err) + return nil, err + } + + l1InfoTreeLeaf := leaves[l2blockRaw.IndexL1InfoTree] + + // Calculate smt proof + a.logger.Infof("Calling tree.ComputeMerkleProof") + smtProof, calculatedL1InfoRoot, err := tree.ComputeMerkleProof(l2blockRaw.IndexL1InfoTree, aLeaves) + if err != nil { + a.logger.Errorf("Error computing merkle proof: %v", err) + return nil, err + } + + if batchToVerify.L1InfoRoot != calculatedL1InfoRoot { + return nil, fmt.Errorf( + "error: l1InfoRoot mismatch. L1InfoRoot: %s, calculatedL1InfoRoot: %s. l1InfoTreeIndex: %d", + batchToVerify.L1InfoRoot.String(), calculatedL1InfoRoot.String(), l2blockRaw.IndexL1InfoTree, + ) + } + + protoProof := make([][]byte, len(smtProof)) + + for i, proof := range smtProof { + tmpProof := proof + protoProof[i] = tmpProof[:] + } + + l1InfoTreeData[l2blockRaw.IndexL1InfoTree] = &prover.L1Data{ + GlobalExitRoot: l1InfoTreeLeaf.GlobalExitRoot.Bytes(), + BlockhashL1: l1InfoTreeLeaf.PreviousBlockHash.Bytes(), + MinTimestamp: uint32(l1InfoTreeLeaf.Timestamp.Unix()), + SmtProof: protoProof, + } + } + } + } else { + // Initial batch must be handled differently + if batchToVerify.BatchNumber == 1 { + virtualBatch, err := a.l1Syncr.GetVirtualBatchByBatchNumber(ctx, batchToVerify.BatchNumber) + if err != nil { + a.logger.Errorf("Error getting virtual batch: %v", err) + return nil, err + } + l1Block, err := a.l1Syncr.GetL1BlockByNumber(ctx, virtualBatch.BlockNumber) + if err != nil { + a.logger.Errorf("Error getting l1 block: %v", err) + return nil, err + } + + forcedBlockhashL1 = l1Block.ParentHash + l1InfoRoot = batchToVerify.GlobalExitRoot.Bytes() + } + } + + // Ensure the old acc input hash is in memory + oldAccInputHash := a.getAccInputHash(batchToVerify.BatchNumber - 1) + if oldAccInputHash == (common.Hash{}) && batchToVerify.BatchNumber > 1 { + a.logger.Warnf("AccInputHash for previous batch (%d) is not in memory. Waiting ...", batchToVerify.BatchNumber-1) + return nil, fmt.Errorf("acc input hash for previous batch (%d) is not in memory", batchToVerify.BatchNumber-1) + } + + inputProver := &prover.StatelessInputProver{ + PublicInputs: &prover.StatelessPublicInputs{ + Witness: witness, + OldAccInputHash: oldAccInputHash.Bytes(), + OldBatchNum: batchToVerify.BatchNumber - 1, + ChainId: batchToVerify.ChainID, + ForkId: batchToVerify.ForkID, + BatchL2Data: batchToVerify.BatchL2Data, + L1InfoRoot: l1InfoRoot, + TimestampLimit: uint64(batchToVerify.Timestamp.Unix()), + SequencerAddr: batchToVerify.Coinbase.String(), + AggregatorAddr: a.cfg.SenderAddress, + L1InfoTreeData: l1InfoTreeData, + ForcedBlockhashL1: forcedBlockhashL1.Bytes(), + }, + } + + printInputProver(a.logger, inputProver) + return inputProver, nil +} + +func printInputProver(logger *log.Logger, inputProver *prover.StatelessInputProver) { + if !logger.IsEnabledLogLevel(zapcore.DebugLevel) { + return + } + + logger.Debugf("Witness length: %v", len(inputProver.PublicInputs.Witness)) + logger.Debugf("BatchL2Data length: %v", len(inputProver.PublicInputs.BatchL2Data)) + logger.Debugf("OldAccInputHash: %v", common.BytesToHash(inputProver.PublicInputs.OldAccInputHash)) + logger.Debugf("L1InfoRoot: %v", common.BytesToHash(inputProver.PublicInputs.L1InfoRoot)) + logger.Debugf("TimestampLimit: %v", inputProver.PublicInputs.TimestampLimit) + logger.Debugf("SequencerAddr: %v", inputProver.PublicInputs.SequencerAddr) + logger.Debugf("AggregatorAddr: %v", inputProver.PublicInputs.AggregatorAddr) + logger.Debugf("L1InfoTreeData: %+v", inputProver.PublicInputs.L1InfoTreeData) + logger.Debugf("ForcedBlockhashL1: %v", common.BytesToHash(inputProver.PublicInputs.ForcedBlockhashL1)) +} + +// healthChecker will provide an implementation of the HealthCheck interface. +type healthChecker struct{} + +// newHealthChecker returns a health checker according to standard package +// grpc.health.v1. +func newHealthChecker() *healthChecker { + return &healthChecker{} +} + +// HealthCheck interface implementation. + +// Check returns the current status of the server for unary gRPC health requests, +// for now if the server is up and able to respond we will always return SERVING. +func (hc *healthChecker) Check( + ctx context.Context, req *grpchealth.HealthCheckRequest, +) (*grpchealth.HealthCheckResponse, error) { + log.Info("Serving the Check request for health check") + + return &grpchealth.HealthCheckResponse{ + Status: grpchealth.HealthCheckResponse_SERVING, + }, nil +} + +// Watch returns the current status of the server for stream gRPC health requests, +// for now if the server is up and able to respond we will always return SERVING. +func (hc *healthChecker) Watch(req *grpchealth.HealthCheckRequest, server grpchealth.Health_WatchServer) error { + log.Info("Serving the Watch request for health check") + + return server.Send(&grpchealth.HealthCheckResponse{ + Status: grpchealth.HealthCheckResponse_SERVING, + }) +} + +func (a *Aggregator) handleMonitoredTxResult(result ethtxtypes.MonitoredTxResult, firstBatch, lastBatch uint64) { + mTxResultLogger := ethtxmanager.CreateMonitoredTxResultLogger(result) + if result.Status == ethtxtypes.MonitoredTxStatusFailed { + mTxResultLogger.Fatal("failed to send batch verification, TODO: review this fatal and define what to do in this case") + } + + // Wait for the transaction to be finalized, then we can safely delete all recursive + // proofs up to the last batch in this proof + + finaLizedBlockNumber, err := l1_check_block.L1FinalizedFetch.BlockNumber(a.ctx, a.etherman) + if err != nil { + mTxResultLogger.Errorf("failed to get finalized block number: %v", err) + } + + for result.MinedAtBlockNumber.Uint64() > finaLizedBlockNumber { + select { + case <-a.ctx.Done(): + return + case <-time.After(a.cfg.RetryTime.Duration): + finaLizedBlockNumber, err = l1_check_block.L1FinalizedFetch.BlockNumber(a.ctx, a.etherman) + if err != nil { + mTxResultLogger.Errorf("failed to get finalized block number: %v", err) + } + } + } + + err = a.storage.DeleteGeneratedProofs(a.ctx, firstBatch, lastBatch, nil) + if err != nil { + mTxResultLogger.Errorf("failed to delete generated proofs from %d to %d: %v", firstBatch, lastBatch, err) + } + + mTxResultLogger.Debugf("deleted generated proofs from %d to %d", firstBatch, lastBatch) + + // Remove the acc input hashes from the map + // leaving the last batch acc input hash as it will be used as old acc input hash + a.removeAccInputHashes(firstBatch, lastBatch-1) +} + +func (a *Aggregator) cleanupLockedProofs() { + for { + select { + case <-a.ctx.Done(): + return + case <-time.After(a.timeCleanupLockedProofs.Duration): + n, err := a.storage.CleanupLockedProofs(a.ctx, a.cfg.GeneratingProofCleanupThreshold, nil) + if err != nil { + a.logger.Errorf("Failed to cleanup locked proofs: %v", err) + } + if n == 1 { + a.logger.Warn("Found a stale proof and removed from cache") + } else if n > 1 { + a.logger.Warnf("Found %d stale proofs and removed from cache", n) + } + } + } +} + +// FirstToUpper returns the string passed as argument with the first letter in +// uppercase. +func FirstToUpper(s string) string { + runes := []rune(s) + runes[0] = unicode.ToUpper(runes[0]) + + return string(runes) +} diff --git a/aggregator/aggregator_test.go b/aggregator/aggregator_test.go new file mode 100644 index 00000000..8b2aa808 --- /dev/null +++ b/aggregator/aggregator_test.go @@ -0,0 +1,1921 @@ +package aggregator + +import ( + "bytes" + "context" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "database/sql" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "math/big" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/0xPolygonHermez/zkevm-synchronizer-l1/synchronizer" + "github.com/agglayer/aggkit/agglayer" + mocks "github.com/agglayer/aggkit/aggregator/mocks" + "github.com/agglayer/aggkit/aggregator/prover" + "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/log" + rpctypes "github.com/agglayer/aggkit/rpc/types" + "github.com/agglayer/aggkit/state" + "github.com/ethereum/go-ethereum/common" + ethTypes "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +var ( + proofID = "proofId" + proof = "proof" + proverName = "proverName" + proverID = "proverID" +) + +const ( + ownerProver = "prover" + ownerAggregator = "aggregator" + + // changeL2Block + deltaTimeStamp + indexL1InfoTree + codedL2BlockHeader = "0b73e6af6f00000001" + // 2 x [ tx coded in RLP + r,s,v,efficiencyPercentage] + codedRLP2Txs1 = "ee02843b9aca00830186a0944d5cf5032b2a844602278b01199ed191a86c93ff88016345785d8a0000808203e88080bff0e780ba7db409339fd3f71969fa2cbf1b8535f6c725a1499d3318d3ef9c2b6340ddfab84add2c188f9efddb99771db1fe621c981846394ea4f035c85bcdd51bffee03843b9aca00830186a0944d5cf5032b2a844602278b01199ed191a86c93ff88016345785d8a0000808203e880805b346aa02230b22e62f73608de9ff39a162a6c24be9822209c770e3685b92d0756d5316ef954eefc58b068231ccea001fb7ac763ebe03afd009ad71cab36861e1bff" + codedL2Block1 = codedL2BlockHeader + codedRLP2Txs1 +) + +type mox struct { + storageMock *mocks.StorageInterfaceMock + ethTxManager *mocks.EthTxManagerClientMock + etherman *mocks.EthermanMock + proverMock *mocks.ProverInterfaceMock + aggLayerClientMock *agglayer.AgglayerClientMock + synchronizerMock *mocks.SynchronizerInterfaceMock + rpcMock *mocks.RPCInterfaceMock + txerMock *mocks.TxerMock +} + +func WaitUntil(t *testing.T, wg *sync.WaitGroup, timeout time.Duration) { + t.Helper() + + done := make(chan struct{}) + go func() { + wg.Wait() + close(done) + }() + + select { + case <-done: + case <-time.After(timeout): + t.Fatalf("WaitGroup not done, test time expired after %s", timeout) + } +} + +func Test_Start(t *testing.T) { + mockStorage := new(mocks.StorageInterfaceMock) + mockL1Syncr := new(mocks.SynchronizerInterfaceMock) + mockEtherman := new(mocks.EthermanMock) + mockEthTxManager := new(mocks.EthTxManagerClientMock) + + mockL1Syncr.On("Sync", mock.Anything).Return(nil) + mockEtherman.On("GetLatestVerifiedBatchNum").Return(uint64(90), nil).Once() + mockEtherman.On("GetBatchAccInputHash", mock.Anything, uint64(90)).Return(common.Hash{}, nil).Once() + mockStorage.On("DeleteGeneratedProofs", mock.Anything, uint64(90), mock.Anything, nil).Return(nil).Once() + mockStorage.On("CleanupLockedProofs", mock.Anything, "", nil).Return(int64(0), nil) + + mockEthTxManager.On("Start").Return(nil) + + ctx := context.Background() + a := &Aggregator{ + storage: mockStorage, + logger: log.GetDefaultLogger(), + halted: atomic.Bool{}, + l1Syncr: mockL1Syncr, + etherman: mockEtherman, + ethTxManager: mockEthTxManager, + ctx: ctx, + storageMutex: &sync.Mutex{}, + timeSendFinalProofMutex: &sync.RWMutex{}, + timeCleanupLockedProofs: types.Duration{Duration: 5 * time.Second}, + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + go func() { + err := a.Start() + require.NoError(t, err) + }() + time.Sleep(time.Second) + a.ctx.Done() + time.Sleep(time.Second) +} + +func Test_handleReorg(t *testing.T) { + t.Parallel() + + mockL1Syncr := new(mocks.SynchronizerInterfaceMock) + mockStorage := new(mocks.StorageInterfaceMock) + reorgData := synchronizer.ReorgExecutionResult{} + + a := &Aggregator{ + l1Syncr: mockL1Syncr, + storage: mockStorage, + logger: log.GetDefaultLogger(), + halted: atomic.Bool{}, + ctx: context.Background(), + } + + mockL1Syncr.On("GetLastestVirtualBatchNumber", mock.Anything).Return(uint64(100), nil).Once() + mockStorage.On("DeleteGeneratedProofs", mock.Anything, mock.Anything, mock.Anything, nil).Return(nil).Once() + mockStorage.On("DeleteUngeneratedProofs", mock.Anything, nil).Return(nil).Once() + + go a.handleReorg(reorgData) + time.Sleep(3 * time.Second) + + assert.True(t, a.halted.Load()) + mockStorage.AssertExpectations(t) + mockL1Syncr.AssertExpectations(t) +} + +func Test_handleRollbackBatches(t *testing.T) { + t.Parallel() + + mockEtherman := new(mocks.EthermanMock) + mockStorage := new(mocks.StorageInterfaceMock) + + // Test data + rollbackData := synchronizer.RollbackBatchesData{ + LastBatchNumber: 100, + } + + mockEtherman.On("GetLatestVerifiedBatchNum").Return(uint64(90), nil).Once() + mockEtherman.On("GetBatchAccInputHash", mock.Anything, uint64(90)).Return(common.Hash{}, nil).Once() + mockStorage.On("DeleteUngeneratedProofs", mock.Anything, mock.Anything).Return(nil).Once() + mockStorage.On("DeleteGeneratedProofs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() + + a := Aggregator{ + ctx: context.Background(), + etherman: mockEtherman, + storage: mockStorage, + logger: log.GetDefaultLogger(), + halted: atomic.Bool{}, + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + + a.halted.Store(false) + a.handleRollbackBatches(rollbackData) + + assert.False(t, a.halted.Load()) + mockEtherman.AssertExpectations(t) + mockStorage.AssertExpectations(t) +} + +func Test_handleRollbackBatchesHalt(t *testing.T) { + t.Parallel() + + mockEtherman := new(mocks.EthermanMock) + mockStorage := new(mocks.StorageInterfaceMock) + + mockEtherman.On("GetLatestVerifiedBatchNum").Return(uint64(110), nil).Once() + mockStorage.On("DeleteUngeneratedProofs", mock.Anything, mock.Anything).Return(nil).Once() + mockStorage.On("DeleteGeneratedProofs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() + + // Test data + rollbackData := synchronizer.RollbackBatchesData{ + LastBatchNumber: 100, + } + + a := Aggregator{ + ctx: context.Background(), + etherman: mockEtherman, + storage: mockStorage, + logger: log.GetDefaultLogger(), + halted: atomic.Bool{}, + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + + a.halted.Store(false) + go a.handleRollbackBatches(rollbackData) + time.Sleep(3 * time.Second) + + assert.True(t, a.halted.Load()) + mockEtherman.AssertExpectations(t) +} + +func Test_handleRollbackBatchesError(t *testing.T) { + t.Parallel() + + mockEtherman := new(mocks.EthermanMock) + mockStorage := new(mocks.StorageInterfaceMock) + + mockEtherman.On("GetLatestVerifiedBatchNum").Return(uint64(110), fmt.Errorf("error")).Once() + + // Test data + rollbackData := synchronizer.RollbackBatchesData{ + LastBatchNumber: 100, + } + + a := Aggregator{ + ctx: context.Background(), + etherman: mockEtherman, + storage: mockStorage, + logger: log.GetDefaultLogger(), + halted: atomic.Bool{}, + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + + a.halted.Store(false) + go a.handleRollbackBatches(rollbackData) + time.Sleep(3 * time.Second) + + assert.True(t, a.halted.Load()) + mockEtherman.AssertExpectations(t) +} + +func Test_sendFinalProofSuccess(t *testing.T) { + require := require.New(t) + assert := assert.New(t) + batchNum := uint64(23) + batchNumFinal := uint64(42) + + recursiveProof := &state.Proof{ + Prover: &proverName, + ProverID: &proverID, + ProofID: &proofID, + BatchNumber: batchNum, + BatchNumberFinal: batchNumFinal, + } + finalProof := &prover.FinalProof{} + + testCases := []struct { + name string + setup func(m mox, a *Aggregator) + asserts func(a *Aggregator) + }{ + { + name: "Successfully settled on Agglayer", + setup: func(m mox, a *Aggregator) { + cfg := Config{ + SettlementBackend: AggLayer, + AggLayerTxTimeout: types.Duration{Duration: time.Millisecond * 1}, + } + a.cfg = cfg + + batch := rpctypes.NewRPCBatch(batchNumFinal, common.Hash{}, []string{}, []byte{}, common.Hash{}, common.Hash{}, common.Hash{}, common.Address{}, false) + m.rpcMock.On("GetBatch", batchNumFinal).Return(batch, nil) + + m.etherman.On("GetRollupId").Return(uint32(1)).Once() + testHash := common.BytesToHash([]byte("test hash")) + m.aggLayerClientMock.On("SendTx", mock.Anything).Return(testHash, nil) + m.aggLayerClientMock.On("WaitTxToBeMined", testHash, mock.Anything).Return(nil) + }, + asserts: func(a *Aggregator) { + assert.False(a.verifyingProof) + }, + }, + { + name: "Successfully settled on L1 (Direct)", + setup: func(m mox, a *Aggregator) { + senderAddr := common.BytesToAddress([]byte("sender address")).Hex() + toAddr := common.BytesToAddress([]byte("to address")) + data := []byte("data") + cfg := Config{ + SettlementBackend: L1, + SenderAddress: senderAddr, + GasOffset: uint64(10), + } + a.cfg = cfg + + batch := rpctypes.NewRPCBatch(batchNumFinal, common.Hash{}, []string{}, []byte{}, common.Hash{}, common.Hash{}, common.Hash{}, common.Address{}, false) + m.rpcMock.On("GetBatch", batchNumFinal).Return(batch, nil) + + m.etherman.On("BuildTrustedVerifyBatchesTxData", batchNum-1, batchNumFinal, mock.Anything, common.HexToAddress(senderAddr)).Return(&toAddr, data, nil).Once() + m.ethTxManager.On("Add", mock.Anything, &toAddr, big.NewInt(0), data, a.cfg.GasOffset, (*ethTypes.BlobTxSidecar)(nil)).Return(nil, nil).Once() + m.ethTxManager.On("ProcessPendingMonitoredTxs", mock.Anything, mock.Anything).Once() + }, + asserts: func(a *Aggregator) { + assert.False(a.verifyingProof) + }, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + storageMock := mocks.NewStorageInterfaceMock(t) + ethTxManager := mocks.NewEthTxManagerClientMock(t) + etherman := mocks.NewEthermanMock(t) + aggLayerClient := agglayer.NewAgglayerClientMock(t) + rpcMock := mocks.NewRPCInterfaceMock(t) + + curve := elliptic.P256() + privateKey, err := ecdsa.GenerateKey(curve, rand.Reader) + require.NoError(err, "error generating key") + + a := Aggregator{ + storage: storageMock, + etherman: etherman, + ethTxManager: ethTxManager, + aggLayerClient: aggLayerClient, + finalProof: make(chan finalProofMsg), + logger: log.GetDefaultLogger(), + verifyingProof: false, + storageMutex: &sync.Mutex{}, + timeSendFinalProofMutex: &sync.RWMutex{}, + sequencerPrivateKey: privateKey, + rpcClient: rpcMock, + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + a.ctx, a.exit = context.WithCancel(context.Background()) + + m := mox{ + storageMock: storageMock, + ethTxManager: ethTxManager, + etherman: etherman, + aggLayerClientMock: aggLayerClient, + rpcMock: rpcMock, + } + if tc.setup != nil { + tc.setup(m, &a) + } + // send a final proof over the channel + go func() { + finalMsg := finalProofMsg{ + proverID: proverID, + recursiveProof: recursiveProof, + finalProof: finalProof, + } + a.finalProof <- finalMsg + time.Sleep(1 * time.Second) + a.exit() + }() + + a.sendFinalProof() + if tc.asserts != nil { + tc.asserts(&a) + } + }) + } +} + +func Test_sendFinalProofError(t *testing.T) { + require := require.New(t) + assert := assert.New(t) + errTest := errors.New("test error") + batchNum := uint64(23) + batchNumFinal := uint64(42) + sender := common.BytesToAddress([]byte("SenderAddress")) + senderAddr := sender.Hex() + + recursiveProof := &state.Proof{ + Prover: &proverName, + ProverID: &proverID, + ProofID: &proofID, + BatchNumber: batchNum, + BatchNumberFinal: batchNumFinal, + } + finalProof := &prover.FinalProof{} + + testCases := []struct { + name string + setup func(mox, *Aggregator) + asserts func(*Aggregator) + }{ + { + name: "Failed to settle on Agglayer: GetBatch error", + setup: func(m mox, a *Aggregator) { + m.rpcMock.On("GetBatch", batchNumFinal).Run(func(args mock.Arguments) { + // test is done, stop the sendFinalProof method + fmt.Println("Stopping sendFinalProof") + a.exit() + }).Return(nil, errTest).Once() + }, + asserts: func(a *Aggregator) { + assert.False(a.verifyingProof) + }, + }, + { + name: "Failed to settle on Agglayer: SendTx error", + setup: func(m mox, a *Aggregator) { + cfg := Config{ + SettlementBackend: AggLayer, + } + a.cfg = cfg + + batch := rpctypes.NewRPCBatch(batchNumFinal, common.Hash{}, []string{}, []byte{}, common.Hash{}, common.Hash{}, common.Hash{}, common.Address{}, false) + m.rpcMock.On("GetBatch", batchNumFinal).Return(batch, nil) + + m.etherman.On("GetRollupId").Return(uint32(1)).Once() + m.aggLayerClientMock.On("SendTx", mock.Anything).Run(func(args mock.Arguments) { + // test is done, stop the sendFinalProof method + fmt.Println("Stopping sendFinalProof") + a.exit() + }).Return(nil, errTest).Once() + m.storageMock.On("UpdateGeneratedProof", mock.Anything, mock.Anything, nil).Return(nil).Once() + }, + asserts: func(a *Aggregator) { + assert.False(a.verifyingProof) + }, + }, + { + name: "Failed to settle on Agglayer: WaitTxToBeMined error", + setup: func(m mox, a *Aggregator) { + cfg := Config{ + SettlementBackend: AggLayer, + AggLayerTxTimeout: types.Duration{Duration: time.Millisecond * 1}, + } + a.cfg = cfg + + batch := rpctypes.NewRPCBatch(batchNumFinal, common.Hash{}, []string{}, []byte{}, common.Hash{}, common.Hash{}, common.Hash{}, common.Address{}, false) + m.rpcMock.On("GetBatch", batchNumFinal).Return(batch, nil) + + m.etherman.On("GetRollupId").Return(uint32(1)).Once() + m.aggLayerClientMock.On("SendTx", mock.Anything).Return(common.Hash{}, nil).Once() + m.aggLayerClientMock.On("WaitTxToBeMined", mock.Anything, mock.Anything).Run(func(args mock.Arguments) { + fmt.Println("Stopping sendFinalProof") + a.exit() + }).Return(errTest) + m.storageMock.On("UpdateGeneratedProof", mock.Anything, mock.Anything, nil).Return(nil).Once() + }, + asserts: func(a *Aggregator) { + assert.False(a.verifyingProof) + }, + }, + { + name: "Failed to settle on L1 (Direct): BuildTrustedVerifyBatchesTxData error", + setup: func(m mox, a *Aggregator) { + cfg := Config{ + SettlementBackend: L1, + SenderAddress: senderAddr, + } + a.cfg = cfg + + batch := rpctypes.NewRPCBatch(batchNumFinal, common.Hash{}, []string{}, []byte{}, common.Hash{}, common.Hash{}, common.Hash{}, common.Address{}, false) + m.rpcMock.On("GetBatch", batchNumFinal).Return(batch, nil) + + m.etherman.On("BuildTrustedVerifyBatchesTxData", batchNum-1, batchNumFinal, mock.Anything, sender).Run(func(args mock.Arguments) { + fmt.Println("Stopping sendFinalProof") + a.exit() + }).Return(nil, nil, errTest) + m.storageMock.On("UpdateGeneratedProof", mock.Anything, recursiveProof, nil).Return(nil).Once() + }, + asserts: func(a *Aggregator) { + assert.False(a.verifyingProof) + }, + }, + { + name: "Failed to settle on L1 (Direct): Error Adding TX to ethTxManager", + setup: func(m mox, a *Aggregator) { + cfg := Config{ + SettlementBackend: L1, + SenderAddress: senderAddr, + GasOffset: uint64(10), + } + a.cfg = cfg + + batch := rpctypes.NewRPCBatch(batchNumFinal, common.Hash{}, []string{}, []byte{}, common.Hash{}, common.Hash{}, common.Hash{}, common.Address{}, false) + m.rpcMock.On("GetBatch", batchNumFinal).Return(batch, nil) + + m.etherman.On("BuildTrustedVerifyBatchesTxData", batchNum-1, batchNumFinal, mock.Anything, sender).Return(nil, nil, nil).Once() + m.ethTxManager.On("Add", mock.Anything, mock.Anything, big.NewInt(0), mock.Anything, a.cfg.GasOffset, (*ethTypes.BlobTxSidecar)(nil)).Run(func(args mock.Arguments) { + fmt.Println("Stopping sendFinalProof") + a.exit() + }).Return(nil, errTest).Once() + m.storageMock.On("UpdateGeneratedProof", mock.Anything, recursiveProof, nil).Return(nil).Once() + }, + asserts: func(a *Aggregator) { + assert.False(a.verifyingProof) + }, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + storageMock := mocks.NewStorageInterfaceMock(t) + ethTxManager := mocks.NewEthTxManagerClientMock(t) + etherman := mocks.NewEthermanMock(t) + aggLayerClient := agglayer.NewAgglayerClientMock(t) + rpcMock := mocks.NewRPCInterfaceMock(t) + + curve := elliptic.P256() + privateKey, err := ecdsa.GenerateKey(curve, rand.Reader) + require.NoError(err, "error generating key") + + a := Aggregator{ + storage: storageMock, + etherman: etherman, + ethTxManager: ethTxManager, + aggLayerClient: aggLayerClient, + finalProof: make(chan finalProofMsg), + logger: log.GetDefaultLogger(), + verifyingProof: false, + storageMutex: &sync.Mutex{}, + timeSendFinalProofMutex: &sync.RWMutex{}, + sequencerPrivateKey: privateKey, + rpcClient: rpcMock, + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + a.ctx, a.exit = context.WithCancel(context.Background()) + + m := mox{ + storageMock: storageMock, + ethTxManager: ethTxManager, + etherman: etherman, + aggLayerClientMock: aggLayerClient, + rpcMock: rpcMock, + } + if tc.setup != nil { + tc.setup(m, &a) + } + // send a final proof over the channel + go func() { + finalMsg := finalProofMsg{ + proverID: proverID, + recursiveProof: recursiveProof, + finalProof: finalProof, + } + a.finalProof <- finalMsg + }() + + a.sendFinalProof() + if tc.asserts != nil { + tc.asserts(&a) + } + }) + } +} + +func Test_buildFinalProof(t *testing.T) { + assert := assert.New(t) + batchNum := uint64(23) + batchNumFinal := uint64(42) + recursiveProof := &state.Proof{ + ProverID: &proverID, + Proof: "test proof", + ProofID: &proofID, + BatchNumber: batchNum, + BatchNumberFinal: batchNumFinal, + } + finalProofID := "finalProofID" + + testCases := []struct { + name string + setup func(mox, *Aggregator) + asserts func(err error, fProof *prover.FinalProof) + }{ + { + name: "using real prover", + setup: func(m mox, a *Aggregator) { + finalProof := prover.FinalProof{ + Public: &prover.PublicInputsExtended{ + NewStateRoot: []byte("StateRoot"), + NewLocalExitRoot: []byte("LocalExitRoot"), + }, + } + + m.proverMock.On("Name").Return("name").Once() + m.proverMock.On("ID").Return("id").Once() + m.proverMock.On("Addr").Return("addr").Once() + m.proverMock.On("FinalProof", recursiveProof.Proof, a.cfg.SenderAddress).Return(&finalProofID, nil).Once() + m.proverMock.On("WaitFinalProof", mock.Anything, finalProofID).Return(&finalProof, nil).Once() + }, + asserts: func(err error, fProof *prover.FinalProof) { + assert.NoError(err) + assert.True(bytes.Equal([]byte("StateRoot"), fProof.Public.NewStateRoot), "State roots should be equal") + assert.True(bytes.Equal([]byte("LocalExitRoot"), fProof.Public.NewLocalExitRoot), "LocalExit roots should be equal") + }, + }, + { + name: "using mock prover", + setup: func(m mox, a *Aggregator) { + finalProof := prover.FinalProof{ + Public: &prover.PublicInputsExtended{ + NewStateRoot: []byte(mockedStateRoot), + NewLocalExitRoot: []byte(mockedLocalExitRoot), + }, + } + + m.proverMock.On("Name").Return("name").Once() + m.proverMock.On("ID").Return("id").Once() + m.proverMock.On("Addr").Return("addr").Once() + m.proverMock.On("FinalProof", recursiveProof.Proof, a.cfg.SenderAddress).Return(&finalProofID, nil).Once() + m.proverMock.On("WaitFinalProof", mock.Anything, finalProofID).Return(&finalProof, nil).Once() + finalBatch := rpctypes.NewRPCBatch(batchNumFinal, common.Hash{}, []string{}, []byte{}, common.Hash{}, common.BytesToHash([]byte("mock LocalExitRoot")), common.BytesToHash([]byte("mock StateRoot")), common.Address{}, false) + m.rpcMock.On("GetBatch", batchNumFinal).Return(finalBatch, nil).Once() + }, + asserts: func(err error, fProof *prover.FinalProof) { + assert.NoError(err) + expStateRoot := common.BytesToHash([]byte("mock StateRoot")) + expLocalExitRoot := common.BytesToHash([]byte("mock LocalExitRoot")) + assert.True(bytes.Equal(expStateRoot.Bytes(), fProof.Public.NewStateRoot), "State roots should be equal") + assert.True(bytes.Equal(expLocalExitRoot.Bytes(), fProof.Public.NewLocalExitRoot), "LocalExit roots should be equal") + }, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + proverMock := mocks.NewProverInterfaceMock(t) + storageMock := mocks.NewStorageInterfaceMock(t) + rpcMock := mocks.NewRPCInterfaceMock(t) + m := mox{ + proverMock: proverMock, + storageMock: storageMock, + rpcMock: rpcMock, + } + a := Aggregator{ + storage: storageMock, + logger: log.GetDefaultLogger(), + cfg: Config{ + SenderAddress: common.BytesToAddress([]byte("from")).Hex(), + }, + rpcClient: rpcMock, + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + + tc.setup(m, &a) + fProof, err := a.buildFinalProof(context.Background(), proverMock, recursiveProof) + tc.asserts(err, fProof) + }) + } +} + +func Test_tryBuildFinalProof(t *testing.T) { + assert := assert.New(t) + errTest := errors.New("test error") + from := common.BytesToAddress([]byte("from")) + cfg := Config{ + VerifyProofInterval: types.Duration{Duration: time.Millisecond * 1}, + SenderAddress: from.Hex(), + } + latestVerifiedBatchNum := uint64(22) + batchNum := uint64(23) + batchNumFinal := uint64(42) + finalProofID := "finalProofID" + finalProof := prover.FinalProof{ + Proof: "", + Public: &prover.PublicInputsExtended{ + NewStateRoot: []byte("newStateRoot"), + NewLocalExitRoot: []byte("newLocalExitRoot"), + }, + } + proofToVerify := state.Proof{ + ProofID: &proofID, + Proof: proof, + BatchNumber: batchNum, + BatchNumberFinal: batchNumFinal, + } + invalidProof := state.Proof{ + ProofID: &proofID, + Proof: proof, + BatchNumber: uint64(123), + BatchNumberFinal: uint64(456), + } + + proverCtx := context.WithValue(context.Background(), "owner", ownerProver) //nolint:staticcheck + matchProverCtxFn := func(ctx context.Context) bool { return ctx.Value("owner") == ownerProver } + matchAggregatorCtxFn := func(ctx context.Context) bool { return ctx.Value("owner") == ownerAggregator } + testCases := []struct { + name string + proof *state.Proof + setup func(mox, *Aggregator) + asserts func(bool, *Aggregator, error) + assertFinalMsg func(*finalProofMsg) + }{ + { + name: "can't verify proof (verifyingProof = true)", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Once() + m.proverMock.On("ID").Return(proverID).Once() + m.proverMock.On("Addr").Return("addr").Once() + a.verifyingProof = true + }, + asserts: func(result bool, a *Aggregator, err error) { + a.verifyingProof = false // reset + assert.False(result) + assert.NoError(err) + }, + }, + { + name: "can't verify proof (veryfy time not reached yet)", + setup: func(m mox, a *Aggregator) { + a.timeSendFinalProof = time.Now().Add(10 * time.Second) + m.proverMock.On("Name").Return(proverName).Once() + m.proverMock.On("ID").Return(proverID).Once() + m.proverMock.On("Addr").Return("addr").Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.NoError(err) + }, + }, + { + name: "nil proof, error requesting the proof triggers defer", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr").Twice() + m.etherman.On("GetLatestVerifiedBatchNum").Return(latestVerifiedBatchNum, nil).Once() + m.storageMock.On("GetProofReadyToVerify", mock.MatchedBy(matchProverCtxFn), latestVerifiedBatchNum, nil).Return(&proofToVerify, nil).Once() + proofGeneratingTrueCall := m.storageMock.On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proofToVerify, nil).Return(nil).Once() + m.proverMock.On("FinalProof", proofToVerify.Proof, from.String()).Return(nil, errTest).Once() + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proofToVerify, nil). + Return(nil). + Once(). + NotBefore(proofGeneratingTrueCall) + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "nil proof, error building the proof triggers defer", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr").Twice() + m.etherman.On("GetLatestVerifiedBatchNum").Return(latestVerifiedBatchNum, nil).Once() + m.storageMock.On("GetProofReadyToVerify", mock.MatchedBy(matchProverCtxFn), latestVerifiedBatchNum, nil).Return(&proofToVerify, nil).Once() + proofGeneratingTrueCall := m.storageMock.On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proofToVerify, nil).Return(nil).Once() + m.proverMock.On("FinalProof", proofToVerify.Proof, from.String()).Return(&finalProofID, nil).Once() + m.proverMock.On("WaitFinalProof", mock.MatchedBy(matchProverCtxFn), finalProofID).Return(nil, errTest).Once() + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proofToVerify, nil). + Return(nil). + Once(). + NotBefore(proofGeneratingTrueCall) + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "nil proof, generic error from GetProofReadyToVerify", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Once() + m.proverMock.On("ID").Return(proverID).Once() + m.proverMock.On("Addr").Return(proverID).Once() + m.etherman.On("GetLatestVerifiedBatchNum").Return(latestVerifiedBatchNum, nil).Once() + m.storageMock.On("GetProofReadyToVerify", mock.MatchedBy(matchProverCtxFn), latestVerifiedBatchNum, nil).Return(nil, errTest).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "nil proof, ErrNotFound from GetProofReadyToVerify", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Once() + m.proverMock.On("ID").Return(proverID).Once() + m.proverMock.On("Addr").Return(proverID).Once() + m.etherman.On("GetLatestVerifiedBatchNum").Return(latestVerifiedBatchNum, nil).Once() + m.storageMock.On("GetProofReadyToVerify", mock.MatchedBy(matchProverCtxFn), latestVerifiedBatchNum, nil).Return(nil, state.ErrNotFound).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.NoError(err) + }, + }, + { + name: "nil proof gets a proof ready to verify", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return(proverID).Twice() + m.etherman.On("GetLatestVerifiedBatchNum").Return(latestVerifiedBatchNum, nil).Once() + m.storageMock.On("GetProofReadyToVerify", mock.MatchedBy(matchProverCtxFn), latestVerifiedBatchNum, nil).Return(&proofToVerify, nil).Once() + m.storageMock.On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proofToVerify, nil).Return(nil).Once() + m.proverMock.On("FinalProof", proofToVerify.Proof, from.String()).Return(&finalProofID, nil).Once() + m.proverMock.On("WaitFinalProof", mock.MatchedBy(matchProverCtxFn), finalProofID).Return(&finalProof, nil).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.True(result) + assert.NoError(err) + }, + assertFinalMsg: func(msg *finalProofMsg) { + assert.Equal(finalProof.Proof, msg.finalProof.Proof) + assert.Equal(finalProof.Public.NewStateRoot, msg.finalProof.Public.NewStateRoot) + assert.Equal(finalProof.Public.NewLocalExitRoot, msg.finalProof.Public.NewLocalExitRoot) + }, + }, + { + name: "error checking if proof is a complete sequence", + proof: &proofToVerify, + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Once() + m.proverMock.On("ID").Return(proverID).Once() + m.proverMock.On("Addr").Return(proverID).Once() + m.etherman.On("GetLatestVerifiedBatchNum").Return(latestVerifiedBatchNum, nil).Once() + m.storageMock.On("CheckProofContainsCompleteSequences", mock.MatchedBy(matchProverCtxFn), &proofToVerify, nil).Return(false, errTest).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "invalid proof (not consecutive to latest verified batch) rejected", + proof: &invalidProof, + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Once() + m.proverMock.On("ID").Return(proverID).Once() + m.proverMock.On("Addr").Return(proverID).Once() + m.etherman.On("GetLatestVerifiedBatchNum").Return(latestVerifiedBatchNum, nil).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.NoError(err) + }, + }, + { + name: "invalid proof (not a complete sequence) rejected", + proof: &proofToVerify, + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Once() + m.proverMock.On("ID").Return(proverID).Once() + m.proverMock.On("Addr").Return(proverID).Once() + m.etherman.On("GetLatestVerifiedBatchNum").Return(latestVerifiedBatchNum, nil).Once() + m.storageMock.On("CheckProofContainsCompleteSequences", mock.MatchedBy(matchProverCtxFn), &proofToVerify, nil).Return(false, nil).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.NoError(err) + }, + }, + { + name: "valid proof", + proof: &proofToVerify, + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return(proverID).Twice() + m.etherman.On("GetLatestVerifiedBatchNum").Return(latestVerifiedBatchNum, nil).Once() + m.storageMock.On("CheckProofContainsCompleteSequences", mock.MatchedBy(matchProverCtxFn), &proofToVerify, nil).Return(true, nil).Once() + m.proverMock.On("FinalProof", proofToVerify.Proof, from.String()).Return(&finalProofID, nil).Once() + m.proverMock.On("WaitFinalProof", mock.MatchedBy(matchProverCtxFn), finalProofID).Return(&finalProof, nil).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.True(result) + assert.NoError(err) + }, + assertFinalMsg: func(msg *finalProofMsg) { + assert.Equal(finalProof.Proof, msg.finalProof.Proof) + assert.Equal(finalProof.Public.NewStateRoot, msg.finalProof.Public.NewStateRoot) + assert.Equal(finalProof.Public.NewLocalExitRoot, msg.finalProof.Public.NewLocalExitRoot) + }, + }, + } + + for _, tc := range testCases { + tc := tc + t.Run(tc.name, func(t *testing.T) { + storageMock := mocks.NewStorageInterfaceMock(t) + ethTxManager := mocks.NewEthTxManagerClientMock(t) + etherman := mocks.NewEthermanMock(t) + proverMock := mocks.NewProverInterfaceMock(t) + + a := Aggregator{ + cfg: cfg, + storage: storageMock, + etherman: etherman, + ethTxManager: ethTxManager, + logger: log.GetDefaultLogger(), + storageMutex: &sync.Mutex{}, + timeSendFinalProofMutex: &sync.RWMutex{}, + timeCleanupLockedProofs: cfg.CleanupLockedProofsInterval, + finalProof: make(chan finalProofMsg), + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + + aggregatorCtx := context.WithValue(context.Background(), "owner", ownerAggregator) //nolint:staticcheck + a.ctx, a.exit = context.WithCancel(aggregatorCtx) + m := mox{ + storageMock: storageMock, + ethTxManager: ethTxManager, + etherman: etherman, + proverMock: proverMock, + } + if tc.setup != nil { + tc.setup(m, &a) + } + + var wg sync.WaitGroup + if tc.assertFinalMsg != nil { + // wait for the final proof over the channel + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + msg := <-a.finalProof + tc.assertFinalMsg(&msg) + }() + } + + result, err := a.tryBuildFinalProof(proverCtx, proverMock, tc.proof) + + if tc.asserts != nil { + tc.asserts(result, &a, err) + } + + if tc.assertFinalMsg != nil { + WaitUntil(t, &wg, time.Second) + } + }) + } +} + +func Test_tryAggregateProofs(t *testing.T) { + require := require.New(t) + assert := assert.New(t) + errTest := errors.New("test error") + cfg := Config{ + VerifyProofInterval: types.Duration{Duration: time.Millisecond * 1}, + } + + recursiveProof := "recursiveProof" + proverCtx := context.WithValue(context.Background(), "owner", ownerProver) //nolint:staticcheck + matchProverCtxFn := func(ctx context.Context) bool { return ctx.Value("owner") == ownerProver } + matchAggregatorCtxFn := func(ctx context.Context) bool { return ctx.Value("owner") == ownerAggregator } + batchNum := uint64(23) + batchNumFinal := uint64(42) + proof1 := state.Proof{ + Proof: "proof1", + BatchNumber: batchNum, + } + proof2 := state.Proof{ + Proof: "proof2", + BatchNumberFinal: batchNumFinal, + } + testCases := []struct { + name string + setup func(mox, *Aggregator) + asserts func(bool, *Aggregator, error) + }{ + { + name: "getAndLockProofsToAggregate returns generic error", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr") + m.storageMock.On("GetProofsToAggregate", mock.MatchedBy(matchProverCtxFn), nil).Return(nil, nil, errTest).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "getAndLockProofsToAggregate returns ErrNotFound", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr") + m.storageMock.On("GetProofsToAggregate", mock.MatchedBy(matchProverCtxFn), nil).Return(nil, nil, state.ErrNotFound).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.NoError(err) + }, + }, + { + name: "getAndLockProofsToAggregate error updating proofs", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr") + m.txerMock.On("Rollback").Return(nil).Once() + m.storageMock.On("BeginTx", mock.Anything, (*sql.TxOptions)(nil)).Return(m.txerMock, nil).Once() + m.storageMock.On("GetProofsToAggregate", mock.MatchedBy(matchProverCtxFn), nil).Return(&proof1, &proof2, nil).Once() + + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(errTest). + Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + + { + name: "AggregatedProof error", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr") + + lockProofsTxBegin := m.storageMock.On("BeginTx", mock.MatchedBy(matchProverCtxFn), (*sql.TxOptions)(nil)).Return(m.txerMock, nil).Once() + // lockProofsTxCommit := m.proverMock.On("Commit").Return(nil).Once() + m.storageMock.On("GetProofsToAggregate", mock.MatchedBy(matchProverCtxFn), nil).Return(&proof1, &proof2, nil).Once() + proof1GeneratingTrueCall := m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + proof2GeneratingTrueCall := m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + // Use a type assertion with a check + proofArg, ok := args[1].(*state.Proof) + if !ok { + assert.Fail("Expected argument of type *state.Proof") + } + assert.NotNil(proofArg.GeneratingSince) + }). + Return(nil). + Once() + m.proverMock.On("AggregatedProof", proof1.Proof, proof2.Proof).Return(nil, errTest).Once() + m.storageMock.On("BeginTx", mock.Anything, (*sql.TxOptions)(nil)).Return(m.txerMock, nil).Once().NotBefore(lockProofsTxBegin) + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + if !ok { + assert.Fail("Expected argument of type *state.Proof") + } + assert.Nil(proofArg.GeneratingSince) + }). + Return(nil). + Once(). + NotBefore(proof1GeneratingTrueCall) + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + if !ok { + assert.Fail("Expected argument of type *state.Proof") + } + assert.Nil(proofArg.GeneratingSince, "Expected GeneratingSince to be nil") + }). + Return(nil). + Once(). + NotBefore(proof2GeneratingTrueCall) + m.txerMock.On("Commit").Return(nil) + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + + { + name: "WaitRecursiveProof prover error", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr") + lockProofsTxBegin := m.storageMock.On("BeginTx", mock.MatchedBy(matchProverCtxFn), (*sql.TxOptions)(nil)).Return(m.txerMock, nil).Once() + // lockProofsTxCommit := dbTx.On("Commit", mock.MatchedBy(matchProverCtxFn)).Return(nil).Once() + m.storageMock.On("GetProofsToAggregate", mock.MatchedBy(matchProverCtxFn), nil).Return(&proof1, &proof2, nil).Once() + proof1GeneratingTrueCall := m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + if !ok { + assert.Fail("Expected argument of type *state.Proof") + } + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + proof2GeneratingTrueCall := m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + m.proverMock.On("AggregatedProof", proof1.Proof, proof2.Proof).Return(&proofID, nil).Once() + + m.proverMock.On("WaitRecursiveProof", mock.MatchedBy(matchProverCtxFn), proofID).Return("", common.Hash{}, common.Hash{}, errTest).Once() + m.storageMock.On("BeginTx", mock.MatchedBy(matchAggregatorCtxFn), (*sql.TxOptions)(nil)).Return(m.txerMock, nil).Once().NotBefore(lockProofsTxBegin) + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.Nil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once(). + NotBefore(proof1GeneratingTrueCall) + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.Nil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once(). + NotBefore(proof2GeneratingTrueCall) + m.txerMock.On("Commit").Return(nil) + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + + { + name: "unlockProofsToAggregate error after WaitRecursiveProof prover error", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return(proverID) + // lockProofsTxBegin := m.storageMock.On("BeginTx", mock.MatchedBy(matchProverCtxFn)).Return(m.txerMock, nil).Once() + m.txerMock.On("Commit").Return(nil) + m.storageMock.On("GetProofsToAggregate", mock.MatchedBy(matchProverCtxFn), nil).Return(&proof1, &proof2, nil).Once() + proof1GeneratingTrueCall := m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + m.proverMock.On("AggregatedProof", proof1.Proof, proof2.Proof).Return(&proofID, nil).Once() + m.proverMock.On("WaitRecursiveProof", mock.MatchedBy(matchProverCtxFn), proofID).Return("", common.Hash{}, common.Hash{}, errTest).Once() + m.storageMock.On("BeginTx", mock.Anything, (*sql.TxOptions)(nil)).Return(m.txerMock, nil) + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.Nil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(errTest). + Once(). + NotBefore(proof1GeneratingTrueCall) + m.txerMock.On("Rollback").Return(nil).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "rollback after DeleteGeneratedProofs error in db transaction", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr") + // lockProofsTxBegin := m.storageMock.On("BeginTx", mock.MatchedBy(matchProverCtxFn)).Return(dbTx, nil).Twice() + // lockProofsTxCommit := dbTx.On("Commit", mock.MatchedBy(matchProverCtxFn)).Return(nil).Once() + m.storageMock.On("GetProofsToAggregate", mock.MatchedBy(matchProverCtxFn), nil).Return(&proof1, &proof2, nil).Once() + proof1GeneratingTrueCall := m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + proof2GeneratingTrueCall := m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + m.proverMock.On("AggregatedProof", proof1.Proof, proof2.Proof).Return(&proofID, nil).Once() + m.proverMock.On("WaitRecursiveProof", mock.MatchedBy(matchProverCtxFn), proofID).Return(recursiveProof, common.Hash{}, common.Hash{}, nil).Once() + m.storageMock.On("DeleteGeneratedProofs", mock.MatchedBy(matchProverCtxFn), proof1.BatchNumber, proof2.BatchNumberFinal, mock.Anything).Return(errTest).Once() + m.txerMock.On("Rollback").Return(nil).Once() + m.storageMock.On("BeginTx", mock.Anything, (*sql.TxOptions)(nil)).Return(m.txerMock, nil) + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.Nil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once(). + NotBefore(proof1GeneratingTrueCall) + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.Nil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once(). + NotBefore(proof2GeneratingTrueCall) + m.txerMock.On("Commit").Return(nil) + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + + { + name: "rollback after AddGeneratedProof error in db transaction", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr") + // lockProofsTxBegin := m.storageMock.On("BeginTx", mock.MatchedBy(matchProverCtxFn)).Return(dbTx, nil).Twice() + // lockProofsTxCommit := dbTx.On("Commit", mock.MatchedBy(matchProverCtxFn)).Return(nil).Once() + m.storageMock.On("GetProofsToAggregate", mock.MatchedBy(matchProverCtxFn), nil).Return(&proof1, &proof2, nil).Once() + proof1GeneratingTrueCall := m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + proof2GeneratingTrueCall := m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + m.proverMock.On("AggregatedProof", proof1.Proof, proof2.Proof).Return(&proofID, nil).Once() + m.proverMock.On("WaitRecursiveProof", mock.MatchedBy(matchProverCtxFn), proofID).Return(recursiveProof, common.Hash{}, common.Hash{}, nil).Once() + m.storageMock.On("DeleteGeneratedProofs", mock.MatchedBy(matchProverCtxFn), proof1.BatchNumber, proof2.BatchNumberFinal, mock.Anything).Return(nil).Once() + m.storageMock.On("AddGeneratedProof", mock.MatchedBy(matchProverCtxFn), mock.Anything, mock.Anything).Return(errTest).Once() + m.txerMock.On("Rollback").Return(nil).Once() + m.storageMock.On("BeginTx", mock.Anything, (*sql.TxOptions)(nil)).Return(m.txerMock, nil) + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.Nil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once(). + NotBefore(proof1GeneratingTrueCall) + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.Nil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once(). + NotBefore(proof2GeneratingTrueCall) + m.txerMock.On("Commit").Return(nil) + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "time to send final, state error", + setup: func(m mox, a *Aggregator) { + a.accInputHashes = make(map[uint64]common.Hash) + a.cfg.VerifyProofInterval = types.Duration{Duration: time.Nanosecond} + m.proverMock.On("Name").Return(proverName).Times(3) + m.proverMock.On("ID").Return(proverID).Times(3) + m.proverMock.On("Addr").Return("addr") + m.storageMock.On("BeginTx", mock.Anything, (*sql.TxOptions)(nil)).Return(m.txerMock, nil) + m.txerMock.On("Commit").Return(nil) + m.storageMock.On("GetProofsToAggregate", mock.MatchedBy(matchProverCtxFn), nil).Return(&proof1, &proof2, nil).Once() + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof1, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + m.storageMock. + On("UpdateGeneratedProof", mock.MatchedBy(matchProverCtxFn), &proof2, mock.Anything). + Run(func(args mock.Arguments) { + proofArg, ok := args[1].(*state.Proof) + assert.True(ok, "Expected argument of type *state.Proof") + assert.NotNil(proofArg.GeneratingSince, "Expected GeneratingSince to be not nil") + }). + Return(nil). + Once() + + m.proverMock.On("AggregatedProof", proof1.Proof, proof2.Proof).Return(&proofID, nil).Once() + m.proverMock.On("WaitRecursiveProof", mock.MatchedBy(matchProverCtxFn), proofID).Return(recursiveProof, common.Hash{}, common.Hash{}, nil).Once() + m.storageMock.On("DeleteGeneratedProofs", mock.MatchedBy(matchProverCtxFn), proof1.BatchNumber, proof2.BatchNumberFinal, m.txerMock).Return(nil).Once() + expectedInputProver := map[string]interface{}{ + "recursive_proof_1": proof1.Proof, + "recursive_proof_2": proof2.Proof, + } + b, err := json.Marshal(expectedInputProver) + require.NoError(err) + m.storageMock.On("AddGeneratedProof", mock.MatchedBy(matchProverCtxFn), mock.Anything, mock.Anything).Run( + func(args mock.Arguments) { + proof, ok := args[1].(*state.Proof) + if !ok { + t.Fatalf("expected args[1] to be of type *state.Proof, got %T", args[1]) + } + assert.Equal(proof1.BatchNumber, proof.BatchNumber) + assert.Equal(proof2.BatchNumberFinal, proof.BatchNumberFinal) + assert.Equal(&proverName, proof.Prover) + assert.Equal(&proverID, proof.ProverID) + assert.Equal(string(b), proof.InputProver) + assert.Equal(recursiveProof, proof.Proof) + assert.InDelta(time.Now().Unix(), proof.GeneratingSince.Unix(), float64(time.Second)) + }, + ).Return(nil).Once() + + m.etherman.On("GetLatestVerifiedBatchNum").Return(uint64(42), errTest).Once() + m.storageMock.On("UpdateGeneratedProof", mock.MatchedBy(matchAggregatorCtxFn), mock.Anything, nil).Run( + func(args mock.Arguments) { + proof, ok := args[1].(*state.Proof) + if !ok { + t.Fatalf("expected args[1] to be of type *state.Proof, got %T", args[1]) + } + assert.Equal(proof1.BatchNumber, proof.BatchNumber) + assert.Equal(proof2.BatchNumberFinal, proof.BatchNumberFinal) + assert.Equal(&proverName, proof.Prover) + assert.Equal(&proverID, proof.ProverID) + assert.Equal(string(b), proof.InputProver) + assert.Equal(recursiveProof, proof.Proof) + assert.Nil(proof.GeneratingSince) + }, + ).Return(nil).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.True(result) + assert.NoError(err) + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + storageMock := mocks.NewStorageInterfaceMock(t) + ethTxManager := mocks.NewEthTxManagerClientMock(t) + etherman := mocks.NewEthermanMock(t) + proverMock := mocks.NewProverInterfaceMock(t) + txerMock := mocks.NewTxerMock(t) + a := Aggregator{ + cfg: cfg, + storage: storageMock, + etherman: etherman, + ethTxManager: ethTxManager, + logger: log.GetDefaultLogger(), + storageMutex: &sync.Mutex{}, + timeSendFinalProofMutex: &sync.RWMutex{}, + timeCleanupLockedProofs: cfg.CleanupLockedProofsInterval, + finalProof: make(chan finalProofMsg), + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + aggregatorCtx := context.WithValue(context.Background(), "owner", ownerAggregator) //nolint:staticcheck + a.ctx, a.exit = context.WithCancel(aggregatorCtx) + m := mox{ + storageMock: storageMock, + ethTxManager: ethTxManager, + etherman: etherman, + proverMock: proverMock, + txerMock: txerMock, + } + if tc.setup != nil { + tc.setup(m, &a) + } + a.resetVerifyProofTime() + + result, err := a.tryAggregateProofs(proverCtx, proverMock) + + if tc.asserts != nil { + tc.asserts(result, &a, err) + } + }) + } +} + +func Test_tryGenerateBatchProof(t *testing.T) { + require := require.New(t) + assert := assert.New(t) + from := common.BytesToAddress([]byte("from")) + cfg := Config{ + VerifyProofInterval: types.Duration{Duration: time.Duration(10000000)}, + SenderAddress: from.Hex(), + IntervalAfterWhichBatchConsolidateAnyway: types.Duration{Duration: time.Second * 1}, + ChainID: uint64(1), + ForkId: uint64(12), + BatchProofSanityCheckEnabled: true, + } + lastVerifiedBatchNum := uint64(22) + + batchNum := uint64(23) + + batchToProve := state.Batch{ + BatchNumber: batchNum, + } + + proofID := "proofId" + + proverName := "proverName" + proverID := "proverID" + errTest := errors.New("test error") + errAIH := fmt.Errorf("failed to build input prover, acc input hash for previous batch (22) is not in memory") + proverCtx := context.WithValue(context.Background(), "owner", ownerProver) //nolint:staticcheck + matchProverCtxFn := func(ctx context.Context) bool { return ctx.Value("owner") == ownerProver } + matchAggregatorCtxFn := func(ctx context.Context) bool { return ctx.Value("owner") == ownerAggregator } + fixedTimestamp := time.Date(2023, 10, 13, 15, 0, 0, 0, time.UTC) + + l1InfoTreeLeaf := []synchronizer.L1InfoTreeLeaf{ + { + GlobalExitRoot: common.Hash{}, + PreviousBlockHash: common.Hash{}, + Timestamp: fixedTimestamp, + }, + { + GlobalExitRoot: common.Hash{}, + PreviousBlockHash: common.Hash{}, + Timestamp: fixedTimestamp, + }, + { + GlobalExitRoot: common.Hash{}, + PreviousBlockHash: common.Hash{}, + Timestamp: fixedTimestamp, + }, + { + GlobalExitRoot: common.Hash{}, + PreviousBlockHash: common.Hash{}, + Timestamp: fixedTimestamp, + }, + } + + testCases := []struct { + name string + setup func(mox, *Aggregator) + asserts func(bool, *Aggregator, error) + }{ + { + name: "getAndLockBatchToProve returns AIH error", + setup: func(m mox, a *Aggregator) { + sequence := synchronizer.SequencedBatches{ + FromBatchNumber: uint64(1), + ToBatchNumber: uint64(2), + } + l1InfoRoot := common.HexToHash("0x057e9950fbd39b002e323f37c2330d0c096e66919e24cc96fb4b2dfa8f4af782") + + virtualBatch := synchronizer.VirtualBatch{ + BatchNumber: 1, + BatchL2Data: []byte{ + 0xb, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x1, 0xc8, 0xb, 0x0, 0x0, 0x3, 0x15, 0x0, 0x1, 0x8a, 0xf8, + }, + L1InfoRoot: &l1InfoRoot, + } + rpcBatch := rpctypes.NewRPCBatch(lastVerifiedBatchNum+1, common.Hash{}, []string{}, []byte("batchL2Data"), common.Hash{}, common.BytesToHash([]byte("mock LocalExitRoot")), common.BytesToHash([]byte("mock StateRoot")), common.Address{}, false) + + m.proverMock.On("Name").Return(proverName) + m.proverMock.On("ID").Return(proverID) + m.proverMock.On("Addr").Return("addr") + m.etherman.On("GetLatestVerifiedBatchNum").Return(uint64(0), nil) + m.storageMock.On("CheckProofExistsForBatch", mock.Anything, uint64(1), nil).Return(false, nil) + m.synchronizerMock.On("GetSequenceByBatchNumber", mock.Anything, mock.Anything).Return(&sequence, nil) + m.synchronizerMock.On("GetVirtualBatchByBatchNumber", mock.Anything, mock.Anything).Return(&virtualBatch, nil) + m.synchronizerMock.On("GetL1BlockByNumber", mock.Anything, mock.Anything).Return(&synchronizer.L1Block{ParentHash: common.Hash{}}, nil) + m.rpcMock.On("GetBatch", mock.Anything).Return(rpcBatch, nil) + m.rpcMock.On("GetWitness", mock.Anything, false).Return([]byte("witness"), nil) + m.storageMock.On("AddGeneratedProof", mock.Anything, mock.Anything, nil).Return(nil) + m.storageMock.On("AddSequence", mock.Anything, mock.Anything, nil).Return(nil) + m.storageMock.On("DeleteGeneratedProofs", mock.Anything, uint64(1), uint64(1), nil).Return(nil) + m.synchronizerMock.On("GetLeafsByL1InfoRoot", mock.Anything, l1InfoRoot).Return(l1InfoTreeLeaf, nil) + m.synchronizerMock.On("GetL1InfoTreeLeaves", mock.Anything, mock.Anything).Return(map[uint32]synchronizer.L1InfoTreeLeaf{ + 1: { + BlockNumber: uint64(1), + }, + }, nil) + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorContains(err, errAIH.Error()) + }, + }, + { + name: "getAndLockBatchToProve returns generic error", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr") + m.etherman.On("GetLatestVerifiedBatchNum").Return(uint64(0), errTest).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "getAndLockBatchToProve returns ErrNotFound", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr") + m.etherman.On("GetLatestVerifiedBatchNum").Return(uint64(0), state.ErrNotFound).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.NoError(err) + }, + }, + { + name: "BatchProof prover error", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr").Twice() + + batchL2Data, err := hex.DecodeString(codedL2Block1) + require.NoError(err) + l1InfoRoot := common.HexToHash("0x057e9950fbd39b002e323f37c2330d0c096e66919e24cc96fb4b2dfa8f4af782") + + virtualBatch := synchronizer.VirtualBatch{ + BatchNumber: lastVerifiedBatchNum + 1, + BatchL2Data: batchL2Data, + L1InfoRoot: &l1InfoRoot, + } + + m.synchronizerMock.On("GetVirtualBatchByBatchNumber", mock.Anything, mock.Anything).Return(&virtualBatch, nil).Once() + m.etherman.On("GetLatestVerifiedBatchNum").Return(lastVerifiedBatchNum, nil).Once() + m.storageMock.On("CheckProofExistsForBatch", mock.MatchedBy(matchProverCtxFn), mock.Anything, nil).Return(true, nil) + m.storageMock.On("CleanupGeneratedProofs", mock.Anything, mock.Anything, mock.Anything).Return(nil).Once() + sequence := synchronizer.SequencedBatches{ + FromBatchNumber: uint64(10), + ToBatchNumber: uint64(20), + } + m.synchronizerMock.On("GetSequenceByBatchNumber", mock.Anything, mock.Anything).Return(&sequence, nil) + + rpcBatch := rpctypes.NewRPCBatch(lastVerifiedBatchNum+1, common.Hash{}, []string{}, batchL2Data, common.Hash{}, common.BytesToHash([]byte("mock LocalExitRoot")), common.BytesToHash([]byte("mock StateRoot")), common.Address{}, false) + rpcBatch.SetLastL2BLockTimestamp(uint64(time.Now().Unix())) + m.rpcMock.On("GetWitness", mock.Anything, false).Return([]byte("witness"), nil) + m.rpcMock.On("GetBatch", mock.Anything).Return(rpcBatch, nil) + m.storageMock.On("AddSequence", mock.MatchedBy(matchProverCtxFn), mock.Anything, nil).Return(nil).Once() + m.storageMock.On("AddGeneratedProof", mock.MatchedBy(matchProverCtxFn), mock.Anything, nil).Run( + func(args mock.Arguments) { + proof, ok := args[1].(*state.Proof) + if !ok { + t.Fatalf("expected args[1] to be of type *state.Proof, got %T", args[1]) + } + assert.Equal(batchToProve.BatchNumber, proof.BatchNumber) + assert.Equal(batchToProve.BatchNumber, proof.BatchNumberFinal) + assert.Equal(&proverName, proof.Prover) + assert.Equal(&proverID, proof.ProverID) + assert.InDelta(time.Now().Unix(), proof.GeneratingSince.Unix(), float64(time.Second)) + }, + ).Return(nil).Once() + m.synchronizerMock.On("GetLeafsByL1InfoRoot", mock.Anything, l1InfoRoot).Return(l1InfoTreeLeaf, nil) + m.synchronizerMock.On("GetL1InfoTreeLeaves", mock.Anything, mock.Anything).Return(map[uint32]synchronizer.L1InfoTreeLeaf{ + 1: { + BlockNumber: uint64(35), + }, + }, nil) + + m.proverMock.On("BatchProof", mock.Anything).Return(nil, errTest).Once() + m.storageMock.On("DeleteGeneratedProofs", mock.MatchedBy(matchAggregatorCtxFn), batchToProve.BatchNumber, batchToProve.BatchNumber, nil).Return(nil).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "WaitRecursiveProof prover error", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr").Twice() + + batchL2Data, err := hex.DecodeString(codedL2Block1) + require.NoError(err) + l1InfoRoot := common.HexToHash("0x057e9950fbd39b002e323f37c2330d0c096e66919e24cc96fb4b2dfa8f4af782") + + virtualBatch := synchronizer.VirtualBatch{ + BatchNumber: lastVerifiedBatchNum + 1, + BatchL2Data: batchL2Data, + L1InfoRoot: &l1InfoRoot, + } + + m.synchronizerMock.On("GetVirtualBatchByBatchNumber", mock.Anything, lastVerifiedBatchNum+1).Return(&virtualBatch, nil).Once() + + m.etherman.On("GetLatestVerifiedBatchNum").Return(lastVerifiedBatchNum, nil).Once() + m.storageMock.On("CheckProofExistsForBatch", mock.MatchedBy(matchProverCtxFn), mock.AnythingOfType("uint64"), nil).Return(false, nil).Once() + sequence := synchronizer.SequencedBatches{ + FromBatchNumber: uint64(10), + ToBatchNumber: uint64(20), + } + m.synchronizerMock.On("GetSequenceByBatchNumber", mock.MatchedBy(matchProverCtxFn), lastVerifiedBatchNum+1).Return(&sequence, nil).Once() + rpcBatch := rpctypes.NewRPCBatch(lastVerifiedBatchNum+1, common.Hash{}, []string{}, batchL2Data, common.Hash{}, common.BytesToHash([]byte("mock LocalExitRoot")), common.BytesToHash([]byte("mock StateRoot")), common.Address{}, false) + rpcBatch.SetLastL2BLockTimestamp(uint64(time.Now().Unix())) + m.rpcMock.On("GetWitness", lastVerifiedBatchNum+1, false).Return([]byte("witness"), nil) + m.storageMock.On("AddSequence", mock.MatchedBy(matchProverCtxFn), mock.Anything, nil).Return(nil).Once() + m.storageMock.On("AddGeneratedProof", mock.MatchedBy(matchProverCtxFn), mock.Anything, nil).Run( + func(args mock.Arguments) { + proof, ok := args[1].(*state.Proof) + if !ok { + t.Fatalf("expected args[1] to be of type *state.Proof, got %T", args[1]) + } + assert.Equal(batchToProve.BatchNumber, proof.BatchNumber) + assert.Equal(batchToProve.BatchNumber, proof.BatchNumberFinal) + assert.Equal(&proverName, proof.Prover) + assert.Equal(&proverID, proof.ProverID) + assert.InDelta(time.Now().Unix(), proof.GeneratingSince.Unix(), float64(time.Second)) + }, + ).Return(nil).Once() + + m.synchronizerMock.On("GetLeafsByL1InfoRoot", mock.Anything, l1InfoRoot).Return(l1InfoTreeLeaf, nil) + m.synchronizerMock.On("GetL1InfoTreeLeaves", mock.Anything, mock.Anything).Return(map[uint32]synchronizer.L1InfoTreeLeaf{ + 1: { + BlockNumber: uint64(35), + }, + }, nil) + + m.rpcMock.On("GetBatch", lastVerifiedBatchNum+1).Return(rpcBatch, nil) + m.proverMock.On("BatchProof", mock.Anything).Return(&proofID, nil).Once() + m.proverMock.On("WaitRecursiveProof", mock.MatchedBy(matchProverCtxFn), proofID).Return("", common.Hash{}, common.Hash{}, errTest).Once() + m.storageMock.On("DeleteGeneratedProofs", mock.MatchedBy(matchAggregatorCtxFn), batchToProve.BatchNumber, batchToProve.BatchNumber, nil).Return(nil) + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + { + name: "WaitRecursiveProof no error", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName) + m.proverMock.On("ID").Return(proverID) + m.proverMock.On("Addr").Return("addr") + + batchL2Data, err := hex.DecodeString(codedL2Block1) + require.NoError(err) + l1InfoRoot := common.HexToHash("0x057e9950fbd39b002e323f37c2330d0c096e66919e24cc96fb4b2dfa8f4af782") + + virtualBatch := synchronizer.VirtualBatch{ + BatchNumber: lastVerifiedBatchNum + 1, + BatchL2Data: batchL2Data, + L1InfoRoot: &l1InfoRoot, + } + + m.synchronizerMock.On("GetVirtualBatchByBatchNumber", mock.Anything, lastVerifiedBatchNum+1).Return(&virtualBatch, nil) + + m.etherman.On("GetLatestVerifiedBatchNum").Return(lastVerifiedBatchNum, nil) + m.storageMock.On("CheckProofExistsForBatch", mock.MatchedBy(matchProverCtxFn), mock.AnythingOfType("uint64"), nil).Return(false, nil) + sequence := synchronizer.SequencedBatches{ + FromBatchNumber: uint64(10), + ToBatchNumber: uint64(20), + } + m.synchronizerMock.On("GetSequenceByBatchNumber", mock.MatchedBy(matchProverCtxFn), lastVerifiedBatchNum+1).Return(&sequence, nil) + rpcBatch := rpctypes.NewRPCBatch(lastVerifiedBatchNum+1, common.Hash{}, []string{}, batchL2Data, common.Hash{}, common.BytesToHash([]byte("mock LocalExitRoot")), common.BytesToHash([]byte("mock StateRoot")), common.Address{}, false) + rpcBatch.SetLastL2BLockTimestamp(uint64(time.Now().Unix())) + m.rpcMock.On("GetWitness", lastVerifiedBatchNum+1, false).Return([]byte("witness"), nil) + m.storageMock.On("AddSequence", mock.MatchedBy(matchProverCtxFn), mock.Anything, nil).Return(nil) + m.storageMock.On("AddGeneratedProof", mock.MatchedBy(matchProverCtxFn), mock.Anything, nil).Run( + func(args mock.Arguments) { + proof, ok := args[1].(*state.Proof) + if !ok { + t.Fatalf("expected args[1] to be of type *state.Proof, got %T", args[1]) + } + assert.Equal(batchToProve.BatchNumber, proof.BatchNumber) + assert.Equal(batchToProve.BatchNumber, proof.BatchNumberFinal) + assert.Equal(&proverName, proof.Prover) + assert.Equal(&proverID, proof.ProverID) + assert.InDelta(time.Now().Unix(), proof.GeneratingSince.Unix(), float64(time.Second)) + }, + ).Return(nil) + + m.synchronizerMock.On("GetLeafsByL1InfoRoot", mock.Anything, l1InfoRoot).Return(l1InfoTreeLeaf, nil) + m.synchronizerMock.On("GetL1InfoTreeLeaves", mock.Anything, mock.Anything).Return(map[uint32]synchronizer.L1InfoTreeLeaf{ + 1: { + BlockNumber: uint64(35), + }, + }, nil) + + m.rpcMock.On("GetBatch", lastVerifiedBatchNum+1).Return(rpcBatch, nil) + m.proverMock.On("BatchProof", mock.Anything).Return(&proofID, nil) + m.proverMock.On("WaitRecursiveProof", mock.MatchedBy(matchProverCtxFn), proofID).Return("", common.Hash{}, common.Hash{}, nil) + m.storageMock.On("UpdateGeneratedProof", mock.Anything, mock.Anything, nil).Return(nil) + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.True(result) + assert.NoError(err) + }, + }, + { + name: "DeleteBatchProofs error after WaitRecursiveProof prover error", + setup: func(m mox, a *Aggregator) { + m.proverMock.On("Name").Return(proverName).Twice() + m.proverMock.On("ID").Return(proverID).Twice() + m.proverMock.On("Addr").Return("addr").Twice() + + batchL2Data, err := hex.DecodeString(codedL2Block1) + require.NoError(err) + l1InfoRoot := common.HexToHash("0x057e9950fbd39b002e323f37c2330d0c096e66919e24cc96fb4b2dfa8f4af782") + + m.etherman.On("GetLatestVerifiedBatchNum").Return(lastVerifiedBatchNum, nil).Once() + m.storageMock.On("CheckProofExistsForBatch", mock.MatchedBy(matchProverCtxFn), mock.AnythingOfType("uint64"), nil).Return(false, nil).Once() + sequence := synchronizer.SequencedBatches{ + FromBatchNumber: uint64(10), + ToBatchNumber: uint64(20), + } + m.synchronizerMock.On("GetSequenceByBatchNumber", mock.MatchedBy(matchProverCtxFn), lastVerifiedBatchNum+1).Return(&sequence, nil).Once() + rpcBatch := rpctypes.NewRPCBatch(lastVerifiedBatchNum+1, common.Hash{}, []string{}, batchL2Data, common.Hash{}, common.BytesToHash([]byte("mock LocalExitRoot")), common.BytesToHash([]byte("mock StateRoot")), common.Address{}, false) + rpcBatch.SetLastL2BLockTimestamp(uint64(time.Now().Unix())) + m.rpcMock.On("GetBatch", lastVerifiedBatchNum+1).Return(rpcBatch, nil) + m.storageMock.On("AddSequence", mock.MatchedBy(matchProverCtxFn), mock.Anything, nil).Return(nil).Once() + m.storageMock.On("AddGeneratedProof", mock.MatchedBy(matchProverCtxFn), mock.Anything, nil).Run( + func(args mock.Arguments) { + proof, ok := args[1].(*state.Proof) + if !ok { + t.Fatalf("expected args[1] to be of type *state.Proof, got %T", args[1]) + } + assert.Equal(batchToProve.BatchNumber, proof.BatchNumber) + assert.Equal(batchToProve.BatchNumber, proof.BatchNumberFinal) + assert.Equal(&proverName, proof.Prover) + assert.Equal(&proverID, proof.ProverID) + assert.InDelta(time.Now().Unix(), proof.GeneratingSince.Unix(), float64(time.Second)) + }, + ).Return(nil).Once() + + m.synchronizerMock.On("GetLeafsByL1InfoRoot", mock.Anything, l1InfoRoot).Return(l1InfoTreeLeaf, nil) + m.synchronizerMock.On("GetL1InfoTreeLeaves", mock.Anything, mock.Anything).Return(map[uint32]synchronizer.L1InfoTreeLeaf{ + 1: { + BlockNumber: uint64(35), + }, + }, nil) + + m.rpcMock.On("GetWitness", lastVerifiedBatchNum+1, false).Return([]byte("witness"), nil) + + virtualBatch := synchronizer.VirtualBatch{ + BatchNumber: lastVerifiedBatchNum + 1, + BatchL2Data: batchL2Data, + L1InfoRoot: &l1InfoRoot, + } + + m.synchronizerMock.On("GetVirtualBatchByBatchNumber", mock.Anything, lastVerifiedBatchNum+1).Return(&virtualBatch, nil).Once() + + m.proverMock.On("BatchProof", mock.Anything).Return(&proofID, nil).Once() + m.proverMock.On("WaitRecursiveProof", mock.MatchedBy(matchProverCtxFn), proofID).Return("", common.Hash{}, common.Hash{}, errTest).Once() + m.storageMock.On("DeleteGeneratedProofs", mock.MatchedBy(matchAggregatorCtxFn), batchToProve.BatchNumber, batchToProve.BatchNumber, nil).Return(errTest).Once() + }, + asserts: func(result bool, a *Aggregator, err error) { + assert.False(result) + assert.ErrorIs(err, errTest) + }, + }, + } + + for x, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + storageMock := mocks.NewStorageInterfaceMock(t) + ethTxManager := mocks.NewEthTxManagerClientMock(t) + etherman := mocks.NewEthermanMock(t) + proverMock := mocks.NewProverInterfaceMock(t) + synchronizerMock := mocks.NewSynchronizerInterfaceMock(t) + mockRPC := mocks.NewRPCInterfaceMock(t) + + a := Aggregator{ + cfg: cfg, + storage: storageMock, + etherman: etherman, + ethTxManager: ethTxManager, + logger: log.GetDefaultLogger(), + storageMutex: &sync.Mutex{}, + timeSendFinalProofMutex: &sync.RWMutex{}, + timeCleanupLockedProofs: cfg.CleanupLockedProofsInterval, + finalProof: make(chan finalProofMsg), + l1Syncr: synchronizerMock, + rpcClient: mockRPC, + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + if x > 0 { + a.accInputHashes = populateAccInputHashes() + } + aggregatorCtx := context.WithValue(context.Background(), "owner", ownerAggregator) //nolint:staticcheck + a.ctx, a.exit = context.WithCancel(aggregatorCtx) + + m := mox{ + storageMock: storageMock, + ethTxManager: ethTxManager, + etherman: etherman, + proverMock: proverMock, + synchronizerMock: synchronizerMock, + rpcMock: mockRPC, + } + if tc.setup != nil { + tc.setup(m, &a) + } + a.resetVerifyProofTime() + + result, err := a.tryGenerateBatchProof(proverCtx, proverMock) + + if tc.asserts != nil { + tc.asserts(result, &a, err) + } + }) + } +} + +func populateAccInputHashes() map[uint64]common.Hash { + accInputHashes := make(map[uint64]common.Hash) + for i := 10; i < 200; i++ { + accInputHashes[uint64(i)] = common.BytesToHash([]byte(fmt.Sprintf("hash%d", i))) + } + return accInputHashes +} + +func Test_accInputHashFunctions(t *testing.T) { + aggregator := Aggregator{ + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + + hash1 := common.BytesToHash([]byte("hash1")) + hash2 := common.BytesToHash([]byte("hash2")) + + aggregator.setAccInputHash(1, hash1) + aggregator.setAccInputHash(2, hash2) + + assert.Equal(t, 2, len(aggregator.accInputHashes)) + + hash3 := aggregator.getAccInputHash(1) + assert.Equal(t, hash1, hash3) + + aggregator.removeAccInputHashes(1, 2) + assert.Equal(t, 0, len(aggregator.accInputHashes)) +} + +func Test_sanityChecks(t *testing.T) { + batchToProve := state.Batch{ + BatchNumber: 1, + StateRoot: common.HexToHash("0x01"), + AccInputHash: common.HexToHash("0x02"), + } + + aggregator := Aggregator{ + accInputHashes: make(map[uint64]common.Hash), + accInputHashesMutex: &sync.Mutex{}, + } + + aggregator.performSanityChecks(log.GetDefaultLogger(), batchToProve.StateRoot, batchToProve.AccInputHash, &batchToProve) + + // Halt by SR sanity check + go func() { + aggregator.performSanityChecks(log.GetDefaultLogger(), common.HexToHash("0x03"), batchToProve.AccInputHash, &batchToProve) + time.Sleep(5 * time.Second) + return + }() + + // Halt by AIH sanity check + go func() { + aggregator.performSanityChecks(log.GetDefaultLogger(), batchToProve.StateRoot, common.HexToHash("0x04"), &batchToProve) + time.Sleep(5 * time.Second) + return + }() +} diff --git a/aggregator/config.go b/aggregator/config.go new file mode 100644 index 00000000..9ccb3b0f --- /dev/null +++ b/aggregator/config.go @@ -0,0 +1,139 @@ +package aggregator + +import ( + "fmt" + "math/big" + + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + syncronizerConfig "github.com/0xPolygonHermez/zkevm-synchronizer-l1/config" + "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/log" +) + +// SettlementBackend is the type of the settlement backend +type SettlementBackend string + +const ( + // AggLayer settlement backend + AggLayer SettlementBackend = "agglayer" + + // L1 settlement backend + L1 SettlementBackend = "l1" + + // TenToThePowerOf18 represents 1000000000000000000 + TenToThePowerOf18 = 1000000000000000000 +) + +// TokenAmountWithDecimals is a wrapper type that parses token amount with decimals to big int +type TokenAmountWithDecimals struct { + *big.Int `validate:"required"` +} + +// UnmarshalText unmarshal token amount from float string to big int +func (t *TokenAmountWithDecimals) UnmarshalText(data []byte) error { + amount, ok := new(big.Float).SetString(string(data)) + if !ok { + return fmt.Errorf("failed to unmarshal string to float") + } + coin := new(big.Float).SetInt(big.NewInt(TenToThePowerOf18)) + bigval := new(big.Float).Mul(amount, coin) + result := new(big.Int) + bigval.Int(result) + t.Int = result + + return nil +} + +// Config represents the configuration of the aggregator +type Config struct { + // Host for the grpc server + Host string `mapstructure:"Host"` + // Port for the grpc server + Port int `mapstructure:"Port"` + + // RetryTime is the time the aggregator main loop sleeps if there are no proofs to aggregate + // or batches to generate proofs. It is also used in the isSynced loop + RetryTime types.Duration `mapstructure:"RetryTime"` + + // VerifyProofInterval is the interval of time to verify/send an proof in L1 + VerifyProofInterval types.Duration `mapstructure:"VerifyProofInterval"` + + // ProofStatePollingInterval is the interval time to polling the prover about the generation state of a proof + ProofStatePollingInterval types.Duration `mapstructure:"ProofStatePollingInterval"` + + // IntervalAfterWhichBatchConsolidateAnyway is the interval duration for the main sequencer to check + // if there are no transactions. If there are no transactions in this interval, the sequencer will + // consolidate the batch anyway. + IntervalAfterWhichBatchConsolidateAnyway types.Duration `mapstructure:"IntervalAfterWhichBatchConsolidateAnyway"` + + // BatchProofSanityCheckEnabled is a flag to enable the sanity check of the batch proof + BatchProofSanityCheckEnabled bool `mapstructure:"BatchProofSanityCheckEnabled"` + + // ChainID is the L2 ChainID provided by the Network Config + ChainID uint64 + + // ForkID is the L2 ForkID provided by the Network Config + ForkId uint64 `mapstructure:"ForkId"` //nolint:stylecheck + + // SenderAddress defines which private key the eth tx manager needs to use + // to sign the L1 txs + SenderAddress string `mapstructure:"SenderAddress"` + + // CleanupLockedProofsInterval is the interval of time to clean up locked proofs. + CleanupLockedProofsInterval types.Duration `mapstructure:"CleanupLockedProofsInterval"` + + // GeneratingProofCleanupThreshold represents the time interval after + // which a proof in generating state is considered to be stuck and + // allowed to be cleared. + GeneratingProofCleanupThreshold string `mapstructure:"GeneratingProofCleanupThreshold"` + + // GasOffset is the amount of gas to be added to the gas estimation in order + // to provide an amount that is higher than the estimated one. This is used + // to avoid the TX getting reverted in case something has changed in the network + // state after the estimation which can cause the TX to require more gas to be + // executed. + // + // ex: + // gas estimation: 1000 + // gas offset: 100 + // final gas: 1100 + GasOffset uint64 `mapstructure:"GasOffset"` + + // RPCURL is the URL of the RPC server + RPCURL string `mapstructure:"RPCURL"` + + // WitnessURL is the URL of the witness server + WitnessURL string `mapstructure:"WitnessURL"` + + // UseFullWitness is a flag to enable the use of full witness in the aggregator + UseFullWitness bool `mapstructure:"UseFullWitness"` + + // DBPath is the path to the database + DBPath string `mapstructure:"DBPath"` + + // EthTxManager is the config for the ethtxmanager + EthTxManager ethtxmanager.Config `mapstructure:"EthTxManager"` + + // Log is the log configuration + Log log.Config `mapstructure:"Log"` + + // Synchornizer config + Synchronizer syncronizerConfig.Config `mapstructure:"Synchronizer"` + + // SettlementBackend configuration defines how a final ZKP should be settled. + // It can be settled directly to L1 or over Agglayer. + SettlementBackend SettlementBackend `mapstructure:"SettlementBackend" jsonschema:"enum=agglayer,enum=l1"` + + // SequencerPrivateKey Private key of the trusted sequencer + SequencerPrivateKey types.KeystoreFileConfig `mapstructure:"SequencerPrivateKey"` + + // AggLayerTxTimeout is the interval time to wait for a tx to be mined from the agglayer + AggLayerTxTimeout types.Duration `mapstructure:"AggLayerTxTimeout"` + + // AggLayerURL url of the agglayer service + AggLayerURL string `mapstructure:"AggLayerURL"` + + // SyncModeOnlyEnabled is a flag that activates sync mode exclusively. + // When enabled, the aggregator will sync data only from L1 and will not generate or read the data stream. + SyncModeOnlyEnabled bool `mapstructure:"SyncModeOnlyEnabled"` +} diff --git a/aggregator/db/dbstorage/dbstorage.go b/aggregator/db/dbstorage/dbstorage.go new file mode 100644 index 00000000..05af9aa7 --- /dev/null +++ b/aggregator/db/dbstorage/dbstorage.go @@ -0,0 +1,35 @@ +package dbstorage + +import ( + "context" + "database/sql" + + "github.com/agglayer/aggkit/db" +) + +// DBStorage implements the Storage interface +type DBStorage struct { + DB *sql.DB +} + +// NewDBStorage creates a new DBStorage instance +func NewDBStorage(dbPath string) (*DBStorage, error) { + db, err := db.NewSQLiteDB(dbPath) + if err != nil { + return nil, err + } + + return &DBStorage{DB: db}, nil +} + +func (d *DBStorage) BeginTx(ctx context.Context, options *sql.TxOptions) (db.Txer, error) { + return db.NewTx(ctx, d.DB) +} + +func (d *DBStorage) getExecQuerier(dbTx db.Txer) db.Querier { + if dbTx == nil { + return d.DB + } + + return dbTx +} diff --git a/aggregator/db/dbstorage/proof.go b/aggregator/db/dbstorage/proof.go new file mode 100644 index 00000000..969d5e7e --- /dev/null +++ b/aggregator/db/dbstorage/proof.go @@ -0,0 +1,356 @@ +package dbstorage + +import ( + "context" + "database/sql" + "errors" + "fmt" + "time" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/state" +) + +// CheckProofExistsForBatch checks if the batch is already included in any proof +func (d *DBStorage) CheckProofExistsForBatch(ctx context.Context, batchNumber uint64, dbTx db.Txer) (bool, error) { + const checkProofExistsForBatchSQL = ` + SELECT EXISTS (SELECT 1 FROM proof p WHERE $1 >= p.batch_num AND $1 <= p.batch_num_final) + ` + e := d.getExecQuerier(dbTx) + var exists bool + err := e.QueryRow(checkProofExistsForBatchSQL, batchNumber).Scan(&exists) + if err != nil && !errors.Is(err, sql.ErrNoRows) { + return exists, err + } + return exists, nil +} + +// CheckProofContainsCompleteSequences checks if a recursive proof contains complete sequences +func (d *DBStorage) CheckProofContainsCompleteSequences( + ctx context.Context, proof *state.Proof, dbTx db.Txer, +) (bool, error) { + const getProofContainsCompleteSequencesSQL = ` + SELECT EXISTS (SELECT 1 FROM sequence s1 WHERE s1.from_batch_num = $1) AND + EXISTS (SELECT 1 FROM sequence s2 WHERE s2.to_batch_num = $2) + ` + e := d.getExecQuerier(dbTx) + var exists bool + err := e.QueryRow(getProofContainsCompleteSequencesSQL, proof.BatchNumber, proof.BatchNumberFinal).Scan(&exists) + if err != nil && !errors.Is(err, sql.ErrNoRows) { + return exists, err + } + return exists, nil +} + +// GetProofReadyToVerify return the proof that is ready to verify +func (d *DBStorage) GetProofReadyToVerify( + ctx context.Context, lastVerfiedBatchNumber uint64, dbTx db.Txer, +) (*state.Proof, error) { + const getProofReadyToVerifySQL = ` + SELECT + p.batch_num, + p.batch_num_final, + p.proof, + p.proof_id, + p.input_prover, + p.prover, + p.prover_id, + p.generating_since, + p.created_at, + p.updated_at + FROM proof p + WHERE batch_num = $1 AND generating_since IS NULL AND + EXISTS (SELECT 1 FROM sequence s1 WHERE s1.from_batch_num = p.batch_num) AND + EXISTS (SELECT 1 FROM sequence s2 WHERE s2.to_batch_num = p.batch_num_final) + ` + + var proof = &state.Proof{} + + e := d.getExecQuerier(dbTx) + row := e.QueryRow(getProofReadyToVerifySQL, lastVerfiedBatchNumber+1) + + var ( + generatingSince *uint64 + createdAt *uint64 + updatedAt *uint64 + ) + err := row.Scan( + &proof.BatchNumber, &proof.BatchNumberFinal, &proof.Proof, &proof.ProofID, + &proof.InputProver, &proof.Prover, &proof.ProverID, &generatingSince, + &createdAt, &updatedAt, + ) + + if generatingSince != nil { + timeSince := time.Unix(int64(*generatingSince), 0) + proof.GeneratingSince = &timeSince + } + + if createdAt != nil { + proof.CreatedAt = time.Unix(int64(*createdAt), 0) + } + + if updatedAt != nil { + proof.UpdatedAt = time.Unix(int64(*updatedAt), 0) + } + + if errors.Is(err, sql.ErrNoRows) { + return nil, state.ErrNotFound + } else if err != nil { + return nil, err + } + + return proof, err +} + +// GetProofsToAggregate return the next to proof that it is possible to aggregate +func (d *DBStorage) GetProofsToAggregate(ctx context.Context, dbTx db.Txer) (*state.Proof, *state.Proof, error) { + var ( + proof1 = &state.Proof{} + proof2 = &state.Proof{} + ) + + // TODO: add comments to explain the query + const getProofsToAggregateSQL = ` + SELECT + p1.batch_num as p1_batch_num, + p1.batch_num_final as p1_batch_num_final, + p1.proof as p1_proof, + p1.proof_id as p1_proof_id, + p1.input_prover as p1_input_prover, + p1.prover as p1_prover, + p1.prover_id as p1_prover_id, + p1.generating_since as p1_generating_since, + p1.created_at as p1_created_at, + p1.updated_at as p1_updated_at, + p2.batch_num as p2_batch_num, + p2.batch_num_final as p2_batch_num_final, + p2.proof as p2_proof, + p2.proof_id as p2_proof_id, + p2.input_prover as p2_input_prover, + p2.prover as p2_prover, + p2.prover_id as p2_prover_id, + p2.generating_since as p2_generating_since, + p2.created_at as p2_created_at, + p2.updated_at as p2_updated_at + FROM proof p1 INNER JOIN proof p2 ON p1.batch_num_final = p2.batch_num - 1 + WHERE p1.generating_since IS NULL AND p2.generating_since IS NULL AND + p1.proof IS NOT NULL AND p2.proof IS NOT NULL AND + ( + EXISTS ( + SELECT 1 FROM sequence s + WHERE p1.batch_num >= s.from_batch_num AND p1.batch_num <= s.to_batch_num AND + p1.batch_num_final >= s.from_batch_num AND p1.batch_num_final <= s.to_batch_num AND + p2.batch_num >= s.from_batch_num AND p2.batch_num <= s.to_batch_num AND + p2.batch_num_final >= s.from_batch_num AND p2.batch_num_final <= s.to_batch_num + ) + OR + ( + EXISTS ( SELECT 1 FROM sequence s WHERE p1.batch_num = s.from_batch_num) AND + EXISTS ( SELECT 1 FROM sequence s WHERE p1.batch_num_final = s.to_batch_num) AND + EXISTS ( SELECT 1 FROM sequence s WHERE p2.batch_num = s.from_batch_num) AND + EXISTS ( SELECT 1 FROM sequence s WHERE p2.batch_num_final = s.to_batch_num) + ) + ) + ORDER BY p1.batch_num ASC + LIMIT 1 + ` + + e := d.getExecQuerier(dbTx) + row := e.QueryRow(getProofsToAggregateSQL) + + var ( + generatingSince1, generatingSince2 *uint64 + createdAt1, createdAt2 *uint64 + updatedAt1, updatedAt2 *uint64 + ) + + err := row.Scan( + &proof1.BatchNumber, &proof1.BatchNumberFinal, &proof1.Proof, &proof1.ProofID, + &proof1.InputProver, &proof1.Prover, &proof1.ProverID, &generatingSince1, + &createdAt1, &updatedAt1, + &proof2.BatchNumber, &proof2.BatchNumberFinal, &proof2.Proof, &proof2.ProofID, + &proof2.InputProver, &proof2.Prover, &proof2.ProverID, &generatingSince2, + &createdAt2, &updatedAt2, + ) + + if generatingSince1 != nil { + timeSince1 := time.Unix(int64(*generatingSince1), 0) + proof1.GeneratingSince = &timeSince1 + } + + if generatingSince2 != nil { + timeSince2 := time.Unix(int64(*generatingSince2), 0) + proof2.GeneratingSince = &timeSince2 + } + + if createdAt1 != nil { + proof1.CreatedAt = time.Unix(int64(*createdAt1), 0) + } + + if createdAt2 != nil { + proof2.CreatedAt = time.Unix(int64(*createdAt2), 0) + } + + if updatedAt1 != nil { + proof1.UpdatedAt = time.Unix(int64(*updatedAt1), 0) + } + + if updatedAt2 != nil { + proof2.UpdatedAt = time.Unix(int64(*updatedAt2), 0) + } + + if errors.Is(err, sql.ErrNoRows) { + return nil, nil, state.ErrNotFound + } else if err != nil { + return nil, nil, err + } + + return proof1, proof2, err +} + +// AddGeneratedProof adds a generated proof to the storage +func (d *DBStorage) AddGeneratedProof(ctx context.Context, proof *state.Proof, dbTx db.Txer) error { + const addGeneratedProofSQL = ` + INSERT INTO proof ( + batch_num, batch_num_final, proof, proof_id, input_prover, prover, + prover_id, generating_since, created_at, updated_at + ) VALUES ( + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10 + ) + ` + e := d.getExecQuerier(dbTx) + now := time.Now().UTC().Round(time.Microsecond) + + var ( + generatingSince *uint64 + createdAt *uint64 + updatedAt *uint64 + ) + + if proof.GeneratingSince != nil { + generatingSince = new(uint64) + *generatingSince = uint64(proof.GeneratingSince.Unix()) + } + + if !proof.CreatedAt.IsZero() { + createdAt = new(uint64) + *createdAt = uint64(proof.CreatedAt.Unix()) + } else { + createdAt = new(uint64) + *createdAt = uint64(now.Unix()) + } + + if !proof.UpdatedAt.IsZero() { + updatedAt = new(uint64) + *updatedAt = uint64(proof.UpdatedAt.Unix()) + } else { + updatedAt = new(uint64) + *updatedAt = uint64(now.Unix()) + } + + _, err := e.Exec( + addGeneratedProofSQL, proof.BatchNumber, proof.BatchNumberFinal, proof.Proof, proof.ProofID, + proof.InputProver, proof.Prover, proof.ProverID, generatingSince, createdAt, updatedAt, + ) + return err +} + +// UpdateGeneratedProof updates a generated proof in the storage +func (d *DBStorage) UpdateGeneratedProof(ctx context.Context, proof *state.Proof, dbTx db.Txer) error { + const updateGeneratedProofSQL = ` + UPDATE proof + SET proof = $3, + proof_id = $4, + input_prover = $5, + prover = $6, + prover_id = $7, + generating_since = $8, + updated_at = $9 + WHERE batch_num = $1 + AND batch_num_final = $2 + ` + e := d.getExecQuerier(dbTx) + now := time.Now().UTC().Round(time.Microsecond) + + var ( + generatingSince *uint64 + updatedAt *uint64 + ) + + if proof.GeneratingSince != nil { + generatingSince = new(uint64) + *generatingSince = uint64(proof.GeneratingSince.Unix()) + } + + if !proof.UpdatedAt.IsZero() { + updatedAt = new(uint64) + *updatedAt = uint64(proof.UpdatedAt.Unix()) + } else { + updatedAt = new(uint64) + *updatedAt = uint64(now.Unix()) + } + _, err := e.Exec( + updateGeneratedProofSQL, proof.Proof, proof.ProofID, proof.InputProver, + proof.Prover, proof.ProverID, generatingSince, updatedAt, proof.BatchNumber, proof.BatchNumberFinal, + ) + return err +} + +// DeleteGeneratedProofs deletes from the storage the generated proofs falling +// inside the batch numbers range. +func (d *DBStorage) DeleteGeneratedProofs( + ctx context.Context, batchNumber uint64, batchNumberFinal uint64, dbTx db.Txer, +) error { + const deleteGeneratedProofSQL = "DELETE FROM proof WHERE batch_num >= $1 AND batch_num_final <= $2" + e := d.getExecQuerier(dbTx) + _, err := e.Exec(deleteGeneratedProofSQL, batchNumber, batchNumberFinal) + return err +} + +// CleanupGeneratedProofs deletes from the storage the generated proofs up to +// the specified batch number included. +func (d *DBStorage) CleanupGeneratedProofs(ctx context.Context, batchNumber uint64, dbTx db.Txer) error { + const deleteGeneratedProofSQL = "DELETE FROM proof WHERE batch_num_final <= $1" + e := d.getExecQuerier(dbTx) + _, err := e.Exec(deleteGeneratedProofSQL, batchNumber) + return err +} + +// CleanupLockedProofs deletes from the storage the proofs locked in generating +// state for more than the provided threshold. +func (d *DBStorage) CleanupLockedProofs(ctx context.Context, duration string, dbTx db.Txer) (int64, error) { + seconds, err := convertDurationToSeconds(duration) + if err != nil { + return 0, err + } + + difference := time.Now().Unix() - seconds + + sql := fmt.Sprintf("DELETE FROM proof WHERE generating_since is not null and generating_since < %d", difference) + e := d.getExecQuerier(dbTx) + ct, err := e.Exec(sql) + if err != nil { + return 0, err + } + return ct.RowsAffected() +} + +// DeleteUngeneratedProofs deletes ungenerated proofs. +// This method is meant to be use during aggregator boot-up sequence +func (d *DBStorage) DeleteUngeneratedProofs(ctx context.Context, dbTx db.Txer) error { + const deleteUngeneratedProofsSQL = "DELETE FROM proof WHERE generating_since IS NOT NULL" + e := d.getExecQuerier(dbTx) + _, err := e.Exec(deleteUngeneratedProofsSQL) + return err +} + +func convertDurationToSeconds(duration string) (int64, error) { + // Parse the duration using time.ParseDuration + parsedDuration, err := time.ParseDuration(duration) + if err != nil { + return 0, fmt.Errorf("invalid duration format: %w", err) + } + + // Return the duration in seconds + return int64(parsedDuration.Seconds()), nil +} diff --git a/aggregator/db/dbstorage/proof_test.go b/aggregator/db/dbstorage/proof_test.go new file mode 100644 index 00000000..18408318 --- /dev/null +++ b/aggregator/db/dbstorage/proof_test.go @@ -0,0 +1,151 @@ +package dbstorage + +import ( + "context" + "math" + "path" + "testing" + "time" + + "github.com/agglayer/aggkit/aggregator/db" + "github.com/agglayer/aggkit/state" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var ( + proofID = "proof_1" + prover = "prover_1" + proverID = "prover_id" +) + +func Test_Proof(t *testing.T) { + dbPath := path.Join(t.TempDir(), "Test_Proof.sqlite") + err := db.RunMigrationsUp(dbPath, db.AggregatorMigrationName) + assert.NoError(t, err) + + ctx := context.Background() + now := time.Now() + + DBStorage, err := NewDBStorage(dbPath) + assert.NoError(t, err) + + dbtxer, err := DBStorage.BeginTx(ctx, nil) + require.NoError(t, err) + + exists, err := DBStorage.CheckProofExistsForBatch(ctx, 1, dbtxer) + assert.NoError(t, err) + assert.False(t, exists) + + proof := state.Proof{ + BatchNumber: 1, + BatchNumberFinal: 1, + Proof: "proof content", + InputProver: "input prover", + ProofID: &proofID, + Prover: &prover, + ProverID: &proofID, + GeneratingSince: nil, + CreatedAt: now, + UpdatedAt: now, + } + + err = DBStorage.AddGeneratedProof(ctx, &proof, dbtxer) + assert.NoError(t, err) + + err = DBStorage.AddSequence(ctx, state.Sequence{FromBatchNumber: 1, ToBatchNumber: 1}, dbtxer) + assert.NoError(t, err) + + contains, err := DBStorage.CheckProofContainsCompleteSequences(ctx, &proof, dbtxer) + assert.NoError(t, err) + assert.True(t, contains) + + proof2, err := DBStorage.GetProofReadyToVerify(ctx, 0, dbtxer) + assert.NoError(t, err) + assert.NotNil(t, proof2) + + require.Equal(t, proof.BatchNumber, proof2.BatchNumber) + require.Equal(t, proof.BatchNumberFinal, proof2.BatchNumberFinal) + require.Equal(t, proof.Proof, proof2.Proof) + require.Equal(t, *proof.ProofID, *proof2.ProofID) + require.Equal(t, proof.InputProver, proof2.InputProver) + require.Equal(t, *proof.Prover, *proof2.Prover) + require.Equal(t, *proof.ProverID, *proof2.ProverID) + require.Equal(t, proof.CreatedAt.Unix(), proof2.CreatedAt.Unix()) + require.Equal(t, proof.UpdatedAt.Unix(), proof2.UpdatedAt.Unix()) + + proof = state.Proof{ + BatchNumber: 1, + BatchNumberFinal: 1, + Proof: "proof content", + InputProver: "input prover", + ProofID: &proofID, + Prover: &prover, + ProverID: &proofID, + GeneratingSince: &now, + CreatedAt: time.Now(), + UpdatedAt: time.Now(), + } + + err = DBStorage.UpdateGeneratedProof(ctx, &proof, dbtxer) + assert.NoError(t, err) + + sequence := state.Sequence{FromBatchNumber: 3, ToBatchNumber: 4} + + proof3 := state.Proof{ + BatchNumber: 3, + BatchNumberFinal: 3, + GeneratingSince: nil, + } + + proof4 := state.Proof{ + BatchNumber: 4, + BatchNumberFinal: 4, + GeneratingSince: nil, + } + + err = DBStorage.AddSequence(ctx, sequence, dbtxer) + assert.NoError(t, err) + + err = DBStorage.AddGeneratedProof(ctx, &proof3, dbtxer) + assert.NoError(t, err) + + err = DBStorage.AddGeneratedProof(ctx, &proof4, dbtxer) + assert.NoError(t, err) + + proof5, proof6, err := DBStorage.GetProofsToAggregate(ctx, dbtxer) + assert.NoError(t, err) + assert.NotNil(t, proof5) + assert.NotNil(t, proof6) + + err = DBStorage.DeleteGeneratedProofs(ctx, 1, math.MaxInt, dbtxer) + assert.NoError(t, err) + + err = DBStorage.CleanupGeneratedProofs(ctx, 1, dbtxer) + assert.NoError(t, err) + + now = time.Now() + + proof3.GeneratingSince = &now + proof4.GeneratingSince = &now + + err = DBStorage.AddGeneratedProof(ctx, &proof3, dbtxer) + assert.NoError(t, err) + + err = DBStorage.AddGeneratedProof(ctx, &proof4, dbtxer) + assert.NoError(t, err) + + time.Sleep(5 * time.Second) + + affected, err := DBStorage.CleanupLockedProofs(ctx, "4s", dbtxer) + assert.NoError(t, err) + require.Equal(t, int64(2), affected) + + proof5, proof6, err = DBStorage.GetProofsToAggregate(ctx, dbtxer) + assert.EqualError(t, err, state.ErrNotFound.Error()) + assert.Nil(t, proof5) + assert.Nil(t, proof6) + + err = DBStorage.DeleteUngeneratedProofs(ctx, dbtxer) + assert.NoError(t, err) +} diff --git a/aggregator/db/dbstorage/sequence.go b/aggregator/db/dbstorage/sequence.go new file mode 100644 index 00000000..f8a4ff03 --- /dev/null +++ b/aggregator/db/dbstorage/sequence.go @@ -0,0 +1,21 @@ +package dbstorage + +import ( + "context" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/state" +) + +// AddSequence stores the sequence information to allow the aggregator verify sequences. +func (d *DBStorage) AddSequence(ctx context.Context, sequence state.Sequence, dbTx db.Txer) error { + const addSequenceSQL = ` + INSERT INTO sequence (from_batch_num, to_batch_num) + VALUES($1, $2) + ON CONFLICT (from_batch_num) DO UPDATE SET to_batch_num = $2 + ` + + e := d.getExecQuerier(dbTx) + _, err := e.Exec(addSequenceSQL, sequence.FromBatchNumber, sequence.ToBatchNumber) + return err +} diff --git a/aggregator/db/logger.go b/aggregator/db/logger.go new file mode 100644 index 00000000..441a54fc --- /dev/null +++ b/aggregator/db/logger.go @@ -0,0 +1,27 @@ +package db + +import ( + "context" + "fmt" + + "github.com/agglayer/aggkit/log" + "github.com/jackc/pgx/v4" +) + +type dbLoggerImpl struct{} + +func (l dbLoggerImpl) Log(ctx context.Context, level pgx.LogLevel, msg string, data map[string]interface{}) { + m := fmt.Sprintf("%s %v", msg, data) + + switch level { + case pgx.LogLevelInfo: + log.Info(m) + case pgx.LogLevelWarn: + log.Warn(m) + case pgx.LogLevelError: + log.Error(m) + default: + m = fmt.Sprintf("[%s] %s %v", level.String(), msg, data) + log.Debug(m) + } +} diff --git a/aggregator/db/migrations.go b/aggregator/db/migrations.go new file mode 100644 index 00000000..695eb0c9 --- /dev/null +++ b/aggregator/db/migrations.go @@ -0,0 +1,122 @@ +package db + +import ( + "embed" + "fmt" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + migrate "github.com/rubenv/sql-migrate" +) + +const ( + // AggregatorMigrationName is the name of the migration used to associate with the migrations dir + AggregatorMigrationName = "aggregator-db" +) + +var ( + //go:embed migrations/*.sql + embedAggregatorMigrations embed.FS + + // embedMigrations is a map of migrations with the name + embedMigrations = map[string]embed.FS{} +) + +func init() { + embedMigrations[AggregatorMigrationName] = embedAggregatorMigrations +} + +// RunMigrationsUp runs migrate-up for the given config. +func RunMigrationsUp(dbPath string, name string) error { + log.Info("running migrations up") + + return runMigrations(dbPath, name, migrate.Up) +} + +// CheckMigrations runs migrate-up for the given config. +func CheckMigrations(dbPath string, name string) error { + return checkMigrations(dbPath, name) +} + +// RunMigrationsDown runs migrate-down for the given config. +func RunMigrationsDown(dbPath string, name string) error { + log.Info("running migrations down") + + return runMigrations(dbPath, name, migrate.Down) +} + +// runMigrations will execute pending migrations if needed to keep +// the database updated with the latest changes in either direction, +// up or down. +func runMigrations(dbPath string, name string, direction migrate.MigrationDirection) error { + db, err := db.NewSQLiteDB(dbPath) + if err != nil { + return err + } + + embedMigration, ok := embedMigrations[name] + if !ok { + return fmt.Errorf("migration not found with name: %v", name) + } + + var migrations = &migrate.EmbedFileSystemMigrationSource{ + FileSystem: embedMigration, + Root: "migrations", + } + + nMigrations, err := migrate.Exec(db, "sqlite3", migrations, direction) + if err != nil { + return err + } + + log.Info("successfully ran ", nMigrations, " migrations") + + return nil +} + +func checkMigrations(dbPath string, name string) error { + db, err := db.NewSQLiteDB(dbPath) + if err != nil { + return err + } + + embedMigration, ok := embedMigrations[name] + if !ok { + return fmt.Errorf("migration not found with name: %v", name) + } + + migrationSource := &migrate.EmbedFileSystemMigrationSource{FileSystem: embedMigration} + + migrations, err := migrationSource.FindMigrations() + if err != nil { + log.Errorf("error getting migrations from source: %v", err) + + return err + } + + var expected int + for _, migration := range migrations { + if len(migration.Up) != 0 { + expected++ + } + } + + var actual int + query := `SELECT COUNT(1) FROM public.gorp_migrations` + err = db.QueryRow(query).Scan(&actual) + if err != nil { + log.Error("error getting migrations count: ", err) + + return err + } + if expected == actual { + log.Infof("Found %d migrations as expected", actual) + } else { + return fmt.Errorf( + "error the component needs to run %d migrations before starting. DB only contains %d migrations", + expected, actual, + ) + } + + return nil +} diff --git a/aggregator/db/migrations/0001.sql b/aggregator/db/migrations/0001.sql new file mode 100644 index 00000000..651597a3 --- /dev/null +++ b/aggregator/db/migrations/0001.sql @@ -0,0 +1,24 @@ +-- +migrate Down +DROP TABLE IF EXISTS proof; +DROP TABLE IF EXISTS sequence; + +-- +migrate Up +CREATE TABLE IF NOT EXISTS proof ( + batch_num BIGINT NOT NULL, + batch_num_final BIGINT NOT NULL, + proof TEXT NULL, + proof_id TEXT NULL, + input_prover TEXT NULL, + prover TEXT NULL, + prover_id TEXT NULL, + created_at BIGINT NOT NULL, + updated_at BIGINT NOT NULL, + generating_since BIGINT DEFAULT NULL, + PRIMARY KEY (batch_num, batch_num_final) +); + +CREATE TABLE IF NOT EXISTS sequence ( + from_batch_num BIGINT NOT NULL, + to_batch_num BIGINT NOT NULL, + PRIMARY KEY (from_batch_num) +); diff --git a/aggregator/db/migrations_test.go b/aggregator/db/migrations_test.go new file mode 100644 index 00000000..aaf5e08e --- /dev/null +++ b/aggregator/db/migrations_test.go @@ -0,0 +1,28 @@ +package db + +import ( + "path" + "testing" + + migrate "github.com/rubenv/sql-migrate" + "github.com/stretchr/testify/assert" +) + +func Test_checkMigrations(t *testing.T) { + embedMigration := embedMigrations[AggregatorMigrationName] + migrationSource := &migrate.EmbedFileSystemMigrationSource{ + FileSystem: embedMigration, + } + + _, err := migrationSource.FileSystem.ReadFile("migrations/0001.sql") + assert.NoError(t, err) +} + +func Test_runMigrations(t *testing.T) { + dbPath := path.Join(t.TempDir(), "Test_runMigrations.sqlite") + err := runMigrations(dbPath, AggregatorMigrationName, migrate.Up) + assert.NoError(t, err) + + err = runMigrations(dbPath, AggregatorMigrationName, migrate.Down) + assert.NoError(t, err) +} diff --git a/aggregator/ethmantypes/finalproofinputs.go b/aggregator/ethmantypes/finalproofinputs.go new file mode 100644 index 00000000..1dcd98ad --- /dev/null +++ b/aggregator/ethmantypes/finalproofinputs.go @@ -0,0 +1,10 @@ +package ethmantypes + +import "github.com/agglayer/aggkit/aggregator/prover" + +// FinalProofInputs struct +type FinalProofInputs struct { + FinalProof *prover.FinalProof + NewLocalExitRoot []byte + NewStateRoot []byte +} diff --git a/aggregator/interfaces.go b/aggregator/interfaces.go new file mode 100644 index 00000000..7ccce5e3 --- /dev/null +++ b/aggregator/interfaces.go @@ -0,0 +1,100 @@ +package aggregator + +import ( + "context" + "database/sql" + "math/big" + + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + ethtxtypes "github.com/0xPolygon/zkevm-ethtx-manager/types" + ethmanTypes "github.com/agglayer/aggkit/aggregator/ethmantypes" + "github.com/agglayer/aggkit/aggregator/prover" + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/rpc/types" + "github.com/agglayer/aggkit/state" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto/kzg4844" +) + +// Consumer interfaces required by the package. +type RPCInterface interface { + GetBatch(batchNumber uint64) (*types.RPCBatch, error) + GetWitness(batchNumber uint64, fullWitness bool) ([]byte, error) +} + +type ProverInterface interface { + Name() string + ID() string + Addr() string + IsIdle() (bool, error) + BatchProof(input *prover.StatelessInputProver) (*string, error) + AggregatedProof(inputProof1, inputProof2 string) (*string, error) + FinalProof(inputProof string, aggregatorAddr string) (*string, error) + WaitRecursiveProof(ctx context.Context, proofID string) (string, common.Hash, common.Hash, error) + WaitFinalProof(ctx context.Context, proofID string) (*prover.FinalProof, error) +} + +// Etherman contains the methods required to interact with ethereum +type Etherman interface { + GetRollupId() uint32 + GetLatestVerifiedBatchNum() (uint64, error) + BuildTrustedVerifyBatchesTxData( + lastVerifiedBatch, newVerifiedBatch uint64, inputs *ethmanTypes.FinalProofInputs, beneficiary common.Address, + ) (to *common.Address, data []byte, err error) + GetLatestBlockHeader(ctx context.Context) (*ethtypes.Header, error) + GetBatchAccInputHash(ctx context.Context, batchNumber uint64) (common.Hash, error) + HeaderByNumber(ctx context.Context, number *big.Int) (*ethtypes.Header, error) +} + +// aggregatorTxProfitabilityChecker interface for different profitability +// checking algorithms. +type aggregatorTxProfitabilityChecker interface { + IsProfitable(context.Context, *big.Int) (bool, error) +} + +// StateInterface gathers the methods to interact with the state. +type StorageInterface interface { + BeginTx(ctx context.Context, options *sql.TxOptions) (db.Txer, error) + CheckProofContainsCompleteSequences(ctx context.Context, proof *state.Proof, dbTx db.Txer) (bool, error) + GetProofReadyToVerify(ctx context.Context, lastVerfiedBatchNumber uint64, dbTx db.Txer) (*state.Proof, error) + GetProofsToAggregate(ctx context.Context, dbTx db.Txer) (*state.Proof, *state.Proof, error) + AddGeneratedProof(ctx context.Context, proof *state.Proof, dbTx db.Txer) error + UpdateGeneratedProof(ctx context.Context, proof *state.Proof, dbTx db.Txer) error + DeleteGeneratedProofs(ctx context.Context, batchNumber uint64, batchNumberFinal uint64, dbTx db.Txer) error + DeleteUngeneratedProofs(ctx context.Context, dbTx db.Txer) error + CleanupGeneratedProofs(ctx context.Context, batchNumber uint64, dbTx db.Txer) error + CleanupLockedProofs(ctx context.Context, duration string, dbTx db.Txer) (int64, error) + CheckProofExistsForBatch(ctx context.Context, batchNumber uint64, dbTx db.Txer) (bool, error) + AddSequence(ctx context.Context, sequence state.Sequence, dbTx db.Txer) error +} + +// EthTxManagerClient represents the eth tx manager interface +type EthTxManagerClient interface { + Add( + ctx context.Context, + to *common.Address, + value *big.Int, + data []byte, + gasOffset uint64, + sidecar *ethtypes.BlobTxSidecar, + ) (common.Hash, error) + AddWithGas( + ctx context.Context, + to *common.Address, + value *big.Int, + data []byte, + gasOffset uint64, + sidecar *ethtypes.BlobTxSidecar, + gas uint64, + ) (common.Hash, error) + EncodeBlobData(data []byte) (kzg4844.Blob, error) + MakeBlobSidecar(blobs []kzg4844.Blob) *ethtypes.BlobTxSidecar + ProcessPendingMonitoredTxs(ctx context.Context, resultHandler ethtxmanager.ResultHandler) + Remove(ctx context.Context, id common.Hash) error + RemoveAll(ctx context.Context) error + Result(ctx context.Context, id common.Hash) (ethtxtypes.MonitoredTxResult, error) + ResultsByStatus(ctx context.Context, statuses []ethtxtypes.MonitoredTxStatus) ([]ethtxtypes.MonitoredTxResult, error) + Start() + Stop() +} diff --git a/aggregator/mocks/mock_eth_tx_manager.go b/aggregator/mocks/mock_eth_tx_manager.go new file mode 100644 index 00000000..47dabe1c --- /dev/null +++ b/aggregator/mocks/mock_eth_tx_manager.go @@ -0,0 +1,587 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + ethtxmanager "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + + kzg4844 "github.com/ethereum/go-ethereum/crypto/kzg4844" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" + + zkevm_ethtx_managertypes "github.com/0xPolygon/zkevm-ethtx-manager/types" +) + +// EthTxManagerClientMock is an autogenerated mock type for the EthTxManagerClient type +type EthTxManagerClientMock struct { + mock.Mock +} + +type EthTxManagerClientMock_Expecter struct { + mock *mock.Mock +} + +func (_m *EthTxManagerClientMock) EXPECT() *EthTxManagerClientMock_Expecter { + return &EthTxManagerClientMock_Expecter{mock: &_m.Mock} +} + +// Add provides a mock function with given fields: ctx, to, value, data, gasOffset, sidecar +func (_m *EthTxManagerClientMock) Add(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar) (common.Hash, error) { + ret := _m.Called(ctx, to, value, data, gasOffset, sidecar) + + if len(ret) == 0 { + panic("no return value specified for Add") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) (common.Hash, error)); ok { + return rf(ctx, to, value, data, gasOffset, sidecar) + } + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) common.Hash); ok { + r0 = rf(ctx, to, value, data, gasOffset, sidecar) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) error); ok { + r1 = rf(ctx, to, value, data, gasOffset, sidecar) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerClientMock_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add' +type EthTxManagerClientMock_Add_Call struct { + *mock.Call +} + +// Add is a helper method to define mock.On call +// - ctx context.Context +// - to *common.Address +// - value *big.Int +// - data []byte +// - gasOffset uint64 +// - sidecar *types.BlobTxSidecar +func (_e *EthTxManagerClientMock_Expecter) Add(ctx interface{}, to interface{}, value interface{}, data interface{}, gasOffset interface{}, sidecar interface{}) *EthTxManagerClientMock_Add_Call { + return &EthTxManagerClientMock_Add_Call{Call: _e.mock.On("Add", ctx, to, value, data, gasOffset, sidecar)} +} + +func (_c *EthTxManagerClientMock_Add_Call) Run(run func(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar)) *EthTxManagerClientMock_Add_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*common.Address), args[2].(*big.Int), args[3].([]byte), args[4].(uint64), args[5].(*types.BlobTxSidecar)) + }) + return _c +} + +func (_c *EthTxManagerClientMock_Add_Call) Return(_a0 common.Hash, _a1 error) *EthTxManagerClientMock_Add_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerClientMock_Add_Call) RunAndReturn(run func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) (common.Hash, error)) *EthTxManagerClientMock_Add_Call { + _c.Call.Return(run) + return _c +} + +// AddWithGas provides a mock function with given fields: ctx, to, value, data, gasOffset, sidecar, gas +func (_m *EthTxManagerClientMock) AddWithGas(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar, gas uint64) (common.Hash, error) { + ret := _m.Called(ctx, to, value, data, gasOffset, sidecar, gas) + + if len(ret) == 0 { + panic("no return value specified for AddWithGas") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar, uint64) (common.Hash, error)); ok { + return rf(ctx, to, value, data, gasOffset, sidecar, gas) + } + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar, uint64) common.Hash); ok { + r0 = rf(ctx, to, value, data, gasOffset, sidecar, gas) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar, uint64) error); ok { + r1 = rf(ctx, to, value, data, gasOffset, sidecar, gas) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerClientMock_AddWithGas_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddWithGas' +type EthTxManagerClientMock_AddWithGas_Call struct { + *mock.Call +} + +// AddWithGas is a helper method to define mock.On call +// - ctx context.Context +// - to *common.Address +// - value *big.Int +// - data []byte +// - gasOffset uint64 +// - sidecar *types.BlobTxSidecar +// - gas uint64 +func (_e *EthTxManagerClientMock_Expecter) AddWithGas(ctx interface{}, to interface{}, value interface{}, data interface{}, gasOffset interface{}, sidecar interface{}, gas interface{}) *EthTxManagerClientMock_AddWithGas_Call { + return &EthTxManagerClientMock_AddWithGas_Call{Call: _e.mock.On("AddWithGas", ctx, to, value, data, gasOffset, sidecar, gas)} +} + +func (_c *EthTxManagerClientMock_AddWithGas_Call) Run(run func(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar, gas uint64)) *EthTxManagerClientMock_AddWithGas_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*common.Address), args[2].(*big.Int), args[3].([]byte), args[4].(uint64), args[5].(*types.BlobTxSidecar), args[6].(uint64)) + }) + return _c +} + +func (_c *EthTxManagerClientMock_AddWithGas_Call) Return(_a0 common.Hash, _a1 error) *EthTxManagerClientMock_AddWithGas_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerClientMock_AddWithGas_Call) RunAndReturn(run func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar, uint64) (common.Hash, error)) *EthTxManagerClientMock_AddWithGas_Call { + _c.Call.Return(run) + return _c +} + +// EncodeBlobData provides a mock function with given fields: data +func (_m *EthTxManagerClientMock) EncodeBlobData(data []byte) (kzg4844.Blob, error) { + ret := _m.Called(data) + + if len(ret) == 0 { + panic("no return value specified for EncodeBlobData") + } + + var r0 kzg4844.Blob + var r1 error + if rf, ok := ret.Get(0).(func([]byte) (kzg4844.Blob, error)); ok { + return rf(data) + } + if rf, ok := ret.Get(0).(func([]byte) kzg4844.Blob); ok { + r0 = rf(data) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(kzg4844.Blob) + } + } + + if rf, ok := ret.Get(1).(func([]byte) error); ok { + r1 = rf(data) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerClientMock_EncodeBlobData_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EncodeBlobData' +type EthTxManagerClientMock_EncodeBlobData_Call struct { + *mock.Call +} + +// EncodeBlobData is a helper method to define mock.On call +// - data []byte +func (_e *EthTxManagerClientMock_Expecter) EncodeBlobData(data interface{}) *EthTxManagerClientMock_EncodeBlobData_Call { + return &EthTxManagerClientMock_EncodeBlobData_Call{Call: _e.mock.On("EncodeBlobData", data)} +} + +func (_c *EthTxManagerClientMock_EncodeBlobData_Call) Run(run func(data []byte)) *EthTxManagerClientMock_EncodeBlobData_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]byte)) + }) + return _c +} + +func (_c *EthTxManagerClientMock_EncodeBlobData_Call) Return(_a0 kzg4844.Blob, _a1 error) *EthTxManagerClientMock_EncodeBlobData_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerClientMock_EncodeBlobData_Call) RunAndReturn(run func([]byte) (kzg4844.Blob, error)) *EthTxManagerClientMock_EncodeBlobData_Call { + _c.Call.Return(run) + return _c +} + +// MakeBlobSidecar provides a mock function with given fields: blobs +func (_m *EthTxManagerClientMock) MakeBlobSidecar(blobs []kzg4844.Blob) *types.BlobTxSidecar { + ret := _m.Called(blobs) + + if len(ret) == 0 { + panic("no return value specified for MakeBlobSidecar") + } + + var r0 *types.BlobTxSidecar + if rf, ok := ret.Get(0).(func([]kzg4844.Blob) *types.BlobTxSidecar); ok { + r0 = rf(blobs) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.BlobTxSidecar) + } + } + + return r0 +} + +// EthTxManagerClientMock_MakeBlobSidecar_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'MakeBlobSidecar' +type EthTxManagerClientMock_MakeBlobSidecar_Call struct { + *mock.Call +} + +// MakeBlobSidecar is a helper method to define mock.On call +// - blobs []kzg4844.Blob +func (_e *EthTxManagerClientMock_Expecter) MakeBlobSidecar(blobs interface{}) *EthTxManagerClientMock_MakeBlobSidecar_Call { + return &EthTxManagerClientMock_MakeBlobSidecar_Call{Call: _e.mock.On("MakeBlobSidecar", blobs)} +} + +func (_c *EthTxManagerClientMock_MakeBlobSidecar_Call) Run(run func(blobs []kzg4844.Blob)) *EthTxManagerClientMock_MakeBlobSidecar_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]kzg4844.Blob)) + }) + return _c +} + +func (_c *EthTxManagerClientMock_MakeBlobSidecar_Call) Return(_a0 *types.BlobTxSidecar) *EthTxManagerClientMock_MakeBlobSidecar_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthTxManagerClientMock_MakeBlobSidecar_Call) RunAndReturn(run func([]kzg4844.Blob) *types.BlobTxSidecar) *EthTxManagerClientMock_MakeBlobSidecar_Call { + _c.Call.Return(run) + return _c +} + +// ProcessPendingMonitoredTxs provides a mock function with given fields: ctx, resultHandler +func (_m *EthTxManagerClientMock) ProcessPendingMonitoredTxs(ctx context.Context, resultHandler ethtxmanager.ResultHandler) { + _m.Called(ctx, resultHandler) +} + +// EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessPendingMonitoredTxs' +type EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call struct { + *mock.Call +} + +// ProcessPendingMonitoredTxs is a helper method to define mock.On call +// - ctx context.Context +// - resultHandler ethtxmanager.ResultHandler +func (_e *EthTxManagerClientMock_Expecter) ProcessPendingMonitoredTxs(ctx interface{}, resultHandler interface{}) *EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call { + return &EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call{Call: _e.mock.On("ProcessPendingMonitoredTxs", ctx, resultHandler)} +} + +func (_c *EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call) Run(run func(ctx context.Context, resultHandler ethtxmanager.ResultHandler)) *EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethtxmanager.ResultHandler)) + }) + return _c +} + +func (_c *EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call) Return() *EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call { + _c.Call.Return() + return _c +} + +func (_c *EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call) RunAndReturn(run func(context.Context, ethtxmanager.ResultHandler)) *EthTxManagerClientMock_ProcessPendingMonitoredTxs_Call { + _c.Run(run) + return _c +} + +// Remove provides a mock function with given fields: ctx, id +func (_m *EthTxManagerClientMock) Remove(ctx context.Context, id common.Hash) error { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for Remove") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) error); ok { + r0 = rf(ctx, id) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EthTxManagerClientMock_Remove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Remove' +type EthTxManagerClientMock_Remove_Call struct { + *mock.Call +} + +// Remove is a helper method to define mock.On call +// - ctx context.Context +// - id common.Hash +func (_e *EthTxManagerClientMock_Expecter) Remove(ctx interface{}, id interface{}) *EthTxManagerClientMock_Remove_Call { + return &EthTxManagerClientMock_Remove_Call{Call: _e.mock.On("Remove", ctx, id)} +} + +func (_c *EthTxManagerClientMock_Remove_Call) Run(run func(ctx context.Context, id common.Hash)) *EthTxManagerClientMock_Remove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthTxManagerClientMock_Remove_Call) Return(_a0 error) *EthTxManagerClientMock_Remove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthTxManagerClientMock_Remove_Call) RunAndReturn(run func(context.Context, common.Hash) error) *EthTxManagerClientMock_Remove_Call { + _c.Call.Return(run) + return _c +} + +// RemoveAll provides a mock function with given fields: ctx +func (_m *EthTxManagerClientMock) RemoveAll(ctx context.Context) error { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for RemoveAll") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context) error); ok { + r0 = rf(ctx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EthTxManagerClientMock_RemoveAll_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RemoveAll' +type EthTxManagerClientMock_RemoveAll_Call struct { + *mock.Call +} + +// RemoveAll is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthTxManagerClientMock_Expecter) RemoveAll(ctx interface{}) *EthTxManagerClientMock_RemoveAll_Call { + return &EthTxManagerClientMock_RemoveAll_Call{Call: _e.mock.On("RemoveAll", ctx)} +} + +func (_c *EthTxManagerClientMock_RemoveAll_Call) Run(run func(ctx context.Context)) *EthTxManagerClientMock_RemoveAll_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthTxManagerClientMock_RemoveAll_Call) Return(_a0 error) *EthTxManagerClientMock_RemoveAll_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthTxManagerClientMock_RemoveAll_Call) RunAndReturn(run func(context.Context) error) *EthTxManagerClientMock_RemoveAll_Call { + _c.Call.Return(run) + return _c +} + +// Result provides a mock function with given fields: ctx, id +func (_m *EthTxManagerClientMock) Result(ctx context.Context, id common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error) { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for Result") + } + + var r0 zkevm_ethtx_managertypes.MonitoredTxResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error)); ok { + return rf(ctx, id) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) zkevm_ethtx_managertypes.MonitoredTxResult); ok { + r0 = rf(ctx, id) + } else { + r0 = ret.Get(0).(zkevm_ethtx_managertypes.MonitoredTxResult) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerClientMock_Result_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Result' +type EthTxManagerClientMock_Result_Call struct { + *mock.Call +} + +// Result is a helper method to define mock.On call +// - ctx context.Context +// - id common.Hash +func (_e *EthTxManagerClientMock_Expecter) Result(ctx interface{}, id interface{}) *EthTxManagerClientMock_Result_Call { + return &EthTxManagerClientMock_Result_Call{Call: _e.mock.On("Result", ctx, id)} +} + +func (_c *EthTxManagerClientMock_Result_Call) Run(run func(ctx context.Context, id common.Hash)) *EthTxManagerClientMock_Result_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthTxManagerClientMock_Result_Call) Return(_a0 zkevm_ethtx_managertypes.MonitoredTxResult, _a1 error) *EthTxManagerClientMock_Result_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerClientMock_Result_Call) RunAndReturn(run func(context.Context, common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error)) *EthTxManagerClientMock_Result_Call { + _c.Call.Return(run) + return _c +} + +// ResultsByStatus provides a mock function with given fields: ctx, statuses +func (_m *EthTxManagerClientMock) ResultsByStatus(ctx context.Context, statuses []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error) { + ret := _m.Called(ctx, statuses) + + if len(ret) == 0 { + panic("no return value specified for ResultsByStatus") + } + + var r0 []zkevm_ethtx_managertypes.MonitoredTxResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error)); ok { + return rf(ctx, statuses) + } + if rf, ok := ret.Get(0).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) []zkevm_ethtx_managertypes.MonitoredTxResult); ok { + r0 = rf(ctx, statuses) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]zkevm_ethtx_managertypes.MonitoredTxResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) error); ok { + r1 = rf(ctx, statuses) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerClientMock_ResultsByStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ResultsByStatus' +type EthTxManagerClientMock_ResultsByStatus_Call struct { + *mock.Call +} + +// ResultsByStatus is a helper method to define mock.On call +// - ctx context.Context +// - statuses []zkevm_ethtx_managertypes.MonitoredTxStatus +func (_e *EthTxManagerClientMock_Expecter) ResultsByStatus(ctx interface{}, statuses interface{}) *EthTxManagerClientMock_ResultsByStatus_Call { + return &EthTxManagerClientMock_ResultsByStatus_Call{Call: _e.mock.On("ResultsByStatus", ctx, statuses)} +} + +func (_c *EthTxManagerClientMock_ResultsByStatus_Call) Run(run func(ctx context.Context, statuses []zkevm_ethtx_managertypes.MonitoredTxStatus)) *EthTxManagerClientMock_ResultsByStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]zkevm_ethtx_managertypes.MonitoredTxStatus)) + }) + return _c +} + +func (_c *EthTxManagerClientMock_ResultsByStatus_Call) Return(_a0 []zkevm_ethtx_managertypes.MonitoredTxResult, _a1 error) *EthTxManagerClientMock_ResultsByStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerClientMock_ResultsByStatus_Call) RunAndReturn(run func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error)) *EthTxManagerClientMock_ResultsByStatus_Call { + _c.Call.Return(run) + return _c +} + +// Start provides a mock function with no fields +func (_m *EthTxManagerClientMock) Start() { + _m.Called() +} + +// EthTxManagerClientMock_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +type EthTxManagerClientMock_Start_Call struct { + *mock.Call +} + +// Start is a helper method to define mock.On call +func (_e *EthTxManagerClientMock_Expecter) Start() *EthTxManagerClientMock_Start_Call { + return &EthTxManagerClientMock_Start_Call{Call: _e.mock.On("Start")} +} + +func (_c *EthTxManagerClientMock_Start_Call) Run(run func()) *EthTxManagerClientMock_Start_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EthTxManagerClientMock_Start_Call) Return() *EthTxManagerClientMock_Start_Call { + _c.Call.Return() + return _c +} + +func (_c *EthTxManagerClientMock_Start_Call) RunAndReturn(run func()) *EthTxManagerClientMock_Start_Call { + _c.Run(run) + return _c +} + +// Stop provides a mock function with no fields +func (_m *EthTxManagerClientMock) Stop() { + _m.Called() +} + +// EthTxManagerClientMock_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' +type EthTxManagerClientMock_Stop_Call struct { + *mock.Call +} + +// Stop is a helper method to define mock.On call +func (_e *EthTxManagerClientMock_Expecter) Stop() *EthTxManagerClientMock_Stop_Call { + return &EthTxManagerClientMock_Stop_Call{Call: _e.mock.On("Stop")} +} + +func (_c *EthTxManagerClientMock_Stop_Call) Run(run func()) *EthTxManagerClientMock_Stop_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EthTxManagerClientMock_Stop_Call) Return() *EthTxManagerClientMock_Stop_Call { + _c.Call.Return() + return _c +} + +func (_c *EthTxManagerClientMock_Stop_Call) RunAndReturn(run func()) *EthTxManagerClientMock_Stop_Call { + _c.Run(run) + return _c +} + +// NewEthTxManagerClientMock creates a new instance of EthTxManagerClientMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthTxManagerClientMock(t interface { + mock.TestingT + Cleanup(func()) +}) *EthTxManagerClientMock { + mock := &EthTxManagerClientMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggregator/mocks/mock_etherman.go b/aggregator/mocks/mock_etherman.go new file mode 100644 index 00000000..d704dd86 --- /dev/null +++ b/aggregator/mocks/mock_etherman.go @@ -0,0 +1,389 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + ethmantypes "github.com/agglayer/aggkit/aggregator/ethmantypes" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// EthermanMock is an autogenerated mock type for the Etherman type +type EthermanMock struct { + mock.Mock +} + +type EthermanMock_Expecter struct { + mock *mock.Mock +} + +func (_m *EthermanMock) EXPECT() *EthermanMock_Expecter { + return &EthermanMock_Expecter{mock: &_m.Mock} +} + +// BuildTrustedVerifyBatchesTxData provides a mock function with given fields: lastVerifiedBatch, newVerifiedBatch, inputs, beneficiary +func (_m *EthermanMock) BuildTrustedVerifyBatchesTxData(lastVerifiedBatch uint64, newVerifiedBatch uint64, inputs *ethmantypes.FinalProofInputs, beneficiary common.Address) (*common.Address, []byte, error) { + ret := _m.Called(lastVerifiedBatch, newVerifiedBatch, inputs, beneficiary) + + if len(ret) == 0 { + panic("no return value specified for BuildTrustedVerifyBatchesTxData") + } + + var r0 *common.Address + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(uint64, uint64, *ethmantypes.FinalProofInputs, common.Address) (*common.Address, []byte, error)); ok { + return rf(lastVerifiedBatch, newVerifiedBatch, inputs, beneficiary) + } + if rf, ok := ret.Get(0).(func(uint64, uint64, *ethmantypes.FinalProofInputs, common.Address) *common.Address); ok { + r0 = rf(lastVerifiedBatch, newVerifiedBatch, inputs, beneficiary) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*common.Address) + } + } + + if rf, ok := ret.Get(1).(func(uint64, uint64, *ethmantypes.FinalProofInputs, common.Address) []byte); ok { + r1 = rf(lastVerifiedBatch, newVerifiedBatch, inputs, beneficiary) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).([]byte) + } + } + + if rf, ok := ret.Get(2).(func(uint64, uint64, *ethmantypes.FinalProofInputs, common.Address) error); ok { + r2 = rf(lastVerifiedBatch, newVerifiedBatch, inputs, beneficiary) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// EthermanMock_BuildTrustedVerifyBatchesTxData_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BuildTrustedVerifyBatchesTxData' +type EthermanMock_BuildTrustedVerifyBatchesTxData_Call struct { + *mock.Call +} + +// BuildTrustedVerifyBatchesTxData is a helper method to define mock.On call +// - lastVerifiedBatch uint64 +// - newVerifiedBatch uint64 +// - inputs *ethmantypes.FinalProofInputs +// - beneficiary common.Address +func (_e *EthermanMock_Expecter) BuildTrustedVerifyBatchesTxData(lastVerifiedBatch interface{}, newVerifiedBatch interface{}, inputs interface{}, beneficiary interface{}) *EthermanMock_BuildTrustedVerifyBatchesTxData_Call { + return &EthermanMock_BuildTrustedVerifyBatchesTxData_Call{Call: _e.mock.On("BuildTrustedVerifyBatchesTxData", lastVerifiedBatch, newVerifiedBatch, inputs, beneficiary)} +} + +func (_c *EthermanMock_BuildTrustedVerifyBatchesTxData_Call) Run(run func(lastVerifiedBatch uint64, newVerifiedBatch uint64, inputs *ethmantypes.FinalProofInputs, beneficiary common.Address)) *EthermanMock_BuildTrustedVerifyBatchesTxData_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64), args[1].(uint64), args[2].(*ethmantypes.FinalProofInputs), args[3].(common.Address)) + }) + return _c +} + +func (_c *EthermanMock_BuildTrustedVerifyBatchesTxData_Call) Return(to *common.Address, data []byte, err error) *EthermanMock_BuildTrustedVerifyBatchesTxData_Call { + _c.Call.Return(to, data, err) + return _c +} + +func (_c *EthermanMock_BuildTrustedVerifyBatchesTxData_Call) RunAndReturn(run func(uint64, uint64, *ethmantypes.FinalProofInputs, common.Address) (*common.Address, []byte, error)) *EthermanMock_BuildTrustedVerifyBatchesTxData_Call { + _c.Call.Return(run) + return _c +} + +// GetBatchAccInputHash provides a mock function with given fields: ctx, batchNumber +func (_m *EthermanMock) GetBatchAccInputHash(ctx context.Context, batchNumber uint64) (common.Hash, error) { + ret := _m.Called(ctx, batchNumber) + + if len(ret) == 0 { + panic("no return value specified for GetBatchAccInputHash") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint64) (common.Hash, error)); ok { + return rf(ctx, batchNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64) common.Hash); ok { + r0 = rf(ctx, batchNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok { + r1 = rf(ctx, batchNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthermanMock_GetBatchAccInputHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBatchAccInputHash' +type EthermanMock_GetBatchAccInputHash_Call struct { + *mock.Call +} + +// GetBatchAccInputHash is a helper method to define mock.On call +// - ctx context.Context +// - batchNumber uint64 +func (_e *EthermanMock_Expecter) GetBatchAccInputHash(ctx interface{}, batchNumber interface{}) *EthermanMock_GetBatchAccInputHash_Call { + return &EthermanMock_GetBatchAccInputHash_Call{Call: _e.mock.On("GetBatchAccInputHash", ctx, batchNumber)} +} + +func (_c *EthermanMock_GetBatchAccInputHash_Call) Run(run func(ctx context.Context, batchNumber uint64)) *EthermanMock_GetBatchAccInputHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64)) + }) + return _c +} + +func (_c *EthermanMock_GetBatchAccInputHash_Call) Return(_a0 common.Hash, _a1 error) *EthermanMock_GetBatchAccInputHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthermanMock_GetBatchAccInputHash_Call) RunAndReturn(run func(context.Context, uint64) (common.Hash, error)) *EthermanMock_GetBatchAccInputHash_Call { + _c.Call.Return(run) + return _c +} + +// GetLatestBlockHeader provides a mock function with given fields: ctx +func (_m *EthermanMock) GetLatestBlockHeader(ctx context.Context) (*types.Header, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetLatestBlockHeader") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*types.Header, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *types.Header); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthermanMock_GetLatestBlockHeader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLatestBlockHeader' +type EthermanMock_GetLatestBlockHeader_Call struct { + *mock.Call +} + +// GetLatestBlockHeader is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthermanMock_Expecter) GetLatestBlockHeader(ctx interface{}) *EthermanMock_GetLatestBlockHeader_Call { + return &EthermanMock_GetLatestBlockHeader_Call{Call: _e.mock.On("GetLatestBlockHeader", ctx)} +} + +func (_c *EthermanMock_GetLatestBlockHeader_Call) Run(run func(ctx context.Context)) *EthermanMock_GetLatestBlockHeader_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthermanMock_GetLatestBlockHeader_Call) Return(_a0 *types.Header, _a1 error) *EthermanMock_GetLatestBlockHeader_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthermanMock_GetLatestBlockHeader_Call) RunAndReturn(run func(context.Context) (*types.Header, error)) *EthermanMock_GetLatestBlockHeader_Call { + _c.Call.Return(run) + return _c +} + +// GetLatestVerifiedBatchNum provides a mock function with no fields +func (_m *EthermanMock) GetLatestVerifiedBatchNum() (uint64, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetLatestVerifiedBatchNum") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func() (uint64, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthermanMock_GetLatestVerifiedBatchNum_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLatestVerifiedBatchNum' +type EthermanMock_GetLatestVerifiedBatchNum_Call struct { + *mock.Call +} + +// GetLatestVerifiedBatchNum is a helper method to define mock.On call +func (_e *EthermanMock_Expecter) GetLatestVerifiedBatchNum() *EthermanMock_GetLatestVerifiedBatchNum_Call { + return &EthermanMock_GetLatestVerifiedBatchNum_Call{Call: _e.mock.On("GetLatestVerifiedBatchNum")} +} + +func (_c *EthermanMock_GetLatestVerifiedBatchNum_Call) Run(run func()) *EthermanMock_GetLatestVerifiedBatchNum_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EthermanMock_GetLatestVerifiedBatchNum_Call) Return(_a0 uint64, _a1 error) *EthermanMock_GetLatestVerifiedBatchNum_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthermanMock_GetLatestVerifiedBatchNum_Call) RunAndReturn(run func() (uint64, error)) *EthermanMock_GetLatestVerifiedBatchNum_Call { + _c.Call.Return(run) + return _c +} + +// GetRollupId provides a mock function with no fields +func (_m *EthermanMock) GetRollupId() uint32 { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetRollupId") + } + + var r0 uint32 + if rf, ok := ret.Get(0).(func() uint32); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint32) + } + + return r0 +} + +// EthermanMock_GetRollupId_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRollupId' +type EthermanMock_GetRollupId_Call struct { + *mock.Call +} + +// GetRollupId is a helper method to define mock.On call +func (_e *EthermanMock_Expecter) GetRollupId() *EthermanMock_GetRollupId_Call { + return &EthermanMock_GetRollupId_Call{Call: _e.mock.On("GetRollupId")} +} + +func (_c *EthermanMock_GetRollupId_Call) Run(run func()) *EthermanMock_GetRollupId_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EthermanMock_GetRollupId_Call) Return(_a0 uint32) *EthermanMock_GetRollupId_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthermanMock_GetRollupId_Call) RunAndReturn(run func() uint32) *EthermanMock_GetRollupId_Call { + _c.Call.Return(run) + return _c +} + +// HeaderByNumber provides a mock function with given fields: ctx, number +func (_m *EthermanMock) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for HeaderByNumber") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Header, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Header); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthermanMock_HeaderByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByNumber' +type EthermanMock_HeaderByNumber_Call struct { + *mock.Call +} + +// HeaderByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *EthermanMock_Expecter) HeaderByNumber(ctx interface{}, number interface{}) *EthermanMock_HeaderByNumber_Call { + return &EthermanMock_HeaderByNumber_Call{Call: _e.mock.On("HeaderByNumber", ctx, number)} +} + +func (_c *EthermanMock_HeaderByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *EthermanMock_HeaderByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *EthermanMock_HeaderByNumber_Call) Return(_a0 *types.Header, _a1 error) *EthermanMock_HeaderByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthermanMock_HeaderByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*types.Header, error)) *EthermanMock_HeaderByNumber_Call { + _c.Call.Return(run) + return _c +} + +// NewEthermanMock creates a new instance of EthermanMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthermanMock(t interface { + mock.TestingT + Cleanup(func()) +}) *EthermanMock { + mock := &EthermanMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggregator/mocks/mock_prover.go b/aggregator/mocks/mock_prover.go new file mode 100644 index 00000000..8e8c94e3 --- /dev/null +++ b/aggregator/mocks/mock_prover.go @@ -0,0 +1,540 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + prover "github.com/agglayer/aggkit/aggregator/prover" +) + +// ProverInterfaceMock is an autogenerated mock type for the ProverInterface type +type ProverInterfaceMock struct { + mock.Mock +} + +type ProverInterfaceMock_Expecter struct { + mock *mock.Mock +} + +func (_m *ProverInterfaceMock) EXPECT() *ProverInterfaceMock_Expecter { + return &ProverInterfaceMock_Expecter{mock: &_m.Mock} +} + +// Addr provides a mock function with no fields +func (_m *ProverInterfaceMock) Addr() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Addr") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// ProverInterfaceMock_Addr_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Addr' +type ProverInterfaceMock_Addr_Call struct { + *mock.Call +} + +// Addr is a helper method to define mock.On call +func (_e *ProverInterfaceMock_Expecter) Addr() *ProverInterfaceMock_Addr_Call { + return &ProverInterfaceMock_Addr_Call{Call: _e.mock.On("Addr")} +} + +func (_c *ProverInterfaceMock_Addr_Call) Run(run func()) *ProverInterfaceMock_Addr_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ProverInterfaceMock_Addr_Call) Return(_a0 string) *ProverInterfaceMock_Addr_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ProverInterfaceMock_Addr_Call) RunAndReturn(run func() string) *ProverInterfaceMock_Addr_Call { + _c.Call.Return(run) + return _c +} + +// AggregatedProof provides a mock function with given fields: inputProof1, inputProof2 +func (_m *ProverInterfaceMock) AggregatedProof(inputProof1 string, inputProof2 string) (*string, error) { + ret := _m.Called(inputProof1, inputProof2) + + if len(ret) == 0 { + panic("no return value specified for AggregatedProof") + } + + var r0 *string + var r1 error + if rf, ok := ret.Get(0).(func(string, string) (*string, error)); ok { + return rf(inputProof1, inputProof2) + } + if rf, ok := ret.Get(0).(func(string, string) *string); ok { + r0 = rf(inputProof1, inputProof2) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*string) + } + } + + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(inputProof1, inputProof2) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProverInterfaceMock_AggregatedProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AggregatedProof' +type ProverInterfaceMock_AggregatedProof_Call struct { + *mock.Call +} + +// AggregatedProof is a helper method to define mock.On call +// - inputProof1 string +// - inputProof2 string +func (_e *ProverInterfaceMock_Expecter) AggregatedProof(inputProof1 interface{}, inputProof2 interface{}) *ProverInterfaceMock_AggregatedProof_Call { + return &ProverInterfaceMock_AggregatedProof_Call{Call: _e.mock.On("AggregatedProof", inputProof1, inputProof2)} +} + +func (_c *ProverInterfaceMock_AggregatedProof_Call) Run(run func(inputProof1 string, inputProof2 string)) *ProverInterfaceMock_AggregatedProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(string)) + }) + return _c +} + +func (_c *ProverInterfaceMock_AggregatedProof_Call) Return(_a0 *string, _a1 error) *ProverInterfaceMock_AggregatedProof_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ProverInterfaceMock_AggregatedProof_Call) RunAndReturn(run func(string, string) (*string, error)) *ProverInterfaceMock_AggregatedProof_Call { + _c.Call.Return(run) + return _c +} + +// BatchProof provides a mock function with given fields: input +func (_m *ProverInterfaceMock) BatchProof(input *prover.StatelessInputProver) (*string, error) { + ret := _m.Called(input) + + if len(ret) == 0 { + panic("no return value specified for BatchProof") + } + + var r0 *string + var r1 error + if rf, ok := ret.Get(0).(func(*prover.StatelessInputProver) (*string, error)); ok { + return rf(input) + } + if rf, ok := ret.Get(0).(func(*prover.StatelessInputProver) *string); ok { + r0 = rf(input) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*string) + } + } + + if rf, ok := ret.Get(1).(func(*prover.StatelessInputProver) error); ok { + r1 = rf(input) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProverInterfaceMock_BatchProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BatchProof' +type ProverInterfaceMock_BatchProof_Call struct { + *mock.Call +} + +// BatchProof is a helper method to define mock.On call +// - input *prover.StatelessInputProver +func (_e *ProverInterfaceMock_Expecter) BatchProof(input interface{}) *ProverInterfaceMock_BatchProof_Call { + return &ProverInterfaceMock_BatchProof_Call{Call: _e.mock.On("BatchProof", input)} +} + +func (_c *ProverInterfaceMock_BatchProof_Call) Run(run func(input *prover.StatelessInputProver)) *ProverInterfaceMock_BatchProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*prover.StatelessInputProver)) + }) + return _c +} + +func (_c *ProverInterfaceMock_BatchProof_Call) Return(_a0 *string, _a1 error) *ProverInterfaceMock_BatchProof_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ProverInterfaceMock_BatchProof_Call) RunAndReturn(run func(*prover.StatelessInputProver) (*string, error)) *ProverInterfaceMock_BatchProof_Call { + _c.Call.Return(run) + return _c +} + +// FinalProof provides a mock function with given fields: inputProof, aggregatorAddr +func (_m *ProverInterfaceMock) FinalProof(inputProof string, aggregatorAddr string) (*string, error) { + ret := _m.Called(inputProof, aggregatorAddr) + + if len(ret) == 0 { + panic("no return value specified for FinalProof") + } + + var r0 *string + var r1 error + if rf, ok := ret.Get(0).(func(string, string) (*string, error)); ok { + return rf(inputProof, aggregatorAddr) + } + if rf, ok := ret.Get(0).(func(string, string) *string); ok { + r0 = rf(inputProof, aggregatorAddr) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*string) + } + } + + if rf, ok := ret.Get(1).(func(string, string) error); ok { + r1 = rf(inputProof, aggregatorAddr) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProverInterfaceMock_FinalProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FinalProof' +type ProverInterfaceMock_FinalProof_Call struct { + *mock.Call +} + +// FinalProof is a helper method to define mock.On call +// - inputProof string +// - aggregatorAddr string +func (_e *ProverInterfaceMock_Expecter) FinalProof(inputProof interface{}, aggregatorAddr interface{}) *ProverInterfaceMock_FinalProof_Call { + return &ProverInterfaceMock_FinalProof_Call{Call: _e.mock.On("FinalProof", inputProof, aggregatorAddr)} +} + +func (_c *ProverInterfaceMock_FinalProof_Call) Run(run func(inputProof string, aggregatorAddr string)) *ProverInterfaceMock_FinalProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string), args[1].(string)) + }) + return _c +} + +func (_c *ProverInterfaceMock_FinalProof_Call) Return(_a0 *string, _a1 error) *ProverInterfaceMock_FinalProof_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ProverInterfaceMock_FinalProof_Call) RunAndReturn(run func(string, string) (*string, error)) *ProverInterfaceMock_FinalProof_Call { + _c.Call.Return(run) + return _c +} + +// ID provides a mock function with no fields +func (_m *ProverInterfaceMock) ID() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for ID") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// ProverInterfaceMock_ID_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ID' +type ProverInterfaceMock_ID_Call struct { + *mock.Call +} + +// ID is a helper method to define mock.On call +func (_e *ProverInterfaceMock_Expecter) ID() *ProverInterfaceMock_ID_Call { + return &ProverInterfaceMock_ID_Call{Call: _e.mock.On("ID")} +} + +func (_c *ProverInterfaceMock_ID_Call) Run(run func()) *ProverInterfaceMock_ID_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ProverInterfaceMock_ID_Call) Return(_a0 string) *ProverInterfaceMock_ID_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ProverInterfaceMock_ID_Call) RunAndReturn(run func() string) *ProverInterfaceMock_ID_Call { + _c.Call.Return(run) + return _c +} + +// IsIdle provides a mock function with no fields +func (_m *ProverInterfaceMock) IsIdle() (bool, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for IsIdle") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func() (bool, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProverInterfaceMock_IsIdle_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsIdle' +type ProverInterfaceMock_IsIdle_Call struct { + *mock.Call +} + +// IsIdle is a helper method to define mock.On call +func (_e *ProverInterfaceMock_Expecter) IsIdle() *ProverInterfaceMock_IsIdle_Call { + return &ProverInterfaceMock_IsIdle_Call{Call: _e.mock.On("IsIdle")} +} + +func (_c *ProverInterfaceMock_IsIdle_Call) Run(run func()) *ProverInterfaceMock_IsIdle_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ProverInterfaceMock_IsIdle_Call) Return(_a0 bool, _a1 error) *ProverInterfaceMock_IsIdle_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ProverInterfaceMock_IsIdle_Call) RunAndReturn(run func() (bool, error)) *ProverInterfaceMock_IsIdle_Call { + _c.Call.Return(run) + return _c +} + +// Name provides a mock function with no fields +func (_m *ProverInterfaceMock) Name() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Name") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// ProverInterfaceMock_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name' +type ProverInterfaceMock_Name_Call struct { + *mock.Call +} + +// Name is a helper method to define mock.On call +func (_e *ProverInterfaceMock_Expecter) Name() *ProverInterfaceMock_Name_Call { + return &ProverInterfaceMock_Name_Call{Call: _e.mock.On("Name")} +} + +func (_c *ProverInterfaceMock_Name_Call) Run(run func()) *ProverInterfaceMock_Name_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ProverInterfaceMock_Name_Call) Return(_a0 string) *ProverInterfaceMock_Name_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ProverInterfaceMock_Name_Call) RunAndReturn(run func() string) *ProverInterfaceMock_Name_Call { + _c.Call.Return(run) + return _c +} + +// WaitFinalProof provides a mock function with given fields: ctx, proofID +func (_m *ProverInterfaceMock) WaitFinalProof(ctx context.Context, proofID string) (*prover.FinalProof, error) { + ret := _m.Called(ctx, proofID) + + if len(ret) == 0 { + panic("no return value specified for WaitFinalProof") + } + + var r0 *prover.FinalProof + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*prover.FinalProof, error)); ok { + return rf(ctx, proofID) + } + if rf, ok := ret.Get(0).(func(context.Context, string) *prover.FinalProof); ok { + r0 = rf(ctx, proofID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*prover.FinalProof) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { + r1 = rf(ctx, proofID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProverInterfaceMock_WaitFinalProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WaitFinalProof' +type ProverInterfaceMock_WaitFinalProof_Call struct { + *mock.Call +} + +// WaitFinalProof is a helper method to define mock.On call +// - ctx context.Context +// - proofID string +func (_e *ProverInterfaceMock_Expecter) WaitFinalProof(ctx interface{}, proofID interface{}) *ProverInterfaceMock_WaitFinalProof_Call { + return &ProverInterfaceMock_WaitFinalProof_Call{Call: _e.mock.On("WaitFinalProof", ctx, proofID)} +} + +func (_c *ProverInterfaceMock_WaitFinalProof_Call) Run(run func(ctx context.Context, proofID string)) *ProverInterfaceMock_WaitFinalProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *ProverInterfaceMock_WaitFinalProof_Call) Return(_a0 *prover.FinalProof, _a1 error) *ProverInterfaceMock_WaitFinalProof_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ProverInterfaceMock_WaitFinalProof_Call) RunAndReturn(run func(context.Context, string) (*prover.FinalProof, error)) *ProverInterfaceMock_WaitFinalProof_Call { + _c.Call.Return(run) + return _c +} + +// WaitRecursiveProof provides a mock function with given fields: ctx, proofID +func (_m *ProverInterfaceMock) WaitRecursiveProof(ctx context.Context, proofID string) (string, common.Hash, common.Hash, error) { + ret := _m.Called(ctx, proofID) + + if len(ret) == 0 { + panic("no return value specified for WaitRecursiveProof") + } + + var r0 string + var r1 common.Hash + var r2 common.Hash + var r3 error + if rf, ok := ret.Get(0).(func(context.Context, string) (string, common.Hash, common.Hash, error)); ok { + return rf(ctx, proofID) + } + if rf, ok := ret.Get(0).(func(context.Context, string) string); ok { + r0 = rf(ctx, proofID) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) common.Hash); ok { + r1 = rf(ctx, proofID) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(common.Hash) + } + } + + if rf, ok := ret.Get(2).(func(context.Context, string) common.Hash); ok { + r2 = rf(ctx, proofID) + } else { + if ret.Get(2) != nil { + r2 = ret.Get(2).(common.Hash) + } + } + + if rf, ok := ret.Get(3).(func(context.Context, string) error); ok { + r3 = rf(ctx, proofID) + } else { + r3 = ret.Error(3) + } + + return r0, r1, r2, r3 +} + +// ProverInterfaceMock_WaitRecursiveProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WaitRecursiveProof' +type ProverInterfaceMock_WaitRecursiveProof_Call struct { + *mock.Call +} + +// WaitRecursiveProof is a helper method to define mock.On call +// - ctx context.Context +// - proofID string +func (_e *ProverInterfaceMock_Expecter) WaitRecursiveProof(ctx interface{}, proofID interface{}) *ProverInterfaceMock_WaitRecursiveProof_Call { + return &ProverInterfaceMock_WaitRecursiveProof_Call{Call: _e.mock.On("WaitRecursiveProof", ctx, proofID)} +} + +func (_c *ProverInterfaceMock_WaitRecursiveProof_Call) Run(run func(ctx context.Context, proofID string)) *ProverInterfaceMock_WaitRecursiveProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string)) + }) + return _c +} + +func (_c *ProverInterfaceMock_WaitRecursiveProof_Call) Return(_a0 string, _a1 common.Hash, _a2 common.Hash, _a3 error) *ProverInterfaceMock_WaitRecursiveProof_Call { + _c.Call.Return(_a0, _a1, _a2, _a3) + return _c +} + +func (_c *ProverInterfaceMock_WaitRecursiveProof_Call) RunAndReturn(run func(context.Context, string) (string, common.Hash, common.Hash, error)) *ProverInterfaceMock_WaitRecursiveProof_Call { + _c.Call.Return(run) + return _c +} + +// NewProverInterfaceMock creates a new instance of ProverInterfaceMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewProverInterfaceMock(t interface { + mock.TestingT + Cleanup(func()) +}) *ProverInterfaceMock { + mock := &ProverInterfaceMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggregator/mocks/mock_rpc.go b/aggregator/mocks/mock_rpc.go new file mode 100644 index 00000000..f51ab663 --- /dev/null +++ b/aggregator/mocks/mock_rpc.go @@ -0,0 +1,152 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + types "github.com/agglayer/aggkit/rpc/types" + mock "github.com/stretchr/testify/mock" +) + +// RPCInterfaceMock is an autogenerated mock type for the RPCInterface type +type RPCInterfaceMock struct { + mock.Mock +} + +type RPCInterfaceMock_Expecter struct { + mock *mock.Mock +} + +func (_m *RPCInterfaceMock) EXPECT() *RPCInterfaceMock_Expecter { + return &RPCInterfaceMock_Expecter{mock: &_m.Mock} +} + +// GetBatch provides a mock function with given fields: batchNumber +func (_m *RPCInterfaceMock) GetBatch(batchNumber uint64) (*types.RPCBatch, error) { + ret := _m.Called(batchNumber) + + if len(ret) == 0 { + panic("no return value specified for GetBatch") + } + + var r0 *types.RPCBatch + var r1 error + if rf, ok := ret.Get(0).(func(uint64) (*types.RPCBatch, error)); ok { + return rf(batchNumber) + } + if rf, ok := ret.Get(0).(func(uint64) *types.RPCBatch); ok { + r0 = rf(batchNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.RPCBatch) + } + } + + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(batchNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCInterfaceMock_GetBatch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBatch' +type RPCInterfaceMock_GetBatch_Call struct { + *mock.Call +} + +// GetBatch is a helper method to define mock.On call +// - batchNumber uint64 +func (_e *RPCInterfaceMock_Expecter) GetBatch(batchNumber interface{}) *RPCInterfaceMock_GetBatch_Call { + return &RPCInterfaceMock_GetBatch_Call{Call: _e.mock.On("GetBatch", batchNumber)} +} + +func (_c *RPCInterfaceMock_GetBatch_Call) Run(run func(batchNumber uint64)) *RPCInterfaceMock_GetBatch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *RPCInterfaceMock_GetBatch_Call) Return(_a0 *types.RPCBatch, _a1 error) *RPCInterfaceMock_GetBatch_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RPCInterfaceMock_GetBatch_Call) RunAndReturn(run func(uint64) (*types.RPCBatch, error)) *RPCInterfaceMock_GetBatch_Call { + _c.Call.Return(run) + return _c +} + +// GetWitness provides a mock function with given fields: batchNumber, fullWitness +func (_m *RPCInterfaceMock) GetWitness(batchNumber uint64, fullWitness bool) ([]byte, error) { + ret := _m.Called(batchNumber, fullWitness) + + if len(ret) == 0 { + panic("no return value specified for GetWitness") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(uint64, bool) ([]byte, error)); ok { + return rf(batchNumber, fullWitness) + } + if rf, ok := ret.Get(0).(func(uint64, bool) []byte); ok { + r0 = rf(batchNumber, fullWitness) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(uint64, bool) error); ok { + r1 = rf(batchNumber, fullWitness) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCInterfaceMock_GetWitness_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWitness' +type RPCInterfaceMock_GetWitness_Call struct { + *mock.Call +} + +// GetWitness is a helper method to define mock.On call +// - batchNumber uint64 +// - fullWitness bool +func (_e *RPCInterfaceMock_Expecter) GetWitness(batchNumber interface{}, fullWitness interface{}) *RPCInterfaceMock_GetWitness_Call { + return &RPCInterfaceMock_GetWitness_Call{Call: _e.mock.On("GetWitness", batchNumber, fullWitness)} +} + +func (_c *RPCInterfaceMock_GetWitness_Call) Run(run func(batchNumber uint64, fullWitness bool)) *RPCInterfaceMock_GetWitness_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64), args[1].(bool)) + }) + return _c +} + +func (_c *RPCInterfaceMock_GetWitness_Call) Return(_a0 []byte, _a1 error) *RPCInterfaceMock_GetWitness_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RPCInterfaceMock_GetWitness_Call) RunAndReturn(run func(uint64, bool) ([]byte, error)) *RPCInterfaceMock_GetWitness_Call { + _c.Call.Return(run) + return _c +} + +// NewRPCInterfaceMock creates a new instance of RPCInterfaceMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRPCInterfaceMock(t interface { + mock.TestingT + Cleanup(func()) +}) *RPCInterfaceMock { + mock := &RPCInterfaceMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggregator/mocks/mock_storage.go b/aggregator/mocks/mock_storage.go new file mode 100644 index 00000000..1f253f67 --- /dev/null +++ b/aggregator/mocks/mock_storage.go @@ -0,0 +1,690 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + db "github.com/agglayer/aggkit/db" + mock "github.com/stretchr/testify/mock" + + sql "database/sql" + + state "github.com/agglayer/aggkit/state" +) + +// StorageInterfaceMock is an autogenerated mock type for the StorageInterface type +type StorageInterfaceMock struct { + mock.Mock +} + +type StorageInterfaceMock_Expecter struct { + mock *mock.Mock +} + +func (_m *StorageInterfaceMock) EXPECT() *StorageInterfaceMock_Expecter { + return &StorageInterfaceMock_Expecter{mock: &_m.Mock} +} + +// AddGeneratedProof provides a mock function with given fields: ctx, proof, dbTx +func (_m *StorageInterfaceMock) AddGeneratedProof(ctx context.Context, proof *state.Proof, dbTx db.Txer) error { + ret := _m.Called(ctx, proof, dbTx) + + if len(ret) == 0 { + panic("no return value specified for AddGeneratedProof") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *state.Proof, db.Txer) error); ok { + r0 = rf(ctx, proof, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// StorageInterfaceMock_AddGeneratedProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddGeneratedProof' +type StorageInterfaceMock_AddGeneratedProof_Call struct { + *mock.Call +} + +// AddGeneratedProof is a helper method to define mock.On call +// - ctx context.Context +// - proof *state.Proof +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) AddGeneratedProof(ctx interface{}, proof interface{}, dbTx interface{}) *StorageInterfaceMock_AddGeneratedProof_Call { + return &StorageInterfaceMock_AddGeneratedProof_Call{Call: _e.mock.On("AddGeneratedProof", ctx, proof, dbTx)} +} + +func (_c *StorageInterfaceMock_AddGeneratedProof_Call) Run(run func(ctx context.Context, proof *state.Proof, dbTx db.Txer)) *StorageInterfaceMock_AddGeneratedProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*state.Proof), args[2].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_AddGeneratedProof_Call) Return(_a0 error) *StorageInterfaceMock_AddGeneratedProof_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StorageInterfaceMock_AddGeneratedProof_Call) RunAndReturn(run func(context.Context, *state.Proof, db.Txer) error) *StorageInterfaceMock_AddGeneratedProof_Call { + _c.Call.Return(run) + return _c +} + +// AddSequence provides a mock function with given fields: ctx, sequence, dbTx +func (_m *StorageInterfaceMock) AddSequence(ctx context.Context, sequence state.Sequence, dbTx db.Txer) error { + ret := _m.Called(ctx, sequence, dbTx) + + if len(ret) == 0 { + panic("no return value specified for AddSequence") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, state.Sequence, db.Txer) error); ok { + r0 = rf(ctx, sequence, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// StorageInterfaceMock_AddSequence_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddSequence' +type StorageInterfaceMock_AddSequence_Call struct { + *mock.Call +} + +// AddSequence is a helper method to define mock.On call +// - ctx context.Context +// - sequence state.Sequence +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) AddSequence(ctx interface{}, sequence interface{}, dbTx interface{}) *StorageInterfaceMock_AddSequence_Call { + return &StorageInterfaceMock_AddSequence_Call{Call: _e.mock.On("AddSequence", ctx, sequence, dbTx)} +} + +func (_c *StorageInterfaceMock_AddSequence_Call) Run(run func(ctx context.Context, sequence state.Sequence, dbTx db.Txer)) *StorageInterfaceMock_AddSequence_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(state.Sequence), args[2].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_AddSequence_Call) Return(_a0 error) *StorageInterfaceMock_AddSequence_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StorageInterfaceMock_AddSequence_Call) RunAndReturn(run func(context.Context, state.Sequence, db.Txer) error) *StorageInterfaceMock_AddSequence_Call { + _c.Call.Return(run) + return _c +} + +// BeginTx provides a mock function with given fields: ctx, options +func (_m *StorageInterfaceMock) BeginTx(ctx context.Context, options *sql.TxOptions) (db.Txer, error) { + ret := _m.Called(ctx, options) + + if len(ret) == 0 { + panic("no return value specified for BeginTx") + } + + var r0 db.Txer + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *sql.TxOptions) (db.Txer, error)); ok { + return rf(ctx, options) + } + if rf, ok := ret.Get(0).(func(context.Context, *sql.TxOptions) db.Txer); ok { + r0 = rf(ctx, options) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(db.Txer) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *sql.TxOptions) error); ok { + r1 = rf(ctx, options) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StorageInterfaceMock_BeginTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BeginTx' +type StorageInterfaceMock_BeginTx_Call struct { + *mock.Call +} + +// BeginTx is a helper method to define mock.On call +// - ctx context.Context +// - options *sql.TxOptions +func (_e *StorageInterfaceMock_Expecter) BeginTx(ctx interface{}, options interface{}) *StorageInterfaceMock_BeginTx_Call { + return &StorageInterfaceMock_BeginTx_Call{Call: _e.mock.On("BeginTx", ctx, options)} +} + +func (_c *StorageInterfaceMock_BeginTx_Call) Run(run func(ctx context.Context, options *sql.TxOptions)) *StorageInterfaceMock_BeginTx_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*sql.TxOptions)) + }) + return _c +} + +func (_c *StorageInterfaceMock_BeginTx_Call) Return(_a0 db.Txer, _a1 error) *StorageInterfaceMock_BeginTx_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *StorageInterfaceMock_BeginTx_Call) RunAndReturn(run func(context.Context, *sql.TxOptions) (db.Txer, error)) *StorageInterfaceMock_BeginTx_Call { + _c.Call.Return(run) + return _c +} + +// CheckProofContainsCompleteSequences provides a mock function with given fields: ctx, proof, dbTx +func (_m *StorageInterfaceMock) CheckProofContainsCompleteSequences(ctx context.Context, proof *state.Proof, dbTx db.Txer) (bool, error) { + ret := _m.Called(ctx, proof, dbTx) + + if len(ret) == 0 { + panic("no return value specified for CheckProofContainsCompleteSequences") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *state.Proof, db.Txer) (bool, error)); ok { + return rf(ctx, proof, dbTx) + } + if rf, ok := ret.Get(0).(func(context.Context, *state.Proof, db.Txer) bool); ok { + r0 = rf(ctx, proof, dbTx) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(context.Context, *state.Proof, db.Txer) error); ok { + r1 = rf(ctx, proof, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StorageInterfaceMock_CheckProofContainsCompleteSequences_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CheckProofContainsCompleteSequences' +type StorageInterfaceMock_CheckProofContainsCompleteSequences_Call struct { + *mock.Call +} + +// CheckProofContainsCompleteSequences is a helper method to define mock.On call +// - ctx context.Context +// - proof *state.Proof +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) CheckProofContainsCompleteSequences(ctx interface{}, proof interface{}, dbTx interface{}) *StorageInterfaceMock_CheckProofContainsCompleteSequences_Call { + return &StorageInterfaceMock_CheckProofContainsCompleteSequences_Call{Call: _e.mock.On("CheckProofContainsCompleteSequences", ctx, proof, dbTx)} +} + +func (_c *StorageInterfaceMock_CheckProofContainsCompleteSequences_Call) Run(run func(ctx context.Context, proof *state.Proof, dbTx db.Txer)) *StorageInterfaceMock_CheckProofContainsCompleteSequences_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*state.Proof), args[2].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_CheckProofContainsCompleteSequences_Call) Return(_a0 bool, _a1 error) *StorageInterfaceMock_CheckProofContainsCompleteSequences_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *StorageInterfaceMock_CheckProofContainsCompleteSequences_Call) RunAndReturn(run func(context.Context, *state.Proof, db.Txer) (bool, error)) *StorageInterfaceMock_CheckProofContainsCompleteSequences_Call { + _c.Call.Return(run) + return _c +} + +// CheckProofExistsForBatch provides a mock function with given fields: ctx, batchNumber, dbTx +func (_m *StorageInterfaceMock) CheckProofExistsForBatch(ctx context.Context, batchNumber uint64, dbTx db.Txer) (bool, error) { + ret := _m.Called(ctx, batchNumber, dbTx) + + if len(ret) == 0 { + panic("no return value specified for CheckProofExistsForBatch") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, db.Txer) (bool, error)); ok { + return rf(ctx, batchNumber, dbTx) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64, db.Txer) bool); ok { + r0 = rf(ctx, batchNumber, dbTx) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64, db.Txer) error); ok { + r1 = rf(ctx, batchNumber, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StorageInterfaceMock_CheckProofExistsForBatch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CheckProofExistsForBatch' +type StorageInterfaceMock_CheckProofExistsForBatch_Call struct { + *mock.Call +} + +// CheckProofExistsForBatch is a helper method to define mock.On call +// - ctx context.Context +// - batchNumber uint64 +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) CheckProofExistsForBatch(ctx interface{}, batchNumber interface{}, dbTx interface{}) *StorageInterfaceMock_CheckProofExistsForBatch_Call { + return &StorageInterfaceMock_CheckProofExistsForBatch_Call{Call: _e.mock.On("CheckProofExistsForBatch", ctx, batchNumber, dbTx)} +} + +func (_c *StorageInterfaceMock_CheckProofExistsForBatch_Call) Run(run func(ctx context.Context, batchNumber uint64, dbTx db.Txer)) *StorageInterfaceMock_CheckProofExistsForBatch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_CheckProofExistsForBatch_Call) Return(_a0 bool, _a1 error) *StorageInterfaceMock_CheckProofExistsForBatch_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *StorageInterfaceMock_CheckProofExistsForBatch_Call) RunAndReturn(run func(context.Context, uint64, db.Txer) (bool, error)) *StorageInterfaceMock_CheckProofExistsForBatch_Call { + _c.Call.Return(run) + return _c +} + +// CleanupGeneratedProofs provides a mock function with given fields: ctx, batchNumber, dbTx +func (_m *StorageInterfaceMock) CleanupGeneratedProofs(ctx context.Context, batchNumber uint64, dbTx db.Txer) error { + ret := _m.Called(ctx, batchNumber, dbTx) + + if len(ret) == 0 { + panic("no return value specified for CleanupGeneratedProofs") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, db.Txer) error); ok { + r0 = rf(ctx, batchNumber, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// StorageInterfaceMock_CleanupGeneratedProofs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CleanupGeneratedProofs' +type StorageInterfaceMock_CleanupGeneratedProofs_Call struct { + *mock.Call +} + +// CleanupGeneratedProofs is a helper method to define mock.On call +// - ctx context.Context +// - batchNumber uint64 +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) CleanupGeneratedProofs(ctx interface{}, batchNumber interface{}, dbTx interface{}) *StorageInterfaceMock_CleanupGeneratedProofs_Call { + return &StorageInterfaceMock_CleanupGeneratedProofs_Call{Call: _e.mock.On("CleanupGeneratedProofs", ctx, batchNumber, dbTx)} +} + +func (_c *StorageInterfaceMock_CleanupGeneratedProofs_Call) Run(run func(ctx context.Context, batchNumber uint64, dbTx db.Txer)) *StorageInterfaceMock_CleanupGeneratedProofs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_CleanupGeneratedProofs_Call) Return(_a0 error) *StorageInterfaceMock_CleanupGeneratedProofs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StorageInterfaceMock_CleanupGeneratedProofs_Call) RunAndReturn(run func(context.Context, uint64, db.Txer) error) *StorageInterfaceMock_CleanupGeneratedProofs_Call { + _c.Call.Return(run) + return _c +} + +// CleanupLockedProofs provides a mock function with given fields: ctx, duration, dbTx +func (_m *StorageInterfaceMock) CleanupLockedProofs(ctx context.Context, duration string, dbTx db.Txer) (int64, error) { + ret := _m.Called(ctx, duration, dbTx) + + if len(ret) == 0 { + panic("no return value specified for CleanupLockedProofs") + } + + var r0 int64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, db.Txer) (int64, error)); ok { + return rf(ctx, duration, dbTx) + } + if rf, ok := ret.Get(0).(func(context.Context, string, db.Txer) int64); ok { + r0 = rf(ctx, duration, dbTx) + } else { + r0 = ret.Get(0).(int64) + } + + if rf, ok := ret.Get(1).(func(context.Context, string, db.Txer) error); ok { + r1 = rf(ctx, duration, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StorageInterfaceMock_CleanupLockedProofs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CleanupLockedProofs' +type StorageInterfaceMock_CleanupLockedProofs_Call struct { + *mock.Call +} + +// CleanupLockedProofs is a helper method to define mock.On call +// - ctx context.Context +// - duration string +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) CleanupLockedProofs(ctx interface{}, duration interface{}, dbTx interface{}) *StorageInterfaceMock_CleanupLockedProofs_Call { + return &StorageInterfaceMock_CleanupLockedProofs_Call{Call: _e.mock.On("CleanupLockedProofs", ctx, duration, dbTx)} +} + +func (_c *StorageInterfaceMock_CleanupLockedProofs_Call) Run(run func(ctx context.Context, duration string, dbTx db.Txer)) *StorageInterfaceMock_CleanupLockedProofs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_CleanupLockedProofs_Call) Return(_a0 int64, _a1 error) *StorageInterfaceMock_CleanupLockedProofs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *StorageInterfaceMock_CleanupLockedProofs_Call) RunAndReturn(run func(context.Context, string, db.Txer) (int64, error)) *StorageInterfaceMock_CleanupLockedProofs_Call { + _c.Call.Return(run) + return _c +} + +// DeleteGeneratedProofs provides a mock function with given fields: ctx, batchNumber, batchNumberFinal, dbTx +func (_m *StorageInterfaceMock) DeleteGeneratedProofs(ctx context.Context, batchNumber uint64, batchNumberFinal uint64, dbTx db.Txer) error { + ret := _m.Called(ctx, batchNumber, batchNumberFinal, dbTx) + + if len(ret) == 0 { + panic("no return value specified for DeleteGeneratedProofs") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64, db.Txer) error); ok { + r0 = rf(ctx, batchNumber, batchNumberFinal, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// StorageInterfaceMock_DeleteGeneratedProofs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteGeneratedProofs' +type StorageInterfaceMock_DeleteGeneratedProofs_Call struct { + *mock.Call +} + +// DeleteGeneratedProofs is a helper method to define mock.On call +// - ctx context.Context +// - batchNumber uint64 +// - batchNumberFinal uint64 +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) DeleteGeneratedProofs(ctx interface{}, batchNumber interface{}, batchNumberFinal interface{}, dbTx interface{}) *StorageInterfaceMock_DeleteGeneratedProofs_Call { + return &StorageInterfaceMock_DeleteGeneratedProofs_Call{Call: _e.mock.On("DeleteGeneratedProofs", ctx, batchNumber, batchNumberFinal, dbTx)} +} + +func (_c *StorageInterfaceMock_DeleteGeneratedProofs_Call) Run(run func(ctx context.Context, batchNumber uint64, batchNumberFinal uint64, dbTx db.Txer)) *StorageInterfaceMock_DeleteGeneratedProofs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(uint64), args[3].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_DeleteGeneratedProofs_Call) Return(_a0 error) *StorageInterfaceMock_DeleteGeneratedProofs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StorageInterfaceMock_DeleteGeneratedProofs_Call) RunAndReturn(run func(context.Context, uint64, uint64, db.Txer) error) *StorageInterfaceMock_DeleteGeneratedProofs_Call { + _c.Call.Return(run) + return _c +} + +// DeleteUngeneratedProofs provides a mock function with given fields: ctx, dbTx +func (_m *StorageInterfaceMock) DeleteUngeneratedProofs(ctx context.Context, dbTx db.Txer) error { + ret := _m.Called(ctx, dbTx) + + if len(ret) == 0 { + panic("no return value specified for DeleteUngeneratedProofs") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, db.Txer) error); ok { + r0 = rf(ctx, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// StorageInterfaceMock_DeleteUngeneratedProofs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteUngeneratedProofs' +type StorageInterfaceMock_DeleteUngeneratedProofs_Call struct { + *mock.Call +} + +// DeleteUngeneratedProofs is a helper method to define mock.On call +// - ctx context.Context +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) DeleteUngeneratedProofs(ctx interface{}, dbTx interface{}) *StorageInterfaceMock_DeleteUngeneratedProofs_Call { + return &StorageInterfaceMock_DeleteUngeneratedProofs_Call{Call: _e.mock.On("DeleteUngeneratedProofs", ctx, dbTx)} +} + +func (_c *StorageInterfaceMock_DeleteUngeneratedProofs_Call) Run(run func(ctx context.Context, dbTx db.Txer)) *StorageInterfaceMock_DeleteUngeneratedProofs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_DeleteUngeneratedProofs_Call) Return(_a0 error) *StorageInterfaceMock_DeleteUngeneratedProofs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StorageInterfaceMock_DeleteUngeneratedProofs_Call) RunAndReturn(run func(context.Context, db.Txer) error) *StorageInterfaceMock_DeleteUngeneratedProofs_Call { + _c.Call.Return(run) + return _c +} + +// GetProofReadyToVerify provides a mock function with given fields: ctx, lastVerfiedBatchNumber, dbTx +func (_m *StorageInterfaceMock) GetProofReadyToVerify(ctx context.Context, lastVerfiedBatchNumber uint64, dbTx db.Txer) (*state.Proof, error) { + ret := _m.Called(ctx, lastVerfiedBatchNumber, dbTx) + + if len(ret) == 0 { + panic("no return value specified for GetProofReadyToVerify") + } + + var r0 *state.Proof + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, db.Txer) (*state.Proof, error)); ok { + return rf(ctx, lastVerfiedBatchNumber, dbTx) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64, db.Txer) *state.Proof); ok { + r0 = rf(ctx, lastVerfiedBatchNumber, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Proof) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64, db.Txer) error); ok { + r1 = rf(ctx, lastVerfiedBatchNumber, dbTx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// StorageInterfaceMock_GetProofReadyToVerify_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProofReadyToVerify' +type StorageInterfaceMock_GetProofReadyToVerify_Call struct { + *mock.Call +} + +// GetProofReadyToVerify is a helper method to define mock.On call +// - ctx context.Context +// - lastVerfiedBatchNumber uint64 +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) GetProofReadyToVerify(ctx interface{}, lastVerfiedBatchNumber interface{}, dbTx interface{}) *StorageInterfaceMock_GetProofReadyToVerify_Call { + return &StorageInterfaceMock_GetProofReadyToVerify_Call{Call: _e.mock.On("GetProofReadyToVerify", ctx, lastVerfiedBatchNumber, dbTx)} +} + +func (_c *StorageInterfaceMock_GetProofReadyToVerify_Call) Run(run func(ctx context.Context, lastVerfiedBatchNumber uint64, dbTx db.Txer)) *StorageInterfaceMock_GetProofReadyToVerify_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_GetProofReadyToVerify_Call) Return(_a0 *state.Proof, _a1 error) *StorageInterfaceMock_GetProofReadyToVerify_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *StorageInterfaceMock_GetProofReadyToVerify_Call) RunAndReturn(run func(context.Context, uint64, db.Txer) (*state.Proof, error)) *StorageInterfaceMock_GetProofReadyToVerify_Call { + _c.Call.Return(run) + return _c +} + +// GetProofsToAggregate provides a mock function with given fields: ctx, dbTx +func (_m *StorageInterfaceMock) GetProofsToAggregate(ctx context.Context, dbTx db.Txer) (*state.Proof, *state.Proof, error) { + ret := _m.Called(ctx, dbTx) + + if len(ret) == 0 { + panic("no return value specified for GetProofsToAggregate") + } + + var r0 *state.Proof + var r1 *state.Proof + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, db.Txer) (*state.Proof, *state.Proof, error)); ok { + return rf(ctx, dbTx) + } + if rf, ok := ret.Get(0).(func(context.Context, db.Txer) *state.Proof); ok { + r0 = rf(ctx, dbTx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*state.Proof) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, db.Txer) *state.Proof); ok { + r1 = rf(ctx, dbTx) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*state.Proof) + } + } + + if rf, ok := ret.Get(2).(func(context.Context, db.Txer) error); ok { + r2 = rf(ctx, dbTx) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// StorageInterfaceMock_GetProofsToAggregate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProofsToAggregate' +type StorageInterfaceMock_GetProofsToAggregate_Call struct { + *mock.Call +} + +// GetProofsToAggregate is a helper method to define mock.On call +// - ctx context.Context +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) GetProofsToAggregate(ctx interface{}, dbTx interface{}) *StorageInterfaceMock_GetProofsToAggregate_Call { + return &StorageInterfaceMock_GetProofsToAggregate_Call{Call: _e.mock.On("GetProofsToAggregate", ctx, dbTx)} +} + +func (_c *StorageInterfaceMock_GetProofsToAggregate_Call) Run(run func(ctx context.Context, dbTx db.Txer)) *StorageInterfaceMock_GetProofsToAggregate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_GetProofsToAggregate_Call) Return(_a0 *state.Proof, _a1 *state.Proof, _a2 error) *StorageInterfaceMock_GetProofsToAggregate_Call { + _c.Call.Return(_a0, _a1, _a2) + return _c +} + +func (_c *StorageInterfaceMock_GetProofsToAggregate_Call) RunAndReturn(run func(context.Context, db.Txer) (*state.Proof, *state.Proof, error)) *StorageInterfaceMock_GetProofsToAggregate_Call { + _c.Call.Return(run) + return _c +} + +// UpdateGeneratedProof provides a mock function with given fields: ctx, proof, dbTx +func (_m *StorageInterfaceMock) UpdateGeneratedProof(ctx context.Context, proof *state.Proof, dbTx db.Txer) error { + ret := _m.Called(ctx, proof, dbTx) + + if len(ret) == 0 { + panic("no return value specified for UpdateGeneratedProof") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *state.Proof, db.Txer) error); ok { + r0 = rf(ctx, proof, dbTx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// StorageInterfaceMock_UpdateGeneratedProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateGeneratedProof' +type StorageInterfaceMock_UpdateGeneratedProof_Call struct { + *mock.Call +} + +// UpdateGeneratedProof is a helper method to define mock.On call +// - ctx context.Context +// - proof *state.Proof +// - dbTx db.Txer +func (_e *StorageInterfaceMock_Expecter) UpdateGeneratedProof(ctx interface{}, proof interface{}, dbTx interface{}) *StorageInterfaceMock_UpdateGeneratedProof_Call { + return &StorageInterfaceMock_UpdateGeneratedProof_Call{Call: _e.mock.On("UpdateGeneratedProof", ctx, proof, dbTx)} +} + +func (_c *StorageInterfaceMock_UpdateGeneratedProof_Call) Run(run func(ctx context.Context, proof *state.Proof, dbTx db.Txer)) *StorageInterfaceMock_UpdateGeneratedProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*state.Proof), args[2].(db.Txer)) + }) + return _c +} + +func (_c *StorageInterfaceMock_UpdateGeneratedProof_Call) Return(_a0 error) *StorageInterfaceMock_UpdateGeneratedProof_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *StorageInterfaceMock_UpdateGeneratedProof_Call) RunAndReturn(run func(context.Context, *state.Proof, db.Txer) error) *StorageInterfaceMock_UpdateGeneratedProof_Call { + _c.Call.Return(run) + return _c +} + +// NewStorageInterfaceMock creates a new instance of StorageInterfaceMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewStorageInterfaceMock(t interface { + mock.TestingT + Cleanup(func()) +}) *StorageInterfaceMock { + mock := &StorageInterfaceMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggregator/mocks/mock_synchronizer.go b/aggregator/mocks/mock_synchronizer.go new file mode 100644 index 00000000..ae7735b1 --- /dev/null +++ b/aggregator/mocks/mock_synchronizer.go @@ -0,0 +1,697 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + synchronizer "github.com/0xPolygonHermez/zkevm-synchronizer-l1/synchronizer" +) + +// SynchronizerInterfaceMock is an autogenerated mock type for the Synchronizer type +type SynchronizerInterfaceMock struct { + mock.Mock +} + +type SynchronizerInterfaceMock_Expecter struct { + mock *mock.Mock +} + +func (_m *SynchronizerInterfaceMock) EXPECT() *SynchronizerInterfaceMock_Expecter { + return &SynchronizerInterfaceMock_Expecter{mock: &_m.Mock} +} + +// GetL1BlockByNumber provides a mock function with given fields: ctx, blockNumber +func (_m *SynchronizerInterfaceMock) GetL1BlockByNumber(ctx context.Context, blockNumber uint64) (*synchronizer.L1Block, error) { + ret := _m.Called(ctx, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for GetL1BlockByNumber") + } + + var r0 *synchronizer.L1Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint64) (*synchronizer.L1Block, error)); ok { + return rf(ctx, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64) *synchronizer.L1Block); ok { + r0 = rf(ctx, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*synchronizer.L1Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok { + r1 = rf(ctx, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SynchronizerInterfaceMock_GetL1BlockByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetL1BlockByNumber' +type SynchronizerInterfaceMock_GetL1BlockByNumber_Call struct { + *mock.Call +} + +// GetL1BlockByNumber is a helper method to define mock.On call +// - ctx context.Context +// - blockNumber uint64 +func (_e *SynchronizerInterfaceMock_Expecter) GetL1BlockByNumber(ctx interface{}, blockNumber interface{}) *SynchronizerInterfaceMock_GetL1BlockByNumber_Call { + return &SynchronizerInterfaceMock_GetL1BlockByNumber_Call{Call: _e.mock.On("GetL1BlockByNumber", ctx, blockNumber)} +} + +func (_c *SynchronizerInterfaceMock_GetL1BlockByNumber_Call) Run(run func(ctx context.Context, blockNumber uint64)) *SynchronizerInterfaceMock_GetL1BlockByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64)) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetL1BlockByNumber_Call) Return(_a0 *synchronizer.L1Block, _a1 error) *SynchronizerInterfaceMock_GetL1BlockByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetL1BlockByNumber_Call) RunAndReturn(run func(context.Context, uint64) (*synchronizer.L1Block, error)) *SynchronizerInterfaceMock_GetL1BlockByNumber_Call { + _c.Call.Return(run) + return _c +} + +// GetL1InfoRootPerIndex provides a mock function with given fields: ctx, L1InfoTreeIndex +func (_m *SynchronizerInterfaceMock) GetL1InfoRootPerIndex(ctx context.Context, L1InfoTreeIndex uint32) (common.Hash, error) { + ret := _m.Called(ctx, L1InfoTreeIndex) + + if len(ret) == 0 { + panic("no return value specified for GetL1InfoRootPerIndex") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32) (common.Hash, error)); ok { + return rf(ctx, L1InfoTreeIndex) + } + if rf, ok := ret.Get(0).(func(context.Context, uint32) common.Hash); ok { + r0 = rf(ctx, L1InfoTreeIndex) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint32) error); ok { + r1 = rf(ctx, L1InfoTreeIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetL1InfoRootPerIndex' +type SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call struct { + *mock.Call +} + +// GetL1InfoRootPerIndex is a helper method to define mock.On call +// - ctx context.Context +// - L1InfoTreeIndex uint32 +func (_e *SynchronizerInterfaceMock_Expecter) GetL1InfoRootPerIndex(ctx interface{}, L1InfoTreeIndex interface{}) *SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call { + return &SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call{Call: _e.mock.On("GetL1InfoRootPerIndex", ctx, L1InfoTreeIndex)} +} + +func (_c *SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call) Run(run func(ctx context.Context, L1InfoTreeIndex uint32)) *SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint32)) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call) Return(_a0 common.Hash, _a1 error) *SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call) RunAndReturn(run func(context.Context, uint32) (common.Hash, error)) *SynchronizerInterfaceMock_GetL1InfoRootPerIndex_Call { + _c.Call.Return(run) + return _c +} + +// GetL1InfoTreeLeaves provides a mock function with given fields: ctx, indexLeaves +func (_m *SynchronizerInterfaceMock) GetL1InfoTreeLeaves(ctx context.Context, indexLeaves []uint32) (map[uint32]synchronizer.L1InfoTreeLeaf, error) { + ret := _m.Called(ctx, indexLeaves) + + if len(ret) == 0 { + panic("no return value specified for GetL1InfoTreeLeaves") + } + + var r0 map[uint32]synchronizer.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []uint32) (map[uint32]synchronizer.L1InfoTreeLeaf, error)); ok { + return rf(ctx, indexLeaves) + } + if rf, ok := ret.Get(0).(func(context.Context, []uint32) map[uint32]synchronizer.L1InfoTreeLeaf); ok { + r0 = rf(ctx, indexLeaves) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[uint32]synchronizer.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []uint32) error); ok { + r1 = rf(ctx, indexLeaves) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetL1InfoTreeLeaves' +type SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call struct { + *mock.Call +} + +// GetL1InfoTreeLeaves is a helper method to define mock.On call +// - ctx context.Context +// - indexLeaves []uint32 +func (_e *SynchronizerInterfaceMock_Expecter) GetL1InfoTreeLeaves(ctx interface{}, indexLeaves interface{}) *SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call { + return &SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call{Call: _e.mock.On("GetL1InfoTreeLeaves", ctx, indexLeaves)} +} + +func (_c *SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call) Run(run func(ctx context.Context, indexLeaves []uint32)) *SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]uint32)) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call) Return(_a0 map[uint32]synchronizer.L1InfoTreeLeaf, _a1 error) *SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call) RunAndReturn(run func(context.Context, []uint32) (map[uint32]synchronizer.L1InfoTreeLeaf, error)) *SynchronizerInterfaceMock_GetL1InfoTreeLeaves_Call { + _c.Call.Return(run) + return _c +} + +// GetLastL1Block provides a mock function with given fields: ctx +func (_m *SynchronizerInterfaceMock) GetLastL1Block(ctx context.Context) (*synchronizer.L1Block, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetLastL1Block") + } + + var r0 *synchronizer.L1Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*synchronizer.L1Block, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *synchronizer.L1Block); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*synchronizer.L1Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SynchronizerInterfaceMock_GetLastL1Block_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLastL1Block' +type SynchronizerInterfaceMock_GetLastL1Block_Call struct { + *mock.Call +} + +// GetLastL1Block is a helper method to define mock.On call +// - ctx context.Context +func (_e *SynchronizerInterfaceMock_Expecter) GetLastL1Block(ctx interface{}) *SynchronizerInterfaceMock_GetLastL1Block_Call { + return &SynchronizerInterfaceMock_GetLastL1Block_Call{Call: _e.mock.On("GetLastL1Block", ctx)} +} + +func (_c *SynchronizerInterfaceMock_GetLastL1Block_Call) Run(run func(ctx context.Context)) *SynchronizerInterfaceMock_GetLastL1Block_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetLastL1Block_Call) Return(_a0 *synchronizer.L1Block, _a1 error) *SynchronizerInterfaceMock_GetLastL1Block_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetLastL1Block_Call) RunAndReturn(run func(context.Context) (*synchronizer.L1Block, error)) *SynchronizerInterfaceMock_GetLastL1Block_Call { + _c.Call.Return(run) + return _c +} + +// GetLastestVirtualBatchNumber provides a mock function with given fields: ctx +func (_m *SynchronizerInterfaceMock) GetLastestVirtualBatchNumber(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetLastestVirtualBatchNumber") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLastestVirtualBatchNumber' +type SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call struct { + *mock.Call +} + +// GetLastestVirtualBatchNumber is a helper method to define mock.On call +// - ctx context.Context +func (_e *SynchronizerInterfaceMock_Expecter) GetLastestVirtualBatchNumber(ctx interface{}) *SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call { + return &SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call{Call: _e.mock.On("GetLastestVirtualBatchNumber", ctx)} +} + +func (_c *SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call) Run(run func(ctx context.Context)) *SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call) Return(_a0 uint64, _a1 error) *SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call) RunAndReturn(run func(context.Context) (uint64, error)) *SynchronizerInterfaceMock_GetLastestVirtualBatchNumber_Call { + _c.Call.Return(run) + return _c +} + +// GetLeafsByL1InfoRoot provides a mock function with given fields: ctx, l1InfoRoot +func (_m *SynchronizerInterfaceMock) GetLeafsByL1InfoRoot(ctx context.Context, l1InfoRoot common.Hash) ([]synchronizer.L1InfoTreeLeaf, error) { + ret := _m.Called(ctx, l1InfoRoot) + + if len(ret) == 0 { + panic("no return value specified for GetLeafsByL1InfoRoot") + } + + var r0 []synchronizer.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) ([]synchronizer.L1InfoTreeLeaf, error)); ok { + return rf(ctx, l1InfoRoot) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) []synchronizer.L1InfoTreeLeaf); ok { + r0 = rf(ctx, l1InfoRoot) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]synchronizer.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, l1InfoRoot) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLeafsByL1InfoRoot' +type SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call struct { + *mock.Call +} + +// GetLeafsByL1InfoRoot is a helper method to define mock.On call +// - ctx context.Context +// - l1InfoRoot common.Hash +func (_e *SynchronizerInterfaceMock_Expecter) GetLeafsByL1InfoRoot(ctx interface{}, l1InfoRoot interface{}) *SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call { + return &SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call{Call: _e.mock.On("GetLeafsByL1InfoRoot", ctx, l1InfoRoot)} +} + +func (_c *SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call) Run(run func(ctx context.Context, l1InfoRoot common.Hash)) *SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call) Return(_a0 []synchronizer.L1InfoTreeLeaf, _a1 error) *SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call) RunAndReturn(run func(context.Context, common.Hash) ([]synchronizer.L1InfoTreeLeaf, error)) *SynchronizerInterfaceMock_GetLeafsByL1InfoRoot_Call { + _c.Call.Return(run) + return _c +} + +// GetSequenceByBatchNumber provides a mock function with given fields: ctx, batchNumber +func (_m *SynchronizerInterfaceMock) GetSequenceByBatchNumber(ctx context.Context, batchNumber uint64) (*synchronizer.SequencedBatches, error) { + ret := _m.Called(ctx, batchNumber) + + if len(ret) == 0 { + panic("no return value specified for GetSequenceByBatchNumber") + } + + var r0 *synchronizer.SequencedBatches + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint64) (*synchronizer.SequencedBatches, error)); ok { + return rf(ctx, batchNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64) *synchronizer.SequencedBatches); ok { + r0 = rf(ctx, batchNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*synchronizer.SequencedBatches) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok { + r1 = rf(ctx, batchNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSequenceByBatchNumber' +type SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call struct { + *mock.Call +} + +// GetSequenceByBatchNumber is a helper method to define mock.On call +// - ctx context.Context +// - batchNumber uint64 +func (_e *SynchronizerInterfaceMock_Expecter) GetSequenceByBatchNumber(ctx interface{}, batchNumber interface{}) *SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call { + return &SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call{Call: _e.mock.On("GetSequenceByBatchNumber", ctx, batchNumber)} +} + +func (_c *SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call) Run(run func(ctx context.Context, batchNumber uint64)) *SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64)) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call) Return(_a0 *synchronizer.SequencedBatches, _a1 error) *SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call) RunAndReturn(run func(context.Context, uint64) (*synchronizer.SequencedBatches, error)) *SynchronizerInterfaceMock_GetSequenceByBatchNumber_Call { + _c.Call.Return(run) + return _c +} + +// GetVirtualBatchByBatchNumber provides a mock function with given fields: ctx, batchNumber +func (_m *SynchronizerInterfaceMock) GetVirtualBatchByBatchNumber(ctx context.Context, batchNumber uint64) (*synchronizer.VirtualBatch, error) { + ret := _m.Called(ctx, batchNumber) + + if len(ret) == 0 { + panic("no return value specified for GetVirtualBatchByBatchNumber") + } + + var r0 *synchronizer.VirtualBatch + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint64) (*synchronizer.VirtualBatch, error)); ok { + return rf(ctx, batchNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64) *synchronizer.VirtualBatch); ok { + r0 = rf(ctx, batchNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*synchronizer.VirtualBatch) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok { + r1 = rf(ctx, batchNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetVirtualBatchByBatchNumber' +type SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call struct { + *mock.Call +} + +// GetVirtualBatchByBatchNumber is a helper method to define mock.On call +// - ctx context.Context +// - batchNumber uint64 +func (_e *SynchronizerInterfaceMock_Expecter) GetVirtualBatchByBatchNumber(ctx interface{}, batchNumber interface{}) *SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call { + return &SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call{Call: _e.mock.On("GetVirtualBatchByBatchNumber", ctx, batchNumber)} +} + +func (_c *SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call) Run(run func(ctx context.Context, batchNumber uint64)) *SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64)) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call) Return(_a0 *synchronizer.VirtualBatch, _a1 error) *SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call) RunAndReturn(run func(context.Context, uint64) (*synchronizer.VirtualBatch, error)) *SynchronizerInterfaceMock_GetVirtualBatchByBatchNumber_Call { + _c.Call.Return(run) + return _c +} + +// IsSynced provides a mock function with no fields +func (_m *SynchronizerInterfaceMock) IsSynced() bool { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for IsSynced") + } + + var r0 bool + if rf, ok := ret.Get(0).(func() bool); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(bool) + } + + return r0 +} + +// SynchronizerInterfaceMock_IsSynced_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsSynced' +type SynchronizerInterfaceMock_IsSynced_Call struct { + *mock.Call +} + +// IsSynced is a helper method to define mock.On call +func (_e *SynchronizerInterfaceMock_Expecter) IsSynced() *SynchronizerInterfaceMock_IsSynced_Call { + return &SynchronizerInterfaceMock_IsSynced_Call{Call: _e.mock.On("IsSynced")} +} + +func (_c *SynchronizerInterfaceMock_IsSynced_Call) Run(run func()) *SynchronizerInterfaceMock_IsSynced_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_IsSynced_Call) Return(_a0 bool) *SynchronizerInterfaceMock_IsSynced_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SynchronizerInterfaceMock_IsSynced_Call) RunAndReturn(run func() bool) *SynchronizerInterfaceMock_IsSynced_Call { + _c.Call.Return(run) + return _c +} + +// SetCallbackOnReorgDone provides a mock function with given fields: callback +func (_m *SynchronizerInterfaceMock) SetCallbackOnReorgDone(callback func(synchronizer.ReorgExecutionResult)) { + _m.Called(callback) +} + +// SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCallbackOnReorgDone' +type SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call struct { + *mock.Call +} + +// SetCallbackOnReorgDone is a helper method to define mock.On call +// - callback func(synchronizer.ReorgExecutionResult) +func (_e *SynchronizerInterfaceMock_Expecter) SetCallbackOnReorgDone(callback interface{}) *SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call { + return &SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call{Call: _e.mock.On("SetCallbackOnReorgDone", callback)} +} + +func (_c *SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call) Run(run func(callback func(synchronizer.ReorgExecutionResult))) *SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(func(synchronizer.ReorgExecutionResult))) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call) Return() *SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call { + _c.Call.Return() + return _c +} + +func (_c *SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call) RunAndReturn(run func(func(synchronizer.ReorgExecutionResult))) *SynchronizerInterfaceMock_SetCallbackOnReorgDone_Call { + _c.Run(run) + return _c +} + +// SetCallbackOnRollbackBatches provides a mock function with given fields: callback +func (_m *SynchronizerInterfaceMock) SetCallbackOnRollbackBatches(callback func(synchronizer.RollbackBatchesData)) { + _m.Called(callback) +} + +// SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCallbackOnRollbackBatches' +type SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call struct { + *mock.Call +} + +// SetCallbackOnRollbackBatches is a helper method to define mock.On call +// - callback func(synchronizer.RollbackBatchesData) +func (_e *SynchronizerInterfaceMock_Expecter) SetCallbackOnRollbackBatches(callback interface{}) *SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call { + return &SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call{Call: _e.mock.On("SetCallbackOnRollbackBatches", callback)} +} + +func (_c *SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call) Run(run func(callback func(synchronizer.RollbackBatchesData))) *SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(func(synchronizer.RollbackBatchesData))) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call) Return() *SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call { + _c.Call.Return() + return _c +} + +func (_c *SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call) RunAndReturn(run func(func(synchronizer.RollbackBatchesData))) *SynchronizerInterfaceMock_SetCallbackOnRollbackBatches_Call { + _c.Run(run) + return _c +} + +// Stop provides a mock function with no fields +func (_m *SynchronizerInterfaceMock) Stop() { + _m.Called() +} + +// SynchronizerInterfaceMock_Stop_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Stop' +type SynchronizerInterfaceMock_Stop_Call struct { + *mock.Call +} + +// Stop is a helper method to define mock.On call +func (_e *SynchronizerInterfaceMock_Expecter) Stop() *SynchronizerInterfaceMock_Stop_Call { + return &SynchronizerInterfaceMock_Stop_Call{Call: _e.mock.On("Stop")} +} + +func (_c *SynchronizerInterfaceMock_Stop_Call) Run(run func()) *SynchronizerInterfaceMock_Stop_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_Stop_Call) Return() *SynchronizerInterfaceMock_Stop_Call { + _c.Call.Return() + return _c +} + +func (_c *SynchronizerInterfaceMock_Stop_Call) RunAndReturn(run func()) *SynchronizerInterfaceMock_Stop_Call { + _c.Run(run) + return _c +} + +// Sync provides a mock function with given fields: returnOnSync +func (_m *SynchronizerInterfaceMock) Sync(returnOnSync bool) error { + ret := _m.Called(returnOnSync) + + if len(ret) == 0 { + panic("no return value specified for Sync") + } + + var r0 error + if rf, ok := ret.Get(0).(func(bool) error); ok { + r0 = rf(returnOnSync) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SynchronizerInterfaceMock_Sync_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Sync' +type SynchronizerInterfaceMock_Sync_Call struct { + *mock.Call +} + +// Sync is a helper method to define mock.On call +// - returnOnSync bool +func (_e *SynchronizerInterfaceMock_Expecter) Sync(returnOnSync interface{}) *SynchronizerInterfaceMock_Sync_Call { + return &SynchronizerInterfaceMock_Sync_Call{Call: _e.mock.On("Sync", returnOnSync)} +} + +func (_c *SynchronizerInterfaceMock_Sync_Call) Run(run func(returnOnSync bool)) *SynchronizerInterfaceMock_Sync_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(bool)) + }) + return _c +} + +func (_c *SynchronizerInterfaceMock_Sync_Call) Return(_a0 error) *SynchronizerInterfaceMock_Sync_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *SynchronizerInterfaceMock_Sync_Call) RunAndReturn(run func(bool) error) *SynchronizerInterfaceMock_Sync_Call { + _c.Call.Return(run) + return _c +} + +// NewSynchronizerInterfaceMock creates a new instance of SynchronizerInterfaceMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSynchronizerInterfaceMock(t interface { + mock.TestingT + Cleanup(func()) +}) *SynchronizerInterfaceMock { + mock := &SynchronizerInterfaceMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggregator/mocks/mock_txer.go b/aggregator/mocks/mock_txer.go new file mode 100644 index 00000000..39a98d03 --- /dev/null +++ b/aggregator/mocks/mock_txer.go @@ -0,0 +1,389 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + sql "database/sql" + + mock "github.com/stretchr/testify/mock" +) + +// TxerMock is an autogenerated mock type for the Txer type +type TxerMock struct { + mock.Mock +} + +type TxerMock_Expecter struct { + mock *mock.Mock +} + +func (_m *TxerMock) EXPECT() *TxerMock_Expecter { + return &TxerMock_Expecter{mock: &_m.Mock} +} + +// AddCommitCallback provides a mock function with given fields: cb +func (_m *TxerMock) AddCommitCallback(cb func()) { + _m.Called(cb) +} + +// TxerMock_AddCommitCallback_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddCommitCallback' +type TxerMock_AddCommitCallback_Call struct { + *mock.Call +} + +// AddCommitCallback is a helper method to define mock.On call +// - cb func() +func (_e *TxerMock_Expecter) AddCommitCallback(cb interface{}) *TxerMock_AddCommitCallback_Call { + return &TxerMock_AddCommitCallback_Call{Call: _e.mock.On("AddCommitCallback", cb)} +} + +func (_c *TxerMock_AddCommitCallback_Call) Run(run func(cb func())) *TxerMock_AddCommitCallback_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(func())) + }) + return _c +} + +func (_c *TxerMock_AddCommitCallback_Call) Return() *TxerMock_AddCommitCallback_Call { + _c.Call.Return() + return _c +} + +func (_c *TxerMock_AddCommitCallback_Call) RunAndReturn(run func(func())) *TxerMock_AddCommitCallback_Call { + _c.Run(run) + return _c +} + +// AddRollbackCallback provides a mock function with given fields: cb +func (_m *TxerMock) AddRollbackCallback(cb func()) { + _m.Called(cb) +} + +// TxerMock_AddRollbackCallback_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddRollbackCallback' +type TxerMock_AddRollbackCallback_Call struct { + *mock.Call +} + +// AddRollbackCallback is a helper method to define mock.On call +// - cb func() +func (_e *TxerMock_Expecter) AddRollbackCallback(cb interface{}) *TxerMock_AddRollbackCallback_Call { + return &TxerMock_AddRollbackCallback_Call{Call: _e.mock.On("AddRollbackCallback", cb)} +} + +func (_c *TxerMock_AddRollbackCallback_Call) Run(run func(cb func())) *TxerMock_AddRollbackCallback_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(func())) + }) + return _c +} + +func (_c *TxerMock_AddRollbackCallback_Call) Return() *TxerMock_AddRollbackCallback_Call { + _c.Call.Return() + return _c +} + +func (_c *TxerMock_AddRollbackCallback_Call) RunAndReturn(run func(func())) *TxerMock_AddRollbackCallback_Call { + _c.Run(run) + return _c +} + +// Commit provides a mock function with no fields +func (_m *TxerMock) Commit() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Commit") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// TxerMock_Commit_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Commit' +type TxerMock_Commit_Call struct { + *mock.Call +} + +// Commit is a helper method to define mock.On call +func (_e *TxerMock_Expecter) Commit() *TxerMock_Commit_Call { + return &TxerMock_Commit_Call{Call: _e.mock.On("Commit")} +} + +func (_c *TxerMock_Commit_Call) Run(run func()) *TxerMock_Commit_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *TxerMock_Commit_Call) Return(_a0 error) *TxerMock_Commit_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxerMock_Commit_Call) RunAndReturn(run func() error) *TxerMock_Commit_Call { + _c.Call.Return(run) + return _c +} + +// Exec provides a mock function with given fields: query, args +func (_m *TxerMock) Exec(query string, args ...interface{}) (sql.Result, error) { + var _ca []interface{} + _ca = append(_ca, query) + _ca = append(_ca, args...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for Exec") + } + + var r0 sql.Result + var r1 error + if rf, ok := ret.Get(0).(func(string, ...interface{}) (sql.Result, error)); ok { + return rf(query, args...) + } + if rf, ok := ret.Get(0).(func(string, ...interface{}) sql.Result); ok { + r0 = rf(query, args...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(sql.Result) + } + } + + if rf, ok := ret.Get(1).(func(string, ...interface{}) error); ok { + r1 = rf(query, args...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxerMock_Exec_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Exec' +type TxerMock_Exec_Call struct { + *mock.Call +} + +// Exec is a helper method to define mock.On call +// - query string +// - args ...interface{} +func (_e *TxerMock_Expecter) Exec(query interface{}, args ...interface{}) *TxerMock_Exec_Call { + return &TxerMock_Exec_Call{Call: _e.mock.On("Exec", + append([]interface{}{query}, args...)...)} +} + +func (_c *TxerMock_Exec_Call) Run(run func(query string, args ...interface{})) *TxerMock_Exec_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *TxerMock_Exec_Call) Return(_a0 sql.Result, _a1 error) *TxerMock_Exec_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxerMock_Exec_Call) RunAndReturn(run func(string, ...interface{}) (sql.Result, error)) *TxerMock_Exec_Call { + _c.Call.Return(run) + return _c +} + +// Query provides a mock function with given fields: query, args +func (_m *TxerMock) Query(query string, args ...interface{}) (*sql.Rows, error) { + var _ca []interface{} + _ca = append(_ca, query) + _ca = append(_ca, args...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for Query") + } + + var r0 *sql.Rows + var r1 error + if rf, ok := ret.Get(0).(func(string, ...interface{}) (*sql.Rows, error)); ok { + return rf(query, args...) + } + if rf, ok := ret.Get(0).(func(string, ...interface{}) *sql.Rows); ok { + r0 = rf(query, args...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*sql.Rows) + } + } + + if rf, ok := ret.Get(1).(func(string, ...interface{}) error); ok { + r1 = rf(query, args...) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxerMock_Query_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Query' +type TxerMock_Query_Call struct { + *mock.Call +} + +// Query is a helper method to define mock.On call +// - query string +// - args ...interface{} +func (_e *TxerMock_Expecter) Query(query interface{}, args ...interface{}) *TxerMock_Query_Call { + return &TxerMock_Query_Call{Call: _e.mock.On("Query", + append([]interface{}{query}, args...)...)} +} + +func (_c *TxerMock_Query_Call) Run(run func(query string, args ...interface{})) *TxerMock_Query_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *TxerMock_Query_Call) Return(_a0 *sql.Rows, _a1 error) *TxerMock_Query_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxerMock_Query_Call) RunAndReturn(run func(string, ...interface{}) (*sql.Rows, error)) *TxerMock_Query_Call { + _c.Call.Return(run) + return _c +} + +// QueryRow provides a mock function with given fields: query, args +func (_m *TxerMock) QueryRow(query string, args ...interface{}) *sql.Row { + var _ca []interface{} + _ca = append(_ca, query) + _ca = append(_ca, args...) + ret := _m.Called(_ca...) + + if len(ret) == 0 { + panic("no return value specified for QueryRow") + } + + var r0 *sql.Row + if rf, ok := ret.Get(0).(func(string, ...interface{}) *sql.Row); ok { + r0 = rf(query, args...) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*sql.Row) + } + } + + return r0 +} + +// TxerMock_QueryRow_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'QueryRow' +type TxerMock_QueryRow_Call struct { + *mock.Call +} + +// QueryRow is a helper method to define mock.On call +// - query string +// - args ...interface{} +func (_e *TxerMock_Expecter) QueryRow(query interface{}, args ...interface{}) *TxerMock_QueryRow_Call { + return &TxerMock_QueryRow_Call{Call: _e.mock.On("QueryRow", + append([]interface{}{query}, args...)...)} +} + +func (_c *TxerMock_QueryRow_Call) Run(run func(query string, args ...interface{})) *TxerMock_QueryRow_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *TxerMock_QueryRow_Call) Return(_a0 *sql.Row) *TxerMock_QueryRow_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxerMock_QueryRow_Call) RunAndReturn(run func(string, ...interface{}) *sql.Row) *TxerMock_QueryRow_Call { + _c.Call.Return(run) + return _c +} + +// Rollback provides a mock function with no fields +func (_m *TxerMock) Rollback() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Rollback") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// TxerMock_Rollback_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Rollback' +type TxerMock_Rollback_Call struct { + *mock.Call +} + +// Rollback is a helper method to define mock.On call +func (_e *TxerMock_Expecter) Rollback() *TxerMock_Rollback_Call { + return &TxerMock_Rollback_Call{Call: _e.mock.On("Rollback")} +} + +func (_c *TxerMock_Rollback_Call) Run(run func()) *TxerMock_Rollback_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *TxerMock_Rollback_Call) Return(_a0 error) *TxerMock_Rollback_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxerMock_Rollback_Call) RunAndReturn(run func() error) *TxerMock_Rollback_Call { + _c.Call.Return(run) + return _c +} + +// NewTxerMock creates a new instance of TxerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTxerMock(t interface { + mock.TestingT + Cleanup(func()) +}) *TxerMock { + mock := &TxerMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggregator/prover/aggregator.pb.go b/aggregator/prover/aggregator.pb.go new file mode 100644 index 00000000..b79d134b --- /dev/null +++ b/aggregator/prover/aggregator.pb.go @@ -0,0 +1,2819 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.1 +// protoc v5.27.0 +// source: aggregator.proto + +package prover + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// * +// @dev Result +// - OK: succesfully completed +// - ERROR: request is not correct, i.e. input data is wrong +// - INTERNAL_ERROR: internal server error when delivering the response +type Result int32 + +const ( + Result_RESULT_UNSPECIFIED Result = 0 + Result_RESULT_OK Result = 1 + Result_RESULT_ERROR Result = 2 + Result_RESULT_INTERNAL_ERROR Result = 3 +) + +// Enum value maps for Result. +var ( + Result_name = map[int32]string{ + 0: "RESULT_UNSPECIFIED", + 1: "RESULT_OK", + 2: "RESULT_ERROR", + 3: "RESULT_INTERNAL_ERROR", + } + Result_value = map[string]int32{ + "RESULT_UNSPECIFIED": 0, + "RESULT_OK": 1, + "RESULT_ERROR": 2, + "RESULT_INTERNAL_ERROR": 3, + } +) + +func (x Result) Enum() *Result { + p := new(Result) + *p = x + return p +} + +func (x Result) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Result) Descriptor() protoreflect.EnumDescriptor { + return file_aggregator_proto_enumTypes[0].Descriptor() +} + +func (Result) Type() protoreflect.EnumType { + return &file_aggregator_proto_enumTypes[0] +} + +func (x Result) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Result.Descriptor instead. +func (Result) EnumDescriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{0} +} + +type GetStatusResponse_Status int32 + +const ( + GetStatusResponse_STATUS_UNSPECIFIED GetStatusResponse_Status = 0 + GetStatusResponse_STATUS_BOOTING GetStatusResponse_Status = 1 + GetStatusResponse_STATUS_COMPUTING GetStatusResponse_Status = 2 + GetStatusResponse_STATUS_IDLE GetStatusResponse_Status = 3 + GetStatusResponse_STATUS_HALT GetStatusResponse_Status = 4 +) + +// Enum value maps for GetStatusResponse_Status. +var ( + GetStatusResponse_Status_name = map[int32]string{ + 0: "STATUS_UNSPECIFIED", + 1: "STATUS_BOOTING", + 2: "STATUS_COMPUTING", + 3: "STATUS_IDLE", + 4: "STATUS_HALT", + } + GetStatusResponse_Status_value = map[string]int32{ + "STATUS_UNSPECIFIED": 0, + "STATUS_BOOTING": 1, + "STATUS_COMPUTING": 2, + "STATUS_IDLE": 3, + "STATUS_HALT": 4, + } +) + +func (x GetStatusResponse_Status) Enum() *GetStatusResponse_Status { + p := new(GetStatusResponse_Status) + *p = x + return p +} + +func (x GetStatusResponse_Status) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GetStatusResponse_Status) Descriptor() protoreflect.EnumDescriptor { + return file_aggregator_proto_enumTypes[1].Descriptor() +} + +func (GetStatusResponse_Status) Type() protoreflect.EnumType { + return &file_aggregator_proto_enumTypes[1] +} + +func (x GetStatusResponse_Status) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use GetStatusResponse_Status.Descriptor instead. +func (GetStatusResponse_Status) EnumDescriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{10, 0} +} + +type GetProofResponse_Result int32 + +const ( + GetProofResponse_RESULT_UNSPECIFIED GetProofResponse_Result = 0 + GetProofResponse_RESULT_COMPLETED_OK GetProofResponse_Result = 1 + GetProofResponse_RESULT_ERROR GetProofResponse_Result = 2 + GetProofResponse_RESULT_COMPLETED_ERROR GetProofResponse_Result = 3 + GetProofResponse_RESULT_PENDING GetProofResponse_Result = 4 + GetProofResponse_RESULT_INTERNAL_ERROR GetProofResponse_Result = 5 + GetProofResponse_RESULT_CANCEL GetProofResponse_Result = 6 +) + +// Enum value maps for GetProofResponse_Result. +var ( + GetProofResponse_Result_name = map[int32]string{ + 0: "RESULT_UNSPECIFIED", + 1: "RESULT_COMPLETED_OK", + 2: "RESULT_ERROR", + 3: "RESULT_COMPLETED_ERROR", + 4: "RESULT_PENDING", + 5: "RESULT_INTERNAL_ERROR", + 6: "RESULT_CANCEL", + } + GetProofResponse_Result_value = map[string]int32{ + "RESULT_UNSPECIFIED": 0, + "RESULT_COMPLETED_OK": 1, + "RESULT_ERROR": 2, + "RESULT_COMPLETED_ERROR": 3, + "RESULT_PENDING": 4, + "RESULT_INTERNAL_ERROR": 5, + "RESULT_CANCEL": 6, + } +) + +func (x GetProofResponse_Result) Enum() *GetProofResponse_Result { + p := new(GetProofResponse_Result) + *p = x + return p +} + +func (x GetProofResponse_Result) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (GetProofResponse_Result) Descriptor() protoreflect.EnumDescriptor { + return file_aggregator_proto_enumTypes[2].Descriptor() +} + +func (GetProofResponse_Result) Type() protoreflect.EnumType { + return &file_aggregator_proto_enumTypes[2] +} + +func (x GetProofResponse_Result) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use GetProofResponse_Result.Descriptor instead. +func (GetProofResponse_Result) EnumDescriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{15, 0} +} + +type Version struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + V0_0_1 string `protobuf:"bytes,1,opt,name=v0_0_1,json=v001,proto3" json:"v0_0_1,omitempty"` +} + +func (x *Version) Reset() { + *x = Version{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Version) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Version) ProtoMessage() {} + +func (x *Version) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Version.ProtoReflect.Descriptor instead. +func (*Version) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{0} +} + +func (x *Version) GetV0_0_1() string { + if x != nil { + return x.V0_0_1 + } + return "" +} + +type AggregatorMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Types that are assignable to Request: + // + // *AggregatorMessage_GetStatusRequest + // *AggregatorMessage_GenBatchProofRequest + // *AggregatorMessage_GenAggregatedProofRequest + // *AggregatorMessage_GenFinalProofRequest + // *AggregatorMessage_CancelRequest + // *AggregatorMessage_GetProofRequest + // *AggregatorMessage_GenStatelessBatchProofRequest + Request isAggregatorMessage_Request `protobuf_oneof:"request"` +} + +func (x *AggregatorMessage) Reset() { + *x = AggregatorMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AggregatorMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AggregatorMessage) ProtoMessage() {} + +func (x *AggregatorMessage) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AggregatorMessage.ProtoReflect.Descriptor instead. +func (*AggregatorMessage) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{1} +} + +func (x *AggregatorMessage) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (m *AggregatorMessage) GetRequest() isAggregatorMessage_Request { + if m != nil { + return m.Request + } + return nil +} + +func (x *AggregatorMessage) GetGetStatusRequest() *GetStatusRequest { + if x, ok := x.GetRequest().(*AggregatorMessage_GetStatusRequest); ok { + return x.GetStatusRequest + } + return nil +} + +func (x *AggregatorMessage) GetGenBatchProofRequest() *GenBatchProofRequest { + if x, ok := x.GetRequest().(*AggregatorMessage_GenBatchProofRequest); ok { + return x.GenBatchProofRequest + } + return nil +} + +func (x *AggregatorMessage) GetGenAggregatedProofRequest() *GenAggregatedProofRequest { + if x, ok := x.GetRequest().(*AggregatorMessage_GenAggregatedProofRequest); ok { + return x.GenAggregatedProofRequest + } + return nil +} + +func (x *AggregatorMessage) GetGenFinalProofRequest() *GenFinalProofRequest { + if x, ok := x.GetRequest().(*AggregatorMessage_GenFinalProofRequest); ok { + return x.GenFinalProofRequest + } + return nil +} + +func (x *AggregatorMessage) GetCancelRequest() *CancelRequest { + if x, ok := x.GetRequest().(*AggregatorMessage_CancelRequest); ok { + return x.CancelRequest + } + return nil +} + +func (x *AggregatorMessage) GetGetProofRequest() *GetProofRequest { + if x, ok := x.GetRequest().(*AggregatorMessage_GetProofRequest); ok { + return x.GetProofRequest + } + return nil +} + +func (x *AggregatorMessage) GetGenStatelessBatchProofRequest() *GenStatelessBatchProofRequest { + if x, ok := x.GetRequest().(*AggregatorMessage_GenStatelessBatchProofRequest); ok { + return x.GenStatelessBatchProofRequest + } + return nil +} + +type isAggregatorMessage_Request interface { + isAggregatorMessage_Request() +} + +type AggregatorMessage_GetStatusRequest struct { + GetStatusRequest *GetStatusRequest `protobuf:"bytes,2,opt,name=get_status_request,json=getStatusRequest,proto3,oneof"` +} + +type AggregatorMessage_GenBatchProofRequest struct { + GenBatchProofRequest *GenBatchProofRequest `protobuf:"bytes,3,opt,name=gen_batch_proof_request,json=genBatchProofRequest,proto3,oneof"` +} + +type AggregatorMessage_GenAggregatedProofRequest struct { + GenAggregatedProofRequest *GenAggregatedProofRequest `protobuf:"bytes,4,opt,name=gen_aggregated_proof_request,json=genAggregatedProofRequest,proto3,oneof"` +} + +type AggregatorMessage_GenFinalProofRequest struct { + GenFinalProofRequest *GenFinalProofRequest `protobuf:"bytes,5,opt,name=gen_final_proof_request,json=genFinalProofRequest,proto3,oneof"` +} + +type AggregatorMessage_CancelRequest struct { + CancelRequest *CancelRequest `protobuf:"bytes,6,opt,name=cancel_request,json=cancelRequest,proto3,oneof"` +} + +type AggregatorMessage_GetProofRequest struct { + GetProofRequest *GetProofRequest `protobuf:"bytes,7,opt,name=get_proof_request,json=getProofRequest,proto3,oneof"` +} + +type AggregatorMessage_GenStatelessBatchProofRequest struct { + GenStatelessBatchProofRequest *GenStatelessBatchProofRequest `protobuf:"bytes,8,opt,name=gen_stateless_batch_proof_request,json=genStatelessBatchProofRequest,proto3,oneof"` +} + +func (*AggregatorMessage_GetStatusRequest) isAggregatorMessage_Request() {} + +func (*AggregatorMessage_GenBatchProofRequest) isAggregatorMessage_Request() {} + +func (*AggregatorMessage_GenAggregatedProofRequest) isAggregatorMessage_Request() {} + +func (*AggregatorMessage_GenFinalProofRequest) isAggregatorMessage_Request() {} + +func (*AggregatorMessage_CancelRequest) isAggregatorMessage_Request() {} + +func (*AggregatorMessage_GetProofRequest) isAggregatorMessage_Request() {} + +func (*AggregatorMessage_GenStatelessBatchProofRequest) isAggregatorMessage_Request() {} + +type ProverMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Types that are assignable to Response: + // + // *ProverMessage_GetStatusResponse + // *ProverMessage_GenBatchProofResponse + // *ProverMessage_GenAggregatedProofResponse + // *ProverMessage_GenFinalProofResponse + // *ProverMessage_CancelResponse + // *ProverMessage_GetProofResponse + Response isProverMessage_Response `protobuf_oneof:"response"` +} + +func (x *ProverMessage) Reset() { + *x = ProverMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ProverMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ProverMessage) ProtoMessage() {} + +func (x *ProverMessage) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ProverMessage.ProtoReflect.Descriptor instead. +func (*ProverMessage) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{2} +} + +func (x *ProverMessage) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (m *ProverMessage) GetResponse() isProverMessage_Response { + if m != nil { + return m.Response + } + return nil +} + +func (x *ProverMessage) GetGetStatusResponse() *GetStatusResponse { + if x, ok := x.GetResponse().(*ProverMessage_GetStatusResponse); ok { + return x.GetStatusResponse + } + return nil +} + +func (x *ProverMessage) GetGenBatchProofResponse() *GenBatchProofResponse { + if x, ok := x.GetResponse().(*ProverMessage_GenBatchProofResponse); ok { + return x.GenBatchProofResponse + } + return nil +} + +func (x *ProverMessage) GetGenAggregatedProofResponse() *GenAggregatedProofResponse { + if x, ok := x.GetResponse().(*ProverMessage_GenAggregatedProofResponse); ok { + return x.GenAggregatedProofResponse + } + return nil +} + +func (x *ProverMessage) GetGenFinalProofResponse() *GenFinalProofResponse { + if x, ok := x.GetResponse().(*ProverMessage_GenFinalProofResponse); ok { + return x.GenFinalProofResponse + } + return nil +} + +func (x *ProverMessage) GetCancelResponse() *CancelResponse { + if x, ok := x.GetResponse().(*ProverMessage_CancelResponse); ok { + return x.CancelResponse + } + return nil +} + +func (x *ProverMessage) GetGetProofResponse() *GetProofResponse { + if x, ok := x.GetResponse().(*ProverMessage_GetProofResponse); ok { + return x.GetProofResponse + } + return nil +} + +type isProverMessage_Response interface { + isProverMessage_Response() +} + +type ProverMessage_GetStatusResponse struct { + GetStatusResponse *GetStatusResponse `protobuf:"bytes,2,opt,name=get_status_response,json=getStatusResponse,proto3,oneof"` +} + +type ProverMessage_GenBatchProofResponse struct { + GenBatchProofResponse *GenBatchProofResponse `protobuf:"bytes,3,opt,name=gen_batch_proof_response,json=genBatchProofResponse,proto3,oneof"` +} + +type ProverMessage_GenAggregatedProofResponse struct { + GenAggregatedProofResponse *GenAggregatedProofResponse `protobuf:"bytes,4,opt,name=gen_aggregated_proof_response,json=genAggregatedProofResponse,proto3,oneof"` +} + +type ProverMessage_GenFinalProofResponse struct { + GenFinalProofResponse *GenFinalProofResponse `protobuf:"bytes,5,opt,name=gen_final_proof_response,json=genFinalProofResponse,proto3,oneof"` +} + +type ProverMessage_CancelResponse struct { + CancelResponse *CancelResponse `protobuf:"bytes,6,opt,name=cancel_response,json=cancelResponse,proto3,oneof"` +} + +type ProverMessage_GetProofResponse struct { + GetProofResponse *GetProofResponse `protobuf:"bytes,7,opt,name=get_proof_response,json=getProofResponse,proto3,oneof"` +} + +func (*ProverMessage_GetStatusResponse) isProverMessage_Response() {} + +func (*ProverMessage_GenBatchProofResponse) isProverMessage_Response() {} + +func (*ProverMessage_GenAggregatedProofResponse) isProverMessage_Response() {} + +func (*ProverMessage_GenFinalProofResponse) isProverMessage_Response() {} + +func (*ProverMessage_CancelResponse) isProverMessage_Response() {} + +func (*ProverMessage_GetProofResponse) isProverMessage_Response() {} + +// * +// @dev GetStatusRequest +type GetStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetStatusRequest) Reset() { + *x = GetStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStatusRequest) ProtoMessage() {} + +func (x *GetStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStatusRequest.ProtoReflect.Descriptor instead. +func (*GetStatusRequest) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{3} +} + +// * +// @dev GenBatchProofRequest +// @param {input} - input prover +type GenBatchProofRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Input *InputProver `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` +} + +func (x *GenBatchProofRequest) Reset() { + *x = GenBatchProofRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenBatchProofRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenBatchProofRequest) ProtoMessage() {} + +func (x *GenBatchProofRequest) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenBatchProofRequest.ProtoReflect.Descriptor instead. +func (*GenBatchProofRequest) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{4} +} + +func (x *GenBatchProofRequest) GetInput() *InputProver { + if x != nil { + return x.Input + } + return nil +} + +type GenStatelessBatchProofRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Input *StatelessInputProver `protobuf:"bytes,1,opt,name=input,proto3" json:"input,omitempty"` +} + +func (x *GenStatelessBatchProofRequest) Reset() { + *x = GenStatelessBatchProofRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenStatelessBatchProofRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenStatelessBatchProofRequest) ProtoMessage() {} + +func (x *GenStatelessBatchProofRequest) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenStatelessBatchProofRequest.ProtoReflect.Descriptor instead. +func (*GenStatelessBatchProofRequest) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{5} +} + +func (x *GenStatelessBatchProofRequest) GetInput() *StatelessInputProver { + if x != nil { + return x.Input + } + return nil +} + +// * +// @dev GenAggregatedProofRequest +// @param {recursive_proof_1} - proof json of the first batch to aggregate +// @param {recursive_proof_2} - proof json of the second batch to aggregate +type GenAggregatedProofRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RecursiveProof_1 string `protobuf:"bytes,1,opt,name=recursive_proof_1,json=recursiveProof1,proto3" json:"recursive_proof_1,omitempty"` + RecursiveProof_2 string `protobuf:"bytes,2,opt,name=recursive_proof_2,json=recursiveProof2,proto3" json:"recursive_proof_2,omitempty"` +} + +func (x *GenAggregatedProofRequest) Reset() { + *x = GenAggregatedProofRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenAggregatedProofRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenAggregatedProofRequest) ProtoMessage() {} + +func (x *GenAggregatedProofRequest) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenAggregatedProofRequest.ProtoReflect.Descriptor instead. +func (*GenAggregatedProofRequest) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{6} +} + +func (x *GenAggregatedProofRequest) GetRecursiveProof_1() string { + if x != nil { + return x.RecursiveProof_1 + } + return "" +} + +func (x *GenAggregatedProofRequest) GetRecursiveProof_2() string { + if x != nil { + return x.RecursiveProof_2 + } + return "" +} + +// * +// @dev GenFinalProofRequest +// @param {recursive_proof} - proof json of the batch or aggregated proof to finalise +// @param {aggregator_addr} - address of the aggregator +type GenFinalProofRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RecursiveProof string `protobuf:"bytes,1,opt,name=recursive_proof,json=recursiveProof,proto3" json:"recursive_proof,omitempty"` + AggregatorAddr string `protobuf:"bytes,2,opt,name=aggregator_addr,json=aggregatorAddr,proto3" json:"aggregator_addr,omitempty"` +} + +func (x *GenFinalProofRequest) Reset() { + *x = GenFinalProofRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenFinalProofRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenFinalProofRequest) ProtoMessage() {} + +func (x *GenFinalProofRequest) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenFinalProofRequest.ProtoReflect.Descriptor instead. +func (*GenFinalProofRequest) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{7} +} + +func (x *GenFinalProofRequest) GetRecursiveProof() string { + if x != nil { + return x.RecursiveProof + } + return "" +} + +func (x *GenFinalProofRequest) GetAggregatorAddr() string { + if x != nil { + return x.AggregatorAddr + } + return "" +} + +// * +// @dev CancelRequest +// @param {id} - identifier of the proof request to cancel +type CancelRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *CancelRequest) Reset() { + *x = CancelRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CancelRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelRequest) ProtoMessage() {} + +func (x *CancelRequest) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CancelRequest.ProtoReflect.Descriptor instead. +func (*CancelRequest) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{8} +} + +func (x *CancelRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +// * +// @dev Request GetProof +// @param {id} - proof identifier of the proof request +// @param {timeout} - time to wait until the service responds +type GetProofRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Timeout uint64 `protobuf:"varint,2,opt,name=timeout,proto3" json:"timeout,omitempty"` +} + +func (x *GetProofRequest) Reset() { + *x = GetProofRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetProofRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetProofRequest) ProtoMessage() {} + +func (x *GetProofRequest) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetProofRequest.ProtoReflect.Descriptor instead. +func (*GetProofRequest) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{9} +} + +func (x *GetProofRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GetProofRequest) GetTimeout() uint64 { + if x != nil { + return x.Timeout + } + return 0 +} + +// * +// @dev Response GetStatus +// @param {status} - server status +// - BOOTING: being ready to compute proofs +// - COMPUTING: busy computing a proof +// - IDLE: waiting for a proof to compute +// - HALT: stop +// @param {last_computed_request_id} - last proof identifier that has been computed +// @param {last_computed_end_time} - last proof timestamp when it was finished +// @param {current_computing_request_id} - id of the proof that is being computed +// @param {current_computing_start_time} - timestamp when the proof that is being computed started +// @param {version_proto} - .proto verion +// @param {version_server} - server version +// @param {pending_request_queue_ids} - list of identifierss of proof requests that are in the pending queue +// @param {prover_name} - id of this prover server, normally specified via config.json, or UNSPECIFIED otherwise; it does not change if prover reboots +// @param {prover_id} - id of this prover instance or reboot; it changes if prover reboots; it is a UUID, automatically generated during the initialization +// @param {number_of_cores} - number of cores in the system where the prover is running +// @param {total_memory} - total memory in the system where the prover is running +// @param {free_memory} - free memory in the system where the prover is running +type GetStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Status GetStatusResponse_Status `protobuf:"varint,1,opt,name=status,proto3,enum=aggregator.v1.GetStatusResponse_Status" json:"status,omitempty"` + LastComputedRequestId string `protobuf:"bytes,2,opt,name=last_computed_request_id,json=lastComputedRequestId,proto3" json:"last_computed_request_id,omitempty"` + LastComputedEndTime uint64 `protobuf:"varint,3,opt,name=last_computed_end_time,json=lastComputedEndTime,proto3" json:"last_computed_end_time,omitempty"` + CurrentComputingRequestId string `protobuf:"bytes,4,opt,name=current_computing_request_id,json=currentComputingRequestId,proto3" json:"current_computing_request_id,omitempty"` + CurrentComputingStartTime uint64 `protobuf:"varint,5,opt,name=current_computing_start_time,json=currentComputingStartTime,proto3" json:"current_computing_start_time,omitempty"` + VersionProto string `protobuf:"bytes,6,opt,name=version_proto,json=versionProto,proto3" json:"version_proto,omitempty"` + VersionServer string `protobuf:"bytes,7,opt,name=version_server,json=versionServer,proto3" json:"version_server,omitempty"` + PendingRequestQueueIds []string `protobuf:"bytes,8,rep,name=pending_request_queue_ids,json=pendingRequestQueueIds,proto3" json:"pending_request_queue_ids,omitempty"` + ProverName string `protobuf:"bytes,9,opt,name=prover_name,json=proverName,proto3" json:"prover_name,omitempty"` + ProverId string `protobuf:"bytes,10,opt,name=prover_id,json=proverId,proto3" json:"prover_id,omitempty"` + NumberOfCores uint64 `protobuf:"varint,11,opt,name=number_of_cores,json=numberOfCores,proto3" json:"number_of_cores,omitempty"` + TotalMemory uint64 `protobuf:"varint,12,opt,name=total_memory,json=totalMemory,proto3" json:"total_memory,omitempty"` + FreeMemory uint64 `protobuf:"varint,13,opt,name=free_memory,json=freeMemory,proto3" json:"free_memory,omitempty"` + ForkId uint64 `protobuf:"varint,14,opt,name=fork_id,json=forkId,proto3" json:"fork_id,omitempty"` +} + +func (x *GetStatusResponse) Reset() { + *x = GetStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetStatusResponse) ProtoMessage() {} + +func (x *GetStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetStatusResponse.ProtoReflect.Descriptor instead. +func (*GetStatusResponse) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{10} +} + +func (x *GetStatusResponse) GetStatus() GetStatusResponse_Status { + if x != nil { + return x.Status + } + return GetStatusResponse_STATUS_UNSPECIFIED +} + +func (x *GetStatusResponse) GetLastComputedRequestId() string { + if x != nil { + return x.LastComputedRequestId + } + return "" +} + +func (x *GetStatusResponse) GetLastComputedEndTime() uint64 { + if x != nil { + return x.LastComputedEndTime + } + return 0 +} + +func (x *GetStatusResponse) GetCurrentComputingRequestId() string { + if x != nil { + return x.CurrentComputingRequestId + } + return "" +} + +func (x *GetStatusResponse) GetCurrentComputingStartTime() uint64 { + if x != nil { + return x.CurrentComputingStartTime + } + return 0 +} + +func (x *GetStatusResponse) GetVersionProto() string { + if x != nil { + return x.VersionProto + } + return "" +} + +func (x *GetStatusResponse) GetVersionServer() string { + if x != nil { + return x.VersionServer + } + return "" +} + +func (x *GetStatusResponse) GetPendingRequestQueueIds() []string { + if x != nil { + return x.PendingRequestQueueIds + } + return nil +} + +func (x *GetStatusResponse) GetProverName() string { + if x != nil { + return x.ProverName + } + return "" +} + +func (x *GetStatusResponse) GetProverId() string { + if x != nil { + return x.ProverId + } + return "" +} + +func (x *GetStatusResponse) GetNumberOfCores() uint64 { + if x != nil { + return x.NumberOfCores + } + return 0 +} + +func (x *GetStatusResponse) GetTotalMemory() uint64 { + if x != nil { + return x.TotalMemory + } + return 0 +} + +func (x *GetStatusResponse) GetFreeMemory() uint64 { + if x != nil { + return x.FreeMemory + } + return 0 +} + +func (x *GetStatusResponse) GetForkId() uint64 { + if x != nil { + return x.ForkId + } + return 0 +} + +// * +// @dev GenBatchProofResponse +// @param {id} - proof identifier, to be used in GetProofRequest() +// @param {result} - request result +type GenBatchProofResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Result Result `protobuf:"varint,2,opt,name=result,proto3,enum=aggregator.v1.Result" json:"result,omitempty"` +} + +func (x *GenBatchProofResponse) Reset() { + *x = GenBatchProofResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenBatchProofResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenBatchProofResponse) ProtoMessage() {} + +func (x *GenBatchProofResponse) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenBatchProofResponse.ProtoReflect.Descriptor instead. +func (*GenBatchProofResponse) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{11} +} + +func (x *GenBatchProofResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GenBatchProofResponse) GetResult() Result { + if x != nil { + return x.Result + } + return Result_RESULT_UNSPECIFIED +} + +// * +// @dev GenAggregatedProofResponse +// @param {id} - proof identifier, to be used in GetProofRequest() +// @param {result} - request result +type GenAggregatedProofResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Result Result `protobuf:"varint,2,opt,name=result,proto3,enum=aggregator.v1.Result" json:"result,omitempty"` +} + +func (x *GenAggregatedProofResponse) Reset() { + *x = GenAggregatedProofResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenAggregatedProofResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenAggregatedProofResponse) ProtoMessage() {} + +func (x *GenAggregatedProofResponse) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenAggregatedProofResponse.ProtoReflect.Descriptor instead. +func (*GenAggregatedProofResponse) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{12} +} + +func (x *GenAggregatedProofResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GenAggregatedProofResponse) GetResult() Result { + if x != nil { + return x.Result + } + return Result_RESULT_UNSPECIFIED +} + +// * +// @dev Response GenFinalProof +// @param {id} - proof identifier, to be used in GetProofRequest() +// @param {result} - request result +type GenFinalProofResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Result Result `protobuf:"varint,2,opt,name=result,proto3,enum=aggregator.v1.Result" json:"result,omitempty"` +} + +func (x *GenFinalProofResponse) Reset() { + *x = GenFinalProofResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenFinalProofResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenFinalProofResponse) ProtoMessage() {} + +func (x *GenFinalProofResponse) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenFinalProofResponse.ProtoReflect.Descriptor instead. +func (*GenFinalProofResponse) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{13} +} + +func (x *GenFinalProofResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GenFinalProofResponse) GetResult() Result { + if x != nil { + return x.Result + } + return Result_RESULT_UNSPECIFIED +} + +// * +// @dev CancelResponse +// @param {result} - request result +type CancelResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Result Result `protobuf:"varint,1,opt,name=result,proto3,enum=aggregator.v1.Result" json:"result,omitempty"` +} + +func (x *CancelResponse) Reset() { + *x = CancelResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CancelResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelResponse) ProtoMessage() {} + +func (x *CancelResponse) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CancelResponse.ProtoReflect.Descriptor instead. +func (*CancelResponse) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{14} +} + +func (x *CancelResponse) GetResult() Result { + if x != nil { + return x.Result + } + return Result_RESULT_UNSPECIFIED +} + +// * +// @dev GetProofResponse +// @param {id} - proof identifier +// @param {final_proof} - groth16 proof + public circuit inputs +// @param {recursive_proof} - recursive proof json +// @param {result} - proof result +// - COMPLETED_OK: proof has been computed successfully and it is valid +// - ERROR: request error +// - COMPLETED_ERROR: proof has been computed successfully and it is not valid +// - PENDING: proof is being computed +// - INTERNAL_ERROR: server error during proof computation +// - CANCEL: proof has been cancelled +// +// @param {result_string} - extends result information +type GetProofResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Types that are assignable to Proof: + // + // *GetProofResponse_FinalProof + // *GetProofResponse_RecursiveProof + Proof isGetProofResponse_Proof `protobuf_oneof:"proof"` + Result GetProofResponse_Result `protobuf:"varint,4,opt,name=result,proto3,enum=aggregator.v1.GetProofResponse_Result" json:"result,omitempty"` + ResultString string `protobuf:"bytes,5,opt,name=result_string,json=resultString,proto3" json:"result_string,omitempty"` +} + +func (x *GetProofResponse) Reset() { + *x = GetProofResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetProofResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetProofResponse) ProtoMessage() {} + +func (x *GetProofResponse) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetProofResponse.ProtoReflect.Descriptor instead. +func (*GetProofResponse) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{15} +} + +func (x *GetProofResponse) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (m *GetProofResponse) GetProof() isGetProofResponse_Proof { + if m != nil { + return m.Proof + } + return nil +} + +func (x *GetProofResponse) GetFinalProof() *FinalProof { + if x, ok := x.GetProof().(*GetProofResponse_FinalProof); ok { + return x.FinalProof + } + return nil +} + +func (x *GetProofResponse) GetRecursiveProof() string { + if x, ok := x.GetProof().(*GetProofResponse_RecursiveProof); ok { + return x.RecursiveProof + } + return "" +} + +func (x *GetProofResponse) GetResult() GetProofResponse_Result { + if x != nil { + return x.Result + } + return GetProofResponse_RESULT_UNSPECIFIED +} + +func (x *GetProofResponse) GetResultString() string { + if x != nil { + return x.ResultString + } + return "" +} + +type isGetProofResponse_Proof interface { + isGetProofResponse_Proof() +} + +type GetProofResponse_FinalProof struct { + FinalProof *FinalProof `protobuf:"bytes,2,opt,name=final_proof,json=finalProof,proto3,oneof"` +} + +type GetProofResponse_RecursiveProof struct { + RecursiveProof string `protobuf:"bytes,3,opt,name=recursive_proof,json=recursiveProof,proto3,oneof"` +} + +func (*GetProofResponse_FinalProof) isGetProofResponse_Proof() {} + +func (*GetProofResponse_RecursiveProof) isGetProofResponse_Proof() {} + +// @dev FinalProof +// @param {proof} - groth16 proof +// @param {public} - public circuit inputs +type FinalProof struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Proof string `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"` + Public *PublicInputsExtended `protobuf:"bytes,2,opt,name=public,proto3" json:"public,omitempty"` +} + +func (x *FinalProof) Reset() { + *x = FinalProof{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FinalProof) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FinalProof) ProtoMessage() {} + +func (x *FinalProof) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FinalProof.ProtoReflect.Descriptor instead. +func (*FinalProof) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{16} +} + +func (x *FinalProof) GetProof() string { + if x != nil { + return x.Proof + } + return "" +} + +func (x *FinalProof) GetPublic() *PublicInputsExtended { + if x != nil { + return x.Public + } + return nil +} + +// @dev PublicInputs +// @param {old_state_root} +// @param {old_acc_input_hash} +// @param {old_batch_num} +// @param {chain_id} +// @param {batch_l2_data} +// @param {global_exit_root} +// @param {sequencer_addr} +// @param {aggregator_addr} +type PublicInputs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OldStateRoot []byte `protobuf:"bytes,1,opt,name=old_state_root,json=oldStateRoot,proto3" json:"old_state_root,omitempty"` + OldAccInputHash []byte `protobuf:"bytes,2,opt,name=old_acc_input_hash,json=oldAccInputHash,proto3" json:"old_acc_input_hash,omitempty"` + OldBatchNum uint64 `protobuf:"varint,3,opt,name=old_batch_num,json=oldBatchNum,proto3" json:"old_batch_num,omitempty"` + ChainId uint64 `protobuf:"varint,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ForkId uint64 `protobuf:"varint,5,opt,name=fork_id,json=forkId,proto3" json:"fork_id,omitempty"` + BatchL2Data []byte `protobuf:"bytes,6,opt,name=batch_l2_data,json=batchL2Data,proto3" json:"batch_l2_data,omitempty"` + L1InfoRoot []byte `protobuf:"bytes,7,opt,name=l1_info_root,json=l1InfoRoot,proto3" json:"l1_info_root,omitempty"` + TimestampLimit uint64 `protobuf:"varint,8,opt,name=timestamp_limit,json=timestampLimit,proto3" json:"timestamp_limit,omitempty"` + SequencerAddr string `protobuf:"bytes,9,opt,name=sequencer_addr,json=sequencerAddr,proto3" json:"sequencer_addr,omitempty"` + ForcedBlockhashL1 []byte `protobuf:"bytes,10,opt,name=forced_blockhash_l1,json=forcedBlockhashL1,proto3" json:"forced_blockhash_l1,omitempty"` + AggregatorAddr string `protobuf:"bytes,12,opt,name=aggregator_addr,json=aggregatorAddr,proto3" json:"aggregator_addr,omitempty"` + L1InfoTreeData map[uint32]*L1Data `protobuf:"bytes,16,rep,name=l1_info_tree_data,json=l1InfoTreeData,proto3" json:"l1_info_tree_data,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *PublicInputs) Reset() { + *x = PublicInputs{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PublicInputs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PublicInputs) ProtoMessage() {} + +func (x *PublicInputs) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PublicInputs.ProtoReflect.Descriptor instead. +func (*PublicInputs) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{17} +} + +func (x *PublicInputs) GetOldStateRoot() []byte { + if x != nil { + return x.OldStateRoot + } + return nil +} + +func (x *PublicInputs) GetOldAccInputHash() []byte { + if x != nil { + return x.OldAccInputHash + } + return nil +} + +func (x *PublicInputs) GetOldBatchNum() uint64 { + if x != nil { + return x.OldBatchNum + } + return 0 +} + +func (x *PublicInputs) GetChainId() uint64 { + if x != nil { + return x.ChainId + } + return 0 +} + +func (x *PublicInputs) GetForkId() uint64 { + if x != nil { + return x.ForkId + } + return 0 +} + +func (x *PublicInputs) GetBatchL2Data() []byte { + if x != nil { + return x.BatchL2Data + } + return nil +} + +func (x *PublicInputs) GetL1InfoRoot() []byte { + if x != nil { + return x.L1InfoRoot + } + return nil +} + +func (x *PublicInputs) GetTimestampLimit() uint64 { + if x != nil { + return x.TimestampLimit + } + return 0 +} + +func (x *PublicInputs) GetSequencerAddr() string { + if x != nil { + return x.SequencerAddr + } + return "" +} + +func (x *PublicInputs) GetForcedBlockhashL1() []byte { + if x != nil { + return x.ForcedBlockhashL1 + } + return nil +} + +func (x *PublicInputs) GetAggregatorAddr() string { + if x != nil { + return x.AggregatorAddr + } + return "" +} + +func (x *PublicInputs) GetL1InfoTreeData() map[uint32]*L1Data { + if x != nil { + return x.L1InfoTreeData + } + return nil +} + +type StatelessPublicInputs struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Witness []byte `protobuf:"bytes,1,opt,name=witness,proto3" json:"witness,omitempty"` + OldAccInputHash []byte `protobuf:"bytes,2,opt,name=old_acc_input_hash,json=oldAccInputHash,proto3" json:"old_acc_input_hash,omitempty"` + OldBatchNum uint64 `protobuf:"varint,3,opt,name=old_batch_num,json=oldBatchNum,proto3" json:"old_batch_num,omitempty"` + ChainId uint64 `protobuf:"varint,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + ForkId uint64 `protobuf:"varint,5,opt,name=fork_id,json=forkId,proto3" json:"fork_id,omitempty"` + BatchL2Data []byte `protobuf:"bytes,6,opt,name=batch_l2_data,json=batchL2Data,proto3" json:"batch_l2_data,omitempty"` + L1InfoRoot []byte `protobuf:"bytes,7,opt,name=l1_info_root,json=l1InfoRoot,proto3" json:"l1_info_root,omitempty"` + TimestampLimit uint64 `protobuf:"varint,8,opt,name=timestamp_limit,json=timestampLimit,proto3" json:"timestamp_limit,omitempty"` + SequencerAddr string `protobuf:"bytes,9,opt,name=sequencer_addr,json=sequencerAddr,proto3" json:"sequencer_addr,omitempty"` + ForcedBlockhashL1 []byte `protobuf:"bytes,10,opt,name=forced_blockhash_l1,json=forcedBlockhashL1,proto3" json:"forced_blockhash_l1,omitempty"` + AggregatorAddr string `protobuf:"bytes,11,opt,name=aggregator_addr,json=aggregatorAddr,proto3" json:"aggregator_addr,omitempty"` + L1InfoTreeData map[uint32]*L1Data `protobuf:"bytes,12,rep,name=l1_info_tree_data,json=l1InfoTreeData,proto3" json:"l1_info_tree_data,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *StatelessPublicInputs) Reset() { + *x = StatelessPublicInputs{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StatelessPublicInputs) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatelessPublicInputs) ProtoMessage() {} + +func (x *StatelessPublicInputs) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatelessPublicInputs.ProtoReflect.Descriptor instead. +func (*StatelessPublicInputs) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{18} +} + +func (x *StatelessPublicInputs) GetWitness() []byte { + if x != nil { + return x.Witness + } + return nil +} + +func (x *StatelessPublicInputs) GetOldAccInputHash() []byte { + if x != nil { + return x.OldAccInputHash + } + return nil +} + +func (x *StatelessPublicInputs) GetOldBatchNum() uint64 { + if x != nil { + return x.OldBatchNum + } + return 0 +} + +func (x *StatelessPublicInputs) GetChainId() uint64 { + if x != nil { + return x.ChainId + } + return 0 +} + +func (x *StatelessPublicInputs) GetForkId() uint64 { + if x != nil { + return x.ForkId + } + return 0 +} + +func (x *StatelessPublicInputs) GetBatchL2Data() []byte { + if x != nil { + return x.BatchL2Data + } + return nil +} + +func (x *StatelessPublicInputs) GetL1InfoRoot() []byte { + if x != nil { + return x.L1InfoRoot + } + return nil +} + +func (x *StatelessPublicInputs) GetTimestampLimit() uint64 { + if x != nil { + return x.TimestampLimit + } + return 0 +} + +func (x *StatelessPublicInputs) GetSequencerAddr() string { + if x != nil { + return x.SequencerAddr + } + return "" +} + +func (x *StatelessPublicInputs) GetForcedBlockhashL1() []byte { + if x != nil { + return x.ForcedBlockhashL1 + } + return nil +} + +func (x *StatelessPublicInputs) GetAggregatorAddr() string { + if x != nil { + return x.AggregatorAddr + } + return "" +} + +func (x *StatelessPublicInputs) GetL1InfoTreeData() map[uint32]*L1Data { + if x != nil { + return x.L1InfoTreeData + } + return nil +} + +// l1InfoTree leaf values +type L1Data struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GlobalExitRoot []byte `protobuf:"bytes,1,opt,name=global_exit_root,json=globalExitRoot,proto3" json:"global_exit_root,omitempty"` + BlockhashL1 []byte `protobuf:"bytes,2,opt,name=blockhash_l1,json=blockhashL1,proto3" json:"blockhash_l1,omitempty"` + MinTimestamp uint32 `protobuf:"varint,3,opt,name=min_timestamp,json=minTimestamp,proto3" json:"min_timestamp,omitempty"` + SmtProof [][]byte `protobuf:"bytes,4,rep,name=smt_proof,json=smtProof,proto3" json:"smt_proof,omitempty"` +} + +func (x *L1Data) Reset() { + *x = L1Data{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *L1Data) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*L1Data) ProtoMessage() {} + +func (x *L1Data) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use L1Data.ProtoReflect.Descriptor instead. +func (*L1Data) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{19} +} + +func (x *L1Data) GetGlobalExitRoot() []byte { + if x != nil { + return x.GlobalExitRoot + } + return nil +} + +func (x *L1Data) GetBlockhashL1() []byte { + if x != nil { + return x.BlockhashL1 + } + return nil +} + +func (x *L1Data) GetMinTimestamp() uint32 { + if x != nil { + return x.MinTimestamp + } + return 0 +} + +func (x *L1Data) GetSmtProof() [][]byte { + if x != nil { + return x.SmtProof + } + return nil +} + +// * +// @dev InputProver +// @param {public_inputs} - public inputs +// @param {db} - database containing all key-values in smt matching the old state root +// @param {contracts_bytecode} - key is the hash(contractBytecode), value is the bytecode itself +type InputProver struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicInputs *PublicInputs `protobuf:"bytes,1,opt,name=public_inputs,json=publicInputs,proto3" json:"public_inputs,omitempty"` + Db map[string]string `protobuf:"bytes,4,rep,name=db,proto3" json:"db,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // For debug/testing purpposes only. Don't fill this on production + ContractsBytecode map[string]string `protobuf:"bytes,5,rep,name=contracts_bytecode,json=contractsBytecode,proto3" json:"contracts_bytecode,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // For debug/testing purpposes only. Don't fill this on production +} + +func (x *InputProver) Reset() { + *x = InputProver{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InputProver) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InputProver) ProtoMessage() {} + +func (x *InputProver) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InputProver.ProtoReflect.Descriptor instead. +func (*InputProver) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{20} +} + +func (x *InputProver) GetPublicInputs() *PublicInputs { + if x != nil { + return x.PublicInputs + } + return nil +} + +func (x *InputProver) GetDb() map[string]string { + if x != nil { + return x.Db + } + return nil +} + +func (x *InputProver) GetContractsBytecode() map[string]string { + if x != nil { + return x.ContractsBytecode + } + return nil +} + +type StatelessInputProver struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicInputs *StatelessPublicInputs `protobuf:"bytes,1,opt,name=public_inputs,json=publicInputs,proto3" json:"public_inputs,omitempty"` +} + +func (x *StatelessInputProver) Reset() { + *x = StatelessInputProver{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StatelessInputProver) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatelessInputProver) ProtoMessage() {} + +func (x *StatelessInputProver) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatelessInputProver.ProtoReflect.Descriptor instead. +func (*StatelessInputProver) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{21} +} + +func (x *StatelessInputProver) GetPublicInputs() *StatelessPublicInputs { + if x != nil { + return x.PublicInputs + } + return nil +} + +// * +// @dev PublicInputsExtended +// @param {public_inputs} - public inputs +// @param {new_state_root} - final state root. Used as a sanity check. +// @param {new_acc_input_hash} - final accumulate input hash. Used as a sanity check. +// @param {new_local_exit_root} - new local exit root. Used as a sanity check. +// @param {new_batch_num} - final num batch. Used as a sanity check. +type PublicInputsExtended struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PublicInputs *PublicInputs `protobuf:"bytes,1,opt,name=public_inputs,json=publicInputs,proto3" json:"public_inputs,omitempty"` + NewStateRoot []byte `protobuf:"bytes,2,opt,name=new_state_root,json=newStateRoot,proto3" json:"new_state_root,omitempty"` + NewAccInputHash []byte `protobuf:"bytes,3,opt,name=new_acc_input_hash,json=newAccInputHash,proto3" json:"new_acc_input_hash,omitempty"` + NewLocalExitRoot []byte `protobuf:"bytes,4,opt,name=new_local_exit_root,json=newLocalExitRoot,proto3" json:"new_local_exit_root,omitempty"` + NewBatchNum uint64 `protobuf:"varint,5,opt,name=new_batch_num,json=newBatchNum,proto3" json:"new_batch_num,omitempty"` +} + +func (x *PublicInputsExtended) Reset() { + *x = PublicInputsExtended{} + if protoimpl.UnsafeEnabled { + mi := &file_aggregator_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PublicInputsExtended) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PublicInputsExtended) ProtoMessage() {} + +func (x *PublicInputsExtended) ProtoReflect() protoreflect.Message { + mi := &file_aggregator_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PublicInputsExtended.ProtoReflect.Descriptor instead. +func (*PublicInputsExtended) Descriptor() ([]byte, []int) { + return file_aggregator_proto_rawDescGZIP(), []int{22} +} + +func (x *PublicInputsExtended) GetPublicInputs() *PublicInputs { + if x != nil { + return x.PublicInputs + } + return nil +} + +func (x *PublicInputsExtended) GetNewStateRoot() []byte { + if x != nil { + return x.NewStateRoot + } + return nil +} + +func (x *PublicInputsExtended) GetNewAccInputHash() []byte { + if x != nil { + return x.NewAccInputHash + } + return nil +} + +func (x *PublicInputsExtended) GetNewLocalExitRoot() []byte { + if x != nil { + return x.NewLocalExitRoot + } + return nil +} + +func (x *PublicInputsExtended) GetNewBatchNum() uint64 { + if x != nil { + return x.NewBatchNum + } + return 0 +} + +var File_aggregator_proto protoreflect.FileDescriptor + +var file_aggregator_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x0d, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, + 0x31, 0x22, 0x1f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x06, + 0x76, 0x30, 0x5f, 0x30, 0x5f, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x76, 0x30, + 0x30, 0x31, 0x22, 0xb7, 0x05, 0x0a, 0x11, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4f, 0x0a, 0x12, 0x67, 0x65, 0x74, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5c, 0x0a, 0x17, 0x67, 0x65, 0x6e, + 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x14, 0x67, 0x65, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6b, 0x0a, 0x1c, 0x67, 0x65, 0x6e, 0x5f, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x6e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x19, 0x67, 0x65, 0x6e, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x5c, 0x0a, 0x17, 0x67, 0x65, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x61, + 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x14, 0x67, 0x65, + 0x6e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x45, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x11, 0x67, 0x65, 0x74, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x78, 0x0a, 0x21, 0x67, 0x65, 0x6e, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x48, 0x00, 0x52, 0x1d, 0x67, 0x65, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x42, 0x09, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xcc, 0x04, 0x0a, + 0x0d, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x52, + 0x0a, 0x13, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x11, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x18, 0x67, 0x65, 0x6e, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x15, 0x67, 0x65, + 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x1d, 0x67, 0x65, 0x6e, 0x5f, 0x61, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x41, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x67, 0x65, 0x6e, 0x41, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x18, 0x67, 0x65, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x61, 0x6c, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, + 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x15, 0x67, + 0x65, 0x6e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, + 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0e, + 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, + 0x0a, 0x12, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x10, 0x67, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x48, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, + 0x65, 0x72, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x5a, 0x0a, 0x1d, 0x47, 0x65, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x05, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6c, + 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x05, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x73, 0x0a, 0x19, 0x47, 0x65, 0x6e, 0x41, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, + 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x31, 0x12, 0x2a, + 0x0a, 0x11, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x5f, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x75, 0x72, + 0x73, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x32, 0x22, 0x68, 0x0a, 0x14, 0x47, 0x65, + 0x6e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x27, 0x0a, 0x0f, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, + 0x41, 0x64, 0x64, 0x72, 0x22, 0x1f, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x22, 0xfc, 0x05, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6c, 0x61, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x49, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, + 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x25, + 0x0a, 0x0e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x19, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, + 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x51, 0x75, 0x65, 0x75, 0x65, 0x49, 0x64, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x72, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x43, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x72, 0x65, + 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x66, 0x72, 0x65, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x6f, + 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x66, 0x6f, 0x72, + 0x6b, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, + 0x12, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x42, 0x4f, 0x4f, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, + 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x03, + 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x48, 0x41, 0x4c, 0x54, 0x10, + 0x04, 0x22, 0x56, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x67, + 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x5b, 0x0a, 0x1a, 0x47, 0x65, 0x6e, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x56, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x46, 0x69, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x2d, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x15, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x3f, + 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2d, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, + 0xa5, 0x03, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x61, 0x6c, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0x29, 0x0a, 0x0f, 0x72, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0e, 0x72, + 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3e, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, + 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, + 0x12, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, + 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x5f, 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x10, + 0x0a, 0x0c, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, + 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, + 0x45, 0x54, 0x45, 0x44, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, + 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x04, + 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, + 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x52, + 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x10, 0x06, 0x42, 0x07, + 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x5f, 0x0a, 0x0a, 0x46, 0x69, 0x6e, 0x61, 0x6c, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x3b, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, + 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xde, 0x04, 0x0a, 0x0c, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, + 0x2b, 0x0a, 0x12, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x6f, 0x6c, 0x64, + 0x41, 0x63, 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0d, + 0x6f, 0x6c, 0x64, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x75, 0x6d, + 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x66, + 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x66, 0x6f, + 0x72, 0x6b, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x32, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x4c, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x31, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, + 0x6c, 0x31, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6c, + 0x31, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x42, + 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x4c, 0x31, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, + 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x12, 0x5a, 0x0a, 0x11, 0x6c, 0x31, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x74, + 0x72, 0x65, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x2e, 0x4c, 0x31, 0x49, 0x6e, + 0x66, 0x6f, 0x54, 0x72, 0x65, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0e, 0x6c, 0x31, 0x49, 0x6e, 0x66, 0x6f, 0x54, 0x72, 0x65, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, + 0x58, 0x0a, 0x13, 0x4c, 0x31, 0x49, 0x6e, 0x66, 0x6f, 0x54, 0x72, 0x65, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, + 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe4, 0x04, 0x0a, 0x15, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x77, 0x69, 0x74, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, + 0x12, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x68, + 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x6f, 0x6c, 0x64, 0x41, 0x63, + 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x0d, 0x6f, 0x6c, + 0x64, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x12, 0x19, + 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x6f, 0x72, + 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6b, + 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6c, 0x32, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x4c, 0x32, 0x44, 0x61, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0c, 0x6c, 0x31, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x6c, 0x31, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x6c, 0x31, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x64, 0x42, 0x6c, 0x6f, + 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x4c, 0x31, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, + 0x72, 0x12, 0x63, 0x0a, 0x11, 0x6c, 0x31, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x74, 0x72, 0x65, + 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x2e, 0x4c, 0x31, 0x49, 0x6e, 0x66, 0x6f, 0x54, 0x72, 0x65, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x6c, 0x31, 0x49, 0x6e, 0x66, 0x6f, 0x54, 0x72, + 0x65, 0x65, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x58, 0x0a, 0x13, 0x4c, 0x31, 0x49, 0x6e, 0x66, 0x6f, + 0x54, 0x72, 0x65, 0x65, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x31, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x97, 0x01, 0x0a, 0x06, 0x4c, 0x31, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x45, 0x78, 0x69, + 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, + 0x73, 0x68, 0x5f, 0x6c, 0x31, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x68, 0x61, 0x73, 0x68, 0x4c, 0x31, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0c, 0x6d, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, + 0x09, 0x73, 0x6d, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, + 0x52, 0x08, 0x73, 0x6d, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0xe2, 0x02, 0x0a, 0x0b, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x52, 0x0c, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x02, + 0x64, 0x62, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, + 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x50, 0x72, + 0x6f, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x02, 0x64, 0x62, + 0x12, 0x60, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, + 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, + 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x63, 0x6f, + 0x64, 0x65, 0x1a, 0x35, 0x0a, 0x07, 0x44, 0x62, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x42, 0x79, 0x74, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x61, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x49, 0x0a, 0x0d, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x73, 0x52, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x14, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x73, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0d, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x52, + 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x24, 0x0a, + 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x6f, 0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x63, 0x63, 0x5f, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0f, 0x6e, 0x65, 0x77, 0x41, 0x63, 0x63, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x61, 0x73, 0x68, + 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x65, 0x77, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x65, 0x78, + 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x6e, + 0x65, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x45, 0x78, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, + 0x22, 0x0a, 0x0d, 0x6e, 0x65, 0x77, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x75, 0x6d, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x4e, 0x75, 0x6d, 0x2a, 0x5c, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, + 0x12, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, + 0x4f, 0x4b, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, + 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x03, 0x32, 0x64, 0x0a, 0x11, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x07, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x12, 0x1c, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, + 0x20, 0x2e, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x78, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x48, + 0x65, 0x72, 0x6d, 0x65, 0x7a, 0x2f, 0x7a, 0x6b, 0x65, 0x76, 0x6d, 0x2d, 0x61, 0x67, 0x67, 0x72, + 0x65, 0x67, 0x61, 0x74, 0x6f, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_aggregator_proto_rawDescOnce sync.Once + file_aggregator_proto_rawDescData = file_aggregator_proto_rawDesc +) + +func file_aggregator_proto_rawDescGZIP() []byte { + file_aggregator_proto_rawDescOnce.Do(func() { + file_aggregator_proto_rawDescData = protoimpl.X.CompressGZIP(file_aggregator_proto_rawDescData) + }) + return file_aggregator_proto_rawDescData +} + +var file_aggregator_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_aggregator_proto_msgTypes = make([]protoimpl.MessageInfo, 27) +var file_aggregator_proto_goTypes = []interface{}{ + (Result)(0), // 0: aggregator.v1.Result + (GetStatusResponse_Status)(0), // 1: aggregator.v1.GetStatusResponse.Status + (GetProofResponse_Result)(0), // 2: aggregator.v1.GetProofResponse.Result + (*Version)(nil), // 3: aggregator.v1.Version + (*AggregatorMessage)(nil), // 4: aggregator.v1.AggregatorMessage + (*ProverMessage)(nil), // 5: aggregator.v1.ProverMessage + (*GetStatusRequest)(nil), // 6: aggregator.v1.GetStatusRequest + (*GenBatchProofRequest)(nil), // 7: aggregator.v1.GenBatchProofRequest + (*GenStatelessBatchProofRequest)(nil), // 8: aggregator.v1.GenStatelessBatchProofRequest + (*GenAggregatedProofRequest)(nil), // 9: aggregator.v1.GenAggregatedProofRequest + (*GenFinalProofRequest)(nil), // 10: aggregator.v1.GenFinalProofRequest + (*CancelRequest)(nil), // 11: aggregator.v1.CancelRequest + (*GetProofRequest)(nil), // 12: aggregator.v1.GetProofRequest + (*GetStatusResponse)(nil), // 13: aggregator.v1.GetStatusResponse + (*GenBatchProofResponse)(nil), // 14: aggregator.v1.GenBatchProofResponse + (*GenAggregatedProofResponse)(nil), // 15: aggregator.v1.GenAggregatedProofResponse + (*GenFinalProofResponse)(nil), // 16: aggregator.v1.GenFinalProofResponse + (*CancelResponse)(nil), // 17: aggregator.v1.CancelResponse + (*GetProofResponse)(nil), // 18: aggregator.v1.GetProofResponse + (*FinalProof)(nil), // 19: aggregator.v1.FinalProof + (*PublicInputs)(nil), // 20: aggregator.v1.PublicInputs + (*StatelessPublicInputs)(nil), // 21: aggregator.v1.StatelessPublicInputs + (*L1Data)(nil), // 22: aggregator.v1.L1Data + (*InputProver)(nil), // 23: aggregator.v1.InputProver + (*StatelessInputProver)(nil), // 24: aggregator.v1.StatelessInputProver + (*PublicInputsExtended)(nil), // 25: aggregator.v1.PublicInputsExtended + nil, // 26: aggregator.v1.PublicInputs.L1InfoTreeDataEntry + nil, // 27: aggregator.v1.StatelessPublicInputs.L1InfoTreeDataEntry + nil, // 28: aggregator.v1.InputProver.DbEntry + nil, // 29: aggregator.v1.InputProver.ContractsBytecodeEntry +} +var file_aggregator_proto_depIdxs = []int32{ + 6, // 0: aggregator.v1.AggregatorMessage.get_status_request:type_name -> aggregator.v1.GetStatusRequest + 7, // 1: aggregator.v1.AggregatorMessage.gen_batch_proof_request:type_name -> aggregator.v1.GenBatchProofRequest + 9, // 2: aggregator.v1.AggregatorMessage.gen_aggregated_proof_request:type_name -> aggregator.v1.GenAggregatedProofRequest + 10, // 3: aggregator.v1.AggregatorMessage.gen_final_proof_request:type_name -> aggregator.v1.GenFinalProofRequest + 11, // 4: aggregator.v1.AggregatorMessage.cancel_request:type_name -> aggregator.v1.CancelRequest + 12, // 5: aggregator.v1.AggregatorMessage.get_proof_request:type_name -> aggregator.v1.GetProofRequest + 8, // 6: aggregator.v1.AggregatorMessage.gen_stateless_batch_proof_request:type_name -> aggregator.v1.GenStatelessBatchProofRequest + 13, // 7: aggregator.v1.ProverMessage.get_status_response:type_name -> aggregator.v1.GetStatusResponse + 14, // 8: aggregator.v1.ProverMessage.gen_batch_proof_response:type_name -> aggregator.v1.GenBatchProofResponse + 15, // 9: aggregator.v1.ProverMessage.gen_aggregated_proof_response:type_name -> aggregator.v1.GenAggregatedProofResponse + 16, // 10: aggregator.v1.ProverMessage.gen_final_proof_response:type_name -> aggregator.v1.GenFinalProofResponse + 17, // 11: aggregator.v1.ProverMessage.cancel_response:type_name -> aggregator.v1.CancelResponse + 18, // 12: aggregator.v1.ProverMessage.get_proof_response:type_name -> aggregator.v1.GetProofResponse + 23, // 13: aggregator.v1.GenBatchProofRequest.input:type_name -> aggregator.v1.InputProver + 24, // 14: aggregator.v1.GenStatelessBatchProofRequest.input:type_name -> aggregator.v1.StatelessInputProver + 1, // 15: aggregator.v1.GetStatusResponse.status:type_name -> aggregator.v1.GetStatusResponse.Status + 0, // 16: aggregator.v1.GenBatchProofResponse.result:type_name -> aggregator.v1.Result + 0, // 17: aggregator.v1.GenAggregatedProofResponse.result:type_name -> aggregator.v1.Result + 0, // 18: aggregator.v1.GenFinalProofResponse.result:type_name -> aggregator.v1.Result + 0, // 19: aggregator.v1.CancelResponse.result:type_name -> aggregator.v1.Result + 19, // 20: aggregator.v1.GetProofResponse.final_proof:type_name -> aggregator.v1.FinalProof + 2, // 21: aggregator.v1.GetProofResponse.result:type_name -> aggregator.v1.GetProofResponse.Result + 25, // 22: aggregator.v1.FinalProof.public:type_name -> aggregator.v1.PublicInputsExtended + 26, // 23: aggregator.v1.PublicInputs.l1_info_tree_data:type_name -> aggregator.v1.PublicInputs.L1InfoTreeDataEntry + 27, // 24: aggregator.v1.StatelessPublicInputs.l1_info_tree_data:type_name -> aggregator.v1.StatelessPublicInputs.L1InfoTreeDataEntry + 20, // 25: aggregator.v1.InputProver.public_inputs:type_name -> aggregator.v1.PublicInputs + 28, // 26: aggregator.v1.InputProver.db:type_name -> aggregator.v1.InputProver.DbEntry + 29, // 27: aggregator.v1.InputProver.contracts_bytecode:type_name -> aggregator.v1.InputProver.ContractsBytecodeEntry + 21, // 28: aggregator.v1.StatelessInputProver.public_inputs:type_name -> aggregator.v1.StatelessPublicInputs + 20, // 29: aggregator.v1.PublicInputsExtended.public_inputs:type_name -> aggregator.v1.PublicInputs + 22, // 30: aggregator.v1.PublicInputs.L1InfoTreeDataEntry.value:type_name -> aggregator.v1.L1Data + 22, // 31: aggregator.v1.StatelessPublicInputs.L1InfoTreeDataEntry.value:type_name -> aggregator.v1.L1Data + 5, // 32: aggregator.v1.AggregatorService.Channel:input_type -> aggregator.v1.ProverMessage + 4, // 33: aggregator.v1.AggregatorService.Channel:output_type -> aggregator.v1.AggregatorMessage + 33, // [33:34] is the sub-list for method output_type + 32, // [32:33] is the sub-list for method input_type + 32, // [32:32] is the sub-list for extension type_name + 32, // [32:32] is the sub-list for extension extendee + 0, // [0:32] is the sub-list for field type_name +} + +func init() { file_aggregator_proto_init() } +func file_aggregator_proto_init() { + if File_aggregator_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_aggregator_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Version); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AggregatorMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ProverMessage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenBatchProofRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenStatelessBatchProofRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenAggregatedProofRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenFinalProofRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CancelRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetProofRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStatusResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenBatchProofResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenAggregatedProofResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenFinalProofResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CancelResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetProofResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FinalProof); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PublicInputs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatelessPublicInputs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*L1Data); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InputProver); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatelessInputProver); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_aggregator_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PublicInputsExtended); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_aggregator_proto_msgTypes[1].OneofWrappers = []interface{}{ + (*AggregatorMessage_GetStatusRequest)(nil), + (*AggregatorMessage_GenBatchProofRequest)(nil), + (*AggregatorMessage_GenAggregatedProofRequest)(nil), + (*AggregatorMessage_GenFinalProofRequest)(nil), + (*AggregatorMessage_CancelRequest)(nil), + (*AggregatorMessage_GetProofRequest)(nil), + (*AggregatorMessage_GenStatelessBatchProofRequest)(nil), + } + file_aggregator_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*ProverMessage_GetStatusResponse)(nil), + (*ProverMessage_GenBatchProofResponse)(nil), + (*ProverMessage_GenAggregatedProofResponse)(nil), + (*ProverMessage_GenFinalProofResponse)(nil), + (*ProverMessage_CancelResponse)(nil), + (*ProverMessage_GetProofResponse)(nil), + } + file_aggregator_proto_msgTypes[15].OneofWrappers = []interface{}{ + (*GetProofResponse_FinalProof)(nil), + (*GetProofResponse_RecursiveProof)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_aggregator_proto_rawDesc, + NumEnums: 3, + NumMessages: 27, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_aggregator_proto_goTypes, + DependencyIndexes: file_aggregator_proto_depIdxs, + EnumInfos: file_aggregator_proto_enumTypes, + MessageInfos: file_aggregator_proto_msgTypes, + }.Build() + File_aggregator_proto = out.File + file_aggregator_proto_rawDesc = nil + file_aggregator_proto_goTypes = nil + file_aggregator_proto_depIdxs = nil +} diff --git a/aggregator/prover/aggregator_grpc.pb.go b/aggregator/prover/aggregator_grpc.pb.go new file mode 100644 index 00000000..32bdb107 --- /dev/null +++ b/aggregator/prover/aggregator_grpc.pb.go @@ -0,0 +1,150 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.4.0 +// - protoc v5.27.0 +// source: aggregator.proto + +package prover + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 + +const ( + AggregatorService_Channel_FullMethodName = "/aggregator.v1.AggregatorService/Channel" +) + +// AggregatorServiceClient is the client API for AggregatorService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// * +// Define all methods implementes by the gRPC +// Channel: prover receives aggregator messages and returns prover messages with the same id +type AggregatorServiceClient interface { + Channel(ctx context.Context, opts ...grpc.CallOption) (AggregatorService_ChannelClient, error) +} + +type aggregatorServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAggregatorServiceClient(cc grpc.ClientConnInterface) AggregatorServiceClient { + return &aggregatorServiceClient{cc} +} + +func (c *aggregatorServiceClient) Channel(ctx context.Context, opts ...grpc.CallOption) (AggregatorService_ChannelClient, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &AggregatorService_ServiceDesc.Streams[0], AggregatorService_Channel_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &aggregatorServiceChannelClient{ClientStream: stream} + return x, nil +} + +type AggregatorService_ChannelClient interface { + Send(*ProverMessage) error + Recv() (*AggregatorMessage, error) + grpc.ClientStream +} + +type aggregatorServiceChannelClient struct { + grpc.ClientStream +} + +func (x *aggregatorServiceChannelClient) Send(m *ProverMessage) error { + return x.ClientStream.SendMsg(m) +} + +func (x *aggregatorServiceChannelClient) Recv() (*AggregatorMessage, error) { + m := new(AggregatorMessage) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// AggregatorServiceServer is the server API for AggregatorService service. +// All implementations must embed UnimplementedAggregatorServiceServer +// for forward compatibility +// +// * +// Define all methods implementes by the gRPC +// Channel: prover receives aggregator messages and returns prover messages with the same id +type AggregatorServiceServer interface { + Channel(AggregatorService_ChannelServer) error + mustEmbedUnimplementedAggregatorServiceServer() +} + +// UnimplementedAggregatorServiceServer must be embedded to have forward compatible implementations. +type UnimplementedAggregatorServiceServer struct { +} + +func (UnimplementedAggregatorServiceServer) Channel(AggregatorService_ChannelServer) error { + return status.Errorf(codes.Unimplemented, "method Channel not implemented") +} +func (UnimplementedAggregatorServiceServer) mustEmbedUnimplementedAggregatorServiceServer() {} + +// UnsafeAggregatorServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AggregatorServiceServer will +// result in compilation errors. +type UnsafeAggregatorServiceServer interface { + mustEmbedUnimplementedAggregatorServiceServer() +} + +func RegisterAggregatorServiceServer(s grpc.ServiceRegistrar, srv AggregatorServiceServer) { + s.RegisterService(&AggregatorService_ServiceDesc, srv) +} + +func _AggregatorService_Channel_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(AggregatorServiceServer).Channel(&aggregatorServiceChannelServer{ServerStream: stream}) +} + +type AggregatorService_ChannelServer interface { + Send(*AggregatorMessage) error + Recv() (*ProverMessage, error) + grpc.ServerStream +} + +type aggregatorServiceChannelServer struct { + grpc.ServerStream +} + +func (x *aggregatorServiceChannelServer) Send(m *AggregatorMessage) error { + return x.ServerStream.SendMsg(m) +} + +func (x *aggregatorServiceChannelServer) Recv() (*ProverMessage, error) { + m := new(ProverMessage) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// AggregatorService_ServiceDesc is the grpc.ServiceDesc for AggregatorService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AggregatorService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "aggregator.v1.AggregatorService", + HandlerType: (*AggregatorServiceServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Channel", + Handler: _AggregatorService_Channel_Handler, + ServerStreams: true, + ClientStreams: true, + }, + }, + Metadata: "aggregator.proto", +} diff --git a/aggregator/prover/mocks/mock_channel.go b/aggregator/prover/mocks/mock_channel.go new file mode 100644 index 00000000..20638d69 --- /dev/null +++ b/aggregator/prover/mocks/mock_channel.go @@ -0,0 +1,406 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + metadata "google.golang.org/grpc/metadata" + + prover "github.com/agglayer/aggkit/aggregator/prover" +) + +// ChannelMock is an autogenerated mock type for the AggregatorService_ChannelServer type +type ChannelMock struct { + mock.Mock +} + +type ChannelMock_Expecter struct { + mock *mock.Mock +} + +func (_m *ChannelMock) EXPECT() *ChannelMock_Expecter { + return &ChannelMock_Expecter{mock: &_m.Mock} +} + +// Context provides a mock function with no fields +func (_m *ChannelMock) Context() context.Context { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Context") + } + + var r0 context.Context + if rf, ok := ret.Get(0).(func() context.Context); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(context.Context) + } + } + + return r0 +} + +// ChannelMock_Context_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Context' +type ChannelMock_Context_Call struct { + *mock.Call +} + +// Context is a helper method to define mock.On call +func (_e *ChannelMock_Expecter) Context() *ChannelMock_Context_Call { + return &ChannelMock_Context_Call{Call: _e.mock.On("Context")} +} + +func (_c *ChannelMock_Context_Call) Run(run func()) *ChannelMock_Context_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ChannelMock_Context_Call) Return(_a0 context.Context) *ChannelMock_Context_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ChannelMock_Context_Call) RunAndReturn(run func() context.Context) *ChannelMock_Context_Call { + _c.Call.Return(run) + return _c +} + +// Recv provides a mock function with no fields +func (_m *ChannelMock) Recv() (*prover.ProverMessage, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Recv") + } + + var r0 *prover.ProverMessage + var r1 error + if rf, ok := ret.Get(0).(func() (*prover.ProverMessage, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *prover.ProverMessage); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*prover.ProverMessage) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ChannelMock_Recv_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Recv' +type ChannelMock_Recv_Call struct { + *mock.Call +} + +// Recv is a helper method to define mock.On call +func (_e *ChannelMock_Expecter) Recv() *ChannelMock_Recv_Call { + return &ChannelMock_Recv_Call{Call: _e.mock.On("Recv")} +} + +func (_c *ChannelMock_Recv_Call) Run(run func()) *ChannelMock_Recv_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *ChannelMock_Recv_Call) Return(_a0 *prover.ProverMessage, _a1 error) *ChannelMock_Recv_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ChannelMock_Recv_Call) RunAndReturn(run func() (*prover.ProverMessage, error)) *ChannelMock_Recv_Call { + _c.Call.Return(run) + return _c +} + +// RecvMsg provides a mock function with given fields: m +func (_m *ChannelMock) RecvMsg(m interface{}) error { + ret := _m.Called(m) + + if len(ret) == 0 { + panic("no return value specified for RecvMsg") + } + + var r0 error + if rf, ok := ret.Get(0).(func(interface{}) error); ok { + r0 = rf(m) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ChannelMock_RecvMsg_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RecvMsg' +type ChannelMock_RecvMsg_Call struct { + *mock.Call +} + +// RecvMsg is a helper method to define mock.On call +// - m interface{} +func (_e *ChannelMock_Expecter) RecvMsg(m interface{}) *ChannelMock_RecvMsg_Call { + return &ChannelMock_RecvMsg_Call{Call: _e.mock.On("RecvMsg", m)} +} + +func (_c *ChannelMock_RecvMsg_Call) Run(run func(m interface{})) *ChannelMock_RecvMsg_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(interface{})) + }) + return _c +} + +func (_c *ChannelMock_RecvMsg_Call) Return(_a0 error) *ChannelMock_RecvMsg_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ChannelMock_RecvMsg_Call) RunAndReturn(run func(interface{}) error) *ChannelMock_RecvMsg_Call { + _c.Call.Return(run) + return _c +} + +// Send provides a mock function with given fields: _a0 +func (_m *ChannelMock) Send(_a0 *prover.AggregatorMessage) error { + ret := _m.Called(_a0) + + if len(ret) == 0 { + panic("no return value specified for Send") + } + + var r0 error + if rf, ok := ret.Get(0).(func(*prover.AggregatorMessage) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ChannelMock_Send_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Send' +type ChannelMock_Send_Call struct { + *mock.Call +} + +// Send is a helper method to define mock.On call +// - _a0 *prover.AggregatorMessage +func (_e *ChannelMock_Expecter) Send(_a0 interface{}) *ChannelMock_Send_Call { + return &ChannelMock_Send_Call{Call: _e.mock.On("Send", _a0)} +} + +func (_c *ChannelMock_Send_Call) Run(run func(_a0 *prover.AggregatorMessage)) *ChannelMock_Send_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*prover.AggregatorMessage)) + }) + return _c +} + +func (_c *ChannelMock_Send_Call) Return(_a0 error) *ChannelMock_Send_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ChannelMock_Send_Call) RunAndReturn(run func(*prover.AggregatorMessage) error) *ChannelMock_Send_Call { + _c.Call.Return(run) + return _c +} + +// SendHeader provides a mock function with given fields: _a0 +func (_m *ChannelMock) SendHeader(_a0 metadata.MD) error { + ret := _m.Called(_a0) + + if len(ret) == 0 { + panic("no return value specified for SendHeader") + } + + var r0 error + if rf, ok := ret.Get(0).(func(metadata.MD) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ChannelMock_SendHeader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendHeader' +type ChannelMock_SendHeader_Call struct { + *mock.Call +} + +// SendHeader is a helper method to define mock.On call +// - _a0 metadata.MD +func (_e *ChannelMock_Expecter) SendHeader(_a0 interface{}) *ChannelMock_SendHeader_Call { + return &ChannelMock_SendHeader_Call{Call: _e.mock.On("SendHeader", _a0)} +} + +func (_c *ChannelMock_SendHeader_Call) Run(run func(_a0 metadata.MD)) *ChannelMock_SendHeader_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(metadata.MD)) + }) + return _c +} + +func (_c *ChannelMock_SendHeader_Call) Return(_a0 error) *ChannelMock_SendHeader_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ChannelMock_SendHeader_Call) RunAndReturn(run func(metadata.MD) error) *ChannelMock_SendHeader_Call { + _c.Call.Return(run) + return _c +} + +// SendMsg provides a mock function with given fields: m +func (_m *ChannelMock) SendMsg(m interface{}) error { + ret := _m.Called(m) + + if len(ret) == 0 { + panic("no return value specified for SendMsg") + } + + var r0 error + if rf, ok := ret.Get(0).(func(interface{}) error); ok { + r0 = rf(m) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ChannelMock_SendMsg_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendMsg' +type ChannelMock_SendMsg_Call struct { + *mock.Call +} + +// SendMsg is a helper method to define mock.On call +// - m interface{} +func (_e *ChannelMock_Expecter) SendMsg(m interface{}) *ChannelMock_SendMsg_Call { + return &ChannelMock_SendMsg_Call{Call: _e.mock.On("SendMsg", m)} +} + +func (_c *ChannelMock_SendMsg_Call) Run(run func(m interface{})) *ChannelMock_SendMsg_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(interface{})) + }) + return _c +} + +func (_c *ChannelMock_SendMsg_Call) Return(_a0 error) *ChannelMock_SendMsg_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ChannelMock_SendMsg_Call) RunAndReturn(run func(interface{}) error) *ChannelMock_SendMsg_Call { + _c.Call.Return(run) + return _c +} + +// SetHeader provides a mock function with given fields: _a0 +func (_m *ChannelMock) SetHeader(_a0 metadata.MD) error { + ret := _m.Called(_a0) + + if len(ret) == 0 { + panic("no return value specified for SetHeader") + } + + var r0 error + if rf, ok := ret.Get(0).(func(metadata.MD) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ChannelMock_SetHeader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetHeader' +type ChannelMock_SetHeader_Call struct { + *mock.Call +} + +// SetHeader is a helper method to define mock.On call +// - _a0 metadata.MD +func (_e *ChannelMock_Expecter) SetHeader(_a0 interface{}) *ChannelMock_SetHeader_Call { + return &ChannelMock_SetHeader_Call{Call: _e.mock.On("SetHeader", _a0)} +} + +func (_c *ChannelMock_SetHeader_Call) Run(run func(_a0 metadata.MD)) *ChannelMock_SetHeader_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(metadata.MD)) + }) + return _c +} + +func (_c *ChannelMock_SetHeader_Call) Return(_a0 error) *ChannelMock_SetHeader_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ChannelMock_SetHeader_Call) RunAndReturn(run func(metadata.MD) error) *ChannelMock_SetHeader_Call { + _c.Call.Return(run) + return _c +} + +// SetTrailer provides a mock function with given fields: _a0 +func (_m *ChannelMock) SetTrailer(_a0 metadata.MD) { + _m.Called(_a0) +} + +// ChannelMock_SetTrailer_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetTrailer' +type ChannelMock_SetTrailer_Call struct { + *mock.Call +} + +// SetTrailer is a helper method to define mock.On call +// - _a0 metadata.MD +func (_e *ChannelMock_Expecter) SetTrailer(_a0 interface{}) *ChannelMock_SetTrailer_Call { + return &ChannelMock_SetTrailer_Call{Call: _e.mock.On("SetTrailer", _a0)} +} + +func (_c *ChannelMock_SetTrailer_Call) Run(run func(_a0 metadata.MD)) *ChannelMock_SetTrailer_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(metadata.MD)) + }) + return _c +} + +func (_c *ChannelMock_SetTrailer_Call) Return() *ChannelMock_SetTrailer_Call { + _c.Call.Return() + return _c +} + +func (_c *ChannelMock_SetTrailer_Call) RunAndReturn(run func(metadata.MD)) *ChannelMock_SetTrailer_Call { + _c.Run(run) + return _c +} + +// NewChannelMock creates a new instance of ChannelMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewChannelMock(t interface { + mock.TestingT + Cleanup(func()) +}) *ChannelMock { + mock := &ChannelMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggregator/prover/prover.go b/aggregator/prover/prover.go new file mode 100644 index 00000000..00141581 --- /dev/null +++ b/aggregator/prover/prover.go @@ -0,0 +1,460 @@ +package prover + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "math/big" + "net" + "strconv" + "strings" + "time" + + "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/common" + "github.com/iden3/go-iden3-crypto/poseidon" +) + +const ( + StateRootStartIndex = 19 + StateRootFinalIndex = StateRootStartIndex + 8 + AccInputHashStartIndex = 27 + AccInputHashFinalIndex = AccInputHashStartIndex + 8 +) + +var ( + ErrBadProverResponse = errors.New("prover returned wrong type for response") //nolint:revive + ErrProverInternalError = errors.New("prover returned INTERNAL_ERROR response") //nolint:revive + ErrProverCompletedError = errors.New("prover returned COMPLETED_ERROR response") //nolint:revive + ErrBadRequest = errors.New("prover returned ERROR for a bad request") //nolint:revive + ErrUnspecified = errors.New("prover returned an UNSPECIFIED response") //nolint:revive + ErrUnknown = errors.New("prover returned an unknown response") //nolint:revive + ErrProofCanceled = errors.New("proof has been canceled") //nolint:revive +) + +// Prover abstraction of the grpc prover client. +type Prover struct { + logger *log.Logger + name string + id string + address net.Addr + proofStatePollingInterval types.Duration + stream AggregatorService_ChannelServer +} + +// New returns a new Prover instance. +func New(logger *log.Logger, stream AggregatorService_ChannelServer, + addr net.Addr, proofStatePollingInterval types.Duration) (*Prover, error) { + p := &Prover{ + logger: logger, + stream: stream, + address: addr, + proofStatePollingInterval: proofStatePollingInterval, + } + + status, err := p.Status() + if err != nil { + return nil, fmt.Errorf("failed to retrieve prover id %w", err) + } + p.name = status.ProverName + p.id = status.ProverId + + return p, nil +} + +// Name returns the Prover name. +func (p *Prover) Name() string { return p.name } + +// ID returns the Prover ID. +func (p *Prover) ID() string { return p.id } + +// Addr returns the prover IP address. +func (p *Prover) Addr() string { + if p.address == nil { + return "" + } + + return p.address.String() +} + +// Status gets the prover status. +func (p *Prover) Status() (*GetStatusResponse, error) { + req := &AggregatorMessage{ + Request: &AggregatorMessage_GetStatusRequest{ + GetStatusRequest: &GetStatusRequest{}, + }, + } + res, err := p.call(req) + if err != nil { + return nil, err + } + if msg, ok := res.Response.(*ProverMessage_GetStatusResponse); ok { + return msg.GetStatusResponse, nil + } + + return nil, fmt.Errorf("%w, wanted %T, got %T", ErrBadProverResponse, &ProverMessage_GetStatusResponse{}, res.Response) +} + +// IsIdle returns true if the prover is idling. +func (p *Prover) IsIdle() (bool, error) { + status, err := p.Status() + if err != nil { + return false, err + } + + return status.Status == GetStatusResponse_STATUS_IDLE, nil +} + +// SupportsForkID returns true if the prover supports the given fork id. +func (p *Prover) SupportsForkID(forkID uint64) bool { + status, err := p.Status() + if err != nil { + p.logger.Warnf("Error asking status for prover ID %s: %v", p.ID(), err) + return false + } + + p.logger.Debugf("Prover %s supports fork ID %d", p.ID(), status.ForkId) + + return status.ForkId == forkID +} + +// BatchProof instructs the prover to generate a batch proof for the provided +// input. It returns the ID of the proof being computed. +func (p *Prover) BatchProof(input *StatelessInputProver) (*string, error) { + req := &AggregatorMessage{ + Request: &AggregatorMessage_GenStatelessBatchProofRequest{ + GenStatelessBatchProofRequest: &GenStatelessBatchProofRequest{Input: input}, + }, + } + res, err := p.call(req) + if err != nil { + return nil, err + } + + if msg, ok := res.Response.(*ProverMessage_GenBatchProofResponse); ok { + switch msg.GenBatchProofResponse.Result { + case Result_RESULT_UNSPECIFIED: + return nil, fmt.Errorf( + "failed to generate proof %s, %w, input %v", + msg.GenBatchProofResponse.String(), ErrUnspecified, input, + ) + case Result_RESULT_OK: + return &msg.GenBatchProofResponse.Id, nil + case Result_RESULT_ERROR: + return nil, fmt.Errorf( + "failed to generate proof %s, %w, input %v", + msg.GenBatchProofResponse.String(), ErrBadRequest, input, + ) + case Result_RESULT_INTERNAL_ERROR: + return nil, fmt.Errorf( + "failed to generate proof %s, %w, input %v", + msg.GenBatchProofResponse.String(), ErrProverInternalError, input, + ) + default: + return nil, fmt.Errorf( + "failed to generate proof %s, %w,input %v", + msg.GenBatchProofResponse.String(), ErrUnknown, input, + ) + } + } + + return nil, fmt.Errorf( + "%w, wanted %T, got %T", + ErrBadProverResponse, &ProverMessage_GenBatchProofResponse{}, res.Response, + ) +} + +// AggregatedProof instructs the prover to generate an aggregated proof from +// the two inputs provided. It returns the ID of the proof being computed. +func (p *Prover) AggregatedProof(inputProof1, inputProof2 string) (*string, error) { + req := &AggregatorMessage{ + Request: &AggregatorMessage_GenAggregatedProofRequest{ + GenAggregatedProofRequest: &GenAggregatedProofRequest{ + RecursiveProof_1: inputProof1, + RecursiveProof_2: inputProof2, + }, + }, + } + res, err := p.call(req) + if err != nil { + return nil, err + } + + if msg, ok := res.Response.(*ProverMessage_GenAggregatedProofResponse); ok { + switch msg.GenAggregatedProofResponse.Result { + case Result_RESULT_UNSPECIFIED: + return nil, fmt.Errorf("failed to aggregate proofs %s, %w, input 1 %s, input 2 %s", + msg.GenAggregatedProofResponse.String(), ErrUnspecified, inputProof1, inputProof2) + case Result_RESULT_OK: + return &msg.GenAggregatedProofResponse.Id, nil + case Result_RESULT_ERROR: + return nil, fmt.Errorf("failed to aggregate proofs %s, %w, input 1 %s, input 2 %s", + msg.GenAggregatedProofResponse.String(), ErrBadRequest, inputProof1, inputProof2) + case Result_RESULT_INTERNAL_ERROR: + return nil, fmt.Errorf("failed to aggregate proofs %s, %w, input 1 %s, input 2 %s", + msg.GenAggregatedProofResponse.String(), ErrProverInternalError, inputProof1, inputProof2) + default: + return nil, fmt.Errorf("failed to aggregate proofs %s, %w, input 1 %s, input 2 %s", + msg.GenAggregatedProofResponse.String(), ErrUnknown, inputProof1, inputProof2) + } + } + + return nil, fmt.Errorf( + "%w, wanted %T, got %T", + ErrBadProverResponse, &ProverMessage_GenAggregatedProofResponse{}, res.Response, + ) +} + +// FinalProof instructs the prover to generate a final proof for the given +// input. It returns the ID of the proof being computed. +func (p *Prover) FinalProof(inputProof string, aggregatorAddr string) (*string, error) { + req := &AggregatorMessage{ + Request: &AggregatorMessage_GenFinalProofRequest{ + GenFinalProofRequest: &GenFinalProofRequest{ + RecursiveProof: inputProof, + AggregatorAddr: aggregatorAddr, + }, + }, + } + res, err := p.call(req) + if err != nil { + return nil, err + } + + if msg, ok := res.Response.(*ProverMessage_GenFinalProofResponse); ok { + switch msg.GenFinalProofResponse.Result { + case Result_RESULT_UNSPECIFIED: + return nil, fmt.Errorf("failed to generate final proof %s, %w, input %s", + msg.GenFinalProofResponse.String(), ErrUnspecified, inputProof) + case Result_RESULT_OK: + return &msg.GenFinalProofResponse.Id, nil + case Result_RESULT_ERROR: + return nil, fmt.Errorf("failed to generate final proof %s, %w, input %s", + msg.GenFinalProofResponse.String(), ErrBadRequest, inputProof) + case Result_RESULT_INTERNAL_ERROR: + return nil, fmt.Errorf("failed to generate final proof %s, %w, input %s", + msg.GenFinalProofResponse.String(), ErrProverInternalError, inputProof) + default: + return nil, fmt.Errorf("failed to generate final proof %s, %w, input %s", + msg.GenFinalProofResponse.String(), ErrUnknown, inputProof) + } + } + + return nil, fmt.Errorf( + "%w, wanted %T, got %T", + ErrBadProverResponse, &ProverMessage_GenFinalProofResponse{}, res.Response, + ) +} + +// CancelProofRequest asks the prover to stop the generation of the proof +// matching the provided proofID. +func (p *Prover) CancelProofRequest(proofID string) error { + req := &AggregatorMessage{ + Request: &AggregatorMessage_CancelRequest{ + CancelRequest: &CancelRequest{Id: proofID}, + }, + } + res, err := p.call(req) + if err != nil { + return err + } + if msg, ok := res.Response.(*ProverMessage_CancelResponse); ok { + switch msg.CancelResponse.Result { + case Result_RESULT_UNSPECIFIED: + return fmt.Errorf("failed to cancel proof id [%s], %w, %s", + proofID, ErrUnspecified, msg.CancelResponse.String()) + case Result_RESULT_OK: + return nil + case Result_RESULT_ERROR: + return fmt.Errorf("failed to cancel proof id [%s], %w, %s", + proofID, ErrBadRequest, msg.CancelResponse.String()) + case Result_RESULT_INTERNAL_ERROR: + return fmt.Errorf("failed to cancel proof id [%s], %w, %s", + proofID, ErrProverInternalError, msg.CancelResponse.String()) + default: + return fmt.Errorf("failed to cancel proof id [%s], %w, %s", + proofID, ErrUnknown, msg.CancelResponse.String()) + } + } + + return fmt.Errorf("%w, wanted %T, got %T", ErrBadProverResponse, &ProverMessage_CancelResponse{}, res.Response) +} + +// WaitRecursiveProof waits for a recursive proof to be generated by the prover +// and returns it. +func (p *Prover) WaitRecursiveProof(ctx context.Context, proofID string) (string, common.Hash, common.Hash, error) { + res, err := p.waitProof(ctx, proofID) + if err != nil { + return "", common.Hash{}, common.Hash{}, err + } + + resProof, ok := res.Proof.(*GetProofResponse_RecursiveProof) + if !ok { + return "", common.Hash{}, common.Hash{}, fmt.Errorf( + "%w, wanted %T, got %T", + ErrBadProverResponse, &GetProofResponse_RecursiveProof{}, res.Proof, + ) + } + + sr, err := GetSanityCheckHashFromProof(p.logger, resProof.RecursiveProof, StateRootStartIndex, StateRootFinalIndex) + if err != nil && sr != (common.Hash{}) { + p.logger.Errorf("Error getting state root from proof: %v", err) + } + + accInputHash, err := GetSanityCheckHashFromProof(p.logger, resProof.RecursiveProof, + AccInputHashStartIndex, AccInputHashFinalIndex) + if err != nil && accInputHash != (common.Hash{}) { + p.logger.Errorf("Error getting acc input hash from proof: %v", err) + } + + if sr == (common.Hash{}) { + p.logger.Info("Recursive proof does not contain state root. Possibly mock prover is in use.") + } + + return resProof.RecursiveProof, sr, accInputHash, nil +} + +// WaitFinalProof waits for the final proof to be generated by the prover and +// returns it. +func (p *Prover) WaitFinalProof(ctx context.Context, proofID string) (*FinalProof, error) { + res, err := p.waitProof(ctx, proofID) + if err != nil { + return nil, err + } + resProof, ok := res.Proof.(*GetProofResponse_FinalProof) + if !ok { + return nil, fmt.Errorf("%w, wanted %T, got %T", ErrBadProverResponse, &GetProofResponse_FinalProof{}, res.Proof) + } + + return resProof.FinalProof, nil +} + +// waitProof waits for a proof to be generated by the prover and returns the +// prover response. +func (p *Prover) waitProof(ctx context.Context, proofID string) (*GetProofResponse, error) { + req := &AggregatorMessage{ + Request: &AggregatorMessage_GetProofRequest{ + GetProofRequest: &GetProofRequest{ + // TODO(pg): set Timeout field? + Id: proofID, + }, + }, + } + + for { + select { + case <-ctx.Done(): + return nil, ctx.Err() + default: + res, err := p.call(req) + if err != nil { + return nil, err + } + if msg, ok := res.Response.(*ProverMessage_GetProofResponse); ok { + switch msg.GetProofResponse.Result { + case GetProofResponse_RESULT_PENDING: + time.Sleep(p.proofStatePollingInterval.Duration) + + continue + case GetProofResponse_RESULT_UNSPECIFIED: + return nil, fmt.Errorf("failed to get proof ID: %s, %w, prover response: %s", + proofID, ErrUnspecified, msg.GetProofResponse.String()) + case GetProofResponse_RESULT_COMPLETED_OK: + return msg.GetProofResponse, nil + case GetProofResponse_RESULT_ERROR: + return nil, fmt.Errorf("failed to get proof with ID %s, %w, prover response: %s", + proofID, ErrBadRequest, msg.GetProofResponse.String()) + case GetProofResponse_RESULT_COMPLETED_ERROR: + return nil, fmt.Errorf("failed to get proof with ID %s, %w, prover response: %s", + proofID, ErrProverCompletedError, msg.GetProofResponse.String()) + case GetProofResponse_RESULT_INTERNAL_ERROR: + return nil, fmt.Errorf("failed to get proof ID: %s, %w, prover response: %s", + proofID, ErrProverInternalError, msg.GetProofResponse.String()) + case GetProofResponse_RESULT_CANCEL: + return nil, fmt.Errorf("proof generation was cancelled for proof ID %s, %w, prover response: %s", + proofID, ErrProofCanceled, msg.GetProofResponse.String()) + default: + return nil, fmt.Errorf("failed to get proof ID: %s, %w, prover response: %s", + proofID, ErrUnknown, msg.GetProofResponse.String()) + } + } + + return nil, fmt.Errorf( + "%w, wanted %T, got %T", + ErrBadProverResponse, &ProverMessage_GetProofResponse{}, res.Response, + ) + } + } +} + +// call sends a message to the prover and waits to receive the response over +// the connection stream. +func (p *Prover) call(req *AggregatorMessage) (*ProverMessage, error) { + if err := p.stream.Send(req); err != nil { + return nil, err + } + res, err := p.stream.Recv() + if err != nil { + return nil, err + } + + return res, nil +} + +// GetSanityCheckHashFromProof returns info from the proof +func GetSanityCheckHashFromProof(logger *log.Logger, proof string, startIndex, endIndex int) (common.Hash, error) { + type Publics struct { + Publics []string `mapstructure:"publics"` + } + + // Check if the proof contains the SR + if !strings.Contains(proof, "publics") { + return common.Hash{}, nil + } + + var publics Publics + err := json.Unmarshal([]byte(proof), &publics) + if err != nil { + logger.Errorf("Error unmarshalling proof: %v", err) + return common.Hash{}, err + } + + var ( + v [8]uint64 + j = 0 + ) + for i := startIndex; i < endIndex; i++ { + u64, err := strconv.ParseInt(publics.Publics[i], 10, 64) + if err != nil { + logger.Fatal(err) + } + v[j] = uint64(u64) + j++ + } + bigSR := fea2scalar(v[:]) + hexSR := fmt.Sprintf("%x", bigSR) + if len(hexSR)%2 != 0 { + hexSR = "0" + hexSR + } + + return common.HexToHash(hexSR), nil +} + +// fea2scalar converts array of uint64 values into one *big.Int. +func fea2scalar(v []uint64) *big.Int { + if len(v) != poseidon.NROUNDSF { + return big.NewInt(0) + } + res := new(big.Int).SetUint64(v[0]) + res.Add(res, new(big.Int).Lsh(new(big.Int).SetUint64(v[1]), 32)) //nolint:mnd + res.Add(res, new(big.Int).Lsh(new(big.Int).SetUint64(v[2]), 64)) //nolint:mnd + res.Add(res, new(big.Int).Lsh(new(big.Int).SetUint64(v[3]), 96)) //nolint:mnd + res.Add(res, new(big.Int).Lsh(new(big.Int).SetUint64(v[4]), 128)) //nolint:mnd + res.Add(res, new(big.Int).Lsh(new(big.Int).SetUint64(v[5]), 160)) //nolint:mnd + res.Add(res, new(big.Int).Lsh(new(big.Int).SetUint64(v[6]), 192)) //nolint:mnd + res.Add(res, new(big.Int).Lsh(new(big.Int).SetUint64(v[7]), 224)) //nolint:mnd + + return res +} diff --git a/aggregator/prover/prover_test.go b/aggregator/prover/prover_test.go new file mode 100644 index 00000000..9e97981f --- /dev/null +++ b/aggregator/prover/prover_test.go @@ -0,0 +1,109 @@ +package prover_test + +import ( + "context" + "fmt" + "net" + "os" + "testing" + "time" + + "github.com/agglayer/aggkit/aggregator/prover" + "github.com/agglayer/aggkit/aggregator/prover/mocks" + "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +const ( + dir = "../../test/vectors/proofs" +) + +type TestStateRoot struct { + Publics []string `mapstructure:"publics"` +} + +func TestProver(t *testing.T) { + mockChannel := mocks.ChannelMock{} + var addr net.Addr + + mockChannel.On("Send", mock.Anything).Return(nil) + mockChannel.On("Recv").Return(&prover.ProverMessage{ + Id: "test", + Response: &prover.ProverMessage_GetStatusResponse{ + GetStatusResponse: &prover.GetStatusResponse{ + Status: prover.GetStatusResponse_STATUS_IDLE, + ProverName: "testName", + ProverId: "testId", + }, + }, + }, nil).Times(1) + + p, err := prover.New(log.GetDefaultLogger(), &mockChannel, addr, types.Duration{Duration: time.Second * 5}) + require.NoError(t, err) + name := p.Name() + require.Equal(t, "testName", name, "name does not match") + address := p.Addr() + require.Equal(t, "", address, "address does not match") + id := p.ID() + require.Equal(t, "testId", id, "id does not match") + + mockChannel.On("Recv").Return(&prover.ProverMessage{ + Id: "test", + Response: &prover.ProverMessage_GetProofResponse{ + GetProofResponse: &prover.GetProofResponse{ + Proof: &prover.GetProofResponse_RecursiveProof{ + RecursiveProof: "this is a proof", + }, + Result: prover.GetProofResponse_RESULT_COMPLETED_OK, + }, + }, + }, nil) + + proof, sr, accinputHash, err := p.WaitRecursiveProof(context.Background(), "proofID") + require.NoError(t, err) + + require.NotNil(t, proof, "proof is nil") + require.NotNil(t, sr, "state root is nil") + require.Equal(t, common.Hash{}, accinputHash, "state root is not empty") +} +func TestCalculateStateRoots(t *testing.T) { + var expectedStateRoots = map[string]string{ + "1871.json": "0x0ed594d8bc0bb38f3190ff25fb1e5b4fe1baf0e2e0c1d7bf3307f07a55d3a60f", + "1872.json": "0xb6aac97ebb0eb2d4a3bdd40cfe49b6a22d42fe7deff1a8fae182a9c11cc8a7b1", + "1873.json": "0x6f88be87a2ad2928a655bbd38c6f1b59ca8c0f53fd8e9e9d5806e90783df701f", + "1874.json": "0x6f88be87a2ad2928a655bbd38c6f1b59ca8c0f53fd8e9e9d5806e90783df701f", + "1875.json": "0xf4a439c5642a182d9e27c8ab82c64b44418ba5fa04c175a013bed452c19908c9"} + + // Read all files in the directory + files, err := os.ReadDir(dir) + require.NoError(t, err) + + for _, file := range files { + if file.IsDir() { + continue + } + + // Read the file + data, err := os.ReadFile(fmt.Sprintf("%s/%s", dir, file.Name())) + require.NoError(t, err) + + // Get the state root from the batch proof + fileStateRoot, err := prover.GetSanityCheckHashFromProof(log.GetDefaultLogger(), string(data), prover.StateRootStartIndex, prover.StateRootFinalIndex) + require.NoError(t, err) + + // Get the expected state root + expectedStateRoot, ok := expectedStateRoots[file.Name()] + require.True(t, ok, "Expected state root not found") + + // Check Acc Input Hash + accInputHash, err := prover.GetSanityCheckHashFromProof(log.GetDefaultLogger(), string(data), prover.AccInputHashStartIndex, prover.AccInputHashFinalIndex) + require.NotEqual(t, common.Hash{}, accInputHash, "Acc Input Hash is empty") + require.NoError(t, err) + + // Compare the state roots + require.Equal(t, expectedStateRoot, fileStateRoot.String(), "State roots do not match") + } +} diff --git a/aggsender/aggsender.go b/aggsender/aggsender.go new file mode 100644 index 00000000..e8edc0fb --- /dev/null +++ b/aggsender/aggsender.go @@ -0,0 +1,882 @@ +package aggsender + +import ( + "context" + "crypto/ecdsa" + "encoding/json" + "errors" + "fmt" + "os" + "time" + + jRPC "github.com/0xPolygon/cdk-rpc/rpc" + zkevm "github.com/agglayer/aggkit" + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/aggsender/db" + aggsenderrpc "github.com/agglayer/aggkit/aggsender/rpc" + "github.com/agglayer/aggkit/aggsender/types" + "github.com/agglayer/aggkit/bridgesync" + aggkitcommon "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/tree" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +const signatureSize = 65 + +var ( + errNoBridgesAndClaims = errors.New("no bridges and claims to build certificate") + errInvalidSignatureSize = errors.New("invalid signature size") + + zeroLER = common.HexToHash("0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757") +) + +// AggSender is a component that will send certificates to the aggLayer +type AggSender struct { + log types.Logger + + l2Syncer types.L2BridgeSyncer + l1infoTreeSyncer types.L1InfoTreeSyncer + epochNotifier types.EpochNotifier + + storage db.AggSenderStorage + aggLayerClient agglayer.AgglayerClientInterface + + cfg Config + + sequencerKey *ecdsa.PrivateKey + + status types.AggsenderStatus +} + +// New returns a new AggSender +func New( + ctx context.Context, + logger *log.Logger, + cfg Config, + aggLayerClient agglayer.AgglayerClientInterface, + l1InfoTreeSyncer *l1infotreesync.L1InfoTreeSync, + l2Syncer types.L2BridgeSyncer, + epochNotifier types.EpochNotifier) (*AggSender, error) { + storageConfig := db.AggSenderSQLStorageConfig{ + DBPath: cfg.StoragePath, + KeepCertificatesHistory: cfg.KeepCertificatesHistory, + } + storage, err := db.NewAggSenderSQLStorage(logger, storageConfig) + if err != nil { + return nil, err + } + + sequencerPrivateKey, err := aggkitcommon.NewKeyFromKeystore(cfg.AggsenderPrivateKey) + if err != nil { + return nil, err + } + + logger.Infof("Aggsender Config: %s.", cfg.String()) + + return &AggSender{ + cfg: cfg, + log: logger, + storage: storage, + l2Syncer: l2Syncer, + aggLayerClient: aggLayerClient, + l1infoTreeSyncer: l1InfoTreeSyncer, + sequencerKey: sequencerPrivateKey, + epochNotifier: epochNotifier, + status: types.AggsenderStatus{Status: types.StatusNone}, + }, nil +} + +func (a *AggSender) Info() types.AggsenderInfo { + res := types.AggsenderInfo{ + AggsenderStatus: a.status, + Version: zkevm.GetVersion(), + EpochNotifierDescription: a.epochNotifier.String(), + NetworkID: a.l2Syncer.OriginNetwork(), + } + return res +} + +// GetRPCServices returns the list of services that the RPC provider exposes +func (a *AggSender) GetRPCServices() []jRPC.Service { + if !a.cfg.EnableRPC { + return []jRPC.Service{} + } + + logger := log.WithFields("aggsender-rpc", aggkitcommon.BRIDGE) + return []jRPC.Service{ + { + Name: "aggsender", + Service: aggsenderrpc.NewAggsenderRPC(logger, a.storage, a), + }, + } +} + +// Start starts the AggSender +func (a *AggSender) Start(ctx context.Context) { + a.log.Info("AggSender started") + a.status.Start(time.Now().UTC()) + a.checkInitialStatus(ctx) + a.sendCertificates(ctx) +} + +// checkInitialStatus check local status vs agglayer status +func (a *AggSender) checkInitialStatus(ctx context.Context) { + ticker := time.NewTicker(a.cfg.DelayBeetweenRetries.Duration) + defer ticker.Stop() + a.status.Status = types.StatusCheckingInitialStage + for { + err := a.checkLastCertificateFromAgglayer(ctx) + a.status.SetLastError(err) + if err != nil { + a.log.Errorf("error checking initial status: %w, retrying in %s", err, a.cfg.DelayBeetweenRetries.String()) + } else { + a.log.Info("Initial status checked successfully") + return + } + select { + case <-ctx.Done(): + return + case <-ticker.C: + } + } +} + +// sendCertificates sends certificates to the aggLayer +func (a *AggSender) sendCertificates(ctx context.Context) { + chEpoch := a.epochNotifier.Subscribe("aggsender") + a.status.Status = types.StatusCertificateStage + for { + select { + case epoch := <-chEpoch: + a.log.Infof("Epoch received: %s", epoch.String()) + thereArePendingCerts := a.checkPendingCertificatesStatus(ctx) + if !thereArePendingCerts { + _, err := a.sendCertificate(ctx) + a.status.SetLastError(err) + if err != nil { + a.log.Error(err) + } + } else { + log.Infof("Skipping epoch %s because there are pending certificates", + epoch.String()) + } + case <-ctx.Done(): + a.log.Info("AggSender stopped") + return + } + } +} + +// sendCertificate sends certificate for a network +func (a *AggSender) sendCertificate(ctx context.Context) (*agglayer.SignedCertificate, error) { + a.log.Infof("trying to send a new certificate...") + + shouldSend, err := a.shouldSendCertificate() + if err != nil { + return nil, err + } + + if !shouldSend { + a.log.Infof("waiting for pending certificates to be settled") + return nil, nil + } + + lastL2BlockSynced, err := a.l2Syncer.GetLastProcessedBlock(ctx) + if err != nil { + return nil, fmt.Errorf("error getting last processed block from l2: %w", err) + } + + lastSentCertificateInfo, err := a.storage.GetLastSentCertificate() + if err != nil { + return nil, err + } + + previousToBlock, retryCount := getLastSentBlockAndRetryCount(lastSentCertificateInfo) + + if previousToBlock >= lastL2BlockSynced { + a.log.Infof("no new blocks to send a certificate, last certificate block: %d, last L2 block: %d", + previousToBlock, lastL2BlockSynced) + return nil, nil + } + + fromBlock := previousToBlock + 1 + toBlock := lastL2BlockSynced + + bridges, err := a.l2Syncer.GetBridgesPublished(ctx, fromBlock, toBlock) + if err != nil { + return nil, fmt.Errorf("error getting bridges: %w", err) + } + + if len(bridges) == 0 { + a.log.Infof("no bridges consumed, no need to send a certificate from block: %d to block: %d", fromBlock, toBlock) + return nil, nil + } + + claims, err := a.l2Syncer.GetClaims(ctx, fromBlock, toBlock) + if err != nil { + return nil, fmt.Errorf("error getting claims: %w", err) + } + certificateParams := &types.CertificateBuildParams{ + FromBlock: fromBlock, + ToBlock: toBlock, + Bridges: bridges, + Claims: claims, + CreatedAt: uint32(time.Now().UTC().Unix()), + } + + certificateParams, err = a.limitCertSize(certificateParams) + if err != nil { + return nil, fmt.Errorf("error limitCertSize: %w", err) + } + a.log.Infof("building certificate for %s estimatedSize=%d", + certificateParams.String(), certificateParams.EstimatedSize()) + + certificate, err := a.buildCertificate(ctx, certificateParams, lastSentCertificateInfo) + if err != nil { + return nil, fmt.Errorf("error building certificate: %w", err) + } + + signedCertificate, err := a.signCertificate(certificate) + if err != nil { + return nil, fmt.Errorf("error signing certificate: %w", err) + } + + a.saveCertificateToFile(signedCertificate) + a.log.Infof("certificate ready to be send to AggLayer: %s", signedCertificate.Brief()) + if a.cfg.DryRun { + a.log.Warn("dry run mode enabled, skipping sending certificate") + return signedCertificate, nil + } + certificateHash, err := a.aggLayerClient.SendCertificate(signedCertificate) + if err != nil { + return nil, fmt.Errorf("error sending certificate: %w", err) + } + + a.log.Debugf("certificate send: Height: %d cert: %s", signedCertificate.Height, signedCertificate.Brief()) + + raw, err := json.Marshal(signedCertificate) + if err != nil { + return nil, fmt.Errorf("error marshalling signed certificate. Cert:%s. Err: %w", signedCertificate.Brief(), err) + } + + prevLER := common.BytesToHash(certificate.PrevLocalExitRoot[:]) + certInfo := types.CertificateInfo{ + Height: certificate.Height, + RetryCount: retryCount, + CertificateID: certificateHash, + NewLocalExitRoot: certificate.NewLocalExitRoot, + PreviousLocalExitRoot: &prevLER, + FromBlock: fromBlock, + ToBlock: toBlock, + CreatedAt: certificateParams.CreatedAt, + UpdatedAt: certificateParams.CreatedAt, + SignedCertificate: string(raw), + } + // TODO: Improve this case, if a cert is not save in the storage, we are going to settle a unknown certificate + err = a.saveCertificateToStorage(ctx, certInfo, a.cfg.MaxRetriesStoreCertificate) + if err != nil { + a.log.Errorf("error saving certificate to storage. Cert:%s Err: %w", certInfo.String(), err) + return nil, fmt.Errorf("error saving last sent certificate %s in db: %w", certInfo.String(), err) + } + + a.log.Infof("certificate: %s sent successfully for range of l2 blocks (from block: %d, to block: %d) cert:%s", + certInfo.ID(), fromBlock, toBlock, signedCertificate.Brief()) + + return signedCertificate, nil +} + +// saveCertificateToStorage saves the certificate to the storage +// it retries if it fails. if param retries == 0 it retries indefinitely +func (a *AggSender) saveCertificateToStorage(ctx context.Context, cert types.CertificateInfo, maxRetries int) error { + retries := 1 + err := fmt.Errorf("initial_error") + for err != nil { + if err = a.storage.SaveLastSentCertificate(ctx, cert); err != nil { + // If this happens we can't work as normal, because local DB is outdated, we have to retry + a.log.Errorf("error saving last sent certificate %s in db: %w", cert.String(), err) + if retries == maxRetries { + return fmt.Errorf("error saving last sent certificate %s in db: %w", cert.String(), err) + } else { + retries++ + time.Sleep(a.cfg.DelayBeetweenRetries.Duration) + } + } + } + return nil +} + +func (a *AggSender) limitCertSize(fullCert *types.CertificateBuildParams) (*types.CertificateBuildParams, error) { + currentCert := fullCert + var previousCert *types.CertificateBuildParams + var err error + for { + if currentCert.NumberOfBridges() == 0 { + // We can't reduce more the certificate, so this is the minium size + a.log.Warnf("We reach the minium size of bridge.Certificate size: %d >max size: %d", + previousCert.EstimatedSize(), a.cfg.MaxCertSize) + return previousCert, nil + } + + if a.cfg.MaxCertSize == 0 || currentCert.EstimatedSize() < a.cfg.MaxCertSize { + return currentCert, nil + } + + // Minimum size of the certificate + if currentCert.NumberOfBlocks() <= 1 { + a.log.Warnf("reach the minium num blocks [%d to %d].Certificate size: %d >max size: %d", + currentCert.FromBlock, currentCert.ToBlock, currentCert.EstimatedSize(), a.cfg.MaxCertSize) + return currentCert, nil + } + previousCert = currentCert + currentCert, err = currentCert.Range(currentCert.FromBlock, currentCert.ToBlock-1) + if err != nil { + return nil, fmt.Errorf("error reducing certificate: %w", err) + } + } +} + +// saveCertificate saves the certificate to a tmp file +func (a *AggSender) saveCertificateToFile(signedCertificate *agglayer.SignedCertificate) { + if signedCertificate == nil || a.cfg.SaveCertificatesToFilesPath == "" { + return + } + fn := fmt.Sprintf("%s/certificate_%04d-%07d.json", + a.cfg.SaveCertificatesToFilesPath, signedCertificate.Height, time.Now().Unix()) + a.log.Infof("saving certificate to file: %s", fn) + jsonData, err := json.MarshalIndent(signedCertificate, "", " ") + if err != nil { + a.log.Errorf("error marshalling certificate: %w", err) + } + + if err = os.WriteFile(fn, jsonData, 0644); err != nil { //nolint:gosec,mnd // we are writing to a tmp file + a.log.Errorf("error writing certificate to file: %w", err) + } +} + +// getNextHeightAndPreviousLER returns the height and previous LER for the new certificate +func (a *AggSender) getNextHeightAndPreviousLER( + lastSentCertificateInfo *types.CertificateInfo) (uint64, common.Hash, error) { + if lastSentCertificateInfo == nil { + return 0, zeroLER, nil + } + if !lastSentCertificateInfo.Status.IsClosed() { + return 0, zeroLER, fmt.Errorf("last certificate %s is not closed (status: %s)", + lastSentCertificateInfo.ID(), lastSentCertificateInfo.Status.String()) + } + if lastSentCertificateInfo.Status.IsSettled() { + return lastSentCertificateInfo.Height + 1, lastSentCertificateInfo.NewLocalExitRoot, nil + } + + if lastSentCertificateInfo.Status.IsInError() { + // We can reuse last one of lastCert? + if lastSentCertificateInfo.PreviousLocalExitRoot != nil { + return lastSentCertificateInfo.Height, *lastSentCertificateInfo.PreviousLocalExitRoot, nil + } + // Is the first one, so we can set the zeroLER + if lastSentCertificateInfo.Height == 0 { + return 0, zeroLER, nil + } + // We get previous certificate that must be settled + a.log.Debugf("last certificate %s is in error, getting previous settled certificate height:%d", + lastSentCertificateInfo.Height-1) + lastSettleCert, err := a.storage.GetCertificateByHeight(lastSentCertificateInfo.Height - 1) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("error getting last settled certificate: %w", err) + } + if lastSettleCert == nil { + return 0, common.Hash{}, fmt.Errorf("none settled certificate: %w", err) + } + if !lastSettleCert.Status.IsSettled() { + return 0, common.Hash{}, fmt.Errorf("last settled certificate %s is not settled (status: %s)", + lastSettleCert.ID(), lastSettleCert.Status.String()) + } + + return lastSentCertificateInfo.Height, lastSettleCert.NewLocalExitRoot, nil + } + return 0, zeroLER, fmt.Errorf("last certificate %s has an unknown status: %s", + lastSentCertificateInfo.ID(), lastSentCertificateInfo.Status.String()) +} + +// buildCertificate builds a certificate from the bridge events +func (a *AggSender) buildCertificate(ctx context.Context, + certParams *types.CertificateBuildParams, + lastSentCertificateInfo *types.CertificateInfo) (*agglayer.Certificate, error) { + if certParams.IsEmpty() { + return nil, errNoBridgesAndClaims + } + + bridgeExits := a.getBridgeExits(certParams.Bridges) + importedBridgeExits, err := a.getImportedBridgeExits(ctx, certParams.Claims) + if err != nil { + return nil, fmt.Errorf("error getting imported bridge exits: %w", err) + } + + depositCount := certParams.MaxDepositCount() + + exitRoot, err := a.l2Syncer.GetExitRootByIndex(ctx, depositCount) + if err != nil { + return nil, fmt.Errorf("error getting exit root by index: %d. Error: %w", depositCount, err) + } + + height, previousLER, err := a.getNextHeightAndPreviousLER(lastSentCertificateInfo) + if err != nil { + return nil, fmt.Errorf("error getting next height and previous LER: %w", err) + } + + meta := types.NewCertificateMetadata( + certParams.FromBlock, + uint32(certParams.ToBlock-certParams.FromBlock), + certParams.CreatedAt, + ) + + return &agglayer.Certificate{ + NetworkID: a.l2Syncer.OriginNetwork(), + PrevLocalExitRoot: previousLER, + NewLocalExitRoot: exitRoot.Hash, + BridgeExits: bridgeExits, + ImportedBridgeExits: importedBridgeExits, + Height: height, + Metadata: meta.ToHash(), + }, nil +} + +// createCertificateMetadata creates the metadata for the certificate +// it returns: newMetadata + bool if the metadata is hashed or not +func convertBridgeMetadata(metadata []byte, importedBridgeMetadataAsHash bool) ([]byte, bool) { + var metaData []byte + var isMetadataHashed bool + if importedBridgeMetadataAsHash && len(metadata) > 0 { + metaData = crypto.Keccak256(metadata) + isMetadataHashed = true + } else { + metaData = metadata + isMetadataHashed = false + } + return metaData, isMetadataHashed +} + +// convertClaimToImportedBridgeExit converts a claim to an ImportedBridgeExit object +func (a *AggSender) convertClaimToImportedBridgeExit(claim bridgesync.Claim) (*agglayer.ImportedBridgeExit, error) { + leafType := agglayer.LeafTypeAsset + if claim.IsMessage { + leafType = agglayer.LeafTypeMessage + } + metaData, isMetadataIsHashed := convertBridgeMetadata(claim.Metadata, a.cfg.BridgeMetadataAsHash) + + bridgeExit := &agglayer.BridgeExit{ + LeafType: leafType, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: claim.OriginNetwork, + OriginTokenAddress: claim.OriginAddress, + }, + DestinationNetwork: claim.DestinationNetwork, + DestinationAddress: claim.DestinationAddress, + Amount: claim.Amount, + IsMetadataHashed: isMetadataIsHashed, + Metadata: metaData, + } + + mainnetFlag, rollupIndex, leafIndex, err := bridgesync.DecodeGlobalIndex(claim.GlobalIndex) + if err != nil { + return nil, fmt.Errorf("error decoding global index: %w", err) + } + + return &agglayer.ImportedBridgeExit{ + BridgeExit: bridgeExit, + GlobalIndex: &agglayer.GlobalIndex{ + MainnetFlag: mainnetFlag, + RollupIndex: rollupIndex, + LeafIndex: leafIndex, + }, + }, nil +} + +// getBridgeExits converts bridges to agglayer.BridgeExit objects +func (a *AggSender) getBridgeExits(bridges []bridgesync.Bridge) []*agglayer.BridgeExit { + bridgeExits := make([]*agglayer.BridgeExit, 0, len(bridges)) + + for _, bridge := range bridges { + metaData, isMetadataHashed := convertBridgeMetadata(bridge.Metadata, a.cfg.BridgeMetadataAsHash) + bridgeExits = append(bridgeExits, &agglayer.BridgeExit{ + LeafType: agglayer.LeafType(bridge.LeafType), + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: bridge.OriginNetwork, + OriginTokenAddress: bridge.OriginAddress, + }, + DestinationNetwork: bridge.DestinationNetwork, + DestinationAddress: bridge.DestinationAddress, + Amount: bridge.Amount, + IsMetadataHashed: isMetadataHashed, + Metadata: metaData, + }) + } + + return bridgeExits +} + +// getImportedBridgeExits converts claims to agglayer.ImportedBridgeExit objects and calculates necessary proofs +func (a *AggSender) getImportedBridgeExits( + ctx context.Context, claims []bridgesync.Claim, +) ([]*agglayer.ImportedBridgeExit, error) { + if len(claims) == 0 { + // no claims to convert + return []*agglayer.ImportedBridgeExit{}, nil + } + + var ( + greatestL1InfoTreeIndexUsed uint32 + importedBridgeExits = make([]*agglayer.ImportedBridgeExit, 0, len(claims)) + claimL1Info = make([]*l1infotreesync.L1InfoTreeLeaf, 0, len(claims)) + ) + + for _, claim := range claims { + info, err := a.l1infoTreeSyncer.GetInfoByGlobalExitRoot(claim.GlobalExitRoot) + if err != nil { + return nil, fmt.Errorf("error getting info by global exit root: %w", err) + } + + claimL1Info = append(claimL1Info, info) + + if info.L1InfoTreeIndex > greatestL1InfoTreeIndexUsed { + greatestL1InfoTreeIndexUsed = info.L1InfoTreeIndex + } + } + + rootToProve, err := a.l1infoTreeSyncer.GetL1InfoTreeRootByIndex(ctx, greatestL1InfoTreeIndexUsed) + if err != nil { + return nil, fmt.Errorf("error getting L1 Info tree root by index: %d. Error: %w", greatestL1InfoTreeIndexUsed, err) + } + + for i, claim := range claims { + l1Info := claimL1Info[i] + + a.log.Debugf("claim[%d]: destAddr: %s GER: %s Block: %d Pos: %d GlobalIndex: 0x%x", + i, claim.DestinationAddress.String(), claim.GlobalExitRoot.String(), + claim.BlockNum, claim.BlockPos, claim.GlobalIndex) + ibe, err := a.convertClaimToImportedBridgeExit(claim) + if err != nil { + return nil, fmt.Errorf("error converting claim to imported bridge exit: %w", err) + } + + importedBridgeExits = append(importedBridgeExits, ibe) + + gerToL1Proof, err := a.l1infoTreeSyncer.GetL1InfoTreeMerkleProofFromIndexToRoot( + ctx, l1Info.L1InfoTreeIndex, rootToProve.Hash, + ) + if err != nil { + return nil, fmt.Errorf( + "error getting L1 Info tree merkle proof for leaf index: %d and root: %s. Error: %w", + l1Info.L1InfoTreeIndex, rootToProve.Hash, err, + ) + } + + claim := claims[i] + if ibe.GlobalIndex.MainnetFlag { + ibe.ClaimData = &agglayer.ClaimFromMainnnet{ + L1Leaf: &agglayer.L1InfoTreeLeaf{ + L1InfoTreeIndex: l1Info.L1InfoTreeIndex, + RollupExitRoot: claim.RollupExitRoot, + MainnetExitRoot: claim.MainnetExitRoot, + Inner: &agglayer.L1InfoTreeLeafInner{ + GlobalExitRoot: l1Info.GlobalExitRoot, + Timestamp: l1Info.Timestamp, + BlockHash: l1Info.PreviousBlockHash, + }, + }, + ProofLeafMER: &agglayer.MerkleProof{ + Root: claim.MainnetExitRoot, + Proof: claim.ProofLocalExitRoot, + }, + ProofGERToL1Root: &agglayer.MerkleProof{ + Root: rootToProve.Hash, + Proof: gerToL1Proof, + }, + } + } else { + ibe.ClaimData = &agglayer.ClaimFromRollup{ + L1Leaf: &agglayer.L1InfoTreeLeaf{ + L1InfoTreeIndex: l1Info.L1InfoTreeIndex, + RollupExitRoot: claim.RollupExitRoot, + MainnetExitRoot: claim.MainnetExitRoot, + Inner: &agglayer.L1InfoTreeLeafInner{ + GlobalExitRoot: l1Info.GlobalExitRoot, + Timestamp: l1Info.Timestamp, + BlockHash: l1Info.PreviousBlockHash, + }, + }, + ProofLeafLER: &agglayer.MerkleProof{ + Root: tree.CalculateRoot(ibe.BridgeExit.Hash(), + claim.ProofLocalExitRoot, ibe.GlobalIndex.LeafIndex), + Proof: claim.ProofLocalExitRoot, + }, + ProofLERToRER: &agglayer.MerkleProof{ + Root: claim.RollupExitRoot, + Proof: claim.ProofRollupExitRoot, + }, + ProofGERToL1Root: &agglayer.MerkleProof{ + Root: rootToProve.Hash, + Proof: gerToL1Proof, + }, + } + } + } + + return importedBridgeExits, nil +} + +// signCertificate signs a certificate with the sequencer key +func (a *AggSender) signCertificate(certificate *agglayer.Certificate) (*agglayer.SignedCertificate, error) { + hashToSign := certificate.HashToSign() + + sig, err := crypto.Sign(hashToSign.Bytes(), a.sequencerKey) + if err != nil { + return nil, err + } + + a.log.Infof("Signed certificate. sequencer address: %s. New local exit root: %s Hash signed: %s", + crypto.PubkeyToAddress(a.sequencerKey.PublicKey).String(), + common.BytesToHash(certificate.NewLocalExitRoot[:]).String(), + hashToSign.String(), + ) + + r, s, isOddParity, err := extractSignatureData(sig) + if err != nil { + return nil, err + } + + return &agglayer.SignedCertificate{ + Certificate: certificate, + Signature: &agglayer.Signature{ + R: r, + S: s, + OddParity: isOddParity, + }, + }, nil +} + +// checkPendingCertificatesStatus checks the status of pending certificates +// and updates in the storage if it changed on agglayer +// It returns: +// bool -> if there are pending certificates +func (a *AggSender) checkPendingCertificatesStatus(ctx context.Context) bool { + pendingCertificates, err := a.storage.GetCertificatesByStatus(agglayer.NonSettledStatuses) + if err != nil { + a.log.Errorf("error getting pending certificates: %w", err) + return true + } + + a.log.Debugf("checkPendingCertificatesStatus num of pendingCertificates: %d", len(pendingCertificates)) + thereArePendingCerts := false + + for _, certificate := range pendingCertificates { + certificateHeader, err := a.aggLayerClient.GetCertificateHeader(certificate.CertificateID) + if err != nil { + a.log.Errorf("error getting certificate header of %s from agglayer: %w", + certificate.ID(), err) + return true + } + + a.log.Debugf("aggLayerClient.GetCertificateHeader status [%s] of certificate %s elapsed time:%s", + certificateHeader.Status, + certificateHeader.ID(), + certificate.ElapsedTimeSinceCreation()) + + if err := a.updateCertificateStatus(ctx, certificate, certificateHeader); err != nil { + a.log.Errorf("error updating certificate %s status in storage: %w", certificateHeader.String(), err) + return true + } + + if !certificate.IsClosed() { + a.log.Infof("certificate %s is still pending, elapsed time:%s ", + certificateHeader.ID(), certificate.ElapsedTimeSinceCreation()) + thereArePendingCerts = true + } + } + return thereArePendingCerts +} + +// updateCertificate updates the certificate status in the storage +func (a *AggSender) updateCertificateStatus(ctx context.Context, + localCert *types.CertificateInfo, + agglayerCert *agglayer.CertificateHeader) error { + if localCert.Status == agglayerCert.Status { + return nil + } + a.log.Infof("certificate %s changed status from [%s] to [%s] elapsed time: %s full_cert (agglayer): %s", + localCert.ID(), localCert.Status, agglayerCert.Status, localCert.ElapsedTimeSinceCreation(), + agglayerCert.String()) + + // That is a strange situation + if agglayerCert.Status.IsOpen() && localCert.Status.IsClosed() { + a.log.Warnf("certificate %s is reopened! from [%s] to [%s]", + localCert.ID(), localCert.Status, agglayerCert.Status) + } + + localCert.Status = agglayerCert.Status + localCert.UpdatedAt = uint32(time.Now().UTC().Unix()) + if err := a.storage.UpdateCertificate(ctx, *localCert); err != nil { + a.log.Errorf("error updating certificate %s status in storage: %w", agglayerCert.ID(), err) + return fmt.Errorf("error updating certificate. Err: %w", err) + } + return nil +} + +// shouldSendCertificate checks if a certificate should be sent at given time +// if we have pending certificates, then we wait until they are settled +func (a *AggSender) shouldSendCertificate() (bool, error) { + pendingCertificates, err := a.storage.GetCertificatesByStatus(agglayer.NonSettledStatuses) + if err != nil { + return false, fmt.Errorf("error getting pending certificates: %w", err) + } + + return len(pendingCertificates) == 0, nil +} + +// checkLastCertificateFromAgglayer checks the last certificate from agglayer +func (a *AggSender) checkLastCertificateFromAgglayer(ctx context.Context) error { + networkID := a.l2Syncer.OriginNetwork() + a.log.Infof("recovery: checking last certificate from AggLayer for network %d", networkID) + aggLayerLastCert, err := a.aggLayerClient.GetLatestKnownCertificateHeader(networkID) + if err != nil { + return fmt.Errorf("recovery: error getting latest known certificate header from agglayer: %w", err) + } + a.log.Infof("recovery: last certificate from AggLayer: %s", aggLayerLastCert.String()) + localLastCert, err := a.storage.GetLastSentCertificate() + if err != nil { + return fmt.Errorf("recovery: error getting last sent certificate from local storage: %w", err) + } + a.log.Infof("recovery: last certificate in storage: %s", localLastCert.String()) + + // CASE 1: No certificates in local storage and agglayer + if localLastCert == nil && aggLayerLastCert == nil { + a.log.Info("recovery: No certificates in local storage and agglayer: initial state") + return nil + } + // CASE 2: No certificates in local storage but agglayer has one + if localLastCert == nil && aggLayerLastCert != nil { + a.log.Info("recovery: No certificates in local storage but agglayer have one: recovery aggSender cert: %s", + aggLayerLastCert.String()) + if _, err := a.updateLocalStorageWithAggLayerCert(ctx, aggLayerLastCert); err != nil { + return fmt.Errorf("recovery: error updating local storage with agglayer certificate: %w", err) + } + return nil + } + // CASE 2.1: certificate in storage but not in agglayer + // this is a non-sense, so throw an error + if localLastCert != nil && aggLayerLastCert == nil { + return fmt.Errorf("recovery: certificate exists in storage but not in agglayer. Inconsistency") + } + // CASE 3.1: the certificate on the agglayer has less height than the one stored in the local storage + if aggLayerLastCert.Height < localLastCert.Height { + return fmt.Errorf("recovery: the last certificate in the agglayer has less height (%d) "+ + "than the one in the local storage (%d)", aggLayerLastCert.Height, localLastCert.Height) + } + // CASE 3.2: aggsender stopped between sending to agglayer and storing to the local storage + if aggLayerLastCert.Height == localLastCert.Height+1 { + a.log.Infof("recovery: AggLayer has the next cert (height: %d), so is a recovery case: storing cert: %s", + aggLayerLastCert.Height, aggLayerLastCert.String()) + // we need to store the certificate in the local storage. + localLastCert, err = a.updateLocalStorageWithAggLayerCert(ctx, aggLayerLastCert) + if err != nil { + log.Errorf("recovery: error updating certificate: %s, reason: %w", aggLayerLastCert.String(), err) + return fmt.Errorf("recovery: error updating certificate: %w", err) + } + } + // CASE 4: AggSender and AggLayer are not on the same page + // note: we don't need to check individual fields of the certificate + // because CertificateID is a hash of all the fields + if localLastCert.CertificateID != aggLayerLastCert.CertificateID { + a.log.Errorf("recovery: Local certificate:\n %s \n is different from agglayer certificate:\n %s", + localLastCert.String(), aggLayerLastCert.String()) + return fmt.Errorf("recovery: mismatch between local and agglayer certificates") + } + // CASE 5: AggSender and AggLayer are at same page + // just update status + err = a.updateCertificateStatus(ctx, localLastCert, aggLayerLastCert) + if err != nil { + a.log.Errorf("recovery: error updating status certificate: %s status: %w", aggLayerLastCert.String(), err) + return fmt.Errorf("recovery: error updating certificate status: %w", err) + } + + a.log.Infof("recovery: successfully checked last certificate from AggLayer for network %d", networkID) + return nil +} + +// updateLocalStorageWithAggLayerCert updates the local storage with the certificate from the AggLayer +func (a *AggSender) updateLocalStorageWithAggLayerCert(ctx context.Context, + aggLayerCert *agglayer.CertificateHeader) (*types.CertificateInfo, error) { + certInfo := NewCertificateInfoFromAgglayerCertHeader(aggLayerCert) + a.log.Infof("setting initial certificate from AggLayer: %s", certInfo.String()) + return certInfo, a.storage.SaveLastSentCertificate(ctx, *certInfo) +} + +// extractSignatureData extracts the R, S, and V from a 65-byte signature +func extractSignatureData(signature []byte) (r, s common.Hash, isOddParity bool, err error) { + if len(signature) != signatureSize { + err = errInvalidSignatureSize + return + } + + r = common.BytesToHash(signature[:32]) // First 32 bytes are R + s = common.BytesToHash(signature[32:64]) // Next 32 bytes are S + isOddParity = signature[64]%2 == 1 //nolint:mnd // Last byte is V + + return +} + +func NewCertificateInfoFromAgglayerCertHeader(c *agglayer.CertificateHeader) *types.CertificateInfo { + if c == nil { + return nil + } + now := uint32(time.Now().UTC().Unix()) + meta := types.NewCertificateMetadataFromHash(c.Metadata) + toBlock := meta.FromBlock + uint64(meta.Offset) + createdAt := meta.CreatedAt + + if meta.Version < 1 { + toBlock = meta.ToBlock + createdAt = now + } + + res := &types.CertificateInfo{ + Height: c.Height, + CertificateID: c.CertificateID, + NewLocalExitRoot: c.NewLocalExitRoot, + FromBlock: meta.FromBlock, + ToBlock: toBlock, + Status: c.Status, + CreatedAt: createdAt, + UpdatedAt: now, + SignedCertificate: "na/agglayer header", + } + if c.PreviousLocalExitRoot != nil { + res.PreviousLocalExitRoot = c.PreviousLocalExitRoot + } + return res +} + +// getLastSentBlockAndRetryCount returns the last sent block of the last sent certificate +// if there is no previosly sent certificate, it returns 0 and 0 +func getLastSentBlockAndRetryCount(lastSentCertificateInfo *types.CertificateInfo) (uint64, int) { + if lastSentCertificateInfo == nil { + return 0, 0 + } + + retryCount := 0 + lastSentBlock := lastSentCertificateInfo.ToBlock + + if lastSentCertificateInfo.Status == agglayer.InError { + // if the last certificate was in error, we need to resend it + // from the block before the error + if lastSentCertificateInfo.FromBlock > 0 { + lastSentBlock = lastSentCertificateInfo.FromBlock - 1 + } + + retryCount = lastSentCertificateInfo.RetryCount + 1 + } + + return lastSentBlock, retryCount +} diff --git a/aggsender/aggsender_test.go b/aggsender/aggsender_test.go new file mode 100644 index 00000000..5880972d --- /dev/null +++ b/aggsender/aggsender_test.go @@ -0,0 +1,2151 @@ +package aggsender + +import ( + "context" + "crypto/ecdsa" + "encoding/json" + "errors" + "fmt" + "math/big" + "os" + "path" + "testing" + "time" + + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/aggsender/db" + "github.com/agglayer/aggkit/aggsender/mocks" + aggsendertypes "github.com/agglayer/aggkit/aggsender/types" + "github.com/agglayer/aggkit/bridgesync" + "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + treeTypes "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +const ( + networkIDTest = uint32(1234) +) + +var ( + errTest = errors.New("unitest error") + ler1 = common.HexToHash("0x123") +) + +func TestConfigString(t *testing.T) { + config := Config{ + StoragePath: "/path/to/storage", + AggLayerURL: "http://agglayer.url", + AggsenderPrivateKey: types.KeystoreFileConfig{Path: "/path/to/key", Password: "password"}, + URLRPCL2: "http://l2.rpc.url", + BlockFinality: "latestBlock", + EpochNotificationPercentage: 50, + SaveCertificatesToFilesPath: "/path/to/certificates", + } + + expected := "StoragePath: /path/to/storage\n" + + "AggLayerURL: http://agglayer.url\n" + + "AggsenderPrivateKeyPath: /path/to/key\n" + + "URLRPCL2: http://l2.rpc.url\n" + + "BlockFinality: latestBlock\n" + + "EpochNotificationPercentage: 50\n" + + "SaveCertificatesToFilesPath: /path/to/certificates\n" + + require.Equal(t, expected, config.String()) +} + +func TestConvertClaimToImportedBridgeExit(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + claim bridgesync.Claim + expectedError bool + expectedExit *agglayer.ImportedBridgeExit + }{ + { + name: "Asset claim", + claim: bridgesync.Claim{ + IsMessage: false, + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x123"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + GlobalIndex: big.NewInt(1), + }, + expectedError: false, + expectedExit: &agglayer.ImportedBridgeExit{ + BridgeExit: &agglayer.BridgeExit{ + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x123"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + GlobalIndex: &agglayer.GlobalIndex{ + MainnetFlag: false, + RollupIndex: 0, + LeafIndex: 1, + }, + }, + }, + { + name: "Message claim", + claim: bridgesync.Claim{ + IsMessage: true, + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x123"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + GlobalIndex: big.NewInt(2), + }, + expectedError: false, + expectedExit: &agglayer.ImportedBridgeExit{ + BridgeExit: &agglayer.BridgeExit{ + LeafType: agglayer.LeafTypeMessage, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x123"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + GlobalIndex: &agglayer.GlobalIndex{ + MainnetFlag: false, + RollupIndex: 0, + LeafIndex: 2, + }, + }, + }, + { + name: "Invalid global index", + claim: bridgesync.Claim{ + IsMessage: false, + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x123"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + GlobalIndex: new(big.Int).SetBytes([]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}), + }, + expectedError: true, + expectedExit: nil, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + aggSender := &AggSender{} + exit, err := aggSender.convertClaimToImportedBridgeExit(tt.claim) + + if tt.expectedError { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedExit, exit) + } + }) + } +} + +func TestGetBridgeExits(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + bridges []bridgesync.Bridge + expectedExits []*agglayer.BridgeExit + }{ + { + name: "Single bridge", + bridges: []bridgesync.Bridge{ + { + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x123"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + }, + expectedExits: []*agglayer.BridgeExit{ + { + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x123"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + }, + }, + { + name: "Multiple bridges", + bridges: []bridgesync.Bridge{ + { + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x123"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + { + LeafType: agglayer.LeafTypeMessage.Uint8(), + OriginNetwork: 3, + OriginAddress: common.HexToAddress("0x789"), + DestinationNetwork: 4, + DestinationAddress: common.HexToAddress("0xabc"), + Amount: big.NewInt(200), + Metadata: []byte("data"), + }, + }, + expectedExits: []*agglayer.BridgeExit{ + { + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x123"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + { + LeafType: agglayer.LeafTypeMessage, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 3, + OriginTokenAddress: common.HexToAddress("0x789"), + }, + DestinationNetwork: 4, + DestinationAddress: common.HexToAddress("0xabc"), + Amount: big.NewInt(200), + Metadata: []byte("data"), + }, + }, + }, + { + name: "No bridges", + bridges: []bridgesync.Bridge{}, + expectedExits: []*agglayer.BridgeExit{}, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + aggSender := &AggSender{} + exits := aggSender.getBridgeExits(tt.bridges) + + require.Equal(t, tt.expectedExits, exits) + }) + } +} + +func TestAggSenderStart(t *testing.T) { + aggLayerMock := agglayer.NewAgglayerClientMock(t) + epochNotifierMock := mocks.NewEpochNotifier(t) + bridgeL2SyncerMock := mocks.NewL2BridgeSyncer(t) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + aggSender, err := New( + ctx, + log.WithFields("test", "unittest"), + Config{ + StoragePath: path.Join(t.TempDir(), "aggsenderTestAggSenderStart.sqlite"), + DelayBeetweenRetries: types.Duration{Duration: 1 * time.Microsecond}, + }, + aggLayerMock, + nil, + bridgeL2SyncerMock, + epochNotifierMock) + require.NoError(t, err) + require.NotNil(t, aggSender) + ch := make(chan aggsendertypes.EpochEvent) + epochNotifierMock.EXPECT().Subscribe("aggsender").Return(ch) + bridgeL2SyncerMock.EXPECT().OriginNetwork().Return(uint32(1)) + bridgeL2SyncerMock.EXPECT().GetLastProcessedBlock(mock.Anything).Return(uint64(0), nil) + aggLayerMock.EXPECT().GetLatestKnownCertificateHeader(mock.Anything).Return(nil, nil) + + go aggSender.Start(ctx) + ch <- aggsendertypes.EpochEvent{ + Epoch: 1, + } + time.Sleep(200 * time.Millisecond) +} + +func TestAggSenderSendCertificates(t *testing.T) { + AggLayerMock := agglayer.NewAgglayerClientMock(t) + epochNotifierMock := mocks.NewEpochNotifier(t) + bridgeL2SyncerMock := mocks.NewL2BridgeSyncer(t) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + aggSender, err := New( + ctx, + log.WithFields("test", "unittest"), + Config{ + StoragePath: path.Join(t.TempDir(), "aggsenderTestAggSenderSendCertificates.sqlite"), + }, + AggLayerMock, + nil, + bridgeL2SyncerMock, + epochNotifierMock) + require.NoError(t, err) + require.NotNil(t, aggSender) + ch := make(chan aggsendertypes.EpochEvent, 2) + epochNotifierMock.EXPECT().Subscribe("aggsender").Return(ch) + err = aggSender.storage.SaveLastSentCertificate(ctx, aggsendertypes.CertificateInfo{ + Height: 1, + Status: agglayer.Pending, + }) + AggLayerMock.EXPECT().GetCertificateHeader(mock.Anything).Return(&agglayer.CertificateHeader{ + Status: agglayer.Pending, + }, nil) + require.NoError(t, err) + ch <- aggsendertypes.EpochEvent{ + Epoch: 1, + } + go aggSender.sendCertificates(ctx) + time.Sleep(200 * time.Millisecond) +} + +//nolint:dupl +func TestGetImportedBridgeExits(t *testing.T) { + t.Parallel() + + mockProof := generateTestProof(t) + + mockL1InfoTreeSyncer := mocks.NewL1InfoTreeSyncer(t) + mockL1InfoTreeSyncer.On("GetInfoByGlobalExitRoot", mock.Anything).Return(&l1infotreesync.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + Timestamp: 123456789, + PreviousBlockHash: common.HexToHash("0xabc"), + GlobalExitRoot: common.HexToHash("0x7891"), + }, nil) + mockL1InfoTreeSyncer.On("GetL1InfoTreeRootByIndex", mock.Anything, mock.Anything).Return( + treeTypes.Root{Hash: common.HexToHash("0x7891")}, nil) + mockL1InfoTreeSyncer.On("GetL1InfoTreeMerkleProofFromIndexToRoot", mock.Anything, + mock.Anything, mock.Anything).Return(mockProof, nil) + + tests := []struct { + name string + claims []bridgesync.Claim + expectedError bool + expectedExits []*agglayer.ImportedBridgeExit + }{ + { + name: "Single claim", + claims: []bridgesync.Claim{ + { + IsMessage: false, + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x1234"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x4567"), + Amount: big.NewInt(111), + Metadata: []byte("metadata1"), + GlobalIndex: bridgesync.GenerateGlobalIndex(false, 1, 1), + GlobalExitRoot: common.HexToHash("0x7891"), + RollupExitRoot: common.HexToHash("0xaaab"), + MainnetExitRoot: common.HexToHash("0xbbba"), + ProofLocalExitRoot: mockProof, + ProofRollupExitRoot: mockProof, + }, + }, + expectedError: false, + expectedExits: []*agglayer.ImportedBridgeExit{ + { + BridgeExit: &agglayer.BridgeExit{ + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x1234"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x4567"), + Amount: big.NewInt(111), + Metadata: []byte("metadata1"), + }, + GlobalIndex: &agglayer.GlobalIndex{ + MainnetFlag: false, + RollupIndex: 1, + LeafIndex: 1, + }, + ClaimData: &agglayer.ClaimFromRollup{ + L1Leaf: &agglayer.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + RollupExitRoot: common.HexToHash("0xaaab"), + MainnetExitRoot: common.HexToHash("0xbbba"), + Inner: &agglayer.L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x7891"), + Timestamp: 123456789, + BlockHash: common.HexToHash("0xabc"), + }, + }, + ProofLeafLER: &agglayer.MerkleProof{ + Root: common.HexToHash("0xc52019815b51acf67a715cae6794a20083d63fd9af45783b7adf69123dae92c8"), + Proof: mockProof, + }, + ProofLERToRER: &agglayer.MerkleProof{ + Root: common.HexToHash("0xaaab"), + Proof: mockProof, + }, + ProofGERToL1Root: &agglayer.MerkleProof{ + Root: common.HexToHash("0x7891"), + Proof: mockProof, + }, + }, + }, + }, + }, + { + name: "Multiple claims", + claims: []bridgesync.Claim{ + { + IsMessage: false, + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x123"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + GlobalIndex: big.NewInt(1), + GlobalExitRoot: common.HexToHash("0x7891"), + RollupExitRoot: common.HexToHash("0xaaa"), + MainnetExitRoot: common.HexToHash("0xbbb"), + ProofLocalExitRoot: mockProof, + ProofRollupExitRoot: mockProof, + }, + { + IsMessage: true, + OriginNetwork: 3, + OriginAddress: common.HexToAddress("0x789"), + DestinationNetwork: 4, + DestinationAddress: common.HexToAddress("0xabc"), + Amount: big.NewInt(200), + Metadata: []byte("data"), + GlobalIndex: bridgesync.GenerateGlobalIndex(true, 0, 2), + GlobalExitRoot: common.HexToHash("0x7891"), + RollupExitRoot: common.HexToHash("0xbbb"), + MainnetExitRoot: common.HexToHash("0xccc"), + ProofLocalExitRoot: mockProof, + ProofRollupExitRoot: mockProof, + }, + }, + expectedError: false, + expectedExits: []*agglayer.ImportedBridgeExit{ + { + BridgeExit: &agglayer.BridgeExit{ + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x123"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + GlobalIndex: &agglayer.GlobalIndex{ + MainnetFlag: false, + RollupIndex: 0, + LeafIndex: 1, + }, + ClaimData: &agglayer.ClaimFromRollup{ + L1Leaf: &agglayer.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + RollupExitRoot: common.HexToHash("0xaaa"), + MainnetExitRoot: common.HexToHash("0xbbb"), + Inner: &agglayer.L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x7891"), + Timestamp: 123456789, + BlockHash: common.HexToHash("0xabc"), + }, + }, + ProofLeafLER: &agglayer.MerkleProof{ + Root: common.HexToHash("0x105e0f1144e57f6fb63f1dfc5083b1f59be3512be7cf5e63523779ad14a4d987"), + Proof: mockProof, + }, + ProofLERToRER: &agglayer.MerkleProof{ + Root: common.HexToHash("0xaaa"), + Proof: mockProof, + }, + ProofGERToL1Root: &agglayer.MerkleProof{ + Root: common.HexToHash("0x7891"), + Proof: mockProof, + }, + }, + }, + { + BridgeExit: &agglayer.BridgeExit{ + LeafType: agglayer.LeafTypeMessage, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 3, + OriginTokenAddress: common.HexToAddress("0x789"), + }, + DestinationNetwork: 4, + DestinationAddress: common.HexToAddress("0xabc"), + Amount: big.NewInt(200), + Metadata: []byte("data"), + }, + GlobalIndex: &agglayer.GlobalIndex{ + MainnetFlag: true, + RollupIndex: 0, + LeafIndex: 2, + }, + ClaimData: &agglayer.ClaimFromMainnnet{ + L1Leaf: &agglayer.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + RollupExitRoot: common.HexToHash("0xbbb"), + MainnetExitRoot: common.HexToHash("0xccc"), + Inner: &agglayer.L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x7891"), + Timestamp: 123456789, + BlockHash: common.HexToHash("0xabc"), + }, + }, + ProofLeafMER: &agglayer.MerkleProof{ + Root: common.HexToHash("0xccc"), + Proof: mockProof, + }, + ProofGERToL1Root: &agglayer.MerkleProof{ + Root: common.HexToHash("0x7891"), + Proof: mockProof, + }, + }, + }, + }, + }, + { + name: "No claims", + claims: []bridgesync.Claim{}, + expectedError: false, + expectedExits: []*agglayer.ImportedBridgeExit{}, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + aggSender := &AggSender{ + l1infoTreeSyncer: mockL1InfoTreeSyncer, + log: log.WithFields("test", "unittest"), + } + exits, err := aggSender.getImportedBridgeExits(context.Background(), tt.claims) + + if tt.expectedError { + require.Error(t, err) + require.Nil(t, exits) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedExits, exits) + } + }) + } +} + +func TestBuildCertificate(t *testing.T) { + mockL2BridgeSyncer := mocks.NewL2BridgeSyncer(t) + mockL1InfoTreeSyncer := mocks.NewL1InfoTreeSyncer(t) + mockProof := generateTestProof(t) + + tests := []struct { + name string + bridges []bridgesync.Bridge + claims []bridgesync.Claim + lastSentCertificateInfo aggsendertypes.CertificateInfo + fromBlock uint64 + toBlock uint64 + mockFn func() + expectedCert *agglayer.Certificate + expectedError bool + }{ + { + name: "Valid certificate with bridges and claims", + bridges: []bridgesync.Bridge{ + { + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x123"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + DepositCount: 1, + }, + }, + claims: []bridgesync.Claim{ + { + IsMessage: false, + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x1234"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x4567"), + Amount: big.NewInt(111), + Metadata: []byte("metadata1"), + GlobalIndex: big.NewInt(1), + GlobalExitRoot: common.HexToHash("0x7891"), + RollupExitRoot: common.HexToHash("0xaaab"), + MainnetExitRoot: common.HexToHash("0xbbba"), + ProofLocalExitRoot: mockProof, + ProofRollupExitRoot: mockProof, + }, + }, + lastSentCertificateInfo: aggsendertypes.CertificateInfo{ + NewLocalExitRoot: common.HexToHash("0x123"), + Height: 1, + Status: agglayer.Settled, + }, + fromBlock: 0, + toBlock: 10, + expectedCert: &agglayer.Certificate{ + NetworkID: 1, + PrevLocalExitRoot: common.HexToHash("0x123"), + NewLocalExitRoot: common.HexToHash("0x789"), + Metadata: aggsendertypes.NewCertificateMetadata(0, 10, 0).ToHash(), + BridgeExits: []*agglayer.BridgeExit{ + { + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x123"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + }, + ImportedBridgeExits: []*agglayer.ImportedBridgeExit{ + { + BridgeExit: &agglayer.BridgeExit{ + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x1234"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x4567"), + Amount: big.NewInt(111), + Metadata: []byte("metadata1"), + }, + GlobalIndex: &agglayer.GlobalIndex{ + MainnetFlag: false, + RollupIndex: 0, + LeafIndex: 1, + }, + ClaimData: &agglayer.ClaimFromRollup{ + L1Leaf: &agglayer.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + RollupExitRoot: common.HexToHash("0xaaab"), + MainnetExitRoot: common.HexToHash("0xbbba"), + Inner: &agglayer.L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x7891"), + Timestamp: 123456789, + BlockHash: common.HexToHash("0xabc"), + }, + }, + ProofLeafLER: &agglayer.MerkleProof{ + Root: common.HexToHash("0xc52019815b51acf67a715cae6794a20083d63fd9af45783b7adf69123dae92c8"), + Proof: mockProof, + }, + ProofLERToRER: &agglayer.MerkleProof{ + Root: common.HexToHash("0xaaab"), + Proof: mockProof, + }, + ProofGERToL1Root: &agglayer.MerkleProof{ + Root: common.HexToHash("0x7891"), + Proof: mockProof, + }, + }, + }, + }, + Height: 2, + }, + mockFn: func() { + mockL2BridgeSyncer.On("OriginNetwork").Return(uint32(1)) + mockL2BridgeSyncer.On("GetExitRootByIndex", mock.Anything, mock.Anything).Return(treeTypes.Root{Hash: common.HexToHash("0x789")}, nil) + + mockL1InfoTreeSyncer.On("GetInfoByGlobalExitRoot", mock.Anything).Return(&l1infotreesync.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + Timestamp: 123456789, + PreviousBlockHash: common.HexToHash("0xabc"), + GlobalExitRoot: common.HexToHash("0x7891"), + }, nil) + mockL1InfoTreeSyncer.On("GetL1InfoTreeRootByIndex", mock.Anything, mock.Anything).Return(treeTypes.Root{Hash: common.HexToHash("0x7891")}, nil) + mockL1InfoTreeSyncer.On("GetL1InfoTreeMerkleProofFromIndexToRoot", mock.Anything, mock.Anything, mock.Anything).Return(mockProof, nil) + }, + expectedError: false, + }, + { + name: "No bridges or claims", + bridges: []bridgesync.Bridge{}, + claims: []bridgesync.Claim{}, + lastSentCertificateInfo: aggsendertypes.CertificateInfo{ + NewLocalExitRoot: common.HexToHash("0x123"), + Height: 1, + }, + expectedCert: nil, + expectedError: true, + }, + { + name: "Error getting imported bridge exits", + bridges: []bridgesync.Bridge{ + { + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x123"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x456"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + DepositCount: 1, + }, + }, + claims: []bridgesync.Claim{ + { + IsMessage: false, + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x1234"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x4567"), + Amount: big.NewInt(111), + Metadata: []byte("metadata1"), + GlobalIndex: new(big.Int).SetBytes([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}), + GlobalExitRoot: common.HexToHash("0x7891"), + RollupExitRoot: common.HexToHash("0xaaab"), + MainnetExitRoot: common.HexToHash("0xbbba"), + ProofLocalExitRoot: mockProof, + }, + }, + lastSentCertificateInfo: aggsendertypes.CertificateInfo{ + NewLocalExitRoot: common.HexToHash("0x123"), + Height: 1, + }, + mockFn: func() { + mockL1InfoTreeSyncer.On("GetInfoByGlobalExitRoot", mock.Anything).Return(&l1infotreesync.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + Timestamp: 123456789, + PreviousBlockHash: common.HexToHash("0xabc"), + GlobalExitRoot: common.HexToHash("0x7891"), + }, nil) + mockL1InfoTreeSyncer.On("GetL1InfoTreeRootByIndex", mock.Anything, mock.Anything).Return( + treeTypes.Root{Hash: common.HexToHash("0x7891")}, nil) + }, + expectedCert: nil, + expectedError: true, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + mockL1InfoTreeSyncer.ExpectedCalls = nil + mockL2BridgeSyncer.ExpectedCalls = nil + + if tt.mockFn != nil { + tt.mockFn() + } + + aggSender := &AggSender{ + l2Syncer: mockL2BridgeSyncer, + l1infoTreeSyncer: mockL1InfoTreeSyncer, + log: log.WithFields("test", "unittest"), + } + + certParam := &aggsendertypes.CertificateBuildParams{ + ToBlock: tt.toBlock, + Bridges: tt.bridges, + Claims: tt.claims, + } + cert, err := aggSender.buildCertificate(context.Background(), certParam, &tt.lastSentCertificateInfo) + + if tt.expectedError { + require.Error(t, err) + require.Nil(t, cert) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedCert, cert) + } + }) + } +} + +func generateTestProof(t *testing.T) treeTypes.Proof { + t.Helper() + + proof := treeTypes.Proof{} + + for i := 0; i < int(treeTypes.DefaultHeight) && i < 10; i++ { + proof[i] = common.HexToHash(fmt.Sprintf("0x%d", i)) + } + + return proof +} + +func TestCheckIfCertificatesAreSettled(t *testing.T) { + tests := []struct { + name string + pendingCertificates []*aggsendertypes.CertificateInfo + certificateHeaders map[common.Hash]*agglayer.CertificateHeader + getFromDBError error + clientError error + updateDBError error + expectedErrorLogMessages []string + expectedInfoMessages []string + expectedError bool + }{ + { + name: "All certificates settled - update successful", + pendingCertificates: []*aggsendertypes.CertificateInfo{ + {CertificateID: common.HexToHash("0x1"), Height: 1}, + {CertificateID: common.HexToHash("0x2"), Height: 2}, + }, + certificateHeaders: map[common.Hash]*agglayer.CertificateHeader{ + common.HexToHash("0x1"): {Status: agglayer.Settled}, + common.HexToHash("0x2"): {Status: agglayer.Settled}, + }, + expectedInfoMessages: []string{ + "certificate %s changed status to %s", + }, + }, + { + name: "Some certificates in error - update successful", + pendingCertificates: []*aggsendertypes.CertificateInfo{ + {CertificateID: common.HexToHash("0x1"), Height: 1}, + {CertificateID: common.HexToHash("0x2"), Height: 2}, + }, + certificateHeaders: map[common.Hash]*agglayer.CertificateHeader{ + common.HexToHash("0x1"): {Status: agglayer.InError}, + common.HexToHash("0x2"): {Status: agglayer.Settled}, + }, + expectedInfoMessages: []string{ + "certificate %s changed status to %s", + }, + }, + { + name: "Error getting pending certificates", + getFromDBError: fmt.Errorf("storage error"), + expectedErrorLogMessages: []string{ + "error getting pending certificates: %w", + }, + expectedError: true, + }, + { + name: "Error getting certificate header", + pendingCertificates: []*aggsendertypes.CertificateInfo{ + {CertificateID: common.HexToHash("0x1"), Height: 1}, + }, + certificateHeaders: map[common.Hash]*agglayer.CertificateHeader{ + common.HexToHash("0x1"): {Status: agglayer.InError}, + }, + clientError: fmt.Errorf("client error"), + expectedErrorLogMessages: []string{ + "error getting header of certificate %s with height: %d from agglayer: %w", + }, + expectedError: true, + }, + { + name: "Error updating certificate status", + pendingCertificates: []*aggsendertypes.CertificateInfo{ + {CertificateID: common.HexToHash("0x1"), Height: 1}, + }, + certificateHeaders: map[common.Hash]*agglayer.CertificateHeader{ + common.HexToHash("0x1"): {Status: agglayer.Settled}, + }, + updateDBError: fmt.Errorf("update error"), + expectedErrorLogMessages: []string{ + "error updating certificate status in storage: %w", + }, + expectedInfoMessages: []string{ + "certificate %s changed status to %s", + }, + expectedError: true, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + mockStorage := mocks.NewAggSenderStorage(t) + mockAggLayerClient := agglayer.NewAgglayerClientMock(t) + mockLogger := log.WithFields("test", "unittest") + + mockStorage.On("GetCertificatesByStatus", agglayer.NonSettledStatuses).Return( + tt.pendingCertificates, tt.getFromDBError) + for certID, header := range tt.certificateHeaders { + mockAggLayerClient.On("GetCertificateHeader", certID).Return(header, tt.clientError) + } + if tt.updateDBError != nil { + mockStorage.On("UpdateCertificate", mock.Anything, mock.Anything).Return(tt.updateDBError) + } else if tt.clientError == nil && tt.getFromDBError == nil { + mockStorage.On("UpdateCertificate", mock.Anything, mock.Anything).Return(nil) + } + + aggSender := &AggSender{ + log: mockLogger, + storage: mockStorage, + aggLayerClient: mockAggLayerClient, + cfg: Config{}, + } + + ctx := context.TODO() + thereArePendingCerts := aggSender.checkPendingCertificatesStatus(ctx) + require.Equal(t, tt.expectedError, thereArePendingCerts) + mockAggLayerClient.AssertExpectations(t) + mockStorage.AssertExpectations(t) + }) + } +} + +func TestSendCertificate(t *testing.T) { + t.Parallel() + + privateKey, err := crypto.GenerateKey() + require.NoError(t, err) + + type testCfg struct { + name string + sequencerKey *ecdsa.PrivateKey + shouldSendCertificate []interface{} + getLastSentCertificate []interface{} + lastL2BlockProcessed []interface{} + getBridges []interface{} + getClaims []interface{} + getInfoByGlobalExitRoot []interface{} + getL1InfoTreeRootByIndex []interface{} + getL1InfoTreeMerkleProofFromIndexToRoot []interface{} + getExitRootByIndex []interface{} + originNetwork []interface{} + sendCertificate []interface{} + saveLastSentCertificate []interface{} + expectedError string + } + + setupTest := func(cfg testCfg) (*AggSender, *mocks.AggSenderStorage, *mocks.L2BridgeSyncer, + *agglayer.AgglayerClientMock, *mocks.L1InfoTreeSyncer) { + var ( + aggsender = &AggSender{ + log: log.WithFields("aggsender", 1), + cfg: Config{MaxRetriesStoreCertificate: 1}, + sequencerKey: cfg.sequencerKey, + } + mockStorage *mocks.AggSenderStorage + mockL2Syncer *mocks.L2BridgeSyncer + mockAggLayerClient *agglayer.AgglayerClientMock + mockL1InfoTreeSyncer *mocks.L1InfoTreeSyncer + ) + + if cfg.shouldSendCertificate != nil || cfg.getLastSentCertificate != nil || + cfg.saveLastSentCertificate != nil { + mockStorage = mocks.NewAggSenderStorage(t) + mockStorage.On("GetCertificatesByStatus", agglayer.NonSettledStatuses). + Return(cfg.shouldSendCertificate...) + + aggsender.storage = mockStorage + + if cfg.getLastSentCertificate != nil { + mockStorage.On("GetLastSentCertificate").Return(cfg.getLastSentCertificate...).Once() + } + + if cfg.saveLastSentCertificate != nil { + mockStorage.On("SaveLastSentCertificate", mock.Anything, mock.Anything).Return(cfg.saveLastSentCertificate...) + } + } + + if cfg.lastL2BlockProcessed != nil || cfg.originNetwork != nil || + cfg.getBridges != nil || cfg.getClaims != nil || cfg.getInfoByGlobalExitRoot != nil { + mockL2Syncer = mocks.NewL2BridgeSyncer(t) + + mockL2Syncer.On("GetLastProcessedBlock", mock.Anything).Return(cfg.lastL2BlockProcessed...).Once() + + if cfg.getBridges != nil { + mockL2Syncer.On("GetBridgesPublished", mock.Anything, mock.Anything, mock.Anything).Return(cfg.getBridges...) + } + + if cfg.getClaims != nil { + mockL2Syncer.On("GetClaims", mock.Anything, mock.Anything, mock.Anything).Return(cfg.getClaims...).Once() + } + + if cfg.getExitRootByIndex != nil { + mockL2Syncer.On("GetExitRootByIndex", mock.Anything, mock.Anything).Return(cfg.getExitRootByIndex...).Once() + } + + if cfg.originNetwork != nil { + mockL2Syncer.On("OriginNetwork").Return(cfg.originNetwork...).Once() + } + + aggsender.l2Syncer = mockL2Syncer + } + + if cfg.sendCertificate != nil { + mockAggLayerClient = agglayer.NewAgglayerClientMock(t) + mockAggLayerClient.On("SendCertificate", mock.Anything).Return(cfg.sendCertificate...).Once() + + aggsender.aggLayerClient = mockAggLayerClient + } + + if cfg.getInfoByGlobalExitRoot != nil || + cfg.getL1InfoTreeRootByIndex != nil || cfg.getL1InfoTreeMerkleProofFromIndexToRoot != nil { + mockL1InfoTreeSyncer = mocks.NewL1InfoTreeSyncer(t) + mockL1InfoTreeSyncer.On("GetInfoByGlobalExitRoot", mock.Anything).Return(cfg.getInfoByGlobalExitRoot...).Once() + + if cfg.getL1InfoTreeRootByIndex != nil { + mockL1InfoTreeSyncer.On("GetL1InfoTreeRootByIndex", mock.Anything, mock.Anything).Return(cfg.getL1InfoTreeRootByIndex...).Once() + } + + if cfg.getL1InfoTreeMerkleProofFromIndexToRoot != nil { + mockL1InfoTreeSyncer.On("GetL1InfoTreeMerkleProofFromIndexToRoot", mock.Anything, mock.Anything, mock.Anything). + Return(cfg.getL1InfoTreeMerkleProofFromIndexToRoot...).Once() + } + + aggsender.l1infoTreeSyncer = mockL1InfoTreeSyncer + } + + return aggsender, mockStorage, mockL2Syncer, mockAggLayerClient, mockL1InfoTreeSyncer + } + + tests := []testCfg{ + { + name: "error getting pending certificates", + shouldSendCertificate: []interface{}{nil, errors.New("error getting pending")}, + expectedError: "error getting pending", + }, + { + name: "should not send certificate", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{ + {Status: agglayer.Pending}, + }, nil}, + }, + { + name: "error getting last sent certificate", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(8), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{}, errors.New("error getting last sent certificate")}, + expectedError: "error getting last sent certificate", + }, + { + name: "no new blocks to send certificate", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(41), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 41, + CertificateID: common.HexToHash("0x111"), + NewLocalExitRoot: common.HexToHash("0x13223"), + FromBlock: 31, + ToBlock: 41, + }, nil}, + }, + { + name: "get bridges error", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(59), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 50, + CertificateID: common.HexToHash("0x1111"), + NewLocalExitRoot: common.HexToHash("0x132233"), + FromBlock: 40, + ToBlock: 41, + }, nil}, + getBridges: []interface{}{nil, errors.New("error getting bridges")}, + expectedError: "error getting bridges", + }, + { + name: "no bridges", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(69), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 60, + CertificateID: common.HexToHash("0x11111"), + NewLocalExitRoot: common.HexToHash("0x1322233"), + FromBlock: 50, + ToBlock: 51, + }, nil}, + getBridges: []interface{}{[]bridgesync.Bridge{}, nil}, + }, + { + name: "get claims error", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(79), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 70, + CertificateID: common.HexToHash("0x121111"), + NewLocalExitRoot: common.HexToHash("0x13122233"), + FromBlock: 60, + ToBlock: 61, + }, nil}, + getBridges: []interface{}{[]bridgesync.Bridge{ + { + BlockNum: 61, + BlockPos: 0, + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + }, + }, nil}, + getClaims: []interface{}{nil, errors.New("error getting claims")}, + expectedError: "error getting claims", + }, + { + name: "error getting info by global exit root", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(89), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 80, + CertificateID: common.HexToHash("0x1321111"), + NewLocalExitRoot: common.HexToHash("0x131122233"), + FromBlock: 70, + ToBlock: 71, + }, nil}, + getBridges: []interface{}{[]bridgesync.Bridge{ + { + BlockNum: 71, + BlockPos: 0, + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + }, + }, nil}, + getClaims: []interface{}{[]bridgesync.Claim{ + { + IsMessage: false, + }, + }, nil}, + getInfoByGlobalExitRoot: []interface{}{nil, errors.New("error getting info by global exit root")}, + expectedError: "error getting info by global exit root", + }, + { + name: "error getting L1 Info tree root by index", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(89), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 80, + CertificateID: common.HexToHash("0x1321111"), + NewLocalExitRoot: common.HexToHash("0x131122233"), + FromBlock: 70, + ToBlock: 71, + }, nil}, + getBridges: []interface{}{[]bridgesync.Bridge{ + { + BlockNum: 71, + BlockPos: 0, + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + }, + }, nil}, + getClaims: []interface{}{[]bridgesync.Claim{ + { + IsMessage: false, + }, + }, nil}, + getInfoByGlobalExitRoot: []interface{}{&l1infotreesync.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + BlockNumber: 1, + BlockPosition: 0, + PreviousBlockHash: common.HexToHash("0x123"), + Timestamp: 123456789, + MainnetExitRoot: common.HexToHash("0xccc"), + RollupExitRoot: common.HexToHash("0xddd"), + GlobalExitRoot: common.HexToHash("0xeee"), + }, nil}, + getL1InfoTreeRootByIndex: []interface{}{treeTypes.Root{}, errors.New("error getting L1 Info tree root by index")}, + expectedError: "error getting L1 Info tree root by index", + }, + { + name: "error getting L1 Info tree merkle proof from index to root", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(89), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 80, + CertificateID: common.HexToHash("0x1321111"), + NewLocalExitRoot: common.HexToHash("0x131122233"), + FromBlock: 70, + ToBlock: 71, + }, nil}, + getBridges: []interface{}{[]bridgesync.Bridge{ + { + BlockNum: 71, + BlockPos: 0, + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + }, + }, nil}, + getClaims: []interface{}{[]bridgesync.Claim{ + { + IsMessage: false, + GlobalIndex: big.NewInt(1), + }, + }, nil}, + getInfoByGlobalExitRoot: []interface{}{&l1infotreesync.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + BlockNumber: 1, + BlockPosition: 0, + PreviousBlockHash: common.HexToHash("0x123"), + Timestamp: 123456789, + MainnetExitRoot: common.HexToHash("0xccc"), + RollupExitRoot: common.HexToHash("0xddd"), + GlobalExitRoot: common.HexToHash("0xeee"), + }, nil}, + getL1InfoTreeRootByIndex: []interface{}{treeTypes.Root{Hash: common.HexToHash("0xeee")}, nil}, + getL1InfoTreeMerkleProofFromIndexToRoot: []interface{}{treeTypes.Proof{}, errors.New("error getting L1 Info tree merkle proof")}, + expectedError: "error getting L1 Info tree merkle proof for leaf index", + }, + { + name: "send certificate error", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(99), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 90, + CertificateID: common.HexToHash("0x1121111"), + NewLocalExitRoot: common.HexToHash("0x111122211"), + PreviousLocalExitRoot: &ler1, + FromBlock: 80, + ToBlock: 81, + Status: agglayer.Settled, + }, nil}, + getBridges: []interface{}{[]bridgesync.Bridge{ + { + BlockNum: 81, + BlockPos: 0, + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + DepositCount: 1, + }, + }, nil}, + getClaims: []interface{}{[]bridgesync.Claim{}, nil}, + getExitRootByIndex: []interface{}{treeTypes.Root{}, nil}, + originNetwork: []interface{}{uint32(1), nil}, + sendCertificate: []interface{}{common.Hash{}, errors.New("error sending certificate")}, + sequencerKey: privateKey, + expectedError: "error sending certificate", + }, + { + name: "store last sent certificate error", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(109), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 100, + CertificateID: common.HexToHash("0x11121111"), + NewLocalExitRoot: common.HexToHash("0x1211122211"), + FromBlock: 90, + ToBlock: 91, + Status: agglayer.Settled, + }, nil}, + getBridges: []interface{}{[]bridgesync.Bridge{ + { + BlockNum: 91, + BlockPos: 0, + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + DepositCount: 1, + }, + }, nil}, + getClaims: []interface{}{[]bridgesync.Claim{}, nil}, + getExitRootByIndex: []interface{}{treeTypes.Root{}, nil}, + originNetwork: []interface{}{uint32(1), nil}, + sendCertificate: []interface{}{common.Hash{}, nil}, + saveLastSentCertificate: []interface{}{errors.New("error saving last sent certificate in db")}, + sequencerKey: privateKey, + expectedError: "error saving last sent certificate in db", + }, + { + name: "successful sending of certificate", + shouldSendCertificate: []interface{}{[]*aggsendertypes.CertificateInfo{}, nil}, + lastL2BlockProcessed: []interface{}{uint64(119), nil}, + getLastSentCertificate: []interface{}{&aggsendertypes.CertificateInfo{ + Height: 110, + CertificateID: common.HexToHash("0x12121111"), + NewLocalExitRoot: common.HexToHash("0x1221122211"), + FromBlock: 100, + ToBlock: 101, + Status: agglayer.Settled, + }, nil}, + getBridges: []interface{}{[]bridgesync.Bridge{ + { + BlockNum: 101, + BlockPos: 0, + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + DepositCount: 1, + }, + }, nil}, + getClaims: []interface{}{[]bridgesync.Claim{}, nil}, + getExitRootByIndex: []interface{}{treeTypes.Root{}, nil}, + originNetwork: []interface{}{uint32(1), nil}, + sendCertificate: []interface{}{common.Hash{}, nil}, + saveLastSentCertificate: []interface{}{nil}, + sequencerKey: privateKey, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + aggsender, mockStorage, mockL2Syncer, + mockAggLayerClient, mockL1InfoTreeSyncer := setupTest(tt) + + _, err := aggsender.sendCertificate(context.Background()) + + if tt.expectedError != "" { + require.ErrorContains(t, err, tt.expectedError) + } else { + require.NoError(t, err) + } + + if mockStorage != nil { + mockStorage.AssertExpectations(t) + } + + if mockL2Syncer != nil { + mockL2Syncer.AssertExpectations(t) + } + + if mockAggLayerClient != nil { + mockAggLayerClient.AssertExpectations(t) + } + + if mockL1InfoTreeSyncer != nil { + mockL1InfoTreeSyncer.AssertExpectations(t) + } + }) + } +} + +func TestExtractSignatureData(t *testing.T) { + t.Parallel() + + testR := common.HexToHash("0x1") + testV := common.HexToHash("0x2") + + tests := []struct { + name string + signature []byte + expectedR common.Hash + expectedS common.Hash + expectedOddParity bool + expectedError error + }{ + { + name: "Valid signature - odd parity", + signature: append(append(testR.Bytes(), testV.Bytes()...), 1), + expectedR: testR, + expectedS: testV, + expectedOddParity: true, + expectedError: nil, + }, + { + name: "Valid signature - even parity", + signature: append(append(testR.Bytes(), testV.Bytes()...), 2), + expectedR: testR, + expectedS: testV, + expectedOddParity: false, + expectedError: nil, + }, + { + name: "Invalid signature size", + signature: make([]byte, 64), // Invalid size + expectedError: errInvalidSignatureSize, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + r, s, isOddParity, err := extractSignatureData(tt.signature) + + if tt.expectedError != nil { + require.Error(t, err) + require.Equal(t, tt.expectedError, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedR, r) + require.Equal(t, tt.expectedS, s) + require.Equal(t, tt.expectedOddParity, isOddParity) + } + }) + } +} + +func TestExploratoryGenerateCert(t *testing.T) { + t.Skip("This test is only for exploratory purposes, to generate json format of the certificate") + + key, err := crypto.GenerateKey() + require.NoError(t, err) + + signature, err := crypto.Sign(common.HexToHash("0x1").Bytes(), key) + require.NoError(t, err) + + r, s, v, err := extractSignatureData(signature) + require.NoError(t, err) + + certificate := &agglayer.SignedCertificate{ + Certificate: &agglayer.Certificate{ + NetworkID: 1, + Height: 1, + PrevLocalExitRoot: common.HexToHash("0x1"), + NewLocalExitRoot: common.HexToHash("0x2"), + BridgeExits: []*agglayer.BridgeExit{ + { + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x11"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x22"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + }, + ImportedBridgeExits: []*agglayer.ImportedBridgeExit{ + { + GlobalIndex: &agglayer.GlobalIndex{ + MainnetFlag: false, + RollupIndex: 1, + LeafIndex: 11, + }, + BridgeExit: &agglayer.BridgeExit{ + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x11"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x22"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + ClaimData: &agglayer.ClaimFromMainnnet{ + ProofLeafMER: &agglayer.MerkleProof{ + Root: common.HexToHash("0x1"), + Proof: [32]common.Hash{}, + }, + ProofGERToL1Root: &agglayer.MerkleProof{ + Root: common.HexToHash("0x3"), + Proof: [32]common.Hash{}, + }, + L1Leaf: &agglayer.L1InfoTreeLeaf{ + L1InfoTreeIndex: 1, + RollupExitRoot: common.HexToHash("0x4"), + MainnetExitRoot: common.HexToHash("0x5"), + Inner: &agglayer.L1InfoTreeLeafInner{ + GlobalExitRoot: common.HexToHash("0x6"), + BlockHash: common.HexToHash("0x7"), + Timestamp: 1231, + }, + }, + }, + }, + }, + }, + Signature: &agglayer.Signature{ + R: r, + S: s, + OddParity: v, + }, + } + + file, err := os.Create("test.json") + require.NoError(t, err) + + defer file.Close() + + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + require.NoError(t, encoder.Encode(certificate)) +} + +func TestGetNextHeightAndPreviousLER(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + lastSentCertificateInfo *aggsendertypes.CertificateInfo + lastSettleCertificateInfoCall bool + lastSettleCertificateInfo *aggsendertypes.CertificateInfo + lastSettleCertificateInfoError error + expectedHeight uint64 + expectedPreviousLER common.Hash + expectedError bool + }{ + { + name: "Normal case", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 10, + NewLocalExitRoot: common.HexToHash("0x123"), + Status: agglayer.Settled, + }, + expectedHeight: 11, + expectedPreviousLER: common.HexToHash("0x123"), + }, + { + name: "First certificate", + lastSentCertificateInfo: nil, + expectedHeight: 0, + expectedPreviousLER: zeroLER, + }, + { + name: "First certificate error, with prevLER", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 0, + NewLocalExitRoot: common.HexToHash("0x123"), + Status: agglayer.InError, + PreviousLocalExitRoot: &ler1, + }, + expectedHeight: 0, + expectedPreviousLER: ler1, + }, + { + name: "First certificate error, no prevLER", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 0, + NewLocalExitRoot: common.HexToHash("0x123"), + Status: agglayer.InError, + }, + expectedHeight: 0, + expectedPreviousLER: zeroLER, + }, + { + name: "n certificate error, prevLER", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 10, + NewLocalExitRoot: common.HexToHash("0x123"), + PreviousLocalExitRoot: &ler1, + Status: agglayer.InError, + }, + expectedHeight: 10, + expectedPreviousLER: ler1, + }, + { + name: "last cert not closed, error", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 10, + NewLocalExitRoot: common.HexToHash("0x123"), + PreviousLocalExitRoot: &ler1, + Status: agglayer.Pending, + }, + expectedHeight: 10, + expectedPreviousLER: ler1, + expectedError: true, + }, + { + name: "Previous certificate in error, no prevLER", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 10, + NewLocalExitRoot: common.HexToHash("0x123"), + Status: agglayer.InError, + }, + lastSettleCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 9, + NewLocalExitRoot: common.HexToHash("0x3456"), + Status: agglayer.Settled, + }, + expectedHeight: 10, + expectedPreviousLER: common.HexToHash("0x3456"), + }, + { + name: "Previous certificate in error, no prevLER. Error getting previous cert", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 10, + NewLocalExitRoot: common.HexToHash("0x123"), + Status: agglayer.InError, + }, + lastSettleCertificateInfo: nil, + lastSettleCertificateInfoError: errors.New("error getting last settle certificate"), + expectedError: true, + }, + { + name: "Previous certificate in error, no prevLER. prev cert not available on storage", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 10, + NewLocalExitRoot: common.HexToHash("0x123"), + Status: agglayer.InError, + }, + lastSettleCertificateInfoCall: true, + lastSettleCertificateInfo: nil, + lastSettleCertificateInfoError: nil, + expectedError: true, + }, + { + name: "Previous certificate in error, no prevLER. prev cert not available on storage", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 10, + NewLocalExitRoot: common.HexToHash("0x123"), + Status: agglayer.InError, + }, + lastSettleCertificateInfo: &aggsendertypes.CertificateInfo{ + Height: 9, + NewLocalExitRoot: common.HexToHash("0x3456"), + Status: agglayer.InError, + }, + lastSettleCertificateInfoError: nil, + expectedError: true, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + storageMock := mocks.NewAggSenderStorage(t) + aggSender := &AggSender{log: log.WithFields("aggsender-test", "getNextHeightAndPreviousLER"), storage: storageMock} + if tt.lastSettleCertificateInfoCall || tt.lastSettleCertificateInfo != nil || tt.lastSettleCertificateInfoError != nil { + storageMock.EXPECT().GetCertificateByHeight(mock.Anything).Return(tt.lastSettleCertificateInfo, tt.lastSettleCertificateInfoError).Once() + } + height, previousLER, err := aggSender.getNextHeightAndPreviousLER(tt.lastSentCertificateInfo) + if tt.expectedError { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedHeight, height) + require.Equal(t, tt.expectedPreviousLER, previousLER) + } + }) + } +} + +func TestSendCertificate_NoClaims(t *testing.T) { + privateKey, err := crypto.GenerateKey() + require.NoError(t, err) + + ctx := context.Background() + mockStorage := mocks.NewAggSenderStorage(t) + mockL2Syncer := mocks.NewL2BridgeSyncer(t) + mockAggLayerClient := agglayer.NewAgglayerClientMock(t) + mockL1InfoTreeSyncer := mocks.NewL1InfoTreeSyncer(t) + + aggSender := &AggSender{ + log: log.WithFields("aggsender-test", "no claims test"), + storage: mockStorage, + l2Syncer: mockL2Syncer, + aggLayerClient: mockAggLayerClient, + l1infoTreeSyncer: mockL1InfoTreeSyncer, + sequencerKey: privateKey, + cfg: Config{}, + } + + mockStorage.On("GetCertificatesByStatus", agglayer.NonSettledStatuses).Return([]*aggsendertypes.CertificateInfo{}, nil).Once() + mockStorage.On("GetLastSentCertificate").Return(&aggsendertypes.CertificateInfo{ + NewLocalExitRoot: common.HexToHash("0x123"), + Height: 1, + FromBlock: 0, + ToBlock: 10, + Status: agglayer.Settled, + }, nil).Once() + mockStorage.On("SaveLastSentCertificate", mock.Anything, mock.Anything).Return(nil).Once() + mockL2Syncer.On("GetLastProcessedBlock", mock.Anything).Return(uint64(50), nil) + mockL2Syncer.On("GetBridgesPublished", mock.Anything, uint64(11), uint64(50)).Return([]bridgesync.Bridge{ + { + BlockNum: 30, + BlockPos: 0, + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + OriginAddress: common.HexToAddress("0x1"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x2"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + DepositCount: 1, + }, + }, nil) + mockL2Syncer.On("GetClaims", mock.Anything, uint64(11), uint64(50)).Return([]bridgesync.Claim{}, nil) + mockL2Syncer.On("GetExitRootByIndex", mock.Anything, uint32(1)).Return(treeTypes.Root{}, nil).Once() + mockL2Syncer.On("OriginNetwork").Return(uint32(1), nil).Once() + mockAggLayerClient.On("SendCertificate", mock.Anything).Return(common.Hash{}, nil).Once() + + signedCertificate, err := aggSender.sendCertificate(ctx) + require.NoError(t, err) + require.NotNil(t, signedCertificate) + require.NotNil(t, signedCertificate.Signature) + require.NotNil(t, signedCertificate.Certificate) + require.NotNil(t, signedCertificate.Certificate.ImportedBridgeExits) + require.Len(t, signedCertificate.Certificate.BridgeExits, 1) + + mockStorage.AssertExpectations(t) + mockL2Syncer.AssertExpectations(t) + mockAggLayerClient.AssertExpectations(t) + mockL1InfoTreeSyncer.AssertExpectations(t) +} + +func TestExtractFromCertificateMetadataToBlock(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + metadata common.Hash + expected aggsendertypes.CertificateMetadata + }{ + { + name: "Valid metadata", + metadata: aggsendertypes.NewCertificateMetadata(0, 1000, 123567890).ToHash(), + expected: aggsendertypes.CertificateMetadata{ + Version: 1, + FromBlock: 0, + Offset: 1000, + CreatedAt: 123567890, + }, + }, + { + name: "Zero metadata", + metadata: aggsendertypes.NewCertificateMetadata(0, 0, 0).ToHash(), + expected: aggsendertypes.CertificateMetadata{ + Version: 1, + FromBlock: 0, + Offset: 0, + CreatedAt: 0, + }, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + result := *aggsendertypes.NewCertificateMetadataFromHash(tt.metadata) + require.Equal(t, tt.expected, result) + }) + } +} + +func TestCheckLastCertificateFromAgglayer_ErrorAggLayer(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest).Return(nil, fmt.Errorf("unittest error")).Once() + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.Error(t, err) +} + +func TestCheckLastCertificateFromAgglayer_ErrorStorageGetLastSentCertificate(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest).Return(nil, nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(nil, fmt.Errorf("unittest error")) + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.Error(t, err) +} + +// TestCheckLastCertificateFromAgglayer_Case1NoCerts +// CASE 1: No certificates in local storage and agglayer +// Aggsender and agglayer are empty so it's ok +func TestCheckLastCertificateFromAgglayer_Case1NoCerts(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagNone) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest).Return(nil, nil).Once() + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.NoError(t, err) +} + +// TestCheckLastCertificateFromAgglayer_Case2NoCertLocalCertRemote +// CASE 2: No certificates in local storage but agglayer has one +// The local DB is empty and we set the lastCert reported by AggLayer +func TestCheckLastCertificateFromAgglayer_Case2NoCertLocalCertRemote(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagNone) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(certInfoToCertHeader(t, &testData.testCerts[0], networkIDTest), nil).Once() + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.NoError(t, err) + localCert, err := testData.sut.storage.GetLastSentCertificate() + require.NoError(t, err) + require.Equal(t, testData.testCerts[0].CertificateID, localCert.CertificateID) +} + +// TestCheckLastCertificateFromAgglayer_Case2NoCertLocalCertRemoteErrorStorage +// sub case of previous one that fails to update local storage +func TestCheckLastCertificateFromAgglayer_Case2NoCertLocalCertRemoteErrorStorage(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(certInfoToCertHeader(t, &testData.testCerts[0], networkIDTest), nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(nil, nil) + testData.storageMock.EXPECT().SaveLastSentCertificate(mock.Anything, mock.Anything).Return(errTest).Once() + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.Error(t, err) +} + +// CASE 2.1: certificate in storage but not in agglayer +// sub case of previous one that fails to update local storage +func TestCheckLastCertificateFromAgglayer_Case2_1NoCertRemoteButCertLocal(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(nil, nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[0], nil) + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.Error(t, err) +} + +// CASE 3.1: the certificate on the agglayer has less height than the one stored in the local storage +func TestCheckLastCertificateFromAgglayer_Case3_1LessHeight(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(certInfoToCertHeader(t, &testData.testCerts[0], networkIDTest), nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[1], nil) + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.ErrorContains(t, err, "recovery: the last certificate in the agglayer has less height (1) than the one in the local storage (2)") +} + +// CASE 3.2: AggSender and AggLayer not same height. AggLayer has a new certificate +func TestCheckLastCertificateFromAgglayer_Case3_2Mismatch(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(certInfoToCertHeader(t, &testData.testCerts[1], networkIDTest), nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[0], nil) + testData.storageMock.EXPECT().SaveLastSentCertificate(mock.Anything, mock.Anything).Return(nil).Once() + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.NoError(t, err) +} + +// CASE 4: AggSender and AggLayer not same certificateID +func TestCheckLastCertificateFromAgglayer_Case4Mismatch(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(certInfoToCertHeader(t, &testData.testCerts[0], networkIDTest), nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[1], nil) + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.Error(t, err) +} + +// CASE 5: AggSender and AggLayer same certificateID and same status +func TestCheckLastCertificateFromAgglayer_Case5SameStatus(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(certInfoToCertHeader(t, &testData.testCerts[0], networkIDTest), nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[0], nil) + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.NoError(t, err) +} + +// CASE 5: AggSender and AggLayer same certificateID and differ on status +func TestCheckLastCertificateFromAgglayer_Case5UpdateStatus(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + aggLayerCert := certInfoToCertHeader(t, &testData.testCerts[0], networkIDTest) + aggLayerCert.Status = agglayer.Settled + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(aggLayerCert, nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[0], nil) + testData.storageMock.EXPECT().UpdateCertificate(mock.Anything, mock.Anything).Return(nil).Once() + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.NoError(t, err) +} + +// CASE 4: AggSender and AggLayer same certificateID and differ on status but fails update +func TestCheckLastCertificateFromAgglayer_Case4ErrorUpdateStatus(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.l2syncerMock.EXPECT().OriginNetwork().Return(networkIDTest).Once() + aggLayerCert := certInfoToCertHeader(t, &testData.testCerts[0], networkIDTest) + aggLayerCert.Status = agglayer.Settled + testData.agglayerClientMock.EXPECT().GetLatestKnownCertificateHeader(networkIDTest). + Return(aggLayerCert, nil).Once() + testData.storageMock.EXPECT().GetLastSentCertificate().Return(&testData.testCerts[0], nil) + testData.storageMock.EXPECT().UpdateCertificate(mock.Anything, mock.Anything).Return(errTest).Once() + + err := testData.sut.checkLastCertificateFromAgglayer(testData.ctx) + + require.Error(t, err) +} + +func TestLimitSize_FirstOneFit(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + certParams := &aggsendertypes.CertificateBuildParams{ + FromBlock: uint64(1), + ToBlock: uint64(20), + Bridges: NewBridgesData(t, 1, []uint64{1}), + } + newCert, err := testData.sut.limitCertSize(certParams) + require.NoError(t, err) + require.Equal(t, certParams, newCert) +} + +func TestLimitSize_FirstMinusOneFit(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.sut.cfg.MaxCertSize = (aggsendertypes.EstimatedSizeBridgeExit * 3) + 1 + certParams := &aggsendertypes.CertificateBuildParams{ + FromBlock: uint64(1), + ToBlock: uint64(20), + Bridges: NewBridgesData(t, 0, []uint64{19, 19, 19, 20}), + } + newCert, err := testData.sut.limitCertSize(certParams) + require.NoError(t, err) + require.Equal(t, uint64(19), newCert.ToBlock) +} + +func TestLimitSize_NoWayToFitInMaxSize(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.sut.cfg.MaxCertSize = (aggsendertypes.EstimatedSizeBridgeExit * 2) + 1 + certParams := &aggsendertypes.CertificateBuildParams{ + FromBlock: uint64(1), + ToBlock: uint64(20), + Bridges: NewBridgesData(t, 0, []uint64{19, 19, 19, 20}), + } + newCert, err := testData.sut.limitCertSize(certParams) + require.NoError(t, err) + require.Equal(t, uint64(19), newCert.ToBlock) +} + +func TestLimitSize_MinNumBlocks(t *testing.T) { + testData := newAggsenderTestData(t, testDataFlagMockStorage) + testData.sut.cfg.MaxCertSize = (aggsendertypes.EstimatedSizeBridgeExit * 2) + 1 + certParams := &aggsendertypes.CertificateBuildParams{ + FromBlock: uint64(1), + ToBlock: uint64(2), + Bridges: NewBridgesData(t, 0, []uint64{1, 1, 1, 2, 2, 2}), + } + newCert, err := testData.sut.limitCertSize(certParams) + require.NoError(t, err) + require.Equal(t, uint64(1), newCert.ToBlock) +} + +func TestGetLastSentBlockAndRetryCount(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + lastSentCertificateInfo *aggsendertypes.CertificateInfo + expectedBlock uint64 + expectedRetryCount int + }{ + { + name: "No last sent certificate", + lastSentCertificateInfo: nil, + expectedBlock: 0, + expectedRetryCount: 0, + }, + { + name: "Last sent certificate with no error", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + ToBlock: 10, + Status: agglayer.Settled, + }, + expectedBlock: 10, + expectedRetryCount: 0, + }, + { + name: "Last sent certificate with error and non-zero FromBlock", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + FromBlock: 5, + ToBlock: 10, + Status: agglayer.InError, + RetryCount: 1, + }, + expectedBlock: 4, + expectedRetryCount: 2, + }, + { + name: "Last sent certificate with error and zero FromBlock", + lastSentCertificateInfo: &aggsendertypes.CertificateInfo{ + FromBlock: 0, + ToBlock: 10, + Status: agglayer.InError, + RetryCount: 1, + }, + expectedBlock: 10, + expectedRetryCount: 2, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + block, retryCount := getLastSentBlockAndRetryCount(tt.lastSentCertificateInfo) + + require.Equal(t, tt.expectedBlock, block) + require.Equal(t, tt.expectedRetryCount, retryCount) + }) + } +} + +type testDataFlags = int + +const ( + testDataFlagNone testDataFlags = 0 + testDataFlagMockStorage testDataFlags = 1 +) + +type aggsenderTestData struct { + ctx context.Context + agglayerClientMock *agglayer.AgglayerClientMock + l2syncerMock *mocks.L2BridgeSyncer + l1InfoTreeSyncerMock *mocks.L1InfoTreeSyncer + storageMock *mocks.AggSenderStorage + sut *AggSender + testCerts []aggsendertypes.CertificateInfo +} + +func NewBridgesData(t *testing.T, num int, blockNum []uint64) []bridgesync.Bridge { + t.Helper() + if num == 0 { + num = len(blockNum) + } + res := make([]bridgesync.Bridge, 0) + for i := 0; i < num; i++ { + res = append(res, bridgesync.Bridge{ + BlockNum: blockNum[i%len(blockNum)], + BlockPos: 0, + LeafType: agglayer.LeafTypeAsset.Uint8(), + OriginNetwork: 1, + }) + } + return res +} + +func NewClaimData(t *testing.T, num int, blockNum []uint64) []bridgesync.Claim { + t.Helper() + if num == 0 { + num = len(blockNum) + } + res := make([]bridgesync.Claim, 0) + for i := 0; i < num; i++ { + res = append(res, bridgesync.Claim{ + BlockNum: blockNum[i%len(blockNum)], + BlockPos: 0, + }) + } + return res +} + +func certInfoToCertHeader(t *testing.T, certInfo *aggsendertypes.CertificateInfo, networkID uint32) *agglayer.CertificateHeader { + t.Helper() + if certInfo == nil { + return nil + } + return &agglayer.CertificateHeader{ + Height: certInfo.Height, + NetworkID: networkID, + CertificateID: certInfo.CertificateID, + NewLocalExitRoot: certInfo.NewLocalExitRoot, + Status: agglayer.Pending, + Metadata: aggsendertypes.NewCertificateMetadata( + certInfo.FromBlock, + uint32(certInfo.FromBlock-certInfo.ToBlock), + certInfo.CreatedAt, + ).ToHash(), + } +} + +func newAggsenderTestData(t *testing.T, creationFlags testDataFlags) *aggsenderTestData { + t.Helper() + l2syncerMock := mocks.NewL2BridgeSyncer(t) + agglayerClientMock := agglayer.NewAgglayerClientMock(t) + l1InfoTreeSyncerMock := mocks.NewL1InfoTreeSyncer(t) + logger := log.WithFields("aggsender-test", "checkLastCertificateFromAgglayer") + var storageMock *mocks.AggSenderStorage + var storage db.AggSenderStorage + var err error + if creationFlags&testDataFlagMockStorage != 0 { + storageMock = mocks.NewAggSenderStorage(t) + storage = storageMock + } else { + dbPath := path.Join(t.TempDir(), "newAggsenderTestData.sqlite") + storageConfig := db.AggSenderSQLStorageConfig{ + DBPath: dbPath, + KeepCertificatesHistory: true, + } + storage, err = db.NewAggSenderSQLStorage(logger, storageConfig) + require.NoError(t, err) + } + + ctx := context.TODO() + sut := &AggSender{ + log: logger, + l2Syncer: l2syncerMock, + aggLayerClient: agglayerClientMock, + storage: storage, + l1infoTreeSyncer: l1InfoTreeSyncerMock, + cfg: Config{ + MaxCertSize: 1024 * 1024, + }, + } + testCerts := []aggsendertypes.CertificateInfo{ + { + Height: 1, + CertificateID: common.HexToHash("0x1"), + NewLocalExitRoot: common.HexToHash("0x2"), + Status: agglayer.Pending, + }, + { + Height: 2, + CertificateID: common.HexToHash("0x1a111"), + NewLocalExitRoot: common.HexToHash("0x2a2"), + Status: agglayer.Pending, + }, + } + + return &aggsenderTestData{ + ctx: ctx, + agglayerClientMock: agglayerClientMock, + l2syncerMock: l2syncerMock, + l1InfoTreeSyncerMock: l1InfoTreeSyncerMock, + storageMock: storageMock, + sut: sut, + testCerts: testCerts, + } +} diff --git a/aggsender/block_notifier_polling.go b/aggsender/block_notifier_polling.go new file mode 100644 index 00000000..4d98122d --- /dev/null +++ b/aggsender/block_notifier_polling.go @@ -0,0 +1,228 @@ +package aggsender + +import ( + "context" + "fmt" + "math/big" + "sync" + "time" + + "github.com/agglayer/aggkit/aggsender/types" + "github.com/agglayer/aggkit/etherman" +) + +var ( + timeNowFunc = time.Now +) + +const ( + AutomaticBlockInterval = time.Second * 0 + // minBlockInterval is the minimum interval at which the AggSender will check for new blocks + minBlockInterval = time.Second + // maxBlockInterval is the maximum interval at which the AggSender will check for new blocks + maxBlockInterval = time.Minute + // Percentage period of reach the next block + percentForNextBlock = 80 +) + +type ConfigBlockNotifierPolling struct { + // BlockFinalityType is the finality of the block to be notified + BlockFinalityType etherman.BlockNumberFinality + // CheckNewBlockInterval is the interval at which the AggSender will check for new blocks + // if is 0 it will be calculated automatically + CheckNewBlockInterval time.Duration +} + +type BlockNotifierPolling struct { + ethClient types.EthClient + blockFinality *big.Int + logger types.Logger + config ConfigBlockNotifierPolling + mu sync.Mutex + lastStatus *blockNotifierPollingInternalStatus + types.GenericSubscriber[types.EventNewBlock] +} + +// NewBlockNotifierPolling creates a new BlockNotifierPolling. +// if param `subscriber` is nil a new GenericSubscriberImpl[types.EventNewBlock] will be created. +// To use this class you need to subscribe and each time that a new block appear the subscriber +// will be notified through the channel. (check unit tests TestExploratoryBlockNotifierPolling +// for more information) +func NewBlockNotifierPolling(ethClient types.EthClient, + config ConfigBlockNotifierPolling, + logger types.Logger, + subscriber types.GenericSubscriber[types.EventNewBlock]) (*BlockNotifierPolling, error) { + if subscriber == nil { + subscriber = NewGenericSubscriberImpl[types.EventNewBlock]() + } + finality, err := config.BlockFinalityType.ToBlockNum() + if err != nil { + return nil, fmt.Errorf("failed to convert block finality type to block number: %w", err) + } + + return &BlockNotifierPolling{ + ethClient: ethClient, + blockFinality: finality, + logger: logger, + config: config, + GenericSubscriber: subscriber, + }, nil +} + +func (b *BlockNotifierPolling) String() string { + status := b.getGlobalStatus() + res := fmt.Sprintf("BlockNotifierPolling: finality=%s", b.config.BlockFinalityType) + if status != nil { + res += fmt.Sprintf(" lastBlockSeen=%d", status.lastBlockSeen) + } else { + res += " lastBlockSeen=none" + } + return res +} + +// Start starts the BlockNotifierPolling blocking the current goroutine +func (b *BlockNotifierPolling) Start(ctx context.Context) { + ticker := time.NewTimer(b.config.CheckNewBlockInterval) + defer ticker.Stop() + + var status *blockNotifierPollingInternalStatus = nil + + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + delay, newStatus, event := b.step(ctx, status) + status = newStatus + b.setGlobalStatus(status) + if event != nil { + b.Publish(*event) + } + ticker.Reset(delay) + } + } +} + +func (b *BlockNotifierPolling) setGlobalStatus(status *blockNotifierPollingInternalStatus) { + b.mu.Lock() + defer b.mu.Unlock() + b.lastStatus = status +} + +func (b *BlockNotifierPolling) getGlobalStatus() *blockNotifierPollingInternalStatus { + b.mu.Lock() + defer b.mu.Unlock() + if b.lastStatus == nil { + return nil + } + copyStatus := *b.lastStatus + return ©Status +} + +// step is the main function of the BlockNotifierPolling, it checks if there is a new block +// it returns: +// - the delay for the next check +// - the new status +// - the new even to emit or nil +func (b *BlockNotifierPolling) step(ctx context.Context, + previousState *blockNotifierPollingInternalStatus) (time.Duration, + *blockNotifierPollingInternalStatus, *types.EventNewBlock) { + currentBlock, err := b.ethClient.HeaderByNumber(ctx, b.blockFinality) + if err == nil && currentBlock == nil { + err = fmt.Errorf("failed to get block number: return a nil block") + } + if err != nil { + b.logger.Errorf("Failed to get block number: %v", err) + newState := previousState.clear() + return b.nextBlockRequestDelay(nil, err), newState, nil + } + if previousState == nil { + newState := previousState.intialBlock(currentBlock.Number.Uint64()) + return b.nextBlockRequestDelay(previousState, nil), newState, nil + } + if currentBlock.Number.Uint64() == previousState.lastBlockSeen { + // No new block, so no changes on state + return b.nextBlockRequestDelay(previousState, nil), previousState, nil + } + // New blockNumber! + eventToEmit := &types.EventNewBlock{ + BlockNumber: currentBlock.Number.Uint64(), + BlockFinalityType: b.config.BlockFinalityType, + } + if previousState.lastBlockSeen > currentBlock.Number.Uint64() { + b.logger.Warnf("Block number decreased [finality:%s]: %d -> %d", + b.config.BlockFinalityType, previousState.lastBlockSeen, currentBlock.Number.Uint64()) + // It start from scratch because something fails in calculation of block period + newState := previousState.intialBlock(currentBlock.Number.Uint64()) + return b.nextBlockRequestDelay(nil, nil), newState, eventToEmit + } + + if currentBlock.Number.Uint64()-previousState.lastBlockSeen != 1 { + b.logger.Warnf("Missed block(s) [finality:%s]: %d -> %d", + b.config.BlockFinalityType, previousState.lastBlockSeen, currentBlock.Number.Uint64()) + // It start from scratch because something fails in calculation of block period + newState := previousState.intialBlock(currentBlock.Number.Uint64()) + return b.nextBlockRequestDelay(nil, nil), newState, eventToEmit + } + newState := previousState.incommingNewBlock(currentBlock.Number.Uint64()) + b.logger.Debugf("New block seen [finality:%s]: %d. blockRate:%s", + b.config.BlockFinalityType, currentBlock.Number.Uint64(), newState.previousBlockTime) + eventToEmit.BlockRate = *newState.previousBlockTime + return b.nextBlockRequestDelay(newState, nil), newState, eventToEmit +} + +func (b *BlockNotifierPolling) nextBlockRequestDelay(status *blockNotifierPollingInternalStatus, + err error) time.Duration { + if b.config.CheckNewBlockInterval != AutomaticBlockInterval { + return b.config.CheckNewBlockInterval + } + // Initial stages wait the minimum interval to increas accuracy + if status == nil || status.previousBlockTime == nil { + return minBlockInterval + } + if err != nil { + // If error we wait twice the min interval + return minBlockInterval * 2 //nolint:mnd // 2 times the interval + } + // we have a previous block time so we can calculate the interval + now := timeNowFunc() + expectedTimeNextBlock := status.lastBlockTime.Add(*status.previousBlockTime) + distanceToNextBlock := expectedTimeNextBlock.Sub(now) + interval := distanceToNextBlock * percentForNextBlock / 100 //nolint:mnd // percent period for reach the next block + return max(minBlockInterval, min(maxBlockInterval, interval)) +} + +type blockNotifierPollingInternalStatus struct { + lastBlockSeen uint64 + lastBlockTime time.Time // first appear of block lastBlockSeen + previousBlockTime *time.Duration // time of the previous block to appear +} + +func (s *blockNotifierPollingInternalStatus) String() string { + if s == nil { + return "nil" + } + return fmt.Sprintf("lastBlockSeen=%d lastBlockTime=%s previousBlockTime=%s", + s.lastBlockSeen, s.lastBlockTime, s.previousBlockTime) +} + +func (s *blockNotifierPollingInternalStatus) clear() *blockNotifierPollingInternalStatus { + return &blockNotifierPollingInternalStatus{} +} + +func (s *blockNotifierPollingInternalStatus) intialBlock(block uint64) *blockNotifierPollingInternalStatus { + return &blockNotifierPollingInternalStatus{ + lastBlockSeen: block, + lastBlockTime: timeNowFunc(), + } +} + +func (s *blockNotifierPollingInternalStatus) incommingNewBlock(block uint64) *blockNotifierPollingInternalStatus { + now := timeNowFunc() + timePreviousBlock := now.Sub(s.lastBlockTime) + return &blockNotifierPollingInternalStatus{ + lastBlockSeen: block, + lastBlockTime: now, + previousBlockTime: &timePreviousBlock, + } +} diff --git a/aggsender/block_notifier_polling_test.go b/aggsender/block_notifier_polling_test.go new file mode 100644 index 00000000..d53e4d2c --- /dev/null +++ b/aggsender/block_notifier_polling_test.go @@ -0,0 +1,208 @@ +package aggsender + +import ( + "context" + "fmt" + "math/big" + "os" + "testing" + "time" + + "github.com/agglayer/aggkit/aggsender/mocks" + aggsendertypes "github.com/agglayer/aggkit/aggsender/types" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestExploratoryBlockNotifierPolling(t *testing.T) { + t.Skip() + urlRPCL1 := os.Getenv("L1URL") + fmt.Println("URL=", urlRPCL1) + ethClient, err := ethclient.Dial(urlRPCL1) + require.NoError(t, err) + + sut, errSut := NewBlockNotifierPolling(ethClient, + ConfigBlockNotifierPolling{ + BlockFinalityType: etherman.LatestBlock, + }, log.WithFields("test", "test"), nil) + require.NoError(t, errSut) + go sut.Start(context.Background()) + ch := sut.Subscribe("test") + for block := range ch { + fmt.Println(block) + } +} + +func TestBlockNotifierPollingStep(t *testing.T) { + time0 := time.Unix(1731322117, 0) + period0 := time.Second * 10 + period0_80percent := time.Second * 8 + time1 := time0.Add(period0) + tests := []struct { + name string + previousStatus *blockNotifierPollingInternalStatus + HeaderByNumberError bool + HeaderByNumberErrorNumber uint64 + forcedTime time.Time + expectedStatus *blockNotifierPollingInternalStatus + expectedDelay time.Duration + expectedEvent *aggsendertypes.EventNewBlock + }{ + { + name: "initial->receive block", + previousStatus: nil, + HeaderByNumberError: false, + HeaderByNumberErrorNumber: 100, + forcedTime: time0, + expectedStatus: &blockNotifierPollingInternalStatus{ + lastBlockSeen: 100, + lastBlockTime: time0, + }, + expectedDelay: minBlockInterval, + expectedEvent: nil, + }, + { + name: "received block->error", + previousStatus: nil, + HeaderByNumberError: true, + forcedTime: time0, + expectedStatus: &blockNotifierPollingInternalStatus{}, + expectedDelay: minBlockInterval, + expectedEvent: nil, + }, + + { + name: "have block period->receive new block", + previousStatus: &blockNotifierPollingInternalStatus{ + lastBlockSeen: 100, + lastBlockTime: time0, + previousBlockTime: &period0, + }, + HeaderByNumberError: false, + HeaderByNumberErrorNumber: 101, + forcedTime: time1, + expectedStatus: &blockNotifierPollingInternalStatus{ + lastBlockSeen: 101, + lastBlockTime: time1, + previousBlockTime: &period0, + }, + expectedDelay: period0_80percent, + expectedEvent: &aggsendertypes.EventNewBlock{ + BlockNumber: 101, + }, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + testData := newBlockNotifierPollingTestData(t, nil) + + timeNowFunc = func() time.Time { + return tt.forcedTime + } + + if tt.HeaderByNumberError == false { + hdr1 := &types.Header{ + Number: big.NewInt(int64(tt.HeaderByNumberErrorNumber)), + } + testData.ethClientMock.EXPECT().HeaderByNumber(mock.Anything, mock.Anything).Return(hdr1, nil).Once() + } else { + testData.ethClientMock.EXPECT().HeaderByNumber(mock.Anything, mock.Anything).Return(nil, fmt.Errorf("error")).Once() + } + delay, newStatus, event := testData.sut.step(context.TODO(), tt.previousStatus) + require.Equal(t, tt.expectedDelay, delay, "delay") + require.Equal(t, tt.expectedStatus, newStatus, "new_status") + if tt.expectedEvent == nil { + require.Nil(t, event, "send_event") + } else { + require.Equal(t, tt.expectedEvent.BlockNumber, event.BlockNumber, "send_event") + } + }) + } +} + +func TestDelayNoPreviousBLock(t *testing.T) { + testData := newBlockNotifierPollingTestData(t, nil) + status := blockNotifierPollingInternalStatus{ + lastBlockSeen: 100, + } + delay := testData.sut.nextBlockRequestDelay(&status, nil) + require.Equal(t, minBlockInterval, delay) +} + +func TestDelayBLock(t *testing.T) { + testData := newBlockNotifierPollingTestData(t, nil) + pt := time.Second * 10 + status := blockNotifierPollingInternalStatus{ + lastBlockSeen: 100, + previousBlockTime: &pt, + } + delay := testData.sut.nextBlockRequestDelay(&status, nil) + require.Equal(t, minBlockInterval, delay) +} + +func TestNewBlockNotifierPolling(t *testing.T) { + testData := newBlockNotifierPollingTestData(t, nil) + require.NotNil(t, testData.sut) + _, err := NewBlockNotifierPolling(testData.ethClientMock, ConfigBlockNotifierPolling{ + BlockFinalityType: etherman.BlockNumberFinality("invalid"), + }, log.WithFields("test", "test"), nil) + require.Error(t, err) +} + +func TestBlockNotifierPollingString(t *testing.T) { + testData := newBlockNotifierPollingTestData(t, nil) + require.NotEmpty(t, testData.sut.String()) + testData.sut.lastStatus = &blockNotifierPollingInternalStatus{ + lastBlockSeen: 100, + } + require.NotEmpty(t, testData.sut.String()) +} + +func TestBlockNotifierPollingStart(t *testing.T) { + testData := newBlockNotifierPollingTestData(t, nil) + ch := testData.sut.Subscribe("test") + hdr1 := &types.Header{ + Number: big.NewInt(100), + } + testData.ethClientMock.EXPECT().HeaderByNumber(mock.Anything, mock.Anything).Return(hdr1, nil).Once() + hdr2 := &types.Header{ + Number: big.NewInt(101), + } + testData.ethClientMock.EXPECT().HeaderByNumber(mock.Anything, mock.Anything).Return(hdr2, nil).Once() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go testData.sut.Start(ctx) + block := <-ch + require.NotNil(t, block) + require.Equal(t, uint64(101), block.BlockNumber) +} + +type blockNotifierPollingTestData struct { + sut *BlockNotifierPolling + ethClientMock *mocks.EthClient + ctx context.Context +} + +func newBlockNotifierPollingTestData(t *testing.T, config *ConfigBlockNotifierPolling) blockNotifierPollingTestData { + t.Helper() + if config == nil { + config = &ConfigBlockNotifierPolling{ + BlockFinalityType: etherman.LatestBlock, + CheckNewBlockInterval: 0, + } + } + ethClientMock := mocks.NewEthClient(t) + logger := log.WithFields("test", "BlockNotifierPolling") + sut, err := NewBlockNotifierPolling(ethClientMock, *config, logger, nil) + require.NoError(t, err) + return blockNotifierPollingTestData{ + sut: sut, + ethClientMock: ethClientMock, + ctx: context.TODO(), + } +} diff --git a/aggsender/config.go b/aggsender/config.go new file mode 100644 index 00000000..4964ec51 --- /dev/null +++ b/aggsender/config.go @@ -0,0 +1,58 @@ +package aggsender + +import ( + "fmt" + + "github.com/agglayer/aggkit/config/types" +) + +// Config is the configuration for the AggSender +type Config struct { + // StoragePath is the path of the sqlite db on which the AggSender will store the data + StoragePath string `mapstructure:"StoragePath"` + // AggLayerURL is the URL of the AggLayer + AggLayerURL string `mapstructure:"AggLayerURL"` + // AggsenderPrivateKey is the private key which is used to sign certificates + AggsenderPrivateKey types.KeystoreFileConfig `mapstructure:"AggsenderPrivateKey"` + // URLRPCL2 is the URL of the L2 RPC node + URLRPCL2 string `mapstructure:"URLRPCL2"` + // BlockFinality indicates which finality follows AggLayer + BlockFinality string `jsonschema:"enum=LatestBlock, enum=SafeBlock, enum=PendingBlock, enum=FinalizedBlock, enum=EarliestBlock" mapstructure:"BlockFinality"` //nolint:lll + // EpochNotificationPercentage indicates the percentage of the epoch + // the AggSender should send the certificate + // 0 -> Begin + // 50 -> Middle + EpochNotificationPercentage uint `mapstructure:"EpochNotificationPercentage"` + // SaveCertificatesToFilesPath if != "" tells the AggSender to save the certificates to a file in this path + SaveCertificatesToFilesPath string `mapstructure:"SaveCertificatesToFilesPath"` + + // MaxRetriesStoreCertificate is the maximum number of retries to store a certificate + // 0 is infinite + MaxRetriesStoreCertificate int `mapstructure:"MaxRetriesStoreCertificate"` + // DelayBeetweenRetries is the delay between retries: + // is used on store Certificate and also in initial check + DelayBeetweenRetries types.Duration `mapstructure:"DelayBeetweenRetries"` + // KeepCertificatesHistory is a flag to keep the certificates history on storage + KeepCertificatesHistory bool `mapstructure:"KeepCertificatesHistory"` + // MaxCertSize is the maximum size of the certificate (the emitted certificate can be bigger that this size) + // 0 is infinite + MaxCertSize uint `mapstructure:"MaxCertSize"` + // BridgeMetadataAsHash is a flag to import the bridge metadata as hash + BridgeMetadataAsHash bool `mapstructure:"BridgeMetadataAsHash"` + // DryRun is a flag to enable the dry run mode + // in this mode the AggSender will not send the certificates to Agglayer + DryRun bool `mapstructure:"DryRun"` + // EnableRPC is a flag to enable the RPC for aggsender + EnableRPC bool `mapstructure:"EnableRPC"` +} + +// String returns a string representation of the Config +func (c Config) String() string { + return "StoragePath: " + c.StoragePath + "\n" + + "AggLayerURL: " + c.AggLayerURL + "\n" + + "AggsenderPrivateKeyPath: " + c.AggsenderPrivateKey.Path + "\n" + + "URLRPCL2: " + c.URLRPCL2 + "\n" + + "BlockFinality: " + c.BlockFinality + "\n" + + "EpochNotificationPercentage: " + fmt.Sprintf("%d", c.EpochNotificationPercentage) + "\n" + + "SaveCertificatesToFilesPath: " + c.SaveCertificatesToFilesPath + "\n" +} diff --git a/aggsender/db/aggsender_db_storage.go b/aggsender/db/aggsender_db_storage.go new file mode 100644 index 00000000..fb63b81d --- /dev/null +++ b/aggsender/db/aggsender_db_storage.go @@ -0,0 +1,260 @@ +package db + +import ( + "context" + "database/sql" + "errors" + "fmt" + "strings" + + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/aggsender/db/migrations" + "github.com/agglayer/aggkit/aggsender/types" + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/common" + "github.com/russross/meddler" +) + +const errWhileRollbackFormat = "error while rolling back tx: %w" + +// AggSenderStorage is the interface that defines the methods to interact with the storage +type AggSenderStorage interface { + // GetCertificateByHeight returns a certificate by its height + GetCertificateByHeight(height uint64) (*types.CertificateInfo, error) + // GetLastSentCertificate returns the last certificate sent to the aggLayer + GetLastSentCertificate() (*types.CertificateInfo, error) + // SaveLastSentCertificate saves the last certificate sent to the aggLayer + SaveLastSentCertificate(ctx context.Context, certificate types.CertificateInfo) error + // DeleteCertificate deletes a certificate from the storage + DeleteCertificate(ctx context.Context, certificateID common.Hash) error + // GetCertificatesByStatus returns a list of certificates by their status + GetCertificatesByStatus(status []agglayer.CertificateStatus) ([]*types.CertificateInfo, error) + // UpdateCertificate updates certificate in db + UpdateCertificate(ctx context.Context, certificate types.CertificateInfo) error +} + +var _ AggSenderStorage = (*AggSenderSQLStorage)(nil) + +// AggSenderSQLStorageConfig is the configuration for the AggSenderSQLStorage +type AggSenderSQLStorageConfig struct { + DBPath string + KeepCertificatesHistory bool +} + +// AggSenderSQLStorage is the struct that implements the AggSenderStorage interface +type AggSenderSQLStorage struct { + logger *log.Logger + db *sql.DB + cfg AggSenderSQLStorageConfig +} + +// NewAggSenderSQLStorage creates a new AggSenderSQLStorage +func NewAggSenderSQLStorage(logger *log.Logger, cfg AggSenderSQLStorageConfig) (*AggSenderSQLStorage, error) { + db, err := db.NewSQLiteDB(cfg.DBPath) + if err != nil { + return nil, err + } + if err := migrations.RunMigrations(logger, db); err != nil { + return nil, err + } + + return &AggSenderSQLStorage{ + db: db, + logger: logger, + cfg: cfg, + }, nil +} + +func (a *AggSenderSQLStorage) GetCertificatesByStatus( + statuses []agglayer.CertificateStatus) ([]*types.CertificateInfo, error) { + query := "SELECT * FROM certificate_info" + args := make([]interface{}, len(statuses)) + + if len(statuses) > 0 { + placeholders := make([]string, len(statuses)) + // Build the WHERE clause for status filtering + for i := range statuses { + placeholders[i] = fmt.Sprintf("$%d", i+1) + args[i] = statuses[i] + } + + // Build the WHERE clause with the joined placeholders + query += " WHERE status IN (" + strings.Join(placeholders, ", ") + ")" + } + + // Add ordering by creation date (oldest first) + query += " ORDER BY height ASC" + + var certificates []*types.CertificateInfo + if err := meddler.QueryAll(a.db, &certificates, query, args...); err != nil { + return nil, err + } + + return certificates, nil +} + +// GetCertificateByHeight returns a certificate by its height +func (a *AggSenderSQLStorage) GetCertificateByHeight(height uint64) (*types.CertificateInfo, error) { + return getCertificateByHeight(a.db, height) +} + +// getCertificateByHeight returns a certificate by its height using the provided db +func getCertificateByHeight(db db.Querier, + height uint64) (*types.CertificateInfo, error) { + var certificateInfo types.CertificateInfo + if err := meddler.QueryRow(db, &certificateInfo, + "SELECT * FROM certificate_info WHERE height = $1;", height); err != nil { + return nil, getSelectQueryError(height, err) + } + + return &certificateInfo, nil +} + +// GetLastSentCertificate returns the last certificate sent to the aggLayer +func (a *AggSenderSQLStorage) GetLastSentCertificate() (*types.CertificateInfo, error) { + var certificateInfo types.CertificateInfo + if err := meddler.QueryRow(a.db, &certificateInfo, + "SELECT * FROM certificate_info ORDER BY height DESC LIMIT 1;"); err != nil { + return nil, getSelectQueryError(0, err) + } + + return &certificateInfo, nil +} + +// SaveLastSentCertificate saves the last certificate sent to the aggLayer +func (a *AggSenderSQLStorage) SaveLastSentCertificate(ctx context.Context, certificate types.CertificateInfo) error { + tx, err := db.NewTx(ctx, a.db) + if err != nil { + return fmt.Errorf("saveLastSentCertificate NewTx. Err: %w", err) + } + shouldRollback := true + defer func() { + if shouldRollback { + if errRllbck := tx.Rollback(); errRllbck != nil { + a.logger.Errorf(errWhileRollbackFormat, errRllbck) + } + } + }() + + cert, err := getCertificateByHeight(tx, certificate.Height) + if err != nil && !errors.Is(err, db.ErrNotFound) { + return fmt.Errorf("saveLastSentCertificate getCertificateByHeight. Err: %w", err) + } + + if cert != nil { + // we already have a certificate with this height + // we need to delete it before inserting the new one + if err = a.moveCertificateToHistoryOrDelete(tx, cert); err != nil { + return fmt.Errorf("saveLastSentCertificate moveCertificateToHistory Err: %w", err) + } + } + + if err = meddler.Insert(tx, "certificate_info", &certificate); err != nil { + return fmt.Errorf("error inserting certificate info: %w", err) + } + + if err = tx.Commit(); err != nil { + return fmt.Errorf("saveLastSentCertificate commit. Err: %w", err) + } + shouldRollback = false + + a.logger.Debugf("inserted certificate - Height: %d. Hash: %s", certificate.Height, certificate.CertificateID) + + return nil +} + +func (a *AggSenderSQLStorage) moveCertificateToHistoryOrDelete(tx db.Querier, + certificate *types.CertificateInfo) error { + if a.cfg.KeepCertificatesHistory { + a.logger.Debugf("moving certificate to history - new CertificateID: %s", certificate.ID()) + if _, err := tx.Exec(`INSERT INTO certificate_info_history SELECT * FROM certificate_info WHERE height = $1;`, + certificate.Height); err != nil { + return fmt.Errorf("error moving certificate to history: %w", err) + } + } + a.logger.Debugf("deleting certificate - CertificateID: %s", certificate.ID()) + if err := deleteCertificate(tx, certificate.CertificateID); err != nil { + return fmt.Errorf("deleteCertificate %s . Error: %w", certificate.ID(), err) + } + + return nil +} + +// DeleteCertificate deletes a certificate from the storage +func (a *AggSenderSQLStorage) DeleteCertificate(ctx context.Context, certificateID common.Hash) error { + tx, err := db.NewTx(ctx, a.db) + if err != nil { + return err + } + defer func() { + if err != nil { + if errRllbck := tx.Rollback(); errRllbck != nil { + a.logger.Errorf(errWhileRollbackFormat, errRllbck) + } + } + }() + + if err = deleteCertificate(tx, certificateID); err != nil { + return err + } + + if err = tx.Commit(); err != nil { + return err + } + a.logger.Debugf("deleted certificate - CertificateID: %s", certificateID) + return nil +} + +// deleteCertificate deletes a certificate from the storage using the provided db +func deleteCertificate(tx db.Querier, certificateID common.Hash) error { + if _, err := tx.Exec(`DELETE FROM certificate_info WHERE certificate_id = $1;`, certificateID.String()); err != nil { + return fmt.Errorf("error deleting certificate info: %w", err) + } + + return nil +} + +// UpdateCertificate updates a certificate +func (a *AggSenderSQLStorage) UpdateCertificate(ctx context.Context, certificate types.CertificateInfo) error { + tx, err := db.NewTx(ctx, a.db) + if err != nil { + return err + } + shouldRollback := true + defer func() { + if shouldRollback { + if errRllbck := tx.Rollback(); errRllbck != nil { + a.logger.Errorf(errWhileRollbackFormat, errRllbck) + } + } + }() + + if _, err = tx.Exec(`UPDATE certificate_info SET status = $1, updated_at = $2 WHERE certificate_id = $3;`, + certificate.Status, certificate.UpdatedAt, certificate.CertificateID.String()); err != nil { + return fmt.Errorf("error updating certificate info: %w", err) + } + if err = tx.Commit(); err != nil { + return err + } + shouldRollback = false + + a.logger.Debugf("updated certificate status - CertificateID: %s", certificate.CertificateID) + + return nil +} + +func getSelectQueryError(height uint64, err error) error { + errToReturn := err + if errors.Is(err, sql.ErrNoRows) { + if height == 0 { + // height 0 is never sent to the aggLayer + // so we don't return an error in this case + errToReturn = nil + } else { + errToReturn = db.ErrNotFound + } + } + + return errToReturn +} diff --git a/aggsender/db/aggsender_db_storage_test.go b/aggsender/db/aggsender_db_storage_test.go new file mode 100644 index 00000000..2e685dcd --- /dev/null +++ b/aggsender/db/aggsender_db_storage_test.go @@ -0,0 +1,427 @@ +package db + +import ( + "context" + "encoding/json" + "math/big" + "path" + "testing" + "time" + + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/aggsender/types" + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func Test_Storage(t *testing.T) { + ctx := context.Background() + + path := path.Join(t.TempDir(), "aggsenderTest_Storage.sqlite") + log.Debugf("sqlite path: %s", path) + cfg := AggSenderSQLStorageConfig{ + DBPath: path, + KeepCertificatesHistory: true, + } + + storage, err := NewAggSenderSQLStorage(log.WithFields("aggsender-db"), cfg) + require.NoError(t, err) + + updateTime := uint32(time.Now().UTC().UnixMilli()) + + t.Run("SaveLastSentCertificate", func(t *testing.T) { + certificate := types.CertificateInfo{ + Height: 1, + CertificateID: common.HexToHash("0x1"), + NewLocalExitRoot: common.HexToHash("0x2"), + FromBlock: 1, + ToBlock: 2, + Status: agglayer.Settled, + CreatedAt: updateTime, + UpdatedAt: updateTime, + } + require.NoError(t, storage.SaveLastSentCertificate(ctx, certificate)) + + certificateFromDB, err := storage.GetCertificateByHeight(certificate.Height) + require.NoError(t, err) + + require.Equal(t, certificate, *certificateFromDB) + require.NoError(t, storage.clean()) + }) + + t.Run("DeleteCertificate", func(t *testing.T) { + certificate := types.CertificateInfo{ + Height: 2, + CertificateID: common.HexToHash("0x3"), + NewLocalExitRoot: common.HexToHash("0x4"), + FromBlock: 3, + ToBlock: 4, + Status: agglayer.Settled, + CreatedAt: updateTime, + UpdatedAt: updateTime, + } + require.NoError(t, storage.SaveLastSentCertificate(ctx, certificate)) + + require.NoError(t, storage.DeleteCertificate(ctx, certificate.CertificateID)) + + certificateFromDB, err := storage.GetCertificateByHeight(certificate.Height) + require.ErrorIs(t, err, db.ErrNotFound) + require.Nil(t, certificateFromDB) + require.NoError(t, storage.clean()) + }) + + t.Run("GetLastSentCertificate", func(t *testing.T) { + // try getting a certificate that doesn't exist + certificateFromDB, err := storage.GetLastSentCertificate() + require.NoError(t, err) + require.Nil(t, certificateFromDB) + + // try getting a certificate that exists + certificate := types.CertificateInfo{ + Height: 3, + CertificateID: common.HexToHash("0x5"), + NewLocalExitRoot: common.HexToHash("0x6"), + FromBlock: 5, + ToBlock: 6, + Status: agglayer.Pending, + CreatedAt: updateTime, + UpdatedAt: updateTime, + } + require.NoError(t, storage.SaveLastSentCertificate(ctx, certificate)) + + certificateFromDB, err = storage.GetLastSentCertificate() + require.NoError(t, err) + require.NotNil(t, certificateFromDB) + require.Equal(t, certificate, *certificateFromDB) + require.NoError(t, storage.clean()) + }) + + t.Run("GetCertificateByHeight", func(t *testing.T) { + // try getting height 0 + certificateFromDB, err := storage.GetCertificateByHeight(0) + require.NoError(t, err) + require.Nil(t, certificateFromDB) + + // try getting a certificate that doesn't exist + certificateFromDB, err = storage.GetCertificateByHeight(4) + require.ErrorIs(t, err, db.ErrNotFound) + require.Nil(t, certificateFromDB) + + // try getting a certificate that exists + certificate := types.CertificateInfo{ + Height: 11, + CertificateID: common.HexToHash("0x17"), + NewLocalExitRoot: common.HexToHash("0x18"), + FromBlock: 17, + ToBlock: 18, + Status: agglayer.Pending, + CreatedAt: updateTime, + UpdatedAt: updateTime, + } + require.NoError(t, storage.SaveLastSentCertificate(ctx, certificate)) + + certificateFromDB, err = storage.GetCertificateByHeight(certificate.Height) + require.NoError(t, err) + require.NotNil(t, certificateFromDB) + require.Equal(t, certificate, *certificateFromDB) + require.NoError(t, storage.clean()) + }) + + t.Run("GetCertificatesByStatus", func(t *testing.T) { + // Insert some certificates with different statuses + certificates := []*types.CertificateInfo{ + { + Height: 7, + CertificateID: common.HexToHash("0x7"), + NewLocalExitRoot: common.HexToHash("0x8"), + FromBlock: 7, + ToBlock: 8, + Status: agglayer.Settled, + CreatedAt: updateTime, + UpdatedAt: updateTime, + }, + { + Height: 9, + CertificateID: common.HexToHash("0x9"), + NewLocalExitRoot: common.HexToHash("0xA"), + FromBlock: 9, + ToBlock: 10, + Status: agglayer.Pending, + CreatedAt: updateTime, + UpdatedAt: updateTime, + }, + { + Height: 11, + CertificateID: common.HexToHash("0xB"), + NewLocalExitRoot: common.HexToHash("0xC"), + FromBlock: 11, + ToBlock: 12, + Status: agglayer.InError, + CreatedAt: updateTime, + UpdatedAt: updateTime, + }, + } + + for _, cert := range certificates { + require.NoError(t, storage.SaveLastSentCertificate(ctx, *cert)) + } + + // Test fetching certificates with status Settled + statuses := []agglayer.CertificateStatus{agglayer.Settled} + certificatesFromDB, err := storage.GetCertificatesByStatus(statuses) + require.NoError(t, err) + require.Len(t, certificatesFromDB, 1) + require.ElementsMatch(t, []*types.CertificateInfo{certificates[0]}, certificatesFromDB) + + // Test fetching certificates with status Pending + statuses = []agglayer.CertificateStatus{agglayer.Pending} + certificatesFromDB, err = storage.GetCertificatesByStatus(statuses) + require.NoError(t, err) + require.Len(t, certificatesFromDB, 1) + require.ElementsMatch(t, []*types.CertificateInfo{certificates[1]}, certificatesFromDB) + + // Test fetching certificates with status InError + statuses = []agglayer.CertificateStatus{agglayer.InError} + certificatesFromDB, err = storage.GetCertificatesByStatus(statuses) + require.NoError(t, err) + require.Len(t, certificatesFromDB, 1) + require.ElementsMatch(t, []*types.CertificateInfo{certificates[2]}, certificatesFromDB) + + // Test fetching certificates with status InError and Pending + statuses = []agglayer.CertificateStatus{agglayer.InError, agglayer.Pending} + certificatesFromDB, err = storage.GetCertificatesByStatus(statuses) + require.NoError(t, err) + require.Len(t, certificatesFromDB, 2) + require.ElementsMatch(t, []*types.CertificateInfo{certificates[1], certificates[2]}, certificatesFromDB) + + require.NoError(t, storage.clean()) + }) + + t.Run("UpdateCertificateStatus", func(t *testing.T) { + // Insert a certificate + certificate := types.CertificateInfo{ + Height: 13, + RetryCount: 1234, + CertificateID: common.HexToHash("0xD"), + NewLocalExitRoot: common.HexToHash("0xE"), + FromBlock: 13, + ToBlock: 14, + Status: agglayer.Pending, + CreatedAt: updateTime, + UpdatedAt: updateTime, + } + require.NoError(t, storage.SaveLastSentCertificate(ctx, certificate)) + + // Update the status of the certificate + certificate.Status = agglayer.Settled + certificate.UpdatedAt = updateTime + 1 + require.NoError(t, storage.UpdateCertificate(ctx, certificate)) + + // Fetch the certificate and verify the status has been updated + certificateFromDB, err := storage.GetCertificateByHeight(certificate.Height) + require.NoError(t, err) + require.Equal(t, certificate.Status, certificateFromDB.Status, "equal status") + require.Equal(t, certificate.UpdatedAt, certificateFromDB.UpdatedAt, "equal updated at") + + require.NoError(t, storage.clean()) + }) +} + +func Test_SaveLastSentCertificate(t *testing.T) { + ctx := context.Background() + + path := path.Join(t.TempDir(), "aggsenderTest_SaveLastSentCertificate.sqlite") + log.Debugf("sqlite path: %s", path) + cfg := AggSenderSQLStorageConfig{ + DBPath: path, + KeepCertificatesHistory: true, + } + + storage, err := NewAggSenderSQLStorage(log.WithFields("aggsender-db"), cfg) + require.NoError(t, err) + + updateTime := uint32(time.Now().UTC().UnixMilli()) + + t.Run("SaveNewCertificate", func(t *testing.T) { + certificate := types.CertificateInfo{ + Height: 1, + CertificateID: common.HexToHash("0x1"), + NewLocalExitRoot: common.HexToHash("0x2"), + FromBlock: 1, + ToBlock: 2, + Status: agglayer.Settled, + CreatedAt: updateTime, + UpdatedAt: updateTime, + } + require.NoError(t, storage.SaveLastSentCertificate(ctx, certificate)) + + certificateFromDB, err := storage.GetCertificateByHeight(certificate.Height) + require.NoError(t, err) + require.Equal(t, certificate, *certificateFromDB) + require.NoError(t, storage.clean()) + }) + + t.Run("UpdateExistingCertificate", func(t *testing.T) { + certificate := types.CertificateInfo{ + Height: 2, + CertificateID: common.HexToHash("0x3"), + NewLocalExitRoot: common.HexToHash("0x4"), + FromBlock: 3, + ToBlock: 4, + Status: agglayer.InError, + CreatedAt: updateTime, + UpdatedAt: updateTime, + } + require.NoError(t, storage.SaveLastSentCertificate(ctx, certificate)) + + // Update the certificate with the same height + updatedCertificate := types.CertificateInfo{ + Height: 2, + CertificateID: common.HexToHash("0x5"), + NewLocalExitRoot: common.HexToHash("0x6"), + FromBlock: 3, + ToBlock: 6, + Status: agglayer.Pending, + } + require.NoError(t, storage.SaveLastSentCertificate(ctx, updatedCertificate)) + + certificateFromDB, err := storage.GetCertificateByHeight(updatedCertificate.Height) + require.NoError(t, err) + require.Equal(t, updatedCertificate, *certificateFromDB) + require.NoError(t, storage.clean()) + }) + + t.Run("SaveCertificateWithRollback", func(t *testing.T) { + // Simulate an error during the transaction to trigger a rollback + certificate := types.CertificateInfo{ + Height: 3, + CertificateID: common.HexToHash("0x7"), + NewLocalExitRoot: common.HexToHash("0x8"), + FromBlock: 7, + ToBlock: 8, + Status: agglayer.Settled, + CreatedAt: updateTime, + UpdatedAt: updateTime, + } + + // Close the database to force an error + require.NoError(t, storage.db.Close()) + + err := storage.SaveLastSentCertificate(ctx, certificate) + require.Error(t, err) + + // Reopen the database and check that the certificate was not saved + storage.db, err = db.NewSQLiteDB(path) + require.NoError(t, err) + + certificateFromDB, err := storage.GetCertificateByHeight(certificate.Height) + require.ErrorIs(t, err, db.ErrNotFound) + require.Nil(t, certificateFromDB) + require.NoError(t, storage.clean()) + }) + + t.Run("SaveCertificate with raw data", func(t *testing.T) { + certfiicate := &agglayer.SignedCertificate{ + Certificate: &agglayer.Certificate{ + NetworkID: 1, + Height: 1, + PrevLocalExitRoot: common.HexToHash("0x1"), + NewLocalExitRoot: common.HexToHash("0x2"), + Metadata: common.HexToHash("0x3"), + BridgeExits: []*agglayer.BridgeExit{ + { + LeafType: agglayer.LeafTypeAsset, + TokenInfo: &agglayer.TokenInfo{ + OriginNetwork: 1, + OriginTokenAddress: common.HexToAddress("0x1"), + }, + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("0x2"), + Amount: big.NewInt(100), + Metadata: []byte("metadata"), + }, + }, + ImportedBridgeExits: []*agglayer.ImportedBridgeExit{}, + }, + Signature: &agglayer.Signature{ + R: common.HexToHash("0x4"), + S: common.HexToHash("0x5"), + OddParity: false, + }, + } + + raw, err := json.Marshal(certfiicate) + require.NoError(t, err) + + certificate := types.CertificateInfo{ + Height: 1, + CertificateID: common.HexToHash("0x9"), + NewLocalExitRoot: common.HexToHash("0x2"), + FromBlock: 1, + ToBlock: 10, + Status: agglayer.Pending, + CreatedAt: updateTime, + UpdatedAt: updateTime, + SignedCertificate: string(raw), + } + require.NoError(t, storage.SaveLastSentCertificate(ctx, certificate)) + + certificateFromDB, err := storage.GetCertificateByHeight(certificate.Height) + require.NoError(t, err) + require.Equal(t, certificate, *certificateFromDB) + require.Equal(t, raw, []byte(certificateFromDB.SignedCertificate)) + + require.NoError(t, storage.clean()) + }) +} + +func (a *AggSenderSQLStorage) clean() error { + if _, err := a.db.Exec(`DELETE FROM certificate_info;`); err != nil { + return err + } + + return nil +} + +func Test_StoragePreviousLER(t *testing.T) { + ctx := context.TODO() + dbPath := path.Join(t.TempDir(), "Test_StoragePreviousLER.sqlite") + cfg := AggSenderSQLStorageConfig{ + DBPath: dbPath, + KeepCertificatesHistory: true, + } + storage, err := NewAggSenderSQLStorage(log.WithFields("aggsender-db"), cfg) + require.NoError(t, err) + require.NotNil(t, storage) + + certNoLER := types.CertificateInfo{ + Height: 0, + CertificateID: common.HexToHash("0x1"), + Status: agglayer.InError, + NewLocalExitRoot: common.HexToHash("0x2"), + } + err = storage.SaveLastSentCertificate(ctx, certNoLER) + require.NoError(t, err) + + readCertNoLER, err := storage.GetCertificateByHeight(0) + require.NoError(t, err) + require.NotNil(t, readCertNoLER) + require.Equal(t, certNoLER, *readCertNoLER) + + certLER := types.CertificateInfo{ + Height: 1, + CertificateID: common.HexToHash("0x2"), + Status: agglayer.InError, + NewLocalExitRoot: common.HexToHash("0x2"), + PreviousLocalExitRoot: &common.Hash{}, + } + err = storage.SaveLastSentCertificate(ctx, certLER) + require.NoError(t, err) + + readCertWithLER, err := storage.GetCertificateByHeight(1) + require.NoError(t, err) + require.NotNil(t, readCertWithLER) + require.Equal(t, certLER, *readCertWithLER) +} diff --git a/aggsender/db/migrations/0001.sql b/aggsender/db/migrations/0001.sql new file mode 100644 index 00000000..d418f1d8 --- /dev/null +++ b/aggsender/db/migrations/0001.sql @@ -0,0 +1,35 @@ +-- +migrate Down +DROP TABLE IF EXISTS certificate_info; +DROP TABLE IF EXISTS certificate_info_history; +DROP TABLE IF EXISTS certificate_info_history; + +-- +migrate Up +CREATE TABLE certificate_info ( + height INTEGER NOT NULL, + retry_count INTEGER DEFAULT 0, + certificate_id VARCHAR NOT NULL, + status INTEGER NOT NULL, + previous_local_exit_root VARCHAR, + new_local_exit_root VARCHAR NOT NULL, + from_block INTEGER NOT NULL, + to_block INTEGER NOT NULL, + created_at INTEGER NOT NULL, + updated_at INTEGER NOT NULL, + signed_certificate TEXT, + PRIMARY KEY (height) +); + +CREATE TABLE certificate_info_history ( + height INTEGER NOT NULL , + retry_count INTEGER DEFAULT 0, + certificate_id VARCHAR NOT NULL, + status INTEGER NOT NULL, + previous_local_exit_root VARCHAR, + new_local_exit_root VARCHAR NOT NULL, + from_block INTEGER NOT NULL, + to_block INTEGER NOT NULL, + created_at INTEGER NOT NULL, + updated_at INTEGER NOT NULL, + signed_certificate TEXT, + PRIMARY KEY (height, retry_count) +); diff --git a/aggsender/db/migrations/migrations.go b/aggsender/db/migrations/migrations.go new file mode 100644 index 00000000..0c5747a9 --- /dev/null +++ b/aggsender/db/migrations/migrations.go @@ -0,0 +1,24 @@ +package migrations + +import ( + "database/sql" + _ "embed" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/db/types" + "github.com/agglayer/aggkit/log" +) + +//go:embed 0001.sql +var mig001 string + +func RunMigrations(logger *log.Logger, database *sql.DB) error { + migrations := []types.Migration{ + { + ID: "0001", + SQL: mig001, + }, + } + + return db.RunMigrationsDB(logger, database, migrations) +} diff --git a/aggsender/epoch_notifier_per_block.go b/aggsender/epoch_notifier_per_block.go new file mode 100644 index 00000000..ffaf5340 --- /dev/null +++ b/aggsender/epoch_notifier_per_block.go @@ -0,0 +1,217 @@ +package aggsender + +import ( + "context" + "fmt" + + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/aggsender/types" +) + +const ( + maxPercent = 100.0 +) + +type ExtraInfoEventEpoch struct { + PendingBlocks int +} + +func (e *ExtraInfoEventEpoch) String() string { + return fmt.Sprintf("ExtraInfoEventEpoch: pendingBlocks=%d", e.PendingBlocks) +} + +type ConfigEpochNotifierPerBlock struct { + StartingEpochBlock uint64 + NumBlockPerEpoch uint + + // EpochNotificationPercentage + // 0 -> begin new Epoch + // 50 -> middle of epoch + // 100 -> end of epoch (same as 0) + EpochNotificationPercentage uint +} + +func (c *ConfigEpochNotifierPerBlock) String() string { + if c == nil { + return "nil" + } + return fmt.Sprintf("{startEpochBlock=%d, sizeEpoch=%d, threshold=%d%%}", + c.StartingEpochBlock, c.NumBlockPerEpoch, c.EpochNotificationPercentage) +} + +func NewConfigEpochNotifierPerBlock(aggLayer agglayer.AggLayerClientGetEpochConfiguration, + epochNotificationPercentage uint) (*ConfigEpochNotifierPerBlock, error) { + if aggLayer == nil { + return nil, fmt.Errorf("newConfigEpochNotifierPerBlock: aggLayerClient is required") + } + clockConfig, err := aggLayer.GetEpochConfiguration() + if err != nil { + return nil, fmt.Errorf("newConfigEpochNotifierPerBlock: error getting clock configuration from AggLayer: %w", err) + } + return &ConfigEpochNotifierPerBlock{ + StartingEpochBlock: clockConfig.GenesisBlock, + NumBlockPerEpoch: uint(clockConfig.EpochDuration), + EpochNotificationPercentage: epochNotificationPercentage, + }, nil +} + +func (c *ConfigEpochNotifierPerBlock) Validate() error { + if c.NumBlockPerEpoch == 0 { + return fmt.Errorf("numBlockPerEpoch: num block per epoch is required > 0 ") + } + if c.EpochNotificationPercentage >= maxPercent { + return fmt.Errorf("epochNotificationPercentage: must be between 0 and 99") + } + return nil +} + +type EpochNotifierPerBlock struct { + blockNotifier types.BlockNotifier + logger types.Logger + + lastStartingEpochBlock uint64 + + Config ConfigEpochNotifierPerBlock + types.GenericSubscriber[types.EpochEvent] +} + +func NewEpochNotifierPerBlock(blockNotifier types.BlockNotifier, + logger types.Logger, + config ConfigEpochNotifierPerBlock, + subscriber types.GenericSubscriber[types.EpochEvent]) (*EpochNotifierPerBlock, error) { + if subscriber == nil { + subscriber = NewGenericSubscriberImpl[types.EpochEvent]() + } + + err := config.Validate() + if err != nil { + return nil, fmt.Errorf("invalid config: %w", err) + } + return &EpochNotifierPerBlock{ + blockNotifier: blockNotifier, + logger: logger, + lastStartingEpochBlock: config.StartingEpochBlock, + Config: config, + GenericSubscriber: subscriber, + }, nil +} + +func (e *EpochNotifierPerBlock) String() string { + return fmt.Sprintf("EpochNotifierPerBlock: config: %s", e.Config.String()) +} + +// StartAsync starts the notifier in a goroutine +func (e *EpochNotifierPerBlock) StartAsync(ctx context.Context) { + eventNewBlockChannel := e.blockNotifier.Subscribe("EpochNotifierPerBlock") + go e.startInternal(ctx, eventNewBlockChannel) +} + +// Start starts the notifier synchronously +func (e *EpochNotifierPerBlock) Start(ctx context.Context) { + eventNewBlockChannel := e.blockNotifier.Subscribe("EpochNotifierPerBlock") + e.startInternal(ctx, eventNewBlockChannel) +} + +func (e *EpochNotifierPerBlock) startInternal(ctx context.Context, eventNewBlockChannel <-chan types.EventNewBlock) { + status := internalStatus{ + lastBlockSeen: e.Config.StartingEpochBlock, + waitingForEpoch: e.epochNumber(e.Config.StartingEpochBlock), + } + for { + select { + case <-ctx.Done(): + return + case newBlock := <-eventNewBlockChannel: + var event *types.EpochEvent + status, event = e.step(status, newBlock) + if event != nil { + e.logger.Debugf("new Epoch Event: %s", event.String()) + e.GenericSubscriber.Publish(*event) + } + } + } +} + +type internalStatus struct { + lastBlockSeen uint64 + waitingForEpoch uint64 +} + +func (e *EpochNotifierPerBlock) step(status internalStatus, + newBlock types.EventNewBlock) (internalStatus, *types.EpochEvent) { + currentBlock := newBlock.BlockNumber + if currentBlock < e.Config.StartingEpochBlock { + // This is a bit strange, the first epoch is in the future + e.logger.Warnf("Block number %d is before the starting first epoch block %d."+ + " Please check your config", currentBlock, e.Config.StartingEpochBlock) + return status, nil + } + // No new block + if currentBlock <= status.lastBlockSeen { + return status, nil + } + status.lastBlockSeen = currentBlock + + needNotify, closingEpoch := e.isNotificationRequired(currentBlock, status.waitingForEpoch) + percentEpoch := e.percentEpoch(currentBlock) + logFunc := e.logger.Debugf + if needNotify { + logFunc = e.logger.Infof + } + logFunc("New block seen [finality:%s]: %d. blockRate:%s Epoch:%d Percent:%f%% notify:%v config:%s", + newBlock.BlockFinalityType, newBlock.BlockNumber, newBlock.BlockRate, closingEpoch, + percentEpoch*maxPercent, needNotify, e.Config.String()) + if needNotify { + // Notify the epoch has started + info := e.infoEpoch(currentBlock, closingEpoch) + status.waitingForEpoch = closingEpoch + 1 + return status, &types.EpochEvent{ + Epoch: closingEpoch, + ExtraInfo: info, + } + } + return status, nil +} + +func (e *EpochNotifierPerBlock) infoEpoch(currentBlock, newEpochNotified uint64) *ExtraInfoEventEpoch { + nextBlockStartingEpoch := e.endBlockEpoch(newEpochNotified) + return &ExtraInfoEventEpoch{ + PendingBlocks: int(nextBlockStartingEpoch - currentBlock), + } +} +func (e *EpochNotifierPerBlock) percentEpoch(currentBlock uint64) float64 { + epoch := e.epochNumber(currentBlock) + startingBlock := e.startingBlockEpoch(epoch) + elapsedBlocks := currentBlock - startingBlock + return float64(elapsedBlocks) / float64(e.Config.NumBlockPerEpoch) +} +func (e *EpochNotifierPerBlock) isNotificationRequired(currentBlock, lastEpochNotified uint64) (bool, uint64) { + percentEpoch := e.percentEpoch(currentBlock) + thresholdPercent := float64(e.Config.EpochNotificationPercentage) / maxPercent + maxTresholdPercent := float64(e.Config.NumBlockPerEpoch-1) / float64(e.Config.NumBlockPerEpoch) + if thresholdPercent > maxTresholdPercent { + thresholdPercent = maxTresholdPercent + } + if percentEpoch < thresholdPercent { + return false, e.epochNumber(currentBlock) + } + nextEpoch := e.epochNumber(currentBlock) + 1 + return nextEpoch > lastEpochNotified, e.epochNumber(currentBlock) +} + +func (e *EpochNotifierPerBlock) startingBlockEpoch(epoch uint64) uint64 { + if epoch == 0 { + return e.Config.StartingEpochBlock - 1 + } + return e.Config.StartingEpochBlock + ((epoch - 1) * uint64(e.Config.NumBlockPerEpoch)) +} + +func (e *EpochNotifierPerBlock) endBlockEpoch(epoch uint64) uint64 { + return e.startingBlockEpoch(epoch + 1) +} +func (e *EpochNotifierPerBlock) epochNumber(currentBlock uint64) uint64 { + if currentBlock < e.Config.StartingEpochBlock { + return 0 + } + return 1 + ((currentBlock - e.Config.StartingEpochBlock) / uint64(e.Config.NumBlockPerEpoch)) +} diff --git a/aggsender/epoch_notifier_per_block_test.go b/aggsender/epoch_notifier_per_block_test.go new file mode 100644 index 00000000..934c8c10 --- /dev/null +++ b/aggsender/epoch_notifier_per_block_test.go @@ -0,0 +1,230 @@ +package aggsender + +import ( + "context" + "fmt" + "testing" + + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/aggsender/mocks" + "github.com/agglayer/aggkit/aggsender/types" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestConfigEpochNotifierPerBlockString(t *testing.T) { + cfg := ConfigEpochNotifierPerBlock{ + StartingEpochBlock: 123, + NumBlockPerEpoch: 456, + EpochNotificationPercentage: 789, + } + require.Equal(t, "{startEpochBlock=123, sizeEpoch=456, threshold=789%}", cfg.String()) + var cfg2 *ConfigEpochNotifierPerBlock + require.Equal(t, "nil", cfg2.String()) +} + +func TestStartingBlockEpoch(t *testing.T) { + testData := newNotifierPerBlockTestData(t, &ConfigEpochNotifierPerBlock{ + StartingEpochBlock: 9, + NumBlockPerEpoch: 10, + EpochNotificationPercentage: 80, + }) + // EPOCH: ---0 ----+----1 -----+----2 ----+----3 ----+----4 ----+----5 ----+---- + // BLOCK: 9 19 29 39 49 + require.Equal(t, uint64(8), testData.sut.startingBlockEpoch(0)) + require.Equal(t, uint64(9), testData.sut.startingBlockEpoch(1)) + require.Equal(t, uint64(19), testData.sut.startingBlockEpoch(2)) +} + +func TestEpochNotifyPercentageEdgeCase0(t *testing.T) { + testData := newNotifierPerBlockTestData(t, nil) + testData.sut.Config.EpochNotificationPercentage = 0 + notify, epoch := testData.sut.isNotificationRequired(9, 0) + require.True(t, notify) + require.Equal(t, uint64(1), epoch) +} + +// if percent is 99 means at end of epoch, so in a config 0, epoch-size=10, +// 99% means last block of epoch +func TestEpochNotifyPercentageEdgeCase99(t *testing.T) { + testData := newNotifierPerBlockTestData(t, nil) + testData.sut.Config.EpochNotificationPercentage = 99 + notify, epoch := testData.sut.isNotificationRequired(9, 0) + require.True(t, notify) + require.Equal(t, uint64(1), epoch) +} + +func TestEpochStep(t *testing.T) { + testData := newNotifierPerBlockTestData(t, &ConfigEpochNotifierPerBlock{ + StartingEpochBlock: 9, + NumBlockPerEpoch: 10, + EpochNotificationPercentage: 50, + }) + // EPOCH: ---0 ----+----1 -----+----2 ----+----3 ----+----4 ----+----5 ----+---- + // BLOCK: 9 19 29 39 49 + // start EPOCH#1 -> 9 + // end EPOCH#1 -> 19 + // start EPOCH#2 -> 19 + + tests := []struct { + name string + initialStatus internalStatus + blockNumber uint64 + expectedEvent bool + expectedEventEpoch uint64 + expectedEventPendingBlocks int + }{ + { + name: "First block of epoch, no notification until close to end", + initialStatus: internalStatus{lastBlockSeen: 8, waitingForEpoch: 0}, + blockNumber: 9, + expectedEvent: false, + expectedEventEpoch: 1, + expectedEventPendingBlocks: 0, + }, + { + name: "epoch#1 close to end, notify it!", + initialStatus: internalStatus{lastBlockSeen: 17, waitingForEpoch: 0}, + blockNumber: 18, + expectedEvent: true, + expectedEventEpoch: 1, // Finishing epoch 0 + expectedEventPendingBlocks: 1, // 19 - 18 + }, + { + name: "epoch#1 close to end, but already notified", + initialStatus: internalStatus{lastBlockSeen: 17, waitingForEpoch: 2}, + blockNumber: 18, + expectedEvent: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + _, event := testData.sut.step(tt.initialStatus, types.EventNewBlock{BlockNumber: tt.blockNumber, BlockFinalityType: etherman.LatestBlock}) + require.Equal(t, tt.expectedEvent, event != nil) + if event != nil { + require.Equal(t, tt.expectedEventEpoch, event.Epoch, "Epoch") + extraInfo, ok := event.ExtraInfo.(*ExtraInfoEventEpoch) + require.True(t, ok, "ExtraInfo") + require.Equal(t, tt.expectedEventPendingBlocks, extraInfo.PendingBlocks, "PendingBlocks") + } + }) + } +} + +func TestNewConfigEpochNotifierPerBlock(t *testing.T) { + _, err := NewConfigEpochNotifierPerBlock(nil, 1) + require.Error(t, err) + aggLayerMock := agglayer.NewAgglayerClientMock(t) + aggLayerMock.On("GetEpochConfiguration").Return(nil, fmt.Errorf("error")).Once() + _, err = NewConfigEpochNotifierPerBlock(aggLayerMock, 1) + require.Error(t, err) + cfgAggLayer := &agglayer.ClockConfiguration{ + GenesisBlock: 123, + EpochDuration: 456, + } + aggLayerMock.On("GetEpochConfiguration").Return(cfgAggLayer, nil).Once() + cfg, err := NewConfigEpochNotifierPerBlock(aggLayerMock, 1) + require.NoError(t, err) + require.Equal(t, uint64(123), cfg.StartingEpochBlock) + require.Equal(t, uint(456), cfg.NumBlockPerEpoch) +} + +func TestNotifyEpoch(t *testing.T) { + testData := newNotifierPerBlockTestData(t, nil) + ch := testData.sut.Subscribe("test") + chBlocks := make(chan types.EventNewBlock) + testData.blockNotifierMock.EXPECT().Subscribe(mock.Anything).Return(chBlocks) + testData.sut.StartAsync(testData.ctx) + chBlocks <- types.EventNewBlock{BlockNumber: 109, BlockFinalityType: etherman.LatestBlock} + epochEvent := <-ch + require.Equal(t, uint64(11), epochEvent.Epoch) + testData.ctx.Done() +} + +func TestStepSameEpoch(t *testing.T) { + testData := newNotifierPerBlockTestData(t, nil) + status := internalStatus{ + lastBlockSeen: 100, + waitingForEpoch: testData.sut.epochNumber(100), + } + newStatus, _ := testData.sut.step(status, types.EventNewBlock{BlockNumber: 103, BlockFinalityType: etherman.LatestBlock}) + require.Equal(t, uint64(103), newStatus.lastBlockSeen) + require.Equal(t, status.waitingForEpoch, newStatus.waitingForEpoch) +} + +func TestStepNotifyEpoch(t *testing.T) { + testData := newNotifierPerBlockTestData(t, nil) + status := internalStatus{ + lastBlockSeen: 100, + waitingForEpoch: testData.sut.epochNumber(100), + } + status, _ = testData.sut.step(status, types.EventNewBlock{BlockNumber: 109, BlockFinalityType: etherman.LatestBlock}) + require.Equal(t, uint64(109), status.lastBlockSeen) + require.Equal(t, uint64(12), status.waitingForEpoch) +} + +func TestBlockEpochNumber(t *testing.T) { + testData := newNotifierPerBlockTestData(t, &ConfigEpochNotifierPerBlock{ + StartingEpochBlock: 105, + NumBlockPerEpoch: 10, + EpochNotificationPercentage: 1, + }) + require.Equal(t, uint64(0), testData.sut.epochNumber(0)) + require.Equal(t, uint64(0), testData.sut.epochNumber(104)) + require.Equal(t, uint64(1), testData.sut.epochNumber(105)) + require.Equal(t, uint64(1), testData.sut.epochNumber(114)) + require.Equal(t, uint64(2), testData.sut.epochNumber(115)) + require.Equal(t, uint64(2), testData.sut.epochNumber(116)) + require.Equal(t, uint64(2), testData.sut.epochNumber(124)) + require.Equal(t, uint64(3), testData.sut.epochNumber(125)) +} + +func TestBlockBeforeEpoch(t *testing.T) { + testData := newNotifierPerBlockTestData(t, &ConfigEpochNotifierPerBlock{ + StartingEpochBlock: 105, + NumBlockPerEpoch: 10, + EpochNotificationPercentage: 1, + }) + status := internalStatus{ + lastBlockSeen: 104, + waitingForEpoch: testData.sut.epochNumber(104), + } + newStatus, _ := testData.sut.step(status, types.EventNewBlock{BlockNumber: 104, BlockFinalityType: etherman.LatestBlock}) + // We are previous block of first epoch, so we should do nothing + require.Equal(t, status, newStatus) + status = newStatus + // First block of first epoch + newStatus, _ = testData.sut.step(status, types.EventNewBlock{BlockNumber: 105, BlockFinalityType: etherman.LatestBlock}) + require.Equal(t, uint64(105), newStatus.lastBlockSeen) + // Near end first epoch + newStatus, _ = testData.sut.step(status, types.EventNewBlock{BlockNumber: 114, BlockFinalityType: etherman.LatestBlock}) + require.Equal(t, uint64(114), newStatus.lastBlockSeen) +} + +type notifierPerBlockTestData struct { + sut *EpochNotifierPerBlock + blockNotifierMock *mocks.BlockNotifier + ctx context.Context +} + +func newNotifierPerBlockTestData(t *testing.T, config *ConfigEpochNotifierPerBlock) notifierPerBlockTestData { + t.Helper() + if config == nil { + config = &ConfigEpochNotifierPerBlock{ + StartingEpochBlock: 0, + NumBlockPerEpoch: 10, + EpochNotificationPercentage: 50, + } + } + blockNotifierMock := mocks.NewBlockNotifier(t) + logger := log.WithFields("test", "EpochNotifierPerBlock") + sut, err := NewEpochNotifierPerBlock(blockNotifierMock, logger, *config, nil) + require.NoError(t, err) + return notifierPerBlockTestData{ + sut: sut, + blockNotifierMock: blockNotifierMock, + ctx: context.TODO(), + } +} diff --git a/aggsender/generic_subscriber_impl.go b/aggsender/generic_subscriber_impl.go new file mode 100644 index 00000000..e4251449 --- /dev/null +++ b/aggsender/generic_subscriber_impl.go @@ -0,0 +1,33 @@ +package aggsender + +import "sync" + +type GenericSubscriberImpl[T any] struct { + // map of subscribers with names + subs map[chan T]string + mu sync.RWMutex +} + +func NewGenericSubscriberImpl[T any]() *GenericSubscriberImpl[T] { + return &GenericSubscriberImpl[T]{ + subs: make(map[chan T]string), + } +} + +func (g *GenericSubscriberImpl[T]) Subscribe(subscriberName string) <-chan T { + ch := make(chan T) + g.mu.Lock() + defer g.mu.Unlock() + g.subs[ch] = subscriberName + return ch +} + +func (g *GenericSubscriberImpl[T]) Publish(data T) { + g.mu.RLock() + defer g.mu.RUnlock() + for ch := range g.subs { + go func(ch chan T) { + ch <- data + }(ch) + } +} diff --git a/aggsender/mocks/agg_sender_storage.go b/aggsender/mocks/agg_sender_storage.go new file mode 100644 index 00000000..93ca8563 --- /dev/null +++ b/aggsender/mocks/agg_sender_storage.go @@ -0,0 +1,355 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + agglayer "github.com/agglayer/aggkit/agglayer" + common "github.com/ethereum/go-ethereum/common" + + context "context" + + mock "github.com/stretchr/testify/mock" + + types "github.com/agglayer/aggkit/aggsender/types" +) + +// AggSenderStorage is an autogenerated mock type for the AggSenderStorage type +type AggSenderStorage struct { + mock.Mock +} + +type AggSenderStorage_Expecter struct { + mock *mock.Mock +} + +func (_m *AggSenderStorage) EXPECT() *AggSenderStorage_Expecter { + return &AggSenderStorage_Expecter{mock: &_m.Mock} +} + +// DeleteCertificate provides a mock function with given fields: ctx, certificateID +func (_m *AggSenderStorage) DeleteCertificate(ctx context.Context, certificateID common.Hash) error { + ret := _m.Called(ctx, certificateID) + + if len(ret) == 0 { + panic("no return value specified for DeleteCertificate") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) error); ok { + r0 = rf(ctx, certificateID) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AggSenderStorage_DeleteCertificate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteCertificate' +type AggSenderStorage_DeleteCertificate_Call struct { + *mock.Call +} + +// DeleteCertificate is a helper method to define mock.On call +// - ctx context.Context +// - certificateID common.Hash +func (_e *AggSenderStorage_Expecter) DeleteCertificate(ctx interface{}, certificateID interface{}) *AggSenderStorage_DeleteCertificate_Call { + return &AggSenderStorage_DeleteCertificate_Call{Call: _e.mock.On("DeleteCertificate", ctx, certificateID)} +} + +func (_c *AggSenderStorage_DeleteCertificate_Call) Run(run func(ctx context.Context, certificateID common.Hash)) *AggSenderStorage_DeleteCertificate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *AggSenderStorage_DeleteCertificate_Call) Return(_a0 error) *AggSenderStorage_DeleteCertificate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *AggSenderStorage_DeleteCertificate_Call) RunAndReturn(run func(context.Context, common.Hash) error) *AggSenderStorage_DeleteCertificate_Call { + _c.Call.Return(run) + return _c +} + +// GetCertificateByHeight provides a mock function with given fields: height +func (_m *AggSenderStorage) GetCertificateByHeight(height uint64) (*types.CertificateInfo, error) { + ret := _m.Called(height) + + if len(ret) == 0 { + panic("no return value specified for GetCertificateByHeight") + } + + var r0 *types.CertificateInfo + var r1 error + if rf, ok := ret.Get(0).(func(uint64) (*types.CertificateInfo, error)); ok { + return rf(height) + } + if rf, ok := ret.Get(0).(func(uint64) *types.CertificateInfo); ok { + r0 = rf(height) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.CertificateInfo) + } + } + + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(height) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AggSenderStorage_GetCertificateByHeight_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCertificateByHeight' +type AggSenderStorage_GetCertificateByHeight_Call struct { + *mock.Call +} + +// GetCertificateByHeight is a helper method to define mock.On call +// - height uint64 +func (_e *AggSenderStorage_Expecter) GetCertificateByHeight(height interface{}) *AggSenderStorage_GetCertificateByHeight_Call { + return &AggSenderStorage_GetCertificateByHeight_Call{Call: _e.mock.On("GetCertificateByHeight", height)} +} + +func (_c *AggSenderStorage_GetCertificateByHeight_Call) Run(run func(height uint64)) *AggSenderStorage_GetCertificateByHeight_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *AggSenderStorage_GetCertificateByHeight_Call) Return(_a0 *types.CertificateInfo, _a1 error) *AggSenderStorage_GetCertificateByHeight_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AggSenderStorage_GetCertificateByHeight_Call) RunAndReturn(run func(uint64) (*types.CertificateInfo, error)) *AggSenderStorage_GetCertificateByHeight_Call { + _c.Call.Return(run) + return _c +} + +// GetCertificatesByStatus provides a mock function with given fields: status +func (_m *AggSenderStorage) GetCertificatesByStatus(status []agglayer.CertificateStatus) ([]*types.CertificateInfo, error) { + ret := _m.Called(status) + + if len(ret) == 0 { + panic("no return value specified for GetCertificatesByStatus") + } + + var r0 []*types.CertificateInfo + var r1 error + if rf, ok := ret.Get(0).(func([]agglayer.CertificateStatus) ([]*types.CertificateInfo, error)); ok { + return rf(status) + } + if rf, ok := ret.Get(0).(func([]agglayer.CertificateStatus) []*types.CertificateInfo); ok { + r0 = rf(status) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*types.CertificateInfo) + } + } + + if rf, ok := ret.Get(1).(func([]agglayer.CertificateStatus) error); ok { + r1 = rf(status) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AggSenderStorage_GetCertificatesByStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCertificatesByStatus' +type AggSenderStorage_GetCertificatesByStatus_Call struct { + *mock.Call +} + +// GetCertificatesByStatus is a helper method to define mock.On call +// - status []agglayer.CertificateStatus +func (_e *AggSenderStorage_Expecter) GetCertificatesByStatus(status interface{}) *AggSenderStorage_GetCertificatesByStatus_Call { + return &AggSenderStorage_GetCertificatesByStatus_Call{Call: _e.mock.On("GetCertificatesByStatus", status)} +} + +func (_c *AggSenderStorage_GetCertificatesByStatus_Call) Run(run func(status []agglayer.CertificateStatus)) *AggSenderStorage_GetCertificatesByStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]agglayer.CertificateStatus)) + }) + return _c +} + +func (_c *AggSenderStorage_GetCertificatesByStatus_Call) Return(_a0 []*types.CertificateInfo, _a1 error) *AggSenderStorage_GetCertificatesByStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AggSenderStorage_GetCertificatesByStatus_Call) RunAndReturn(run func([]agglayer.CertificateStatus) ([]*types.CertificateInfo, error)) *AggSenderStorage_GetCertificatesByStatus_Call { + _c.Call.Return(run) + return _c +} + +// GetLastSentCertificate provides a mock function with no fields +func (_m *AggSenderStorage) GetLastSentCertificate() (*types.CertificateInfo, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetLastSentCertificate") + } + + var r0 *types.CertificateInfo + var r1 error + if rf, ok := ret.Get(0).(func() (*types.CertificateInfo, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *types.CertificateInfo); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.CertificateInfo) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AggSenderStorage_GetLastSentCertificate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLastSentCertificate' +type AggSenderStorage_GetLastSentCertificate_Call struct { + *mock.Call +} + +// GetLastSentCertificate is a helper method to define mock.On call +func (_e *AggSenderStorage_Expecter) GetLastSentCertificate() *AggSenderStorage_GetLastSentCertificate_Call { + return &AggSenderStorage_GetLastSentCertificate_Call{Call: _e.mock.On("GetLastSentCertificate")} +} + +func (_c *AggSenderStorage_GetLastSentCertificate_Call) Run(run func()) *AggSenderStorage_GetLastSentCertificate_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *AggSenderStorage_GetLastSentCertificate_Call) Return(_a0 *types.CertificateInfo, _a1 error) *AggSenderStorage_GetLastSentCertificate_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AggSenderStorage_GetLastSentCertificate_Call) RunAndReturn(run func() (*types.CertificateInfo, error)) *AggSenderStorage_GetLastSentCertificate_Call { + _c.Call.Return(run) + return _c +} + +// SaveLastSentCertificate provides a mock function with given fields: ctx, certificate +func (_m *AggSenderStorage) SaveLastSentCertificate(ctx context.Context, certificate types.CertificateInfo) error { + ret := _m.Called(ctx, certificate) + + if len(ret) == 0 { + panic("no return value specified for SaveLastSentCertificate") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, types.CertificateInfo) error); ok { + r0 = rf(ctx, certificate) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AggSenderStorage_SaveLastSentCertificate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SaveLastSentCertificate' +type AggSenderStorage_SaveLastSentCertificate_Call struct { + *mock.Call +} + +// SaveLastSentCertificate is a helper method to define mock.On call +// - ctx context.Context +// - certificate types.CertificateInfo +func (_e *AggSenderStorage_Expecter) SaveLastSentCertificate(ctx interface{}, certificate interface{}) *AggSenderStorage_SaveLastSentCertificate_Call { + return &AggSenderStorage_SaveLastSentCertificate_Call{Call: _e.mock.On("SaveLastSentCertificate", ctx, certificate)} +} + +func (_c *AggSenderStorage_SaveLastSentCertificate_Call) Run(run func(ctx context.Context, certificate types.CertificateInfo)) *AggSenderStorage_SaveLastSentCertificate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(types.CertificateInfo)) + }) + return _c +} + +func (_c *AggSenderStorage_SaveLastSentCertificate_Call) Return(_a0 error) *AggSenderStorage_SaveLastSentCertificate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *AggSenderStorage_SaveLastSentCertificate_Call) RunAndReturn(run func(context.Context, types.CertificateInfo) error) *AggSenderStorage_SaveLastSentCertificate_Call { + _c.Call.Return(run) + return _c +} + +// UpdateCertificate provides a mock function with given fields: ctx, certificate +func (_m *AggSenderStorage) UpdateCertificate(ctx context.Context, certificate types.CertificateInfo) error { + ret := _m.Called(ctx, certificate) + + if len(ret) == 0 { + panic("no return value specified for UpdateCertificate") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, types.CertificateInfo) error); ok { + r0 = rf(ctx, certificate) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// AggSenderStorage_UpdateCertificate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateCertificate' +type AggSenderStorage_UpdateCertificate_Call struct { + *mock.Call +} + +// UpdateCertificate is a helper method to define mock.On call +// - ctx context.Context +// - certificate types.CertificateInfo +func (_e *AggSenderStorage_Expecter) UpdateCertificate(ctx interface{}, certificate interface{}) *AggSenderStorage_UpdateCertificate_Call { + return &AggSenderStorage_UpdateCertificate_Call{Call: _e.mock.On("UpdateCertificate", ctx, certificate)} +} + +func (_c *AggSenderStorage_UpdateCertificate_Call) Run(run func(ctx context.Context, certificate types.CertificateInfo)) *AggSenderStorage_UpdateCertificate_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(types.CertificateInfo)) + }) + return _c +} + +func (_c *AggSenderStorage_UpdateCertificate_Call) Return(_a0 error) *AggSenderStorage_UpdateCertificate_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *AggSenderStorage_UpdateCertificate_Call) RunAndReturn(run func(context.Context, types.CertificateInfo) error) *AggSenderStorage_UpdateCertificate_Call { + _c.Call.Return(run) + return _c +} + +// NewAggSenderStorage creates a new instance of AggSenderStorage. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAggSenderStorage(t interface { + mock.TestingT + Cleanup(func()) +}) *AggSenderStorage { + mock := &AggSenderStorage{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/mocks/aggsender_interface.go b/aggsender/mocks/aggsender_interface.go new file mode 100644 index 00000000..bf7b6876 --- /dev/null +++ b/aggsender/mocks/aggsender_interface.go @@ -0,0 +1,80 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + types "github.com/agglayer/aggkit/aggsender/types" + mock "github.com/stretchr/testify/mock" +) + +// AggsenderInterface is an autogenerated mock type for the aggsenderInterface type +type AggsenderInterface struct { + mock.Mock +} + +type AggsenderInterface_Expecter struct { + mock *mock.Mock +} + +func (_m *AggsenderInterface) EXPECT() *AggsenderInterface_Expecter { + return &AggsenderInterface_Expecter{mock: &_m.Mock} +} + +// Info provides a mock function with given fields: +func (_m *AggsenderInterface) Info() types.AggsenderInfo { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Info") + } + + var r0 types.AggsenderInfo + if rf, ok := ret.Get(0).(func() types.AggsenderInfo); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(types.AggsenderInfo) + } + + return r0 +} + +// AggsenderInterface_Info_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Info' +type AggsenderInterface_Info_Call struct { + *mock.Call +} + +// Info is a helper method to define mock.On call +func (_e *AggsenderInterface_Expecter) Info() *AggsenderInterface_Info_Call { + return &AggsenderInterface_Info_Call{Call: _e.mock.On("Info")} +} + +func (_c *AggsenderInterface_Info_Call) Run(run func()) *AggsenderInterface_Info_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *AggsenderInterface_Info_Call) Return(_a0 types.AggsenderInfo) *AggsenderInterface_Info_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *AggsenderInterface_Info_Call) RunAndReturn(run func() types.AggsenderInfo) *AggsenderInterface_Info_Call { + _c.Call.Return(run) + return _c +} + +// NewAggsenderInterface creates a new instance of AggsenderInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAggsenderInterface(t interface { + mock.TestingT + Cleanup(func()) +}) *AggsenderInterface { + mock := &AggsenderInterface{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/mocks/aggsender_storer.go b/aggsender/mocks/aggsender_storer.go new file mode 100644 index 00000000..cc2aa309 --- /dev/null +++ b/aggsender/mocks/aggsender_storer.go @@ -0,0 +1,150 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + types "github.com/agglayer/aggkit/aggsender/types" + mock "github.com/stretchr/testify/mock" +) + +// AggsenderStorer is an autogenerated mock type for the aggsenderStorer type +type AggsenderStorer struct { + mock.Mock +} + +type AggsenderStorer_Expecter struct { + mock *mock.Mock +} + +func (_m *AggsenderStorer) EXPECT() *AggsenderStorer_Expecter { + return &AggsenderStorer_Expecter{mock: &_m.Mock} +} + +// GetCertificateByHeight provides a mock function with given fields: height +func (_m *AggsenderStorer) GetCertificateByHeight(height uint64) (*types.CertificateInfo, error) { + ret := _m.Called(height) + + if len(ret) == 0 { + panic("no return value specified for GetCertificateByHeight") + } + + var r0 *types.CertificateInfo + var r1 error + if rf, ok := ret.Get(0).(func(uint64) (*types.CertificateInfo, error)); ok { + return rf(height) + } + if rf, ok := ret.Get(0).(func(uint64) *types.CertificateInfo); ok { + r0 = rf(height) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.CertificateInfo) + } + } + + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(height) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AggsenderStorer_GetCertificateByHeight_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCertificateByHeight' +type AggsenderStorer_GetCertificateByHeight_Call struct { + *mock.Call +} + +// GetCertificateByHeight is a helper method to define mock.On call +// - height uint64 +func (_e *AggsenderStorer_Expecter) GetCertificateByHeight(height interface{}) *AggsenderStorer_GetCertificateByHeight_Call { + return &AggsenderStorer_GetCertificateByHeight_Call{Call: _e.mock.On("GetCertificateByHeight", height)} +} + +func (_c *AggsenderStorer_GetCertificateByHeight_Call) Run(run func(height uint64)) *AggsenderStorer_GetCertificateByHeight_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *AggsenderStorer_GetCertificateByHeight_Call) Return(_a0 *types.CertificateInfo, _a1 error) *AggsenderStorer_GetCertificateByHeight_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AggsenderStorer_GetCertificateByHeight_Call) RunAndReturn(run func(uint64) (*types.CertificateInfo, error)) *AggsenderStorer_GetCertificateByHeight_Call { + _c.Call.Return(run) + return _c +} + +// GetLastSentCertificate provides a mock function with given fields: +func (_m *AggsenderStorer) GetLastSentCertificate() (*types.CertificateInfo, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetLastSentCertificate") + } + + var r0 *types.CertificateInfo + var r1 error + if rf, ok := ret.Get(0).(func() (*types.CertificateInfo, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *types.CertificateInfo); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.CertificateInfo) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// AggsenderStorer_GetLastSentCertificate_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLastSentCertificate' +type AggsenderStorer_GetLastSentCertificate_Call struct { + *mock.Call +} + +// GetLastSentCertificate is a helper method to define mock.On call +func (_e *AggsenderStorer_Expecter) GetLastSentCertificate() *AggsenderStorer_GetLastSentCertificate_Call { + return &AggsenderStorer_GetLastSentCertificate_Call{Call: _e.mock.On("GetLastSentCertificate")} +} + +func (_c *AggsenderStorer_GetLastSentCertificate_Call) Run(run func()) *AggsenderStorer_GetLastSentCertificate_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *AggsenderStorer_GetLastSentCertificate_Call) Return(_a0 *types.CertificateInfo, _a1 error) *AggsenderStorer_GetLastSentCertificate_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *AggsenderStorer_GetLastSentCertificate_Call) RunAndReturn(run func() (*types.CertificateInfo, error)) *AggsenderStorer_GetLastSentCertificate_Call { + _c.Call.Return(run) + return _c +} + +// NewAggsenderStorer creates a new instance of AggsenderStorer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAggsenderStorer(t interface { + mock.TestingT + Cleanup(func()) +}) *AggsenderStorer { + mock := &AggsenderStorer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/mocks/block_notifier.go b/aggsender/mocks/block_notifier.go new file mode 100644 index 00000000..9b8db6fa --- /dev/null +++ b/aggsender/mocks/block_notifier.go @@ -0,0 +1,128 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + types "github.com/agglayer/aggkit/aggsender/types" + mock "github.com/stretchr/testify/mock" +) + +// BlockNotifier is an autogenerated mock type for the BlockNotifier type +type BlockNotifier struct { + mock.Mock +} + +type BlockNotifier_Expecter struct { + mock *mock.Mock +} + +func (_m *BlockNotifier) EXPECT() *BlockNotifier_Expecter { + return &BlockNotifier_Expecter{mock: &_m.Mock} +} + +// String provides a mock function with no fields +func (_m *BlockNotifier) String() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for String") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// BlockNotifier_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String' +type BlockNotifier_String_Call struct { + *mock.Call +} + +// String is a helper method to define mock.On call +func (_e *BlockNotifier_Expecter) String() *BlockNotifier_String_Call { + return &BlockNotifier_String_Call{Call: _e.mock.On("String")} +} + +func (_c *BlockNotifier_String_Call) Run(run func()) *BlockNotifier_String_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *BlockNotifier_String_Call) Return(_a0 string) *BlockNotifier_String_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *BlockNotifier_String_Call) RunAndReturn(run func() string) *BlockNotifier_String_Call { + _c.Call.Return(run) + return _c +} + +// Subscribe provides a mock function with given fields: id +func (_m *BlockNotifier) Subscribe(id string) <-chan types.EventNewBlock { + ret := _m.Called(id) + + if len(ret) == 0 { + panic("no return value specified for Subscribe") + } + + var r0 <-chan types.EventNewBlock + if rf, ok := ret.Get(0).(func(string) <-chan types.EventNewBlock); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(<-chan types.EventNewBlock) + } + } + + return r0 +} + +// BlockNotifier_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' +type BlockNotifier_Subscribe_Call struct { + *mock.Call +} + +// Subscribe is a helper method to define mock.On call +// - id string +func (_e *BlockNotifier_Expecter) Subscribe(id interface{}) *BlockNotifier_Subscribe_Call { + return &BlockNotifier_Subscribe_Call{Call: _e.mock.On("Subscribe", id)} +} + +func (_c *BlockNotifier_Subscribe_Call) Run(run func(id string)) *BlockNotifier_Subscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *BlockNotifier_Subscribe_Call) Return(_a0 <-chan types.EventNewBlock) *BlockNotifier_Subscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *BlockNotifier_Subscribe_Call) RunAndReturn(run func(string) <-chan types.EventNewBlock) *BlockNotifier_Subscribe_Call { + _c.Call.Return(run) + return _c +} + +// NewBlockNotifier creates a new instance of BlockNotifier. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewBlockNotifier(t interface { + mock.TestingT + Cleanup(func()) +}) *BlockNotifier { + mock := &BlockNotifier{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/mocks/epoch_notifier.go b/aggsender/mocks/epoch_notifier.go new file mode 100644 index 00000000..793722d1 --- /dev/null +++ b/aggsender/mocks/epoch_notifier.go @@ -0,0 +1,163 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + types "github.com/agglayer/aggkit/aggsender/types" + mock "github.com/stretchr/testify/mock" +) + +// EpochNotifier is an autogenerated mock type for the EpochNotifier type +type EpochNotifier struct { + mock.Mock +} + +type EpochNotifier_Expecter struct { + mock *mock.Mock +} + +func (_m *EpochNotifier) EXPECT() *EpochNotifier_Expecter { + return &EpochNotifier_Expecter{mock: &_m.Mock} +} + +// Start provides a mock function with given fields: ctx +func (_m *EpochNotifier) Start(ctx context.Context) { + _m.Called(ctx) +} + +// EpochNotifier_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +type EpochNotifier_Start_Call struct { + *mock.Call +} + +// Start is a helper method to define mock.On call +// - ctx context.Context +func (_e *EpochNotifier_Expecter) Start(ctx interface{}) *EpochNotifier_Start_Call { + return &EpochNotifier_Start_Call{Call: _e.mock.On("Start", ctx)} +} + +func (_c *EpochNotifier_Start_Call) Run(run func(ctx context.Context)) *EpochNotifier_Start_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EpochNotifier_Start_Call) Return() *EpochNotifier_Start_Call { + _c.Call.Return() + return _c +} + +func (_c *EpochNotifier_Start_Call) RunAndReturn(run func(context.Context)) *EpochNotifier_Start_Call { + _c.Run(run) + return _c +} + +// String provides a mock function with no fields +func (_m *EpochNotifier) String() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for String") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// EpochNotifier_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String' +type EpochNotifier_String_Call struct { + *mock.Call +} + +// String is a helper method to define mock.On call +func (_e *EpochNotifier_Expecter) String() *EpochNotifier_String_Call { + return &EpochNotifier_String_Call{Call: _e.mock.On("String")} +} + +func (_c *EpochNotifier_String_Call) Run(run func()) *EpochNotifier_String_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EpochNotifier_String_Call) Return(_a0 string) *EpochNotifier_String_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EpochNotifier_String_Call) RunAndReturn(run func() string) *EpochNotifier_String_Call { + _c.Call.Return(run) + return _c +} + +// Subscribe provides a mock function with given fields: id +func (_m *EpochNotifier) Subscribe(id string) <-chan types.EpochEvent { + ret := _m.Called(id) + + if len(ret) == 0 { + panic("no return value specified for Subscribe") + } + + var r0 <-chan types.EpochEvent + if rf, ok := ret.Get(0).(func(string) <-chan types.EpochEvent); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(<-chan types.EpochEvent) + } + } + + return r0 +} + +// EpochNotifier_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' +type EpochNotifier_Subscribe_Call struct { + *mock.Call +} + +// Subscribe is a helper method to define mock.On call +// - id string +func (_e *EpochNotifier_Expecter) Subscribe(id interface{}) *EpochNotifier_Subscribe_Call { + return &EpochNotifier_Subscribe_Call{Call: _e.mock.On("Subscribe", id)} +} + +func (_c *EpochNotifier_Subscribe_Call) Run(run func(id string)) *EpochNotifier_Subscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *EpochNotifier_Subscribe_Call) Return(_a0 <-chan types.EpochEvent) *EpochNotifier_Subscribe_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EpochNotifier_Subscribe_Call) RunAndReturn(run func(string) <-chan types.EpochEvent) *EpochNotifier_Subscribe_Call { + _c.Call.Return(run) + return _c +} + +// NewEpochNotifier creates a new instance of EpochNotifier. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEpochNotifier(t interface { + mock.TestingT + Cleanup(func()) +}) *EpochNotifier { + mock := &EpochNotifier{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/mocks/eth_client.go b/aggsender/mocks/eth_client.go new file mode 100644 index 00000000..6a68de41 --- /dev/null +++ b/aggsender/mocks/eth_client.go @@ -0,0 +1,154 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + coretypes "github.com/ethereum/go-ethereum/core/types" + + mock "github.com/stretchr/testify/mock" +) + +// EthClient is an autogenerated mock type for the EthClient type +type EthClient struct { + mock.Mock +} + +type EthClient_Expecter struct { + mock *mock.Mock +} + +func (_m *EthClient) EXPECT() *EthClient_Expecter { + return &EthClient_Expecter{mock: &_m.Mock} +} + +// BlockNumber provides a mock function with given fields: ctx +func (_m *EthClient) BlockNumber(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for BlockNumber") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClient_BlockNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockNumber' +type EthClient_BlockNumber_Call struct { + *mock.Call +} + +// BlockNumber is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthClient_Expecter) BlockNumber(ctx interface{}) *EthClient_BlockNumber_Call { + return &EthClient_BlockNumber_Call{Call: _e.mock.On("BlockNumber", ctx)} +} + +func (_c *EthClient_BlockNumber_Call) Run(run func(ctx context.Context)) *EthClient_BlockNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthClient_BlockNumber_Call) Return(_a0 uint64, _a1 error) *EthClient_BlockNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClient_BlockNumber_Call) RunAndReturn(run func(context.Context) (uint64, error)) *EthClient_BlockNumber_Call { + _c.Call.Return(run) + return _c +} + +// HeaderByNumber provides a mock function with given fields: ctx, number +func (_m *EthClient) HeaderByNumber(ctx context.Context, number *big.Int) (*coretypes.Header, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for HeaderByNumber") + } + + var r0 *coretypes.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*coretypes.Header, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *coretypes.Header); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*coretypes.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClient_HeaderByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByNumber' +type EthClient_HeaderByNumber_Call struct { + *mock.Call +} + +// HeaderByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *EthClient_Expecter) HeaderByNumber(ctx interface{}, number interface{}) *EthClient_HeaderByNumber_Call { + return &EthClient_HeaderByNumber_Call{Call: _e.mock.On("HeaderByNumber", ctx, number)} +} + +func (_c *EthClient_HeaderByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *EthClient_HeaderByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *EthClient_HeaderByNumber_Call) Return(_a0 *coretypes.Header, _a1 error) *EthClient_HeaderByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClient_HeaderByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*coretypes.Header, error)) *EthClient_HeaderByNumber_Call { + _c.Call.Return(run) + return _c +} + +// NewEthClient creates a new instance of EthClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthClient(t interface { + mock.TestingT + Cleanup(func()) +}) *EthClient { + mock := &EthClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/mocks/generic_subscriber.go b/aggsender/mocks/generic_subscriber.go new file mode 100644 index 00000000..59a27642 --- /dev/null +++ b/aggsender/mocks/generic_subscriber.go @@ -0,0 +1,113 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// GenericSubscriber is an autogenerated mock type for the GenericSubscriber type +type GenericSubscriber[T interface{}] struct { + mock.Mock +} + +type GenericSubscriber_Expecter[T interface{}] struct { + mock *mock.Mock +} + +func (_m *GenericSubscriber[T]) EXPECT() *GenericSubscriber_Expecter[T] { + return &GenericSubscriber_Expecter[T]{mock: &_m.Mock} +} + +// Publish provides a mock function with given fields: data +func (_m *GenericSubscriber[T]) Publish(data T) { + _m.Called(data) +} + +// GenericSubscriber_Publish_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Publish' +type GenericSubscriber_Publish_Call[T interface{}] struct { + *mock.Call +} + +// Publish is a helper method to define mock.On call +// - data T +func (_e *GenericSubscriber_Expecter[T]) Publish(data interface{}) *GenericSubscriber_Publish_Call[T] { + return &GenericSubscriber_Publish_Call[T]{Call: _e.mock.On("Publish", data)} +} + +func (_c *GenericSubscriber_Publish_Call[T]) Run(run func(data T)) *GenericSubscriber_Publish_Call[T] { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(T)) + }) + return _c +} + +func (_c *GenericSubscriber_Publish_Call[T]) Return() *GenericSubscriber_Publish_Call[T] { + _c.Call.Return() + return _c +} + +func (_c *GenericSubscriber_Publish_Call[T]) RunAndReturn(run func(T)) *GenericSubscriber_Publish_Call[T] { + _c.Run(run) + return _c +} + +// Subscribe provides a mock function with given fields: subscriberName +func (_m *GenericSubscriber[T]) Subscribe(subscriberName string) <-chan T { + ret := _m.Called(subscriberName) + + if len(ret) == 0 { + panic("no return value specified for Subscribe") + } + + var r0 <-chan T + if rf, ok := ret.Get(0).(func(string) <-chan T); ok { + r0 = rf(subscriberName) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(<-chan T) + } + } + + return r0 +} + +// GenericSubscriber_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' +type GenericSubscriber_Subscribe_Call[T interface{}] struct { + *mock.Call +} + +// Subscribe is a helper method to define mock.On call +// - subscriberName string +func (_e *GenericSubscriber_Expecter[T]) Subscribe(subscriberName interface{}) *GenericSubscriber_Subscribe_Call[T] { + return &GenericSubscriber_Subscribe_Call[T]{Call: _e.mock.On("Subscribe", subscriberName)} +} + +func (_c *GenericSubscriber_Subscribe_Call[T]) Run(run func(subscriberName string)) *GenericSubscriber_Subscribe_Call[T] { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *GenericSubscriber_Subscribe_Call[T]) Return(_a0 <-chan T) *GenericSubscriber_Subscribe_Call[T] { + _c.Call.Return(_a0) + return _c +} + +func (_c *GenericSubscriber_Subscribe_Call[T]) RunAndReturn(run func(string) <-chan T) *GenericSubscriber_Subscribe_Call[T] { + _c.Call.Return(run) + return _c +} + +// NewGenericSubscriber creates a new instance of GenericSubscriber. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewGenericSubscriber[T interface{}](t interface { + mock.TestingT + Cleanup(func()) +}) *GenericSubscriber[T] { + mock := &GenericSubscriber[T]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/mocks/l1_info_tree_syncer.go b/aggsender/mocks/l1_info_tree_syncer.go new file mode 100644 index 00000000..85c17bc6 --- /dev/null +++ b/aggsender/mocks/l1_info_tree_syncer.go @@ -0,0 +1,217 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + l1infotreesync "github.com/agglayer/aggkit/l1infotreesync" + + mock "github.com/stretchr/testify/mock" + + treetypes "github.com/agglayer/aggkit/tree/types" +) + +// L1InfoTreeSyncer is an autogenerated mock type for the L1InfoTreeSyncer type +type L1InfoTreeSyncer struct { + mock.Mock +} + +type L1InfoTreeSyncer_Expecter struct { + mock *mock.Mock +} + +func (_m *L1InfoTreeSyncer) EXPECT() *L1InfoTreeSyncer_Expecter { + return &L1InfoTreeSyncer_Expecter{mock: &_m.Mock} +} + +// GetInfoByGlobalExitRoot provides a mock function with given fields: globalExitRoot +func (_m *L1InfoTreeSyncer) GetInfoByGlobalExitRoot(globalExitRoot common.Hash) (*l1infotreesync.L1InfoTreeLeaf, error) { + ret := _m.Called(globalExitRoot) + + if len(ret) == 0 { + panic("no return value specified for GetInfoByGlobalExitRoot") + } + + var r0 *l1infotreesync.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func(common.Hash) (*l1infotreesync.L1InfoTreeLeaf, error)); ok { + return rf(globalExitRoot) + } + if rf, ok := ret.Get(0).(func(common.Hash) *l1infotreesync.L1InfoTreeLeaf); ok { + r0 = rf(globalExitRoot) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func(common.Hash) error); ok { + r1 = rf(globalExitRoot) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetInfoByGlobalExitRoot' +type L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call struct { + *mock.Call +} + +// GetInfoByGlobalExitRoot is a helper method to define mock.On call +// - globalExitRoot common.Hash +func (_e *L1InfoTreeSyncer_Expecter) GetInfoByGlobalExitRoot(globalExitRoot interface{}) *L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call { + return &L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call{Call: _e.mock.On("GetInfoByGlobalExitRoot", globalExitRoot)} +} + +func (_c *L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call) Run(run func(globalExitRoot common.Hash)) *L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash)) + }) + return _c +} + +func (_c *L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call) Return(_a0 *l1infotreesync.L1InfoTreeLeaf, _a1 error) *L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call) RunAndReturn(run func(common.Hash) (*l1infotreesync.L1InfoTreeLeaf, error)) *L1InfoTreeSyncer_GetInfoByGlobalExitRoot_Call { + _c.Call.Return(run) + return _c +} + +// GetL1InfoTreeMerkleProofFromIndexToRoot provides a mock function with given fields: ctx, index, root +func (_m *L1InfoTreeSyncer) GetL1InfoTreeMerkleProofFromIndexToRoot(ctx context.Context, index uint32, root common.Hash) (treetypes.Proof, error) { + ret := _m.Called(ctx, index, root) + + if len(ret) == 0 { + panic("no return value specified for GetL1InfoTreeMerkleProofFromIndexToRoot") + } + + var r0 treetypes.Proof + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32, common.Hash) (treetypes.Proof, error)); ok { + return rf(ctx, index, root) + } + if rf, ok := ret.Get(0).(func(context.Context, uint32, common.Hash) treetypes.Proof); ok { + r0 = rf(ctx, index, root) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(treetypes.Proof) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint32, common.Hash) error); ok { + r1 = rf(ctx, index, root) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetL1InfoTreeMerkleProofFromIndexToRoot' +type L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call struct { + *mock.Call +} + +// GetL1InfoTreeMerkleProofFromIndexToRoot is a helper method to define mock.On call +// - ctx context.Context +// - index uint32 +// - root common.Hash +func (_e *L1InfoTreeSyncer_Expecter) GetL1InfoTreeMerkleProofFromIndexToRoot(ctx interface{}, index interface{}, root interface{}) *L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call { + return &L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call{Call: _e.mock.On("GetL1InfoTreeMerkleProofFromIndexToRoot", ctx, index, root)} +} + +func (_c *L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call) Run(run func(ctx context.Context, index uint32, root common.Hash)) *L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint32), args[2].(common.Hash)) + }) + return _c +} + +func (_c *L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call) Return(_a0 treetypes.Proof, _a1 error) *L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call) RunAndReturn(run func(context.Context, uint32, common.Hash) (treetypes.Proof, error)) *L1InfoTreeSyncer_GetL1InfoTreeMerkleProofFromIndexToRoot_Call { + _c.Call.Return(run) + return _c +} + +// GetL1InfoTreeRootByIndex provides a mock function with given fields: ctx, index +func (_m *L1InfoTreeSyncer) GetL1InfoTreeRootByIndex(ctx context.Context, index uint32) (treetypes.Root, error) { + ret := _m.Called(ctx, index) + + if len(ret) == 0 { + panic("no return value specified for GetL1InfoTreeRootByIndex") + } + + var r0 treetypes.Root + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32) (treetypes.Root, error)); ok { + return rf(ctx, index) + } + if rf, ok := ret.Get(0).(func(context.Context, uint32) treetypes.Root); ok { + r0 = rf(ctx, index) + } else { + r0 = ret.Get(0).(treetypes.Root) + } + + if rf, ok := ret.Get(1).(func(context.Context, uint32) error); ok { + r1 = rf(ctx, index) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetL1InfoTreeRootByIndex' +type L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call struct { + *mock.Call +} + +// GetL1InfoTreeRootByIndex is a helper method to define mock.On call +// - ctx context.Context +// - index uint32 +func (_e *L1InfoTreeSyncer_Expecter) GetL1InfoTreeRootByIndex(ctx interface{}, index interface{}) *L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call { + return &L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call{Call: _e.mock.On("GetL1InfoTreeRootByIndex", ctx, index)} +} + +func (_c *L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call) Run(run func(ctx context.Context, index uint32)) *L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint32)) + }) + return _c +} + +func (_c *L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call) Return(_a0 treetypes.Root, _a1 error) *L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call) RunAndReturn(run func(context.Context, uint32) (treetypes.Root, error)) *L1InfoTreeSyncer_GetL1InfoTreeRootByIndex_Call { + _c.Call.Return(run) + return _c +} + +// NewL1InfoTreeSyncer creates a new instance of L1InfoTreeSyncer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewL1InfoTreeSyncer(t interface { + mock.TestingT + Cleanup(func()) +}) *L1InfoTreeSyncer { + mock := &L1InfoTreeSyncer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/mocks/l2_bridge_syncer.go b/aggsender/mocks/l2_bridge_syncer.go new file mode 100644 index 00000000..3f562a5b --- /dev/null +++ b/aggsender/mocks/l2_bridge_syncer.go @@ -0,0 +1,423 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + bridgesync "github.com/agglayer/aggkit/bridgesync" + common "github.com/ethereum/go-ethereum/common" + + context "context" + + etherman "github.com/agglayer/aggkit/etherman" + + mock "github.com/stretchr/testify/mock" + + treetypes "github.com/agglayer/aggkit/tree/types" +) + +// L2BridgeSyncer is an autogenerated mock type for the L2BridgeSyncer type +type L2BridgeSyncer struct { + mock.Mock +} + +type L2BridgeSyncer_Expecter struct { + mock *mock.Mock +} + +func (_m *L2BridgeSyncer) EXPECT() *L2BridgeSyncer_Expecter { + return &L2BridgeSyncer_Expecter{mock: &_m.Mock} +} + +// BlockFinality provides a mock function with no fields +func (_m *L2BridgeSyncer) BlockFinality() etherman.BlockNumberFinality { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for BlockFinality") + } + + var r0 etherman.BlockNumberFinality + if rf, ok := ret.Get(0).(func() etherman.BlockNumberFinality); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(etherman.BlockNumberFinality) + } + + return r0 +} + +// L2BridgeSyncer_BlockFinality_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockFinality' +type L2BridgeSyncer_BlockFinality_Call struct { + *mock.Call +} + +// BlockFinality is a helper method to define mock.On call +func (_e *L2BridgeSyncer_Expecter) BlockFinality() *L2BridgeSyncer_BlockFinality_Call { + return &L2BridgeSyncer_BlockFinality_Call{Call: _e.mock.On("BlockFinality")} +} + +func (_c *L2BridgeSyncer_BlockFinality_Call) Run(run func()) *L2BridgeSyncer_BlockFinality_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *L2BridgeSyncer_BlockFinality_Call) Return(_a0 etherman.BlockNumberFinality) *L2BridgeSyncer_BlockFinality_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *L2BridgeSyncer_BlockFinality_Call) RunAndReturn(run func() etherman.BlockNumberFinality) *L2BridgeSyncer_BlockFinality_Call { + _c.Call.Return(run) + return _c +} + +// GetBlockByLER provides a mock function with given fields: ctx, ler +func (_m *L2BridgeSyncer) GetBlockByLER(ctx context.Context, ler common.Hash) (uint64, error) { + ret := _m.Called(ctx, ler) + + if len(ret) == 0 { + panic("no return value specified for GetBlockByLER") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (uint64, error)); ok { + return rf(ctx, ler) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) uint64); ok { + r0 = rf(ctx, ler) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, ler) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2BridgeSyncer_GetBlockByLER_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBlockByLER' +type L2BridgeSyncer_GetBlockByLER_Call struct { + *mock.Call +} + +// GetBlockByLER is a helper method to define mock.On call +// - ctx context.Context +// - ler common.Hash +func (_e *L2BridgeSyncer_Expecter) GetBlockByLER(ctx interface{}, ler interface{}) *L2BridgeSyncer_GetBlockByLER_Call { + return &L2BridgeSyncer_GetBlockByLER_Call{Call: _e.mock.On("GetBlockByLER", ctx, ler)} +} + +func (_c *L2BridgeSyncer_GetBlockByLER_Call) Run(run func(ctx context.Context, ler common.Hash)) *L2BridgeSyncer_GetBlockByLER_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *L2BridgeSyncer_GetBlockByLER_Call) Return(_a0 uint64, _a1 error) *L2BridgeSyncer_GetBlockByLER_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2BridgeSyncer_GetBlockByLER_Call) RunAndReturn(run func(context.Context, common.Hash) (uint64, error)) *L2BridgeSyncer_GetBlockByLER_Call { + _c.Call.Return(run) + return _c +} + +// GetBridgesPublished provides a mock function with given fields: ctx, fromBlock, toBlock +func (_m *L2BridgeSyncer) GetBridgesPublished(ctx context.Context, fromBlock uint64, toBlock uint64) ([]bridgesync.Bridge, error) { + ret := _m.Called(ctx, fromBlock, toBlock) + + if len(ret) == 0 { + panic("no return value specified for GetBridgesPublished") + } + + var r0 []bridgesync.Bridge + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64) ([]bridgesync.Bridge, error)); ok { + return rf(ctx, fromBlock, toBlock) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64) []bridgesync.Bridge); ok { + r0 = rf(ctx, fromBlock, toBlock) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]bridgesync.Bridge) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64, uint64) error); ok { + r1 = rf(ctx, fromBlock, toBlock) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2BridgeSyncer_GetBridgesPublished_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBridgesPublished' +type L2BridgeSyncer_GetBridgesPublished_Call struct { + *mock.Call +} + +// GetBridgesPublished is a helper method to define mock.On call +// - ctx context.Context +// - fromBlock uint64 +// - toBlock uint64 +func (_e *L2BridgeSyncer_Expecter) GetBridgesPublished(ctx interface{}, fromBlock interface{}, toBlock interface{}) *L2BridgeSyncer_GetBridgesPublished_Call { + return &L2BridgeSyncer_GetBridgesPublished_Call{Call: _e.mock.On("GetBridgesPublished", ctx, fromBlock, toBlock)} +} + +func (_c *L2BridgeSyncer_GetBridgesPublished_Call) Run(run func(ctx context.Context, fromBlock uint64, toBlock uint64)) *L2BridgeSyncer_GetBridgesPublished_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(uint64)) + }) + return _c +} + +func (_c *L2BridgeSyncer_GetBridgesPublished_Call) Return(_a0 []bridgesync.Bridge, _a1 error) *L2BridgeSyncer_GetBridgesPublished_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2BridgeSyncer_GetBridgesPublished_Call) RunAndReturn(run func(context.Context, uint64, uint64) ([]bridgesync.Bridge, error)) *L2BridgeSyncer_GetBridgesPublished_Call { + _c.Call.Return(run) + return _c +} + +// GetClaims provides a mock function with given fields: ctx, fromBlock, toBlock +func (_m *L2BridgeSyncer) GetClaims(ctx context.Context, fromBlock uint64, toBlock uint64) ([]bridgesync.Claim, error) { + ret := _m.Called(ctx, fromBlock, toBlock) + + if len(ret) == 0 { + panic("no return value specified for GetClaims") + } + + var r0 []bridgesync.Claim + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64) ([]bridgesync.Claim, error)); ok { + return rf(ctx, fromBlock, toBlock) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64) []bridgesync.Claim); ok { + r0 = rf(ctx, fromBlock, toBlock) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]bridgesync.Claim) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64, uint64) error); ok { + r1 = rf(ctx, fromBlock, toBlock) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2BridgeSyncer_GetClaims_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetClaims' +type L2BridgeSyncer_GetClaims_Call struct { + *mock.Call +} + +// GetClaims is a helper method to define mock.On call +// - ctx context.Context +// - fromBlock uint64 +// - toBlock uint64 +func (_e *L2BridgeSyncer_Expecter) GetClaims(ctx interface{}, fromBlock interface{}, toBlock interface{}) *L2BridgeSyncer_GetClaims_Call { + return &L2BridgeSyncer_GetClaims_Call{Call: _e.mock.On("GetClaims", ctx, fromBlock, toBlock)} +} + +func (_c *L2BridgeSyncer_GetClaims_Call) Run(run func(ctx context.Context, fromBlock uint64, toBlock uint64)) *L2BridgeSyncer_GetClaims_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(uint64)) + }) + return _c +} + +func (_c *L2BridgeSyncer_GetClaims_Call) Return(_a0 []bridgesync.Claim, _a1 error) *L2BridgeSyncer_GetClaims_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2BridgeSyncer_GetClaims_Call) RunAndReturn(run func(context.Context, uint64, uint64) ([]bridgesync.Claim, error)) *L2BridgeSyncer_GetClaims_Call { + _c.Call.Return(run) + return _c +} + +// GetExitRootByIndex provides a mock function with given fields: ctx, index +func (_m *L2BridgeSyncer) GetExitRootByIndex(ctx context.Context, index uint32) (treetypes.Root, error) { + ret := _m.Called(ctx, index) + + if len(ret) == 0 { + panic("no return value specified for GetExitRootByIndex") + } + + var r0 treetypes.Root + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32) (treetypes.Root, error)); ok { + return rf(ctx, index) + } + if rf, ok := ret.Get(0).(func(context.Context, uint32) treetypes.Root); ok { + r0 = rf(ctx, index) + } else { + r0 = ret.Get(0).(treetypes.Root) + } + + if rf, ok := ret.Get(1).(func(context.Context, uint32) error); ok { + r1 = rf(ctx, index) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2BridgeSyncer_GetExitRootByIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetExitRootByIndex' +type L2BridgeSyncer_GetExitRootByIndex_Call struct { + *mock.Call +} + +// GetExitRootByIndex is a helper method to define mock.On call +// - ctx context.Context +// - index uint32 +func (_e *L2BridgeSyncer_Expecter) GetExitRootByIndex(ctx interface{}, index interface{}) *L2BridgeSyncer_GetExitRootByIndex_Call { + return &L2BridgeSyncer_GetExitRootByIndex_Call{Call: _e.mock.On("GetExitRootByIndex", ctx, index)} +} + +func (_c *L2BridgeSyncer_GetExitRootByIndex_Call) Run(run func(ctx context.Context, index uint32)) *L2BridgeSyncer_GetExitRootByIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint32)) + }) + return _c +} + +func (_c *L2BridgeSyncer_GetExitRootByIndex_Call) Return(_a0 treetypes.Root, _a1 error) *L2BridgeSyncer_GetExitRootByIndex_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2BridgeSyncer_GetExitRootByIndex_Call) RunAndReturn(run func(context.Context, uint32) (treetypes.Root, error)) *L2BridgeSyncer_GetExitRootByIndex_Call { + _c.Call.Return(run) + return _c +} + +// GetLastProcessedBlock provides a mock function with given fields: ctx +func (_m *L2BridgeSyncer) GetLastProcessedBlock(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetLastProcessedBlock") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2BridgeSyncer_GetLastProcessedBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLastProcessedBlock' +type L2BridgeSyncer_GetLastProcessedBlock_Call struct { + *mock.Call +} + +// GetLastProcessedBlock is a helper method to define mock.On call +// - ctx context.Context +func (_e *L2BridgeSyncer_Expecter) GetLastProcessedBlock(ctx interface{}) *L2BridgeSyncer_GetLastProcessedBlock_Call { + return &L2BridgeSyncer_GetLastProcessedBlock_Call{Call: _e.mock.On("GetLastProcessedBlock", ctx)} +} + +func (_c *L2BridgeSyncer_GetLastProcessedBlock_Call) Run(run func(ctx context.Context)) *L2BridgeSyncer_GetLastProcessedBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *L2BridgeSyncer_GetLastProcessedBlock_Call) Return(_a0 uint64, _a1 error) *L2BridgeSyncer_GetLastProcessedBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2BridgeSyncer_GetLastProcessedBlock_Call) RunAndReturn(run func(context.Context) (uint64, error)) *L2BridgeSyncer_GetLastProcessedBlock_Call { + _c.Call.Return(run) + return _c +} + +// OriginNetwork provides a mock function with no fields +func (_m *L2BridgeSyncer) OriginNetwork() uint32 { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for OriginNetwork") + } + + var r0 uint32 + if rf, ok := ret.Get(0).(func() uint32); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint32) + } + + return r0 +} + +// L2BridgeSyncer_OriginNetwork_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'OriginNetwork' +type L2BridgeSyncer_OriginNetwork_Call struct { + *mock.Call +} + +// OriginNetwork is a helper method to define mock.On call +func (_e *L2BridgeSyncer_Expecter) OriginNetwork() *L2BridgeSyncer_OriginNetwork_Call { + return &L2BridgeSyncer_OriginNetwork_Call{Call: _e.mock.On("OriginNetwork")} +} + +func (_c *L2BridgeSyncer_OriginNetwork_Call) Run(run func()) *L2BridgeSyncer_OriginNetwork_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *L2BridgeSyncer_OriginNetwork_Call) Return(_a0 uint32) *L2BridgeSyncer_OriginNetwork_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *L2BridgeSyncer_OriginNetwork_Call) RunAndReturn(run func() uint32) *L2BridgeSyncer_OriginNetwork_Call { + _c.Call.Return(run) + return _c +} + +// NewL2BridgeSyncer creates a new instance of L2BridgeSyncer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewL2BridgeSyncer(t interface { + mock.TestingT + Cleanup(func()) +}) *L2BridgeSyncer { + mock := &L2BridgeSyncer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/mocks/logger.go b/aggsender/mocks/logger.go new file mode 100644 index 00000000..b2a845ca --- /dev/null +++ b/aggsender/mocks/logger.go @@ -0,0 +1,420 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import mock "github.com/stretchr/testify/mock" + +// Logger is an autogenerated mock type for the Logger type +type Logger struct { + mock.Mock +} + +type Logger_Expecter struct { + mock *mock.Mock +} + +func (_m *Logger) EXPECT() *Logger_Expecter { + return &Logger_Expecter{mock: &_m.Mock} +} + +// Debug provides a mock function with given fields: args +func (_m *Logger) Debug(args ...interface{}) { + var _ca []interface{} + _ca = append(_ca, args...) + _m.Called(_ca...) +} + +// Logger_Debug_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Debug' +type Logger_Debug_Call struct { + *mock.Call +} + +// Debug is a helper method to define mock.On call +// - args ...interface{} +func (_e *Logger_Expecter) Debug(args ...interface{}) *Logger_Debug_Call { + return &Logger_Debug_Call{Call: _e.mock.On("Debug", + append([]interface{}{}, args...)...)} +} + +func (_c *Logger_Debug_Call) Run(run func(args ...interface{})) *Logger_Debug_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-0) + for i, a := range args[0:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(variadicArgs...) + }) + return _c +} + +func (_c *Logger_Debug_Call) Return() *Logger_Debug_Call { + _c.Call.Return() + return _c +} + +func (_c *Logger_Debug_Call) RunAndReturn(run func(...interface{})) *Logger_Debug_Call { + _c.Run(run) + return _c +} + +// Debugf provides a mock function with given fields: format, args +func (_m *Logger) Debugf(format string, args ...interface{}) { + var _ca []interface{} + _ca = append(_ca, format) + _ca = append(_ca, args...) + _m.Called(_ca...) +} + +// Logger_Debugf_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Debugf' +type Logger_Debugf_Call struct { + *mock.Call +} + +// Debugf is a helper method to define mock.On call +// - format string +// - args ...interface{} +func (_e *Logger_Expecter) Debugf(format interface{}, args ...interface{}) *Logger_Debugf_Call { + return &Logger_Debugf_Call{Call: _e.mock.On("Debugf", + append([]interface{}{format}, args...)...)} +} + +func (_c *Logger_Debugf_Call) Run(run func(format string, args ...interface{})) *Logger_Debugf_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *Logger_Debugf_Call) Return() *Logger_Debugf_Call { + _c.Call.Return() + return _c +} + +func (_c *Logger_Debugf_Call) RunAndReturn(run func(string, ...interface{})) *Logger_Debugf_Call { + _c.Run(run) + return _c +} + +// Error provides a mock function with given fields: args +func (_m *Logger) Error(args ...interface{}) { + var _ca []interface{} + _ca = append(_ca, args...) + _m.Called(_ca...) +} + +// Logger_Error_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Error' +type Logger_Error_Call struct { + *mock.Call +} + +// Error is a helper method to define mock.On call +// - args ...interface{} +func (_e *Logger_Expecter) Error(args ...interface{}) *Logger_Error_Call { + return &Logger_Error_Call{Call: _e.mock.On("Error", + append([]interface{}{}, args...)...)} +} + +func (_c *Logger_Error_Call) Run(run func(args ...interface{})) *Logger_Error_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-0) + for i, a := range args[0:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(variadicArgs...) + }) + return _c +} + +func (_c *Logger_Error_Call) Return() *Logger_Error_Call { + _c.Call.Return() + return _c +} + +func (_c *Logger_Error_Call) RunAndReturn(run func(...interface{})) *Logger_Error_Call { + _c.Run(run) + return _c +} + +// Errorf provides a mock function with given fields: format, args +func (_m *Logger) Errorf(format string, args ...interface{}) { + var _ca []interface{} + _ca = append(_ca, format) + _ca = append(_ca, args...) + _m.Called(_ca...) +} + +// Logger_Errorf_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Errorf' +type Logger_Errorf_Call struct { + *mock.Call +} + +// Errorf is a helper method to define mock.On call +// - format string +// - args ...interface{} +func (_e *Logger_Expecter) Errorf(format interface{}, args ...interface{}) *Logger_Errorf_Call { + return &Logger_Errorf_Call{Call: _e.mock.On("Errorf", + append([]interface{}{format}, args...)...)} +} + +func (_c *Logger_Errorf_Call) Run(run func(format string, args ...interface{})) *Logger_Errorf_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *Logger_Errorf_Call) Return() *Logger_Errorf_Call { + _c.Call.Return() + return _c +} + +func (_c *Logger_Errorf_Call) RunAndReturn(run func(string, ...interface{})) *Logger_Errorf_Call { + _c.Run(run) + return _c +} + +// Fatalf provides a mock function with given fields: format, args +func (_m *Logger) Fatalf(format string, args ...interface{}) { + var _ca []interface{} + _ca = append(_ca, format) + _ca = append(_ca, args...) + _m.Called(_ca...) +} + +// Logger_Fatalf_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Fatalf' +type Logger_Fatalf_Call struct { + *mock.Call +} + +// Fatalf is a helper method to define mock.On call +// - format string +// - args ...interface{} +func (_e *Logger_Expecter) Fatalf(format interface{}, args ...interface{}) *Logger_Fatalf_Call { + return &Logger_Fatalf_Call{Call: _e.mock.On("Fatalf", + append([]interface{}{format}, args...)...)} +} + +func (_c *Logger_Fatalf_Call) Run(run func(format string, args ...interface{})) *Logger_Fatalf_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *Logger_Fatalf_Call) Return() *Logger_Fatalf_Call { + _c.Call.Return() + return _c +} + +func (_c *Logger_Fatalf_Call) RunAndReturn(run func(string, ...interface{})) *Logger_Fatalf_Call { + _c.Run(run) + return _c +} + +// Info provides a mock function with given fields: args +func (_m *Logger) Info(args ...interface{}) { + var _ca []interface{} + _ca = append(_ca, args...) + _m.Called(_ca...) +} + +// Logger_Info_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Info' +type Logger_Info_Call struct { + *mock.Call +} + +// Info is a helper method to define mock.On call +// - args ...interface{} +func (_e *Logger_Expecter) Info(args ...interface{}) *Logger_Info_Call { + return &Logger_Info_Call{Call: _e.mock.On("Info", + append([]interface{}{}, args...)...)} +} + +func (_c *Logger_Info_Call) Run(run func(args ...interface{})) *Logger_Info_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-0) + for i, a := range args[0:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(variadicArgs...) + }) + return _c +} + +func (_c *Logger_Info_Call) Return() *Logger_Info_Call { + _c.Call.Return() + return _c +} + +func (_c *Logger_Info_Call) RunAndReturn(run func(...interface{})) *Logger_Info_Call { + _c.Run(run) + return _c +} + +// Infof provides a mock function with given fields: format, args +func (_m *Logger) Infof(format string, args ...interface{}) { + var _ca []interface{} + _ca = append(_ca, format) + _ca = append(_ca, args...) + _m.Called(_ca...) +} + +// Logger_Infof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Infof' +type Logger_Infof_Call struct { + *mock.Call +} + +// Infof is a helper method to define mock.On call +// - format string +// - args ...interface{} +func (_e *Logger_Expecter) Infof(format interface{}, args ...interface{}) *Logger_Infof_Call { + return &Logger_Infof_Call{Call: _e.mock.On("Infof", + append([]interface{}{format}, args...)...)} +} + +func (_c *Logger_Infof_Call) Run(run func(format string, args ...interface{})) *Logger_Infof_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *Logger_Infof_Call) Return() *Logger_Infof_Call { + _c.Call.Return() + return _c +} + +func (_c *Logger_Infof_Call) RunAndReturn(run func(string, ...interface{})) *Logger_Infof_Call { + _c.Run(run) + return _c +} + +// Warn provides a mock function with given fields: args +func (_m *Logger) Warn(args ...interface{}) { + var _ca []interface{} + _ca = append(_ca, args...) + _m.Called(_ca...) +} + +// Logger_Warn_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Warn' +type Logger_Warn_Call struct { + *mock.Call +} + +// Warn is a helper method to define mock.On call +// - args ...interface{} +func (_e *Logger_Expecter) Warn(args ...interface{}) *Logger_Warn_Call { + return &Logger_Warn_Call{Call: _e.mock.On("Warn", + append([]interface{}{}, args...)...)} +} + +func (_c *Logger_Warn_Call) Run(run func(args ...interface{})) *Logger_Warn_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-0) + for i, a := range args[0:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(variadicArgs...) + }) + return _c +} + +func (_c *Logger_Warn_Call) Return() *Logger_Warn_Call { + _c.Call.Return() + return _c +} + +func (_c *Logger_Warn_Call) RunAndReturn(run func(...interface{})) *Logger_Warn_Call { + _c.Run(run) + return _c +} + +// Warnf provides a mock function with given fields: format, args +func (_m *Logger) Warnf(format string, args ...interface{}) { + var _ca []interface{} + _ca = append(_ca, format) + _ca = append(_ca, args...) + _m.Called(_ca...) +} + +// Logger_Warnf_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Warnf' +type Logger_Warnf_Call struct { + *mock.Call +} + +// Warnf is a helper method to define mock.On call +// - format string +// - args ...interface{} +func (_e *Logger_Expecter) Warnf(format interface{}, args ...interface{}) *Logger_Warnf_Call { + return &Logger_Warnf_Call{Call: _e.mock.On("Warnf", + append([]interface{}{format}, args...)...)} +} + +func (_c *Logger_Warnf_Call) Run(run func(format string, args ...interface{})) *Logger_Warnf_Call { + _c.Call.Run(func(args mock.Arguments) { + variadicArgs := make([]interface{}, len(args)-1) + for i, a := range args[1:] { + if a != nil { + variadicArgs[i] = a.(interface{}) + } + } + run(args[0].(string), variadicArgs...) + }) + return _c +} + +func (_c *Logger_Warnf_Call) Return() *Logger_Warnf_Call { + _c.Call.Return() + return _c +} + +func (_c *Logger_Warnf_Call) RunAndReturn(run func(string, ...interface{})) *Logger_Warnf_Call { + _c.Run(run) + return _c +} + +// NewLogger creates a new instance of Logger. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewLogger(t interface { + mock.TestingT + Cleanup(func()) +}) *Logger { + mock := &Logger{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/aggsender/rpc/aggsender_rpc.go b/aggsender/rpc/aggsender_rpc.go new file mode 100644 index 00000000..8b08a509 --- /dev/null +++ b/aggsender/rpc/aggsender_rpc.go @@ -0,0 +1,79 @@ +package aggsenderrpc + +import ( + "fmt" + + "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/agglayer/aggkit/aggsender/types" + "github.com/agglayer/aggkit/log" +) + +const ( + base10 = 10 +) + +type aggsenderStorer interface { + GetCertificateByHeight(height uint64) (*types.CertificateInfo, error) + GetLastSentCertificate() (*types.CertificateInfo, error) +} + +type aggsenderInterface interface { + Info() types.AggsenderInfo +} + +// AggsenderRPC is the RPC interface for the aggsender +type AggsenderRPC struct { + logger *log.Logger + storage aggsenderStorer + aggsender aggsenderInterface +} + +func NewAggsenderRPC( + logger *log.Logger, + storage aggsenderStorer, + aggsender aggsenderInterface, +) *AggsenderRPC { + return &AggsenderRPC{ + logger: logger, + storage: storage, + aggsender: aggsender, + } +} + +// Status returns the status of the aggsender +// curl -X POST http://localhost:5576/ -H "Con -application/json" \ +// -d '{"method":"aggsender_status", "params":[], "id":1}' +func (b *AggsenderRPC) Status() (interface{}, rpc.Error) { + info := b.aggsender.Info() + return info, nil +} + +// GetCertificateHeaderPerHeight returns the certificate header for the given height +// if param is `nil` it returns the last sent certificate +// latest: +// +// curl -X POST http://localhost:5576/ -H "Con -application/json" \ +// -d '{"method":"aggsender_getCertificateHeaderPerHeight", "params":[], "id":1}' +// +// specific height: +// +// curl -X POST http://localhost:5576/ -H "Con -application/json" \ +// -d '{"method":"aggsender_getCertificateHeaderPerHeight", "params":[$height], "id":1}' +func (b *AggsenderRPC) GetCertificateHeaderPerHeight(height *uint64) (interface{}, rpc.Error) { + var ( + certInfo *types.CertificateInfo + err error + ) + if height == nil { + certInfo, err = b.storage.GetLastSentCertificate() + } else { + certInfo, err = b.storage.GetCertificateByHeight(*height) + } + if err != nil { + return nil, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("error getting certificate by height: %v", err)) + } + if certInfo == nil { + return nil, rpc.NewRPCError(rpc.NotFoundErrorCode, "certificate not found") + } + return certInfo, nil +} diff --git a/aggsender/rpc/aggsender_rpc_test.go b/aggsender/rpc/aggsender_rpc_test.go new file mode 100644 index 00000000..d8662161 --- /dev/null +++ b/aggsender/rpc/aggsender_rpc_test.go @@ -0,0 +1,93 @@ +package aggsenderrpc + +import ( + "fmt" + "testing" + + "github.com/agglayer/aggkit/aggsender/mocks" + "github.com/agglayer/aggkit/aggsender/types" + "github.com/stretchr/testify/require" +) + +func TestAggsenderRPCStatus(t *testing.T) { + testData := newAggsenderData(t) + testData.mockAggsender.EXPECT().Info().Return(types.AggsenderInfo{}) + res, err := testData.sut.Status() + require.NoError(t, err) + require.NotNil(t, res) +} + +func TestAggsenderRPCGetCertificateHeaderPerHeight(t *testing.T) { + testData := newAggsenderData(t) + height := uint64(1) + cases := []struct { + name string + height *uint64 + certResult *types.CertificateInfo + certError error + expectedError string + expectedNil bool + }{ + { + name: "latest, no error", + certResult: &types.CertificateInfo{}, + certError: nil, + }, + { + name: "latest,no error, no cert", + certResult: nil, + certError: nil, + expectedError: "not found", + expectedNil: true, + }, + { + name: "latest,error", + certResult: &types.CertificateInfo{}, + certError: fmt.Errorf("my_error"), + expectedError: "my_error", + expectedNil: true, + }, + { + name: "hight, no error", + height: &height, + certResult: &types.CertificateInfo{}, + certError: nil, + }, + } + + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + if tt.height == nil { + testData.mockStore.EXPECT().GetLastSentCertificate().Return(tt.certResult, tt.certError).Once() + } else { + testData.mockStore.EXPECT().GetCertificateByHeight(*tt.height).Return(tt.certResult, tt.certError).Once() + } + res, err := testData.sut.GetCertificateHeaderPerHeight(tt.height) + if tt.expectedError != "" { + require.Error(t, err) + require.Contains(t, err.Error(), tt.expectedError) + } else { + require.NoError(t, err) + } + if tt.expectedNil { + require.Nil(t, res) + } else { + require.NotNil(t, res) + } + }) + } +} + +type aggsenderRPCTestData struct { + sut *AggsenderRPC + mockStore *mocks.AggsenderStorer + mockAggsender *mocks.AggsenderInterface +} + +func newAggsenderData(t *testing.T) *aggsenderRPCTestData { + t.Helper() + mockStore := mocks.NewAggsenderStorer(t) + mockAggsender := mocks.NewAggsenderInterface(t) + sut := NewAggsenderRPC(nil, mockStore, mockAggsender) + return &aggsenderRPCTestData{sut, mockStore, mockAggsender} +} diff --git a/aggsender/rpcclient/client.go b/aggsender/rpcclient/client.go new file mode 100644 index 00000000..0f4a1882 --- /dev/null +++ b/aggsender/rpcclient/client.go @@ -0,0 +1,58 @@ +package rpcclient + +import ( + "encoding/json" + "fmt" + + "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/agglayer/aggkit/aggsender/types" +) + +var jSONRPCCall = rpc.JSONRPCCall + +// Client wraps all the available endpoints of the data abailability committee node server +type Client struct { + url string +} + +func NewClient(url string) *Client { + return &Client{ + url: url, + } +} + +func (c *Client) GetStatus() (*types.AggsenderInfo, error) { + response, err := jSONRPCCall(c.url, "aggsender_status") + if err != nil { + return nil, err + } + + // Check if the response is an error + if response.Error != nil { + return nil, fmt.Errorf("error in the response calling aggsender_status: %v", response.Error) + } + result := types.AggsenderInfo{} + err = json.Unmarshal(response.Result, &result) + if err != nil { + return nil, err + } + return &result, nil +} + +func (c *Client) GetCertificateHeaderPerHeight(height *uint64) (*types.CertificateInfo, error) { + response, err := jSONRPCCall(c.url, "aggsender_getCertificateHeaderPerHeight", height) + if err != nil { + return nil, err + } + + // Check if the response is an error + if response.Error != nil { + return nil, fmt.Errorf("error in the response calling aggsender_getCertificateHeaderPerHeight: %v", response.Error) + } + cert := types.CertificateInfo{} + err = json.Unmarshal(response.Result, &cert) + if err != nil { + return nil, err + } + return &cert, nil +} diff --git a/aggsender/rpcclient/client_test.go b/aggsender/rpcclient/client_test.go new file mode 100644 index 00000000..6b24372d --- /dev/null +++ b/aggsender/rpcclient/client_test.go @@ -0,0 +1,45 @@ +package rpcclient + +import ( + "encoding/json" + "testing" + + "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/agglayer/aggkit/aggsender/types" + "github.com/stretchr/testify/require" +) + +func TestGetCertificateHeaderPerHeight(t *testing.T) { + sut := NewClient("url") + height := uint64(1) + responseCert := types.CertificateInfo{} + responseCertJSON, err := json.Marshal(responseCert) + require.NoError(t, err) + response := rpc.Response{ + Result: responseCertJSON, + } + jSONRPCCall = func(_, _ string, _ ...interface{}) (rpc.Response, error) { + return response, nil + } + cert, err := sut.GetCertificateHeaderPerHeight(&height) + require.NoError(t, err) + require.NotNil(t, cert) + require.Equal(t, responseCert, *cert) +} + +func TestGetStatus(t *testing.T) { + sut := NewClient("url") + responseData := types.AggsenderInfo{} + responseDataJSON, err := json.Marshal(responseData) + require.NoError(t, err) + response := rpc.Response{ + Result: responseDataJSON, + } + jSONRPCCall = func(_, _ string, _ ...interface{}) (rpc.Response, error) { + return response, nil + } + result, err := sut.GetStatus() + require.NoError(t, err) + require.NotNil(t, result) + require.Equal(t, responseData, *result) +} diff --git a/aggsender/types/block_notifier.go b/aggsender/types/block_notifier.go new file mode 100644 index 00000000..43cd680d --- /dev/null +++ b/aggsender/types/block_notifier.go @@ -0,0 +1,20 @@ +package types + +import ( + "time" + + "github.com/agglayer/aggkit/etherman" +) + +type EventNewBlock struct { + BlockNumber uint64 + BlockFinalityType etherman.BlockNumberFinality + BlockRate time.Duration +} + +// BlockNotifier is the interface that wraps the basic methods to notify a new block. +type BlockNotifier interface { + // NotifyEpochStarted notifies the epoch has started. + Subscribe(id string) <-chan EventNewBlock + String() string +} diff --git a/aggsender/types/certificate_build_params.go b/aggsender/types/certificate_build_params.go new file mode 100644 index 00000000..2d2f0ae0 --- /dev/null +++ b/aggsender/types/certificate_build_params.go @@ -0,0 +1,112 @@ +package types + +import ( + "fmt" + + "github.com/agglayer/aggkit/bridgesync" +) + +const ( + EstimatedSizeBridgeExit = 230 + EstimatedSizeClaim = 8000 + byteArrayJSONSizeFactor = 1.5 +) + +// CertificateBuildParams is a struct that holds the parameters to build a certificate +type CertificateBuildParams struct { + FromBlock uint64 + ToBlock uint64 + Bridges []bridgesync.Bridge + Claims []bridgesync.Claim + CreatedAt uint32 +} + +func (c *CertificateBuildParams) String() string { + return fmt.Sprintf("FromBlock: %d, ToBlock: %d, numBridges: %d, numClaims: %d, createdAt: %d", + c.FromBlock, c.ToBlock, c.NumberOfBridges(), c.NumberOfClaims(), c.CreatedAt) +} + +// Range create a new CertificateBuildParams with the given range +func (c *CertificateBuildParams) Range(fromBlock, toBlock uint64) (*CertificateBuildParams, error) { + if c.FromBlock == fromBlock && c.ToBlock == toBlock { + return c, nil + } + if c.FromBlock > fromBlock || c.ToBlock < toBlock { + return nil, fmt.Errorf("invalid range") + } + newCert := &CertificateBuildParams{ + FromBlock: fromBlock, + ToBlock: toBlock, + Bridges: make([]bridgesync.Bridge, 0), + Claims: make([]bridgesync.Claim, 0), + } + + for _, bridge := range c.Bridges { + if bridge.BlockNum >= fromBlock && bridge.BlockNum <= toBlock { + newCert.Bridges = append(newCert.Bridges, bridge) + } + } + + for _, claim := range c.Claims { + if claim.BlockNum >= fromBlock && claim.BlockNum <= toBlock { + newCert.Claims = append(newCert.Claims, claim) + } + } + return newCert, nil +} + +// NumberOfBridges returns the number of bridges in the certificate +func (c *CertificateBuildParams) NumberOfBridges() int { + if c == nil { + return 0 + } + return len(c.Bridges) +} + +// NumberOfClaims returns the number of claims in the certificate +func (c *CertificateBuildParams) NumberOfClaims() int { + if c == nil { + return 0 + } + return len(c.Claims) +} + +// NumberOfBlocks returns the number of blocks in the certificate +func (c *CertificateBuildParams) NumberOfBlocks() int { + if c == nil { + return 0 + } + return int(c.ToBlock - c.FromBlock + 1) +} + +// EstimatedSize returns the estimated size of the certificate +func (c *CertificateBuildParams) EstimatedSize() uint { + if c == nil { + return 0 + } + sizeBridges := int(0) + for _, bridge := range c.Bridges { + sizeBridges += EstimatedSizeBridgeExit + sizeBridges += int(byteArrayJSONSizeFactor * float32(len(bridge.Metadata))) + } + + sizeClaims := int(0) + for _, claim := range c.Claims { + sizeClaims += EstimatedSizeClaim + sizeClaims += int(byteArrayJSONSizeFactor * float32(len(claim.Metadata))) + } + return uint(sizeBridges + sizeClaims) +} + +// IsEmpty returns true if the certificate is empty +func (c *CertificateBuildParams) IsEmpty() bool { + return c.NumberOfBridges() == 0 && c.NumberOfClaims() == 0 +} + +// MaxDepoitCount returns the maximum deposit count in the certificate +func (c *CertificateBuildParams) MaxDepositCount() uint32 { + if c == nil || c.NumberOfBridges() == 0 { + return 0 + } + return c.Bridges[len(c.Bridges)-1].DepositCount +} diff --git a/aggsender/types/epoch_notifier.go b/aggsender/types/epoch_notifier.go new file mode 100644 index 00000000..426ad362 --- /dev/null +++ b/aggsender/types/epoch_notifier.go @@ -0,0 +1,25 @@ +package types + +import ( + "context" + "fmt" +) + +// EpochEvent is the event that notifies the neear end epoch +type EpochEvent struct { + Epoch uint64 + // ExtraInfo if a detailed information about the epoch that depends on implementation + ExtraInfo fmt.Stringer +} + +func (e EpochEvent) String() string { + return fmt.Sprintf("EpochEvent: epoch=%d extra=%s", e.Epoch, e.ExtraInfo) +} + +type EpochNotifier interface { + // NotifyEpochStarted notifies the epoch is close to end. + Subscribe(id string) <-chan EpochEvent + // Start starts the notifier synchronously + Start(ctx context.Context) + String() string +} diff --git a/aggsender/types/generic_subscriber.go b/aggsender/types/generic_subscriber.go new file mode 100644 index 00000000..67038c5c --- /dev/null +++ b/aggsender/types/generic_subscriber.go @@ -0,0 +1,6 @@ +package types + +type GenericSubscriber[T any] interface { + Subscribe(subscriberName string) <-chan T + Publish(data T) +} diff --git a/aggsender/types/status.go b/aggsender/types/status.go new file mode 100644 index 00000000..6d65aa42 --- /dev/null +++ b/aggsender/types/status.go @@ -0,0 +1,42 @@ +package types + +import ( + "time" + + zkevm "github.com/agglayer/aggkit" +) + +type AggsenderStatusType string + +const ( + StatusNone AggsenderStatusType = "none" + StatusCheckingInitialStage AggsenderStatusType = "checking_initial_stage" + StatusCertificateStage AggsenderStatusType = "certificate_stage" +) + +type AggsenderStatus struct { + Running bool `json:"running"` + StartTime time.Time `json:"start_time"` + Status AggsenderStatusType `json:"status"` + LastError string `json:"last_error"` +} + +type AggsenderInfo struct { + AggsenderStatus AggsenderStatus `json:"aggsender_status"` + Version zkevm.FullVersion + EpochNotifierDescription string `json:"epoch_notifier_description"` + NetworkID uint32 `json:"network_id"` +} + +func (a *AggsenderStatus) Start(startTime time.Time) { + a.Running = true + a.StartTime = startTime +} + +func (a *AggsenderStatus) SetLastError(err error) { + if err == nil { + a.LastError = "" + } else { + a.LastError = err.Error() + } +} diff --git a/aggsender/types/status_test.go b/aggsender/types/status_test.go new file mode 100644 index 00000000..d48ca004 --- /dev/null +++ b/aggsender/types/status_test.go @@ -0,0 +1,16 @@ +package types + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAggsenderStatusSetLastError(t *testing.T) { + sut := AggsenderStatus{} + sut.SetLastError(nil) + require.Equal(t, "", sut.LastError) + sut.SetLastError(errors.New("error")) + require.Equal(t, "error", sut.LastError) +} diff --git a/aggsender/types/types.go b/aggsender/types/types.go new file mode 100644 index 00000000..131af7ef --- /dev/null +++ b/aggsender/types/types.go @@ -0,0 +1,195 @@ +package types + +import ( + "context" + "encoding/binary" + "fmt" + "math/big" + "time" + + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/bridgesync" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/l1infotreesync" + treeTypes "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// L1InfoTreeSyncer is an interface defining functions that an L1InfoTreeSyncer should implement +type L1InfoTreeSyncer interface { + GetInfoByGlobalExitRoot(globalExitRoot common.Hash) (*l1infotreesync.L1InfoTreeLeaf, error) + GetL1InfoTreeMerkleProofFromIndexToRoot( + ctx context.Context, index uint32, root common.Hash, + ) (treeTypes.Proof, error) + GetL1InfoTreeRootByIndex(ctx context.Context, index uint32) (treeTypes.Root, error) +} + +// L2BridgeSyncer is an interface defining functions that an L2BridgeSyncer should implement +type L2BridgeSyncer interface { + GetBlockByLER(ctx context.Context, ler common.Hash) (uint64, error) + GetExitRootByIndex(ctx context.Context, index uint32) (treeTypes.Root, error) + GetBridgesPublished(ctx context.Context, fromBlock, toBlock uint64) ([]bridgesync.Bridge, error) + GetClaims(ctx context.Context, fromBlock, toBlock uint64) ([]bridgesync.Claim, error) + OriginNetwork() uint32 + BlockFinality() etherman.BlockNumberFinality + GetLastProcessedBlock(ctx context.Context) (uint64, error) +} + +// EthClient is an interface defining functions that an EthClient should implement +type EthClient interface { + BlockNumber(ctx context.Context) (uint64, error) + HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) +} + +// Logger is an interface that defines the methods to log messages +type Logger interface { + Fatalf(format string, args ...interface{}) + Info(args ...interface{}) + Infof(format string, args ...interface{}) + Error(args ...interface{}) + Errorf(format string, args ...interface{}) + Warn(args ...interface{}) + Warnf(format string, args ...interface{}) + Debug(args ...interface{}) + Debugf(format string, args ...interface{}) +} + +type CertificateInfo struct { + Height uint64 `meddler:"height"` + RetryCount int `meddler:"retry_count"` + CertificateID common.Hash `meddler:"certificate_id,hash"` + // PreviousLocalExitRoot if it's nil means no reported + PreviousLocalExitRoot *common.Hash `meddler:"previous_local_exit_root,hash"` + NewLocalExitRoot common.Hash `meddler:"new_local_exit_root,hash"` + FromBlock uint64 `meddler:"from_block"` + ToBlock uint64 `meddler:"to_block"` + Status agglayer.CertificateStatus `meddler:"status"` + CreatedAt uint32 `meddler:"created_at"` + UpdatedAt uint32 `meddler:"updated_at"` + SignedCertificate string `meddler:"signed_certificate"` +} + +func (c *CertificateInfo) String() string { + if c == nil { + //nolint:all + return "nil" + } + previousLocalExitRoot := "nil" + if c.PreviousLocalExitRoot != nil { + previousLocalExitRoot = c.PreviousLocalExitRoot.String() + } + return fmt.Sprintf("aggsender.CertificateInfo: "+ + "Height: %d "+ + "RetryCount: %d "+ + "CertificateID: %s "+ + "PreviousLocalExitRoot: %s "+ + "NewLocalExitRoot: %s "+ + "Status: %s "+ + "FromBlock: %d "+ + "ToBlock: %d "+ + "CreatedAt: %s "+ + "UpdatedAt: %s", + c.Height, + c.RetryCount, + c.CertificateID.String(), + previousLocalExitRoot, + c.NewLocalExitRoot.String(), + c.Status.String(), + c.FromBlock, + c.ToBlock, + time.Unix(int64(c.CreatedAt), 0), + time.Unix(int64(c.UpdatedAt), 0), + ) +} + +// ID returns a string with the unique identifier of the cerificate (height+certificateID) +func (c *CertificateInfo) ID() string { + if c == nil { + return "nil" + } + return fmt.Sprintf("%d/%s (retry %d)", c.Height, c.CertificateID.String(), c.RetryCount) +} + +// IsClosed returns true if the certificate is closed (settled or inError) +func (c *CertificateInfo) IsClosed() bool { + if c == nil { + return false + } + return c.Status.IsClosed() +} + +// ElapsedTimeSinceCreation returns the time elapsed since the certificate was created +func (c *CertificateInfo) ElapsedTimeSinceCreation() time.Duration { + if c == nil { + return 0 + } + return time.Now().UTC().Sub(time.Unix(int64(c.CreatedAt), 0)) +} + +type CertificateMetadata struct { + // ToBlock contains the pre v1 value stored in the metadata certificate field + // is not stored in the hash post v1 + ToBlock uint64 + + // FromBlock is the block number from which the certificate contains data + FromBlock uint64 + + // Offset is the number of blocks from the FromBlock that the certificate contains + Offset uint32 + + // CreatedAt is the timestamp when the certificate was created + CreatedAt uint32 + + // Version is the version of the metadata + Version uint8 +} + +// NewCertificateMetadataFromHash returns a new CertificateMetadata from the given hash +func NewCertificateMetadata(fromBlock uint64, offset uint32, createdAt uint32) *CertificateMetadata { + return &CertificateMetadata{ + FromBlock: fromBlock, + Offset: offset, + CreatedAt: createdAt, + Version: 1, + } +} + +// NewCertificateMetadataFromHash returns a new CertificateMetadata from the given hash +func NewCertificateMetadataFromHash(hash common.Hash) *CertificateMetadata { + b := hash.Bytes() + + if b[0] < 1 { + return &CertificateMetadata{ + ToBlock: hash.Big().Uint64(), + } + } + + return &CertificateMetadata{ + Version: b[0], + FromBlock: binary.BigEndian.Uint64(b[1:9]), + Offset: binary.BigEndian.Uint32(b[9:13]), + CreatedAt: binary.BigEndian.Uint32(b[13:17]), + } +} + +// ToHash returns the hash of the metadata +func (c *CertificateMetadata) ToHash() common.Hash { + b := make([]byte, common.HashLength) // 32-byte hash + + // Encode version + b[0] = c.Version + + // Encode fromBlock + binary.BigEndian.PutUint64(b[1:9], c.FromBlock) + + // Encode offset + binary.BigEndian.PutUint32(b[9:13], c.Offset) + + // Encode createdAt + binary.BigEndian.PutUint32(b[13:17], c.CreatedAt) + + // Last 8 bytes remain as zero padding + + return common.BytesToHash(b) +} diff --git a/aggsender/types/types_test.go b/aggsender/types/types_test.go new file mode 100644 index 00000000..985127f9 --- /dev/null +++ b/aggsender/types/types_test.go @@ -0,0 +1,28 @@ +package types + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestMetadataConversions_toBlock_Only(t *testing.T) { + toBlock := uint64(123567890) + hash := common.BigToHash(new(big.Int).SetUint64(toBlock)) + meta := NewCertificateMetadataFromHash(hash) + require.Equal(t, toBlock, meta.ToBlock) +} + +func TestMetadataConversions(t *testing.T) { + fromBlock := uint64(123567890) + offset := uint32(1000) + createdAt := uint32(0) + meta := NewCertificateMetadata(fromBlock, offset, createdAt) + c := meta.ToHash() + extractBlock := NewCertificateMetadataFromHash(c) + require.Equal(t, fromBlock, extractBlock.FromBlock) + require.Equal(t, offset, extractBlock.Offset) + require.Equal(t, createdAt, extractBlock.CreatedAt) +} diff --git a/book.toml b/book.toml new file mode 100644 index 00000000..d396c6f2 --- /dev/null +++ b/book.toml @@ -0,0 +1,14 @@ +[book] +authors = ["Aggkit Team - Polygon Labs"] +language = "en" +multilingual = false +src = "docs" +title = "Aggkit Docs" + +[preprocessor.mermaid] +command = "mdbook-mermaid" + +[output.html] +additional-js = ["docs/assets/mermaid.min.js", "docs/assets/mermaid-init.js"] + +[preprocessor.alerts] diff --git a/bridgesync/bridgesync.go b/bridgesync/bridgesync.go new file mode 100644 index 00000000..96a11837 --- /dev/null +++ b/bridgesync/bridgesync.go @@ -0,0 +1,280 @@ +package bridgesync + +import ( + "context" + "time" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sync" + tree "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" +) + +const ( + l1BridgeSyncer = "L1BridgeSyncer" + l2BridgeSyncer = "L2BridgeSyncer" + downloadBufferSize = 1000 +) + +type ReorgDetector interface { + sync.ReorgDetector +} + +// BridgeSync manages the state of the exit tree for the bridge contract by processing Ethereum blockchain events. +type BridgeSync struct { + processor *processor + driver *sync.EVMDriver + + originNetwork uint32 + blockFinality etherman.BlockNumberFinality +} + +// NewL1 creates a bridge syncer that synchronizes the mainnet exit tree +func NewL1( + ctx context.Context, + dbPath string, + bridge common.Address, + syncBlockChunkSize uint64, + blockFinalityType etherman.BlockNumberFinality, + rd ReorgDetector, + ethClient EthClienter, + initialBlock uint64, + waitForNewBlocksPeriod time.Duration, + retryAfterErrorPeriod time.Duration, + maxRetryAttemptsAfterError int, + originNetwork uint32, + syncFullClaims bool, +) (*BridgeSync, error) { + return newBridgeSync( + ctx, + dbPath, + bridge, + syncBlockChunkSize, + blockFinalityType, + rd, + ethClient, + initialBlock, + l1BridgeSyncer, + waitForNewBlocksPeriod, + retryAfterErrorPeriod, + maxRetryAttemptsAfterError, + originNetwork, + syncFullClaims, + ) +} + +// NewL2 creates a bridge syncer that synchronizes the local exit tree +func NewL2( + ctx context.Context, + dbPath string, + bridge common.Address, + syncBlockChunkSize uint64, + blockFinalityType etherman.BlockNumberFinality, + rd ReorgDetector, + ethClient EthClienter, + initialBlock uint64, + waitForNewBlocksPeriod time.Duration, + retryAfterErrorPeriod time.Duration, + maxRetryAttemptsAfterError int, + originNetwork uint32, + syncFullClaims bool, +) (*BridgeSync, error) { + return newBridgeSync( + ctx, + dbPath, + bridge, + syncBlockChunkSize, + blockFinalityType, + rd, + ethClient, + initialBlock, + l2BridgeSyncer, + waitForNewBlocksPeriod, + retryAfterErrorPeriod, + maxRetryAttemptsAfterError, + originNetwork, + syncFullClaims, + ) +} + +func newBridgeSync( + ctx context.Context, + dbPath string, + bridge common.Address, + syncBlockChunkSize uint64, + blockFinalityType etherman.BlockNumberFinality, + rd ReorgDetector, + ethClient EthClienter, + initialBlock uint64, + syncerID string, + waitForNewBlocksPeriod time.Duration, + retryAfterErrorPeriod time.Duration, + maxRetryAttemptsAfterError int, + originNetwork uint32, + syncFullClaims bool, +) (*BridgeSync, error) { + logger := log.WithFields("module", syncerID) + processor, err := newProcessor(dbPath, logger) + if err != nil { + return nil, err + } + + lastProcessedBlock, err := processor.GetLastProcessedBlock(ctx) + if err != nil { + return nil, err + } + + if lastProcessedBlock < initialBlock { + err = processor.ProcessBlock(ctx, sync.Block{ + Num: initialBlock, + }) + if err != nil { + return nil, err + } + } + rh := &sync.RetryHandler{ + MaxRetryAttemptsAfterError: maxRetryAttemptsAfterError, + RetryAfterErrorPeriod: retryAfterErrorPeriod, + } + + appender, err := buildAppender(ethClient, bridge, syncFullClaims) + if err != nil { + return nil, err + } + downloader, err := sync.NewEVMDownloader( + syncerID, + ethClient, + syncBlockChunkSize, + blockFinalityType, + waitForNewBlocksPeriod, + appender, + []common.Address{bridge}, + rh, + ) + if err != nil { + return nil, err + } + + driver, err := sync.NewEVMDriver(rd, processor, downloader, syncerID, downloadBufferSize, rh) + if err != nil { + return nil, err + } + + logger.Infof( + "%s created:\n"+ + " dbPath: %s\n"+ + " initialBlock: %d\n"+ + " bridgeAddr: %s\n"+ + " syncFullClaims: %t\n"+ + " maxRetryAttemptsAfterError: %d\n"+ + " retryAfterErrorPeriod: %s\n"+ + " syncBlockChunkSize: %d\n"+ + " blockFinalityType: %s\n"+ + " waitForNewBlocksPeriod: %s", + syncerID, + dbPath, + initialBlock, + bridge.String(), + syncFullClaims, + maxRetryAttemptsAfterError, + retryAfterErrorPeriod.String(), + syncBlockChunkSize, + blockFinalityType, + waitForNewBlocksPeriod.String(), + ) + + return &BridgeSync{ + processor: processor, + driver: driver, + originNetwork: originNetwork, + blockFinality: blockFinalityType, + }, nil +} + +// Start starts the synchronization process +func (s *BridgeSync) Start(ctx context.Context) { + s.driver.Sync(ctx) +} + +func (s *BridgeSync) GetLastProcessedBlock(ctx context.Context) (uint64, error) { + if s.processor.isHalted() { + return 0, sync.ErrInconsistentState + } + return s.processor.GetLastProcessedBlock(ctx) +} + +func (s *BridgeSync) GetBridgeRootByHash(ctx context.Context, root common.Hash) (*tree.Root, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.exitTree.GetRootByHash(ctx, root) +} + +func (s *BridgeSync) GetClaims(ctx context.Context, fromBlock, toBlock uint64) ([]Claim, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetClaims(ctx, fromBlock, toBlock) +} + +func (s *BridgeSync) GetBridges(ctx context.Context, fromBlock, toBlock uint64) ([]Bridge, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetBridges(ctx, fromBlock, toBlock) +} + +func (s *BridgeSync) GetBridgesPublished(ctx context.Context, fromBlock, toBlock uint64) ([]Bridge, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetBridgesPublished(ctx, fromBlock, toBlock) +} + +func (s *BridgeSync) GetProof(ctx context.Context, depositCount uint32, localExitRoot common.Hash) (tree.Proof, error) { + if s.processor.isHalted() { + return tree.Proof{}, sync.ErrInconsistentState + } + return s.processor.exitTree.GetProof(ctx, depositCount, localExitRoot) +} + +func (s *BridgeSync) GetBlockByLER(ctx context.Context, ler common.Hash) (uint64, error) { + if s.processor.isHalted() { + return 0, sync.ErrInconsistentState + } + root, err := s.processor.exitTree.GetRootByHash(ctx, ler) + if err != nil { + return 0, err + } + return root.BlockNum, nil +} + +func (s *BridgeSync) GetRootByLER(ctx context.Context, ler common.Hash) (*tree.Root, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + root, err := s.processor.exitTree.GetRootByHash(ctx, ler) + if err != nil { + return root, err + } + return root, nil +} + +// GetExitRootByIndex returns the root of the exit tree at the moment the leaf with the given index was added +func (s *BridgeSync) GetExitRootByIndex(ctx context.Context, index uint32) (tree.Root, error) { + if s.processor.isHalted() { + return tree.Root{}, sync.ErrInconsistentState + } + return s.processor.exitTree.GetRootByIndex(ctx, index) +} + +// OriginNetwork returns the network ID of the origin chain +func (s *BridgeSync) OriginNetwork() uint32 { + return s.originNetwork +} + +// BlockFinality returns the block finality type +func (s *BridgeSync) BlockFinality() etherman.BlockNumberFinality { + return s.blockFinality +} diff --git a/bridgesync/bridgesync_test.go b/bridgesync/bridgesync_test.go new file mode 100644 index 00000000..9973d664 --- /dev/null +++ b/bridgesync/bridgesync_test.go @@ -0,0 +1,140 @@ +package bridgesync + +import ( + "context" + "errors" + "path" + "testing" + "time" + + mocksbridgesync "github.com/agglayer/aggkit/bridgesync/mocks" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/sync" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +// Mock implementations for the interfaces +type MockEthClienter struct { + mock.Mock +} + +type MockBridgeContractor struct { + mock.Mock +} + +func TestNewLx(t *testing.T) { + ctx := context.Background() + dbPath := path.Join(t.TempDir(), "TestNewLx.sqlite") + bridge := common.HexToAddress("0x1234567890abcdef1234567890abcdef12345678") + syncBlockChunkSize := uint64(100) + blockFinalityType := etherman.SafeBlock + initialBlock := uint64(0) + waitForNewBlocksPeriod := time.Second * 10 + retryAfterErrorPeriod := time.Second * 5 + maxRetryAttemptsAfterError := 3 + originNetwork := uint32(1) + + mockEthClient := mocksbridgesync.NewEthClienter(t) + mockReorgDetector := mocksbridgesync.NewReorgDetector(t) + + mockReorgDetector.EXPECT().Subscribe(mock.Anything).Return(nil, nil) + + bridgeSync, err := NewL1( + ctx, + dbPath, + bridge, + syncBlockChunkSize, + blockFinalityType, + mockReorgDetector, + mockEthClient, + initialBlock, + waitForNewBlocksPeriod, + retryAfterErrorPeriod, + maxRetryAttemptsAfterError, + originNetwork, + false, + ) + + assert.NoError(t, err) + assert.NotNil(t, bridgeSync) + assert.Equal(t, originNetwork, bridgeSync.OriginNetwork()) + assert.Equal(t, blockFinalityType, bridgeSync.BlockFinality()) + + bridgeSyncL2, err := NewL2( + ctx, + dbPath, + bridge, + syncBlockChunkSize, + blockFinalityType, + mockReorgDetector, + mockEthClient, + initialBlock, + waitForNewBlocksPeriod, + retryAfterErrorPeriod, + maxRetryAttemptsAfterError, + originNetwork, + false, + ) + + assert.NoError(t, err) + assert.NotNil(t, bridgeSync) + assert.Equal(t, originNetwork, bridgeSyncL2.OriginNetwork()) + assert.Equal(t, blockFinalityType, bridgeSyncL2.BlockFinality()) +} + +func TestGetLastProcessedBlock(t *testing.T) { + s := BridgeSync{processor: &processor{halted: true}} + _, err := s.GetLastProcessedBlock(context.Background()) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetBridgeRootByHash(t *testing.T) { + s := BridgeSync{processor: &processor{halted: true}} + _, err := s.GetBridgeRootByHash(context.Background(), common.Hash{}) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetBridges(t *testing.T) { + s := BridgeSync{processor: &processor{halted: true}} + _, err := s.GetBridges(context.Background(), 0, 0) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetProof(t *testing.T) { + s := BridgeSync{processor: &processor{halted: true}} + _, err := s.GetProof(context.Background(), 0, common.Hash{}) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetBlockByLER(t *testing.T) { + s := BridgeSync{processor: &processor{halted: true}} + _, err := s.GetBlockByLER(context.Background(), common.Hash{}) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetRootByLER(t *testing.T) { + s := BridgeSync{processor: &processor{halted: true}} + _, err := s.GetRootByLER(context.Background(), common.Hash{}) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetExitRootByIndex(t *testing.T) { + s := BridgeSync{processor: &processor{halted: true}} + _, err := s.GetExitRootByIndex(context.Background(), 0) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetClaims(t *testing.T) { + s := BridgeSync{processor: &processor{halted: true}} + _, err := s.GetClaims(context.Background(), 0, 0) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetBridgesPublishedTopLevel(t *testing.T) { + s := BridgeSync{processor: &processor{halted: true}} + _, err := s.GetBridgesPublished(context.Background(), 0, 0) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} diff --git a/bridgesync/claimcalldata_test.go b/bridgesync/claimcalldata_test.go new file mode 100644 index 00000000..f1f4b28c --- /dev/null +++ b/bridgesync/claimcalldata_test.go @@ -0,0 +1,1942 @@ +package bridgesync + +import ( + "context" + "math/big" + "os/exec" + "testing" + "time" + + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/test/contracts/claimmock" + "github.com/agglayer/aggkit/test/contracts/claimmockcaller" + "github.com/agglayer/aggkit/test/contracts/claimmocktest" + tree "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +type testCase struct { + description string + bridgeAddr common.Address + log types.Log + expectedClaim Claim +} + +func TestClaimCalldata(t *testing.T) { + testCases := []testCase{} + // Setup Docker L1 + log.Debug("starting docker") + ctx := context.Background() + msg, err := exec.Command("bash", "-l", "-c", "docker compose up -d").CombinedOutput() + require.NoError(t, err, string(msg)) + time.Sleep(time.Second * 1) + defer func() { + msg, err = exec.Command("bash", "-l", "-c", "docker compose down").CombinedOutput() + require.NoError(t, err, string(msg)) + }() + log.Debug("docker started") + client, err := ethclient.Dial("http://localhost:8545") + require.NoError(t, err) + privateKey, err := crypto.HexToECDSA("ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80") + require.NoError(t, err) + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(0).SetUint64(1337)) + require.NoError(t, err) + + // Deploy contracts + bridgeAddr, _, bridgeContract, err := claimmock.DeployClaimmock(auth, client) + require.NoError(t, err) + claimCallerAddr, _, claimCaller, err := claimmockcaller.DeployClaimmockcaller(auth, client, bridgeAddr) + require.NoError(t, err) + _, _, claimTest, err := claimmocktest.DeployClaimmocktest(auth, client, bridgeAddr, claimCallerAddr) + require.NoError(t, err) + + proofLocal := [32][32]byte{} + proofLocalH := tree.Proof{} + proofLocal[5] = common.HexToHash("beef") + proofLocalH[5] = common.HexToHash("beef") + proofRollup := [32][32]byte{} + proofRollupH := tree.Proof{} + proofRollup[4] = common.HexToHash("a1fa") + proofRollupH[4] = common.HexToHash("a1fa") + expectedClaim := Claim{ + OriginNetwork: 69, + OriginAddress: common.HexToAddress("ffaaffaa"), + DestinationAddress: common.HexToAddress("123456789"), + Amount: big.NewInt(3), + MainnetExitRoot: common.HexToHash("5ca1e"), + RollupExitRoot: common.HexToHash("dead"), + ProofLocalExitRoot: proofLocalH, + ProofRollupExitRoot: proofRollupH, + DestinationNetwork: 0, + Metadata: []byte{}, + GlobalExitRoot: crypto.Keccak256Hash(common.HexToHash("5ca1e").Bytes(), common.HexToHash("dead").Bytes()), + } + expectedClaim2 := Claim{ + OriginNetwork: 87, + OriginAddress: common.HexToAddress("eebbeebb"), + DestinationAddress: common.HexToAddress("2233445566"), + Amount: big.NewInt(4), + MainnetExitRoot: common.HexToHash("5ca1e"), + RollupExitRoot: common.HexToHash("dead"), + ProofLocalExitRoot: proofLocalH, + ProofRollupExitRoot: proofRollupH, + DestinationNetwork: 0, + Metadata: []byte{}, + GlobalExitRoot: crypto.Keccak256Hash(common.HexToHash("5ca1e").Bytes(), common.HexToHash("dead").Bytes()), + } + expectedClaim3 := Claim{ + OriginNetwork: 69, + OriginAddress: common.HexToAddress("ffaaffaa"), + DestinationAddress: common.HexToAddress("2233445566"), + Amount: big.NewInt(5), + MainnetExitRoot: common.HexToHash("5ca1e"), + RollupExitRoot: common.HexToHash("dead"), + ProofLocalExitRoot: proofLocalH, + ProofRollupExitRoot: proofRollupH, + DestinationNetwork: 0, + Metadata: []byte{}, + GlobalExitRoot: crypto.Keccak256Hash(common.HexToHash("5ca1e").Bytes(), common.HexToHash("dead").Bytes()), + } + auth.GasLimit = 999999 // for some reason gas estimation fails :( + + abi, err := claimmock.ClaimmockMetaData.GetAbi() + require.NoError(t, err) + + // direct call claim asset + expectedClaim.GlobalIndex = big.NewInt(421) + expectedClaim.IsMessage = false + tx, err := bridgeContract.ClaimAsset( + auth, + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + 0, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + nil, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err := client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "direct call to claim asset", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + // indirect call claim asset + expectedClaim.IsMessage = false + expectedClaim.GlobalIndex = big.NewInt(422) + tx, err = claimCaller.ClaimAsset( + auth, + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + 0, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + nil, + false, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "indirect call to claim asset", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + // indirect call claim asset bytes + expectedClaim.GlobalIndex = big.NewInt(423) + expectedClaim.IsMessage = false + expectedClaimBytes, err := abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.ClaimBytes( + auth, + expectedClaimBytes, + false, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "indirect call to claim asset bytes", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + // direct call claim message + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(424) + tx, err = bridgeContract.ClaimMessage( + auth, + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + 0, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + nil, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "direct call to claim message", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + // indirect call claim message + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(425) + tx, err = claimCaller.ClaimMessage( + auth, + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + 0, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + nil, + false, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "indirect call to claim message", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + // indirect call claim message bytes + expectedClaim.GlobalIndex = big.NewInt(426) + expectedClaim.IsMessage = true + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.ClaimBytes( + auth, + expectedClaimBytes, + false, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "indirect call to claim message bytes", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + // indirect call claim message bytes + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim.IsMessage = true + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.ClaimBytes( + auth, + expectedClaimBytes, + true, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + log.Infof("%+v", r.Logs) + + reverted := [2]bool{false, false} + + // 2 indirect call claim message (same global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(427) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err := abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim message 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "2 indirect call claim message 2 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim2, + }) + + // 2 indirect call claim message (diff global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(428) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(429) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim message 1 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "2 indirect call claim message 2 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim2, + }) + + reverted = [2]bool{false, true} + + // 2 indirect call claim message (same global index) (1 ok, 1 reverted) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(430) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(430) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim message (same globalIndex) (1 ok, 1 reverted)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + // 2 indirect call claim message (diff global index) (1 ok, 1 reverted) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(431) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(432) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim message (diff globalIndex) (1 ok, 1 reverted)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + reverted = [2]bool{true, false} + + // 2 indirect call claim message (same global index) (1 reverted, 1 ok) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(433) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(433) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim message (same globalIndex) (reverted,ok)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim2, + }) + + // 2 indirect call claim message (diff global index) (1 reverted, 1 ok) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(434) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(435) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim message (diff globalIndex) (reverted,ok)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim2, + }) + + reverted = [2]bool{false, false} + + // 2 indirect call claim asset (same global index) + expectedClaim.IsMessage = false + expectedClaim.GlobalIndex = big.NewInt(436) + expectedClaim2.IsMessage = false + expectedClaim2.GlobalIndex = big.NewInt(436) + expectedClaimBytes, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim asset 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "2 indirect call claim asset 2 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim2, + }) + + // 2 indirect call claim asset (diff global index) + expectedClaim.IsMessage = false + expectedClaim.GlobalIndex = big.NewInt(437) + expectedClaim2.IsMessage = false + expectedClaim2.GlobalIndex = big.NewInt(438) + expectedClaimBytes, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim asset 1 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "2 indirect call claim asset 2 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim2, + }) + + reverted = [2]bool{false, true} + + // 2 indirect call claim asset (same global index) (1 ok, 1 reverted) + expectedClaim.IsMessage = false + expectedClaim.GlobalIndex = big.NewInt(439) + expectedClaim2.IsMessage = false + expectedClaim2.GlobalIndex = big.NewInt(439) + expectedClaimBytes, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim asset (same globalIndex) (1 ok, 1 reverted)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + // 2 indirect call claim message (diff global index) (1 ok, 1 reverted) + expectedClaim.IsMessage = false + expectedClaim.GlobalIndex = big.NewInt(440) + expectedClaim2.IsMessage = false + expectedClaim2.GlobalIndex = big.NewInt(441) + expectedClaimBytes, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim asset (diff globalIndex) (1 ok, 1 reverted)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + reverted = [2]bool{true, false} + + // 2 indirect call claim asset (same global index) (1 reverted, 1 ok) + expectedClaim.IsMessage = false + expectedClaim.GlobalIndex = big.NewInt(442) + expectedClaim2.IsMessage = false + expectedClaim2.GlobalIndex = big.NewInt(442) + expectedClaimBytes, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim asset (same globalIndex) (reverted,ok)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim2, + }) + + // 2 indirect call claim asset (diff global index) (1 reverted, 1 ok) + expectedClaim.IsMessage = false + expectedClaim.GlobalIndex = big.NewInt(443) + expectedClaim2.IsMessage = false + expectedClaim2.GlobalIndex = big.NewInt(444) + expectedClaimBytes, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimAsset", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimCaller.Claim2Bytes( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect call claim asset (diff globalIndex) (reverted,ok)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim2, + }) + + // indirect + indirect call claim message bytes + expectedClaim.GlobalIndex = big.NewInt(426) + expectedClaim.IsMessage = true + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.ClaimTestInternal( + auth, + expectedClaimBytes, + false, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "indirect + indirect call to claim message bytes", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + reverted = [2]bool{false, false} + + // 2 indirect + indirect call claim message (same global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(427) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim2TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + reverted, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 indirect + indirect call claim message 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "2 indirect + indirect call claim message 2 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim2, + }) + + reverted3 := [3]bool{false, false, false} + + // 3 ok (indirectx2, indirect, indirectx2) call claim message (same global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(427) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(427) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err := abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "3 ok (indirectx2, indirect, indirectx2) call claim message 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "3 ok (indirectx2, indirect, indirectx2) call claim message 2 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim2, + }) + testCases = append(testCases, testCase{ + description: "3 ok (indirectx2, indirect, indirectx2) call claim message 3 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[2], + expectedClaim: expectedClaim3, + }) + + // 3 ok (indirectx2, indirect, indirectx2) call claim message (diff global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(428) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(429) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "3 ok (indirectx2, indirect, indirectx2) call claim message 1 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "3 ok (indirectx2, indirect, indirectx2) call claim message 2 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim2, + }) + testCases = append(testCases, testCase{ + description: "3 ok (indirectx2, indirect, indirectx2) call claim message 3 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[2], + expectedClaim: expectedClaim3, + }) + + reverted3 = [3]bool{true, false, false} + + // 1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message (diff global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(428) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(429) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message 1 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim2, + }) + testCases = append(testCases, testCase{ + description: "1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message 2 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim3, + }) + + reverted3 = [3]bool{false, true, false} + + // 1 ok 1 ko 1 ok (indirectx2, indirect, indirectx2) call claim message (diff global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(428) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(429) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message 1 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message 2 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim3, + }) + + reverted3 = [3]bool{false, false, true} + + // 1 ok 1 ok 1 ko (indirectx2, indirect, indirectx2) call claim message (diff global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(428) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(429) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "1 ok 1 ok 1 ko (indirectx2, indirect, indirectx2) call claim message 1 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "1 ok 1 ok 1 ko (indirectx2, indirect, indirectx2) call claim message 2 (diff globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim2, + }) + + reverted3 = [3]bool{true, false, false} + + // 1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message (same global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(427) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(427) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim2, + }) + testCases = append(testCases, testCase{ + description: "1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message 2 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim3, + }) + + reverted3 = [3]bool{false, true, false} + + // 1 ok 1 ko 1 ok (indirectx2, indirect, indirectx2) call claim message (same global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(427) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(427) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "1 ko 2 ok (indirectx2, indirect, indirectx2) call claim message 2 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim3, + }) + + reverted3 = [3]bool{false, false, true} + + // 1 ok 1 ok 1 ko (indirectx2, indirect, indirectx2) call claim message (same global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(427) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(427) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "1 ok 1 ok 1 ko (indirectx2, indirect, indirectx2) call claim message 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + testCases = append(testCases, testCase{ + description: "1 ok 1 ok 1 ko (indirectx2, indirect, indirectx2) call claim message 2 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[1], + expectedClaim: expectedClaim2, + }) + + reverted3 = [3]bool{true, true, false} + + // 2 ko 1 ok (indirectx2, indirect, indirectx2) call claim message (same global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(427) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(427) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "2 ko 1 ok (indirectx2, indirect, indirectx2) call claim message 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim3, + }) + + reverted3 = [3]bool{false, true, true} + + // 1 ok 2 ko (indirectx2, indirect, indirectx2) call claim message (same global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(427) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(427) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "1 ok 2 ko (indirectx2, indirect, indirectx2) call claim message 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim, + }) + + reverted3 = [3]bool{true, false, true} + + // 1 ko 1 ok 1 ko (indirectx2, indirect, indirectx2) call claim message (same global index) + expectedClaim.IsMessage = true + expectedClaim.GlobalIndex = big.NewInt(427) + expectedClaim2.IsMessage = true + expectedClaim2.GlobalIndex = big.NewInt(427) + expectedClaim3.IsMessage = true + expectedClaim3.GlobalIndex = big.NewInt(427) + expectedClaimBytes, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim.GlobalIndex, + expectedClaim.MainnetExitRoot, + expectedClaim.RollupExitRoot, + expectedClaim.OriginNetwork, + expectedClaim.OriginAddress, + expectedClaim.DestinationNetwork, + expectedClaim.DestinationAddress, + expectedClaim.Amount, + expectedClaim.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes2, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim2.GlobalIndex, + expectedClaim2.MainnetExitRoot, + expectedClaim2.RollupExitRoot, + expectedClaim2.OriginNetwork, + expectedClaim2.OriginAddress, + expectedClaim2.DestinationNetwork, + expectedClaim2.DestinationAddress, + expectedClaim2.Amount, + expectedClaim2.Metadata, + ) + require.NoError(t, err) + expectedClaimBytes3, err = abi.Pack( + "claimMessage", + proofLocal, + proofRollup, + expectedClaim3.GlobalIndex, + expectedClaim3.MainnetExitRoot, + expectedClaim3.RollupExitRoot, + expectedClaim3.OriginNetwork, + expectedClaim3.OriginAddress, + expectedClaim3.DestinationNetwork, + expectedClaim3.DestinationAddress, + expectedClaim3.Amount, + expectedClaim3.Metadata, + ) + require.NoError(t, err) + tx, err = claimTest.Claim3TestInternal( + auth, + expectedClaimBytes, + expectedClaimBytes2, + expectedClaimBytes3, + reverted3, + ) + require.NoError(t, err) + time.Sleep(1 * time.Second) + r, err = client.TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + testCases = append(testCases, testCase{ + description: "1 ko 1 ok 1 ko (indirectx2, indirect, indirectx2) call claim message 1 (same globalIndex)", + bridgeAddr: bridgeAddr, + log: *r.Logs[0], + expectedClaim: expectedClaim2, + }) + + for _, tc := range testCases { + log.Info(tc.description) + t.Run(tc.description, func(t *testing.T) { + claimEvent, err := bridgeContract.ParseClaimEvent(tc.log) + require.NoError(t, err) + actualClaim := Claim{ + GlobalIndex: claimEvent.GlobalIndex, + OriginNetwork: claimEvent.OriginNetwork, + OriginAddress: claimEvent.OriginAddress, + DestinationAddress: claimEvent.DestinationAddress, + Amount: claimEvent.Amount, + } + err = setClaimCalldata(client, tc.bridgeAddr, tc.log.TxHash, &actualClaim) + require.NoError(t, err) + require.Equal(t, tc.expectedClaim, actualClaim) + }) + } +} diff --git a/bridgesync/config.go b/bridgesync/config.go new file mode 100644 index 00000000..6b5c91af --- /dev/null +++ b/bridgesync/config.go @@ -0,0 +1,27 @@ +package bridgesync + +import ( + "github.com/agglayer/aggkit/config/types" + "github.com/ethereum/go-ethereum/common" +) + +type Config struct { + // DBPath path of the DB + DBPath string `mapstructure:"DBPath"` + // BlockFinality indicates the status of the blocks that will be queried in order to sync + BlockFinality string `jsonschema:"enum=LatestBlock, enum=SafeBlock, enum=PendingBlock, enum=FinalizedBlock, enum=EarliestBlock" mapstructure:"BlockFinality"` //nolint:lll + // InitialBlockNum is the first block that will be queried when starting the synchronization from scratch. + // It should be a number equal or bellow the creation of the bridge contract + InitialBlockNum uint64 `mapstructure:"InitialBlockNum"` + // BridgeAddr is the address of the bridge smart contract + BridgeAddr common.Address `mapstructure:"BridgeAddr"` + // SyncBlockChunkSize is the amount of blocks that will be queried to the client on each request + SyncBlockChunkSize uint64 `mapstructure:"SyncBlockChunkSize"` + // RetryAfterErrorPeriod is the time that will be waited when an unexpected error happens before retry + RetryAfterErrorPeriod types.Duration `mapstructure:"RetryAfterErrorPeriod"` + // MaxRetryAttemptsAfterError is the maximum number of consecutive attempts that will happen before panicing. + // Any number smaller than zero will be considered as unlimited retries + MaxRetryAttemptsAfterError int `mapstructure:"MaxRetryAttemptsAfterError"` + // WaitForNewBlocksPeriod time that will be waited when the synchronizer has reached the latest block + WaitForNewBlocksPeriod types.Duration `mapstructure:"WaitForNewBlocksPeriod"` +} diff --git a/bridgesync/docker-compose.yml b/bridgesync/docker-compose.yml new file mode 100644 index 00000000..9a8f7769 --- /dev/null +++ b/bridgesync/docker-compose.yml @@ -0,0 +1,24 @@ +services: + test-claimdata-l1: + container_name: test-claimdata-l1 + image: hermeznetwork/geth-zkevm-contracts:elderberry-fork.9-geth1.13.11 + environment: + - DEV_PERIOD + ports: + - "8545:8545" + entrypoint: + - geth + - --http + - --http.addr + - "0.0.0.0" + - "--http.corsdomain" + - "*" + - "--http.vhosts" + - "*" + - --dev + - --dev.period + - "1" + - "--datadir" + - "/geth_data" + - "--http.api" + - "admin,eth,debug,miner,net,txpool,personal,web3" diff --git a/bridgesync/downloader.go b/bridgesync/downloader.go new file mode 100644 index 00000000..2ef5e958 --- /dev/null +++ b/bridgesync/downloader.go @@ -0,0 +1,301 @@ +package bridgesync + +import ( + "bytes" + "fmt" + "math/big" + "strings" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/etrog/polygonzkevmbridge" + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/polygonzkevmbridgev2" + rpcTypes "github.com/0xPolygon/cdk-rpc/types" + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/sync" + tree "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rpc" + "github.com/golang-collections/collections/stack" +) + +var ( + bridgeEventSignature = crypto.Keccak256Hash([]byte( + "BridgeEvent(uint8,uint32,address,uint32,address,uint256,bytes,uint32)", + )) + claimEventSignature = crypto.Keccak256Hash([]byte("ClaimEvent(uint256,uint32,address,address,uint256)")) + claimEventSignaturePreEtrog = crypto.Keccak256Hash([]byte("ClaimEvent(uint32,uint32,address,address,uint256)")) + methodIDClaimAsset = common.Hex2Bytes("ccaa2d11") + methodIDClaimMessage = common.Hex2Bytes("f5efcd79") +) + +// EthClienter defines the methods required to interact with an Ethereum client. +type EthClienter interface { + ethereum.LogFilterer + ethereum.BlockNumberReader + ethereum.ChainReader + bind.ContractBackend + Client() *rpc.Client +} + +func buildAppender(client EthClienter, bridge common.Address, syncFullClaims bool) (sync.LogAppenderMap, error) { + bridgeContractV1, err := polygonzkevmbridge.NewPolygonzkevmbridge(bridge, client) + if err != nil { + return nil, err + } + bridgeContractV2, err := polygonzkevmbridgev2.NewPolygonzkevmbridgev2(bridge, client) + if err != nil { + return nil, err + } + appender := make(sync.LogAppenderMap) + + appender[bridgeEventSignature] = func(b *sync.EVMBlock, l types.Log) error { + bridge, err := bridgeContractV2.ParseBridgeEvent(l) + if err != nil { + return fmt.Errorf( + "error parsing log %+v using d.bridgeContractV2.ParseBridgeEvent: %w", + l, err, + ) + } + b.Events = append(b.Events, Event{Bridge: &Bridge{ + BlockNum: b.Num, + BlockPos: uint64(l.Index), + LeafType: bridge.LeafType, + OriginNetwork: bridge.OriginNetwork, + OriginAddress: bridge.OriginAddress, + DestinationNetwork: bridge.DestinationNetwork, + DestinationAddress: bridge.DestinationAddress, + Amount: bridge.Amount, + Metadata: bridge.Metadata, + DepositCount: bridge.DepositCount, + }}) + + return nil + } + + appender[claimEventSignature] = func(b *sync.EVMBlock, l types.Log) error { + claimEvent, err := bridgeContractV2.ParseClaimEvent(l) + if err != nil { + return fmt.Errorf( + "error parsing log %+v using d.bridgeContractV2.ParseClaimEvent: %w", + l, err, + ) + } + claim := &Claim{ + BlockNum: b.Num, + BlockPos: uint64(l.Index), + GlobalIndex: claimEvent.GlobalIndex, + OriginNetwork: claimEvent.OriginNetwork, + OriginAddress: claimEvent.OriginAddress, + DestinationAddress: claimEvent.DestinationAddress, + Amount: claimEvent.Amount, + } + if syncFullClaims { + if err := setClaimCalldata(client, bridge, l.TxHash, claim); err != nil { + return err + } + } + b.Events = append(b.Events, Event{Claim: claim}) + return nil + } + + appender[claimEventSignaturePreEtrog] = func(b *sync.EVMBlock, l types.Log) error { + claimEvent, err := bridgeContractV1.ParseClaimEvent(l) + if err != nil { + return fmt.Errorf( + "error parsing log %+v using d.bridgeContractV1.ParseClaimEvent: %w", + l, err, + ) + } + claim := &Claim{ + BlockNum: b.Num, + BlockPos: uint64(l.Index), + GlobalIndex: big.NewInt(int64(claimEvent.Index)), + OriginNetwork: claimEvent.OriginNetwork, + OriginAddress: claimEvent.OriginAddress, + DestinationAddress: claimEvent.DestinationAddress, + Amount: claimEvent.Amount, + } + if syncFullClaims { + if err := setClaimCalldata(client, bridge, l.TxHash, claim); err != nil { + return err + } + } + b.Events = append(b.Events, Event{Claim: claim}) + return nil + } + + return appender, nil +} + +type call struct { + To common.Address `json:"to"` + Value *rpcTypes.ArgBig `json:"value"` + Err *string `json:"error"` + Input rpcTypes.ArgBytes `json:"input"` + Calls []call `json:"calls"` +} + +type tracerCfg struct { + Tracer string `json:"tracer"` +} + +func setClaimCalldata(client EthClienter, bridge common.Address, txHash common.Hash, claim *Claim) error { + c := &call{} + err := client.Client().Call(c, "debug_traceTransaction", txHash, tracerCfg{Tracer: "callTracer"}) + if err != nil { + return err + } + + // find the claim linked to the event using DFS + callStack := stack.New() + callStack.Push(*c) + for { + if callStack.Len() == 0 { + break + } + + currentCallInterface := callStack.Pop() + currentCall, ok := currentCallInterface.(call) + if !ok { + return fmt.Errorf("unexpected type for 'currentCall'. Expected 'call', got '%T'", currentCallInterface) + } + + if currentCall.To == bridge { + found, err := setClaimIfFoundOnInput( + currentCall.Input, + claim, + ) + if err != nil { + return err + } + if found { + return nil + } + } + for _, c := range currentCall.Calls { + callStack.Push(c) + } + } + return db.ErrNotFound +} + +func setClaimIfFoundOnInput(input []byte, claim *Claim) (bool, error) { + smcAbi, err := abi.JSON(strings.NewReader(polygonzkevmbridgev2.Polygonzkevmbridgev2ABI)) + if err != nil { + return false, err + } + methodID := input[:4] + // Recover Method from signature and ABI + method, err := smcAbi.MethodById(methodID) + if err != nil { + return false, err + } + data, err := method.Inputs.Unpack(input[4:]) + if err != nil { + return false, err + } + // Ignore other methods + if bytes.Equal(methodID, methodIDClaimAsset) || bytes.Equal(methodID, methodIDClaimMessage) { + found, err := decodeClaimCallDataAndSetIfFound(data, claim) + if err != nil { + return false, err + } + if found { + if bytes.Equal(methodID, methodIDClaimMessage) { + claim.IsMessage = true + } + return true, nil + } + return false, nil + } else { + return false, nil + } + // TODO: support both claim asset & message, check if previous versions need special treatment +} + +func decodeClaimCallDataAndSetIfFound(data []interface{}, claim *Claim) (bool, error) { + /* Unpack method inputs. Note that both claimAsset and claimMessage have the same interface + for the relevant parts + claimAsset( + 0: smtProofLocalExitRoot, + 1: smtProofRollupExitRoot, + 2: globalIndex, + 3: mainnetExitRoot, + 4: rollupExitRoot, + 5: originNetwork, + 6: originTokenAddress, + 7: destinationNetwork, + 8: destinationAddress, + 9: amount, + 10: metadata, + ) + claimMessage( + 0: smtProofLocalExitRoot, + 1: smtProofRollupExitRoot, + 2: globalIndex, + 3: mainnetExitRoot, + 4: rollupExitRoot, + 5: originNetwork, + 6: originAddress, + 7: destinationNetwork, + 8: destinationAddress, + 9: amount, + 10: metadata, + ) + */ + actualGlobalIndex, ok := data[2].(*big.Int) + if !ok { + return false, fmt.Errorf("unexpected type for actualGlobalIndex, expected *big.Int got '%T'", data[2]) + } + if actualGlobalIndex.Cmp(claim.GlobalIndex) != 0 { + // not the claim we're looking for + return false, nil + } else { + proofLER := [tree.DefaultHeight]common.Hash{} + proofLERBytes, ok := data[0].([32][32]byte) + if !ok { + return false, fmt.Errorf("unexpected type for proofLERBytes, expected [32][32]byte got '%T'", data[0]) + } + + proofRER := [tree.DefaultHeight]common.Hash{} + proofRERBytes, ok := data[1].([32][32]byte) + if !ok { + return false, fmt.Errorf("unexpected type for proofRERBytes, expected [32][32]byte got '%T'", data[1]) + } + + for i := 0; i < int(tree.DefaultHeight); i++ { + proofLER[i] = proofLERBytes[i] + proofRER[i] = proofRERBytes[i] + } + claim.ProofLocalExitRoot = proofLER + claim.ProofRollupExitRoot = proofRER + + claim.MainnetExitRoot, ok = data[3].([32]byte) + if !ok { + return false, fmt.Errorf("unexpected type for 'MainnetExitRoot'. Expected '[32]byte', got '%T'", data[3]) + } + + claim.RollupExitRoot, ok = data[4].([32]byte) + if !ok { + return false, fmt.Errorf("unexpected type for 'RollupExitRoot'. Expected '[32]byte', got '%T'", data[4]) + } + + claim.DestinationNetwork, ok = data[7].(uint32) + if !ok { + return false, fmt.Errorf("unexpected type for 'DestinationNetwork'. Expected 'uint32', got '%T'", data[7]) + } + + claim.Metadata, ok = data[10].([]byte) + if !ok { + return false, fmt.Errorf("unexpected type for 'claim Metadata'. Expected '[]byte', got '%T'", data[10]) + } + + claim.GlobalExitRoot = crypto.Keccak256Hash(claim.MainnetExitRoot.Bytes(), claim.RollupExitRoot.Bytes()) + + return true, nil + } +} diff --git a/bridgesync/e2e_test.go b/bridgesync/e2e_test.go new file mode 100644 index 00000000..cd015368 --- /dev/null +++ b/bridgesync/e2e_test.go @@ -0,0 +1,110 @@ +package bridgesync_test + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/agglayer/aggkit/bridgesync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/test/helpers" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/require" +) + +func TestBridgeEventE2E(t *testing.T) { + const ( + blockTime = time.Millisecond * 10 + totalBridges = 80 + totalReorgs = 40 + maxReorgDepth = 2 + reorgEveryXIterations = 4 // every X blocks go back [1,maxReorgDepth] blocks + ) + setup := helpers.NewE2EEnvWithEVML2(t) + ctx := context.Background() + // Send bridge txs + bridgesSent := 0 + reorgs := 0 + expectedBridges := []bridgesync.Bridge{} + lastDepositCount := uint32(0) + for i := 1; i > 0; i++ { + // Send bridge + bridge := bridgesync.Bridge{ + Amount: big.NewInt(0), + DepositCount: lastDepositCount, + DestinationNetwork: uint32(i + 1), + DestinationAddress: common.HexToAddress("f00"), + Metadata: []byte{}, + } + lastDepositCount++ + tx, err := setup.L1Environment.BridgeContract.BridgeAsset( + setup.L1Environment.Auth, + bridge.DestinationNetwork, + bridge.DestinationAddress, + bridge.Amount, + bridge.OriginAddress, + true, nil, + ) + require.NoError(t, err) + helpers.CommitBlocks(t, setup.L1Environment.SimBackend, 1, blockTime) + bn, err := setup.L1Environment.SimBackend.Client().BlockNumber(ctx) + require.NoError(t, err) + bridge.BlockNum = bn + receipt, err := setup.L1Environment.SimBackend.Client().TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) + expectedBridges = append(expectedBridges, bridge) + bridgesSent++ + + // Trigger reorg + if i%reorgEveryXIterations == 0 { + blocksToReorg := 1 + i%maxReorgDepth + bn, err := setup.L1Environment.SimBackend.Client().BlockNumber(ctx) + require.NoError(t, err) + helpers.Reorg(t, setup.L1Environment.SimBackend, uint64(blocksToReorg)) + // Clean expected bridges + lastValidBlock := bn - uint64(blocksToReorg) + reorgEffective := false + for i := len(expectedBridges) - 1; i >= 0; i-- { + if expectedBridges[i].BlockNum > lastValidBlock { + log.Debugf("removing expectedBridge with depositCount %d due to reorg", expectedBridges[i].DepositCount) + lastDepositCount = expectedBridges[i].DepositCount + expectedBridges = expectedBridges[0:i] + reorgEffective = true + bridgesSent-- + } + } + if reorgEffective { + reorgs++ + log.Debug("reorgs: ", reorgs) + } + } + + // Finish condition + if bridgesSent >= totalBridges && reorgs >= totalReorgs { + break + } + } + + // Wait for syncer to catch up + time.Sleep(time.Second * 2) // sleeping since the processor could be up to date, but have pending reorgs + lb, err := setup.L1Environment.SimBackend.Client().BlockNumber(ctx) + require.NoError(t, err) + helpers.RequireProcessorUpdated(t, setup.L1Environment.BridgeSync, lb) + + // Get bridges + lastBlock, err := setup.L1Environment.SimBackend.Client().BlockNumber(ctx) + require.NoError(t, err) + actualBridges, err := setup.L1Environment.BridgeSync.GetBridges(ctx, 0, lastBlock) + require.NoError(t, err) + + // Assert bridges + expectedRoot, err := setup.L1Environment.BridgeContract.GetRoot(nil) + require.NoError(t, err) + root, err := setup.L1Environment.BridgeSync.GetExitRootByIndex(ctx, expectedBridges[len(expectedBridges)-1].DepositCount) + require.NoError(t, err) + require.Equal(t, common.Hash(expectedRoot).Hex(), root.Hash.Hex()) + require.Equal(t, expectedBridges, actualBridges) +} diff --git a/bridgesync/migrations/bridgesync0001.sql b/bridgesync/migrations/bridgesync0001.sql new file mode 100644 index 00000000..74adc6d5 --- /dev/null +++ b/bridgesync/migrations/bridgesync0001.sql @@ -0,0 +1,42 @@ +-- +migrate Down +DROP TABLE IF EXISTS block; +DROP TABLE IF EXISTS claim; +DROP TABLE IF EXISTS bridge; + +-- +migrate Up +CREATE TABLE block ( + num BIGINT PRIMARY KEY +); + +CREATE TABLE bridge ( + block_num INTEGER NOT NULL REFERENCES block(num) ON DELETE CASCADE, + block_pos INTEGER NOT NULL, + leaf_type INTEGER NOT NULL, + origin_network INTEGER NOT NULL, + origin_address VARCHAR NOT NULL, + destination_network INTEGER NOT NULL, + destination_address VARCHAR NOT NULL, + amount TEXT NOT NULL, + metadata BLOB, + deposit_count INTEGER NOT NULL, + PRIMARY KEY (block_num, block_pos) +); + +CREATE TABLE claim ( + block_num INTEGER NOT NULL REFERENCES block(num) ON DELETE CASCADE, + block_pos INTEGER NOT NULL, + global_index TEXT NOT NULL, + origin_network INTEGER NOT NULL, + origin_address VARCHAR NOT NULL, + destination_address VARCHAR NOT NULL, + amount TEXT NOT NULL, + proof_local_exit_root VARCHAR, + proof_rollup_exit_root VARCHAR, + mainnet_exit_root VARCHAR, + rollup_exit_root VARCHAR, + global_exit_root VARCHAR, + destination_network INTEGER NOT NULL, + metadata BLOB, + is_message BOOLEAN, + PRIMARY KEY (block_num, block_pos) +); \ No newline at end of file diff --git a/bridgesync/migrations/bridgesync0001_test.go b/bridgesync/migrations/bridgesync0001_test.go new file mode 100644 index 00000000..c234abbe --- /dev/null +++ b/bridgesync/migrations/bridgesync0001_test.go @@ -0,0 +1,61 @@ +package migrations + +import ( + "context" + "path" + "testing" + + "github.com/agglayer/aggkit/db" + "github.com/stretchr/testify/require" +) + +func Test001(t *testing.T) { + dbPath := path.Join(t.TempDir(), "bridgesyncTest001.sqlite") + + err := RunMigrations(dbPath) + require.NoError(t, err) + db, err := db.NewSQLiteDB(dbPath) + require.NoError(t, err) + + ctx := context.Background() + tx, err := db.BeginTx(ctx, nil) + require.NoError(t, err) + + _, err = tx.Exec(` + INSERT INTO block (num) VALUES (1); + + INSERT INTO bridge ( + block_num, + block_pos, + leaf_type, + origin_network, + origin_address, + destination_network, + destination_address, + amount, + metadata, + deposit_count + ) VALUES (1, 0, 0, 0, '0x0000', 0, '0x0000', 0, NULL, 0); + + INSERT INTO claim ( + block_num, + block_pos, + global_index, + origin_network, + origin_address, + destination_address, + amount, + proof_local_exit_root, + proof_rollup_exit_root, + mainnet_exit_root, + rollup_exit_root, + global_exit_root, + destination_network, + metadata, + is_message + ) VALUES (1, 0, 0, 0, '0x0000', '0x0000', 0, '0x000,0x000', '0x000,0x000', '0x000', '0x000', '0x0', 0, NULL, FALSE); + `) + require.NoError(t, err) + err = tx.Commit() + require.NoError(t, err) +} diff --git a/bridgesync/migrations/migrations.go b/bridgesync/migrations/migrations.go new file mode 100644 index 00000000..b504ed7e --- /dev/null +++ b/bridgesync/migrations/migrations.go @@ -0,0 +1,23 @@ +package migrations + +import ( + _ "embed" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/db/types" + treeMigrations "github.com/agglayer/aggkit/tree/migrations" +) + +//go:embed bridgesync0001.sql +var mig001 string + +func RunMigrations(dbPath string) error { + migrations := []types.Migration{ + { + ID: "bridgesync0001", + SQL: mig001, + }, + } + migrations = append(migrations, treeMigrations.Migrations...) + return db.RunMigrations(dbPath, migrations) +} diff --git a/bridgesync/mock_l2_test.go b/bridgesync/mock_l2_test.go new file mode 100644 index 00000000..ef842d18 --- /dev/null +++ b/bridgesync/mock_l2_test.go @@ -0,0 +1,577 @@ +// Code generated by mockery v2.45.0. DO NOT EDIT. + +package bridgesync + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + ethereum "github.com/ethereum/go-ethereum" + + mock "github.com/stretchr/testify/mock" + + rpc "github.com/ethereum/go-ethereum/rpc" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// L2Mock is an autogenerated mock type for the EthClienter type +type L2Mock struct { + mock.Mock +} + +// BlockByHash provides a mock function with given fields: ctx, hash +func (_m *L2Mock) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for BlockByHash") + } + + var r0 *types.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Block, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Block); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BlockByNumber provides a mock function with given fields: ctx, number +func (_m *L2Mock) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for BlockByNumber") + } + + var r0 *types.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Block, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Block); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BlockNumber provides a mock function with given fields: ctx +func (_m *L2Mock) BlockNumber(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for BlockNumber") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CallContract provides a mock function with given fields: ctx, call, blockNumber +func (_m *L2Mock) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + ret := _m.Called(ctx, call, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for CallContract") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg, *big.Int) ([]byte, error)); ok { + return rf(ctx, call, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg, *big.Int) []byte); ok { + r0 = rf(ctx, call, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg, *big.Int) error); ok { + r1 = rf(ctx, call, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Client provides a mock function with given fields: +func (_m *L2Mock) Client() *rpc.Client { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Client") + } + + var r0 *rpc.Client + if rf, ok := ret.Get(0).(func() *rpc.Client); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*rpc.Client) + } + } + + return r0 +} + +// CodeAt provides a mock function with given fields: ctx, contract, blockNumber +func (_m *L2Mock) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { + ret := _m.Called(ctx, contract, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for CodeAt") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) ([]byte, error)); ok { + return rf(ctx, contract, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) []byte); ok { + r0 = rf(ctx, contract, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, *big.Int) error); ok { + r1 = rf(ctx, contract, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EstimateGas provides a mock function with given fields: ctx, call +func (_m *L2Mock) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error) { + ret := _m.Called(ctx, call) + + if len(ret) == 0 { + panic("no return value specified for EstimateGas") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) (uint64, error)); ok { + return rf(ctx, call) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) uint64); ok { + r0 = rf(ctx, call) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg) error); ok { + r1 = rf(ctx, call) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FilterLogs provides a mock function with given fields: ctx, q +func (_m *L2Mock) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) { + ret := _m.Called(ctx, q) + + if len(ret) == 0 { + panic("no return value specified for FilterLogs") + } + + var r0 []types.Log + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery) ([]types.Log, error)); ok { + return rf(ctx, q) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery) []types.Log); ok { + r0 = rf(ctx, q) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.Log) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.FilterQuery) error); ok { + r1 = rf(ctx, q) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// HeaderByHash provides a mock function with given fields: ctx, hash +func (_m *L2Mock) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for HeaderByHash") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Header, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Header); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// HeaderByNumber provides a mock function with given fields: ctx, number +func (_m *L2Mock) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for HeaderByNumber") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Header, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Header); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PendingCodeAt provides a mock function with given fields: ctx, account +func (_m *L2Mock) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { + ret := _m.Called(ctx, account) + + if len(ret) == 0 { + panic("no return value specified for PendingCodeAt") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) ([]byte, error)); ok { + return rf(ctx, account) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) []byte); ok { + r0 = rf(ctx, account) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, account) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// PendingNonceAt provides a mock function with given fields: ctx, account +func (_m *L2Mock) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { + ret := _m.Called(ctx, account) + + if len(ret) == 0 { + panic("no return value specified for PendingNonceAt") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) (uint64, error)); ok { + return rf(ctx, account) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) uint64); ok { + r0 = rf(ctx, account) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, account) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SendTransaction provides a mock function with given fields: ctx, tx +func (_m *L2Mock) SendTransaction(ctx context.Context, tx *types.Transaction) error { + ret := _m.Called(ctx, tx) + + if len(ret) == 0 { + panic("no return value specified for SendTransaction") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *types.Transaction) error); ok { + r0 = rf(ctx, tx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// SubscribeFilterLogs provides a mock function with given fields: ctx, q, ch +func (_m *L2Mock) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { + ret := _m.Called(ctx, q, ch) + + if len(ret) == 0 { + panic("no return value specified for SubscribeFilterLogs") + } + + var r0 ethereum.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) (ethereum.Subscription, error)); ok { + return rf(ctx, q, ch) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) ethereum.Subscription); ok { + r0 = rf(ctx, q, ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ethereum.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) error); ok { + r1 = rf(ctx, q, ch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SubscribeNewHead provides a mock function with given fields: ctx, ch +func (_m *L2Mock) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) { + ret := _m.Called(ctx, ch) + + if len(ret) == 0 { + panic("no return value specified for SubscribeNewHead") + } + + var r0 ethereum.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) (ethereum.Subscription, error)); ok { + return rf(ctx, ch) + } + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) ethereum.Subscription); ok { + r0 = rf(ctx, ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ethereum.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, chan<- *types.Header) error); ok { + r1 = rf(ctx, ch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SuggestGasPrice provides a mock function with given fields: ctx +func (_m *L2Mock) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for SuggestGasPrice") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SuggestGasTipCap provides a mock function with given fields: ctx +func (_m *L2Mock) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for SuggestGasTipCap") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionCount provides a mock function with given fields: ctx, blockHash +func (_m *L2Mock) TransactionCount(ctx context.Context, blockHash common.Hash) (uint, error) { + ret := _m.Called(ctx, blockHash) + + if len(ret) == 0 { + panic("no return value specified for TransactionCount") + } + + var r0 uint + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (uint, error)); ok { + return rf(ctx, blockHash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) uint); ok { + r0 = rf(ctx, blockHash) + } else { + r0 = ret.Get(0).(uint) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, blockHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TransactionInBlock provides a mock function with given fields: ctx, blockHash, index +func (_m *L2Mock) TransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error) { + ret := _m.Called(ctx, blockHash, index) + + if len(ret) == 0 { + panic("no return value specified for TransactionInBlock") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash, uint) (*types.Transaction, error)); ok { + return rf(ctx, blockHash, index) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash, uint) *types.Transaction); ok { + r0 = rf(ctx, blockHash, index) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash, uint) error); ok { + r1 = rf(ctx, blockHash, index) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NewL2Mock creates a new instance of L2Mock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewL2Mock(t interface { + mock.TestingT + Cleanup(func()) +}) *L2Mock { + mock := &L2Mock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/bridgesync/mocks/eth_clienter.go b/bridgesync/mocks/eth_clienter.go new file mode 100644 index 00000000..12a99a98 --- /dev/null +++ b/bridgesync/mocks/eth_clienter.go @@ -0,0 +1,1136 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_bridgesync + +import ( + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + context "context" + + ethereum "github.com/ethereum/go-ethereum" + + mock "github.com/stretchr/testify/mock" + + rpc "github.com/ethereum/go-ethereum/rpc" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// EthClienter is an autogenerated mock type for the EthClienter type +type EthClienter struct { + mock.Mock +} + +type EthClienter_Expecter struct { + mock *mock.Mock +} + +func (_m *EthClienter) EXPECT() *EthClienter_Expecter { + return &EthClienter_Expecter{mock: &_m.Mock} +} + +// BlockByHash provides a mock function with given fields: ctx, hash +func (_m *EthClienter) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for BlockByHash") + } + + var r0 *types.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Block, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Block); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_BlockByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockByHash' +type EthClienter_BlockByHash_Call struct { + *mock.Call +} + +// BlockByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *EthClienter_Expecter) BlockByHash(ctx interface{}, hash interface{}) *EthClienter_BlockByHash_Call { + return &EthClienter_BlockByHash_Call{Call: _e.mock.On("BlockByHash", ctx, hash)} +} + +func (_c *EthClienter_BlockByHash_Call) Run(run func(ctx context.Context, hash common.Hash)) *EthClienter_BlockByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthClienter_BlockByHash_Call) Return(_a0 *types.Block, _a1 error) *EthClienter_BlockByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_BlockByHash_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Block, error)) *EthClienter_BlockByHash_Call { + _c.Call.Return(run) + return _c +} + +// BlockByNumber provides a mock function with given fields: ctx, number +func (_m *EthClienter) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for BlockByNumber") + } + + var r0 *types.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Block, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Block); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_BlockByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockByNumber' +type EthClienter_BlockByNumber_Call struct { + *mock.Call +} + +// BlockByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *EthClienter_Expecter) BlockByNumber(ctx interface{}, number interface{}) *EthClienter_BlockByNumber_Call { + return &EthClienter_BlockByNumber_Call{Call: _e.mock.On("BlockByNumber", ctx, number)} +} + +func (_c *EthClienter_BlockByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *EthClienter_BlockByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *EthClienter_BlockByNumber_Call) Return(_a0 *types.Block, _a1 error) *EthClienter_BlockByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_BlockByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*types.Block, error)) *EthClienter_BlockByNumber_Call { + _c.Call.Return(run) + return _c +} + +// BlockNumber provides a mock function with given fields: ctx +func (_m *EthClienter) BlockNumber(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for BlockNumber") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_BlockNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockNumber' +type EthClienter_BlockNumber_Call struct { + *mock.Call +} + +// BlockNumber is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthClienter_Expecter) BlockNumber(ctx interface{}) *EthClienter_BlockNumber_Call { + return &EthClienter_BlockNumber_Call{Call: _e.mock.On("BlockNumber", ctx)} +} + +func (_c *EthClienter_BlockNumber_Call) Run(run func(ctx context.Context)) *EthClienter_BlockNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthClienter_BlockNumber_Call) Return(_a0 uint64, _a1 error) *EthClienter_BlockNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_BlockNumber_Call) RunAndReturn(run func(context.Context) (uint64, error)) *EthClienter_BlockNumber_Call { + _c.Call.Return(run) + return _c +} + +// CallContract provides a mock function with given fields: ctx, call, blockNumber +func (_m *EthClienter) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + ret := _m.Called(ctx, call, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for CallContract") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg, *big.Int) ([]byte, error)); ok { + return rf(ctx, call, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg, *big.Int) []byte); ok { + r0 = rf(ctx, call, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg, *big.Int) error); ok { + r1 = rf(ctx, call, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_CallContract_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CallContract' +type EthClienter_CallContract_Call struct { + *mock.Call +} + +// CallContract is a helper method to define mock.On call +// - ctx context.Context +// - call ethereum.CallMsg +// - blockNumber *big.Int +func (_e *EthClienter_Expecter) CallContract(ctx interface{}, call interface{}, blockNumber interface{}) *EthClienter_CallContract_Call { + return &EthClienter_CallContract_Call{Call: _e.mock.On("CallContract", ctx, call, blockNumber)} +} + +func (_c *EthClienter_CallContract_Call) Run(run func(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int)) *EthClienter_CallContract_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.CallMsg), args[2].(*big.Int)) + }) + return _c +} + +func (_c *EthClienter_CallContract_Call) Return(_a0 []byte, _a1 error) *EthClienter_CallContract_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_CallContract_Call) RunAndReturn(run func(context.Context, ethereum.CallMsg, *big.Int) ([]byte, error)) *EthClienter_CallContract_Call { + _c.Call.Return(run) + return _c +} + +// Client provides a mock function with no fields +func (_m *EthClienter) Client() *rpc.Client { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Client") + } + + var r0 *rpc.Client + if rf, ok := ret.Get(0).(func() *rpc.Client); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*rpc.Client) + } + } + + return r0 +} + +// EthClienter_Client_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Client' +type EthClienter_Client_Call struct { + *mock.Call +} + +// Client is a helper method to define mock.On call +func (_e *EthClienter_Expecter) Client() *EthClienter_Client_Call { + return &EthClienter_Client_Call{Call: _e.mock.On("Client")} +} + +func (_c *EthClienter_Client_Call) Run(run func()) *EthClienter_Client_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EthClienter_Client_Call) Return(_a0 *rpc.Client) *EthClienter_Client_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthClienter_Client_Call) RunAndReturn(run func() *rpc.Client) *EthClienter_Client_Call { + _c.Call.Return(run) + return _c +} + +// CodeAt provides a mock function with given fields: ctx, contract, blockNumber +func (_m *EthClienter) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { + ret := _m.Called(ctx, contract, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for CodeAt") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) ([]byte, error)); ok { + return rf(ctx, contract, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) []byte); ok { + r0 = rf(ctx, contract, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, *big.Int) error); ok { + r1 = rf(ctx, contract, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_CodeAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CodeAt' +type EthClienter_CodeAt_Call struct { + *mock.Call +} + +// CodeAt is a helper method to define mock.On call +// - ctx context.Context +// - contract common.Address +// - blockNumber *big.Int +func (_e *EthClienter_Expecter) CodeAt(ctx interface{}, contract interface{}, blockNumber interface{}) *EthClienter_CodeAt_Call { + return &EthClienter_CodeAt_Call{Call: _e.mock.On("CodeAt", ctx, contract, blockNumber)} +} + +func (_c *EthClienter_CodeAt_Call) Run(run func(ctx context.Context, contract common.Address, blockNumber *big.Int)) *EthClienter_CodeAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address), args[2].(*big.Int)) + }) + return _c +} + +func (_c *EthClienter_CodeAt_Call) Return(_a0 []byte, _a1 error) *EthClienter_CodeAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_CodeAt_Call) RunAndReturn(run func(context.Context, common.Address, *big.Int) ([]byte, error)) *EthClienter_CodeAt_Call { + _c.Call.Return(run) + return _c +} + +// EstimateGas provides a mock function with given fields: ctx, call +func (_m *EthClienter) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error) { + ret := _m.Called(ctx, call) + + if len(ret) == 0 { + panic("no return value specified for EstimateGas") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) (uint64, error)); ok { + return rf(ctx, call) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) uint64); ok { + r0 = rf(ctx, call) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg) error); ok { + r1 = rf(ctx, call) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_EstimateGas_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateGas' +type EthClienter_EstimateGas_Call struct { + *mock.Call +} + +// EstimateGas is a helper method to define mock.On call +// - ctx context.Context +// - call ethereum.CallMsg +func (_e *EthClienter_Expecter) EstimateGas(ctx interface{}, call interface{}) *EthClienter_EstimateGas_Call { + return &EthClienter_EstimateGas_Call{Call: _e.mock.On("EstimateGas", ctx, call)} +} + +func (_c *EthClienter_EstimateGas_Call) Run(run func(ctx context.Context, call ethereum.CallMsg)) *EthClienter_EstimateGas_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.CallMsg)) + }) + return _c +} + +func (_c *EthClienter_EstimateGas_Call) Return(_a0 uint64, _a1 error) *EthClienter_EstimateGas_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_EstimateGas_Call) RunAndReturn(run func(context.Context, ethereum.CallMsg) (uint64, error)) *EthClienter_EstimateGas_Call { + _c.Call.Return(run) + return _c +} + +// FilterLogs provides a mock function with given fields: ctx, q +func (_m *EthClienter) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) { + ret := _m.Called(ctx, q) + + if len(ret) == 0 { + panic("no return value specified for FilterLogs") + } + + var r0 []types.Log + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery) ([]types.Log, error)); ok { + return rf(ctx, q) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery) []types.Log); ok { + r0 = rf(ctx, q) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.Log) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.FilterQuery) error); ok { + r1 = rf(ctx, q) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_FilterLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterLogs' +type EthClienter_FilterLogs_Call struct { + *mock.Call +} + +// FilterLogs is a helper method to define mock.On call +// - ctx context.Context +// - q ethereum.FilterQuery +func (_e *EthClienter_Expecter) FilterLogs(ctx interface{}, q interface{}) *EthClienter_FilterLogs_Call { + return &EthClienter_FilterLogs_Call{Call: _e.mock.On("FilterLogs", ctx, q)} +} + +func (_c *EthClienter_FilterLogs_Call) Run(run func(ctx context.Context, q ethereum.FilterQuery)) *EthClienter_FilterLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.FilterQuery)) + }) + return _c +} + +func (_c *EthClienter_FilterLogs_Call) Return(_a0 []types.Log, _a1 error) *EthClienter_FilterLogs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_FilterLogs_Call) RunAndReturn(run func(context.Context, ethereum.FilterQuery) ([]types.Log, error)) *EthClienter_FilterLogs_Call { + _c.Call.Return(run) + return _c +} + +// HeaderByHash provides a mock function with given fields: ctx, hash +func (_m *EthClienter) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for HeaderByHash") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Header, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Header); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_HeaderByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByHash' +type EthClienter_HeaderByHash_Call struct { + *mock.Call +} + +// HeaderByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *EthClienter_Expecter) HeaderByHash(ctx interface{}, hash interface{}) *EthClienter_HeaderByHash_Call { + return &EthClienter_HeaderByHash_Call{Call: _e.mock.On("HeaderByHash", ctx, hash)} +} + +func (_c *EthClienter_HeaderByHash_Call) Run(run func(ctx context.Context, hash common.Hash)) *EthClienter_HeaderByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthClienter_HeaderByHash_Call) Return(_a0 *types.Header, _a1 error) *EthClienter_HeaderByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_HeaderByHash_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Header, error)) *EthClienter_HeaderByHash_Call { + _c.Call.Return(run) + return _c +} + +// HeaderByNumber provides a mock function with given fields: ctx, number +func (_m *EthClienter) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for HeaderByNumber") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Header, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Header); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_HeaderByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByNumber' +type EthClienter_HeaderByNumber_Call struct { + *mock.Call +} + +// HeaderByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *EthClienter_Expecter) HeaderByNumber(ctx interface{}, number interface{}) *EthClienter_HeaderByNumber_Call { + return &EthClienter_HeaderByNumber_Call{Call: _e.mock.On("HeaderByNumber", ctx, number)} +} + +func (_c *EthClienter_HeaderByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *EthClienter_HeaderByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *EthClienter_HeaderByNumber_Call) Return(_a0 *types.Header, _a1 error) *EthClienter_HeaderByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_HeaderByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*types.Header, error)) *EthClienter_HeaderByNumber_Call { + _c.Call.Return(run) + return _c +} + +// PendingCodeAt provides a mock function with given fields: ctx, account +func (_m *EthClienter) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { + ret := _m.Called(ctx, account) + + if len(ret) == 0 { + panic("no return value specified for PendingCodeAt") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) ([]byte, error)); ok { + return rf(ctx, account) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) []byte); ok { + r0 = rf(ctx, account) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, account) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_PendingCodeAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PendingCodeAt' +type EthClienter_PendingCodeAt_Call struct { + *mock.Call +} + +// PendingCodeAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +func (_e *EthClienter_Expecter) PendingCodeAt(ctx interface{}, account interface{}) *EthClienter_PendingCodeAt_Call { + return &EthClienter_PendingCodeAt_Call{Call: _e.mock.On("PendingCodeAt", ctx, account)} +} + +func (_c *EthClienter_PendingCodeAt_Call) Run(run func(ctx context.Context, account common.Address)) *EthClienter_PendingCodeAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *EthClienter_PendingCodeAt_Call) Return(_a0 []byte, _a1 error) *EthClienter_PendingCodeAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_PendingCodeAt_Call) RunAndReturn(run func(context.Context, common.Address) ([]byte, error)) *EthClienter_PendingCodeAt_Call { + _c.Call.Return(run) + return _c +} + +// PendingNonceAt provides a mock function with given fields: ctx, account +func (_m *EthClienter) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { + ret := _m.Called(ctx, account) + + if len(ret) == 0 { + panic("no return value specified for PendingNonceAt") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) (uint64, error)); ok { + return rf(ctx, account) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) uint64); ok { + r0 = rf(ctx, account) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, account) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_PendingNonceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PendingNonceAt' +type EthClienter_PendingNonceAt_Call struct { + *mock.Call +} + +// PendingNonceAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +func (_e *EthClienter_Expecter) PendingNonceAt(ctx interface{}, account interface{}) *EthClienter_PendingNonceAt_Call { + return &EthClienter_PendingNonceAt_Call{Call: _e.mock.On("PendingNonceAt", ctx, account)} +} + +func (_c *EthClienter_PendingNonceAt_Call) Run(run func(ctx context.Context, account common.Address)) *EthClienter_PendingNonceAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *EthClienter_PendingNonceAt_Call) Return(_a0 uint64, _a1 error) *EthClienter_PendingNonceAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_PendingNonceAt_Call) RunAndReturn(run func(context.Context, common.Address) (uint64, error)) *EthClienter_PendingNonceAt_Call { + _c.Call.Return(run) + return _c +} + +// SendTransaction provides a mock function with given fields: ctx, tx +func (_m *EthClienter) SendTransaction(ctx context.Context, tx *types.Transaction) error { + ret := _m.Called(ctx, tx) + + if len(ret) == 0 { + panic("no return value specified for SendTransaction") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *types.Transaction) error); ok { + r0 = rf(ctx, tx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EthClienter_SendTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendTransaction' +type EthClienter_SendTransaction_Call struct { + *mock.Call +} + +// SendTransaction is a helper method to define mock.On call +// - ctx context.Context +// - tx *types.Transaction +func (_e *EthClienter_Expecter) SendTransaction(ctx interface{}, tx interface{}) *EthClienter_SendTransaction_Call { + return &EthClienter_SendTransaction_Call{Call: _e.mock.On("SendTransaction", ctx, tx)} +} + +func (_c *EthClienter_SendTransaction_Call) Run(run func(ctx context.Context, tx *types.Transaction)) *EthClienter_SendTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*types.Transaction)) + }) + return _c +} + +func (_c *EthClienter_SendTransaction_Call) Return(_a0 error) *EthClienter_SendTransaction_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthClienter_SendTransaction_Call) RunAndReturn(run func(context.Context, *types.Transaction) error) *EthClienter_SendTransaction_Call { + _c.Call.Return(run) + return _c +} + +// SubscribeFilterLogs provides a mock function with given fields: ctx, q, ch +func (_m *EthClienter) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { + ret := _m.Called(ctx, q, ch) + + if len(ret) == 0 { + panic("no return value specified for SubscribeFilterLogs") + } + + var r0 ethereum.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) (ethereum.Subscription, error)); ok { + return rf(ctx, q, ch) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) ethereum.Subscription); ok { + r0 = rf(ctx, q, ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ethereum.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) error); ok { + r1 = rf(ctx, q, ch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_SubscribeFilterLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeFilterLogs' +type EthClienter_SubscribeFilterLogs_Call struct { + *mock.Call +} + +// SubscribeFilterLogs is a helper method to define mock.On call +// - ctx context.Context +// - q ethereum.FilterQuery +// - ch chan<- types.Log +func (_e *EthClienter_Expecter) SubscribeFilterLogs(ctx interface{}, q interface{}, ch interface{}) *EthClienter_SubscribeFilterLogs_Call { + return &EthClienter_SubscribeFilterLogs_Call{Call: _e.mock.On("SubscribeFilterLogs", ctx, q, ch)} +} + +func (_c *EthClienter_SubscribeFilterLogs_Call) Run(run func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log)) *EthClienter_SubscribeFilterLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.FilterQuery), args[2].(chan<- types.Log)) + }) + return _c +} + +func (_c *EthClienter_SubscribeFilterLogs_Call) Return(_a0 ethereum.Subscription, _a1 error) *EthClienter_SubscribeFilterLogs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_SubscribeFilterLogs_Call) RunAndReturn(run func(context.Context, ethereum.FilterQuery, chan<- types.Log) (ethereum.Subscription, error)) *EthClienter_SubscribeFilterLogs_Call { + _c.Call.Return(run) + return _c +} + +// SubscribeNewHead provides a mock function with given fields: ctx, ch +func (_m *EthClienter) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) { + ret := _m.Called(ctx, ch) + + if len(ret) == 0 { + panic("no return value specified for SubscribeNewHead") + } + + var r0 ethereum.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) (ethereum.Subscription, error)); ok { + return rf(ctx, ch) + } + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) ethereum.Subscription); ok { + r0 = rf(ctx, ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ethereum.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, chan<- *types.Header) error); ok { + r1 = rf(ctx, ch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_SubscribeNewHead_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewHead' +type EthClienter_SubscribeNewHead_Call struct { + *mock.Call +} + +// SubscribeNewHead is a helper method to define mock.On call +// - ctx context.Context +// - ch chan<- *types.Header +func (_e *EthClienter_Expecter) SubscribeNewHead(ctx interface{}, ch interface{}) *EthClienter_SubscribeNewHead_Call { + return &EthClienter_SubscribeNewHead_Call{Call: _e.mock.On("SubscribeNewHead", ctx, ch)} +} + +func (_c *EthClienter_SubscribeNewHead_Call) Run(run func(ctx context.Context, ch chan<- *types.Header)) *EthClienter_SubscribeNewHead_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(chan<- *types.Header)) + }) + return _c +} + +func (_c *EthClienter_SubscribeNewHead_Call) Return(_a0 ethereum.Subscription, _a1 error) *EthClienter_SubscribeNewHead_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_SubscribeNewHead_Call) RunAndReturn(run func(context.Context, chan<- *types.Header) (ethereum.Subscription, error)) *EthClienter_SubscribeNewHead_Call { + _c.Call.Return(run) + return _c +} + +// SuggestGasPrice provides a mock function with given fields: ctx +func (_m *EthClienter) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for SuggestGasPrice") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_SuggestGasPrice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SuggestGasPrice' +type EthClienter_SuggestGasPrice_Call struct { + *mock.Call +} + +// SuggestGasPrice is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthClienter_Expecter) SuggestGasPrice(ctx interface{}) *EthClienter_SuggestGasPrice_Call { + return &EthClienter_SuggestGasPrice_Call{Call: _e.mock.On("SuggestGasPrice", ctx)} +} + +func (_c *EthClienter_SuggestGasPrice_Call) Run(run func(ctx context.Context)) *EthClienter_SuggestGasPrice_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthClienter_SuggestGasPrice_Call) Return(_a0 *big.Int, _a1 error) *EthClienter_SuggestGasPrice_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_SuggestGasPrice_Call) RunAndReturn(run func(context.Context) (*big.Int, error)) *EthClienter_SuggestGasPrice_Call { + _c.Call.Return(run) + return _c +} + +// SuggestGasTipCap provides a mock function with given fields: ctx +func (_m *EthClienter) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for SuggestGasTipCap") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_SuggestGasTipCap_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SuggestGasTipCap' +type EthClienter_SuggestGasTipCap_Call struct { + *mock.Call +} + +// SuggestGasTipCap is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthClienter_Expecter) SuggestGasTipCap(ctx interface{}) *EthClienter_SuggestGasTipCap_Call { + return &EthClienter_SuggestGasTipCap_Call{Call: _e.mock.On("SuggestGasTipCap", ctx)} +} + +func (_c *EthClienter_SuggestGasTipCap_Call) Run(run func(ctx context.Context)) *EthClienter_SuggestGasTipCap_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthClienter_SuggestGasTipCap_Call) Return(_a0 *big.Int, _a1 error) *EthClienter_SuggestGasTipCap_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_SuggestGasTipCap_Call) RunAndReturn(run func(context.Context) (*big.Int, error)) *EthClienter_SuggestGasTipCap_Call { + _c.Call.Return(run) + return _c +} + +// TransactionCount provides a mock function with given fields: ctx, blockHash +func (_m *EthClienter) TransactionCount(ctx context.Context, blockHash common.Hash) (uint, error) { + ret := _m.Called(ctx, blockHash) + + if len(ret) == 0 { + panic("no return value specified for TransactionCount") + } + + var r0 uint + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (uint, error)); ok { + return rf(ctx, blockHash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) uint); ok { + r0 = rf(ctx, blockHash) + } else { + r0 = ret.Get(0).(uint) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, blockHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_TransactionCount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransactionCount' +type EthClienter_TransactionCount_Call struct { + *mock.Call +} + +// TransactionCount is a helper method to define mock.On call +// - ctx context.Context +// - blockHash common.Hash +func (_e *EthClienter_Expecter) TransactionCount(ctx interface{}, blockHash interface{}) *EthClienter_TransactionCount_Call { + return &EthClienter_TransactionCount_Call{Call: _e.mock.On("TransactionCount", ctx, blockHash)} +} + +func (_c *EthClienter_TransactionCount_Call) Run(run func(ctx context.Context, blockHash common.Hash)) *EthClienter_TransactionCount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthClienter_TransactionCount_Call) Return(_a0 uint, _a1 error) *EthClienter_TransactionCount_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_TransactionCount_Call) RunAndReturn(run func(context.Context, common.Hash) (uint, error)) *EthClienter_TransactionCount_Call { + _c.Call.Return(run) + return _c +} + +// TransactionInBlock provides a mock function with given fields: ctx, blockHash, index +func (_m *EthClienter) TransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error) { + ret := _m.Called(ctx, blockHash, index) + + if len(ret) == 0 { + panic("no return value specified for TransactionInBlock") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash, uint) (*types.Transaction, error)); ok { + return rf(ctx, blockHash, index) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash, uint) *types.Transaction); ok { + r0 = rf(ctx, blockHash, index) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash, uint) error); ok { + r1 = rf(ctx, blockHash, index) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_TransactionInBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransactionInBlock' +type EthClienter_TransactionInBlock_Call struct { + *mock.Call +} + +// TransactionInBlock is a helper method to define mock.On call +// - ctx context.Context +// - blockHash common.Hash +// - index uint +func (_e *EthClienter_Expecter) TransactionInBlock(ctx interface{}, blockHash interface{}, index interface{}) *EthClienter_TransactionInBlock_Call { + return &EthClienter_TransactionInBlock_Call{Call: _e.mock.On("TransactionInBlock", ctx, blockHash, index)} +} + +func (_c *EthClienter_TransactionInBlock_Call) Run(run func(ctx context.Context, blockHash common.Hash, index uint)) *EthClienter_TransactionInBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash), args[2].(uint)) + }) + return _c +} + +func (_c *EthClienter_TransactionInBlock_Call) Return(_a0 *types.Transaction, _a1 error) *EthClienter_TransactionInBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_TransactionInBlock_Call) RunAndReturn(run func(context.Context, common.Hash, uint) (*types.Transaction, error)) *EthClienter_TransactionInBlock_Call { + _c.Call.Return(run) + return _c +} + +// NewEthClienter creates a new instance of EthClienter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthClienter(t interface { + mock.TestingT + Cleanup(func()) +}) *EthClienter { + mock := &EthClienter{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/bridgesync/mocks/reorg_detector.go b/bridgesync/mocks/reorg_detector.go new file mode 100644 index 00000000..d9838db4 --- /dev/null +++ b/bridgesync/mocks/reorg_detector.go @@ -0,0 +1,147 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_bridgesync + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + reorgdetector "github.com/agglayer/aggkit/reorgdetector" +) + +// ReorgDetector is an autogenerated mock type for the ReorgDetector type +type ReorgDetector struct { + mock.Mock +} + +type ReorgDetector_Expecter struct { + mock *mock.Mock +} + +func (_m *ReorgDetector) EXPECT() *ReorgDetector_Expecter { + return &ReorgDetector_Expecter{mock: &_m.Mock} +} + +// AddBlockToTrack provides a mock function with given fields: ctx, id, blockNum, blockHash +func (_m *ReorgDetector) AddBlockToTrack(ctx context.Context, id string, blockNum uint64, blockHash common.Hash) error { + ret := _m.Called(ctx, id, blockNum, blockHash) + + if len(ret) == 0 { + panic("no return value specified for AddBlockToTrack") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, uint64, common.Hash) error); ok { + r0 = rf(ctx, id, blockNum, blockHash) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ReorgDetector_AddBlockToTrack_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBlockToTrack' +type ReorgDetector_AddBlockToTrack_Call struct { + *mock.Call +} + +// AddBlockToTrack is a helper method to define mock.On call +// - ctx context.Context +// - id string +// - blockNum uint64 +// - blockHash common.Hash +func (_e *ReorgDetector_Expecter) AddBlockToTrack(ctx interface{}, id interface{}, blockNum interface{}, blockHash interface{}) *ReorgDetector_AddBlockToTrack_Call { + return &ReorgDetector_AddBlockToTrack_Call{Call: _e.mock.On("AddBlockToTrack", ctx, id, blockNum, blockHash)} +} + +func (_c *ReorgDetector_AddBlockToTrack_Call) Run(run func(ctx context.Context, id string, blockNum uint64, blockHash common.Hash)) *ReorgDetector_AddBlockToTrack_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(uint64), args[3].(common.Hash)) + }) + return _c +} + +func (_c *ReorgDetector_AddBlockToTrack_Call) Return(_a0 error) *ReorgDetector_AddBlockToTrack_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ReorgDetector_AddBlockToTrack_Call) RunAndReturn(run func(context.Context, string, uint64, common.Hash) error) *ReorgDetector_AddBlockToTrack_Call { + _c.Call.Return(run) + return _c +} + +// Subscribe provides a mock function with given fields: id +func (_m *ReorgDetector) Subscribe(id string) (*reorgdetector.Subscription, error) { + ret := _m.Called(id) + + if len(ret) == 0 { + panic("no return value specified for Subscribe") + } + + var r0 *reorgdetector.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(string) (*reorgdetector.Subscription, error)); ok { + return rf(id) + } + if rf, ok := ret.Get(0).(func(string) *reorgdetector.Subscription); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*reorgdetector.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ReorgDetector_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' +type ReorgDetector_Subscribe_Call struct { + *mock.Call +} + +// Subscribe is a helper method to define mock.On call +// - id string +func (_e *ReorgDetector_Expecter) Subscribe(id interface{}) *ReorgDetector_Subscribe_Call { + return &ReorgDetector_Subscribe_Call{Call: _e.mock.On("Subscribe", id)} +} + +func (_c *ReorgDetector_Subscribe_Call) Run(run func(id string)) *ReorgDetector_Subscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *ReorgDetector_Subscribe_Call) Return(_a0 *reorgdetector.Subscription, _a1 error) *ReorgDetector_Subscribe_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ReorgDetector_Subscribe_Call) RunAndReturn(run func(string) (*reorgdetector.Subscription, error)) *ReorgDetector_Subscribe_Call { + _c.Call.Return(run) + return _c +} + +// NewReorgDetector creates a new instance of ReorgDetector. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewReorgDetector(t interface { + mock.TestingT + Cleanup(func()) +}) *ReorgDetector { + mock := &ReorgDetector{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/bridgesync/processor.go b/bridgesync/processor.go new file mode 100644 index 00000000..a3eb6dd0 --- /dev/null +++ b/bridgesync/processor.go @@ -0,0 +1,399 @@ +package bridgesync + +import ( + "context" + "database/sql" + "encoding/binary" + "errors" + "fmt" + "math/big" + mutex "sync" + + "github.com/agglayer/aggkit/bridgesync/migrations" + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sync" + "github.com/agglayer/aggkit/tree" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/iden3/go-iden3-crypto/keccak256" + "github.com/russross/meddler" + _ "modernc.org/sqlite" +) + +const ( + globalIndexPartSize = 4 + globalIndexMaxSize = 9 +) + +var ( + // errBlockNotProcessedFormat indicates that the given block(s) have not been processed yet. + errBlockNotProcessedFormat = fmt.Sprintf("block %%d not processed, last processed: %%d") +) + +// Bridge is the representation of a bridge event +type Bridge struct { + BlockNum uint64 `meddler:"block_num"` + BlockPos uint64 `meddler:"block_pos"` + LeafType uint8 `meddler:"leaf_type"` + OriginNetwork uint32 `meddler:"origin_network"` + OriginAddress common.Address `meddler:"origin_address"` + DestinationNetwork uint32 `meddler:"destination_network"` + DestinationAddress common.Address `meddler:"destination_address"` + Amount *big.Int `meddler:"amount,bigint"` + Metadata []byte `meddler:"metadata"` + DepositCount uint32 `meddler:"deposit_count"` +} + +// Hash returns the hash of the bridge event as expected by the exit tree +func (b *Bridge) Hash() common.Hash { + const ( + uint32ByteSize = 4 + bigIntSize = 32 + ) + origNet := make([]byte, uint32ByteSize) + binary.BigEndian.PutUint32(origNet, b.OriginNetwork) + destNet := make([]byte, uint32ByteSize) + binary.BigEndian.PutUint32(destNet, b.DestinationNetwork) + + metaHash := keccak256.Hash(b.Metadata) + var buf [bigIntSize]byte + if b.Amount == nil { + b.Amount = big.NewInt(0) + } + + return common.BytesToHash(keccak256.Hash( + []byte{b.LeafType}, + origNet, + b.OriginAddress[:], + destNet, + b.DestinationAddress[:], + b.Amount.FillBytes(buf[:]), + metaHash, + )) +} + +// Claim representation of a claim event +type Claim struct { + BlockNum uint64 `meddler:"block_num"` + BlockPos uint64 `meddler:"block_pos"` + GlobalIndex *big.Int `meddler:"global_index,bigint"` + OriginNetwork uint32 `meddler:"origin_network"` + OriginAddress common.Address `meddler:"origin_address"` + DestinationAddress common.Address `meddler:"destination_address"` + Amount *big.Int `meddler:"amount,bigint"` + ProofLocalExitRoot types.Proof `meddler:"proof_local_exit_root,merkleproof"` + ProofRollupExitRoot types.Proof `meddler:"proof_rollup_exit_root,merkleproof"` + MainnetExitRoot common.Hash `meddler:"mainnet_exit_root,hash"` + RollupExitRoot common.Hash `meddler:"rollup_exit_root,hash"` + GlobalExitRoot common.Hash `meddler:"global_exit_root,hash"` + DestinationNetwork uint32 `meddler:"destination_network"` + Metadata []byte `meddler:"metadata"` + IsMessage bool `meddler:"is_message"` +} + +// Event combination of bridge and claim events +type Event struct { + Pos uint64 + Bridge *Bridge + Claim *Claim +} + +type processor struct { + db *sql.DB + exitTree *tree.AppendOnlyTree + log *log.Logger + mu mutex.RWMutex + halted bool + haltedReason string +} + +func newProcessor(dbPath string, logger *log.Logger) (*processor, error) { + err := migrations.RunMigrations(dbPath) + if err != nil { + return nil, err + } + db, err := db.NewSQLiteDB(dbPath) + if err != nil { + return nil, err + } + + exitTree := tree.NewAppendOnlyTree(db, "") + return &processor{ + db: db, + exitTree: exitTree, + log: logger, + }, nil +} +func (p *processor) GetBridgesPublished( + ctx context.Context, fromBlock, toBlock uint64, +) ([]Bridge, error) { + return p.GetBridges(ctx, fromBlock, toBlock) +} + +func (p *processor) GetBridges( + ctx context.Context, fromBlock, toBlock uint64, +) ([]Bridge, error) { + tx, err := p.db.BeginTx(ctx, &sql.TxOptions{ReadOnly: true}) + if err != nil { + return nil, err + } + defer func() { + if err := tx.Rollback(); err != nil { + log.Warnf("error rolling back tx: %v", err) + } + }() + rows, err := p.queryBlockRange(tx, fromBlock, toBlock, "bridge") + if err != nil { + return nil, err + } + bridgePtrs := []*Bridge{} + if err = meddler.ScanAll(rows, &bridgePtrs); err != nil { + return nil, err + } + bridgesIface := db.SlicePtrsToSlice(bridgePtrs) + bridges, ok := bridgesIface.([]Bridge) + if !ok { + return nil, errors.New("failed to convert from []*Bridge to []Bridge") + } + return bridges, nil +} + +func (p *processor) GetClaims( + ctx context.Context, fromBlock, toBlock uint64, +) ([]Claim, error) { + tx, err := p.db.BeginTx(ctx, &sql.TxOptions{ReadOnly: true}) + if err != nil { + return nil, err + } + defer func() { + if err := tx.Rollback(); err != nil { + log.Warnf("error rolling back tx: %v", err) + } + }() + rows, err := p.queryBlockRange(tx, fromBlock, toBlock, "claim") + if err != nil { + return nil, err + } + claimPtrs := []*Claim{} + if err = meddler.ScanAll(rows, &claimPtrs); err != nil { + return nil, err + } + claimsIface := db.SlicePtrsToSlice(claimPtrs) + claims, ok := claimsIface.([]Claim) + if !ok { + return nil, errors.New("failed to convert from []*Claim to []Claim") + } + return claims, nil +} + +func (p *processor) queryBlockRange(tx db.Querier, fromBlock, toBlock uint64, table string) (*sql.Rows, error) { + if err := p.isBlockProcessed(tx, toBlock); err != nil { + return nil, err + } + rows, err := tx.Query(fmt.Sprintf(` + SELECT * FROM %s + WHERE block_num >= $1 AND block_num <= $2; + `, table), fromBlock, toBlock) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, db.ErrNotFound + } + return nil, err + } + return rows, nil +} + +func (p *processor) isBlockProcessed(tx db.Querier, blockNum uint64) error { + lpb, err := p.getLastProcessedBlockWithTx(tx) + if err != nil { + return err + } + if lpb < blockNum { + return fmt.Errorf(errBlockNotProcessedFormat, blockNum, lpb) + } + return nil +} + +// GetLastProcessedBlock returns the last processed block by the processor, including blocks +// that don't have events +func (p *processor) GetLastProcessedBlock(ctx context.Context) (uint64, error) { + return p.getLastProcessedBlockWithTx(p.db) +} + +func (p *processor) getLastProcessedBlockWithTx(tx db.Querier) (uint64, error) { + var lastProcessedBlock uint64 + row := tx.QueryRow("SELECT num FROM block ORDER BY num DESC LIMIT 1;") + err := row.Scan(&lastProcessedBlock) + if errors.Is(err, sql.ErrNoRows) { + return 0, nil + } + return lastProcessedBlock, err +} + +// Reorg triggers a purge and reset process on the processor to leaf it on a state +// as if the last block processed was firstReorgedBlock-1 +func (p *processor) Reorg(ctx context.Context, firstReorgedBlock uint64) error { + tx, err := db.NewTx(ctx, p.db) + if err != nil { + return err + } + defer func() { + if err != nil { + if errRllbck := tx.Rollback(); errRllbck != nil { + log.Errorf("error while rolling back tx %v", errRllbck) + } + } + }() + + res, err := tx.Exec(`DELETE FROM block WHERE num >= $1;`, firstReorgedBlock) + if err != nil { + return err + } + rowsAffected, err := res.RowsAffected() + if err != nil { + return err + } + + if err = p.exitTree.Reorg(tx, firstReorgedBlock); err != nil { + return err + } + if err := tx.Commit(); err != nil { + return err + } + sync.UnhaltIfAffectedRows(&p.halted, &p.haltedReason, &p.mu, rowsAffected) + return nil +} + +// ProcessBlock process the events of the block to build the exit tree +// and updates the last processed block (can be called without events for that purpose) +func (p *processor) ProcessBlock(ctx context.Context, block sync.Block) error { + if p.isHalted() { + log.Errorf("processor is halted due to: %s", p.haltedReason) + return sync.ErrInconsistentState + } + tx, err := db.NewTx(ctx, p.db) + if err != nil { + return err + } + shouldRollback := true + defer func() { + if shouldRollback { + if errRllbck := tx.Rollback(); errRllbck != nil { + log.Errorf("error while rolling back tx %v", errRllbck) + } + } + }() + + if _, err := tx.Exec(`INSERT INTO block (num) VALUES ($1)`, block.Num); err != nil { + return err + } + for _, e := range block.Events { + event, ok := e.(Event) + if !ok { + return errors.New("failed to convert sync.Block.Event to Event") + } + if event.Bridge != nil { + if err = p.exitTree.AddLeaf(tx, block.Num, event.Pos, types.Leaf{ + Index: event.Bridge.DepositCount, + Hash: event.Bridge.Hash(), + }); err != nil { + if errors.Is(err, tree.ErrInvalidIndex) { + p.mu.Lock() + p.halted = true + p.haltedReason = fmt.Sprintf("error adding leaf to the exit tree: %v", err) + p.mu.Unlock() + } + return sync.ErrInconsistentState + } + if err = meddler.Insert(tx, "bridge", event.Bridge); err != nil { + return err + } + } + if event.Claim != nil { + if err = meddler.Insert(tx, "claim", event.Claim); err != nil { + return err + } + } + } + + if err := tx.Commit(); err != nil { + return err + } + shouldRollback = false + + p.log.Debugf("processed %d events until block %d", len(block.Events), block.Num) + return nil +} + +func GenerateGlobalIndex(mainnetFlag bool, rollupIndex uint32, localExitRootIndex uint32) *big.Int { + var ( + globalIndexBytes []byte + buf [globalIndexPartSize]byte + ) + if mainnetFlag { + globalIndexBytes = append(globalIndexBytes, big.NewInt(1).Bytes()...) + ri := big.NewInt(0).FillBytes(buf[:]) + globalIndexBytes = append(globalIndexBytes, ri...) + } else { + ri := big.NewInt(0).SetUint64(uint64(rollupIndex)).FillBytes(buf[:]) + globalIndexBytes = append(globalIndexBytes, ri...) + } + leri := big.NewInt(0).SetUint64(uint64(localExitRootIndex)).FillBytes(buf[:]) + globalIndexBytes = append(globalIndexBytes, leri...) + + result := big.NewInt(0).SetBytes(globalIndexBytes) + + return result +} + +// Decodes global index to its three parts: +// 1. mainnetFlag - first byte +// 2. rollupIndex - next 4 bytes +// 3. localExitRootIndex - last 4 bytes +// NOTE - mainnet flag is not in the global index bytes if it is false +// NOTE - rollup index is 0 if mainnet flag is true +// NOTE - rollup index is not in the global index bytes if mainnet flag is false and rollup index is 0 +func DecodeGlobalIndex(globalIndex *big.Int) (mainnetFlag bool, + rollupIndex uint32, localExitRootIndex uint32, err error) { + globalIndexBytes := globalIndex.Bytes() + l := len(globalIndexBytes) + if l > globalIndexMaxSize { + return false, 0, 0, errors.New("invalid global index length") + } + + if l == 0 { + // false, 0, 0 + return + } + + if l == globalIndexMaxSize { + // true, rollupIndex, localExitRootIndex + mainnetFlag = true + } + + localExitRootFromIdx := l - globalIndexPartSize + if localExitRootFromIdx < 0 { + localExitRootFromIdx = 0 + } + + rollupIndexFromIdx := localExitRootFromIdx - globalIndexPartSize + if rollupIndexFromIdx < 0 { + rollupIndexFromIdx = 0 + } + + rollupIndex = convertBytesToUint32(globalIndexBytes[rollupIndexFromIdx:localExitRootFromIdx]) + localExitRootIndex = convertBytesToUint32(globalIndexBytes[localExitRootFromIdx:]) + + return +} + +func convertBytesToUint32(bytes []byte) uint32 { + return uint32(big.NewInt(0).SetBytes(bytes).Uint64()) +} + +func (p *processor) isHalted() bool { + p.mu.RLock() + defer p.mu.RUnlock() + return p.halted +} diff --git a/bridgesync/processor_test.go b/bridgesync/processor_test.go new file mode 100644 index 00000000..ab1e8e54 --- /dev/null +++ b/bridgesync/processor_test.go @@ -0,0 +1,867 @@ +package bridgesync + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "math/big" + "os" + "path" + "slices" + "testing" + + migrationsBridge "github.com/agglayer/aggkit/bridgesync/migrations" + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sync" + "github.com/agglayer/aggkit/tree/testvectors" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/russross/meddler" + "github.com/stretchr/testify/require" +) + +func TestBigIntString(t *testing.T) { + globalIndex := GenerateGlobalIndex(true, 0, 1093) + fmt.Println(globalIndex.String()) + + _, ok := new(big.Int).SetString(globalIndex.String(), 10) + require.True(t, ok) + + dbPath := path.Join(t.TempDir(), "bridgesyncTestBigIntString.sqlite") + + err := migrationsBridge.RunMigrations(dbPath) + require.NoError(t, err) + db, err := db.NewSQLiteDB(dbPath) + require.NoError(t, err) + + ctx := context.Background() + tx, err := db.BeginTx(ctx, nil) + require.NoError(t, err) + + claim := &Claim{ + BlockNum: 1, + BlockPos: 0, + GlobalIndex: GenerateGlobalIndex(true, 0, 1093), + OriginNetwork: 11, + Amount: big.NewInt(11), + OriginAddress: common.HexToAddress("0x11"), + DestinationAddress: common.HexToAddress("0x11"), + ProofLocalExitRoot: types.Proof{}, + ProofRollupExitRoot: types.Proof{}, + MainnetExitRoot: common.Hash{}, + RollupExitRoot: common.Hash{}, + GlobalExitRoot: common.Hash{}, + DestinationNetwork: 12, + } + + _, err = tx.Exec(`INSERT INTO block (num) VALUES ($1)`, claim.BlockNum) + require.NoError(t, err) + require.NoError(t, meddler.Insert(tx, "claim", claim)) + + require.NoError(t, tx.Commit()) + + tx, err = db.BeginTx(ctx, nil) + require.NoError(t, err) + + rows, err := tx.Query(` + SELECT * FROM claim + WHERE block_num >= $1 AND block_num <= $2; + `, claim.BlockNum, claim.BlockNum) + require.NoError(t, err) + + claimsFromDB := []*Claim{} + require.NoError(t, meddler.ScanAll(rows, &claimsFromDB)) + require.Len(t, claimsFromDB, 1) + require.Equal(t, claim, claimsFromDB[0]) +} + +func TestProceessor(t *testing.T) { + path := path.Join(t.TempDir(), "aggsenderTestProceessor.sqlite") + logger := log.WithFields("bridge-syncer", "foo") + p, err := newProcessor(path, logger) + require.NoError(t, err) + actions := []processAction{ + // processed: ~ + &getLastProcessedBlockAction{ + p: p, + description: "on an empty processor", + ctx: context.Background(), + expectedLastProcessedBlock: 0, + expectedErr: nil, + }, + &reorgAction{ + p: p, + description: "on an empty processor: firstReorgedBlock = 0", + firstReorgedBlock: 0, + expectedErr: nil, + }, + &reorgAction{ + p: p, + description: "on an empty processor: firstReorgedBlock = 1", + firstReorgedBlock: 1, + expectedErr: nil, + }, + &getClaims{ + p: p, + description: "on an empty processor", + ctx: context.Background(), + fromBlock: 0, + toBlock: 2, + expectedClaims: nil, + expectedErr: fmt.Errorf(errBlockNotProcessedFormat, 2, 0), + }, + &getBridges{ + p: p, + description: "on an empty processor", + ctx: context.Background(), + fromBlock: 0, + toBlock: 2, + expectedBridges: nil, + expectedErr: fmt.Errorf(errBlockNotProcessedFormat, 2, 0), + }, + &processBlockAction{ + p: p, + description: "block1", + block: block1, + expectedErr: nil, + }, + // processed: block1 + &getLastProcessedBlockAction{ + p: p, + description: "after block1", + ctx: context.Background(), + expectedLastProcessedBlock: 1, + expectedErr: nil, + }, + &getClaims{ + p: p, + description: "after block1: range 0, 2", + ctx: context.Background(), + fromBlock: 0, + toBlock: 2, + expectedClaims: nil, + expectedErr: fmt.Errorf(errBlockNotProcessedFormat, 2, 1), + }, + &getBridges{ + p: p, + description: "after block1: range 0, 2", + ctx: context.Background(), + fromBlock: 0, + toBlock: 2, + expectedBridges: nil, + expectedErr: fmt.Errorf(errBlockNotProcessedFormat, 2, 1), + }, + &getClaims{ + p: p, + description: "after block1: range 1, 1", + ctx: context.Background(), + fromBlock: 1, + toBlock: 1, + expectedClaims: eventsToClaims(block1.Events), + expectedErr: nil, + }, + &getBridges{ + p: p, + description: "after block1: range 1, 1", + ctx: context.Background(), + fromBlock: 1, + toBlock: 1, + expectedBridges: eventsToBridges(block1.Events), + expectedErr: nil, + }, + &reorgAction{ + p: p, + description: "after block1", + firstReorgedBlock: 1, + expectedErr: nil, + }, + // processed: ~ + &getClaims{ + p: p, + description: "after block1 reorged", + ctx: context.Background(), + fromBlock: 0, + toBlock: 2, + expectedClaims: nil, + expectedErr: fmt.Errorf(errBlockNotProcessedFormat, 2, 0), + }, + &getBridges{ + p: p, + description: "after block1 reorged", + ctx: context.Background(), + fromBlock: 0, + toBlock: 2, + expectedBridges: nil, + expectedErr: fmt.Errorf(errBlockNotProcessedFormat, 2, 0), + }, + &processBlockAction{ + p: p, + description: "block1 (after it's reorged)", + block: block1, + expectedErr: nil, + }, + // processed: block3 + &processBlockAction{ + p: p, + description: "block3", + block: block3, + expectedErr: nil, + }, + // processed: block1, block3 + &getLastProcessedBlockAction{ + p: p, + description: "after block3", + ctx: context.Background(), + expectedLastProcessedBlock: 3, + expectedErr: nil, + }, + &getClaims{ + p: p, + description: "after block3: range 2, 2", + ctx: context.Background(), + fromBlock: 2, + toBlock: 2, + expectedClaims: []Claim{}, + expectedErr: nil, + }, + &getClaims{ + p: p, + description: "after block3: range 1, 3", + ctx: context.Background(), + fromBlock: 1, + toBlock: 3, + expectedClaims: append( + eventsToClaims(block1.Events), + eventsToClaims(block3.Events)..., + ), + expectedErr: nil, + }, + &getBridges{ + p: p, + description: "after block3: range 2, 2", + ctx: context.Background(), + fromBlock: 2, + toBlock: 2, + expectedBridges: []Bridge{}, + expectedErr: nil, + }, + &getBridges{ + p: p, + description: "after block3: range 1, 3", + ctx: context.Background(), + fromBlock: 1, + toBlock: 3, + expectedBridges: append( + eventsToBridges(block1.Events), + eventsToBridges(block3.Events)..., + ), + expectedErr: nil, + }, + &reorgAction{ + p: p, + description: "after block3, with value 3", + firstReorgedBlock: 3, + expectedErr: nil, + }, + // processed: block1 + &getLastProcessedBlockAction{ + p: p, + description: "after block3 reorged", + ctx: context.Background(), + expectedLastProcessedBlock: 1, + expectedErr: nil, + }, + &reorgAction{ + p: p, + description: "after block3, with value 2", + firstReorgedBlock: 2, + expectedErr: nil, + }, + &getLastProcessedBlockAction{ + p: p, + description: "after block2 reorged", + ctx: context.Background(), + expectedLastProcessedBlock: 1, + expectedErr: nil, + }, + &processBlockAction{ + p: p, + description: "block3 after reorg", + block: block3, + expectedErr: nil, + }, + // processed: block1, block3 + &processBlockAction{ + p: p, + description: "block4", + block: block4, + expectedErr: nil, + }, + // processed: block1, block3, block4 + &processBlockAction{ + p: p, + description: "block5", + block: block5, + expectedErr: nil, + }, + // processed: block1, block3, block4, block5 + &getLastProcessedBlockAction{ + p: p, + description: "after block5", + ctx: context.Background(), + expectedLastProcessedBlock: 5, + expectedErr: nil, + }, + &getClaims{ + p: p, + description: "after block5: range 1, 3", + ctx: context.Background(), + fromBlock: 1, + toBlock: 3, + expectedClaims: append( + eventsToClaims(block1.Events), + eventsToClaims(block3.Events)..., + ), + expectedErr: nil, + }, + &getClaims{ + p: p, + description: "after block5: range 4, 5", + ctx: context.Background(), + fromBlock: 4, + toBlock: 5, + expectedClaims: append( + eventsToClaims(block4.Events), + eventsToClaims(block5.Events)..., + ), + expectedErr: nil, + }, + &getClaims{ + p: p, + description: "after block5: range 0, 5", + ctx: context.Background(), + fromBlock: 0, + toBlock: 5, + expectedClaims: slices.Concat( + eventsToClaims(block1.Events), + eventsToClaims(block3.Events), + eventsToClaims(block4.Events), + eventsToClaims(block5.Events), + ), + expectedErr: nil, + }, + } + + for _, a := range actions { + log.Debugf("%s: %s", a.method(), a.desc()) + a.execute(t) + } +} + +// BOILERPLATE + +// blocks + +var ( + block1 = sync.Block{ + Num: 1, + Events: []interface{}{ + Event{Bridge: &Bridge{ + BlockNum: 1, + BlockPos: 0, + LeafType: 1, + OriginNetwork: 1, + OriginAddress: common.HexToAddress("01"), + DestinationNetwork: 1, + DestinationAddress: common.HexToAddress("01"), + Amount: big.NewInt(1), + Metadata: common.Hex2Bytes("01"), + DepositCount: 0, + }}, + Event{Claim: &Claim{ + BlockNum: 1, + BlockPos: 1, + GlobalIndex: big.NewInt(1), + OriginNetwork: 1, + OriginAddress: common.HexToAddress("01"), + DestinationAddress: common.HexToAddress("01"), + Amount: big.NewInt(1), + }}, + }, + } + block3 = sync.Block{ + Num: 3, + Events: []interface{}{ + Event{Bridge: &Bridge{ + BlockNum: 3, + BlockPos: 0, + LeafType: 2, + OriginNetwork: 2, + OriginAddress: common.HexToAddress("02"), + DestinationNetwork: 2, + DestinationAddress: common.HexToAddress("02"), + Amount: big.NewInt(2), + Metadata: common.Hex2Bytes("02"), + DepositCount: 1, + }}, + Event{Bridge: &Bridge{ + BlockNum: 3, + BlockPos: 1, + LeafType: 3, + OriginNetwork: 3, + OriginAddress: common.HexToAddress("03"), + DestinationNetwork: 3, + DestinationAddress: common.HexToAddress("03"), + Amount: big.NewInt(0), + Metadata: common.Hex2Bytes("03"), + DepositCount: 2, + }}, + }, + } + block4 = sync.Block{ + Num: 4, + Events: []interface{}{}, + } + block5 = sync.Block{ + Num: 5, + Events: []interface{}{ + Event{Claim: &Claim{ + BlockNum: 4, + BlockPos: 0, + GlobalIndex: big.NewInt(4), + OriginNetwork: 4, + OriginAddress: common.HexToAddress("04"), + DestinationAddress: common.HexToAddress("04"), + Amount: big.NewInt(4), + }}, + Event{Claim: &Claim{ + BlockNum: 4, + BlockPos: 1, + GlobalIndex: big.NewInt(5), + OriginNetwork: 5, + OriginAddress: common.HexToAddress("05"), + DestinationAddress: common.HexToAddress("05"), + Amount: big.NewInt(5), + }}, + }, + } +) + +// actions + +type processAction interface { + method() string + desc() string + execute(t *testing.T) +} + +// GetClaims + +type getClaims struct { + p *processor + description string + ctx context.Context + fromBlock uint64 + toBlock uint64 + expectedClaims []Claim + expectedErr error +} + +func (a *getClaims) method() string { + return "GetClaims" +} + +func (a *getClaims) desc() string { + return a.description +} + +func (a *getClaims) execute(t *testing.T) { + t.Helper() + actualEvents, actualErr := a.p.GetClaims(a.ctx, a.fromBlock, a.toBlock) + require.Equal(t, a.expectedErr, actualErr) + require.Equal(t, a.expectedClaims, actualEvents) +} + +// GetBridges + +type getBridges struct { + p *processor + description string + ctx context.Context + fromBlock uint64 + toBlock uint64 + expectedBridges []Bridge + expectedErr error +} + +func (a *getBridges) method() string { + return "GetBridges" +} + +func (a *getBridges) desc() string { + return a.description +} + +func (a *getBridges) execute(t *testing.T) { + t.Helper() + actualEvents, actualErr := a.p.GetBridges(a.ctx, a.fromBlock, a.toBlock) + require.Equal(t, a.expectedBridges, actualEvents) + require.Equal(t, a.expectedErr, actualErr) +} + +// getLastProcessedBlock + +type getLastProcessedBlockAction struct { + p *processor + description string + ctx context.Context + expectedLastProcessedBlock uint64 + expectedErr error +} + +func (a *getLastProcessedBlockAction) method() string { + return "getLastProcessedBlock" +} + +func (a *getLastProcessedBlockAction) desc() string { + return a.description +} + +func (a *getLastProcessedBlockAction) execute(t *testing.T) { + t.Helper() + + actualLastProcessedBlock, actualErr := a.p.GetLastProcessedBlock(a.ctx) + require.Equal(t, a.expectedLastProcessedBlock, actualLastProcessedBlock) + require.Equal(t, a.expectedErr, actualErr) +} + +// reorg + +type reorgAction struct { + p *processor + description string + firstReorgedBlock uint64 + expectedErr error +} + +func (a *reorgAction) method() string { + return "reorg" +} + +func (a *reorgAction) desc() string { + return a.description +} + +func (a *reorgAction) execute(t *testing.T) { + t.Helper() + + actualErr := a.p.Reorg(context.Background(), a.firstReorgedBlock) + require.Equal(t, a.expectedErr, actualErr) +} + +// storeBridgeEvents + +type processBlockAction struct { + p *processor + description string + block sync.Block + expectedErr error +} + +func (a *processBlockAction) method() string { + return "storeBridgeEvents" +} + +func (a *processBlockAction) desc() string { + return a.description +} + +func (a *processBlockAction) execute(t *testing.T) { + t.Helper() + + actualErr := a.p.ProcessBlock(context.Background(), a.block) + require.Equal(t, a.expectedErr, actualErr) +} + +func eventsToBridges(events []interface{}) []Bridge { + bridges := []Bridge{} + for _, event := range events { + e, ok := event.(Event) + if !ok { + panic("should be ok") + } + if e.Bridge != nil { + bridges = append(bridges, *e.Bridge) + } + } + return bridges +} + +func eventsToClaims(events []interface{}) []Claim { + claims := []Claim{} + for _, event := range events { + e, ok := event.(Event) + if !ok { + panic("should be ok") + } + if e.Claim != nil { + claims = append(claims, *e.Claim) + } + } + return claims +} + +func TestHashBridge(t *testing.T) { + data, err := os.ReadFile("../tree/testvectors/leaf-vectors.json") + require.NoError(t, err) + + var leafVectors []testvectors.DepositVectorRaw + err = json.Unmarshal(data, &leafVectors) + require.NoError(t, err) + + for ti, testVector := range leafVectors { + t.Run(fmt.Sprintf("Test vector %d", ti), func(t *testing.T) { + amount, err := big.NewInt(0).SetString(testVector.Amount, 0) + require.True(t, err) + + bridge := Bridge{ + OriginNetwork: testVector.OriginNetwork, + OriginAddress: common.HexToAddress(testVector.TokenAddress), + Amount: amount, + DestinationNetwork: testVector.DestinationNetwork, + DestinationAddress: common.HexToAddress(testVector.DestinationAddress), + DepositCount: uint32(ti + 1), + Metadata: common.FromHex(testVector.Metadata), + } + require.Equal(t, common.HexToHash(testVector.ExpectedHash), bridge.Hash()) + }) + } +} + +func TestDecodeGlobalIndex(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + globalIndex *big.Int + expectedMainnetFlag bool + expectedRollupIndex uint32 + expectedLocalIndex uint32 + expectedErr error + }{ + { + name: "Mainnet flag true, rollup index 0", + globalIndex: GenerateGlobalIndex(true, 0, 2), + expectedMainnetFlag: true, + expectedRollupIndex: 0, + expectedLocalIndex: 2, + expectedErr: nil, + }, + { + name: "Mainnet flag true, indexes 0", + globalIndex: GenerateGlobalIndex(true, 0, 0), + expectedMainnetFlag: true, + expectedRollupIndex: 0, + expectedLocalIndex: 0, + expectedErr: nil, + }, + { + name: "Mainnet flag false, rollup index 0", + globalIndex: GenerateGlobalIndex(false, 0, 2), + expectedMainnetFlag: false, + expectedRollupIndex: 0, + expectedLocalIndex: 2, + expectedErr: nil, + }, + { + name: "Mainnet flag false, rollup index non-zero", + globalIndex: GenerateGlobalIndex(false, 11, 0), + expectedMainnetFlag: false, + expectedRollupIndex: 11, + expectedLocalIndex: 0, + expectedErr: nil, + }, + { + name: "Mainnet flag false, indexes 0", + globalIndex: GenerateGlobalIndex(false, 0, 0), + expectedMainnetFlag: false, + expectedRollupIndex: 0, + expectedLocalIndex: 0, + expectedErr: nil, + }, + { + name: "Mainnet flag false, indexes non zero", + globalIndex: GenerateGlobalIndex(false, 1231, 111234), + expectedMainnetFlag: false, + expectedRollupIndex: 1231, + expectedLocalIndex: 111234, + expectedErr: nil, + }, + { + name: "Invalid global index length", + globalIndex: big.NewInt(0).SetBytes([]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}), + expectedMainnetFlag: false, + expectedRollupIndex: 0, + expectedLocalIndex: 0, + expectedErr: errors.New("invalid global index length"), + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + mainnetFlag, rollupIndex, localExitRootIndex, err := DecodeGlobalIndex(tt.globalIndex) + if tt.expectedErr != nil { + require.EqualError(t, err, tt.expectedErr.Error()) + } else { + require.NoError(t, err) + } + require.Equal(t, tt.expectedMainnetFlag, mainnetFlag) + require.Equal(t, tt.expectedRollupIndex, rollupIndex) + require.Equal(t, tt.expectedLocalIndex, localExitRootIndex) + }) + } +} + +func TestInsertAndGetClaim(t *testing.T) { + path := path.Join(t.TempDir(), "aggsenderTestInsertAndGetClaim.sqlite") + log.Debugf("sqlite path: %s", path) + err := migrationsBridge.RunMigrations(path) + require.NoError(t, err) + logger := log.WithFields("bridge-syncer", "foo") + p, err := newProcessor(path, logger) + require.NoError(t, err) + + tx, err := p.db.BeginTx(context.Background(), nil) + require.NoError(t, err) + + // insert test claim + testClaim := &Claim{ + BlockNum: 1, + BlockPos: 0, + GlobalIndex: GenerateGlobalIndex(true, 0, 1093), + OriginNetwork: 11, + OriginAddress: common.HexToAddress("0x11"), + DestinationAddress: common.HexToAddress("0x11"), + Amount: big.NewInt(11), + ProofLocalExitRoot: types.Proof{}, + ProofRollupExitRoot: types.Proof{}, + MainnetExitRoot: common.Hash{}, + RollupExitRoot: common.Hash{}, + GlobalExitRoot: common.Hash{}, + DestinationNetwork: 12, + Metadata: []byte("0x11"), + IsMessage: false, + } + + _, err = tx.Exec(`INSERT INTO block (num) VALUES ($1)`, testClaim.BlockNum) + require.NoError(t, err) + require.NoError(t, meddler.Insert(tx, "claim", testClaim)) + + require.NoError(t, tx.Commit()) + + // get test claim + claims, err := p.GetClaims(context.Background(), 1, 1) + require.NoError(t, err) + require.Len(t, claims, 1) + require.Equal(t, testClaim, &claims[0]) +} + +func TestGetBridgesPublished(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + fromBlock uint64 + toBlock uint64 + bridges []Bridge + lastUpdatedDepositCount uint32 + expectedBridges []Bridge + expectedError error + }{ + { + name: "no bridges", + fromBlock: 1, + toBlock: 10, + bridges: []Bridge{}, + lastUpdatedDepositCount: 0, + expectedBridges: []Bridge{}, + expectedError: nil, + }, + { + name: "bridges within deposit count", + fromBlock: 1, + toBlock: 10, + bridges: []Bridge{ + {DepositCount: 1, BlockNum: 1, Amount: big.NewInt(1)}, + {DepositCount: 2, BlockNum: 2, Amount: big.NewInt(1)}, + }, + lastUpdatedDepositCount: 2, + expectedBridges: []Bridge{ + {DepositCount: 1, BlockNum: 1, Amount: big.NewInt(1)}, + {DepositCount: 2, BlockNum: 2, Amount: big.NewInt(1)}, + }, + expectedError: nil, + }, + } + + for _, tc := range testCases { + tc := tc + + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + path := path.Join(t.TempDir(), fmt.Sprintf("bridgesyncTestGetBridgesPublished_%s.sqlite", tc.name)) + require.NoError(t, migrationsBridge.RunMigrations(path)) + logger := log.WithFields("bridge-syncer", "foo") + p, err := newProcessor(path, logger) + require.NoError(t, err) + + tx, err := p.db.BeginTx(context.Background(), nil) + require.NoError(t, err) + + for i := tc.fromBlock; i <= tc.toBlock; i++ { + _, err = tx.Exec(`INSERT INTO block (num) VALUES ($1)`, i) + require.NoError(t, err) + } + + for _, bridge := range tc.bridges { + require.NoError(t, meddler.Insert(tx, "bridge", &bridge)) + } + + require.NoError(t, tx.Commit()) + + ctx := context.Background() + bridges, err := p.GetBridgesPublished(ctx, tc.fromBlock, tc.toBlock) + + if tc.expectedError != nil { + require.Equal(t, tc.expectedError, err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expectedBridges, bridges) + } + }) + } +} + +func TestProcessBlockInvalidIndex(t *testing.T) { + path := path.Join(t.TempDir(), "aggsenderTestProceessor.sqlite") + logger := log.WithFields("bridge-syncer", "foo") + p, err := newProcessor(path, logger) + require.NoError(t, err) + err = p.ProcessBlock(context.Background(), sync.Block{ + Num: 0, + Events: []interface{}{ + Event{Bridge: &Bridge{DepositCount: 5}}, + }, + }) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) + require.True(t, p.halted) + err = p.ProcessBlock(context.Background(), sync.Block{}) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} diff --git a/build/docker-compose.yml b/build/docker-compose.yml new file mode 100644 index 00000000..e69de29b diff --git a/claimsponsor/claimsponsor.go b/claimsponsor/claimsponsor.go new file mode 100644 index 00000000..25fe24ae --- /dev/null +++ b/claimsponsor/claimsponsor.go @@ -0,0 +1,246 @@ +package claimsponsor + +import ( + "context" + "database/sql" + "errors" + "fmt" + "math/big" + "time" + + "github.com/agglayer/aggkit/claimsponsor/migrations" + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sync" + tree "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/russross/meddler" +) + +type ClaimStatus string + +const ( + PendingClaimStatus ClaimStatus = "pending" + WIPClaimStatus ClaimStatus = "work in progress" + SuccessClaimStatus ClaimStatus = "success" + FailedClaimStatus ClaimStatus = "failed" +) + +var ( + ErrInvalidClaim = errors.New("invalid claim") + ErrClaimDoesntExist = errors.New("the claim requested to be updated does not exist") +) + +// Claim representation of a claim event +type Claim struct { + LeafType uint8 `meddler:"leaf_type"` + ProofLocalExitRoot tree.Proof `meddler:"proof_local_exit_root,merkleproof"` + ProofRollupExitRoot tree.Proof `meddler:"proof_rollup_exit_root,merkleproof"` + GlobalIndex *big.Int `meddler:"global_index,bigint"` + MainnetExitRoot common.Hash `meddler:"mainnet_exit_root,hash"` + RollupExitRoot common.Hash `meddler:"rollup_exit_root,hash"` + OriginNetwork uint32 `meddler:"origin_network"` + OriginTokenAddress common.Address `meddler:"origin_token_address,address"` + DestinationNetwork uint32 `meddler:"destination_network"` + DestinationAddress common.Address `meddler:"destination_address,address"` + Amount *big.Int `meddler:"amount,bigint"` + Metadata []byte `meddler:"metadata"` + Status ClaimStatus `meddler:"status"` + TxID string `meddler:"tx_id"` +} + +func (c *Claim) Key() []byte { + return c.GlobalIndex.Bytes() +} + +type ClaimSender interface { + checkClaim(ctx context.Context, claim *Claim) error + sendClaim(ctx context.Context, claim *Claim) (string, error) + claimStatus(ctx context.Context, id string) (ClaimStatus, error) +} + +type ClaimSponsor struct { + logger *log.Logger + db *sql.DB + sender ClaimSender + rh *sync.RetryHandler + waitTxToBeMinedPeriod time.Duration + waitOnEmptyQueue time.Duration +} + +func newClaimSponsor( + logger *log.Logger, + dbPath string, + sender ClaimSender, + retryAfterErrorPeriod time.Duration, + maxRetryAttemptsAfterError int, + waitTxToBeMinedPeriod time.Duration, + waitOnEmptyQueue time.Duration, +) (*ClaimSponsor, error) { + err := migrations.RunMigrations(dbPath) + if err != nil { + return nil, err + } + db, err := db.NewSQLiteDB(dbPath) + if err != nil { + return nil, err + } + rh := &sync.RetryHandler{ + MaxRetryAttemptsAfterError: maxRetryAttemptsAfterError, + RetryAfterErrorPeriod: retryAfterErrorPeriod, + } + + return &ClaimSponsor{ + logger: logger, + db: db, + sender: sender, + rh: rh, + waitTxToBeMinedPeriod: waitTxToBeMinedPeriod, + waitOnEmptyQueue: waitOnEmptyQueue, + }, nil +} + +func (c *ClaimSponsor) Start(ctx context.Context) { + attempts := 0 + + for { + select { + case <-ctx.Done(): + return + + default: + err := c.claim(ctx) + if err != nil { + attempts++ + c.logger.Error(err) + c.rh.Handle("claimsponsor main loop", attempts) + } else { + attempts = 0 + } + } + } +} + +func (c *ClaimSponsor) claim(ctx context.Context) error { + claim, err := c.getWIPClaim() + if err != nil && !errors.Is(err, db.ErrNotFound) { + return fmt.Errorf("error getting WIP claim: %w", err) + } + if errors.Is(err, db.ErrNotFound) || claim == nil { + // there is no WIP claim, go for the next pending claim + claim, err = c.getFirstPendingClaim() + if err != nil { + if errors.Is(err, db.ErrNotFound) { + c.logger.Debugf("queue is empty") + time.Sleep(c.waitOnEmptyQueue) + return nil + } + return fmt.Errorf("error calling getClaim with globalIndex %s: %w", claim.GlobalIndex.String(), err) + } + txID, err := c.sender.sendClaim(ctx, claim) + if err != nil { + return fmt.Errorf("error getting sending claim: %w", err) + } + if err := c.updateClaimTxID(claim.GlobalIndex, txID); err != nil { + return fmt.Errorf("error updating claim txID: %w", err) + } + } + + c.logger.Infof("waiting for tx %s with global index %s to be processed", claim.TxID, claim.GlobalIndex.String()) + status, err := c.waitForTxResult(ctx, claim.TxID) + if err != nil { + return fmt.Errorf("error calling waitForTxResult for tx %s: %w", claim.TxID, err) + } + c.logger.Infof("tx %s with global index %s is processed, status: %s", claim.TxID, claim.GlobalIndex.String(), status) + return c.updateClaimStatus(claim.GlobalIndex, status) +} + +func (c *ClaimSponsor) getWIPClaim() (*Claim, error) { + claim := &Claim{} + err := meddler.QueryRow( + c.db, claim, + `SELECT * FROM claim WHERE status = $1 ORDER BY rowid ASC LIMIT 1;`, + WIPClaimStatus, + ) + return claim, db.ReturnErrNotFound(err) +} + +func (c *ClaimSponsor) getFirstPendingClaim() (*Claim, error) { + claim := &Claim{} + err := meddler.QueryRow( + c.db, claim, + `SELECT * FROM claim WHERE status = $1 ORDER BY rowid ASC LIMIT 1;`, + PendingClaimStatus, + ) + return claim, db.ReturnErrNotFound(err) +} + +func (c *ClaimSponsor) updateClaimTxID(globalIndex *big.Int, txID string) error { + res, err := c.db.Exec( + `UPDATE claim SET tx_id = $1 WHERE global_index = $2`, + txID, globalIndex.String(), + ) + if err != nil { + return fmt.Errorf("error updating claim status: %w", err) + } + rowsAff, err := res.RowsAffected() + if err != nil { + return fmt.Errorf("error getting rows affected: %w", err) + } + if rowsAff == 0 { + return ErrClaimDoesntExist + } + return nil +} + +func (c *ClaimSponsor) updateClaimStatus(globalIndex *big.Int, status ClaimStatus) error { + res, err := c.db.Exec( + `UPDATE claim SET status = $1 WHERE global_index = $2`, + status, globalIndex.String(), + ) + if err != nil { + return fmt.Errorf("error updating claim status: %w", err) + } + rowsAff, err := res.RowsAffected() + if err != nil { + return fmt.Errorf("error getting rows affected: %w", err) + } + if rowsAff == 0 { + return ErrClaimDoesntExist + } + return nil +} + +func (c *ClaimSponsor) waitForTxResult(ctx context.Context, txID string) (ClaimStatus, error) { + ticker := time.NewTicker(c.waitTxToBeMinedPeriod) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return "", errors.New("context cancelled") + case <-ticker.C: + status, err := c.sender.claimStatus(ctx, txID) + if err != nil { + return "", err + } + + if status == FailedClaimStatus || status == SuccessClaimStatus { + return status, nil + } + } + } +} + +func (c *ClaimSponsor) AddClaimToQueue(claim *Claim) error { + claim.Status = PendingClaimStatus + return meddler.Insert(c.db, "claim", claim) +} + +func (c *ClaimSponsor) GetClaim(globalIndex *big.Int) (*Claim, error) { + claim := &Claim{} + err := meddler.QueryRow( + c.db, claim, `SELECT * FROM claim WHERE global_index = $1`, globalIndex.String(), + ) + return claim, db.ReturnErrNotFound(err) +} diff --git a/claimsponsor/e2e_test.go b/claimsponsor/e2e_test.go new file mode 100644 index 00000000..9249a980 --- /dev/null +++ b/claimsponsor/e2e_test.go @@ -0,0 +1,107 @@ +package claimsponsor_test + +import ( + "context" + "errors" + "fmt" + "math/big" + "path" + "testing" + "time" + + "github.com/agglayer/aggkit/bridgesync" + "github.com/agglayer/aggkit/claimsponsor" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/test/helpers" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestE2EL1toEVML2(t *testing.T) { + // start other needed components + ctx := context.Background() + setup := helpers.NewE2EEnvWithEVML2(t) + + // start claim sponsor + dbPathClaimSponsor := path.Join(t.TempDir(), "claimsponsorTestE2EL1toEVML2_cs.sqlite") + claimer, err := claimsponsor.NewEVMClaimSponsor( + log.GetDefaultLogger(), + dbPathClaimSponsor, + setup.L2Environment.SimBackend.Client(), + setup.L2Environment.BridgeAddr, + setup.L2Environment.Auth.From, + 200_000, + 0, + setup.EthTxManagerMock, + 0, 0, time.Millisecond*10, time.Millisecond*10, + ) + require.NoError(t, err) + go claimer.Start(ctx) + + // test + for i := uint32(0); i < 3; i++ { + // Send bridges to L2, wait for GER to be injected on L2 + amount := new(big.Int).SetUint64(uint64(i) + 1) + setup.L1Environment.Auth.Value = amount + _, err := setup.L1Environment.BridgeContract.BridgeAsset(setup.L1Environment.Auth, setup.NetworkIDL2, setup.L2Environment.Auth.From, amount, common.Address{}, true, nil) + require.NoError(t, err) + setup.L1Environment.SimBackend.Commit() + time.Sleep(time.Millisecond * 300) + + expectedGER, err := setup.L1Environment.GERContract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + isInjected, err := setup.L2Environment.AggoracleSender.IsGERInjected(expectedGER) + require.NoError(t, err) + require.True(t, isInjected, fmt.Sprintf("iteration %d, GER: %s", i, common.Bytes2Hex(expectedGER[:]))) + + // Build MP using bridgeSyncL1 & env.InfoTreeSync + info, err := setup.L1Environment.InfoTreeSync.GetInfoByIndex(ctx, i) + require.NoError(t, err) + + localProof, err := setup.L1Environment.BridgeSync.GetProof(ctx, i, info.MainnetExitRoot) + require.NoError(t, err) + + rollupProof, err := setup.L1Environment.InfoTreeSync.GetRollupExitTreeMerkleProof(ctx, 0, common.Hash{}) + require.NoError(t, err) + + // Request to sponsor claim + globalIndex := bridgesync.GenerateGlobalIndex(true, 0, i) + err = claimer.AddClaimToQueue(&claimsponsor.Claim{ + LeafType: claimsponsor.LeafTypeAsset, + ProofLocalExitRoot: localProof, + ProofRollupExitRoot: rollupProof, + GlobalIndex: globalIndex, + MainnetExitRoot: info.MainnetExitRoot, + RollupExitRoot: info.RollupExitRoot, + OriginNetwork: 0, + OriginTokenAddress: common.Address{}, + DestinationNetwork: setup.NetworkIDL2, + DestinationAddress: setup.L2Environment.Auth.From, + Amount: amount, + Metadata: nil, + }) + require.NoError(t, err) + + // Wait until success + succeed := false + for i := 0; i < 10; i++ { + claim, err := claimer.GetClaim(globalIndex) + require.NoError(t, err) + if claim.Status == claimsponsor.FailedClaimStatus { + require.NoError(t, errors.New("claim failed")) + } else if claim.Status == claimsponsor.SuccessClaimStatus { + succeed = true + + break + } + time.Sleep(100 * time.Millisecond) + } + require.True(t, succeed) + + // Check on contract that is claimed + isClaimed, err := setup.L2Environment.BridgeContract.IsClaimed(&bind.CallOpts{Pending: false}, i, 0) + require.NoError(t, err) + require.True(t, isClaimed) + } +} diff --git a/claimsponsor/evmclaimsponsor.go b/claimsponsor/evmclaimsponsor.go new file mode 100644 index 00000000..9246d923 --- /dev/null +++ b/claimsponsor/evmclaimsponsor.go @@ -0,0 +1,215 @@ +package claimsponsor + +import ( + "context" + "fmt" + "math/big" + "time" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/polygonzkevmbridgev2" + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + ethtxtypes "github.com/0xPolygon/zkevm-ethtx-manager/types" + configTypes "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +const ( + // LeafTypeAsset represents a bridge asset + LeafTypeAsset uint8 = 0 + // LeafTypeMessage represents a bridge message + LeafTypeMessage uint8 = 1 + + gasTooHighErrTemplate = "Claim tx estimated to consume more gas than the maximum allowed by the service. " + + "Estimated %d, maximum allowed: %d" +) + +type EthClienter interface { + ethereum.GasEstimator + bind.ContractBackend +} + +type EthTxManager interface { + Remove(ctx context.Context, id common.Hash) error + ResultsByStatus(ctx context.Context, statuses []ethtxtypes.MonitoredTxStatus) ([]ethtxtypes.MonitoredTxResult, error) + Result(ctx context.Context, id common.Hash) (ethtxtypes.MonitoredTxResult, error) + Add(ctx context.Context, to *common.Address, value *big.Int, data []byte, + gasOffset uint64, sidecar *types.BlobTxSidecar) (common.Hash, error) +} + +type EVMClaimSponsor struct { + l2Client EthClienter + bridgeABI *abi.ABI + bridgeAddr common.Address + ethTxManager EthTxManager + sender common.Address + gasOffest uint64 + maxGas uint64 +} + +type EVMClaimSponsorConfig struct { + // DBPath path of the DB + DBPath string `mapstructure:"DBPath"` + // Enabled indicates if the sponsor should be run or not + Enabled bool `mapstructure:"Enabled"` + // SenderAddr is the address that will be used to send the claim txs + SenderAddr common.Address `mapstructure:"SenderAddr"` + // BridgeAddrL2 is the address of the bridge smart contract on L2 + BridgeAddrL2 common.Address `mapstructure:"BridgeAddrL2"` + // MaxGas is the max gas (limit) allowed for a claim to be sponsored + MaxGas uint64 `mapstructure:"MaxGas"` + // RetryAfterErrorPeriod is the time that will be waited when an unexpected error happens before retry + RetryAfterErrorPeriod configTypes.Duration `mapstructure:"RetryAfterErrorPeriod"` + // MaxRetryAttemptsAfterError is the maximum number of consecutive attempts that will happen before panicing. + // Any number smaller than zero will be considered as unlimited retries + MaxRetryAttemptsAfterError int `mapstructure:"MaxRetryAttemptsAfterError"` + // WaitTxToBeMinedPeriod is the period that will be used to ask if a given tx has been mined (or failed) + WaitTxToBeMinedPeriod configTypes.Duration `mapstructure:"WaitTxToBeMinedPeriod"` + // WaitOnEmptyQueue is the time that will be waited before trying to send the next claim of the queue + // if the queue is empty + WaitOnEmptyQueue configTypes.Duration `mapstructure:"WaitOnEmptyQueue"` + // EthTxManager is the configuration of the EthTxManager to be used by the claim sponsor + EthTxManager ethtxmanager.Config `mapstructure:"EthTxManager"` + // GasOffset is the gas to add on top of the estimated gas when sending the claim txs + GasOffset uint64 `mapstructure:"GasOffset"` +} + +func NewEVMClaimSponsor( + logger *log.Logger, + dbPath string, + l2Client EthClienter, + bridgeAddr common.Address, + sender common.Address, + maxGas, gasOffset uint64, + ethTxManager EthTxManager, + retryAfterErrorPeriod time.Duration, + maxRetryAttemptsAfterError int, + waitTxToBeMinedPeriod time.Duration, + waitOnEmptyQueue time.Duration, +) (*ClaimSponsor, error) { + abi, err := polygonzkevmbridgev2.Polygonzkevmbridgev2MetaData.GetAbi() + if err != nil { + return nil, err + } + + evmSponsor := &EVMClaimSponsor{ + l2Client: l2Client, + bridgeABI: abi, + bridgeAddr: bridgeAddr, + sender: sender, + gasOffest: gasOffset, + maxGas: maxGas, + ethTxManager: ethTxManager, + } + + baseSponsor, err := newClaimSponsor( + logger, + dbPath, + evmSponsor, + retryAfterErrorPeriod, + maxRetryAttemptsAfterError, + waitTxToBeMinedPeriod, + waitOnEmptyQueue, + ) + if err != nil { + return nil, err + } + + return baseSponsor, nil +} + +func (c *EVMClaimSponsor) checkClaim(ctx context.Context, claim *Claim) error { + data, err := c.buildClaimTxData(claim) + if err != nil { + return err + } + gas, err := c.l2Client.EstimateGas(ctx, ethereum.CallMsg{ + From: c.sender, + To: &c.bridgeAddr, + Data: data, + }) + if err != nil { + return err + } + if gas > c.maxGas { + return fmt.Errorf(gasTooHighErrTemplate, gas, c.maxGas) + } + + return nil +} + +func (c *EVMClaimSponsor) sendClaim(ctx context.Context, claim *Claim) (string, error) { + data, err := c.buildClaimTxData(claim) + if err != nil { + return "", err + } + id, err := c.ethTxManager.Add(ctx, &c.bridgeAddr, common.Big0, data, c.gasOffest, nil) + if err != nil { + return "", err + } + + return id.Hex(), nil +} + +func (c *EVMClaimSponsor) claimStatus(ctx context.Context, id string) (ClaimStatus, error) { + res, err := c.ethTxManager.Result(ctx, common.HexToHash(id)) + if err != nil { + return "", err + } + switch res.Status { + case ethtxtypes.MonitoredTxStatusCreated, + ethtxtypes.MonitoredTxStatusSent: + return WIPClaimStatus, nil + case ethtxtypes.MonitoredTxStatusFailed: + return FailedClaimStatus, nil + case ethtxtypes.MonitoredTxStatusMined, + ethtxtypes.MonitoredTxStatusSafe, + ethtxtypes.MonitoredTxStatusFinalized: + log.Infof("claim tx with id %s mined at block %d", id, res.MinedAtBlockNumber) + + return SuccessClaimStatus, nil + default: + return "", fmt.Errorf("unexpected tx status: %v", res.Status) + } +} + +func (c *EVMClaimSponsor) buildClaimTxData(claim *Claim) ([]byte, error) { + switch claim.LeafType { + case LeafTypeAsset: + return c.bridgeABI.Pack( + "claimAsset", + claim.ProofLocalExitRoot, // bytes32[32] smtProofLocalExitRoot + claim.ProofRollupExitRoot, // bytes32[32] smtProofRollupExitRoot + claim.GlobalIndex, // uint256 globalIndex + claim.MainnetExitRoot, // bytes32 mainnetExitRoot + claim.RollupExitRoot, // bytes32 rollupExitRoot + claim.OriginNetwork, // uint32 originNetwork + claim.OriginTokenAddress, // address originTokenAddress, + claim.DestinationNetwork, // uint32 destinationNetwork + claim.DestinationAddress, // address destinationAddress + claim.Amount, // uint256 amount + claim.Metadata, // bytes metadata + ) + case LeafTypeMessage: + return c.bridgeABI.Pack( + "claimMessage", + claim.ProofLocalExitRoot, // bytes32[32] smtProofLocalExitRoot + claim.ProofRollupExitRoot, // bytes32[32] smtProofRollupExitRoot + claim.GlobalIndex, // uint256 globalIndex + claim.MainnetExitRoot, // bytes32 mainnetExitRoot + claim.RollupExitRoot, // bytes32 rollupExitRoot + claim.OriginNetwork, // uint32 originNetwork + claim.OriginTokenAddress, // address originTokenAddress, + claim.DestinationNetwork, // uint32 destinationNetwork + claim.DestinationAddress, // address destinationAddress + claim.Amount, // uint256 amount + claim.Metadata, // bytes metadata + ) + default: + return nil, fmt.Errorf("unexpected leaf type %d", claim.LeafType) + } +} diff --git a/claimsponsor/migrations/claimsponsor0001.sql b/claimsponsor/migrations/claimsponsor0001.sql new file mode 100644 index 00000000..9e4586ea --- /dev/null +++ b/claimsponsor/migrations/claimsponsor0001.sql @@ -0,0 +1,20 @@ +-- +migrate Down +DROP TABLE IF EXISTS claim; + +-- +migrate Up +CREATE TABLE claim ( + leaf_type INT NOT NULL, + proof_local_exit_root VARCHAR NOT NULL, + proof_rollup_exit_root VARCHAR NOT NULL, + global_index VARCHAR NOT NULL, + mainnet_exit_root VARCHAR NOT NULL, + rollup_exit_root VARCHAR NOT NULL, + origin_network INT NOT NULL, + origin_token_address VARCHAR NOT NULL, + destination_network INT NOT NULL, + destination_address VARCHAR NOT NULL, + amount VARCHAR NOT NULL, + metadata VARCHAR, + status VARCHAR NOT NULL, + tx_id VARCHAR NOT NULL +); \ No newline at end of file diff --git a/claimsponsor/migrations/migrations.go b/claimsponsor/migrations/migrations.go new file mode 100644 index 00000000..15e231a1 --- /dev/null +++ b/claimsponsor/migrations/migrations.go @@ -0,0 +1,21 @@ +package migrations + +import ( + _ "embed" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/db/types" +) + +//go:embed claimsponsor0001.sql +var mig001 string + +func RunMigrations(dbPath string) error { + migrations := []types.Migration{ + { + ID: "claimsponsor0001", + SQL: mig001, + }, + } + return db.RunMigrations(dbPath, migrations) +} diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 00000000..5127df85 --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,100 @@ +package main + +import ( + "os" + + "github.com/agglayer/aggkit" + "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/config" + "github.com/agglayer/aggkit/log" + "github.com/urfave/cli/v2" +) + +const appName = "aggkit" + +const ( + // NETWORK_CONFIGFILE name to identify the network_custom (genesis) config-file + NETWORK_CONFIGFILE = "custom_network" //nolint:stylecheck +) + +var ( + configFileFlag = cli.StringSliceFlag{ + Name: config.FlagCfg, + Aliases: []string{"c"}, + Usage: "Configuration file(s)", + Required: true, + } + customNetworkFlag = cli.StringFlag{ + Name: config.FlagCustomNetwork, + Aliases: []string{"net-file"}, + Usage: "Load the network configuration file if --network=custom", + Required: false, + } + yesFlag = cli.BoolFlag{ + Name: config.FlagYes, + Aliases: []string{"y"}, + Usage: "Automatically accepts any confirmation to execute the command", + Required: false, + } + componentsFlag = cli.StringSliceFlag{ + Name: config.FlagComponents, + Aliases: []string{"co"}, + Usage: "List of components to run", + Required: false, + Value: cli.NewStringSlice(common.SEQUENCE_SENDER, common.AGGREGATOR, + common.AGGORACLE, common.BRIDGE, common.AGGSENDER), + } + saveConfigFlag = cli.StringFlag{ + Name: config.FlagSaveConfigPath, + Aliases: []string{"s"}, + Usage: "Save final configuration into to the indicated path (name: aggkit-config.toml)", + Required: false, + } + disableDefaultConfigVars = cli.BoolFlag{ + Name: config.FlagDisableDefaultConfigVars, + Aliases: []string{"d"}, + Usage: "Disable default configuration variables, all of them must be defined on config files", + Required: false, + } + + allowDeprecatedFields = cli.BoolFlag{ + Name: config.FlagAllowDeprecatedFields, + Usage: "Allow that config-files contains deprecated fields", + Required: false, + } +) + +func main() { + app := cli.NewApp() + app.Name = appName + app.Version = aggkit.Version + flags := []cli.Flag{ + &configFileFlag, + &yesFlag, + &componentsFlag, + &saveConfigFlag, + &disableDefaultConfigVars, + &allowDeprecatedFields, + } + app.Commands = []*cli.Command{ + { + Name: "version", + Aliases: []string{}, + Usage: "Application version and build", + Action: versionCmd, + }, + { + Name: "run", + Aliases: []string{}, + Usage: "Run the aggkit client", + Action: start, + Flags: append(flags, &customNetworkFlag), + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + os.Exit(1) + } +} diff --git a/cmd/run.go b/cmd/run.go new file mode 100644 index 00000000..607d159c --- /dev/null +++ b/cmd/run.go @@ -0,0 +1,814 @@ +package main + +import ( + "context" + "crypto/ecdsa" + "fmt" + "math/big" + "os" + "os/signal" + "runtime" + + dataCommitteeClient "github.com/0xPolygon/cdk-data-availability/client" + jRPC "github.com/0xPolygon/cdk-rpc/rpc" + ethtxman "github.com/0xPolygon/zkevm-ethtx-manager/etherman" + "github.com/0xPolygon/zkevm-ethtx-manager/etherman/etherscan" + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + ethtxlog "github.com/0xPolygon/zkevm-ethtx-manager/log" + "github.com/agglayer/aggkit" + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/aggoracle" + "github.com/agglayer/aggkit/aggoracle/chaingersender" + "github.com/agglayer/aggkit/aggregator" + "github.com/agglayer/aggkit/aggregator/db" + "github.com/agglayer/aggkit/aggsender" + "github.com/agglayer/aggkit/bridgesync" + "github.com/agglayer/aggkit/claimsponsor" + aggkitcommon "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/config" + "github.com/agglayer/aggkit/dataavailability" + "github.com/agglayer/aggkit/dataavailability/datacommittee" + "github.com/agglayer/aggkit/etherman" + ethermanconfig "github.com/agglayer/aggkit/etherman/config" + "github.com/agglayer/aggkit/etherman/contracts" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/lastgersync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/reorgdetector" + "github.com/agglayer/aggkit/rpc" + "github.com/agglayer/aggkit/sequencesender" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/translator" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/urfave/cli/v2" +) + +func start(cliCtx *cli.Context) error { + cfg, err := config.Load(cliCtx) + if err != nil { + return err + } + + log.Init(cfg.Log) + + if cfg.Log.Environment == log.EnvironmentDevelopment { + aggkit.PrintVersion(os.Stdout) + log.Info("Starting application") + } else if cfg.Log.Environment == log.EnvironmentProduction { + logVersion() + } + + components := cliCtx.StringSlice(config.FlagComponents) + l1Client := runL1ClientIfNeeded(components, cfg.Etherman.URL) + l2Client := runL2ClientIfNeeded(components, getL2RPCUrl(cfg)) + reorgDetectorL1, errChanL1 := runReorgDetectorL1IfNeeded(cliCtx.Context, components, l1Client, &cfg.ReorgDetectorL1) + go func() { + if err := <-errChanL1; err != nil { + log.Fatal("Error from ReorgDetectorL1: ", err) + } + }() + + reorgDetectorL2, errChanL2 := runReorgDetectorL2IfNeeded(cliCtx.Context, components, l2Client, &cfg.ReorgDetectorL2) + go func() { + if err := <-errChanL2; err != nil { + log.Fatal("Error from ReorgDetectorL2: ", err) + } + }() + + rollupID := getRollUpIDIfNeeded(components, cfg.NetworkConfig.L1Config, l1Client) + l1InfoTreeSync := runL1InfoTreeSyncerIfNeeded(cliCtx.Context, components, *cfg, l1Client, reorgDetectorL1) + claimSponsor := runClaimSponsorIfNeeded(cliCtx.Context, components, l2Client, cfg.ClaimSponsor) + l1BridgeSync := runBridgeSyncL1IfNeeded(cliCtx.Context, components, cfg.BridgeL1Sync, reorgDetectorL1, + l1Client, 0) + l2BridgeSync := runBridgeSyncL2IfNeeded(cliCtx.Context, components, cfg.BridgeL2Sync, reorgDetectorL2, + l2Client, rollupID) + lastGERSync := runLastGERSyncIfNeeded( + cliCtx.Context, components, cfg.LastGERSync, reorgDetectorL2, l2Client, l1InfoTreeSync, + ) + var rpcServices []jRPC.Service + for _, component := range components { + switch component { + case aggkitcommon.SEQUENCE_SENDER: + cfg.SequenceSender.Log = cfg.Log + seqSender := createSequenceSender(*cfg, l1Client, l1InfoTreeSync) + // start sequence sender in a goroutine, checking for errors + go seqSender.Start(cliCtx.Context) + + case aggkitcommon.AGGREGATOR: + aggregator := createAggregator(cliCtx.Context, *cfg, !cliCtx.Bool(config.FlagMigrations)) + // start aggregator in a goroutine, checking for errors + go func() { + if err := aggregator.Start(); err != nil { + aggregator.Stop() + log.Fatal(err) + } + }() + case aggkitcommon.AGGORACLE: + aggOracle := createAggoracle(*cfg, l1Client, l2Client, l1InfoTreeSync) + go aggOracle.Start(cliCtx.Context) + case aggkitcommon.BRIDGE: + rpcBridge := createBridgeRPC( + cfg.RPC, + cfg.Common.NetworkID, + claimSponsor, + l1InfoTreeSync, + lastGERSync, + l1BridgeSync, + l2BridgeSync, + ) + rpcServices = append(rpcServices, rpcBridge...) + + case aggkitcommon.AGGSENDER: + aggsender, err := createAggSender( + cliCtx.Context, + cfg.AggSender, + l1Client, + l1InfoTreeSync, + l2BridgeSync, + ) + if err != nil { + log.Fatal(err) + } + rpcServices = append(rpcServices, aggsender.GetRPCServices()...) + + go aggsender.Start(cliCtx.Context) + } + } + if len(rpcServices) > 0 { + rpcServer := createRPC(cfg.RPC, rpcServices) + go func() { + if err := rpcServer.Start(); err != nil { + log.Fatal(err) + } + }() + } + waitSignal(nil) + + return nil +} + +func createAggSender( + ctx context.Context, + cfg aggsender.Config, + l1EthClient *ethclient.Client, + l1InfoTreeSync *l1infotreesync.L1InfoTreeSync, + l2Syncer *bridgesync.BridgeSync) (*aggsender.AggSender, error) { + logger := log.WithFields("module", aggkitcommon.AGGSENDER) + agglayerClient := agglayer.NewAggLayerClient(cfg.AggLayerURL) + blockNotifier, err := aggsender.NewBlockNotifierPolling(l1EthClient, aggsender.ConfigBlockNotifierPolling{ + BlockFinalityType: etherman.BlockNumberFinality(cfg.BlockFinality), + CheckNewBlockInterval: aggsender.AutomaticBlockInterval, + }, logger, nil) + if err != nil { + return nil, err + } + + notifierCfg, err := aggsender.NewConfigEpochNotifierPerBlock(agglayerClient, cfg.EpochNotificationPercentage) + if err != nil { + return nil, fmt.Errorf("cant generate config for Epoch Notifier because: %w", err) + } + epochNotifier, err := aggsender.NewEpochNotifierPerBlock( + blockNotifier, + logger, + *notifierCfg, nil) + if err != nil { + return nil, err + } + log.Infof("Starting blockNotifier: %s", blockNotifier.String()) + go blockNotifier.Start(ctx) + log.Infof("Starting epochNotifier: %s", epochNotifier.String()) + go epochNotifier.Start(ctx) + return aggsender.New(ctx, logger, cfg, agglayerClient, l1InfoTreeSync, l2Syncer, epochNotifier) +} + +func createAggregator(ctx context.Context, c config.Config, runMigrations bool) *aggregator.Aggregator { + logger := log.WithFields("module", aggkitcommon.AGGREGATOR) + // Migrations + if runMigrations { + logger.Infof("Running DB migrations. File %s", c.Aggregator.DBPath) + runAggregatorMigrations(c.Aggregator.DBPath) + } + + etherman, err := newEtherman(c) + if err != nil { + logger.Fatal(err) + } + + // READ CHAIN ID FROM POE SC + + if c.Aggregator.ChainID == 0 { + l2ChainID, err := etherman.GetL2ChainID() + if err != nil { + logger.Fatal(err) + } + log.Infof("Autodiscover L2ChainID: %d", l2ChainID) + c.Aggregator.ChainID = l2ChainID + } + + aggregator, err := aggregator.New(ctx, c.Aggregator, logger, etherman) + if err != nil { + logger.Fatal(err) + } + + return aggregator +} + +func createSequenceSender( + cfg config.Config, + l1Client *ethclient.Client, + l1InfoTreeSync *l1infotreesync.L1InfoTreeSync, +) *sequencesender.SequenceSender { + logger := log.WithFields("module", aggkitcommon.SEQUENCE_SENDER) + + // Check config + if cfg.SequenceSender.RPCURL == "" { + logger.Fatal("Required field RPCURL is empty in sequence sender config") + } + + ethman, err := etherman.NewClient(ethermanconfig.Config{ + EthermanConfig: ethtxman.Config{ + URL: cfg.SequenceSender.EthTxManager.Etherman.URL, + MultiGasProvider: cfg.SequenceSender.EthTxManager.Etherman.MultiGasProvider, + L1ChainID: cfg.SequenceSender.EthTxManager.Etherman.L1ChainID, + Etherscan: etherscan.Config{ + ApiKey: cfg.SequenceSender.EthTxManager.Etherman.Etherscan.ApiKey, + Url: cfg.SequenceSender.EthTxManager.Etherman.Etherscan.Url, + }, + HTTPHeaders: cfg.SequenceSender.EthTxManager.Etherman.HTTPHeaders, + }, + }, cfg.NetworkConfig.L1Config, cfg.Common) + if err != nil { + logger.Fatalf("Failed to create etherman. Err: %w, ", err) + } + + auth, _, err := ethman.LoadAuthFromKeyStore(cfg.SequenceSender.PrivateKey.Path, cfg.SequenceSender.PrivateKey.Password) + if err != nil { + logger.Fatal(err) + } + cfg.SequenceSender.SenderAddress = auth.From + blockFinalityType := etherman.BlockNumberFinality(cfg.SequenceSender.BlockFinality) + + blockFinality, err := blockFinalityType.ToBlockNum() + if err != nil { + logger.Fatalf("Failed to create block finality. Err: %w, ", err) + } + txBuilder, err := newTxBuilder(cfg, logger, ethman, l1Client, l1InfoTreeSync, blockFinality) + if err != nil { + logger.Fatal(err) + } + seqSender, err := sequencesender.New(cfg.SequenceSender, logger, ethman, txBuilder) + if err != nil { + logger.Fatal(err) + } + + return seqSender +} + +func newTxBuilder( + cfg config.Config, + logger *log.Logger, + ethman *etherman.Client, + l1Client *ethclient.Client, + l1InfoTreeSync *l1infotreesync.L1InfoTreeSync, + blockFinality *big.Int, +) (txbuilder.TxBuilder, error) { + auth, _, err := ethman.LoadAuthFromKeyStore(cfg.SequenceSender.PrivateKey.Path, cfg.SequenceSender.PrivateKey.Password) + if err != nil { + log.Fatal(err) + } + da, err := newDataAvailability(cfg, ethman) + if err != nil { + log.Fatal(err) + } + var txBuilder txbuilder.TxBuilder + + switch contracts.VersionType(cfg.Common.ContractVersions) { + case contracts.VersionBanana: + if cfg.Common.IsValidiumMode { + txBuilder = txbuilder.NewTxBuilderBananaValidium( + logger, + ethman.Contracts.Banana.Rollup, + ethman.Contracts.Banana.GlobalExitRoot, + da, + *auth, + cfg.SequenceSender.MaxBatchesForL1, + l1InfoTreeSync, + l1Client, + blockFinality, + ) + } else { + txBuilder = txbuilder.NewTxBuilderBananaZKEVM( + logger, + ethman.Contracts.Banana.Rollup, + ethman.Contracts.Banana.GlobalExitRoot, + *auth, + cfg.SequenceSender.MaxTxSizeForL1, + l1InfoTreeSync, + l1Client, + blockFinality, + ) + } + case contracts.VersionElderberry: + if cfg.Common.IsValidiumMode { + txBuilder = txbuilder.NewTxBuilderElderberryValidium( + logger, ethman.Contracts.Elderberry.Rollup, da, *auth, cfg.SequenceSender.MaxBatchesForL1, + ) + } else { + txBuilder = txbuilder.NewTxBuilderElderberryZKEVM( + logger, ethman.Contracts.Elderberry.Rollup, *auth, cfg.SequenceSender.MaxTxSizeForL1, + ) + } + default: + err = fmt.Errorf("unknown contract version: %s", cfg.Common.ContractVersions) + } + + return txBuilder, err +} + +func createAggoracle( + cfg config.Config, + l1Client, + l2Client *ethclient.Client, + syncer *l1infotreesync.L1InfoTreeSync, +) *aggoracle.AggOracle { + logger := log.WithFields("module", aggkitcommon.AGGORACLE) + var sender aggoracle.ChainSender + switch cfg.AggOracle.TargetChainType { + case aggoracle.EVMChain: + cfg.AggOracle.EVMSender.EthTxManager.Log = ethtxlog.Config{ + Environment: ethtxlog.LogEnvironment(cfg.Log.Environment), + Level: cfg.Log.Level, + Outputs: cfg.Log.Outputs, + } + ethTxManager, err := ethtxmanager.New(cfg.AggOracle.EVMSender.EthTxManager) + if err != nil { + log.Fatal(err) + } + go ethTxManager.Start() + sender, err = chaingersender.NewEVMChainGERSender( + logger, + cfg.AggOracle.EVMSender.GlobalExitRootL2Addr, + l2Client, + ethTxManager, + cfg.AggOracle.EVMSender.GasOffset, + cfg.AggOracle.EVMSender.WaitPeriodMonitorTx.Duration, + ) + if err != nil { + log.Fatal(err) + } + default: + log.Fatalf( + "Unsupported chaintype %s. Supported values: %v", + cfg.AggOracle.TargetChainType, aggoracle.SupportedChainTypes, + ) + } + aggOracle, err := aggoracle.New( + logger, + sender, + l1Client, + syncer, + etherman.BlockNumberFinality(cfg.AggOracle.BlockFinality), + cfg.AggOracle.WaitPeriodNextGER.Duration, + ) + if err != nil { + logger.Fatal(err) + } + + return aggOracle +} + +func newDataAvailability(c config.Config, etherman *etherman.Client) (*dataavailability.DataAvailability, error) { + if !c.Common.IsValidiumMode { + return nil, nil + } + logger := log.WithFields("module", "da-committee") + translator := translator.NewTranslatorImpl(logger) + logger.Infof("Translator rules: %v", c.Common.Translator) + translator.AddConfigRules(c.Common.Translator) + + // Backend specific config + daProtocolName, err := etherman.GetDAProtocolName() + if err != nil { + return nil, fmt.Errorf("error getting data availability protocol name: %w", err) + } + var daBackend dataavailability.DABackender + switch daProtocolName { + case string(dataavailability.DataAvailabilityCommittee): + var ( + pk *ecdsa.PrivateKey + err error + ) + _, pk, err = etherman.LoadAuthFromKeyStore(c.SequenceSender.PrivateKey.Path, c.SequenceSender.PrivateKey.Password) + if err != nil { + return nil, err + } + dacAddr, err := etherman.GetDAProtocolAddr() + if err != nil { + return nil, fmt.Errorf("error getting trusted sequencer URI. Error: %w", err) + } + + daBackend, err = datacommittee.New( + logger, + c.SequenceSender.EthTxManager.Etherman.URL, + dacAddr, + pk, + dataCommitteeClient.NewFactory(), + translator, + ) + if err != nil { + return nil, err + } + default: + return nil, fmt.Errorf("unexpected / unsupported DA protocol: %s", daProtocolName) + } + + return dataavailability.New(daBackend) +} + +func runAggregatorMigrations(dbPath string) { + runMigrations(dbPath, db.AggregatorMigrationName) +} + +func runMigrations(dbPath string, name string) { + log.Infof("running migrations for %v", name) + err := db.RunMigrationsUp(dbPath, name) + if err != nil { + log.Fatal(err) + } +} + +func newEtherman(c config.Config) (*etherman.Client, error) { + return etherman.NewClient(ethermanconfig.Config{ + EthermanConfig: ethtxman.Config{ + URL: c.Aggregator.EthTxManager.Etherman.URL, + MultiGasProvider: c.Aggregator.EthTxManager.Etherman.MultiGasProvider, + L1ChainID: c.Aggregator.EthTxManager.Etherman.L1ChainID, + HTTPHeaders: c.Aggregator.EthTxManager.Etherman.HTTPHeaders, + }, + }, c.NetworkConfig.L1Config, c.Common) +} + +func logVersion() { + log.Infow("Starting application", + // version is already logged by default + "gitRevision", aggkit.GitRev, + "gitBranch", aggkit.GitBranch, + "goVersion", runtime.Version(), + "built", aggkit.BuildDate, + "os/arch", fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH), + ) +} + +func waitSignal(cancelFuncs []context.CancelFunc) { + signals := make(chan os.Signal, 1) + signal.Notify(signals, os.Interrupt) + + for sig := range signals { + switch sig { + case os.Interrupt, os.Kill: + log.Info("terminating application gracefully...") + + exitStatus := 0 + for _, cancel := range cancelFuncs { + cancel() + } + os.Exit(exitStatus) + } + } +} + +func newReorgDetector( + cfg *reorgdetector.Config, + client *ethclient.Client, +) *reorgdetector.ReorgDetector { + rd, err := reorgdetector.New(client, *cfg) + if err != nil { + log.Fatal(err) + } + + return rd +} + +func isNeeded(casesWhereNeeded, actualCases []string) bool { + for _, actualCase := range actualCases { + for _, caseWhereNeeded := range casesWhereNeeded { + if actualCase == caseWhereNeeded { + return true + } + } + } + + return false +} + +func runL1InfoTreeSyncerIfNeeded( + ctx context.Context, + components []string, + cfg config.Config, + l1Client *ethclient.Client, + reorgDetector *reorgdetector.ReorgDetector, +) *l1infotreesync.L1InfoTreeSync { + if !isNeeded([]string{aggkitcommon.AGGORACLE, aggkitcommon.BRIDGE, + aggkitcommon.SEQUENCE_SENDER, aggkitcommon.AGGSENDER, aggkitcommon.L1INFOTREESYNC}, components) { + return nil + } + l1InfoTreeSync, err := l1infotreesync.New( + ctx, + cfg.L1InfoTreeSync.DBPath, + cfg.L1InfoTreeSync.GlobalExitRootAddr, + cfg.L1InfoTreeSync.RollupManagerAddr, + cfg.L1InfoTreeSync.SyncBlockChunkSize, + etherman.BlockNumberFinality(cfg.L1InfoTreeSync.BlockFinality), + reorgDetector, + l1Client, + cfg.L1InfoTreeSync.WaitForNewBlocksPeriod.Duration, + cfg.L1InfoTreeSync.InitialBlock, + cfg.L1InfoTreeSync.RetryAfterErrorPeriod.Duration, + cfg.L1InfoTreeSync.MaxRetryAttemptsAfterError, + l1infotreesync.FlagNone, + ) + if err != nil { + log.Fatal(err) + } + go l1InfoTreeSync.Start(ctx) + + return l1InfoTreeSync +} + +func runL1ClientIfNeeded(components []string, urlRPCL1 string) *ethclient.Client { + if !isNeeded([]string{ + aggkitcommon.SEQUENCE_SENDER, aggkitcommon.AGGREGATOR, + aggkitcommon.AGGORACLE, aggkitcommon.BRIDGE, + aggkitcommon.AGGSENDER, + aggkitcommon.L1INFOTREESYNC, + }, components) { + return nil + } + log.Debugf("dialing L1 client at: %s", urlRPCL1) + l1CLient, err := ethclient.Dial(urlRPCL1) + if err != nil { + log.Fatalf("failed to create client for L1 using URL: %s. Err:%v", urlRPCL1, err) + } + + return l1CLient +} + +func getRollUpIDIfNeeded(components []string, networkConfig ethermanconfig.L1Config, + l1Client *ethclient.Client) uint32 { + if !isNeeded([]string{ + aggkitcommon.AGGSENDER, + }, components) { + return 0 + } + rollupID, err := etherman.GetRollupID(networkConfig, networkConfig.ZkEVMAddr, l1Client) + if err != nil { + log.Fatal(err) + } + return rollupID +} + +func runL2ClientIfNeeded(components []string, urlRPCL2 string) *ethclient.Client { + if !isNeeded([]string{aggkitcommon.AGGORACLE, aggkitcommon.BRIDGE, aggkitcommon.AGGSENDER}, components) { + return nil + } + + log.Infof("dialing L2 client at: %s", urlRPCL2) + l2CLient, err := ethclient.Dial(urlRPCL2) + if err != nil { + log.Fatal(err) + } + + return l2CLient +} + +func runReorgDetectorL1IfNeeded( + ctx context.Context, + components []string, + l1Client *ethclient.Client, + cfg *reorgdetector.Config, +) (*reorgdetector.ReorgDetector, chan error) { + if !isNeeded([]string{ + aggkitcommon.SEQUENCE_SENDER, aggkitcommon.AGGREGATOR, + aggkitcommon.AGGORACLE, aggkitcommon.BRIDGE, aggkitcommon.AGGSENDER, + aggkitcommon.L1INFOTREESYNC}, + components) { + return nil, nil + } + rd := newReorgDetector(cfg, l1Client) + + errChan := make(chan error) + go func() { + if err := rd.Start(ctx); err != nil { + errChan <- err + } + close(errChan) + }() + + return rd, errChan +} + +func runReorgDetectorL2IfNeeded( + ctx context.Context, + components []string, + l2Client *ethclient.Client, + cfg *reorgdetector.Config, +) (*reorgdetector.ReorgDetector, chan error) { + if !isNeeded([]string{aggkitcommon.AGGORACLE, aggkitcommon.BRIDGE, aggkitcommon.AGGSENDER}, components) { + return nil, nil + } + rd := newReorgDetector(cfg, l2Client) + + errChan := make(chan error) + go func() { + if err := rd.Start(ctx); err != nil { + errChan <- err + } + close(errChan) + }() + + return rd, errChan +} + +func runClaimSponsorIfNeeded( + ctx context.Context, + components []string, + l2Client *ethclient.Client, + cfg claimsponsor.EVMClaimSponsorConfig, +) *claimsponsor.ClaimSponsor { + if !isNeeded([]string{aggkitcommon.BRIDGE}, components) || !cfg.Enabled { + return nil + } + + logger := log.WithFields("module", aggkitcommon.CLAIM_SPONSOR) + // In the future there may support different backends other than EVM, and this will require different config. + // But today only EVM is supported + ethTxManagerL2, err := ethtxmanager.New(cfg.EthTxManager) + if err != nil { + logger.Fatal(err) + } + go ethTxManagerL2.Start() + cs, err := claimsponsor.NewEVMClaimSponsor( + logger, + cfg.DBPath, + l2Client, + cfg.BridgeAddrL2, + cfg.SenderAddr, + cfg.MaxGas, + cfg.GasOffset, + ethTxManagerL2, + cfg.RetryAfterErrorPeriod.Duration, + cfg.MaxRetryAttemptsAfterError, + cfg.WaitTxToBeMinedPeriod.Duration, + cfg.WaitTxToBeMinedPeriod.Duration, + ) + if err != nil { + logger.Fatalf("error creating claim sponsor: %s", err) + } + go cs.Start(ctx) + + return cs +} + +func runLastGERSyncIfNeeded( + ctx context.Context, + components []string, + cfg lastgersync.Config, + reorgDetectorL2 *reorgdetector.ReorgDetector, + l2Client *ethclient.Client, + l1InfoTreeSync *l1infotreesync.L1InfoTreeSync, +) *lastgersync.LastGERSync { + if !isNeeded([]string{aggkitcommon.BRIDGE}, components) { + return nil + } + lastGERSync, err := lastgersync.New( + ctx, + cfg.DBPath, + reorgDetectorL2, + l2Client, + cfg.GlobalExitRootL2Addr, + l1InfoTreeSync, + cfg.RetryAfterErrorPeriod.Duration, + cfg.MaxRetryAttemptsAfterError, + etherman.BlockNumberFinality(cfg.BlockFinality), + cfg.WaitForNewBlocksPeriod.Duration, + cfg.DownloadBufferSize, + ) + if err != nil { + log.Fatalf("error creating lastGERSync: %s", err) + } + go lastGERSync.Start(ctx) + + return lastGERSync +} + +func runBridgeSyncL1IfNeeded( + ctx context.Context, + components []string, + cfg bridgesync.Config, + reorgDetectorL1 *reorgdetector.ReorgDetector, + l1Client *ethclient.Client, + rollupID uint32, +) *bridgesync.BridgeSync { + if !isNeeded([]string{aggkitcommon.BRIDGE}, components) { + return nil + } + + bridgeSyncL1, err := bridgesync.NewL1( + ctx, + cfg.DBPath, + cfg.BridgeAddr, + cfg.SyncBlockChunkSize, + etherman.BlockNumberFinality(cfg.BlockFinality), + reorgDetectorL1, + l1Client, + cfg.InitialBlockNum, + cfg.WaitForNewBlocksPeriod.Duration, + cfg.RetryAfterErrorPeriod.Duration, + cfg.MaxRetryAttemptsAfterError, + rollupID, + false, + ) + if err != nil { + log.Fatalf("error creating bridgeSyncL1: %s", err) + } + go bridgeSyncL1.Start(ctx) + + return bridgeSyncL1 +} + +func runBridgeSyncL2IfNeeded( + ctx context.Context, + components []string, + cfg bridgesync.Config, + reorgDetectorL2 *reorgdetector.ReorgDetector, + l2Client *ethclient.Client, + rollupID uint32, +) *bridgesync.BridgeSync { + if !isNeeded([]string{aggkitcommon.BRIDGE, aggkitcommon.AGGSENDER}, components) { + return nil + } + + bridgeSyncL2, err := bridgesync.NewL2( + ctx, + cfg.DBPath, + cfg.BridgeAddr, + cfg.SyncBlockChunkSize, + etherman.BlockNumberFinality(cfg.BlockFinality), + reorgDetectorL2, + l2Client, + cfg.InitialBlockNum, + cfg.WaitForNewBlocksPeriod.Duration, + cfg.RetryAfterErrorPeriod.Duration, + cfg.MaxRetryAttemptsAfterError, + rollupID, + true, + ) + if err != nil { + log.Fatalf("error creating bridgeSyncL2: %s", err) + } + go bridgeSyncL2.Start(ctx) + + return bridgeSyncL2 +} + +func createBridgeRPC( + cfg jRPC.Config, + cdkNetworkID uint32, + sponsor *claimsponsor.ClaimSponsor, + l1InfoTree *l1infotreesync.L1InfoTreeSync, + injectedGERs *lastgersync.LastGERSync, + bridgeL1 *bridgesync.BridgeSync, + bridgeL2 *bridgesync.BridgeSync, +) []jRPC.Service { + logger := log.WithFields("module", aggkitcommon.BRIDGE) + services := []jRPC.Service{ + { + Name: rpc.BRIDGE, + Service: rpc.NewBridgeEndpoints( + logger, + cfg.WriteTimeout.Duration, + cfg.ReadTimeout.Duration, + cdkNetworkID, + sponsor, + l1InfoTree, + injectedGERs, + bridgeL1, + bridgeL2, + ), + }, + } + return services +} + +func createRPC(cfg jRPC.Config, services []jRPC.Service) *jRPC.Server { + logger := log.WithFields("module", "RPC") + return jRPC.NewServer(cfg, services, jRPC.WithLogger(logger.GetSugaredLogger())) +} + +func getL2RPCUrl(c *config.Config) string { + if c.AggSender.URLRPCL2 != "" { + return c.AggSender.URLRPCL2 + } + + return c.AggOracle.EVMSender.URLRPCL2 +} diff --git a/cmd/version.go b/cmd/version.go new file mode 100644 index 00000000..b653bad8 --- /dev/null +++ b/cmd/version.go @@ -0,0 +1,14 @@ +package main + +import ( + "os" + + "github.com/agglayer/aggkit" + "github.com/urfave/cli/v2" +) + +func versionCmd(*cli.Context) error { + aggkit.PrintVersion(os.Stdout) + + return nil +} diff --git a/common/common.go b/common/common.go new file mode 100644 index 00000000..be823b03 --- /dev/null +++ b/common/common.go @@ -0,0 +1,134 @@ +package common + +import ( + "crypto/ecdsa" + "encoding/binary" + "math/big" + "os" + "path/filepath" + + "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/iden3/go-iden3-crypto/keccak256" +) + +var ( + ZeroHash = common.HexToHash("0x0") +) + +// Uint64ToBytes converts a uint64 to a byte slice +func Uint64ToBytes(num uint64) []byte { + const uint64ByteSize = 8 + + bytes := make([]byte, uint64ByteSize) + binary.BigEndian.PutUint64(bytes, num) + + return bytes +} + +// BytesToUint64 converts a byte slice to a uint64 +func BytesToUint64(bytes []byte) uint64 { + return binary.BigEndian.Uint64(bytes) +} + +// Uint32ToBytes converts a uint32 to a byte slice in big-endian order +func Uint32ToBytes(num uint32) []byte { + const uint32ByteSize = 4 + + key := make([]byte, uint32ByteSize) + binary.BigEndian.PutUint32(key, num) + + return key +} + +// BytesToUint32 converts a byte slice to a uint32 +func BytesToUint32(bytes []byte) uint32 { + return binary.BigEndian.Uint32(bytes) +} + +// CalculateAccInputHash computes the hash of accumulated input data for a given batch. +func CalculateAccInputHash( + logger *log.Logger, + oldAccInputHash common.Hash, + batchData []byte, + l1InfoRoot common.Hash, + timestampLimit uint64, + sequencerAddr common.Address, + forcedBlockhashL1 common.Hash, +) common.Hash { + v1 := oldAccInputHash.Bytes() + v2 := batchData + v3 := l1InfoRoot.Bytes() + v4 := big.NewInt(0).SetUint64(timestampLimit).Bytes() + v5 := sequencerAddr.Bytes() + v6 := forcedBlockhashL1.Bytes() + + // Add 0s to make values 32 bytes long + for len(v1) < 32 { + v1 = append([]byte{0}, v1...) + } + + for len(v3) < 32 { + v3 = append([]byte{0}, v3...) + } + + for len(v4) < 8 { + v4 = append([]byte{0}, v4...) + } + + for len(v5) < 20 { + v5 = append([]byte{0}, v5...) + } + + for len(v6) < 32 { + v6 = append([]byte{0}, v6...) + } + + v2 = keccak256.Hash(v2) + calculatedAccInputHash := common.BytesToHash(keccak256.Hash(v1, v2, v3, v4, v5, v6)) + + logger.Debugf("OldAccInputHash: %v", oldAccInputHash) + logger.Debugf("BatchHashData: %v", common.Bytes2Hex(v2)) + logger.Debugf("L1InfoRoot: %v", l1InfoRoot) + logger.Debugf("TimeStampLimit: %v", timestampLimit) + logger.Debugf("Sequencer Address: %v", sequencerAddr) + logger.Debugf("Forced BlockHashL1: %v", forcedBlockhashL1) + logger.Debugf("CalculatedAccInputHash: %v", calculatedAccInputHash) + + return calculatedAccInputHash +} + +// NewKeyFromKeystore creates a private key from a keystore file +func NewKeyFromKeystore(cfg types.KeystoreFileConfig) (*ecdsa.PrivateKey, error) { + if cfg.Path == "" && cfg.Password == "" { + return nil, nil + } + keystoreEncrypted, err := os.ReadFile(filepath.Clean(cfg.Path)) + if err != nil { + return nil, err + } + key, err := keystore.DecryptKey(keystoreEncrypted, cfg.Password) + if err != nil { + return nil, err + } + return key.PrivateKey, nil +} + +// BigIntToLittleEndianBytes converts a big.Int to a 32-byte little-endian representation. +// big.Int is capped to 32 bytes +func BigIntToLittleEndianBytes(n *big.Int) []byte { + // Get the absolute value in big-endian byte slice + beBytes := n.Bytes() + + // Initialize a 32-byte array for the result + leBytes := make([]byte, common.HashLength) + + // Fill the array in reverse order to convert to little-endian + for i := 0; i < len(beBytes) && i < common.HashLength; i++ { + leBytes[i] = beBytes[len(beBytes)-1-i] + } + + return leBytes +} diff --git a/common/common_test.go b/common/common_test.go new file mode 100644 index 00000000..b6b99c5f --- /dev/null +++ b/common/common_test.go @@ -0,0 +1,61 @@ +package common + +import ( + "fmt" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestAsLittleEndianSlice(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + input *big.Int + expected []byte + }{ + { + name: "Zero value", + input: big.NewInt(0), + expected: make([]byte, 32), + }, + { + name: "Positive value", + input: big.NewInt(123456789), + expected: append([]byte{21, 205, 91, 7}, make([]byte, 28)...), + }, + { + name: "Negative value", + input: big.NewInt(-123456789), + expected: append([]byte{21, 205, 91, 7}, make([]byte, 28)...), + }, + { + name: "Large positive value", + input: new(big.Int).SetBytes([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}), + expected: []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + result := BigIntToLittleEndianBytes(tt.input) + require.Len(t, result, common.HashLength) + + for i := range result { + require.Equal(t, tt.expected[i], result[i], + fmt.Sprintf("expected byte at index %d to be %x, got %x", i, tt.expected[i], result[i])) + } + }) + } +} diff --git a/common/components.go b/common/components.go new file mode 100644 index 00000000..2b562cff --- /dev/null +++ b/common/components.go @@ -0,0 +1,20 @@ +package common + +const ( + // SEQUENCE_SENDER name to identify the sequence-sender component + SEQUENCE_SENDER = "sequence-sender" //nolint:stylecheck + // AGGREGATOR name to identify the aggregator component + AGGREGATOR = "aggregator" + // AGGORACLE name to identify the aggoracle component + AGGORACLE = "aggoracle" + // BRIDGE name to identify the bridge component (have RPC) + BRIDGE = "bridge" + // CLAIM_SPONSOR name to identify the claim sponsor component + CLAIM_SPONSOR = "claim-sponsor" //nolint:stylecheck + // PROVER name to identify the prover component + PROVER = "prover" + // AGGSENDER name to identify the aggsender component + AGGSENDER = "aggsender" + // L1INFOTREESYNC name to identify the l1infotreesync component + L1INFOTREESYNC = "l1infotreesync" +) diff --git a/common/config.go b/common/config.go new file mode 100644 index 00000000..4a2e18bd --- /dev/null +++ b/common/config.go @@ -0,0 +1,14 @@ +package common + +import "github.com/agglayer/aggkit/translator" + +// Config holds the configuration for the CDK. +type Config struct { + // IsValidiumMode has the value true if the sequence sender is running in validium mode. + IsValidiumMode bool `mapstructure:"IsValidiumMode"` + // NetworkID is the networkID of the CDK being run + NetworkID uint32 `mapstructure:"NetworkID"` + // Contract Versions: elderberry, banana + ContractVersions string `mapstructure:"ContractVersions"` + Translator translator.Config `mapstructure:"Translator"` +} diff --git a/config/config.go b/config/config.go new file mode 100644 index 00000000..9481a264 --- /dev/null +++ b/config/config.go @@ -0,0 +1,345 @@ +package config + +import ( + "bytes" + "errors" + "fmt" + "os" + "strings" + + jRPC "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/agglayer/aggkit/aggoracle" + "github.com/agglayer/aggkit/aggregator" + "github.com/agglayer/aggkit/aggsender" + "github.com/agglayer/aggkit/bridgesync" + "github.com/agglayer/aggkit/claimsponsor" + "github.com/agglayer/aggkit/common" + ethermanconfig "github.com/agglayer/aggkit/etherman/config" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/lastgersync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/reorgdetector" + "github.com/agglayer/aggkit/sequencesender" + "github.com/mitchellh/mapstructure" + "github.com/pelletier/go-toml/v2" + "github.com/spf13/viper" + "github.com/urfave/cli/v2" +) + +const ( + // FlagYes is the flag for yes. + FlagYes = "yes" + // FlagCfg is the flag for cfg. + FlagCfg = "cfg" + // FlagCustomNetwork is the flag for the custom network file. + FlagCustomNetwork = "custom-network-file" + // FlagAmount is the flag for amount. + FlagAmount = "amount" + // FlagRemoteMT is the flag for remote-merkletree. + FlagRemoteMT = "remote-merkletree" + // FlagComponents is the flag for components. + FlagComponents = "components" + // FlagHTTPAPI is the flag for http.api. + FlagHTTPAPI = "http.api" + // FlagKeyStorePath is the path of the key store file containing the private key + // of the account going to sing and approve the tokens. + FlagKeyStorePath = "key-store-path" + // FlagPassword is the password needed to decrypt the key store + FlagPassword = "password" + // FlagMigrations is the flag for migrations. + FlagMigrations = "migrations" + // FlagOutputFile is the flag for the output file + FlagOutputFile = "output" + // FlagMaxAmount is the flag to avoid to use the flag FlagAmount + FlagMaxAmount = "max-amount" + // FlagSaveConfigPath is the flag to save the final configuration file + FlagSaveConfigPath = "save-config-path" + // FlagDisableDefaultConfigVars is the flag to force all variables to be set on config-files + FlagDisableDefaultConfigVars = "disable-default-config-vars" + // FlagAllowDeprecatedFields is the flag to allow deprecated fields + FlagAllowDeprecatedFields = "allow-deprecated-fields" + + deprecatedFieldSyncDB = "Aggregator.Synchronizer.DB is deprecated. Use Aggregator.Synchronizer.SQLDB instead." + + deprecatedFieldPersistenceFilename = "EthTxManager.PersistenceFilename is deprecated." + + " Use EthTxManager.StoragePath instead." + + EnvVarPrefix = "CDK" + ConfigType = "toml" + SaveConfigFileName = "aggkit_config.toml" + + DefaultCreationFilePermissions = os.FileMode(0600) +) + +type DeprecatedFieldsError struct { + // key is the rule and the value is the field's name that matches the rule + Fields map[DeprecatedField][]string +} + +func NewErrDeprecatedFields() *DeprecatedFieldsError { + return &DeprecatedFieldsError{ + Fields: make(map[DeprecatedField][]string), + } +} + +func (e *DeprecatedFieldsError) AddDeprecatedField(fieldName string, rule DeprecatedField) { + p := e.Fields[rule] + e.Fields[rule] = append(p, fieldName) +} + +func (e *DeprecatedFieldsError) Error() string { + res := "found deprecated fields:" + for rule, fieldsMatches := range e.Fields { + res += fmt.Sprintf("\n\t- %s: %s", rule.Reason, strings.Join(fieldsMatches, ", ")) + } + return res +} + +type DeprecatedField struct { + // If the field name ends with a dot means that match a section + FieldNamePattern string + Reason string +} + +var ( + deprecatedFieldsOnConfig = []DeprecatedField{ + { + FieldNamePattern: "sequencesender.ethtxmanager.persistencefilename", + Reason: deprecatedFieldPersistenceFilename, + }, + { + FieldNamePattern: "aggregator.synchronizer.db.", + Reason: deprecatedFieldSyncDB, + }, + + { + FieldNamePattern: "aggregator.ethtxmanager.persistencefilename", + Reason: deprecatedFieldPersistenceFilename, + }, + } +) + +/* +Config represents the configuration of the entire CDK Node +The file is [TOML format] + +[TOML format]: https://en.wikipedia.org/wiki/TOML +*/ +type Config struct { + // Configuration of the etherman (client for access L1) + Etherman ethermanconfig.Config + // Configuration of the aggregator + Aggregator aggregator.Config + // Configure Log level for all the services, allow also to store the logs in a file + Log log.Config + // Configuration of the genesis of the network. This is used to known the initial state of the network + NetworkConfig NetworkConfig + // Configuration of the sequence sender service + SequenceSender sequencesender.Config + // Common Config that affects all the services + Common common.Config + // Configuration of the reorg detector service to be used for the L1 + ReorgDetectorL1 reorgdetector.Config + // Configuration of the reorg detector service to be used for the L2 + ReorgDetectorL2 reorgdetector.Config + // Configuration of the aggOracle service + AggOracle aggoracle.Config + // Configuration of the L1 Info Treee Sync service + L1InfoTreeSync l1infotreesync.Config + + // RPC is the config for the RPC server + RPC jRPC.Config + + // ClaimSponsor is the config for the claim sponsor + ClaimSponsor claimsponsor.EVMClaimSponsorConfig + + // BridgeL1Sync is the configuration for the synchronizer of the bridge of the L1 + BridgeL1Sync bridgesync.Config + + // BridgeL2Sync is the configuration for the synchronizer of the bridge of the L2 + BridgeL2Sync bridgesync.Config + + // LastGERSync is the config for the synchronizer in charge of syncing the last GER injected on L2. + // Needed for the bridge service (RPC) + LastGERSync lastgersync.Config + + // AggSender is the configuration of the agg sender service + AggSender aggsender.Config +} + +// Load loads the configuration +func Load(ctx *cli.Context) (*Config, error) { + configFilePath := ctx.StringSlice(FlagCfg) + filesData, err := readFiles(configFilePath) + if err != nil { + return nil, fmt.Errorf("error reading files: Err:%w", err) + } + saveConfigPath := ctx.String(FlagSaveConfigPath) + defaultConfigVars := !ctx.Bool(FlagDisableDefaultConfigVars) + allowDeprecatedFields := ctx.Bool(FlagAllowDeprecatedFields) + return LoadFile(filesData, saveConfigPath, defaultConfigVars, allowDeprecatedFields) +} + +func readFiles(files []string) ([]FileData, error) { + result := make([]FileData, 0, len(files)) + for _, file := range files { + fileContent, err := readFileToString(file) + if err != nil { + return nil, fmt.Errorf("error reading file content: %s. Err:%w", file, err) + } + fileExtension := getFileExtension(file) + if fileExtension != ConfigType { + fileContent, err = convertFileToToml(fileContent, fileExtension) + if err != nil { + return nil, fmt.Errorf("error converting file: %s from %s to TOML. Err:%w", file, fileExtension, err) + } + } + result = append(result, FileData{Name: file, Content: fileContent}) + } + return result, nil +} + +func getFileExtension(fileName string) string { + return fileName[strings.LastIndex(fileName, ".")+1:] +} + +// Load loads the configuration +func LoadFileFromString(configFileData string, configType string) (*Config, error) { + cfg := &Config{} + err := loadString(cfg, configFileData, configType, true, EnvVarPrefix) + if err != nil { + return cfg, err + } + return cfg, nil +} + +func SaveConfigToFile(cfg *Config, saveConfigPath string) error { + marshaled, err := toml.Marshal(cfg) + if err != nil { + log.Errorf("Can't marshal config to toml. Err: %w", err) + return err + } + return SaveDataToFile(saveConfigPath, "final config file", marshaled) +} + +func SaveDataToFile(fullPath, reason string, data []byte) error { + log.Infof("Writing %s to: %s", reason, fullPath) + err := os.WriteFile(fullPath, data, DefaultCreationFilePermissions) + if err != nil { + err = fmt.Errorf("error writing %s to file %s. Err: %w", reason, fullPath, err) + log.Error(err) + return err + } + return nil +} + +// Load loads the configuration +func LoadFile(files []FileData, saveConfigPath string, + setDefaultVars bool, allowDeprecatedFields bool) (*Config, error) { + log.Infof("Loading configuration: saveConfigPath: %s, setDefaultVars: %t, allowDeprecatedFields: %t", + saveConfigPath, setDefaultVars, allowDeprecatedFields) + fileData := make([]FileData, 0) + if setDefaultVars { + log.Info("Setting default vars") + fileData = append(fileData, FileData{Name: "default_mandatory_vars", Content: DefaultMandatoryVars}) + } + fileData = append(fileData, FileData{Name: "default_vars", Content: DefaultVars}) + fileData = append(fileData, FileData{Name: "default_values", Content: DefaultValues}) + fileData = append(fileData, files...) + + merger := NewConfigRender(fileData, EnvVarPrefix) + + renderedCfg, err := merger.Render() + if err != nil { + return nil, err + } + if saveConfigPath != "" { + fullPath := saveConfigPath + "/" + SaveConfigFileName + ".merged" + err = SaveDataToFile(fullPath, "merged config file", []byte(renderedCfg)) + if err != nil { + return nil, err + } + } + cfg, err := LoadFileFromString(renderedCfg, ConfigType) + // If allowDeprecatedFields is true, we ignore the deprecated fields + if err != nil && allowDeprecatedFields { + var customErr *DeprecatedFieldsError + if errors.As(err, &customErr) { + log.Warnf("detected deprecated fields: %s", err.Error()) + err = nil + } + } + + if err != nil { + return nil, err + } + if saveConfigPath != "" { + fullPath := saveConfigPath + "/" + SaveConfigFileName + err = SaveConfigToFile(cfg, fullPath) + if err != nil { + return nil, err + } + } + return cfg, nil +} + +// Load loads the configuration +func loadString(cfg *Config, configData string, configType string, + allowEnvVars bool, envPrefix string) error { + viper.SetConfigType(configType) + if allowEnvVars { + replacer := strings.NewReplacer(".", "_") + viper.SetEnvKeyReplacer(replacer) + viper.SetEnvPrefix(envPrefix) + viper.AutomaticEnv() + } + err := viper.ReadConfig(bytes.NewBuffer([]byte(configData))) + if err != nil { + return err + } + decodeHooks := []viper.DecoderConfigOption{ + // this allows arrays to be decoded from env var separated by ",", example: MY_VAR="value1,value2,value3" + viper.DecodeHook(mapstructure.ComposeDecodeHookFunc( + mapstructure.TextUnmarshallerHookFunc(), mapstructure.StringToSliceHookFunc(","))), + } + + err = viper.Unmarshal(&cfg, decodeHooks...) + if err != nil { + return err + } + configKeys := viper.AllKeys() + err = checkDeprecatedFields(configKeys) + if err != nil { + return err + } + + return nil +} + +func checkDeprecatedFields(keysOnConfig []string) error { + err := NewErrDeprecatedFields() + for _, key := range keysOnConfig { + forbbidenInfo := getDeprecatedField(key) + if forbbidenInfo != nil { + err.AddDeprecatedField(key, *forbbidenInfo) + } + } + if len(err.Fields) > 0 { + return err + } + return nil +} + +func getDeprecatedField(fieldName string) *DeprecatedField { + for _, deprecatedField := range deprecatedFieldsOnConfig { + if deprecatedField.FieldNamePattern == fieldName { + return &deprecatedField + } + // If the field name ends with a dot, it means FieldNamePattern* + if deprecatedField.FieldNamePattern[len(deprecatedField.FieldNamePattern)-1] == '.' && + strings.HasPrefix(fieldName, deprecatedField.FieldNamePattern) { + return &deprecatedField + } + } + return nil +} diff --git a/config/config_render.go b/config/config_render.go new file mode 100644 index 00000000..52b4489e --- /dev/null +++ b/config/config_render.go @@ -0,0 +1,306 @@ +package config + +import ( + "fmt" + "io" + "os" + "regexp" + "strings" + + "github.com/agglayer/aggkit/log" + "github.com/knadh/koanf/parsers/json" + "github.com/knadh/koanf/parsers/toml" + "github.com/knadh/koanf/providers/rawbytes" + "github.com/knadh/koanf/v2" + "github.com/valyala/fasttemplate" +) + +const ( + startTag = "{{" + endTag = "}}" +) + +var ( + ErrCycleVars = fmt.Errorf("cycle vars") + ErrMissingVars = fmt.Errorf("missing vars") + ErrUnsupportedConfigFileType = fmt.Errorf("unsupported config file type") +) + +type FileData struct { + Name string + Content string +} + +type ConfigRender struct { + // 0: default, 1: specific + FilesData []FileData + // Function to resolve environment variables typically: Os.LookupEnv + LookupEnvFunc func(key string) (string, bool) + EnvinormentPrefix string +} + +func NewConfigRender(filesData []FileData, envinormentPrefix string) *ConfigRender { + return &ConfigRender{ + FilesData: filesData, + LookupEnvFunc: os.LookupEnv, + EnvinormentPrefix: envinormentPrefix, + } +} + +// - Merge all files +// - Resolve all variables inside +func (c *ConfigRender) Render() (string, error) { + mergedData, err := c.Merge() + if err != nil { + return "", fmt.Errorf("fail to merge files. Err: %w", err) + } + return c.ResolveVars(mergedData) +} + +func (c *ConfigRender) Merge() (string, error) { + k := koanf.New(".") + for _, data := range c.FilesData { + dataToml := c.convertVarsToStrings(data.Content) + err := k.Load(rawbytes.Provider([]byte(dataToml)), toml.Parser()) + if err != nil { + log.Errorf("error loading file %s. Err:%v.FileData: %v", data.Name, err, dataToml) + return "", fmt.Errorf("fail to load converted template %s to toml. Err: %w", data.Name, err) + } + } + marshaled, err := k.Marshal(toml.Parser()) + if err != nil { + return "", fmt.Errorf("fail to marshal to toml. Err: %w", err) + } + out2 := RemoveQuotesForVars(string(marshaled)) + return out2, err +} + +func (c *ConfigRender) ResolveVars(fullConfigData string) (string, error) { + // Read values, the values that are indirections get the var string "{{tag}}" + // this step doesn't resolve any var + tpl, valuesDefined, err := c.ReadTemplateAdnDefinedValues(fullConfigData) + if err != nil { + return "", err + } + // It fills the defined vars, if a var is not defined keep the template form: + // A={{B}} + renderedTemplateWithResolverVars := c.executeTemplate(tpl, valuesDefined, true) + renderedTemplateWithResolverVars = RemoveTypeMarks(renderedTemplateWithResolverVars) + // ? there are unresolved vars??. This means that is not a cycle, just + // a missing value + unresolvedVars := c.GetUnresolvedVars(tpl, valuesDefined, true) + if len(unresolvedVars) > 0 { + return renderedTemplateWithResolverVars, fmt.Errorf("missing vars: %v. Err: %w", unresolvedVars, ErrMissingVars) + } + // If there are still vars on configfile it means there are cycles: + // Cycles are vars that depend on each other: + // A= {{B}} and B= {{A}} + // Also can be bigger cycles: + // A= {{B}} and B= {{C}} and C= {{A}} + // The way to detect that is, after resolving all vars if there are still vars to resolve, + // then there is a cycle + finalConfigData, err := c.ResolveCycle(renderedTemplateWithResolverVars) + if err != nil { + return fullConfigData, err + } + return finalConfigData, err +} + +// ResolveCycle resolve the cycle vars: +// It iterate to configData, each step must reduce the number of 'vars' +// if not means that there are cycle vars +func (c *ConfigRender) ResolveCycle(partialResolvedConfigData string) (string, error) { + tmpData := RemoveQuotesForVars(partialResolvedConfigData) + pendinVars := c.GetVars(tmpData) + if len(pendinVars) == 0 { + // Nothing to do resolve + return partialResolvedConfigData, nil + } + log.Debugf("ResolveCycle: pending vars: %v", pendinVars) + previousData := tmpData + for ok := true; ok; ok = len(pendinVars) > 0 { + previousVars := pendinVars + tpl, valuesDefined, err := c.ReadTemplateAdnDefinedValues(previousData) + if err != nil { + log.Errorf("resolveCycle: fails ReadTemplateAdnDefinedValues. Err: %v. Data:%s", err, previousData) + return "", fmt.Errorf("fails to read template ResolveCycle. Err: %w", err) + } + renderedTemplateWithResolverVars := c.executeTemplate(tpl, valuesDefined, true) + tmpData = RemoveQuotesForVars(renderedTemplateWithResolverVars) + tmpData = RemoveTypeMarks(tmpData) + + pendinVars = c.GetVars(tmpData) + if len(pendinVars) == len(previousVars) { + return partialResolvedConfigData, fmt.Errorf("not resolved cycle vars: %v. Err: %w", pendinVars, ErrCycleVars) + } + previousData = tmpData + } + return previousData, nil +} + +// The variables in data must be in format template: +// A={{B}} no A="{{B}}" +func (c *ConfigRender) ReadTemplateAdnDefinedValues(data string) (*fasttemplate.Template, + map[string]interface{}, error) { + tpl, err := fasttemplate.NewTemplate(data, startTag, endTag) + if err != nil { + return nil, nil, fmt.Errorf("fail to load template ReadTemplateAdnDefinedValues. Err:%w", err) + } + out := c.convertVarsToStrings(data) + k := koanf.New(".") + err = k.Load(rawbytes.Provider([]byte(out)), toml.Parser()) + if err != nil { + return nil, nil, fmt.Errorf("error ReadTemplateAdnDefinedValues parsing"+ + " data koanf.Load.Content: %s. Err: %w", out, err) + } + return tpl, k.All(), nil +} + +func (c *ConfigRender) convertVarsToStrings(data string) string { + re := regexp.MustCompile(`=\s*\{\{([^}:]+)\}\}`) + data = re.ReplaceAllString(data, `= "{{${1}:int}}"`) + return data +} + +func RemoveQuotesForVars(data string) string { + re := regexp.MustCompile(`=\s*\"\{\{([^}:]+:int)\}\}\"`) + data = re.ReplaceAllStringFunc(data, func(match string) string { + submatch := re.FindStringSubmatch(match) + if len(submatch) > 1 { + parts := strings.Split(submatch[1], ":") + return "= {{" + parts[0] + "}}" + } + return match + }) + return data +} + +func RemoveTypeMarks(data string) string { + re := regexp.MustCompile(`\{\{([^}:]+:int)\}\}`) + data = re.ReplaceAllStringFunc(data, func(match string) string { + submatch := re.FindStringSubmatch(match) + if len(submatch) > 1 { + parts := strings.Split(submatch[1], ":") + return "{{" + parts[0] + "}}" + } + return match + }) + return data +} + +func (c *ConfigRender) executeTemplate(tpl *fasttemplate.Template, + data map[string]interface{}, + useEnv bool) string { + return tpl.ExecuteFuncString(func(w io.Writer, tag string) (int, error) { + if useEnv { + if v, ok := c.findTagInEnvironment(tag); ok { + tmp := fmt.Sprintf("%v", v) + return w.Write([]byte(tmp)) + } + } + if v, ok := data[tag]; ok { + tmp := fmt.Sprintf("%v", v) + return w.Write([]byte(tmp)) + } + + v := composeVarKeyForTemplate(tag) + return w.Write([]byte(v)) + }) +} + +// GetUnresolvedVars returns the vars in template that are no on data +// In this case we don't use environment variables +func (c *ConfigRender) GetUnresolvedVars(tpl *fasttemplate.Template, + data map[string]interface{}, useEnv bool) []string { + var unresolved []string + tpl.ExecuteFuncString(func(w io.Writer, tag string) (int, error) { + if useEnv { + if v, ok := c.findTagInEnvironment(tag); ok { + return w.Write([]byte(v)) + } + } + if _, ok := data[tag]; !ok { + if !contains(unresolved, tag) { + unresolved = append(unresolved, tag) + } + } + return w.Write([]byte("")) + }) + return unresolved +} + +func contains(vars []string, search string) bool { + for _, v := range vars { + if v == search { + return true + } + } + return false +} + +// GetVars returns the vars in template +func (c *ConfigRender) GetVars(configData string) []string { + tpl, err := fasttemplate.NewTemplate(configData, startTag, endTag) + if err != nil { + return []string{} + } + vars := unresolvedVars(tpl, map[string]interface{}{}) + return vars +} + +func (c *ConfigRender) findTagInEnvironment(tag string) (string, bool) { + envTag := c.composeVarKeyForEnvirnonment(tag) + if v, ok := c.LookupEnvFunc(envTag); ok { + return v, true + } + return "", false +} + +func (c *ConfigRender) composeVarKeyForEnvirnonment(key string) string { + return c.EnvinormentPrefix + "_" + strings.ReplaceAll(key, ".", "_") +} + +func composeVarKeyForTemplate(key string) string { + return startTag + key + endTag +} + +func readFileToString(filename string) (string, error) { + content, err := os.ReadFile(filename) + if err != nil { + return "", err + } + return string(content), nil +} + +func unresolvedVars(tpl *fasttemplate.Template, data map[string]interface{}) []string { + var unresolved []string + tpl.ExecuteFuncString(func(w io.Writer, tag string) (int, error) { + if _, ok := data[tag]; !ok { + unresolved = append(unresolved, tag) + } + return w.Write([]byte("")) + }) + return unresolved +} + +func convertFileToToml(fileData string, fileType string) (string, error) { + switch strings.ToLower(fileType) { + case "json": + k := koanf.New(".") + err := k.Load(rawbytes.Provider([]byte(fileData)), json.Parser()) + if err != nil { + return fileData, fmt.Errorf("error loading json file. Err: %w", err) + } + config := k.Raw() + tomlData, err := toml.Parser().Marshal(config) + if err != nil { + return fileData, fmt.Errorf("error converting json to toml. Err: %w", err) + } + return string(tomlData), nil + case "yml", "yaml", "ini": + return fileData, fmt.Errorf("cant convert from %s to TOML. Err: %w", fileType, ErrUnsupportedConfigFileType) + default: + log.Warnf("filetype %s unknown, assuming is a TOML file", fileType) + return fileData, nil + } +} diff --git a/config/config_render_test.go b/config/config_render_test.go new file mode 100644 index 00000000..0636ed75 --- /dev/null +++ b/config/config_render_test.go @@ -0,0 +1,283 @@ +package config + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +var ( + s = []string{"A= {{B}}\n", "B= {{C}}\nC={{A}}\n"} +) + +type testCaseData struct { + name string + contents []string + envVars map[string]string + expectedMerged string + expectedRenderConfig string + expectedError error +} + +func TestConfigRenderMerge(t *testing.T) { + var tests = []testCaseData{ + { + name: "Merge 2 elements", + contents: []string{"A=1\n", "B=2\n"}, + expectedRenderConfig: "A = 1\nB = 2\n", + }, + { + name: "Merge 3 elements", + contents: []string{"A=1\n", "B=2\n", "C=3\n"}, + expectedRenderConfig: "A = 1\nB = 2\nC = 3\n", + }, + { + name: "Merge 3 elements, overlapped", + contents: []string{"A=1\n", "A=2\nB=2\n", "A=3\nC=3\n"}, + expectedRenderConfig: "A = 3\nB = 2\nC = 3\n", + }, + { + name: "Merge 3 elements, overlapped final var", + contents: []string{"A=1\n", "A=2\nB=2\n", "A={{VAR}}\nC=3\n"}, + expectedRenderConfig: "A = {{VAR}}\nB = 2\nC = 3\n", + expectedError: ErrMissingVars, + }, + } + executeCases(t, tests) +} + +func TestConfigRenderDetectCycle(t *testing.T) { + var tests = []testCaseData{ + { + name: "Cycle 3 elements", + contents: []string{"A= {{B}}\n", "B= {{C}}\nC={{A}}\n"}, + expectedMerged: "A = {{B}}\nB = {{C}}\nC = {{A}}\n", + expectedRenderConfig: "A = {{B}}\nB = {{C}}\nC = {{A}}\n", + expectedError: ErrCycleVars, + }, + { + name: "Cycle 2 elements", + contents: []string{"A= {{B}}\n", "B= {{A}}\n"}, + expectedRenderConfig: "A = {{B}}\nB = {{A}}\n", + expectedError: ErrCycleVars, + }, + { + name: "Cycle 1 elements", + contents: []string{"A= {{A}}\n", ""}, + expectedRenderConfig: "A = {{A}}\n", + expectedError: ErrCycleVars, + }, + } + executeCases(t, tests) +} + +func TestConfigRenderTypes(t *testing.T) { + var tests = []testCaseData{ + { + name: "Cycle 3 elements B, break var", + contents: []string{"INT_VALUE={{MY_INT}}\n STR_VALUE= \"{{MY_STR}}\"\n MYBOOL={{MY_BOOL}}\n", + "MY_STR=\"a string\"\nMY_INT=4\nMY_BOOL=true\nNO_RESOLVED={{NOT_DEFINED_VAR}}\n"}, + envVars: map[string]string{"UTCR_B": "4"}, + expectedError: ErrMissingVars, + expectedRenderConfig: "INT_VALUE = 4\nMYBOOL = true\nMY_BOOL = true\nMY_INT = 4\nMY_STR = \"a string\"\nNO_RESOLVED = {{NOT_DEFINED_VAR}}\nSTR_VALUE = \"a string\"\n", + }, + } + executeCases(t, tests) +} + +func TestConfigRenderComposedValues(t *testing.T) { + var tests = []testCaseData{ + { + name: "Composed var", + contents: []string{"A=\"path\"\n", "B= \"{{A}}to\"\n"}, + expectedRenderConfig: "A = \"path\"\nB = \"pathto\"\n", + }, + } + executeCases(t, tests) +} + +func TestConfigRenderCycleBrokenByEnvVar(t *testing.T) { + var tests = []testCaseData{ + { + name: "Cycle 3 elements B, break var", + contents: []string{"A= {{B}}\n", "B= {{C}}\nC={{A}}\n"}, + envVars: map[string]string{"UTCR_B": "4"}, + expectedRenderConfig: "A = 4\nB = 4\nC = 4\n", + }, + { + name: "Cycle 3 elements A, break var", + contents: []string{"A= {{B}}\n", "B= {{C}}\nC={{A}}\n"}, + envVars: map[string]string{"UTCR_A": "4"}, + expectedRenderConfig: "A = 4\nB = 4\nC = 4\n", + }, + { + name: "Cycle 3 elements C, break var", + contents: []string{"A= {{B}}\n", "B= {{C}}\nC={{A}}\n"}, + envVars: map[string]string{"UTCR_C": "4"}, + expectedRenderConfig: "A = 4\nB = 4\nC = 4\n", + }, + } + executeCases(t, tests) +} + +func TestConfigRenderOverrideByEnvVars(t *testing.T) { + var tests = []testCaseData{ + { + name: "Variable is not set in config file but override as number", + contents: []string{"A={{C}}\n"}, + envVars: map[string]string{"UTCR_C": "4"}, + expectedRenderConfig: "A = 4\n", + }, + // Notice that the exported variable have the quotes + { + name: "Variable is not set in config file but override as string", + contents: []string{"A={{C}}\n"}, + envVars: map[string]string{"UTCR_C": "\"4\""}, + expectedRenderConfig: "A = \"4\"\n", + }, + } + executeCases(t, tests) +} + +func TestConfigRenderPropagateType(t *testing.T) { + var tests = []testCaseData{ + { + name: "propagateType: set directly", + contents: []string{"A=\"hello\"\n", "B= \"{{A}}\"\n"}, + expectedRenderConfig: "A = \"hello\"\nB = \"hello\"\n", + }, + { + name: "propagateType: set directly", + contents: []string{"A=\"hello\"\n", "B=\"{{A}}\"\n"}, + envVars: map[string]string{"UTCR_A": "you"}, + expectedRenderConfig: "A = \"hello\"\nB = \"you\"\n", + }, + } + executeCases(t, tests) +} + +func TestConfigRenderComplexStruct(t *testing.T) { + defaultValues := ` + [Etherman] + URL="http://generic_url" + ForkIDChunkSize=100 + [Etherman.EthermanConfig] + URL="http://localhost:8545" +` + confiFile := ` + [Etherman.EthermanConfig] + URL="{{Etherman.URL}}" + ` + var tests = []testCaseData{ + { + name: "Complex struct merge", + contents: []string{defaultValues, confiFile}, + expectedRenderConfig: "\n[Etherman]\n ForkIDChunkSize = 100\n URL = \"http://generic_url\"\n\n [Etherman.EthermanConfig]\n URL = \"http://generic_url\"\n", + }, + // This test Etherman.URL doesnt change because is not a var, it will change value on viper stage + { + name: "Complex struct merge override env-var, but we must propagate the string type", + contents: []string{defaultValues, confiFile}, + envVars: map[string]string{"UTCR_Etherman_URL": "env"}, + expectedRenderConfig: "\n[Etherman]\n ForkIDChunkSize = 100\n URL = \"http://generic_url\"\n\n [Etherman.EthermanConfig]\n URL = \"env\"\n", + }, + } + executeCases(t, tests) +} + +func TestConfigRenderConvertFileToToml(t *testing.T) { + jsonFile := `{ + "rollupCreationBlockNumber": 63, + "rollupManagerCreationBlockNumber": 57, + "genesisBlockNumber": 63, + "L1Config": { + "chainId": 271828, + "polygonZkEVMGlobalExitRootAddress": "0x1f7ad7caA53e35b4f0D138dC5CBF91aC108a2674", + "polygonRollupManagerAddress": "0x2F50ef6b8e8Ee4E579B17619A92dE3E2ffbD8AD2", + "polTokenAddress": "0xEdE9cf798E0fE25D35469493f43E88FeA4a5da0E", + "polygonZkEVMAddress": "0x1Fe038B54aeBf558638CA51C91bC8cCa06609e91" + } +} +` + data, err := convertFileToToml(jsonFile, "json") + require.NoError(t, err) + require.Equal(t, "genesisBlockNumber = 63.0\nrollupCreationBlockNumber = 63.0\nrollupManagerCreationBlockNumber = 57.0\n\n[L1Config]\n chainId = 271828.0\n polTokenAddress = \"0xEdE9cf798E0fE25D35469493f43E88FeA4a5da0E\"\n polygonRollupManagerAddress = \"0x2F50ef6b8e8Ee4E579B17619A92dE3E2ffbD8AD2\"\n polygonZkEVMAddress = \"0x1Fe038B54aeBf558638CA51C91bC8cCa06609e91\"\n polygonZkEVMGlobalExitRootAddress = \"0x1f7ad7caA53e35b4f0D138dC5CBF91aC108a2674\"\n", data) +} + +/* +TODO: This test generate this, is the same? +[PrivateKey] + Password = "testonly" + Path = "./test/sequencer.keystore" + +func TestConfigRenderValueIsAObject(t *testing.T) { + var tests = []testCaseData{ + { + name: "Complex struct object inside var", + contents: []string{"PrivateKey = {Path = \"./test/sequencer.keystore\", Password = \"testonly\"}"}, + expectedRenderConfig: "PrivateKey = {Path = \"./test/sequencer.keystore\", Password = \"testonly\"}", + }, + } + executeCases(t, tests) +} +*/ + +type configRenderTestData struct { + Sut *ConfigRender + EnvMock *osLookupEnvMock +} + +func newConfigRenderTestData(data []string) configRenderTestData { + envMock := &osLookupEnvMock{ + Env: map[string]string{}, + } + filesData := make([]FileData, len(data)) + for i, d := range data { + filesData[i] = FileData{Name: fmt.Sprintf("file%d", i), Content: d} + } + return configRenderTestData{ + EnvMock: envMock, + Sut: &ConfigRender{ + FilesData: filesData, + LookupEnvFunc: envMock.LookupEnv, + EnvinormentPrefix: "UTCR", + }, + } +} + +type osLookupEnvMock struct { + Env map[string]string +} + +func (m *osLookupEnvMock) LookupEnv(key string) (string, bool) { + val, exists := m.Env[key] + return val, exists +} + +func executeCases(t *testing.T, tests []testCaseData) { + t.Helper() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testData := newConfigRenderTestData(tt.contents) + if tt.envVars != nil { + testData.EnvMock.Env = tt.envVars + } + if tt.expectedMerged != "" { + merged, err := testData.Sut.Merge() + require.NoError(t, err) + require.Equal(t, tt.expectedMerged, merged) + } + res, err := testData.Sut.Render() + if tt.expectedError != nil { + require.Error(t, err) + require.ErrorIs(t, err, tt.expectedError) + } else { + require.NoError(t, err) + } + if len(tt.expectedRenderConfig) > 0 { + require.Equal(t, tt.expectedRenderConfig, res) + } + }) + } +} diff --git a/config/config_test.go b/config/config_test.go new file mode 100644 index 00000000..a7da6481 --- /dev/null +++ b/config/config_test.go @@ -0,0 +1,164 @@ +package config + +import ( + "flag" + "fmt" + "os" + "testing" + + "github.com/stretchr/testify/require" + "github.com/urfave/cli/v2" +) + +func TestLExploratorySetConfigFlag(t *testing.T) { + value := []string{"config.json", "another_config.json"} + ctx := newCliContextConfigFlag(t, value...) + configFilePath := ctx.StringSlice(FlagCfg) + require.Equal(t, value, configFilePath) +} + +func TestLoadDefaultConfig(t *testing.T) { + tmpFile, err := os.CreateTemp("", "ut_config") + require.NoError(t, err) + defer os.Remove(tmpFile.Name()) + _, err = tmpFile.Write([]byte(DefaultMandatoryVars)) + require.NoError(t, err) + ctx := newCliContextConfigFlag(t, tmpFile.Name()) + cfg, err := Load(ctx) + require.NoError(t, err) + require.NotNil(t, cfg) +} + +const configWithDeprecatedFields = ` +[SequenceSender.EthTxManager] +nodepretatedfield = "value2" +persistencefilename = "value" +` + +func TestLoadConfigWithDeprecatedFields(t *testing.T) { + tmpFile, err := os.CreateTemp("", "ut_config") + require.NoError(t, err) + defer os.Remove(tmpFile.Name()) + _, err = tmpFile.Write([]byte(DefaultVars + "\n" + configWithDeprecatedFields)) + require.NoError(t, err) + ctx := newCliContextConfigFlag(t, tmpFile.Name()) + cfg, err := Load(ctx) + require.Error(t, err) + require.Nil(t, cfg) +} + +func TestLoadConfigWithSaveConfigFile(t *testing.T) { + tmpFile, err := os.CreateTemp("", "ut_config") + require.NoError(t, err) + defer os.Remove(tmpFile.Name()) + _, err = tmpFile.Write([]byte(DefaultVars + "\n")) + require.NoError(t, err) + fmt.Printf("file: %s\n", tmpFile.Name()) + ctx := newCliContextConfigFlag(t, tmpFile.Name()) + dir, err := os.MkdirTemp("", "ut_test_save_config") + require.NoError(t, err) + defer os.RemoveAll(dir) + + err = ctx.Set(FlagSaveConfigPath, dir) + require.NoError(t, err) + cfg, err := Load(ctx) + require.NoError(t, err) + require.NotNil(t, cfg) + _, err = os.Stat(dir + "/" + SaveConfigFileName) + require.NoError(t, err) +} + +func TestTLoadFileFromStringDeprecatedField(t *testing.T) { + configFileData := configWithDeprecatedFields + _, err := LoadFileFromString(configFileData, "toml") + require.Error(t, err) +} +func TestTLoadDeprecatedField(t *testing.T) { + tmpFile, err := os.CreateTemp("", "ut_config") + require.NoError(t, err) + defer os.Remove(tmpFile.Name()) + _, err = tmpFile.Write([]byte(DefaultVars + "\n" + configWithDeprecatedFields)) + require.NoError(t, err) + ctx := newCliContextConfigFlag(t, tmpFile.Name()) + _, err = Load(ctx) + require.Error(t, err) +} + +func TestTLoadDeprecatedFieldWithAllowFlag(t *testing.T) { + tmpFile, err := os.CreateTemp("", "ut_config") + require.NoError(t, err) + defer os.Remove(tmpFile.Name()) + _, err = tmpFile.Write([]byte(DefaultVars + "\n" + configWithDeprecatedFields)) + require.NoError(t, err) + ctx := newCliContextConfigFlag(t, tmpFile.Name()) + err = ctx.Set(FlagAllowDeprecatedFields, "true") + require.NoError(t, err) + _, err = Load(ctx) + require.NoError(t, err) +} + +func TestCheckDeprecatedFields(t *testing.T) { + err := checkDeprecatedFields([]string{deprecatedFieldsOnConfig[0].FieldNamePattern}) + require.Error(t, err) + require.Contains(t, err.Error(), deprecatedFieldsOnConfig[0].FieldNamePattern) + require.Contains(t, err.Error(), deprecatedFieldsOnConfig[0].Reason) +} + +func TestCheckDeprecatedFieldsPattern(t *testing.T) { + err := checkDeprecatedFields([]string{"aggregator.synchronizer.db.name"}) + require.Error(t, err) + require.Contains(t, err.Error(), deprecatedFieldSyncDB) +} + +func TestLoadConfigWithInvalidFilename(t *testing.T) { + ctx := newCliContextConfigFlag(t, "invalid_file") + cfg, err := Load(ctx) + require.Error(t, err) + require.Nil(t, cfg) +} + +func TestLoadConfigWithForbiddenFields(t *testing.T) { + cases := []struct { + name string + input string + }{ + { + name: "[Aggregator.Synchronizer] DB", + input: `[Aggregator.Synchronizer.DB] + name = "value"`, + }, + { + name: "[SequenceSender.EthTxManager] PersistenceFilename", + input: `[SequenceSender.EthTxManager] + PersistenceFilename = "foo.json"`, + }, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + tmpFile, err := os.CreateTemp("", "ut_config") + require.NoError(t, err) + defer os.Remove(tmpFile.Name()) + _, err = tmpFile.Write([]byte(c.input)) + require.NoError(t, err) + ctx := newCliContextConfigFlag(t, tmpFile.Name()) + cfg, err := Load(ctx) + require.Error(t, err) + require.Nil(t, cfg) + }) + } +} + +func newCliContextConfigFlag(t *testing.T, values ...string) *cli.Context { + t.Helper() + flagSet := flag.NewFlagSet("test", flag.ContinueOnError) + var configFilePaths cli.StringSlice + flagSet.Var(&configFilePaths, FlagCfg, "") + flagSet.Bool(FlagAllowDeprecatedFields, false, "") + flagSet.String(FlagSaveConfigPath, "", "") + for _, value := range values { + err := flagSet.Parse([]string{"--" + FlagCfg, value}) + require.NoError(t, err) + } + return cli.NewContext(nil, flagSet, nil) +} diff --git a/config/default.go b/config/default.go new file mode 100644 index 00000000..f38d4c40 --- /dev/null +++ b/config/default.go @@ -0,0 +1,345 @@ +package config + +// This values doesnt have a default value because depend on the +// environment / deployment +const DefaultMandatoryVars = ` +L1URL = "http://localhost:8545" +L2URL = "http://localhost:8123" +AggLayerURL = "https://agglayer-dev.polygon.technology" + + +ForkId = 9 +ContractVersions = "elderberry" +IsValidiumMode = false + +L2Coinbase = "0xfa3b44587990f97ba8b6ba7e230a5f0e95d14b3d" +SequencerPrivateKeyPath = "/app/sequencer.keystore" +SequencerPrivateKeyPassword = "test" +WitnessURL = "http://localhost:8123" + +AggregatorPrivateKeyPath = "/app/keystore/aggregator.keystore" +AggregatorPrivateKeyPassword = "testonly" +# Who send Proof to L1? AggLayer addr, or aggregator addr? +SenderProofToL1Addr = "0x0000000000000000000000000000000000000000" +polygonBridgeAddr = "0x0000000000000000000000000000000000000000" + + +# This values can be override directly from genesis.json +rollupCreationBlockNumber = 0 +rollupManagerCreationBlockNumber = 0 +genesisBlockNumber = 0 +[L1Config] + chainId = 0 + polygonZkEVMGlobalExitRootAddress = "0x0000000000000000000000000000000000000000" + polygonRollupManagerAddress = "0x0000000000000000000000000000000000000000" + polTokenAddress = "0x0000000000000000000000000000000000000000" + polygonZkEVMAddress = "0x0000000000000000000000000000000000000000" + + +[L2Config] + GlobalExitRootAddr = "0x0000000000000000000000000000000000000000" + +` + +// This doesnt below to config, but are the vars used +// to avoid repetition in config-files +const DefaultVars = ` +PathRWData = "/tmp/aggkit" +L1URLSyncChunkSize = 100 + +` + +// DefaultValues is the default configuration +const DefaultValues = ` +ForkUpgradeBatchNumber = 0 +ForkUpgradeNewForkId = 0 + + +[Log] +Environment = "development" # "production" or "development" +Level = "info" +Outputs = ["stderr"] + +[Etherman] + URL="{{L1URL}}" + ForkIDChunkSize={{L1URLSyncChunkSize}} + [Etherman.EthermanConfig] + URL="{{L1URL}}" + MultiGasProvider=false + L1ChainID={{NetworkConfig.L1.L1ChainID}} + HTTPHeaders=[] + [Etherman.EthermanConfig.Etherscan] + ApiKey="" + Url="https://api.etherscan.io/api?module=gastracker&action=gasoracle&apikey=" + +[Common] +NetworkID = 1 +IsValidiumMode = {{IsValidiumMode}} +ContractVersions = "{{ContractVersions}}" + +[SequenceSender] +WaitPeriodSendSequence = "15s" +LastBatchVirtualizationTimeMaxWaitPeriod = "10s" +L1BlockTimestampMargin = "30s" +MaxTxSizeForL1 = 131072 +L2Coinbase = "{{L2Coinbase}}" +PrivateKey = { Path = "{{SequencerPrivateKeyPath}}", Password = "{{SequencerPrivateKeyPassword}}"} +SequencesTxFileName = "sequencesender.json" +GasOffset = 80000 +WaitPeriodPurgeTxFile = "15m" +MaxPendingTx = 1 +MaxBatchesForL1 = 300 +BlockFinality = "FinalizedBlock" +RPCURL = "{{L2URL}}" +GetBatchWaitInterval = "10s" + [SequenceSender.EthTxManager] + FrequencyToMonitorTxs = "1s" + WaitTxToBeMined = "2m" + GetReceiptMaxTime = "250ms" + GetReceiptWaitInterval = "1s" + PrivateKeys = [ + {Path = "{{SequencerPrivateKeyPath}}", Password = "{{SequencerPrivateKeyPassword}}"}, + ] + ForcedGas = 0 + GasPriceMarginFactor = 1 + MaxGasPriceLimit = 0 + StoragePath = "ethtxmanager.sqlite" + ReadPendingL1Txs = false + SafeStatusL1NumberOfBlocks = 0 + FinalizedStatusL1NumberOfBlocks = 0 + [SequenceSender.EthTxManager.Etherman] + URL = "{{L1URL}}" + MultiGasProvider = false + L1ChainID = {{NetworkConfig.L1.L1ChainID}} +[Aggregator] +# GRPC server host +Host = "0.0.0.0" +# GRPC server port +Port = 50081 +RetryTime = "5s" +VerifyProofInterval = "10s" +ProofStatePollingInterval = "5s" +TxProfitabilityCheckerType = "acceptall" +TxProfitabilityMinReward = "1.1" +IntervalAfterWhichBatchConsolidateAnyway="0s" +BatchProofSanityCheckEnabled = true +# ChainID is L2ChainID. Is populated on runtimme +ChainID = 0 +ForkId = {{ForkId}} +SenderAddress = "{{SenderProofToL1Addr}}" +CleanupLockedProofsInterval = "2m" +GeneratingProofCleanupThreshold = "10m" +GasOffset = 0 +RPCURL = "{{L2URL}}" +WitnessURL = "{{WitnessURL}}" +UseFullWitness = false +SettlementBackend = "l1" +AggLayerTxTimeout = "5m" +AggLayerURL = "{{AggLayerURL}}" +SyncModeOnlyEnabled = false +DBPath = "{{PathRWData}}/aggregator_db.sqlite" + [Aggregator.SequencerPrivateKey] + Path = "{{SequencerPrivateKeyPath}}" + Password = "{{SequencerPrivateKeyPassword}}" + [Aggregator.Log] + Environment ="{{Log.Environment}}" # "production" or "development" + Level = "{{Log.Level}}" + Outputs = ["stderr"] + [Aggregator.EthTxManager] + FrequencyToMonitorTxs = "1s" + WaitTxToBeMined = "2m" + GetReceiptMaxTime = "250ms" + GetReceiptWaitInterval = "1s" + PrivateKeys = [ + {Path = "{{AggregatorPrivateKeyPath}}", Password = "{{AggregatorPrivateKeyPassword}}"}, + ] + ForcedGas = 0 + GasPriceMarginFactor = 1 + MaxGasPriceLimit = 0 + StoragePath = "" + ReadPendingL1Txs = false + SafeStatusL1NumberOfBlocks = 0 + FinalizedStatusL1NumberOfBlocks = 0 + [Aggregator.EthTxManager.Etherman] + URL = "{{L1URL}}" + L1ChainID = {{NetworkConfig.L1.L1ChainID}} + HTTPHeaders = [] + [Aggregator.Synchronizer] + [Aggregator.Synchronizer.Log] + Environment = "{{Log.Environment}}" # "production" or "development" + Level = "{{Log.Level}}" + Outputs = ["stderr"] + [Aggregator.Synchronizer.SQLDB] + DriverName = "sqlite3" + DataSource = "file:{{PathRWData}}/aggregator_sync_db.sqlite" + [Aggregator.Synchronizer.Synchronizer] + SyncInterval = "10s" + SyncChunkSize = 1000 + GenesisBlockNumber = {{genesisBlockNumber}} + SyncUpToBlock = "finalized" + BlockFinality = "finalized" + OverrideStorageCheck = false + [Aggregator.Synchronizer.Etherman] + L1URL = "{{L1URL}}" + ForkIDChunkSize = 100 + L1ChainID = {{NetworkConfig.L1.L1ChainID}} + PararellBlockRequest = false + [Aggregator.Synchronizer.Etherman.Contracts] + GlobalExitRootManagerAddr = "{{NetworkConfig.L1.GlobalExitRootManagerAddr}}" + RollupManagerAddr = "{{NetworkConfig.L1.RollupManagerAddr}}" + ZkEVMAddr = "{{NetworkConfig.L1.ZkEVMAddr}}" + [Aggregator.Synchronizer.Etherman.Validium] + Enabled = {{IsValidiumMode}} + # L2URL, empty ask to contract + TrustedSequencerURL = "" + RetryOnDACErrorInterval = "1m" + DataSourcePriority = ["trusted", "external"] + [Aggregator.Synchronizer.Etherman.Validium.Translator] + FullMatchRules = [] + [Aggregator.Synchronizer.Etherman.Validium.RateLimit] + NumRequests = 1000 + Interval = "1s" +[ReorgDetectorL1] +DBPath = "{{PathRWData}}/reorgdetectorl1.sqlite" + +[ReorgDetectorL2] +DBPath = "{{PathRWData}}/reorgdetectorl2.sqlite" + +[L1InfoTreeSync] +DBPath = "{{PathRWData}}/L1InfoTreeSync.sqlite" +GlobalExitRootAddr="{{NetworkConfig.L1.GlobalExitRootManagerAddr}}" +RollupManagerAddr = "{{NetworkConfig.L1.RollupManagerAddr}}" +SyncBlockChunkSize=100 +BlockFinality="LatestBlock" +URLRPCL1="{{L1URL}}" +WaitForNewBlocksPeriod="100ms" +InitialBlock={{genesisBlockNumber}} +RetryAfterErrorPeriod="1s" +MaxRetryAttemptsAfterError=-1 + +[AggOracle] +TargetChainType="EVM" +URLRPCL1="{{L1URL}}" +BlockFinality="FinalizedBlock" +WaitPeriodNextGER="100ms" + [AggOracle.EVMSender] + GlobalExitRootL2="{{L2Config.GlobalExitRootAddr}}" + URLRPCL2="{{L2URL}}" + ChainIDL2=1337 + GasOffset=0 + WaitPeriodMonitorTx="100ms" + [AggOracle.EVMSender.EthTxManager] + FrequencyToMonitorTxs = "1s" + WaitTxToBeMined = "2s" + GetReceiptMaxTime = "250ms" + GetReceiptWaitInterval = "1s" + PrivateKeys = [ + {Path = "/app/keystore/aggoracle.keystore", Password = "testonly"}, + ] + ForcedGas = 0 + GasPriceMarginFactor = 1 + MaxGasPriceLimit = 0 + StoragePath = "{{PathRWData}}/ethtxmanager-sequencesender.sqlite" + ReadPendingL1Txs = false + SafeStatusL1NumberOfBlocks = 5 + FinalizedStatusL1NumberOfBlocks = 10 + [AggOracle.EVMSender.EthTxManager.Etherman] + URL = "{{L2URL}}" + MultiGasProvider = false + L1ChainID = {{NetworkConfig.L1.L1ChainID}} + HTTPHeaders = [] + +[RPC] +Host = "0.0.0.0" +Port = 5576 +ReadTimeout = "2s" +WriteTimeout = "2s" +MaxRequestsPerIPAndSecond = 10 + +[ClaimSponsor] +DBPath = "{{PathRWData}}/claimsopnsor.sqlite" +Enabled = true +SenderAddr = "0xfa3b44587990f97ba8b6ba7e230a5f0e95d14b3d" +BridgeAddrL2 = "0xB7098a13a48EcE087d3DA15b2D28eCE0f89819B8" +MaxGas = 200000 +RetryAfterErrorPeriod = "1s" +MaxRetryAttemptsAfterError = -1 +WaitTxToBeMinedPeriod = "3s" +WaitOnEmptyQueue = "3s" +GasOffset = 0 + [ClaimSponsor.EthTxManager] + FrequencyToMonitorTxs = "1s" + WaitTxToBeMined = "2s" + GetReceiptMaxTime = "250ms" + GetReceiptWaitInterval = "1s" + PrivateKeys = [ + {Path = "/app/keystore/claimsopnsor.keystore", Password = "testonly"}, + ] + ForcedGas = 0 + GasPriceMarginFactor = 1 + MaxGasPriceLimit = 0 + StoragePath = "{{PathRWData}}/ethtxmanager-claimsponsor.sqlite" + ReadPendingL1Txs = false + SafeStatusL1NumberOfBlocks = 5 + FinalizedStatusL1NumberOfBlocks = 10 + [ClaimSponsor.EthTxManager.Etherman] + URL = "{{L2URL}}" + MultiGasProvider = false + L1ChainID = {{NetworkConfig.L1.L1ChainID}} + HTTPHeaders = [] + +[BridgeL1Sync] +DBPath = "{{PathRWData}}/bridgel1sync.sqlite" +BlockFinality = "LatestBlock" +InitialBlockNum = 0 +BridgeAddr = "{{polygonBridgeAddr}}" +SyncBlockChunkSize = 100 +RetryAfterErrorPeriod = "1s" +MaxRetryAttemptsAfterError = -1 +WaitForNewBlocksPeriod = "3s" + +[BridgeL2Sync] +DBPath = "{{PathRWData}}/bridgel2sync.sqlite" +BlockFinality = "LatestBlock" +InitialBlockNum = 0 +BridgeAddr = "{{polygonBridgeAddr}}" +SyncBlockChunkSize = 100 +RetryAfterErrorPeriod = "1s" +MaxRetryAttemptsAfterError = -1 +WaitForNewBlocksPeriod = "3s" + +[LastGERSync] +DBPath = "{{PathRWData}}/lastgersync.sqlite" +BlockFinality = "LatestBlock" +InitialBlockNum = 0 +GlobalExitRootL2Addr = "{{L2Config.GlobalExitRootAddr}}" +RetryAfterErrorPeriod = "1s" +MaxRetryAttemptsAfterError = -1 +WaitForNewBlocksPeriod = "1s" +DownloadBufferSize = 100 + +[NetworkConfig.L1] +L1ChainID = {{L1Config.chainId}} +PolAddr = "{{L1Config.polTokenAddress}}" +ZkEVMAddr = "{{L1Config.polygonZkEVMAddress}}" +RollupManagerAddr = "{{L1Config.polygonRollupManagerAddress}}" +GlobalExitRootManagerAddr = "{{L1Config.polygonZkEVMGlobalExitRootAddress}}" + + +[AggSender] +StoragePath = "{{PathRWData}}/aggsender.sqlite" +AggLayerURL = "{{AggLayerURL}}" +AggsenderPrivateKey = {Path = "{{SequencerPrivateKeyPath}}", Password = "{{SequencerPrivateKeyPassword}}"} +URLRPCL2="{{L2URL}}" +BlockFinality = "LatestBlock" +EpochNotificationPercentage = 50 +SaveCertificatesToFilesPath = "" +MaxRetriesStoreCertificate = 3 +DelayBeetweenRetries = "60s" +KeepCertificatesHistory = true +# MaxSize of the certificate to 8Mb +MaxCertSize = 8388608 +BridgeMetadataAsHash = true +DryRun = false +EnableRPC = true +` diff --git a/config/network.go b/config/network.go new file mode 100644 index 00000000..0645d428 --- /dev/null +++ b/config/network.go @@ -0,0 +1,58 @@ +package config + +import ( + ethermanconfig "github.com/agglayer/aggkit/etherman/config" + "github.com/agglayer/aggkit/state" +) + +// NetworkConfig is the configuration struct for the different environments +type NetworkConfig struct { + // L1: Configuration related to L1 + L1Config ethermanconfig.L1Config `mapstructure:"L1"` + // L1: Genesis of the rollup, first block number and root + Genesis state.Genesis +} + +type network string +type leafType uint8 + +const ( + custom network = "custom" + // LeafTypeBalance specifies that leaf stores Balance + LeafTypeBalance leafType = 0 + // LeafTypeNonce specifies that leaf stores Nonce + LeafTypeNonce leafType = 1 + // LeafTypeCode specifies that leaf stores Code + LeafTypeCode leafType = 2 + // LeafTypeStorage specifies that leaf stores Storage Value + LeafTypeStorage leafType = 3 + // LeafTypeSCLength specifies that leaf stores Storage Value + LeafTypeSCLength leafType = 4 +) + +// GenesisFromJSON is the config file for network_custom +type GenesisFromJSON struct { + // L1: root hash of the genesis block + Root string `json:"root"` + // L1: block number of the genesis block + GenesisBlockNum uint64 `json:"genesisBlockNumber"` + // L2: List of states contracts used to populate merkle tree at initial state + Genesis []genesisAccountFromJSON `json:"genesis"` + // L1: configuration of the network + L1Config ethermanconfig.L1Config +} + +type genesisAccountFromJSON struct { + // Address of the account + Balance string `json:"balance"` + // Nonce of the account + Nonce string `json:"nonce"` + // Address of the contract + Address string `json:"address"` + // Byte code of the contract + Bytecode string `json:"bytecode"` + // Initial storage of the contract + Storage map[string]string `json:"storage"` + // Name of the contract in L1 (e.g. "PolygonZkEVMDeployer", "PolygonZkEVMBridge",...) + ContractName string `json:"contractName"` +} diff --git a/config/types/duration.go b/config/types/duration.go new file mode 100644 index 00000000..d6855d10 --- /dev/null +++ b/config/types/duration.go @@ -0,0 +1,41 @@ +package types + +import ( + "time" + + "github.com/invopop/jsonschema" +) + +// Duration is a wrapper type that parses time duration from text. +type Duration struct { + time.Duration `validate:"required"` +} + +// UnmarshalText unmarshalls time duration from text. +func (d *Duration) UnmarshalText(data []byte) error { + duration, err := time.ParseDuration(string(data)) + if err != nil { + return err + } + d.Duration = duration + + return nil +} + +// NewDuration returns Duration wrapper +func NewDuration(duration time.Duration) Duration { + return Duration{duration} +} + +// JSONSchema returns a custom schema to be used for the JSON Schema generation of this type +func (Duration) JSONSchema() *jsonschema.Schema { + return &jsonschema.Schema{ + Type: "string", + Title: "Duration", + Description: "Duration expressed in units: [ns, us, ms, s, m, h, d]", + Examples: []interface{}{ + "1m", + "300ms", + }, + } +} diff --git a/config/types/duration_test.go b/config/types/duration_test.go new file mode 100644 index 00000000..c11bd083 --- /dev/null +++ b/config/types/duration_test.go @@ -0,0 +1,54 @@ +package types + +import ( + "encoding/json" + "fmt" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestDurationUnmarshal(t *testing.T) { + type testCase struct { + name string + input string + expectedResult *Duration + expectedErr error + } + + testCases := []testCase{ + { + name: "valid duration", + input: "60s", + expectedResult: &Duration{Duration: time.Minute}, + }, + { + name: "int value", + input: "60", + expectedErr: fmt.Errorf("time: missing unit in duration \"60\""), + }, + { + name: "no duration value", + input: "abc", + expectedErr: fmt.Errorf("time: invalid duration \"abc\""), + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + var d Duration + input, err := json.Marshal(testCase.input) + require.NoError(t, err) + err = json.Unmarshal(input, &d) + + if testCase.expectedResult != nil { + require.Equal(t, testCase.expectedResult.Nanoseconds(), d.Nanoseconds()) + } + + if err != nil { + require.Equal(t, testCase.expectedErr.Error(), err.Error()) + } + }) + } +} diff --git a/config/types/keystore.go b/config/types/keystore.go new file mode 100644 index 00000000..620834e9 --- /dev/null +++ b/config/types/keystore.go @@ -0,0 +1,10 @@ +package types + +// KeystoreFileConfig has all the information needed to load a private key from a key store file +type KeystoreFileConfig struct { + // Path is the file path for the key store file + Path string `mapstructure:"Path"` + + // Password is the password to decrypt the key store file + Password string `mapstructure:"Password"` +} diff --git a/crates/aggkit-config/Cargo.toml b/crates/aggkit-config/Cargo.toml new file mode 100644 index 00000000..d93a2895 --- /dev/null +++ b/crates/aggkit-config/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "aggkit-config" +version.workspace = true +edition.workspace = true + +[dependencies] +serde = { workspace = true, features = ["derive"] } +serde_with.workspace = true +thiserror.workspace = true +tracing-appender.workspace = true +tracing-subscriber = { workspace = true, features = ["env-filter"] } +tracing.workspace = true +url = { workspace = true, features = ["serde"] } +ethers.workspace = true +jsonrpsee.workspace = true + +[dev-dependencies] +serde_json = { workspace = true } +toml.workspace = true + +[features] +default = [] +testutils = [] diff --git a/crates/aggkit-config/src/aggregator.rs b/crates/aggkit-config/src/aggregator.rs new file mode 100644 index 00000000..8f37a9af --- /dev/null +++ b/crates/aggkit-config/src/aggregator.rs @@ -0,0 +1,125 @@ +use ethers::types::Address; +use serde::Deserialize; +use url::Url; + +#[derive(Deserialize, Debug, Clone)] +pub struct EthTxManager { + #[serde(rename = "Etherman")] + pub etherman: Etherman, +} + +impl Default for EthTxManager { + fn default() -> Self { + Self { + etherman: Etherman::default(), + } + } +} + +#[derive(Deserialize, Debug, Clone)] +pub struct Etherman { + #[serde(rename = "URL", default)] + pub url: String, +} + +impl Default for Etherman { + fn default() -> Self { + Self { + url: "http://localhost:8545".to_string(), + } + } +} + +/// The Aggregator configuration. +#[derive(Deserialize, Debug, Clone)] +pub struct Aggregator { + #[serde(rename = "ChainID", default)] + pub chain_id: String, + #[serde(rename = "Host", default)] + pub host: String, + #[serde(rename = "Port", default)] + pub port: String, + #[serde(rename = "RetryTime", default)] + pub retry_time: String, + #[serde(rename = "VerifyProofInterval", default)] + pub verify_proof_interval: String, + #[serde(rename = "ProofStatePollingInterval", default)] + pub proof_state_polling_interval: String, + #[serde(rename = "TxProfitabilityCheckerType", default)] + pub tx_profitability_checker_type: String, + #[serde(rename = "TxProfitabilityMinReward", default)] + pub tx_profitability_min_reward: String, + #[serde(rename = "IntervalAfterWhichBatchConsolidateAnyway", default)] + pub interval_after_which_batch_consolidate_anyway: String, + #[serde(rename = "ForkId", default)] + pub fork_id: u64, + #[serde(rename = "CleanupLockedProofsInterval", default)] + pub cleanup_locked_proofs_interval: String, + #[serde(rename = "GeneratingProofCleanupThreshold", default)] + pub generating_proof_cleanup_threshold: String, + #[serde(rename = "GasOffset", default)] + pub gas_offset: u64, + #[serde(rename = "RPCURL", default = "default_url")] + pub rpc_url: Url, + #[serde(rename = "WitnessURL", default = "default_url")] + pub witness_url: Url, + #[serde(rename = "SenderAddress", default = "default_address")] + pub sender_address: Address, + #[serde(rename = "SettlementBackend", default)] + pub settlement_backend: String, + #[serde(rename = "AggLayerTxTimeout", default)] + pub agg_layer_tx_timeout: String, + #[serde(rename = "AggLayerURL", default = "default_url")] + pub agg_layer_url: Url, + #[serde(rename = "UseFullWitness", default)] + pub use_full_witness: bool, + #[serde(rename = "SyncModeOnlyEnabled", default)] + pub sync_mode_only_enabled: bool, + + #[serde(rename = "EthTxManager", default)] + pub eth_tx_manager: EthTxManager, +} + +fn default_url() -> Url { + Url::parse("http://localhost:8546").unwrap() +} + +fn default_address() -> Address { + "0x0000000000000000000000000000000000000000" + .parse() + .unwrap() +} + +impl Default for Aggregator { + fn default() -> Self { + // Values are coming from https://github.com/0xPolygon/agglayer/blob/main/config/default.go#L11 + Self { + chain_id: "1".to_string(), + host: "localhost".to_string(), + port: "8545".to_string(), + retry_time: "10s".to_string(), + verify_proof_interval: "1m".to_string(), + proof_state_polling_interval: "10s".to_string(), + tx_profitability_checker_type: "default".to_string(), + tx_profitability_min_reward: "0.1".to_string(), + interval_after_which_batch_consolidate_anyway: "5m".to_string(), + fork_id: 0, + cleanup_locked_proofs_interval: "1h".to_string(), + generating_proof_cleanup_threshold: "10m".to_string(), + gas_offset: 0, + rpc_url: default_url(), + witness_url: default_url(), + sender_address: default_address(), + settlement_backend: "default".to_string(), + agg_layer_tx_timeout: "30s".to_string(), + agg_layer_url: Url::parse("http://localhost:8547").unwrap(), + use_full_witness: false, + sync_mode_only_enabled: false, + eth_tx_manager: EthTxManager { + etherman: Etherman { + url: "http://localhost:9093".to_string(), + }, + }, + } + } +} diff --git a/crates/aggkit-config/src/l1.rs b/crates/aggkit-config/src/l1.rs new file mode 100644 index 00000000..4c339b98 --- /dev/null +++ b/crates/aggkit-config/src/l1.rs @@ -0,0 +1,38 @@ +use ethers::types::Address; +use serde::Deserialize; + +/// The L1 configuration. +#[derive(Deserialize, Debug, Clone)] +pub struct L1 { + #[serde(rename = "L1ChainID", alias = "ChainID", default)] + pub l1_chain_id: String, + #[serde(rename = "PolAddr", default)] + pub pol_addr: Address, + #[serde(rename = "ZkEVMAddr", default)] + pub zk_evm_addr: Address, + #[serde(rename = "RollupManagerAddr", default)] + pub rollup_manager_addr: Address, + #[serde(rename = "GlobalExitRootManagerAddr", default)] + pub global_exit_root_manager_addr: Address, +} + +impl Default for L1 { + fn default() -> Self { + // Values are coming from https://github.com/0xPolygon/agglayer/blob/main/config/default.go#L11 + Self { + l1_chain_id: "1337".to_string(), + pol_addr: "0x5b06837A43bdC3dD9F114558DAf4B26ed49842Ed" + .parse() + .unwrap(), + zk_evm_addr: "0x2F50ef6b8e8Ee4E579B17619A92dE3E2ffbD8AD2" + .parse() + .unwrap(), + rollup_manager_addr: "0x1Fe038B54aeBf558638CA51C91bC8cCa06609e91" + .parse() + .unwrap(), + global_exit_root_manager_addr: "0x1f7ad7caA53e35b4f0D138dC5CBF91aC108a2674" + .parse() + .unwrap(), + } + } +} diff --git a/crates/aggkit-config/src/lib.rs b/crates/aggkit-config/src/lib.rs new file mode 100644 index 00000000..c86e9932 --- /dev/null +++ b/crates/aggkit-config/src/lib.rs @@ -0,0 +1,38 @@ +//! Aggkit configuration. +//! +//! The Aggkit is configured via its TOML configuration file, `aggkit.toml` +//! by default, which is deserialized into the [`Config`] struct. +use serde::Deserialize; + +pub(crate) const DEFAULT_IP: std::net::Ipv4Addr = std::net::Ipv4Addr::new(0, 0, 0, 0); + +pub(crate) mod aggregator; +pub(crate) mod l1; +pub mod log; +pub(crate) mod network_config; +pub(crate) mod sequence_sender; +pub(crate) mod telemetry; + +pub use log::Log; +use sequence_sender::SequenceSender; + +/// The Agglayer configuration. +#[derive(Deserialize, Debug)] +#[cfg_attr(any(test, feature = "testutils"), derive(Default))] +pub struct Config { + /// The log configuration. + #[serde(rename = "Log", default)] + pub log: Log, + + #[serde(rename = "ForkUpgradeBatchNumber")] + pub fork_upgrade_batch_number: Option, + + #[serde(rename = "NetworkConfig", default)] + pub network_config: network_config::NetworkConfig, + + #[serde(rename = "Aggregator", default)] + pub aggregator: aggregator::Aggregator, + + #[serde(rename = "SequenceSender", default)] + pub sequence_sender: SequenceSender, +} diff --git a/crates/aggkit-config/src/log.rs b/crates/aggkit-config/src/log.rs new file mode 100644 index 00000000..fc902fb6 --- /dev/null +++ b/crates/aggkit-config/src/log.rs @@ -0,0 +1,108 @@ +use std::{fmt::Display, path::PathBuf}; + +use serde::{Deserialize, Deserializer}; +use tracing_subscriber::{fmt::writer::BoxMakeWriter, EnvFilter}; + +/// The log configuration. +#[derive(Deserialize, Debug, Clone, Default)] +#[serde(rename_all = "PascalCase")] +pub struct Log { + /// The `RUST_LOG` environment variable will take precedence over the + /// configuration log level. + #[serde(default)] + pub level: LogLevel, + pub outputs: Vec, + #[serde(default)] + pub format: LogFormat, +} + +/// The log format. +#[derive(Deserialize, Debug, Default, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum LogFormat { + #[default] + Pretty, + Json, +} + +/// The log level. +#[derive(Deserialize, Debug, Default, Clone, Copy)] +#[serde(rename_all = "lowercase")] +pub enum LogLevel { + Trace, + Debug, + #[default] + Info, + Warn, + Error, + Fatal, +} + +impl Display for LogLevel { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let level = match self { + LogLevel::Trace => "trace", + LogLevel::Debug => "debug", + LogLevel::Info => "info", + LogLevel::Warn => "warn", + LogLevel::Error => "error", + LogLevel::Fatal => "fatal", + }; + + write!(f, "{}", level) + } +} + +impl From for EnvFilter { + fn from(value: LogLevel) -> Self { + EnvFilter::new(format!("warn,agglayer={}", value)) + } +} + +/// The log output. +/// +/// This can be either `stdout`, `stderr`, or a file path. +/// +/// The [`Deserialize`] implementation allows for the configuration file to +/// specify the output location as a string, which is then parsed into the +/// appropriate enum variant. If the string is not recognized to be either +/// `stdout` or `stderr`, it is assumed to be a file path. +#[derive(Debug, Clone, Default)] +pub enum LogOutput { + #[default] + Stdout, + Stderr, + File(PathBuf), +} + +impl<'de> Deserialize<'de> for LogOutput { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + // If the string is not recognized to be either `stdout` or `stderr`, + // it is assumed to be a file path. + match s.as_str() { + "stdout" => Ok(LogOutput::Stdout), + "stderr" => Ok(LogOutput::Stderr), + _ => Ok(LogOutput::File(PathBuf::from(s))), + } + } +} + +impl LogOutput { + /// Get a [`BoxMakeWriter`] for the log output. + /// + /// This can be used to plug the log output into the tracing subscriber. + pub fn as_make_writer(&self) -> BoxMakeWriter { + match self { + LogOutput::Stdout => BoxMakeWriter::new(std::io::stdout), + LogOutput::Stderr => BoxMakeWriter::new(std::io::stderr), + LogOutput::File(path) => { + let appender = tracing_appender::rolling::never(".", path); + BoxMakeWriter::new(appender) + } + } + } +} diff --git a/crates/aggkit-config/src/network_config.rs b/crates/aggkit-config/src/network_config.rs new file mode 100644 index 00000000..3f49b786 --- /dev/null +++ b/crates/aggkit-config/src/network_config.rs @@ -0,0 +1,15 @@ +use crate::l1::L1; +use serde::Deserialize; + +/// The L1 configuration. +#[derive(Deserialize, Debug, Clone)] +pub struct NetworkConfig { + #[serde(rename = "L1", default)] + pub l1: L1, +} + +impl Default for NetworkConfig { + fn default() -> Self { + Self { l1: L1::default() } + } +} diff --git a/crates/aggkit-config/src/sequence_sender.rs b/crates/aggkit-config/src/sequence_sender.rs new file mode 100644 index 00000000..c4e83cc5 --- /dev/null +++ b/crates/aggkit-config/src/sequence_sender.rs @@ -0,0 +1,50 @@ +use serde::Deserialize; + +/// The SequenceSender configuration. +#[derive(Deserialize, Debug, Clone)] +pub struct SequenceSender { + #[serde(rename = "WaitPeriodSendSequence", default)] + pub wait_period_send_sequence: String, + #[serde(rename = "LastBatchVirtualizationTimeMaxWaitPeriod", default)] + pub last_batch_virtualization_time_max_wait_period: String, + #[serde(rename = "MaxTxSizeForL1", default)] + pub max_tx_size_for_l1: u32, + #[serde(rename = "L2Coinbase", default)] + pub l2_coinbase: String, + #[serde(rename = "SequencesTxFileName", default)] + pub sequences_tx_file_name: String, + #[serde(rename = "GasOffset", default)] + pub gas_offset: u64, + #[serde(rename = "WaitPeriodPurgeTxFile", default)] + pub wait_period_purge_tx_file: String, + #[serde(rename = "MaxPendingTx", default)] + pub max_pending_tx: u32, + #[serde(rename = "MaxBatchesForL1", default)] + pub max_batches_for_l1: u32, + #[serde(rename = "BlockFinality", default)] + pub block_finality: String, + #[serde(rename = "RPCURL", default)] + pub rpc_url: String, + #[serde(rename = "GetBatchWaitInterval", default)] + pub get_batch_wait_interval: String, +} + +// Default trait implementation +impl Default for SequenceSender { + fn default() -> Self { + Self { + wait_period_send_sequence: "1s".to_string(), + last_batch_virtualization_time_max_wait_period: "1s".to_string(), + max_tx_size_for_l1: 1000, + l2_coinbase: "0x".to_string(), + sequences_tx_file_name: "sequences_tx.json".to_string(), + gas_offset: 0, + wait_period_purge_tx_file: "1s".to_string(), + max_pending_tx: 1000, + max_batches_for_l1: 100, + block_finality: "1s".to_string(), + rpc_url: "http://localhost:8545".to_string(), + get_batch_wait_interval: "1s".to_string(), + } + } +} diff --git a/crates/aggkit-config/src/telemetry.rs b/crates/aggkit-config/src/telemetry.rs new file mode 100644 index 00000000..728611ce --- /dev/null +++ b/crates/aggkit-config/src/telemetry.rs @@ -0,0 +1,23 @@ +use super::DEFAULT_IP; +use serde::Deserialize; +use std::net::SocketAddr; + +#[derive(Deserialize, Debug, Clone, Copy)] +#[serde(rename_all = "PascalCase")] +#[allow(dead_code)] +pub struct TelemetryConfig { + #[serde(rename = "PrometheusAddr", default = "default_metrics_api_addr")] + pub addr: SocketAddr, +} + +impl Default for TelemetryConfig { + fn default() -> Self { + Self { + addr: default_metrics_api_addr(), + } + } +} + +const fn default_metrics_api_addr() -> SocketAddr { + SocketAddr::V4(std::net::SocketAddrV4::new(DEFAULT_IP, 3000)) +} diff --git a/crates/aggkit/Cargo.toml b/crates/aggkit/Cargo.toml new file mode 100644 index 00000000..c2cbf809 --- /dev/null +++ b/crates/aggkit/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "aggkit" +version.workspace = true +edition.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.86" +clap = { version = "4.5.7", features = ["derive", "env"] } +dotenvy = "0.15.7" +execute = "0.2.13" +toml = "0.8.14" +tracing.workspace = true +tracing-subscriber = { workspace = true, features = ["env-filter", "json"] } +url = { workspace = true, features = ["serde"] } +colored = "2.0" +aggkit-config = { path = "../aggkit-config" } +serde.workspace = true +serde_json.workspace = true +tempfile = "3.12.0" +alloy-rpc-client = "0.5.4" +alloy-transport-http = "0.5.4" +tokio = "1.40.0" +alloy-json-rpc = "0.5.4" + +[build-dependencies] +reqwest = {version = "0.12.8", features = ["blocking"]} +serde_json.workspace = true +regex = "1.11.1" diff --git a/crates/aggkit/build.rs b/crates/aggkit/build.rs new file mode 100644 index 00000000..3bb15ece --- /dev/null +++ b/crates/aggkit/build.rs @@ -0,0 +1,103 @@ +use regex::Regex; +use reqwest::blocking::get; +use std::env; +use std::fs::File; +use std::io::Write; +use std::path::Path; +use std::path::PathBuf; +use std::process::Command; + +fn main() { + let _ = build_versions(); + + let build_script_disabled = env::var("BUILD_SCRIPT_DISABLED") + .map(|v| v == "1") + .unwrap_or(false); // run by default + + if build_script_disabled { + println!("cargo:warning=Build script is disabled. Skipping build."); + return; + } + + // Determine the directory where the build script is located + let dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + let build_path = PathBuf::from(dir + "/../.."); + println!("cargo:rerun-if-changed=*.go"); + + // Optionally, specify the directory where your Makefile is located + // For this example, it's assumed to be the same as the build script's directory + // If your Makefile is in a different directory, adjust `build_path` accordingly + + // Call the make command + let output = Command::new("make") + .arg("build-go") // Create a new make command + .current_dir(build_path) // Set the current directory for the command + .output() // Execute the command and capture the output + .expect("Failed to execute make command"); + + // Check the output and react accordingly + if !output.status.success() { + // If the make command failed, print the error and exit + let error_message = String::from_utf8_lossy(&output.stderr); + panic!("Make command failed with error: {}", error_message); + } + + // Optionally, print the output of the make command + println!( + "Make command output: {}", + String::from_utf8_lossy(&output.stdout) + ); + + // Here you can also add additional commands to inform Cargo about + // how to rerun the build script. For example, to rerun this script + // only when a specific file changes: + // println!("cargo:rerun-if-changed=path/to/file"); +} + +// build_versions retrieves the versions from the Starlark file and embeds them in the binary. +fn build_versions() -> std::io::Result<()> { + // Retrieve the contents of the file from the URL + let url = "https://raw.githubusercontent.com/0xPolygon/kurtosis-cdk/refs/heads/main/input_parser.star"; + let response = get(url).expect("Failed to send request"); + let content = response.text().expect("Failed to read response text"); + + // Write the contents to a file + let out_dir = std::env::var("OUT_DIR").unwrap(); + let dest_path = Path::new(&out_dir).join("input_parser.star"); + let mut file = File::create(&dest_path)?; + file.write_all(content.as_bytes())?; + + // Get the corresponding lines from the contents of the starlark file + let versions = content + .lines() + .skip(32) + .take(15) + .collect::>() + .join("\n"); + + // Replace the string DEFAULT_IMAGES = from the versions string + let versions = versions.replace("DEFAULT_IMAGES = ", ""); + + // Remove all comments to the end of the line using a regexp + let re = Regex::new(r"\s#\s.*\n").unwrap(); + let versions = re.replace_all(&versions, ""); + + // Replace the trailing comma on the last line + let versions = versions.replace(", }", " }"); + + // The versions string is a JSON object we can parse + let versions_json: serde_json::Value = serde_json::from_str(&versions).unwrap(); + + // Write the versions to a file + let dest_path = Path::new(".").join("versions.json"); + let mut file = File::create(&dest_path)?; + file.write_all( + format!( + "{}\n", + serde_json::to_string_pretty(&versions_json).unwrap() + ) + .as_bytes(), + )?; + + Ok(()) +} diff --git a/crates/aggkit/src/allocs_render.rs b/crates/aggkit/src/allocs_render.rs new file mode 100644 index 00000000..3b881149 --- /dev/null +++ b/crates/aggkit/src/allocs_render.rs @@ -0,0 +1,99 @@ +use anyhow::{Context, Result}; +use serde::{Deserialize, Serialize}; +use serde_json::{self, Value}; +use std::collections::HashMap; +use std::fs::File; +use std::io::Read; +use std::path::Path; + +#[derive(Serialize, Deserialize, Debug, Clone)] +struct Input { + #[serde(rename = "contractName", skip_serializing_if = "Option::is_none")] + contract_name: Option, + #[serde(rename = "accountName", skip_serializing_if = "Option::is_none")] + account_name: Option, + balance: String, + nonce: String, + address: String, + #[serde(skip_serializing_if = "Option::is_none")] + bytecode: Option, + #[serde(skip_serializing_if = "Option::is_none")] + storage: Option>, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct Wrapper { + pub root: String, + #[serde(rename = "L1Config")] + pub l1_config: L1Config, + genesis: Vec, + #[serde(rename = "rollupCreationBlockNumber")] + pub rollup_creation_block_number: u64, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct L1Config { + #[serde(rename = "chainId")] + pub chain_id: u64, + #[serde(rename = "polygonZkEVMGlobalExitRootAddress")] + pub zkevm_global_exit_root_address: String, + #[serde(rename = "polygonRollupManagerAddress")] + pub rollup_manager_address: String, + #[serde(rename = "polTokenAddress")] + pub pol_token_address: String, + #[serde(rename = "polygonZkEVMAddress")] + pub zkevm_address: String, +} + +#[derive(Serialize, Deserialize, Debug)] +struct Output { + #[serde(rename = "contractName", skip_serializing_if = "Option::is_none")] + contract_name: Option, + #[serde(rename = "accountName", skip_serializing_if = "Option::is_none")] + account_name: Option, + balance: Option, + nonce: Option, + code: Option, + storage: Option, +} + +pub struct Rendered { + pub output: String, + pub wrapper: Wrapper, +} + +pub fn render_allocs(genesis_file_path: &str) -> Result { + let path = Path::new(genesis_file_path); + let display = path.display(); + + let mut file = File::open(&path).with_context(|| format!("couldn't open {}", display))?; + + let mut data = String::new(); + file.read_to_string(&mut data) + .with_context(|| format!("couldn't read {}", display))?; + + let wrapper: Wrapper = serde_json::from_str(&data) + .with_context(|| format!("couldn't parse JSON from {}", display))?; + + let mut outputs: HashMap = HashMap::new(); + + for input in wrapper.genesis.clone() { + let output = Output { + contract_name: input.contract_name, + account_name: input.account_name, + balance: Some(input.balance), + nonce: Some(input.nonce), + code: input.bytecode, + storage: input.storage.map(|s| serde_json::to_value(s).unwrap()), + }; + outputs.insert(input.address, output); + } + + // outputs.sort_by(|a, b| a.contract_name.cmp(&b.contract_name)); + + Ok(Rendered { + output: serde_json::to_string_pretty(&outputs) + .with_context(|| "couldn't serialize outputs to JSON")?, + wrapper, + }) +} diff --git a/crates/aggkit/src/cli.rs b/crates/aggkit/src/cli.rs new file mode 100644 index 00000000..5e5fd7ec --- /dev/null +++ b/crates/aggkit/src/cli.rs @@ -0,0 +1,58 @@ +//! Command line interface. +use std::path::PathBuf; + +use clap::{Parser, Subcommand, ValueHint}; + +/// Command line interface. +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +pub(crate) struct Cli { + #[command(subcommand)] + pub(crate) cmd: Commands, +} + +#[derive(Subcommand)] +pub(crate) enum Commands { + /// Run the aggkit with the provided configuration + Node { + /// The path to the configuration file + #[arg( + long, + short = 'C', + value_hint = ValueHint::FilePath, + env = "AGGKIT_CONFIG_PATH" + )] + config: PathBuf, + + /// Components to run. + #[arg( + long, + short, + value_hint = ValueHint::CommandString, + env = "AGGKIT_COMPONENTS", + )] + components: Option, + }, + /// Run cdk-erigon node with the provided default configuration + Erigon { + /// The path to the configuration file + #[arg( + long, + short = 'C', + value_hint = ValueHint::FilePath, + env = "AGGKIT_CONFIG_PATH" + )] + config: PathBuf, + + /// The path to a chain specification file. + #[arg( + long, + short = 'g', + value_hint = ValueHint::FilePath, + env = "AGGKIT_GENESIS_PATH" + )] + chain: PathBuf, + }, + /// Output the corresponding versions of the components + Versions, +} diff --git a/crates/aggkit/src/config_render.rs b/crates/aggkit/src/config_render.rs new file mode 100644 index 00000000..e96971e3 --- /dev/null +++ b/crates/aggkit/src/config_render.rs @@ -0,0 +1,128 @@ +use crate::allocs_render::Rendered; +use anyhow::Error; +use aggkit_config::Config; +use std::fs; +use std::path::PathBuf; +use tempfile::{tempdir, TempDir}; + +pub fn render(config: &Config, genesis_file: PathBuf, timestamp: u64) -> Result { + // Create a temporary directory + let tmp_dir = tempdir()?; + let chain_id = config.aggregator.chain_id.clone(); + let res = crate::allocs_render::render_allocs(genesis_file.to_str().unwrap())?; + // Write the three files to disk + fs::write( + tmp_dir + .path() + .join(format!("dynamic-{}-allocs.json", chain_id.clone())), + res.output.clone(), + )?; + fs::write( + tmp_dir + .path() + .join(format!("dynamic-{}-chainspec.json", chain_id.clone())), + render_chainspec(chain_id.clone()), + )?; + fs::write( + tmp_dir + .path() + .join(format!("dynamic-{}-conf.json", chain_id.clone())), + render_conf(res.wrapper.root.clone(), timestamp), + )?; + + let contents = render_yaml(config, res); + fs::write( + tmp_dir + .path() + .join(format!("dynamic-{}.yaml", chain_id.clone())), + contents, + )?; + + Ok(tmp_dir) +} + +fn render_chainspec(chain_id: String) -> String { + format!( + r#" +{{ + "ChainName": "dynamic-{chain_id}", + "chainId": {chain_id}, + "consensus": "ethash", + "homesteadBlock": 0, + "daoForkBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "muirGlacierBlock": 0, + "berlinBlock": 0, + "londonBlock": 9999999999999999999999999999999999999999999999999, + "arrowGlacierBlock": 9999999999999999999999999999999999999999999999999, + "grayGlacierBlock": 9999999999999999999999999999999999999999999999999, + "terminalTotalDifficulty": 58750000000000000000000, + "terminalTotalDifficultyPassed": false, + "shanghaiTime": 9999999999999999999999999999999999999999999999999, + "cancunTime": 9999999999999999999999999999999999999999999999999, + "pragueTime": 9999999999999999999999999999999999999999999999999, + "ethash": {{}} +}} + "# + ) +} + +fn render_conf(root: String, timestamp: u64) -> String { + format!( + r#" +{{ + "root": {:?}, + "timestamp": {:?}, + "gasLimit": 0, + "difficulty": 0 +}} + "#, + root, timestamp + ) +} + +// render_config renders the configuration file for the Erigon node. +fn render_yaml(config: &Config, res: Rendered) -> String { + format!( + r#" +chain: dynamic-{chain_id} +zkevm.l2-chain-id: {chain_id} +zkevm.l2-sequencer-rpc-url: {l2_sequencer_rpc_url} +zkevm.l1-chain-id: {l1_chain_id} +zkevm.l1-rpc-url: {l1_rpc_url} +zkevm.address-sequencer: {sequencer_address} +zkevm.address-zkevm: {zkevm_address} +zkevm.address-rollup: {rollup_address} +zkevm.address-ger-manager: {ger_manager_address} +zkevm.l1-matic-contract-address: {pol_token_address} +zkevm.l1-first-block: {l1_first_block} +datadir: ./data/dynamic-{chain_id} + +externalcl: true +http: true +private.api.addr: "localhost:9092" +zkevm.rpc-ratelimit: 250 +zkevm.datastream-version: 3 +http.api: [eth, debug,net,trace,web3,erigon,zkevm] +http.addr: "0.0.0.0" +http.vhosts: any +http.corsdomain: any +ws: true +"#, + chain_id = config.aggregator.chain_id.clone(), + l2_sequencer_rpc_url = config.aggregator.witness_url.to_string(), + l1_rpc_url = config.aggregator.eth_tx_manager.etherman.url, + l1_chain_id = config.network_config.l1.l1_chain_id, + sequencer_address = config.sequence_sender.l2_coinbase, + zkevm_address = res.wrapper.l1_config.zkevm_address, + rollup_address = res.wrapper.l1_config.rollup_manager_address, + ger_manager_address = res.wrapper.l1_config.zkevm_global_exit_root_address, + pol_token_address = res.wrapper.l1_config.pol_token_address, + l1_first_block = res.wrapper.rollup_creation_block_number + ) +} diff --git a/crates/aggkit/src/helpers.rs b/crates/aggkit/src/helpers.rs new file mode 100644 index 00000000..0004cac2 --- /dev/null +++ b/crates/aggkit/src/helpers.rs @@ -0,0 +1,13 @@ +use std::env; + +const AGGKIT_CLIENT_BIN: &str = "aggkit"; + +pub(crate) fn get_bin_path() -> String { + // This is to find the binary when running in development mode + // otherwise it will use system path + let mut bin_path = env::var("CARGO_MANIFEST_DIR").unwrap_or(AGGKIT_CLIENT_BIN.into()); + if bin_path != AGGKIT_CLIENT_BIN { + bin_path = format!("{}/../../target/{}", bin_path, AGGKIT_CLIENT_BIN); + } + bin_path +} diff --git a/crates/aggkit/src/logging.rs b/crates/aggkit/src/logging.rs new file mode 100644 index 00000000..8a02fc60 --- /dev/null +++ b/crates/aggkit/src/logging.rs @@ -0,0 +1,23 @@ +use aggkit_config::log::LogFormat; +use tracing_subscriber::{prelude::*, util::SubscriberInitExt, EnvFilter}; + +pub(crate) fn tracing(config: &aggkit_config::Log) { + // TODO: Support multiple outputs. + let writer = config.outputs.first().cloned().unwrap_or_default(); + + let layer = match config.format { + LogFormat::Pretty => tracing_subscriber::fmt::layer() + .pretty() + .with_writer(writer.as_make_writer()) + .with_filter(EnvFilter::try_from_default_env().unwrap_or_else(|_| config.level.into())) + .boxed(), + + LogFormat::Json => tracing_subscriber::fmt::layer() + .json() + .with_writer(writer.as_make_writer()) + .with_filter(EnvFilter::try_from_default_env().unwrap_or_else(|_| config.level.into())) + .boxed(), + }; + + tracing_subscriber::Registry::default().with(layer).init(); +} diff --git a/crates/aggkit/src/main.rs b/crates/aggkit/src/main.rs new file mode 100644 index 00000000..8261d0cf --- /dev/null +++ b/crates/aggkit/src/main.rs @@ -0,0 +1,184 @@ +//! Command line interface. +use alloy_rpc_client::ClientBuilder; +use alloy_rpc_client::ReqwestClient; +use aggkit_config::Config; +use clap::Parser; +use cli::Cli; +use colored::*; +use execute::Execute; +use std::path::PathBuf; +use std::process::Command; +use url::Url; + +pub mod allocs_render; +mod cli; +mod config_render; +mod helpers; +mod logging; +mod versions; + +const CDK_ERIGON_BIN: &str = "cdk-erigon"; + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + dotenvy::dotenv().ok(); + + let cli = Cli::parse(); + + println!( + "{}", + r#"🐼 + _____ _ _____ _____ _ __ + | __ \ | | / ____| __ \| |/ / + | |__) |__ | |_ _ __ _ ___ _ __ | | | | | | ' / + | ___/ _ \| | | | |/ _` |/ _ \| '_ \ | | | | | | < + | | | (_) | | |_| | (_| | (_) | | | | | |____| |__| | . \ + |_| \___/|_|\__, |\__, |\___/|_| |_| \_____|_____/|_|\_\ + __/ | __/ | + |___/ |___/ +"# + .purple() + ); + + match cli.cmd { + cli::Commands::Node { config, components } => node(config, components)?, + cli::Commands::Erigon { config, chain } => erigon(config, chain).await?, + cli::Commands::Versions {} => versions::versions(), + } + + Ok(()) +} + +// read_config reads the configuration file and returns the configuration. +fn read_config(config_path: PathBuf) -> anyhow::Result { + let config = std::fs::read_to_string(config_path) + .map_err(|e| anyhow::anyhow!("Failed to read configuration file: {}", e))?; + let config: Config = toml::from_str(&config)?; + + Ok(config) +} + +/// This is the main node entrypoint. +/// +/// This function starts everything needed to run an Agglayer node. +/// Starting by a Tokio runtime which can be used by the different components. +/// The configuration file is parsed and used to configure the node. +/// +/// This function returns on fatal error or after graceful shutdown has +/// completed. +pub fn node(config_path: PathBuf, components: Option) -> anyhow::Result<()> { + // Read the config + let config = read_config(config_path.clone())?; + + // Initialize the logger + logging::tracing(&config.log); + + // This is to find the binary when running in development mode + // otherwise it will use system path + let bin_path = helpers::get_bin_path(); + + let components_param = match components { + Some(components) => format!("-components={}", components), + None => "".to_string(), + }; + + // Run the node passing the config file path as argument + let mut command = Command::new(bin_path.clone()); + command.args(&[ + "run", + "-cfg", + config_path.canonicalize()?.to_str().unwrap(), + components_param.as_str(), + ]); + + let output_result = command.execute_output(); + let output = match output_result { + Ok(output) => output, + Err(e) => { + eprintln!( + "Failed to execute command, trying to find executable in path: {}", + bin_path + ); + return Err(e.into()); + } + }; + + if let Some(exit_code) = output.status.code() { + if exit_code == 0 { + println!("Ok."); + } else { + eprintln!("Failed."); + } + } else { + eprintln!("Interrupted!"); + } + + Ok(()) +} + +/// This is the main erigon entrypoint. +/// This function starts everything needed to run an Erigon node. +pub async fn erigon(config_path: PathBuf, genesis_file: PathBuf) -> anyhow::Result<()> { + // Read the config + let config = read_config(config_path.clone())?; + + // Initialize the logger + logging::tracing(&config.log); + + // Render configuration files + let chain_id = config.aggregator.chain_id.clone(); + let rpc_url = Url::parse(&config.sequence_sender.rpc_url).unwrap(); + let timestamp = get_timestamp(rpc_url).await.unwrap(); + let erigon_config_path = config_render::render(&config, genesis_file, timestamp)?; + + println!("Starting erigon with config: {:?}", erigon_config_path); + + // Run cdk-erigon in system path + let output = Command::new(CDK_ERIGON_BIN) + .args(&[ + "--config", + erigon_config_path + .path() + .join(format!("dynamic-{}.yaml", chain_id)) + .to_str() + .unwrap(), + ]) + .execute_output() + .unwrap(); + + if let Some(exit_code) = output.status.code() { + if exit_code != 0 { + eprintln!( + "Failed. Leaving configuration files in: {:?}", + erigon_config_path + ); + std::process::exit(1); + } + } else { + eprintln!("Interrupted!"); + } + + Ok(()) +} + +/// Call the rpc server to retrieve the first batch timestamp +async fn get_timestamp(url: Url) -> Result { + // Instantiate a new client over a transport. + let client: ReqwestClient = ClientBuilder::default().http(url); + + // Prepare a request to the server. + let request = client.request("zkevm_getBatchByNumber", vec!["0"]); + + // Poll the request to completion. + let batch_json: Batch = request.await.unwrap(); + + // Parse the timestamp hex string into u64. + let ts = u64::from_str_radix(batch_json.timestamp.trim_start_matches("0x"), 16)?; + + Ok(ts) +} + +#[derive(serde::Deserialize, Debug, Clone)] +struct Batch { + timestamp: String, +} diff --git a/crates/aggkit/src/versions.rs b/crates/aggkit/src/versions.rs new file mode 100644 index 00000000..8ddca296 --- /dev/null +++ b/crates/aggkit/src/versions.rs @@ -0,0 +1,39 @@ +use colored::*; +use execute::Execute; +use std::io; +use std::process::{Command, Output}; + +fn version() -> Result { + let bin_path = crate::helpers::get_bin_path(); + + // Run the node passing the config file path as argument + let mut command = Command::new(bin_path.clone()); + command.args(&["version"]); + + command.execute_output() +} + +pub(crate) fn versions() { + // Load the versions from the versions.json file in the crate directory + // and parse it using serde_json. + let versions = include_str!("../versions.json"); + let versions_json: serde_json::Value = serde_json::from_str(versions).unwrap(); + + // Convert the JSON object to a HashMap. + let versions_map = versions_json.as_object().unwrap(); + + // Get the version of the aggkit binary. + let output = version().unwrap(); + let version = String::from_utf8(output.stdout).unwrap(); + + println!("{}", format!("{}", version.trim()).green()); + + // Multi-line string to print the versions with colors. + let formatted_versions: Vec = versions_map + .iter() + .map(|(key, value)| format!("{}: {}", key.green(), value.to_string().blue())) + .collect(); + + println!("{}", "Supported up to fork12".yellow()); + println!("{}", formatted_versions.join("\n")); +} diff --git a/crates/aggkit/versions.json b/crates/aggkit/versions.json new file mode 100644 index 00000000..fe782279 --- /dev/null +++ b/crates/aggkit/versions.json @@ -0,0 +1,15 @@ +{ + "agglayer_image": "ghcr.io/agglayer/agglayer:0.2.0-rc.17", + "cdk_erigon_node_image": "hermeznetwork/cdk-erigon:v2.60.0", + "cdk_node_image": "ghcr.io/0xpolygon/cdk:0.5.0-beta10", + "cdk_validium_node_image": "0xpolygon/cdk-validium-node:0.7.0-cdk", + "zkevm_bridge_proxy_image": "haproxy:3.1-bookworm", + "zkevm_bridge_service_image": "hermeznetwork/zkevm-bridge-service:v0.6.0-RC3", + "zkevm_bridge_ui_image": "leovct/zkevm-bridge-ui:multi-network", + "zkevm_contracts_image": "leovct/zkevm-contracts:v8.0.0-fork.12-patch.1", + "zkevm_da_image": "0xpolygon/cdk-data-availability:0.0.11", + "zkevm_node_image": "hermeznetwork/zkevm-node:v0.7.3", + "zkevm_pool_manager_image": "hermeznetwork/zkevm-pool-manager:v0.1.2", + "zkevm_prover_image": "hermeznetwork/zkevm-prover:v8.0.0-RC14-fork.12", + "zkevm_sequence_sender_image": "hermeznetwork/zkevm-sequence-sender:v0.2.4" +} diff --git a/dataavailability/config.go b/dataavailability/config.go new file mode 100644 index 00000000..8163e7bc --- /dev/null +++ b/dataavailability/config.go @@ -0,0 +1,9 @@ +package dataavailability + +// DABackendType is the data availability protocol for the CDK +type DABackendType string + +const ( + // DataAvailabilityCommittee is the DAC protocol backend + DataAvailabilityCommittee DABackendType = "DataAvailabilityCommittee" +) diff --git a/dataavailability/dataavailability.go b/dataavailability/dataavailability.go new file mode 100644 index 00000000..39a27468 --- /dev/null +++ b/dataavailability/dataavailability.go @@ -0,0 +1,33 @@ +package dataavailability + +import ( + "context" + + "github.com/agglayer/aggkit/etherman" +) + +// DataAvailability implements an abstract data availability integration +type DataAvailability struct { + backend DABackender +} + +// New creates a DataAvailability instance +func New(backend DABackender) (*DataAvailability, error) { + da := &DataAvailability{ + backend: backend, + } + + return da, da.backend.Init() +} + +// PostSequenceBanana sends sequence data to the backend and returns a response. +func (d *DataAvailability) PostSequenceBanana( + ctx context.Context, sequenceBanana etherman.SequenceBanana, +) ([]byte, error) { + return d.backend.PostSequenceBanana(ctx, sequenceBanana) +} + +// PostSequenceElderberry sends batch data to the backend and returns a response. +func (d *DataAvailability) PostSequenceElderberry(ctx context.Context, batchesData [][]byte) ([]byte, error) { + return d.backend.PostSequenceElderberry(ctx, batchesData) +} diff --git a/dataavailability/datacommittee/datacommittee.go b/dataavailability/datacommittee/datacommittee.go new file mode 100644 index 00000000..be811a13 --- /dev/null +++ b/dataavailability/datacommittee/datacommittee.go @@ -0,0 +1,401 @@ +package datacommittee + +import ( + "crypto/ecdsa" + "crypto/rand" + "errors" + "fmt" + "math/big" + "sort" + "strings" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygondatacommittee" + "github.com/0xPolygon/cdk-data-availability/client" + daTypes "github.com/0xPolygon/cdk-data-availability/types" + "github.com/0xPolygonHermez/zkevm-synchronizer-l1/translator" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "golang.org/x/net/context" +) + +const ( + unexpectedHashTemplate = "missmatch on transaction data. Expected hash %s, actual hash: %s" + translateContextName = "dataCommittee" +) + +// DataCommitteeMember represents a member of the Data Committee +type DataCommitteeMember struct { + Addr common.Address + URL string +} + +// DataCommittee represents a specific committee +type DataCommittee struct { + AddressesHash common.Hash + Members []DataCommitteeMember + RequiredSignatures uint64 +} + +// Backend implements the DAC integration +type Backend struct { + logger *log.Logger + dataCommitteeContract *polygondatacommittee.Polygondatacommittee + privKey *ecdsa.PrivateKey + dataCommitteeClientFactory client.Factory + + committeeMembers []DataCommitteeMember + selectedCommitteeMember int + ctx context.Context + Translator translator.Translator +} + +// New creates an instance of Backend +func New( + logger *log.Logger, + l1RPCURL string, + dataCommitteeAddr common.Address, + privKey *ecdsa.PrivateKey, + dataCommitteeClientFactory client.Factory, + translator translator.Translator, +) (*Backend, error) { + ethClient, err := ethclient.Dial(l1RPCURL) + if err != nil { + logger.Errorf("error connecting to %s: %+v", l1RPCURL, err) + return nil, err + } + + dataCommittee, err := polygondatacommittee.NewPolygondatacommittee(dataCommitteeAddr, ethClient) + if err != nil { + return nil, err + } + + return &Backend{ + logger: logger, + dataCommitteeContract: dataCommittee, + privKey: privKey, + dataCommitteeClientFactory: dataCommitteeClientFactory, + ctx: context.Background(), + Translator: translator, + }, nil +} + +// Init loads the DAC to be cached when needed +func (d *Backend) Init() error { + committee, err := d.getCurrentDataCommittee() + if err != nil { + return err + } + selectedCommitteeMember := -1 + if committee != nil { + d.committeeMembers = committee.Members + if len(committee.Members) > 0 { + nBig, err := rand.Int(rand.Reader, big.NewInt(int64(len(committee.Members)))) + if err != nil { + return err + } + selectedCommitteeMember = int(nBig.Int64()) + } + } + d.selectedCommitteeMember = selectedCommitteeMember + + return nil +} + +// GetSequence retrieves backend data by querying committee members for each hash concurrently. +func (d *Backend) GetSequence(_ context.Context, hashes []common.Hash, _ []byte) ([][]byte, error) { + initialMember := d.selectedCommitteeMember + + var batchData [][]byte + for retries := 0; retries < len(d.committeeMembers); retries++ { + member := d.committeeMembers[d.selectedCommitteeMember] + d.logger.Infof("trying to get data from %s at %s", member.Addr.Hex(), member.URL) + + c := d.dataCommitteeClientFactory.New(member.URL) + dataMap, err := c.ListOffChainData(d.ctx, hashes) + if err != nil { + d.logger.Warnf("error getting data from DAC node %s at %s: %s", member.Addr.Hex(), member.URL, err) + d.selectedCommitteeMember = (d.selectedCommitteeMember + 1) % len(d.committeeMembers) + if d.selectedCommitteeMember == initialMember { + break + } + continue + } + + batchData = make([][]byte, 0, len(hashes)) + for _, hash := range hashes { + actualTransactionsHash := crypto.Keccak256Hash(dataMap[hash]) + if actualTransactionsHash != hash { + unexpectedHash := fmt.Errorf(unexpectedHashTemplate, hash, actualTransactionsHash) + d.logger.Warnf("error getting data from DAC node %s at %s: %s", member.Addr.Hex(), member.URL, unexpectedHash) + d.selectedCommitteeMember = (d.selectedCommitteeMember + 1) % len(d.committeeMembers) + if d.selectedCommitteeMember == initialMember { + break + } + continue + } + batchData = append(batchData, dataMap[hash]) + } + return batchData, nil + } + + if err := d.Init(); err != nil { + return nil, fmt.Errorf("error loading data committee: %w", err) + } + + return nil, fmt.Errorf("couldn't get the data from any committee member") +} + +type signatureMsg struct { + addr common.Address + signature []byte + err error +} + +// PostSequenceElderberry submits batches and collects signatures from committee members. +func (d *Backend) PostSequenceElderberry(ctx context.Context, batchesData [][]byte) ([]byte, error) { + // Get current committee + committee, err := d.getCurrentDataCommittee() + if err != nil { + return nil, err + } + + // Authenticate as trusted sequencer by signing the sequence + sequence := make(daTypes.Sequence, 0, len(batchesData)) + for _, batchData := range batchesData { + sequence = append(sequence, batchData) + } + signedSequence, err := sequence.Sign(d.privKey) + if err != nil { + return nil, err + } + + // Request signatures to all members in parallel + ch := make(chan signatureMsg, len(committee.Members)) + signatureCtx, cancelSignatureCollection := context.WithCancel(ctx) + for _, member := range committee.Members { + signedSequenceElderberry := daTypes.SignedSequence{ + Sequence: sequence, + Signature: signedSequence, + } + go d.requestSignatureFromMember(signatureCtx, &signedSequenceElderberry, + func(c client.Client) ([]byte, error) { return c.SignSequence(ctx, signedSequenceElderberry) }, member, ch) + } + return d.collectSignatures(committee, ch, cancelSignatureCollection) +} + +// PostSequenceBanana submits a sequence to the data committee and collects the signed response from them. +func (d *Backend) PostSequenceBanana(ctx context.Context, sequence etherman.SequenceBanana) ([]byte, error) { + // Get current committee + committee, err := d.getCurrentDataCommittee() + if err != nil { + return nil, err + } + + sequenceBatches := make([]daTypes.Batch, 0, len(sequence.Batches)) + for _, batch := range sequence.Batches { + sequenceBatches = append(sequenceBatches, daTypes.Batch{ + L2Data: batch.L2Data, + Coinbase: batch.LastCoinbase, + ForcedBlockHashL1: batch.ForcedBlockHashL1, + ForcedGER: batch.ForcedGlobalExitRoot, + ForcedTimestamp: daTypes.ArgUint64(batch.ForcedBatchTimestamp), + }) + } + + sequenceBanana := daTypes.SequenceBanana{ + Batches: sequenceBatches, + OldAccInputHash: sequence.OldAccInputHash, + L1InfoRoot: sequence.L1InfoRoot, + MaxSequenceTimestamp: daTypes.ArgUint64(sequence.MaxSequenceTimestamp), + } + hashToSign := common.BytesToHash(sequenceBanana.HashToSign()) + if hashToSign != sequence.AccInputHash { + return nil, fmt.Errorf( + "calculated accInputHash diverges: DA = %s vs Seq = %s", + hashToSign, sequence.AccInputHash, + ) + } + + signature, err := sequenceBanana.Sign(d.privKey) + if err != nil { + return nil, err + } + + // Request signatures to all members in parallel + ch := make(chan signatureMsg, len(committee.Members)) + signatureCtx, cancelSignatureCollection := context.WithCancel(ctx) + for _, member := range committee.Members { + signedSequenceBanana := daTypes.SignedSequenceBanana{ + Sequence: sequenceBanana, + Signature: signature, + } + go d.requestSignatureFromMember(signatureCtx, + &signedSequenceBanana, + func(c client.Client) ([]byte, error) { return c.SignSequenceBanana(ctx, signedSequenceBanana) }, + member, ch) + } + + return d.collectSignatures(committee, ch, cancelSignatureCollection) +} + +func (d *Backend) collectSignatures( + committee *DataCommittee, ch chan signatureMsg, cancelSignatureCollection context.CancelFunc) ([]byte, error) { + // Collect signatures + // Stop requesting as soon as we have N valid signatures + var ( + msgs = make(signatureMsgs, 0, len(committee.Members)) + collectedSignatures uint64 + failedToCollect uint64 + ) + for collectedSignatures < committee.RequiredSignatures { + msg := <-ch + if msg.err != nil { + d.logger.Errorf("error when trying to get signature from %s: %s", msg.addr, msg.err) + failedToCollect++ + if len(committee.Members)-int(failedToCollect) < int(committee.RequiredSignatures) { + cancelSignatureCollection() + + return nil, errors.New("too many members failed to send their signature") + } + } else { + d.logger.Infof("received signature from %s", msg.addr) + collectedSignatures++ + } + msgs = append(msgs, msg) + } + + cancelSignatureCollection() + + return d.buildSignaturesAndAddrs(msgs, committee.Members), nil +} + +type funcSignType func(c client.Client) ([]byte, error) + +// funcSetSignatureType: is not possible to define a SetSignature function because +// the type daTypes.SequenceBanana and daTypes.Sequence belong to different packages +// So a future refactor is define a common interface for both +func (d *Backend) requestSignatureFromMember(ctx context.Context, signedSequence daTypes.SignedSequenceInterface, + funcSign funcSignType, + member DataCommitteeMember, ch chan signatureMsg) { + select { + case <-ctx.Done(): + return + default: + } + + // request + c := client.New(member.URL) + d.logger.Infof("sending request to sign the sequence to %s at %s", member.Addr.Hex(), member.URL) + // funcSign must call something like that c.SignSequenceBanana(ctx, signedSequence) + signature, err := funcSign(c) + + if err != nil { + ch <- signatureMsg{ + addr: member.Addr, + err: err, + } + + return + } + // verify returned signature + signedSequence.SetSignature(signature) + signer, err := signedSequence.Signer() + if err != nil { + ch <- signatureMsg{ + addr: member.Addr, + err: err, + } + + return + } + if signer != member.Addr { + ch <- signatureMsg{ + addr: member.Addr, + err: fmt.Errorf("invalid signer. Expected %s, actual %s", member.Addr.Hex(), signer.Hex()), + } + + return + } + ch <- signatureMsg{ + addr: member.Addr, + signature: signature, + } +} + +func (d *Backend) buildSignaturesAndAddrs(sigs signatureMsgs, members []DataCommitteeMember) []byte { + const ( + sigLen = 65 + ) + res := make([]byte, 0, len(sigs)*sigLen+len(members)*common.AddressLength) + sort.Sort(sigs) + for _, msg := range sigs { + d.logger.Debugf("adding signature %s from %s", common.Bytes2Hex(msg.signature), msg.addr.Hex()) + res = append(res, msg.signature...) + } + for _, member := range members { + d.logger.Debugf("adding addr %s", common.Bytes2Hex(member.Addr.Bytes())) + res = append(res, member.Addr.Bytes()...) + } + d.logger.Debugf("full res %s", common.Bytes2Hex(res)) + return res +} + +type signatureMsgs []signatureMsg + +func (s signatureMsgs) Len() int { return len(s) } +func (s signatureMsgs) Less(i, j int) bool { + return strings.ToUpper(s[i].addr.Hex()) < strings.ToUpper(s[j].addr.Hex()) +} +func (s signatureMsgs) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// getCurrentDataCommittee return the currently registered data committee +func (d *Backend) getCurrentDataCommittee() (*DataCommittee, error) { + addrsHash, err := d.dataCommitteeContract.CommitteeHash(&bind.CallOpts{Pending: false}) + if err != nil { + return nil, fmt.Errorf("error getting CommitteeHash from L1 SC: %w", err) + } + + reqSign, err := d.dataCommitteeContract.RequiredAmountOfSignatures(&bind.CallOpts{Pending: false}) + if err != nil { + return nil, fmt.Errorf("error getting RequiredAmountOfSignatures from L1 SC: %w", err) + } + + members, err := d.getCurrentDataCommitteeMembers() + if err != nil { + return nil, err + } + + return &DataCommittee{ + AddressesHash: addrsHash, + RequiredSignatures: reqSign.Uint64(), + Members: members, + }, nil +} + +// getCurrentDataCommitteeMembers return the currently registered data committee members +func (d *Backend) getCurrentDataCommitteeMembers() ([]DataCommitteeMember, error) { + nMembers, err := d.dataCommitteeContract.GetAmountOfMembers(&bind.CallOpts{Pending: false}) + if err != nil { + return nil, fmt.Errorf("error getting GetAmountOfMembers from L1 SC: %w", err) + } + members := make([]DataCommitteeMember, 0, nMembers.Int64()) + for i := int64(0); i < nMembers.Int64(); i++ { + member, err := d.dataCommitteeContract.Members(&bind.CallOpts{Pending: false}, big.NewInt(i)) + if err != nil { + return nil, fmt.Errorf("error getting Members %d from L1 SC: %w", i, err) + } + if d.Translator != nil { + member.Url = d.Translator.Translate(translateContextName, member.Url) + } + members = append(members, DataCommitteeMember{ + Addr: member.Addr, + URL: member.Url, + }) + } + + return members, nil +} diff --git a/dataavailability/datacommittee/datacommittee_test.go b/dataavailability/datacommittee/datacommittee_test.go new file mode 100644 index 00000000..8931e6e8 --- /dev/null +++ b/dataavailability/datacommittee/datacommittee_test.go @@ -0,0 +1,142 @@ +package datacommittee + +import ( + "errors" + "math/big" + "testing" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygondatacommittee" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/test/contracts/erc1967proxy" + "github.com/agglayer/aggkit/test/helpers" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestUpdateDataCommitteeEvent(t *testing.T) { + // Set up testing environment + dac, ethBackend, da, auth := newSimulatedDACBackend(t) + + // Update the committee + requiredAmountOfSignatures := big.NewInt(2) + URLs := []string{"1", "2", "3"} + addrs := []common.Address{ + common.HexToAddress("0x1"), + common.HexToAddress("0x2"), + common.HexToAddress("0x3"), + } + addrsBytes := []byte{} + for _, addr := range addrs { + addrsBytes = append(addrsBytes, addr.Bytes()...) + } + _, err := da.SetupCommittee(auth, requiredAmountOfSignatures, URLs, addrsBytes) + require.NoError(t, err) + ethBackend.Commit() + + // Assert the committee update + actualSetup, err := dac.getCurrentDataCommittee() + require.NoError(t, err) + expectedMembers := []DataCommitteeMember{} + expectedSetup := DataCommittee{ + RequiredSignatures: uint64(len(URLs) - 1), + AddressesHash: crypto.Keccak256Hash(addrsBytes), + } + for i, url := range URLs { + expectedMembers = append(expectedMembers, DataCommitteeMember{ + URL: url, + Addr: addrs[i], + }) + } + expectedSetup.Members = expectedMembers + assert.Equal(t, expectedSetup, *actualSetup) +} + +func init() { + log.Init(log.Config{ + Level: "debug", + Outputs: []string{"stderr"}, + }) +} + +// NewSimulatedEtherman creates an etherman that uses a simulated blockchain. It's important to notice that the ChainID of the auth +// must be 1337. The address that holds the auth will have an initial balance of 10 ETH +func newSimulatedDACBackend(t *testing.T) ( + *Backend, + *simulated.Backend, + *polygondatacommittee.Polygondatacommittee, + *bind.TransactOpts, +) { + t.Helper() + + deployerAuth, err := helpers.CreateAccount(big.NewInt(1337)) + require.NoError(t, err) + + ethBackend, setup := helpers.NewSimulatedBackend(t, nil, deployerAuth) + + // DAC Setup + addr, _, _, err := polygondatacommittee.DeployPolygondatacommittee(setup.UserAuth, ethBackend.Client()) + require.NoError(t, err) + ethBackend.Commit() + + proxyAddr, err := deployDACProxy(setup.UserAuth, ethBackend.Client(), addr) + require.NoError(t, err) + ethBackend.Commit() + + da, err := polygondatacommittee.NewPolygondatacommittee(proxyAddr, ethBackend.Client()) + require.NoError(t, err) + + _, err = da.SetupCommittee(setup.UserAuth, big.NewInt(0), []string{}, []byte{}) + require.NoError(t, err) + ethBackend.Commit() + + c := &Backend{ + dataCommitteeContract: da, + } + + return c, ethBackend, da, setup.UserAuth +} + +func deployDACProxy(auth *bind.TransactOpts, client bind.ContractBackend, dacImpl common.Address) (common.Address, error) { + // Deploy proxy + dacABI, err := polygondatacommittee.PolygondatacommitteeMetaData.GetAbi() + if err != nil { + return common.Address{}, err + } + if dacABI == nil { + return common.Address{}, errors.New("GetABI returned nil") + } + initializeCallData, err := dacABI.Pack("initialize") + if err != nil { + return common.Address{}, err + } + proxyAddr, err := deployProxy( + auth, + client, + dacImpl, + initializeCallData, + ) + if err != nil { + return common.Address{}, err + } + log.Debugf("DAC proxy deployed at", proxyAddr) + + return proxyAddr, nil +} + +func deployProxy(auth *bind.TransactOpts, + client bind.ContractBackend, + implementationAddr common.Address, + initializeParams []byte) (common.Address, error) { + addr, _, _, err := erc1967proxy.DeployErc1967proxy( + auth, + client, + implementationAddr, + initializeParams, + ) + + return addr, err +} diff --git a/dataavailability/interfaces.go b/dataavailability/interfaces.go new file mode 100644 index 00000000..6ca62bab --- /dev/null +++ b/dataavailability/interfaces.go @@ -0,0 +1,54 @@ +package dataavailability + +import ( + "context" + + "github.com/agglayer/aggkit/etherman" + "github.com/ethereum/go-ethereum/common" +) + +// DABackender is an interface for components that store and retrieve batch data +type DABackender interface { + SequenceRetriever + SequenceSender + // Init initializes the DABackend + Init() error +} + +// SequenceSender is used to send provided sequence of batches +type SequenceSender interface { + SequenceSenderElderberry + SequenceSenderBanana +} + +// SequenceSenderElderberry defines methods for sending sequence data to the data availability backend. +type SequenceSenderElderberry interface { + // PostSequence sends the sequence data to the data availability backend, and returns the dataAvailabilityMessage + // as expected by the contract + PostSequenceElderberry(ctx context.Context, batchesData [][]byte) ([]byte, error) +} + +// SequenceSenderBanana defines methods for sending sequence data to the data availability backend. +type SequenceSenderBanana interface { + // PostSequence sends the sequence data to the data availability backend, and returns the dataAvailabilityMessage + // as expected by the contract + PostSequenceBanana(ctx context.Context, sequence etherman.SequenceBanana) ([]byte, error) +} + +// SequenceRetriever is used to retrieve batch data +type SequenceRetriever interface { + // GetSequence retrieves the sequence data from the data availability backend + GetSequence(ctx context.Context, batchHashes []common.Hash, dataAvailabilityMessage []byte) ([][]byte, error) +} + +// BatchDataProvider is used to retrieve batch data +type BatchDataProvider interface { + // GetBatchL2Data retrieve the data of a batch from the DA backend. The returned data must be the pre-image of the hash + GetBatchL2Data(batchNum []uint64, batchHashes []common.Hash, dataAvailabilityMessage []byte) ([][]byte, error) +} + +// DataManager is an interface for components that send and retrieve batch data +type DataManager interface { + BatchDataProvider + SequenceSender +} diff --git a/dataavailability/mocks_da/batch_data_provider.go b/dataavailability/mocks_da/batch_data_provider.go new file mode 100644 index 00000000..36e782ac --- /dev/null +++ b/dataavailability/mocks_da/batch_data_provider.go @@ -0,0 +1,96 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_da + +import ( + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" +) + +// BatchDataProvider is an autogenerated mock type for the BatchDataProvider type +type BatchDataProvider struct { + mock.Mock +} + +type BatchDataProvider_Expecter struct { + mock *mock.Mock +} + +func (_m *BatchDataProvider) EXPECT() *BatchDataProvider_Expecter { + return &BatchDataProvider_Expecter{mock: &_m.Mock} +} + +// GetBatchL2Data provides a mock function with given fields: batchNum, batchHashes, dataAvailabilityMessage +func (_m *BatchDataProvider) GetBatchL2Data(batchNum []uint64, batchHashes []common.Hash, dataAvailabilityMessage []byte) ([][]byte, error) { + ret := _m.Called(batchNum, batchHashes, dataAvailabilityMessage) + + if len(ret) == 0 { + panic("no return value specified for GetBatchL2Data") + } + + var r0 [][]byte + var r1 error + if rf, ok := ret.Get(0).(func([]uint64, []common.Hash, []byte) ([][]byte, error)); ok { + return rf(batchNum, batchHashes, dataAvailabilityMessage) + } + if rf, ok := ret.Get(0).(func([]uint64, []common.Hash, []byte) [][]byte); ok { + r0 = rf(batchNum, batchHashes, dataAvailabilityMessage) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([][]byte) + } + } + + if rf, ok := ret.Get(1).(func([]uint64, []common.Hash, []byte) error); ok { + r1 = rf(batchNum, batchHashes, dataAvailabilityMessage) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BatchDataProvider_GetBatchL2Data_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBatchL2Data' +type BatchDataProvider_GetBatchL2Data_Call struct { + *mock.Call +} + +// GetBatchL2Data is a helper method to define mock.On call +// - batchNum []uint64 +// - batchHashes []common.Hash +// - dataAvailabilityMessage []byte +func (_e *BatchDataProvider_Expecter) GetBatchL2Data(batchNum interface{}, batchHashes interface{}, dataAvailabilityMessage interface{}) *BatchDataProvider_GetBatchL2Data_Call { + return &BatchDataProvider_GetBatchL2Data_Call{Call: _e.mock.On("GetBatchL2Data", batchNum, batchHashes, dataAvailabilityMessage)} +} + +func (_c *BatchDataProvider_GetBatchL2Data_Call) Run(run func(batchNum []uint64, batchHashes []common.Hash, dataAvailabilityMessage []byte)) *BatchDataProvider_GetBatchL2Data_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]uint64), args[1].([]common.Hash), args[2].([]byte)) + }) + return _c +} + +func (_c *BatchDataProvider_GetBatchL2Data_Call) Return(_a0 [][]byte, _a1 error) *BatchDataProvider_GetBatchL2Data_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *BatchDataProvider_GetBatchL2Data_Call) RunAndReturn(run func([]uint64, []common.Hash, []byte) ([][]byte, error)) *BatchDataProvider_GetBatchL2Data_Call { + _c.Call.Return(run) + return _c +} + +// NewBatchDataProvider creates a new instance of BatchDataProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewBatchDataProvider(t interface { + mock.TestingT + Cleanup(func()) +}) *BatchDataProvider { + mock := &BatchDataProvider{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/dataavailability/mocks_da/da_backender.go b/dataavailability/mocks_da/da_backender.go new file mode 100644 index 00000000..d12e6b35 --- /dev/null +++ b/dataavailability/mocks_da/da_backender.go @@ -0,0 +1,263 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_da + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + etherman "github.com/agglayer/aggkit/etherman" + + mock "github.com/stretchr/testify/mock" +) + +// DABackender is an autogenerated mock type for the DABackender type +type DABackender struct { + mock.Mock +} + +type DABackender_Expecter struct { + mock *mock.Mock +} + +func (_m *DABackender) EXPECT() *DABackender_Expecter { + return &DABackender_Expecter{mock: &_m.Mock} +} + +// GetSequence provides a mock function with given fields: ctx, batchHashes, dataAvailabilityMessage +func (_m *DABackender) GetSequence(ctx context.Context, batchHashes []common.Hash, dataAvailabilityMessage []byte) ([][]byte, error) { + ret := _m.Called(ctx, batchHashes, dataAvailabilityMessage) + + if len(ret) == 0 { + panic("no return value specified for GetSequence") + } + + var r0 [][]byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []common.Hash, []byte) ([][]byte, error)); ok { + return rf(ctx, batchHashes, dataAvailabilityMessage) + } + if rf, ok := ret.Get(0).(func(context.Context, []common.Hash, []byte) [][]byte); ok { + r0 = rf(ctx, batchHashes, dataAvailabilityMessage) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([][]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []common.Hash, []byte) error); ok { + r1 = rf(ctx, batchHashes, dataAvailabilityMessage) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DABackender_GetSequence_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSequence' +type DABackender_GetSequence_Call struct { + *mock.Call +} + +// GetSequence is a helper method to define mock.On call +// - ctx context.Context +// - batchHashes []common.Hash +// - dataAvailabilityMessage []byte +func (_e *DABackender_Expecter) GetSequence(ctx interface{}, batchHashes interface{}, dataAvailabilityMessage interface{}) *DABackender_GetSequence_Call { + return &DABackender_GetSequence_Call{Call: _e.mock.On("GetSequence", ctx, batchHashes, dataAvailabilityMessage)} +} + +func (_c *DABackender_GetSequence_Call) Run(run func(ctx context.Context, batchHashes []common.Hash, dataAvailabilityMessage []byte)) *DABackender_GetSequence_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]common.Hash), args[2].([]byte)) + }) + return _c +} + +func (_c *DABackender_GetSequence_Call) Return(_a0 [][]byte, _a1 error) *DABackender_GetSequence_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *DABackender_GetSequence_Call) RunAndReturn(run func(context.Context, []common.Hash, []byte) ([][]byte, error)) *DABackender_GetSequence_Call { + _c.Call.Return(run) + return _c +} + +// Init provides a mock function with no fields +func (_m *DABackender) Init() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Init") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// DABackender_Init_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Init' +type DABackender_Init_Call struct { + *mock.Call +} + +// Init is a helper method to define mock.On call +func (_e *DABackender_Expecter) Init() *DABackender_Init_Call { + return &DABackender_Init_Call{Call: _e.mock.On("Init")} +} + +func (_c *DABackender_Init_Call) Run(run func()) *DABackender_Init_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *DABackender_Init_Call) Return(_a0 error) *DABackender_Init_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *DABackender_Init_Call) RunAndReturn(run func() error) *DABackender_Init_Call { + _c.Call.Return(run) + return _c +} + +// PostSequenceBanana provides a mock function with given fields: ctx, sequence +func (_m *DABackender) PostSequenceBanana(ctx context.Context, sequence etherman.SequenceBanana) ([]byte, error) { + ret := _m.Called(ctx, sequence) + + if len(ret) == 0 { + panic("no return value specified for PostSequenceBanana") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, etherman.SequenceBanana) ([]byte, error)); ok { + return rf(ctx, sequence) + } + if rf, ok := ret.Get(0).(func(context.Context, etherman.SequenceBanana) []byte); ok { + r0 = rf(ctx, sequence) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, etherman.SequenceBanana) error); ok { + r1 = rf(ctx, sequence) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DABackender_PostSequenceBanana_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PostSequenceBanana' +type DABackender_PostSequenceBanana_Call struct { + *mock.Call +} + +// PostSequenceBanana is a helper method to define mock.On call +// - ctx context.Context +// - sequence etherman.SequenceBanana +func (_e *DABackender_Expecter) PostSequenceBanana(ctx interface{}, sequence interface{}) *DABackender_PostSequenceBanana_Call { + return &DABackender_PostSequenceBanana_Call{Call: _e.mock.On("PostSequenceBanana", ctx, sequence)} +} + +func (_c *DABackender_PostSequenceBanana_Call) Run(run func(ctx context.Context, sequence etherman.SequenceBanana)) *DABackender_PostSequenceBanana_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(etherman.SequenceBanana)) + }) + return _c +} + +func (_c *DABackender_PostSequenceBanana_Call) Return(_a0 []byte, _a1 error) *DABackender_PostSequenceBanana_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *DABackender_PostSequenceBanana_Call) RunAndReturn(run func(context.Context, etherman.SequenceBanana) ([]byte, error)) *DABackender_PostSequenceBanana_Call { + _c.Call.Return(run) + return _c +} + +// PostSequenceElderberry provides a mock function with given fields: ctx, batchesData +func (_m *DABackender) PostSequenceElderberry(ctx context.Context, batchesData [][]byte) ([]byte, error) { + ret := _m.Called(ctx, batchesData) + + if len(ret) == 0 { + panic("no return value specified for PostSequenceElderberry") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, [][]byte) ([]byte, error)); ok { + return rf(ctx, batchesData) + } + if rf, ok := ret.Get(0).(func(context.Context, [][]byte) []byte); ok { + r0 = rf(ctx, batchesData) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, [][]byte) error); ok { + r1 = rf(ctx, batchesData) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DABackender_PostSequenceElderberry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PostSequenceElderberry' +type DABackender_PostSequenceElderberry_Call struct { + *mock.Call +} + +// PostSequenceElderberry is a helper method to define mock.On call +// - ctx context.Context +// - batchesData [][]byte +func (_e *DABackender_Expecter) PostSequenceElderberry(ctx interface{}, batchesData interface{}) *DABackender_PostSequenceElderberry_Call { + return &DABackender_PostSequenceElderberry_Call{Call: _e.mock.On("PostSequenceElderberry", ctx, batchesData)} +} + +func (_c *DABackender_PostSequenceElderberry_Call) Run(run func(ctx context.Context, batchesData [][]byte)) *DABackender_PostSequenceElderberry_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([][]byte)) + }) + return _c +} + +func (_c *DABackender_PostSequenceElderberry_Call) Return(_a0 []byte, _a1 error) *DABackender_PostSequenceElderberry_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *DABackender_PostSequenceElderberry_Call) RunAndReturn(run func(context.Context, [][]byte) ([]byte, error)) *DABackender_PostSequenceElderberry_Call { + _c.Call.Return(run) + return _c +} + +// NewDABackender creates a new instance of DABackender. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewDABackender(t interface { + mock.TestingT + Cleanup(func()) +}) *DABackender { + mock := &DABackender{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/dataavailability/mocks_da/data_manager.go b/dataavailability/mocks_da/data_manager.go new file mode 100644 index 00000000..f2ac6886 --- /dev/null +++ b/dataavailability/mocks_da/data_manager.go @@ -0,0 +1,218 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_da + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + etherman "github.com/agglayer/aggkit/etherman" + + mock "github.com/stretchr/testify/mock" +) + +// DataManager is an autogenerated mock type for the DataManager type +type DataManager struct { + mock.Mock +} + +type DataManager_Expecter struct { + mock *mock.Mock +} + +func (_m *DataManager) EXPECT() *DataManager_Expecter { + return &DataManager_Expecter{mock: &_m.Mock} +} + +// GetBatchL2Data provides a mock function with given fields: batchNum, batchHashes, dataAvailabilityMessage +func (_m *DataManager) GetBatchL2Data(batchNum []uint64, batchHashes []common.Hash, dataAvailabilityMessage []byte) ([][]byte, error) { + ret := _m.Called(batchNum, batchHashes, dataAvailabilityMessage) + + if len(ret) == 0 { + panic("no return value specified for GetBatchL2Data") + } + + var r0 [][]byte + var r1 error + if rf, ok := ret.Get(0).(func([]uint64, []common.Hash, []byte) ([][]byte, error)); ok { + return rf(batchNum, batchHashes, dataAvailabilityMessage) + } + if rf, ok := ret.Get(0).(func([]uint64, []common.Hash, []byte) [][]byte); ok { + r0 = rf(batchNum, batchHashes, dataAvailabilityMessage) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([][]byte) + } + } + + if rf, ok := ret.Get(1).(func([]uint64, []common.Hash, []byte) error); ok { + r1 = rf(batchNum, batchHashes, dataAvailabilityMessage) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DataManager_GetBatchL2Data_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBatchL2Data' +type DataManager_GetBatchL2Data_Call struct { + *mock.Call +} + +// GetBatchL2Data is a helper method to define mock.On call +// - batchNum []uint64 +// - batchHashes []common.Hash +// - dataAvailabilityMessage []byte +func (_e *DataManager_Expecter) GetBatchL2Data(batchNum interface{}, batchHashes interface{}, dataAvailabilityMessage interface{}) *DataManager_GetBatchL2Data_Call { + return &DataManager_GetBatchL2Data_Call{Call: _e.mock.On("GetBatchL2Data", batchNum, batchHashes, dataAvailabilityMessage)} +} + +func (_c *DataManager_GetBatchL2Data_Call) Run(run func(batchNum []uint64, batchHashes []common.Hash, dataAvailabilityMessage []byte)) *DataManager_GetBatchL2Data_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].([]uint64), args[1].([]common.Hash), args[2].([]byte)) + }) + return _c +} + +func (_c *DataManager_GetBatchL2Data_Call) Return(_a0 [][]byte, _a1 error) *DataManager_GetBatchL2Data_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *DataManager_GetBatchL2Data_Call) RunAndReturn(run func([]uint64, []common.Hash, []byte) ([][]byte, error)) *DataManager_GetBatchL2Data_Call { + _c.Call.Return(run) + return _c +} + +// PostSequenceBanana provides a mock function with given fields: ctx, sequence +func (_m *DataManager) PostSequenceBanana(ctx context.Context, sequence etherman.SequenceBanana) ([]byte, error) { + ret := _m.Called(ctx, sequence) + + if len(ret) == 0 { + panic("no return value specified for PostSequenceBanana") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, etherman.SequenceBanana) ([]byte, error)); ok { + return rf(ctx, sequence) + } + if rf, ok := ret.Get(0).(func(context.Context, etherman.SequenceBanana) []byte); ok { + r0 = rf(ctx, sequence) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, etherman.SequenceBanana) error); ok { + r1 = rf(ctx, sequence) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DataManager_PostSequenceBanana_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PostSequenceBanana' +type DataManager_PostSequenceBanana_Call struct { + *mock.Call +} + +// PostSequenceBanana is a helper method to define mock.On call +// - ctx context.Context +// - sequence etherman.SequenceBanana +func (_e *DataManager_Expecter) PostSequenceBanana(ctx interface{}, sequence interface{}) *DataManager_PostSequenceBanana_Call { + return &DataManager_PostSequenceBanana_Call{Call: _e.mock.On("PostSequenceBanana", ctx, sequence)} +} + +func (_c *DataManager_PostSequenceBanana_Call) Run(run func(ctx context.Context, sequence etherman.SequenceBanana)) *DataManager_PostSequenceBanana_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(etherman.SequenceBanana)) + }) + return _c +} + +func (_c *DataManager_PostSequenceBanana_Call) Return(_a0 []byte, _a1 error) *DataManager_PostSequenceBanana_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *DataManager_PostSequenceBanana_Call) RunAndReturn(run func(context.Context, etherman.SequenceBanana) ([]byte, error)) *DataManager_PostSequenceBanana_Call { + _c.Call.Return(run) + return _c +} + +// PostSequenceElderberry provides a mock function with given fields: ctx, batchesData +func (_m *DataManager) PostSequenceElderberry(ctx context.Context, batchesData [][]byte) ([]byte, error) { + ret := _m.Called(ctx, batchesData) + + if len(ret) == 0 { + panic("no return value specified for PostSequenceElderberry") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, [][]byte) ([]byte, error)); ok { + return rf(ctx, batchesData) + } + if rf, ok := ret.Get(0).(func(context.Context, [][]byte) []byte); ok { + r0 = rf(ctx, batchesData) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, [][]byte) error); ok { + r1 = rf(ctx, batchesData) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// DataManager_PostSequenceElderberry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PostSequenceElderberry' +type DataManager_PostSequenceElderberry_Call struct { + *mock.Call +} + +// PostSequenceElderberry is a helper method to define mock.On call +// - ctx context.Context +// - batchesData [][]byte +func (_e *DataManager_Expecter) PostSequenceElderberry(ctx interface{}, batchesData interface{}) *DataManager_PostSequenceElderberry_Call { + return &DataManager_PostSequenceElderberry_Call{Call: _e.mock.On("PostSequenceElderberry", ctx, batchesData)} +} + +func (_c *DataManager_PostSequenceElderberry_Call) Run(run func(ctx context.Context, batchesData [][]byte)) *DataManager_PostSequenceElderberry_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([][]byte)) + }) + return _c +} + +func (_c *DataManager_PostSequenceElderberry_Call) Return(_a0 []byte, _a1 error) *DataManager_PostSequenceElderberry_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *DataManager_PostSequenceElderberry_Call) RunAndReturn(run func(context.Context, [][]byte) ([]byte, error)) *DataManager_PostSequenceElderberry_Call { + _c.Call.Return(run) + return _c +} + +// NewDataManager creates a new instance of DataManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewDataManager(t interface { + mock.TestingT + Cleanup(func()) +}) *DataManager { + mock := &DataManager{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/dataavailability/mocks_da/func_sign_type.go b/dataavailability/mocks_da/func_sign_type.go new file mode 100644 index 00000000..6a343269 --- /dev/null +++ b/dataavailability/mocks_da/func_sign_type.go @@ -0,0 +1,94 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_da + +import ( + client "github.com/0xPolygon/cdk-data-availability/client" + + mock "github.com/stretchr/testify/mock" +) + +// FuncSignType is an autogenerated mock type for the funcSignType type +type FuncSignType struct { + mock.Mock +} + +type FuncSignType_Expecter struct { + mock *mock.Mock +} + +func (_m *FuncSignType) EXPECT() *FuncSignType_Expecter { + return &FuncSignType_Expecter{mock: &_m.Mock} +} + +// Execute provides a mock function with given fields: c +func (_m *FuncSignType) Execute(c client.Client) ([]byte, error) { + ret := _m.Called(c) + + if len(ret) == 0 { + panic("no return value specified for Execute") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(client.Client) ([]byte, error)); ok { + return rf(c) + } + if rf, ok := ret.Get(0).(func(client.Client) []byte); ok { + r0 = rf(c) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(client.Client) error); ok { + r1 = rf(c) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// FuncSignType_Execute_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Execute' +type FuncSignType_Execute_Call struct { + *mock.Call +} + +// Execute is a helper method to define mock.On call +// - c client.Client +func (_e *FuncSignType_Expecter) Execute(c interface{}) *FuncSignType_Execute_Call { + return &FuncSignType_Execute_Call{Call: _e.mock.On("Execute", c)} +} + +func (_c *FuncSignType_Execute_Call) Run(run func(c client.Client)) *FuncSignType_Execute_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(client.Client)) + }) + return _c +} + +func (_c *FuncSignType_Execute_Call) Return(_a0 []byte, _a1 error) *FuncSignType_Execute_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *FuncSignType_Execute_Call) RunAndReturn(run func(client.Client) ([]byte, error)) *FuncSignType_Execute_Call { + _c.Call.Return(run) + return _c +} + +// NewFuncSignType creates a new instance of FuncSignType. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewFuncSignType(t interface { + mock.TestingT + Cleanup(func()) +}) *FuncSignType { + mock := &FuncSignType{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/dataavailability/mocks_da/sequence_retriever.go b/dataavailability/mocks_da/sequence_retriever.go new file mode 100644 index 00000000..f82d9a70 --- /dev/null +++ b/dataavailability/mocks_da/sequence_retriever.go @@ -0,0 +1,98 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_da + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" +) + +// SequenceRetriever is an autogenerated mock type for the SequenceRetriever type +type SequenceRetriever struct { + mock.Mock +} + +type SequenceRetriever_Expecter struct { + mock *mock.Mock +} + +func (_m *SequenceRetriever) EXPECT() *SequenceRetriever_Expecter { + return &SequenceRetriever_Expecter{mock: &_m.Mock} +} + +// GetSequence provides a mock function with given fields: ctx, batchHashes, dataAvailabilityMessage +func (_m *SequenceRetriever) GetSequence(ctx context.Context, batchHashes []common.Hash, dataAvailabilityMessage []byte) ([][]byte, error) { + ret := _m.Called(ctx, batchHashes, dataAvailabilityMessage) + + if len(ret) == 0 { + panic("no return value specified for GetSequence") + } + + var r0 [][]byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []common.Hash, []byte) ([][]byte, error)); ok { + return rf(ctx, batchHashes, dataAvailabilityMessage) + } + if rf, ok := ret.Get(0).(func(context.Context, []common.Hash, []byte) [][]byte); ok { + r0 = rf(ctx, batchHashes, dataAvailabilityMessage) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([][]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []common.Hash, []byte) error); ok { + r1 = rf(ctx, batchHashes, dataAvailabilityMessage) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SequenceRetriever_GetSequence_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSequence' +type SequenceRetriever_GetSequence_Call struct { + *mock.Call +} + +// GetSequence is a helper method to define mock.On call +// - ctx context.Context +// - batchHashes []common.Hash +// - dataAvailabilityMessage []byte +func (_e *SequenceRetriever_Expecter) GetSequence(ctx interface{}, batchHashes interface{}, dataAvailabilityMessage interface{}) *SequenceRetriever_GetSequence_Call { + return &SequenceRetriever_GetSequence_Call{Call: _e.mock.On("GetSequence", ctx, batchHashes, dataAvailabilityMessage)} +} + +func (_c *SequenceRetriever_GetSequence_Call) Run(run func(ctx context.Context, batchHashes []common.Hash, dataAvailabilityMessage []byte)) *SequenceRetriever_GetSequence_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]common.Hash), args[2].([]byte)) + }) + return _c +} + +func (_c *SequenceRetriever_GetSequence_Call) Return(_a0 [][]byte, _a1 error) *SequenceRetriever_GetSequence_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SequenceRetriever_GetSequence_Call) RunAndReturn(run func(context.Context, []common.Hash, []byte) ([][]byte, error)) *SequenceRetriever_GetSequence_Call { + _c.Call.Return(run) + return _c +} + +// NewSequenceRetriever creates a new instance of SequenceRetriever. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSequenceRetriever(t interface { + mock.TestingT + Cleanup(func()) +}) *SequenceRetriever { + mock := &SequenceRetriever{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/dataavailability/mocks_da/sequence_sender.go b/dataavailability/mocks_da/sequence_sender.go new file mode 100644 index 00000000..86a3ff52 --- /dev/null +++ b/dataavailability/mocks_da/sequence_sender.go @@ -0,0 +1,156 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_da + +import ( + context "context" + + etherman "github.com/agglayer/aggkit/etherman" + + mock "github.com/stretchr/testify/mock" +) + +// SequenceSender is an autogenerated mock type for the SequenceSender type +type SequenceSender struct { + mock.Mock +} + +type SequenceSender_Expecter struct { + mock *mock.Mock +} + +func (_m *SequenceSender) EXPECT() *SequenceSender_Expecter { + return &SequenceSender_Expecter{mock: &_m.Mock} +} + +// PostSequenceBanana provides a mock function with given fields: ctx, sequence +func (_m *SequenceSender) PostSequenceBanana(ctx context.Context, sequence etherman.SequenceBanana) ([]byte, error) { + ret := _m.Called(ctx, sequence) + + if len(ret) == 0 { + panic("no return value specified for PostSequenceBanana") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, etherman.SequenceBanana) ([]byte, error)); ok { + return rf(ctx, sequence) + } + if rf, ok := ret.Get(0).(func(context.Context, etherman.SequenceBanana) []byte); ok { + r0 = rf(ctx, sequence) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, etherman.SequenceBanana) error); ok { + r1 = rf(ctx, sequence) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SequenceSender_PostSequenceBanana_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PostSequenceBanana' +type SequenceSender_PostSequenceBanana_Call struct { + *mock.Call +} + +// PostSequenceBanana is a helper method to define mock.On call +// - ctx context.Context +// - sequence etherman.SequenceBanana +func (_e *SequenceSender_Expecter) PostSequenceBanana(ctx interface{}, sequence interface{}) *SequenceSender_PostSequenceBanana_Call { + return &SequenceSender_PostSequenceBanana_Call{Call: _e.mock.On("PostSequenceBanana", ctx, sequence)} +} + +func (_c *SequenceSender_PostSequenceBanana_Call) Run(run func(ctx context.Context, sequence etherman.SequenceBanana)) *SequenceSender_PostSequenceBanana_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(etherman.SequenceBanana)) + }) + return _c +} + +func (_c *SequenceSender_PostSequenceBanana_Call) Return(_a0 []byte, _a1 error) *SequenceSender_PostSequenceBanana_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SequenceSender_PostSequenceBanana_Call) RunAndReturn(run func(context.Context, etherman.SequenceBanana) ([]byte, error)) *SequenceSender_PostSequenceBanana_Call { + _c.Call.Return(run) + return _c +} + +// PostSequenceElderberry provides a mock function with given fields: ctx, batchesData +func (_m *SequenceSender) PostSequenceElderberry(ctx context.Context, batchesData [][]byte) ([]byte, error) { + ret := _m.Called(ctx, batchesData) + + if len(ret) == 0 { + panic("no return value specified for PostSequenceElderberry") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, [][]byte) ([]byte, error)); ok { + return rf(ctx, batchesData) + } + if rf, ok := ret.Get(0).(func(context.Context, [][]byte) []byte); ok { + r0 = rf(ctx, batchesData) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, [][]byte) error); ok { + r1 = rf(ctx, batchesData) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SequenceSender_PostSequenceElderberry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PostSequenceElderberry' +type SequenceSender_PostSequenceElderberry_Call struct { + *mock.Call +} + +// PostSequenceElderberry is a helper method to define mock.On call +// - ctx context.Context +// - batchesData [][]byte +func (_e *SequenceSender_Expecter) PostSequenceElderberry(ctx interface{}, batchesData interface{}) *SequenceSender_PostSequenceElderberry_Call { + return &SequenceSender_PostSequenceElderberry_Call{Call: _e.mock.On("PostSequenceElderberry", ctx, batchesData)} +} + +func (_c *SequenceSender_PostSequenceElderberry_Call) Run(run func(ctx context.Context, batchesData [][]byte)) *SequenceSender_PostSequenceElderberry_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([][]byte)) + }) + return _c +} + +func (_c *SequenceSender_PostSequenceElderberry_Call) Return(_a0 []byte, _a1 error) *SequenceSender_PostSequenceElderberry_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SequenceSender_PostSequenceElderberry_Call) RunAndReturn(run func(context.Context, [][]byte) ([]byte, error)) *SequenceSender_PostSequenceElderberry_Call { + _c.Call.Return(run) + return _c +} + +// NewSequenceSender creates a new instance of SequenceSender. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSequenceSender(t interface { + mock.TestingT + Cleanup(func()) +}) *SequenceSender { + mock := &SequenceSender{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/dataavailability/mocks_da/sequence_sender_banana.go b/dataavailability/mocks_da/sequence_sender_banana.go new file mode 100644 index 00000000..e6da586e --- /dev/null +++ b/dataavailability/mocks_da/sequence_sender_banana.go @@ -0,0 +1,97 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_da + +import ( + context "context" + + etherman "github.com/agglayer/aggkit/etherman" + + mock "github.com/stretchr/testify/mock" +) + +// SequenceSenderBanana is an autogenerated mock type for the SequenceSenderBanana type +type SequenceSenderBanana struct { + mock.Mock +} + +type SequenceSenderBanana_Expecter struct { + mock *mock.Mock +} + +func (_m *SequenceSenderBanana) EXPECT() *SequenceSenderBanana_Expecter { + return &SequenceSenderBanana_Expecter{mock: &_m.Mock} +} + +// PostSequenceBanana provides a mock function with given fields: ctx, sequence +func (_m *SequenceSenderBanana) PostSequenceBanana(ctx context.Context, sequence etherman.SequenceBanana) ([]byte, error) { + ret := _m.Called(ctx, sequence) + + if len(ret) == 0 { + panic("no return value specified for PostSequenceBanana") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, etherman.SequenceBanana) ([]byte, error)); ok { + return rf(ctx, sequence) + } + if rf, ok := ret.Get(0).(func(context.Context, etherman.SequenceBanana) []byte); ok { + r0 = rf(ctx, sequence) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, etherman.SequenceBanana) error); ok { + r1 = rf(ctx, sequence) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SequenceSenderBanana_PostSequenceBanana_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PostSequenceBanana' +type SequenceSenderBanana_PostSequenceBanana_Call struct { + *mock.Call +} + +// PostSequenceBanana is a helper method to define mock.On call +// - ctx context.Context +// - sequence etherman.SequenceBanana +func (_e *SequenceSenderBanana_Expecter) PostSequenceBanana(ctx interface{}, sequence interface{}) *SequenceSenderBanana_PostSequenceBanana_Call { + return &SequenceSenderBanana_PostSequenceBanana_Call{Call: _e.mock.On("PostSequenceBanana", ctx, sequence)} +} + +func (_c *SequenceSenderBanana_PostSequenceBanana_Call) Run(run func(ctx context.Context, sequence etherman.SequenceBanana)) *SequenceSenderBanana_PostSequenceBanana_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(etherman.SequenceBanana)) + }) + return _c +} + +func (_c *SequenceSenderBanana_PostSequenceBanana_Call) Return(_a0 []byte, _a1 error) *SequenceSenderBanana_PostSequenceBanana_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SequenceSenderBanana_PostSequenceBanana_Call) RunAndReturn(run func(context.Context, etherman.SequenceBanana) ([]byte, error)) *SequenceSenderBanana_PostSequenceBanana_Call { + _c.Call.Return(run) + return _c +} + +// NewSequenceSenderBanana creates a new instance of SequenceSenderBanana. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSequenceSenderBanana(t interface { + mock.TestingT + Cleanup(func()) +}) *SequenceSenderBanana { + mock := &SequenceSenderBanana{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/dataavailability/mocks_da/sequence_sender_elderberry.go b/dataavailability/mocks_da/sequence_sender_elderberry.go new file mode 100644 index 00000000..3816fa1b --- /dev/null +++ b/dataavailability/mocks_da/sequence_sender_elderberry.go @@ -0,0 +1,95 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_da + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" +) + +// SequenceSenderElderberry is an autogenerated mock type for the SequenceSenderElderberry type +type SequenceSenderElderberry struct { + mock.Mock +} + +type SequenceSenderElderberry_Expecter struct { + mock *mock.Mock +} + +func (_m *SequenceSenderElderberry) EXPECT() *SequenceSenderElderberry_Expecter { + return &SequenceSenderElderberry_Expecter{mock: &_m.Mock} +} + +// PostSequenceElderberry provides a mock function with given fields: ctx, batchesData +func (_m *SequenceSenderElderberry) PostSequenceElderberry(ctx context.Context, batchesData [][]byte) ([]byte, error) { + ret := _m.Called(ctx, batchesData) + + if len(ret) == 0 { + panic("no return value specified for PostSequenceElderberry") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, [][]byte) ([]byte, error)); ok { + return rf(ctx, batchesData) + } + if rf, ok := ret.Get(0).(func(context.Context, [][]byte) []byte); ok { + r0 = rf(ctx, batchesData) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, [][]byte) error); ok { + r1 = rf(ctx, batchesData) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// SequenceSenderElderberry_PostSequenceElderberry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PostSequenceElderberry' +type SequenceSenderElderberry_PostSequenceElderberry_Call struct { + *mock.Call +} + +// PostSequenceElderberry is a helper method to define mock.On call +// - ctx context.Context +// - batchesData [][]byte +func (_e *SequenceSenderElderberry_Expecter) PostSequenceElderberry(ctx interface{}, batchesData interface{}) *SequenceSenderElderberry_PostSequenceElderberry_Call { + return &SequenceSenderElderberry_PostSequenceElderberry_Call{Call: _e.mock.On("PostSequenceElderberry", ctx, batchesData)} +} + +func (_c *SequenceSenderElderberry_PostSequenceElderberry_Call) Run(run func(ctx context.Context, batchesData [][]byte)) *SequenceSenderElderberry_PostSequenceElderberry_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([][]byte)) + }) + return _c +} + +func (_c *SequenceSenderElderberry_PostSequenceElderberry_Call) Return(_a0 []byte, _a1 error) *SequenceSenderElderberry_PostSequenceElderberry_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *SequenceSenderElderberry_PostSequenceElderberry_Call) RunAndReturn(run func(context.Context, [][]byte) ([]byte, error)) *SequenceSenderElderberry_PostSequenceElderberry_Call { + _c.Call.Return(run) + return _c +} + +// NewSequenceSenderElderberry creates a new instance of SequenceSenderElderberry. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSequenceSenderElderberry(t interface { + mock.TestingT + Cleanup(func()) +}) *SequenceSenderElderberry { + mock := &SequenceSenderElderberry{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/db/interface.go b/db/interface.go new file mode 100644 index 00000000..03f81aba --- /dev/null +++ b/db/interface.go @@ -0,0 +1,17 @@ +package db + +import ( + "context" + "database/sql" +) + +type Querier interface { + Exec(query string, args ...interface{}) (sql.Result, error) + Query(query string, args ...interface{}) (*sql.Rows, error) + QueryRow(query string, args ...interface{}) *sql.Row +} + +type DBer interface { + Querier + BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) +} diff --git a/db/meddler.go b/db/meddler.go new file mode 100644 index 00000000..af4dd77a --- /dev/null +++ b/db/meddler.go @@ -0,0 +1,236 @@ +package db + +import ( + "errors" + "fmt" + "math/big" + "reflect" + "strings" + + tree "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + sqlite "github.com/mattn/go-sqlite3" + "github.com/russross/meddler" +) + +// init registers tags to be used to read/write from SQL DBs using meddler +func init() { + meddler.Default = meddler.SQLite + meddler.Register("bigint", BigIntMeddler{}) + meddler.Register("merkleproof", MerkleProofMeddler{}) + meddler.Register("hash", HashMeddler{}) + meddler.Register("address", AddressMeddler{}) +} + +func SQLiteErr(err error) (*sqlite.Error, bool) { + sqliteErr := &sqlite.Error{} + if ok := errors.As(err, sqliteErr); ok { + return sqliteErr, true + } + if driverErr, ok := meddler.DriverErr(err); ok { + return sqliteErr, errors.As(driverErr, sqliteErr) + } + return sqliteErr, false +} + +// SliceToSlicePtrs converts any []Foo to []*Foo +func SliceToSlicePtrs(slice interface{}) interface{} { + v := reflect.ValueOf(slice) + vLen := v.Len() + typ := v.Type().Elem() + res := reflect.MakeSlice(reflect.SliceOf(reflect.PointerTo(typ)), vLen, vLen) + for i := 0; i < vLen; i++ { + res.Index(i).Set(v.Index(i).Addr()) + } + return res.Interface() +} + +// SlicePtrsToSlice converts any []*Foo to []Foo +func SlicePtrsToSlice(slice interface{}) interface{} { + v := reflect.ValueOf(slice) + vLen := v.Len() + typ := v.Type().Elem().Elem() + res := reflect.MakeSlice(reflect.SliceOf(typ), vLen, vLen) + for i := 0; i < vLen; i++ { + res.Index(i).Set(v.Index(i).Elem()) + } + return res.Interface() +} + +// BigIntMeddler encodes or decodes the field value to or from string +type BigIntMeddler struct{} + +// PreRead is called before a Scan operation for fields that have the BigIntMeddler +func (b BigIntMeddler) PreRead(fieldAddr interface{}) (scanTarget interface{}, err error) { + // give a pointer to a byte buffer to grab the raw data + return new(string), nil +} + +// PostRead is called after a Scan operation for fields that have the BigIntMeddler +func (b BigIntMeddler) PostRead(fieldPtr, scanTarget interface{}) error { + ptr, ok := scanTarget.(*string) + if !ok { + return errors.New("scanTarget is not *string") + } + if ptr == nil { + return fmt.Errorf("BigIntMeddler.PostRead: nil pointer") + } + field, ok := fieldPtr.(**big.Int) + if !ok { + return errors.New("fieldPtr is not *big.Int") + } + decimal := 10 + *field, ok = new(big.Int).SetString(*ptr, decimal) + if !ok { + return fmt.Errorf("big.Int.SetString failed on \"%v\"", *ptr) + } + return nil +} + +// PreWrite is called before an Insert or Update operation for fields that have the BigIntMeddler +func (b BigIntMeddler) PreWrite(fieldPtr interface{}) (saveValue interface{}, err error) { + field, ok := fieldPtr.(*big.Int) + if !ok { + return nil, errors.New("fieldPtr is not *big.Int") + } + + return field.String(), nil +} + +// MerkleProofMeddler encodes or decodes the field value to or from string +type MerkleProofMeddler struct{} + +// PreRead is called before a Scan operation for fields that have the MerkleProofMeddler +func (b MerkleProofMeddler) PreRead(fieldAddr interface{}) (scanTarget interface{}, err error) { + // give a pointer to a byte buffer to grab the raw data + return new(string), nil +} + +// PostRead is called after a Scan operation for fields that have the MerkleProofMeddler +func (b MerkleProofMeddler) PostRead(fieldPtr, scanTarget interface{}) error { + ptr, ok := scanTarget.(*string) + if !ok { + return errors.New("scanTarget is not *string") + } + if ptr == nil { + return errors.New("ProofMeddler.PostRead: nil pointer") + } + field, ok := fieldPtr.(*tree.Proof) + if !ok { + return errors.New("fieldPtr is not tree.Proof") + } + strHashes := strings.Split(*ptr, ",") + if len(strHashes) != int(tree.DefaultHeight) { + return fmt.Errorf("unexpected len of hashes: expected %d actual %d", tree.DefaultHeight, len(strHashes)) + } + for i, strHash := range strHashes { + field[i] = common.HexToHash(strHash) + } + return nil +} + +// PreWrite is called before an Insert or Update operation for fields that have the MerkleProofMeddler +func (b MerkleProofMeddler) PreWrite(fieldPtr interface{}) (saveValue interface{}, err error) { + field, ok := fieldPtr.(tree.Proof) + if !ok { + return nil, errors.New("fieldPtr is not tree.Proof") + } + var s string + for _, f := range field { + s += f.Hex() + "," + } + s = strings.TrimSuffix(s, ",") + return s, nil +} + +// HashMeddler encodes or decodes the field value to or from string +type HashMeddler struct{} + +// PreRead is called before a Scan operation for fields that have the HashMeddler +func (b HashMeddler) PreRead(fieldAddr interface{}) (scanTarget interface{}, err error) { + // give a pointer to a byte buffer to grab the raw data + return new(string), nil +} + +// PostRead is called after a Scan operation for fields that have the HashMeddler +func (b HashMeddler) PostRead(fieldPtr, scanTarget interface{}) error { + rawHashPtr, ok := scanTarget.(*string) + if !ok { + return errors.New("scanTarget is not *string") + } + + // Handle the case where fieldPtr is a *common.Hash + field, ok := fieldPtr.(*common.Hash) + if ok { + *field = common.HexToHash(*rawHashPtr) + return nil + } + + // Handle the case where fieldPtr is a **common.Hash (nullable field) + hashPtr, ok := fieldPtr.(**common.Hash) + if ok { + // If the string is empty, set the hash to nil + if len(*rawHashPtr) == 0 { + *hashPtr = nil + // Otherwise, convert the string to a common.Hash and assign it + } else { + tmp := common.HexToHash(*rawHashPtr) + *hashPtr = &tmp + } + return nil + } + + // If fieldPtr is neither a *common.Hash nor a **common.Hash, return an error + return errors.New("fieldPtr is not *common.Hash or **common.Hash") +} + +// PreWrite is called before an Insert or Update operation for fields that have the HashMeddler +func (b HashMeddler) PreWrite(fieldPtr interface{}) (saveValue interface{}, err error) { + field, ok := fieldPtr.(common.Hash) + if !ok { + hashPtr, ok := fieldPtr.(*common.Hash) + if !ok { + return nil, errors.New("fieldPtr is not common.Hash") + } + if hashPtr == nil { + return []byte{}, nil + } + return hashPtr.Hex(), nil + } + return field.Hex(), nil +} + +// AddressMeddler encodes or decodes the field value to or from string +type AddressMeddler struct{} + +// PreRead is called before a Scan operation for fields that have the AddressMeddler +func (b AddressMeddler) PreRead(fieldAddr interface{}) (scanTarget interface{}, err error) { + // give a pointer to a byte buffer to grab the raw data + return new(string), nil +} + +// PostRead is called after a Scan operation for fields that have the AddressMeddler +func (b AddressMeddler) PostRead(fieldPtr, scanTarget interface{}) error { + ptr, ok := scanTarget.(*string) + if !ok { + return errors.New("scanTarget is not *string") + } + if ptr == nil { + return errors.New("AddressMeddler.PostRead: nil pointer") + } + field, ok := fieldPtr.(*common.Address) + if !ok { + return errors.New("fieldPtr is not common.Address") + } + *field = common.HexToAddress(*ptr) + return nil +} + +// PreWrite is called before an Insert or Update operation for fields that have the AddressMeddler +func (b AddressMeddler) PreWrite(fieldPtr interface{}) (saveValue interface{}, err error) { + field, ok := fieldPtr.(common.Address) + if !ok { + return nil, errors.New("fieldPtr is not common.Address") + } + return field.Hex(), nil +} diff --git a/db/migrations.go b/db/migrations.go new file mode 100644 index 00000000..44ae9ac7 --- /dev/null +++ b/db/migrations.go @@ -0,0 +1,53 @@ +package db + +import ( + "database/sql" + "fmt" + "strings" + + "github.com/agglayer/aggkit/db/types" + "github.com/agglayer/aggkit/log" + _ "github.com/mattn/go-sqlite3" + migrate "github.com/rubenv/sql-migrate" +) + +const ( + upDownSeparator = "-- +migrate Up" + dbPrefixReplacer = "/*dbprefix*/" +) + +// RunMigrations will execute pending migrations if needed to keep +// the database updated with the latest changes in either direction, +// up or down. +func RunMigrations(dbPath string, migrations []types.Migration) error { + db, err := NewSQLiteDB(dbPath) + if err != nil { + return fmt.Errorf("error creating DB %w", err) + } + return RunMigrationsDB(log.GetDefaultLogger(), db, migrations) +} + +func RunMigrationsDB(logger *log.Logger, db *sql.DB, migrations []types.Migration) error { + migs := &migrate.MemoryMigrationSource{Migrations: []*migrate.Migration{}} + for _, m := range migrations { + prefixed := strings.ReplaceAll(m.SQL, dbPrefixReplacer, m.Prefix) + splitted := strings.Split(prefixed, upDownSeparator) + migs.Migrations = append(migs.Migrations, &migrate.Migration{ + Id: m.Prefix + m.ID, + Up: []string{splitted[1]}, + Down: []string{splitted[0]}, + }) + } + + logger.Debugf("running migrations:") + for _, m := range migs.Migrations { + logger.Debugf("%+v", m.Id) + } + nMigrations, err := migrate.Exec(db, "sqlite3", migs, migrate.Up) + if err != nil { + return fmt.Errorf("error executing migration %w", err) + } + + logger.Infof("successfully ran %d migrations", nMigrations) + return nil +} diff --git a/db/sqlite.go b/db/sqlite.go new file mode 100644 index 00000000..23d5d2a1 --- /dev/null +++ b/db/sqlite.go @@ -0,0 +1,29 @@ +package db + +import ( + "database/sql" + "errors" + "fmt" + + _ "github.com/mattn/go-sqlite3" +) + +const ( + UniqueConstrain = 1555 +) + +var ( + ErrNotFound = errors.New("not found") +) + +// NewSQLiteDB creates a new SQLite DB +func NewSQLiteDB(dbPath string) (*sql.DB, error) { + return sql.Open("sqlite3", fmt.Sprintf("file:%s?_txlock=exclusive&_foreign_keys=on&_journal_mode=WAL", dbPath)) +} + +func ReturnErrNotFound(err error) error { + if errors.Is(err, sql.ErrNoRows) { + return ErrNotFound + } + return err +} diff --git a/db/tx.go b/db/tx.go new file mode 100644 index 00000000..926da07c --- /dev/null +++ b/db/tx.go @@ -0,0 +1,60 @@ +package db + +import ( + "context" +) + +type SQLTxer interface { + Querier + Commit() error + Rollback() error +} + +type Txer interface { + SQLTxer + AddRollbackCallback(cb func()) + AddCommitCallback(cb func()) +} + +type Tx struct { + SQLTxer + rollbackCallbacks []func() + commitCallbacks []func() +} + +func NewTx(ctx context.Context, db DBer) (Txer, error) { + tx, err := db.BeginTx(ctx, nil) + if err != nil { + return nil, err + } + return &Tx{ + SQLTxer: tx, + }, nil +} + +func (s *Tx) AddRollbackCallback(cb func()) { + s.rollbackCallbacks = append(s.rollbackCallbacks, cb) +} +func (s *Tx) AddCommitCallback(cb func()) { + s.commitCallbacks = append(s.commitCallbacks, cb) +} + +func (s *Tx) Commit() error { + if err := s.SQLTxer.Commit(); err != nil { + return err + } + for _, cb := range s.commitCallbacks { + cb() + } + return nil +} + +func (s *Tx) Rollback() error { + if err := s.SQLTxer.Rollback(); err != nil { + return err + } + for _, cb := range s.rollbackCallbacks { + cb() + } + return nil +} diff --git a/db/types/types.go b/db/types/types.go new file mode 100644 index 00000000..ade19092 --- /dev/null +++ b/db/types/types.go @@ -0,0 +1,7 @@ +package types + +type Migration struct { + ID string + SQL string + Prefix string +} diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 00000000..d9d8cddf --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,7 @@ +# Summary + +- [Getting Started](./getting_started.md) + - [Local Debug](./local_debug.md) +- [DA Integration](./da_integration.md) +- [Non-EVM integrations](./non_evm_integration.md) +- [AggOracle](./aggoracle.md) diff --git a/docs/aggoracle.md b/docs/aggoracle.md new file mode 100644 index 00000000..070857c1 --- /dev/null +++ b/docs/aggoracle.md @@ -0,0 +1,123 @@ +# AggOracle Component - Developer Documentation + +## Overview + +The **AggOracle** component ensures the **Global Exit Root (GER)** is propagated from L1 to the L2 sovereign chain smart contract. This is critical for enabling asset and message bridging between chains. + +The GER is picked up from the smart contract by **LastGERSyncer** for local storage. + +### Key Components: + +- **ChainSender**: Interface for submitting GERs to the smart contract. +- **EVMChainGERSender**: An implementation of `ChainSender`. + +--- + +## Workflow + +### What is Global Exit Root (GER)? + +The **Global Exit Root** consolidates: + +- **Mainnet Exit Root (MER)**: Updated during bridge transactions from L1. +- **Rollup Exit Root (RER)**: Updated when verified rollup batches are submitted via ZKP. + + GER = hash(MER, RER) + +### Process + +1. **Fetch Finalized GER**: + - AggOracle retrieves the latest GER finalized on L1. +2. **Check GER Injection**: + - Confirms whether the GER is already stored in the smart contract. +3. **Inject GER**: + - If missing, AggOracle submits the GER via the `insertGlobalExitRoot` function. +4. **Sync Locally**: + - LastGERSyncer fetches and stores the GER locally for downstream use. + +The sequence diagram below depicts the interaction in the AggOracle. + +```mermaid +sequenceDiagram + participant AggOracle + participant ChainSender + participant L1InfoTreer + participant L1Client + + AggOracle->>AggOracle: start + loop trigger on preconfigured frequency + AggOracle->>AggOracle: process latest GER + AggOracle->>L1InfoTreer: get last finalized GER + alt targetBlockNum == 0 + AggOracle->>L1Client: get (latest) header by number + L1Client-->>AggOracle: the latest header + AggOracle->>L1InfoTreer: get latest L1 info tree until provided header + L1InfoTreer-->>AggOracle: global exit root (from L1 info tree) + else + AggOracle->>L1InfoTreer: get latest L1 info tree until provided header + L1InfoTreer-->>AggOracle: global exit root (from L1 info tree) + end + AggOracle->>ChainSender: check is GER injected + ChainSender-->>AggOracle: isGERInjected result + alt is GER injected + AggOracle->>AggOracle: log GER already injected + else + AggOracle->>ChainSender: inject GER + ChainSender-->>AggOracle: GER injection result + end + end + AggOracle->>AggOracle: handle GER processing error +``` + +--- + +## Key Components + +### 1. AggOracle + +The `AggOracle` fetches the finalized GER and ensures its injection into the L2 smart contract. + +### Functions: + +- **`Start`**: Periodically processes GER updates using a ticker. +- **`processLatestGER`**: Checks if the GER exists and injects it if necessary. +- **`getLastFinalizedGER`**: Retrieves the latest finalized GER based on block finality. + +--- + +### 2. ChainSender Interface + +Defines the interface for submitting GERs. + +``` +IsGERInjected(ger common.Hash) (bool, error) +InjectGER(ctx context.Context, ger common.Hash) error +``` + +--- + +### 3. EVMChainGERSender + +Implements `ChainSender` using Ethereum clients and transaction management. + +### Functions: + +- **`IsGERInjected`**: Verifies GER presence in the smart contract. +- **`InjectGER`**: Submits the GER using the `insertGlobalExitRoot` method and monitors transaction status. + +--- + +## Smart Contract Integration + +- **Contract**: `GlobalExitRootManagerL2SovereignChain.sol` +- **Function**: `insertGlobalExitRoot` + - [Source Code](https://github.com/0xPolygonHermez/zkevm-contracts/blob/feature/audit-remediations/contracts/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.sol#L89-L103) +- **Bindings**: Available in [cdk-contracts-tooling](https://github.com/0xPolygon/cdk-contracts-tooling/tree/main/contracts/l2-sovereign-chain). + +--- + +## Summary + +The **AggOracle** component automates the propagation of GERs from L1 to L2, enabling bridging across networks. + +Refer to the EVM implementation in [evm.go](https://github.com/agglayer/aggkit/blob/main/aggoracle/chaingersender/evm.go) for guidance on building new chain senders. diff --git a/docs/assets/mermaid-init.js b/docs/assets/mermaid-init.js new file mode 100644 index 00000000..313a6e8b --- /dev/null +++ b/docs/assets/mermaid-init.js @@ -0,0 +1 @@ +mermaid.initialize({startOnLoad:true}); diff --git a/docs/assets/mermaid.min.js b/docs/assets/mermaid.min.js new file mode 100644 index 00000000..b2c9f2b0 --- /dev/null +++ b/docs/assets/mermaid.min.js @@ -0,0 +1,1648 @@ +/* MIT Licensed. Copyright (c) 2014 - 2022 Knut Sveidqvist */ +/* For license information please see https://github.com/mermaid-js/mermaid/blob/release/10.6.1/LICENSE */ +(function(xA,b0){typeof exports=="object"&&typeof module<"u"?module.exports=b0():typeof define=="function"&&define.amd?define(b0):(xA=typeof globalThis<"u"?globalThis:xA||self,xA.mermaid=b0())})(this,function(){"use strict";function xA(i){for(var a=[],f=1;f=It?nt:""+Array(It+1-Bt.length).join(Ot)+nt},mt={s:bt,z:function(nt){var It=-nt.utcOffset(),Ot=Math.abs(It),Bt=Math.floor(Ot/60),Et=Ot%60;return(It<=0?"+":"-")+bt(Bt,2,"0")+":"+bt(Et,2,"0")},m:function nt(It,Ot){if(It.date()1)return nt(Ct[0])}else{var xt=It.name;ft[xt]=It,Et=xt}return!Bt&&Et&&(yt=Et),Et||!Bt&&yt},X=function(nt,It){if(ut(nt))return nt.clone();var Ot=typeof It=="object"?It:{};return Ot.date=nt,Ot.args=arguments,new U(Ot)},pt=mt;pt.l=vt,pt.i=ut,pt.w=function(nt,It){return X(nt,{locale:It.$L,utc:It.$u,x:It.$x,$offset:It.$offset})};var U=function(){function nt(Ot){this.$L=vt(Ot.locale,null,!0),this.parse(Ot)}var It=nt.prototype;return It.parse=function(Ot){this.$d=function(Bt){var Et=Bt.date,Z=Bt.utc;if(Et===null)return new Date(NaN);if(pt.u(Et))return new Date;if(Et instanceof Date)return new Date(Et);if(typeof Et=="string"&&!/Z$/i.test(Et)){var Ct=Et.match(et);if(Ct){var xt=Ct[2]-1||0,Ht=(Ct[7]||"0").substring(0,3);return Z?new Date(Date.UTC(Ct[1],xt,Ct[3]||1,Ct[4]||0,Ct[5]||0,Ct[6]||0,Ht)):new Date(Ct[1],xt,Ct[3]||1,Ct[4]||0,Ct[5]||0,Ct[6]||0,Ht)}}return new Date(Et)}(Ot),this.$x=Ot.x||{},this.init()},It.init=function(){var Ot=this.$d;this.$y=Ot.getFullYear(),this.$M=Ot.getMonth(),this.$D=Ot.getDate(),this.$W=Ot.getDay(),this.$H=Ot.getHours(),this.$m=Ot.getMinutes(),this.$s=Ot.getSeconds(),this.$ms=Ot.getMilliseconds()},It.$utils=function(){return pt},It.isValid=function(){return this.$d.toString()!==W},It.isSame=function(Ot,Bt){var Et=X(Ot);return this.startOf(Bt)<=Et&&Et<=this.endOf(Bt)},It.isAfter=function(Ot,Bt){return X(Ot){},debug:(...i)=>{},info:(...i)=>{},warn:(...i)=>{},error:(...i)=>{},fatal:(...i)=>{}},Xft=function(i="fatal"){let a=p5.fatal;typeof i=="string"?(i=i.toLowerCase(),i in p5&&(a=p5[i])):typeof i=="number"&&(a=i),Ut.trace=()=>{},Ut.debug=()=>{},Ut.info=()=>{},Ut.warn=()=>{},Ut.error=()=>{},Ut.fatal=()=>{},a<=p5.fatal&&(Ut.fatal=console.error?console.error.bind(console,Q2("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",Q2("FATAL"))),a<=p5.error&&(Ut.error=console.error?console.error.bind(console,Q2("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",Q2("ERROR"))),a<=p5.warn&&(Ut.warn=console.warn?console.warn.bind(console,Q2("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",Q2("WARN"))),a<=p5.info&&(Ut.info=console.info?console.info.bind(console,Q2("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",Q2("INFO"))),a<=p5.debug&&(Ut.debug=console.debug?console.debug.bind(console,Q2("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Q2("DEBUG"))),a<=p5.trace&&(Ut.trace=console.debug?console.debug.bind(console,Q2("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Q2("TRACE")))},Q2=i=>`%c${w0().format("ss.SSS")} : ${i} : `;var Qft={};Object.defineProperty(Qft,"__esModule",{value:!0});var ik=Qft.sanitizeUrl=void 0,cxe=/^([^\w]*)(javascript|data|vbscript)/im,uxe=/&#(\w+)(^\w|;)?/g,lxe=/&(newline|tab);/gi,hxe=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,fxe=/^.+(:|:)/gim,dxe=[".","/"];function gxe(i){return dxe.indexOf(i[0])>-1}function pxe(i){return i.replace(uxe,function(a,f){return String.fromCharCode(f)})}function bxe(i){var a=pxe(i||"").replace(lxe,"").replace(hxe,"").trim();if(!a)return"about:blank";if(gxe(a))return a;var f=a.match(fxe);if(!f)return a;var p=f[0];return cxe.test(p)?"about:blank":a}ik=Qft.sanitizeUrl=bxe;function EU(i,a){return i==null||a==null?NaN:ia?1:i>=a?0:NaN}function wxe(i,a){return i==null||a==null?NaN:ai?1:a>=i?0:NaN}function Zft(i){let a,f,p;i.length!==2?(a=EU,f=(E,_)=>EU(i(E),_),p=(E,_)=>i(E)-_):(a=i===EU||i===wxe?i:vxe,f=i,p=i);function w(E,_,A=0,I=E.length){if(A>>1;f(E[B],_)<0?A=B+1:I=B}while(A>>1;f(E[B],_)<=0?A=B+1:I=B}while(AA&&p(E[B-1],_)>-p(E[B],_)?B-1:B}return{left:w,center:b,right:m}}function vxe(){return 0}function mxe(i){return i===null?NaN:+i}const yxe=Zft(EU).right;Zft(mxe).center;const xxe=yxe;class $Lt extends Map{constructor(a,f=Txe){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:f}}),a!=null)for(const[p,w]of a)this.set(p,w)}get(a){return super.get(zLt(this,a))}has(a){return super.has(zLt(this,a))}set(a,f){return super.set(kxe(this,a),f)}delete(a){return super.delete(Exe(this,a))}}function zLt({_intern:i,_key:a},f){const p=a(f);return i.has(p)?i.get(p):f}function kxe({_intern:i,_key:a},f){const p=a(f);return i.has(p)?i.get(p):(i.set(p,f),f)}function Exe({_intern:i,_key:a},f){const p=a(f);return i.has(p)&&(f=i.get(p),i.delete(p)),f}function Txe(i){return i!==null&&typeof i=="object"?i.valueOf():i}const Cxe=Math.sqrt(50),_xe=Math.sqrt(10),Sxe=Math.sqrt(2);function TU(i,a,f){const p=(a-i)/Math.max(0,f),w=Math.floor(Math.log10(p)),m=p/Math.pow(10,w),b=m>=Cxe?10:m>=_xe?5:m>=Sxe?2:1;let E,_,A;return w<0?(A=Math.pow(10,-w)/b,E=Math.round(i*A),_=Math.round(a*A),E/Aa&&--_,A=-A):(A=Math.pow(10,w)*b,E=Math.round(i/A),_=Math.round(a/A),E*Aa&&--_),_0))return[];if(i===a)return[i];const p=a=w))return[];const E=m-w+1,_=new Array(E);if(p)if(b<0)for(let A=0;A=p)&&(f=p);else{let p=-1;for(let w of i)(w=a(w,++p,i))!=null&&(f=w)&&(f=w)}return f}function Mxe(i,a){let f;if(a===void 0)for(const p of i)p!=null&&(f>p||f===void 0&&p>=p)&&(f=p);else{let p=-1;for(let w of i)(w=a(w,++p,i))!=null&&(f>w||f===void 0&&w>=w)&&(f=w)}return f}function Dxe(i,a,f){i=+i,a=+a,f=(w=arguments.length)<2?(a=i,i=0,1):w<3?1:+f;for(var p=-1,w=Math.max(0,Math.ceil((a-i)/f))|0,m=new Array(w);++p+i(a)}function Nxe(i,a){return a=Math.max(0,i.bandwidth()-a*2)/2,i.round()&&(a=Math.round(a)),f=>+i(f)+a}function Bxe(){return!this.__axis}function HLt(i,a){var f=[],p=null,w=null,m=6,b=6,E=3,_=typeof window<"u"&&window.devicePixelRatio>1?0:.5,A=i===CU||i===_U?-1:1,I=i===_U||i===e1t?"x":"y",B=i===CU||i===n1t?Oxe:Pxe;function N(R){var z=p??(a.ticks?a.ticks.apply(a,f):a.domain()),W=w??(a.tickFormat?a.tickFormat.apply(a,f):Ixe),et=Math.max(m,0)+E,st=a.range(),at=+st[0]+_,bt=+st[st.length-1]+_,mt=(a.bandwidth?Nxe:Fxe)(a.copy(),_),yt=R.selection?R.selection():R,ft=yt.selectAll(".domain").data([null]),ut=yt.selectAll(".tick").data(z,a).order(),vt=ut.exit(),X=ut.enter().append("g").attr("class","tick"),pt=ut.select("line"),U=ut.select("text");ft=ft.merge(ft.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),ut=ut.merge(X),pt=pt.merge(X.append("line").attr("stroke","currentColor").attr(I+"2",A*m)),U=U.merge(X.append("text").attr("fill","currentColor").attr(I,A*et).attr("dy",i===CU?"0em":i===n1t?"0.71em":"0.32em")),R!==yt&&(ft=ft.transition(R),ut=ut.transition(R),pt=pt.transition(R),U=U.transition(R),vt=vt.transition(R).attr("opacity",qLt).attr("transform",function(Tt){return isFinite(Tt=mt(Tt))?B(Tt+_):this.getAttribute("transform")}),X.attr("opacity",qLt).attr("transform",function(Tt){var nt=this.parentNode.__axis;return B((nt&&isFinite(nt=nt(Tt))?nt:mt(Tt))+_)})),vt.remove(),ft.attr("d",i===_U||i===e1t?b?"M"+A*b+","+at+"H"+_+"V"+bt+"H"+A*b:"M"+_+","+at+"V"+bt:b?"M"+at+","+A*b+"V"+_+"H"+bt+"V"+A*b:"M"+at+","+_+"H"+bt),ut.attr("opacity",1).attr("transform",function(Tt){return B(mt(Tt)+_)}),pt.attr(I+"2",A*m),U.attr(I,A*et).text(W),yt.filter(Bxe).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",i===e1t?"start":i===_U?"end":"middle"),yt.each(function(){this.__axis=mt})}return N.scale=function(R){return arguments.length?(a=R,N):a},N.ticks=function(){return f=Array.from(arguments),N},N.tickArguments=function(R){return arguments.length?(f=R==null?[]:Array.from(R),N):f.slice()},N.tickValues=function(R){return arguments.length?(p=R==null?null:Array.from(R),N):p&&p.slice()},N.tickFormat=function(R){return arguments.length?(w=R,N):w},N.tickSize=function(R){return arguments.length?(m=b=+R,N):m},N.tickSizeInner=function(R){return arguments.length?(m=+R,N):m},N.tickSizeOuter=function(R){return arguments.length?(b=+R,N):b},N.tickPadding=function(R){return arguments.length?(E=+R,N):E},N.offset=function(R){return arguments.length?(_=+R,N):_},N}function Rxe(i){return HLt(CU,i)}function jxe(i){return HLt(n1t,i)}var $xe={value:()=>{}};function VLt(){for(var i=0,a=arguments.length,f={},p;i=0&&(p=f.slice(w+1),f=f.slice(0,w)),f&&!a.hasOwnProperty(f))throw new Error("unknown type: "+f);return{type:f,name:p}})}SU.prototype=VLt.prototype={constructor:SU,on:function(i,a){var f=this._,p=zxe(i+"",f),w,m=-1,b=p.length;if(arguments.length<2){for(;++m0)for(var f=new Array(w),p=0,w,m;p=0&&(a=i.slice(0,f))!=="xmlns"&&(i=i.slice(f+1)),ULt.hasOwnProperty(a)?{space:ULt[a],local:i}:i}function Hxe(i){return function(){var a=this.ownerDocument,f=this.namespaceURI;return f===r1t&&a.documentElement.namespaceURI===r1t?a.createElement(i):a.createElementNS(f,i)}}function Vxe(i){return function(){return this.ownerDocument.createElementNS(i.space,i.local)}}function WLt(i){var a=AU(i);return(a.local?Vxe:Hxe)(a)}function Gxe(){}function i1t(i){return i==null?Gxe:function(){return this.querySelector(i)}}function Uxe(i){typeof i!="function"&&(i=i1t(i));for(var a=this._groups,f=a.length,p=new Array(f),w=0;w=bt&&(bt=at+1);!(yt=et[bt])&&++bt=0;)(b=p[w])&&(m&&b.compareDocumentPosition(m)^4&&m.parentNode.insertBefore(b,m),m=b);return this}function b6e(i){i||(i=w6e);function a(B,N){return B&&N?i(B.__data__,N.__data__):!B-!N}for(var f=this._groups,p=f.length,w=new Array(p),m=0;ma?1:i>=a?0:NaN}function v6e(){var i=arguments[0];return arguments[0]=this,i.apply(null,arguments),this}function m6e(){return Array.from(this)}function y6e(){for(var i=this._groups,a=0,f=i.length;a1?this.each((a==null?D6e:typeof a=="function"?O6e:I6e)(i,a,f??"")):kA(this.node(),i)}function kA(i,a){return i.style.getPropertyValue(a)||JLt(i).getComputedStyle(i,null).getPropertyValue(a)}function F6e(i){return function(){delete this[i]}}function N6e(i,a){return function(){this[i]=a}}function B6e(i,a){return function(){var f=a.apply(this,arguments);f==null?delete this[i]:this[i]=f}}function R6e(i,a){return arguments.length>1?this.each((a==null?F6e:typeof a=="function"?B6e:N6e)(i,a)):this.node()[i]}function tMt(i){return i.trim().split(/^|\s+/)}function s1t(i){return i.classList||new eMt(i)}function eMt(i){this._node=i,this._names=tMt(i.getAttribute("class")||"")}eMt.prototype={add:function(i){var a=this._names.indexOf(i);a<0&&(this._names.push(i),this._node.setAttribute("class",this._names.join(" ")))},remove:function(i){var a=this._names.indexOf(i);a>=0&&(this._names.splice(a,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(i){return this._names.indexOf(i)>=0}};function nMt(i,a){for(var f=s1t(i),p=-1,w=a.length;++p=0&&(f=a.slice(p+1),a=a.slice(0,p)),{type:a,name:f}})}function fke(i){return function(){var a=this.__on;if(a){for(var f=0,p=-1,w=a.length,m;f>8&15|a>>4&240,a>>4&15|a&240,(a&15)<<4|a&15,1):f===8?IU(a>>24&255,a>>16&255,a>>8&255,(a&255)/255):f===4?IU(a>>12&15|a>>8&240,a>>8&15|a>>4&240,a>>4&15|a&240,((a&15)<<4|a&15)/255):null):(a=xke.exec(i))?new v0(a[1],a[2],a[3],1):(a=kke.exec(i))?new v0(a[1]*255/100,a[2]*255/100,a[3]*255/100,1):(a=Eke.exec(i))?IU(a[1],a[2],a[3],a[4]):(a=Tke.exec(i))?IU(a[1]*255/100,a[2]*255/100,a[3]*255/100,a[4]):(a=Cke.exec(i))?dMt(a[1],a[2]/100,a[3]/100,1):(a=_ke.exec(i))?dMt(a[1],a[2]/100,a[3]/100,a[4]):aMt.hasOwnProperty(i)?uMt(aMt[i]):i==="transparent"?new v0(NaN,NaN,NaN,0):null}function uMt(i){return new v0(i>>16&255,i>>8&255,i&255,1)}function IU(i,a,f,p){return p<=0&&(i=a=f=NaN),new v0(i,a,f,p)}function lMt(i){return i instanceof U7||(i=W7(i)),i?(i=i.rgb(),new v0(i.r,i.g,i.b,i.opacity)):new v0}function o1t(i,a,f,p){return arguments.length===1?lMt(i):new v0(i,a,f,p??1)}function v0(i,a,f,p){this.r=+i,this.g=+a,this.b=+f,this.opacity=+p}_P(v0,o1t,MU(U7,{brighter(i){return i=i==null?DU:Math.pow(DU,i),new v0(this.r*i,this.g*i,this.b*i,this.opacity)},darker(i){return i=i==null?SP:Math.pow(SP,i),new v0(this.r*i,this.g*i,this.b*i,this.opacity)},rgb(){return this},clamp(){return new v0(Y7(this.r),Y7(this.g),Y7(this.b),OU(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:hMt,formatHex:hMt,formatHex8:Lke,formatRgb:fMt,toString:fMt}));function hMt(){return`#${K7(this.r)}${K7(this.g)}${K7(this.b)}`}function Lke(){return`#${K7(this.r)}${K7(this.g)}${K7(this.b)}${K7((isNaN(this.opacity)?1:this.opacity)*255)}`}function fMt(){const i=OU(this.opacity);return`${i===1?"rgb(":"rgba("}${Y7(this.r)}, ${Y7(this.g)}, ${Y7(this.b)}${i===1?")":`, ${i})`}`}function OU(i){return isNaN(i)?1:Math.max(0,Math.min(1,i))}function Y7(i){return Math.max(0,Math.min(255,Math.round(i)||0))}function K7(i){return i=Y7(i),(i<16?"0":"")+i.toString(16)}function dMt(i,a,f,p){return p<=0?i=a=f=NaN:f<=0||f>=1?i=a=NaN:a<=0&&(i=NaN),new Xv(i,a,f,p)}function gMt(i){if(i instanceof Xv)return new Xv(i.h,i.s,i.l,i.opacity);if(i instanceof U7||(i=W7(i)),!i)return new Xv;if(i instanceof Xv)return i;i=i.rgb();var a=i.r/255,f=i.g/255,p=i.b/255,w=Math.min(a,f,p),m=Math.max(a,f,p),b=NaN,E=m-w,_=(m+w)/2;return E?(a===m?b=(f-p)/E+(f0&&_<1?0:b,new Xv(b,E,_,i.opacity)}function Mke(i,a,f,p){return arguments.length===1?gMt(i):new Xv(i,a,f,p??1)}function Xv(i,a,f,p){this.h=+i,this.s=+a,this.l=+f,this.opacity=+p}_P(Xv,Mke,MU(U7,{brighter(i){return i=i==null?DU:Math.pow(DU,i),new Xv(this.h,this.s,this.l*i,this.opacity)},darker(i){return i=i==null?SP:Math.pow(SP,i),new Xv(this.h,this.s,this.l*i,this.opacity)},rgb(){var i=this.h%360+(this.h<0)*360,a=isNaN(i)||isNaN(this.s)?0:this.s,f=this.l,p=f+(f<.5?f:1-f)*a,w=2*f-p;return new v0(c1t(i>=240?i-240:i+120,w,p),c1t(i,w,p),c1t(i<120?i+240:i-120,w,p),this.opacity)},clamp(){return new Xv(pMt(this.h),PU(this.s),PU(this.l),OU(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const i=OU(this.opacity);return`${i===1?"hsl(":"hsla("}${pMt(this.h)}, ${PU(this.s)*100}%, ${PU(this.l)*100}%${i===1?")":`, ${i})`}`}}));function pMt(i){return i=(i||0)%360,i<0?i+360:i}function PU(i){return Math.max(0,Math.min(1,i||0))}function c1t(i,a,f){return(i<60?a+(f-a)*i/60:i<180?f:i<240?a+(f-a)*(240-i)/60:a)*255}const Dke=Math.PI/180,Ike=180/Math.PI,FU=18,bMt=.96422,wMt=1,vMt=.82521,mMt=4/29,TA=6/29,yMt=3*TA*TA,Oke=TA*TA*TA;function xMt(i){if(i instanceof u3)return new u3(i.l,i.a,i.b,i.opacity);if(i instanceof b5)return kMt(i);i instanceof v0||(i=lMt(i));var a=f1t(i.r),f=f1t(i.g),p=f1t(i.b),w=u1t((.2225045*a+.7168786*f+.0606169*p)/wMt),m,b;return a===f&&f===p?m=b=w:(m=u1t((.4360747*a+.3850649*f+.1430804*p)/bMt),b=u1t((.0139322*a+.0971045*f+.7141733*p)/vMt)),new u3(116*w-16,500*(m-w),200*(w-b),i.opacity)}function Pke(i,a,f,p){return arguments.length===1?xMt(i):new u3(i,a,f,p??1)}function u3(i,a,f,p){this.l=+i,this.a=+a,this.b=+f,this.opacity=+p}_P(u3,Pke,MU(U7,{brighter(i){return new u3(this.l+FU*(i??1),this.a,this.b,this.opacity)},darker(i){return new u3(this.l-FU*(i??1),this.a,this.b,this.opacity)},rgb(){var i=(this.l+16)/116,a=isNaN(this.a)?i:i+this.a/500,f=isNaN(this.b)?i:i-this.b/200;return a=bMt*l1t(a),i=wMt*l1t(i),f=vMt*l1t(f),new v0(h1t(3.1338561*a-1.6168667*i-.4906146*f),h1t(-.9787684*a+1.9161415*i+.033454*f),h1t(.0719453*a-.2289914*i+1.4052427*f),this.opacity)}}));function u1t(i){return i>Oke?Math.pow(i,1/3):i/yMt+mMt}function l1t(i){return i>TA?i*i*i:yMt*(i-mMt)}function h1t(i){return 255*(i<=.0031308?12.92*i:1.055*Math.pow(i,1/2.4)-.055)}function f1t(i){return(i/=255)<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4)}function Fke(i){if(i instanceof b5)return new b5(i.h,i.c,i.l,i.opacity);if(i instanceof u3||(i=xMt(i)),i.a===0&&i.b===0)return new b5(NaN,0()=>i;function EMt(i,a){return function(f){return i+f*a}}function Nke(i,a,f){return i=Math.pow(i,f),a=Math.pow(a,f)-i,f=1/f,function(p){return Math.pow(i+p*a,f)}}function Bke(i,a){var f=a-i;return f?EMt(i,f>180||f<-180?f-360*Math.round(f/360):f):NU(isNaN(i)?a:i)}function Rke(i){return(i=+i)==1?LP:function(a,f){return f-a?Nke(a,f,i):NU(isNaN(a)?f:a)}}function LP(i,a){var f=a-i;return f?EMt(i,f):NU(isNaN(i)?a:i)}const BU=function i(a){var f=Rke(a);function p(w,m){var b=f((w=o1t(w)).r,(m=o1t(m)).r),E=f(w.g,m.g),_=f(w.b,m.b),A=LP(w.opacity,m.opacity);return function(I){return w.r=b(I),w.g=E(I),w.b=_(I),w.opacity=A(I),w+""}}return p.gamma=i,p}(1);function jke(i,a){a||(a=[]);var f=i?Math.min(a.length,i.length):0,p=a.slice(),w;return function(m){for(w=0;wf&&(m=a.slice(f,m),E[b]?E[b]+=m:E[++b]=m),(p=p[0])===(w=w[0])?E[b]?E[b]+=w:E[++b]=w:(E[++b]=null,_.push({i:b,x:Qv(p,w)})),f=p1t.lastIndex;return f180?I+=360:I-A>180&&(A+=360),N.push({i:B.push(w(B)+"rotate(",null,p)-2,x:Qv(A,I)})):I&&B.push(w(B)+"rotate("+I+p)}function E(A,I,B,N){A!==I?N.push({i:B.push(w(B)+"skewX(",null,p)-2,x:Qv(A,I)}):I&&B.push(w(B)+"skewX("+I+p)}function _(A,I,B,N,R,z){if(A!==B||I!==N){var W=R.push(w(R)+"scale(",null,",",null,")");z.push({i:W-4,x:Qv(A,B)},{i:W-2,x:Qv(I,N)})}else(B!==1||N!==1)&&R.push(w(R)+"scale("+B+","+N+")")}return function(A,I){var B=[],N=[];return A=i(A),I=i(I),m(A.translateX,A.translateY,I.translateX,I.translateY,B,N),b(A.rotate,I.rotate,B,N),E(A.skewX,I.skewX,B,N),_(A.scaleX,A.scaleY,I.scaleX,I.scaleY,B,N),A=I=null,function(R){for(var z=-1,W=N.length,et;++z=0&&i._call.call(void 0,a),i=i._next;--CA}function DMt(){X7=($U=OP.now())+zU,CA=MP=0;try{t8e()}finally{CA=0,n8e(),X7=0}}function e8e(){var i=OP.now(),a=i-$U;a>AMt&&(zU-=a,$U=i)}function n8e(){for(var i,a=jU,f,p=1/0;a;)a._call?(p>a._time&&(p=a._time),i=a,a=a._next):(f=a._next,a._next=null,a=i?i._next=f:jU=f);IP=i,m1t(p)}function m1t(i){if(!CA){MP&&(MP=clearTimeout(MP));var a=i-X7;a>24?(i<1/0&&(MP=setTimeout(DMt,i-OP.now()-zU)),DP&&(DP=clearInterval(DP))):(DP||($U=OP.now(),DP=setInterval(e8e,AMt)),CA=1,LMt(DMt))}}function IMt(i,a,f){var p=new qU;return a=a==null?0:+a,p.restart(w=>{p.stop(),i(w+a)},a,f),p}var r8e=VLt("start","end","cancel","interrupt"),i8e=[],OMt=0,PMt=1,y1t=2,HU=3,FMt=4,x1t=5,VU=6;function GU(i,a,f,p,w,m){var b=i.__transition;if(!b)i.__transition={};else if(f in b)return;s8e(i,f,{name:a,index:p,group:w,on:r8e,tween:i8e,time:m.time,delay:m.delay,duration:m.duration,ease:m.ease,timer:null,state:OMt})}function k1t(i,a){var f=Zv(i,a);if(f.state>OMt)throw new Error("too late; already scheduled");return f}function l3(i,a){var f=Zv(i,a);if(f.state>HU)throw new Error("too late; already running");return f}function Zv(i,a){var f=i.__transition;if(!f||!(f=f[a]))throw new Error("transition not found");return f}function s8e(i,a,f){var p=i.__transition,w;p[a]=f,f.timer=MMt(m,0,f.time);function m(A){f.state=PMt,f.timer.restart(b,f.delay,f.time),f.delay<=A&&b(A-f.delay)}function b(A){var I,B,N,R;if(f.state!==PMt)return _();for(I in p)if(R=p[I],R.name===f.name){if(R.state===HU)return IMt(b);R.state===FMt?(R.state=VU,R.timer.stop(),R.on.call("interrupt",i,i.__data__,R.index,R.group),delete p[I]):+Iy1t&&p.state=0&&(a=a.slice(0,f)),!a||a==="start"})}function N8e(i,a,f){var p,w,m=F8e(a)?k1t:l3;return function(){var b=m(this,i),E=b.on;E!==p&&(w=(p=E).copy()).on(a,f),b.on=w}}function B8e(i,a){var f=this._id;return arguments.length<2?Zv(this.node(),f).on.on(i):this.each(N8e(f,i,a))}function R8e(i){return function(){var a=this.parentNode;for(var f in this.__transition)if(+f!==i)return;a&&a.removeChild(this)}}function j8e(){return this.on("end.remove",R8e(this._id))}function $8e(i){var a=this._name,f=this._id;typeof i!="function"&&(i=i1t(i));for(var p=this._groups,w=p.length,m=new Array(w),b=0;b=0))throw new Error(`invalid digits: ${i}`);if(a>15)return jMt;const f=10**a;return function(p){this._+=p[0];for(let w=1,m=p.length;wQ7)if(!(Math.abs(B*_-A*I)>Q7)||!m)this._append`L${this._x1=a},${this._y1=f}`;else{let R=p-b,z=w-E,W=_*_+A*A,et=R*R+z*z,st=Math.sqrt(W),at=Math.sqrt(N),bt=m*Math.tan((T1t-Math.acos((W+N-et)/(2*st*at)))/2),mt=bt/at,yt=bt/st;Math.abs(mt-1)>Q7&&this._append`L${a+mt*I},${f+mt*B}`,this._append`A${m},${m},0,0,${+(B*R>I*z)},${this._x1=a+yt*_},${this._y1=f+yt*A}`}}arc(a,f,p,w,m,b){if(a=+a,f=+f,p=+p,b=!!b,p<0)throw new Error(`negative radius: ${p}`);let E=p*Math.cos(w),_=p*Math.sin(w),A=a+E,I=f+_,B=1^b,N=b?w-m:m-w;this._x1===null?this._append`M${A},${I}`:(Math.abs(this._x1-A)>Q7||Math.abs(this._y1-I)>Q7)&&this._append`L${A},${I}`,p&&(N<0&&(N=N%C1t+C1t),N>hEe?this._append`A${p},${p},0,1,${B},${a-E},${f-_}A${p},${p},0,1,${B},${this._x1=A},${this._y1=I}`:N>Q7&&this._append`A${p},${p},0,${+(N>=T1t)},${B},${this._x1=a+p*Math.cos(m)},${this._y1=f+p*Math.sin(m)}`)}rect(a,f,p,w){this._append`M${this._x0=this._x1=+a},${this._y0=this._y1=+f}h${p=+p}v${+w}h${-p}Z`}toString(){return this._}};function gEe(i){if(!i.ok)throw new Error(i.status+" "+i.statusText);return i.text()}function pEe(i,a){return fetch(i,a).then(gEe)}function bEe(i){return(a,f)=>pEe(a,f).then(p=>new DOMParser().parseFromString(p,i))}var wEe=bEe("image/svg+xml");function vEe(i){return Math.abs(i=Math.round(i))>=1e21?i.toLocaleString("en").replace(/,/g,""):i.toString(10)}function UU(i,a){if((f=(i=a?i.toExponential(a-1):i.toExponential()).indexOf("e"))<0)return null;var f,p=i.slice(0,f);return[p.length>1?p[0]+p.slice(2):p,+i.slice(f+1)]}function _A(i){return i=UU(Math.abs(i)),i?i[1]:NaN}function mEe(i,a){return function(f,p){for(var w=f.length,m=[],b=0,E=i[0],_=0;w>0&&E>0&&(_+E+1>p&&(E=Math.max(1,p-_)),m.push(f.substring(w-=E,w+E)),!((_+=E+1)>p));)E=i[b=(b+1)%i.length];return m.reverse().join(a)}}function yEe(i){return function(a){return a.replace(/[0-9]/g,function(f){return i[+f]})}}var xEe=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function WU(i){if(!(a=xEe.exec(i)))throw new Error("invalid format: "+i);var a;return new _1t({fill:a[1],align:a[2],sign:a[3],symbol:a[4],zero:a[5],width:a[6],comma:a[7],precision:a[8]&&a[8].slice(1),trim:a[9],type:a[10]})}WU.prototype=_1t.prototype;function _1t(i){this.fill=i.fill===void 0?" ":i.fill+"",this.align=i.align===void 0?">":i.align+"",this.sign=i.sign===void 0?"-":i.sign+"",this.symbol=i.symbol===void 0?"":i.symbol+"",this.zero=!!i.zero,this.width=i.width===void 0?void 0:+i.width,this.comma=!!i.comma,this.precision=i.precision===void 0?void 0:+i.precision,this.trim=!!i.trim,this.type=i.type===void 0?"":i.type+""}_1t.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type};function kEe(i){t:for(var a=i.length,f=1,p=-1,w;f0&&(p=0);break}return p>0?i.slice(0,p)+i.slice(w+1):i}var $Mt;function EEe(i,a){var f=UU(i,a);if(!f)return i+"";var p=f[0],w=f[1],m=w-($Mt=Math.max(-8,Math.min(8,Math.floor(w/3)))*3)+1,b=p.length;return m===b?p:m>b?p+new Array(m-b+1).join("0"):m>0?p.slice(0,m)+"."+p.slice(m):"0."+new Array(1-m).join("0")+UU(i,Math.max(0,a+m-1))[0]}function zMt(i,a){var f=UU(i,a);if(!f)return i+"";var p=f[0],w=f[1];return w<0?"0."+new Array(-w).join("0")+p:p.length>w+1?p.slice(0,w+1)+"."+p.slice(w+1):p+new Array(w-p.length+2).join("0")}const qMt={"%":(i,a)=>(i*100).toFixed(a),b:i=>Math.round(i).toString(2),c:i=>i+"",d:vEe,e:(i,a)=>i.toExponential(a),f:(i,a)=>i.toFixed(a),g:(i,a)=>i.toPrecision(a),o:i=>Math.round(i).toString(8),p:(i,a)=>zMt(i*100,a),r:zMt,s:EEe,X:i=>Math.round(i).toString(16).toUpperCase(),x:i=>Math.round(i).toString(16)};function HMt(i){return i}var VMt=Array.prototype.map,GMt=["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];function TEe(i){var a=i.grouping===void 0||i.thousands===void 0?HMt:mEe(VMt.call(i.grouping,Number),i.thousands+""),f=i.currency===void 0?"":i.currency[0]+"",p=i.currency===void 0?"":i.currency[1]+"",w=i.decimal===void 0?".":i.decimal+"",m=i.numerals===void 0?HMt:yEe(VMt.call(i.numerals,String)),b=i.percent===void 0?"%":i.percent+"",E=i.minus===void 0?"−":i.minus+"",_=i.nan===void 0?"NaN":i.nan+"";function A(B){B=WU(B);var N=B.fill,R=B.align,z=B.sign,W=B.symbol,et=B.zero,st=B.width,at=B.comma,bt=B.precision,mt=B.trim,yt=B.type;yt==="n"?(at=!0,yt="g"):qMt[yt]||(bt===void 0&&(bt=12),mt=!0,yt="g"),(et||N==="0"&&R==="=")&&(et=!0,N="0",R="=");var ft=W==="$"?f:W==="#"&&/[boxX]/.test(yt)?"0"+yt.toLowerCase():"",ut=W==="$"?p:/[%p]/.test(yt)?b:"",vt=qMt[yt],X=/[defgprs%]/.test(yt);bt=bt===void 0?6:/[gprs]/.test(yt)?Math.max(1,Math.min(21,bt)):Math.max(0,Math.min(20,bt));function pt(U){var Tt=ft,nt=ut,It,Ot,Bt;if(yt==="c")nt=vt(U)+nt,U="";else{U=+U;var Et=U<0||1/U<0;if(U=isNaN(U)?_:vt(Math.abs(U),bt),mt&&(U=kEe(U)),Et&&+U==0&&z!=="+"&&(Et=!1),Tt=(Et?z==="("?z:E:z==="-"||z==="("?"":z)+Tt,nt=(yt==="s"?GMt[8+$Mt/3]:"")+nt+(Et&&z==="("?")":""),X){for(It=-1,Ot=U.length;++ItBt||Bt>57){nt=(Bt===46?w+U.slice(It+1):U.slice(It))+nt,U=U.slice(0,It);break}}}at&&!et&&(U=a(U,1/0));var Z=Tt.length+U.length+nt.length,Ct=Z>1)+Tt+U+nt+Ct.slice(Z);break;default:U=Ct+Tt+U+nt;break}return m(U)}return pt.toString=function(){return B+""},pt}function I(B,N){var R=A((B=WU(B),B.type="f",B)),z=Math.max(-8,Math.min(8,Math.floor(_A(N)/3)))*3,W=Math.pow(10,-z),et=GMt[8+z/3];return function(st){return R(W*st)+et}}return{format:A,formatPrefix:I}}var YU,UMt,WMt;CEe({thousands:",",grouping:[3],currency:["$",""]});function CEe(i){return YU=TEe(i),UMt=YU.format,WMt=YU.formatPrefix,YU}function _Ee(i){return Math.max(0,-_A(Math.abs(i)))}function SEe(i,a){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(_A(a)/3)))*3-_A(Math.abs(i)))}function AEe(i,a){return i=Math.abs(i),a=Math.abs(a)-i,Math.max(0,_A(a)-_A(i))+1}function KU(i,a){switch(arguments.length){case 0:break;case 1:this.range(i);break;default:this.range(a).domain(i);break}return this}const YMt=Symbol("implicit");function XU(){var i=new $Lt,a=[],f=[],p=YMt;function w(m){let b=i.get(m);if(b===void 0){if(p!==YMt)return p;i.set(m,b=a.push(m)-1)}return f[b%f.length]}return w.domain=function(m){if(!arguments.length)return a.slice();a=[],i=new $Lt;for(const b of m)i.has(b)||i.set(b,a.push(b)-1);return w},w.range=function(m){return arguments.length?(f=Array.from(m),w):f.slice()},w.unknown=function(m){return arguments.length?(p=m,w):p},w.copy=function(){return XU(a,f).unknown(p)},KU.apply(w,arguments),w}function S1t(){var i=XU().unknown(void 0),a=i.domain,f=i.range,p=0,w=1,m,b,E=!1,_=0,A=0,I=.5;delete i.unknown;function B(){var N=a().length,R=wa&&(f=i,i=a,a=f),function(p){return Math.max(i,Math.min(a,p))}}function IEe(i,a,f){var p=i[0],w=i[1],m=a[0],b=a[1];return w2?OEe:IEe,_=A=null,B}function B(N){return N==null||isNaN(N=+N)?m:(_||(_=E(i.map(p),a,f)))(p(b(N)))}return B.invert=function(N){return b(w((A||(A=E(a,i.map(p),Qv)))(N)))},B.domain=function(N){return arguments.length?(i=Array.from(N,MEe),I()):i.slice()},B.range=function(N){return arguments.length?(a=Array.from(N),I()):a.slice()},B.rangeRound=function(N){return a=Array.from(N),f=Uke,I()},B.clamp=function(N){return arguments.length?(b=N?!0:SA,I()):b!==SA},B.interpolate=function(N){return arguments.length?(f=N,I()):f},B.unknown=function(N){return arguments.length?(m=N,B):m},function(N,R){return p=N,w=R,I()}}function QMt(){return PEe()(SA,SA)}function FEe(i,a,f,p){var w=t1t(i,a,f),m;switch(p=WU(p??",f"),p.type){case"s":{var b=Math.max(Math.abs(i),Math.abs(a));return p.precision==null&&!isNaN(m=SEe(w,b))&&(p.precision=m),WMt(p,b)}case"":case"e":case"g":case"p":case"r":{p.precision==null&&!isNaN(m=AEe(w,Math.max(Math.abs(i),Math.abs(a))))&&(p.precision=m-(p.type==="e"));break}case"f":case"%":{p.precision==null&&!isNaN(m=_Ee(w))&&(p.precision=m-(p.type==="%")*2);break}}return UMt(p)}function NEe(i){var a=i.domain;return i.ticks=function(f){var p=a();return Axe(p[0],p[p.length-1],f??10)},i.tickFormat=function(f,p){var w=a();return FEe(w[0],w[w.length-1],f??10,p)},i.nice=function(f){f==null&&(f=10);var p=a(),w=0,m=p.length-1,b=p[w],E=p[m],_,A,I=10;for(E0;){if(A=Jft(b,E,f),A===_)return p[w]=b,p[m]=E,a(p);if(A>0)b=Math.floor(b/A)*A,E=Math.ceil(E/A)*A;else if(A<0)b=Math.ceil(b*A)/A,E=Math.floor(E*A)/A;else break;_=A}return i},i}function AA(){var i=QMt();return i.copy=function(){return XMt(i,AA())},KU.apply(i,arguments),NEe(i)}function BEe(i,a){i=i.slice();var f=0,p=i.length-1,w=i[f],m=i[p],b;return m(i(m=new Date(+m)),m),w.ceil=m=>(i(m=new Date(m-1)),a(m,1),i(m),m),w.round=m=>{const b=w(m),E=w.ceil(m);return m-b(a(m=new Date(+m),b==null?1:Math.floor(b)),m),w.range=(m,b,E)=>{const _=[];if(m=w.ceil(m),E=E==null?1:Math.floor(E),!(m0))return _;let A;do _.push(A=new Date(+m)),a(m,E),i(m);while(Aa1(b=>{if(b>=b)for(;i(b),!m(b);)b.setTime(b-1)},(b,E)=>{if(b>=b)if(E<0)for(;++E<=0;)for(;a(b,-1),!m(b););else for(;--E>=0;)for(;a(b,1),!m(b););}),f&&(w.count=(m,b)=>(L1t.setTime(+m),M1t.setTime(+b),i(L1t),i(M1t),Math.floor(f(L1t,M1t))),w.every=m=>(m=Math.floor(m),!isFinite(m)||!(m>0)?null:m>1?w.filter(p?b=>p(b)%m===0:b=>w.count(0,b)%m===0):w)),w}const LA=a1(()=>{},(i,a)=>{i.setTime(+i+a)},(i,a)=>a-i);LA.every=i=>(i=Math.floor(i),!isFinite(i)||!(i>0)?null:i>1?a1(a=>{a.setTime(Math.floor(a/i)*i)},(a,f)=>{a.setTime(+a+f*i)},(a,f)=>(f-a)/i):LA),LA.range;const m5=1e3,Z2=m5*60,y5=Z2*60,x5=y5*24,D1t=x5*7,ZMt=x5*30,I1t=x5*365,sk=a1(i=>{i.setTime(i-i.getMilliseconds())},(i,a)=>{i.setTime(+i+a*m5)},(i,a)=>(a-i)/m5,i=>i.getUTCSeconds());sk.range;const PP=a1(i=>{i.setTime(i-i.getMilliseconds()-i.getSeconds()*m5)},(i,a)=>{i.setTime(+i+a*Z2)},(i,a)=>(a-i)/Z2,i=>i.getMinutes());PP.range,a1(i=>{i.setUTCSeconds(0,0)},(i,a)=>{i.setTime(+i+a*Z2)},(i,a)=>(a-i)/Z2,i=>i.getUTCMinutes()).range;const FP=a1(i=>{i.setTime(i-i.getMilliseconds()-i.getSeconds()*m5-i.getMinutes()*Z2)},(i,a)=>{i.setTime(+i+a*y5)},(i,a)=>(a-i)/y5,i=>i.getHours());FP.range,a1(i=>{i.setUTCMinutes(0,0,0)},(i,a)=>{i.setTime(+i+a*y5)},(i,a)=>(a-i)/y5,i=>i.getUTCHours()).range;const Z7=a1(i=>i.setHours(0,0,0,0),(i,a)=>i.setDate(i.getDate()+a),(i,a)=>(a-i-(a.getTimezoneOffset()-i.getTimezoneOffset())*Z2)/x5,i=>i.getDate()-1);Z7.range;const O1t=a1(i=>{i.setUTCHours(0,0,0,0)},(i,a)=>{i.setUTCDate(i.getUTCDate()+a)},(i,a)=>(a-i)/x5,i=>i.getUTCDate()-1);O1t.range,a1(i=>{i.setUTCHours(0,0,0,0)},(i,a)=>{i.setUTCDate(i.getUTCDate()+a)},(i,a)=>(a-i)/x5,i=>Math.floor(i/x5)).range;function J7(i){return a1(a=>{a.setDate(a.getDate()-(a.getDay()+7-i)%7),a.setHours(0,0,0,0)},(a,f)=>{a.setDate(a.getDate()+f*7)},(a,f)=>(f-a-(f.getTimezoneOffset()-a.getTimezoneOffset())*Z2)/D1t)}const NP=J7(0),BP=J7(1),JMt=J7(2),tDt=J7(3),tT=J7(4),eDt=J7(5),nDt=J7(6);NP.range,BP.range,JMt.range,tDt.range,tT.range,eDt.range,nDt.range;function eT(i){return a1(a=>{a.setUTCDate(a.getUTCDate()-(a.getUTCDay()+7-i)%7),a.setUTCHours(0,0,0,0)},(a,f)=>{a.setUTCDate(a.getUTCDate()+f*7)},(a,f)=>(f-a)/D1t)}const rDt=eT(0),QU=eT(1),REe=eT(2),jEe=eT(3),MA=eT(4),$Ee=eT(5),zEe=eT(6);rDt.range,QU.range,REe.range,jEe.range,MA.range,$Ee.range,zEe.range;const RP=a1(i=>{i.setDate(1),i.setHours(0,0,0,0)},(i,a)=>{i.setMonth(i.getMonth()+a)},(i,a)=>a.getMonth()-i.getMonth()+(a.getFullYear()-i.getFullYear())*12,i=>i.getMonth());RP.range,a1(i=>{i.setUTCDate(1),i.setUTCHours(0,0,0,0)},(i,a)=>{i.setUTCMonth(i.getUTCMonth()+a)},(i,a)=>a.getUTCMonth()-i.getUTCMonth()+(a.getUTCFullYear()-i.getUTCFullYear())*12,i=>i.getUTCMonth()).range;const k5=a1(i=>{i.setMonth(0,1),i.setHours(0,0,0,0)},(i,a)=>{i.setFullYear(i.getFullYear()+a)},(i,a)=>a.getFullYear()-i.getFullYear(),i=>i.getFullYear());k5.every=i=>!isFinite(i=Math.floor(i))||!(i>0)?null:a1(a=>{a.setFullYear(Math.floor(a.getFullYear()/i)*i),a.setMonth(0,1),a.setHours(0,0,0,0)},(a,f)=>{a.setFullYear(a.getFullYear()+f*i)}),k5.range;const nT=a1(i=>{i.setUTCMonth(0,1),i.setUTCHours(0,0,0,0)},(i,a)=>{i.setUTCFullYear(i.getUTCFullYear()+a)},(i,a)=>a.getUTCFullYear()-i.getUTCFullYear(),i=>i.getUTCFullYear());nT.every=i=>!isFinite(i=Math.floor(i))||!(i>0)?null:a1(a=>{a.setUTCFullYear(Math.floor(a.getUTCFullYear()/i)*i),a.setUTCMonth(0,1),a.setUTCHours(0,0,0,0)},(a,f)=>{a.setUTCFullYear(a.getUTCFullYear()+f*i)}),nT.range;function qEe(i,a,f,p,w,m){const b=[[sk,1,m5],[sk,5,5*m5],[sk,15,15*m5],[sk,30,30*m5],[m,1,Z2],[m,5,5*Z2],[m,15,15*Z2],[m,30,30*Z2],[w,1,y5],[w,3,3*y5],[w,6,6*y5],[w,12,12*y5],[p,1,x5],[p,2,2*x5],[f,1,D1t],[a,1,ZMt],[a,3,3*ZMt],[i,1,I1t]];function E(A,I,B){const N=Iet).right(b,N);if(R===b.length)return i.every(t1t(A/I1t,I/I1t,B));if(R===0)return LA.every(Math.max(t1t(A,I,B),1));const[z,W]=b[N/b[R-1][2]53)return null;"w"in re||(re.w=1),"Z"in re?(Pe=F1t(jP(re.y,0,1)),te=Pe.getUTCDay(),Pe=te>4||te===0?QU.ceil(Pe):QU(Pe),Pe=O1t.offset(Pe,(re.V-1)*7),re.y=Pe.getUTCFullYear(),re.m=Pe.getUTCMonth(),re.d=Pe.getUTCDate()+(re.w+6)%7):(Pe=P1t(jP(re.y,0,1)),te=Pe.getDay(),Pe=te>4||te===0?BP.ceil(Pe):BP(Pe),Pe=Z7.offset(Pe,(re.V-1)*7),re.y=Pe.getFullYear(),re.m=Pe.getMonth(),re.d=Pe.getDate()+(re.w+6)%7)}else("W"in re||"U"in re)&&("w"in re||(re.w="u"in re?re.u%7:"W"in re?1:0),te="Z"in re?F1t(jP(re.y,0,1)).getUTCDay():P1t(jP(re.y,0,1)).getDay(),re.m=0,re.d="W"in re?(re.w+6)%7+re.W*7-(te+5)%7:re.w+re.U*7-(te+6)%7);return"Z"in re?(re.H+=re.Z/100|0,re.M+=re.Z%100,F1t(re)):P1t(re)}}function vt(ce,ke,zt,re){for(var se=0,Pe=ke.length,te=zt.length,Me,de;se=te)return-1;if(Me=ke.charCodeAt(se++),Me===37){if(Me=ke.charAt(se++),de=yt[Me in iDt?ke.charAt(se++):Me],!de||(re=de(ce,zt,re))<0)return-1}else if(Me!=zt.charCodeAt(re++))return-1}return re}function X(ce,ke,zt){var re=A.exec(ke.slice(zt));return re?(ce.p=I.get(re[0].toLowerCase()),zt+re[0].length):-1}function pt(ce,ke,zt){var re=R.exec(ke.slice(zt));return re?(ce.w=z.get(re[0].toLowerCase()),zt+re[0].length):-1}function U(ce,ke,zt){var re=B.exec(ke.slice(zt));return re?(ce.w=N.get(re[0].toLowerCase()),zt+re[0].length):-1}function Tt(ce,ke,zt){var re=st.exec(ke.slice(zt));return re?(ce.m=at.get(re[0].toLowerCase()),zt+re[0].length):-1}function nt(ce,ke,zt){var re=W.exec(ke.slice(zt));return re?(ce.m=et.get(re[0].toLowerCase()),zt+re[0].length):-1}function It(ce,ke,zt){return vt(ce,a,ke,zt)}function Ot(ce,ke,zt){return vt(ce,f,ke,zt)}function Bt(ce,ke,zt){return vt(ce,p,ke,zt)}function Et(ce){return b[ce.getDay()]}function Z(ce){return m[ce.getDay()]}function Ct(ce){return _[ce.getMonth()]}function xt(ce){return E[ce.getMonth()]}function Ht(ce){return w[+(ce.getHours()>=12)]}function Le(ce){return 1+~~(ce.getMonth()/3)}function Ft(ce){return b[ce.getUTCDay()]}function gn(ce){return m[ce.getUTCDay()]}function Se(ce){return _[ce.getUTCMonth()]}function me(ce){return E[ce.getUTCMonth()]}function Ve(ce){return w[+(ce.getUTCHours()>=12)]}function Ye(ce){return 1+~~(ce.getUTCMonth()/3)}return{format:function(ce){var ke=ft(ce+="",bt);return ke.toString=function(){return ce},ke},parse:function(ce){var ke=ut(ce+="",!1);return ke.toString=function(){return ce},ke},utcFormat:function(ce){var ke=ft(ce+="",mt);return ke.toString=function(){return ce},ke},utcParse:function(ce){var ke=ut(ce+="",!0);return ke.toString=function(){return ce},ke}}}var iDt={"-":"",_:" ",0:"0"},X1=/^\s*\d+/,UEe=/^%/,WEe=/[\\^$*+?|[\]().{}]/g;function Ic(i,a,f){var p=i<0?"-":"",w=(p?-i:i)+"",m=w.length;return p+(m[a.toLowerCase(),f]))}function KEe(i,a,f){var p=X1.exec(a.slice(f,f+1));return p?(i.w=+p[0],f+p[0].length):-1}function XEe(i,a,f){var p=X1.exec(a.slice(f,f+1));return p?(i.u=+p[0],f+p[0].length):-1}function QEe(i,a,f){var p=X1.exec(a.slice(f,f+2));return p?(i.U=+p[0],f+p[0].length):-1}function ZEe(i,a,f){var p=X1.exec(a.slice(f,f+2));return p?(i.V=+p[0],f+p[0].length):-1}function JEe(i,a,f){var p=X1.exec(a.slice(f,f+2));return p?(i.W=+p[0],f+p[0].length):-1}function sDt(i,a,f){var p=X1.exec(a.slice(f,f+4));return p?(i.y=+p[0],f+p[0].length):-1}function aDt(i,a,f){var p=X1.exec(a.slice(f,f+2));return p?(i.y=+p[0]+(+p[0]>68?1900:2e3),f+p[0].length):-1}function t7e(i,a,f){var p=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(a.slice(f,f+6));return p?(i.Z=p[1]?0:-(p[2]+(p[3]||"00")),f+p[0].length):-1}function e7e(i,a,f){var p=X1.exec(a.slice(f,f+1));return p?(i.q=p[0]*3-3,f+p[0].length):-1}function n7e(i,a,f){var p=X1.exec(a.slice(f,f+2));return p?(i.m=p[0]-1,f+p[0].length):-1}function oDt(i,a,f){var p=X1.exec(a.slice(f,f+2));return p?(i.d=+p[0],f+p[0].length):-1}function r7e(i,a,f){var p=X1.exec(a.slice(f,f+3));return p?(i.m=0,i.d=+p[0],f+p[0].length):-1}function cDt(i,a,f){var p=X1.exec(a.slice(f,f+2));return p?(i.H=+p[0],f+p[0].length):-1}function i7e(i,a,f){var p=X1.exec(a.slice(f,f+2));return p?(i.M=+p[0],f+p[0].length):-1}function s7e(i,a,f){var p=X1.exec(a.slice(f,f+2));return p?(i.S=+p[0],f+p[0].length):-1}function a7e(i,a,f){var p=X1.exec(a.slice(f,f+3));return p?(i.L=+p[0],f+p[0].length):-1}function o7e(i,a,f){var p=X1.exec(a.slice(f,f+6));return p?(i.L=Math.floor(p[0]/1e3),f+p[0].length):-1}function c7e(i,a,f){var p=UEe.exec(a.slice(f,f+1));return p?f+p[0].length:-1}function u7e(i,a,f){var p=X1.exec(a.slice(f));return p?(i.Q=+p[0],f+p[0].length):-1}function l7e(i,a,f){var p=X1.exec(a.slice(f));return p?(i.s=+p[0],f+p[0].length):-1}function uDt(i,a){return Ic(i.getDate(),a,2)}function h7e(i,a){return Ic(i.getHours(),a,2)}function f7e(i,a){return Ic(i.getHours()%12||12,a,2)}function d7e(i,a){return Ic(1+Z7.count(k5(i),i),a,3)}function lDt(i,a){return Ic(i.getMilliseconds(),a,3)}function g7e(i,a){return lDt(i,a)+"000"}function p7e(i,a){return Ic(i.getMonth()+1,a,2)}function b7e(i,a){return Ic(i.getMinutes(),a,2)}function w7e(i,a){return Ic(i.getSeconds(),a,2)}function v7e(i){var a=i.getDay();return a===0?7:a}function m7e(i,a){return Ic(NP.count(k5(i)-1,i),a,2)}function hDt(i){var a=i.getDay();return a>=4||a===0?tT(i):tT.ceil(i)}function y7e(i,a){return i=hDt(i),Ic(tT.count(k5(i),i)+(k5(i).getDay()===4),a,2)}function x7e(i){return i.getDay()}function k7e(i,a){return Ic(BP.count(k5(i)-1,i),a,2)}function E7e(i,a){return Ic(i.getFullYear()%100,a,2)}function T7e(i,a){return i=hDt(i),Ic(i.getFullYear()%100,a,2)}function C7e(i,a){return Ic(i.getFullYear()%1e4,a,4)}function _7e(i,a){var f=i.getDay();return i=f>=4||f===0?tT(i):tT.ceil(i),Ic(i.getFullYear()%1e4,a,4)}function S7e(i){var a=i.getTimezoneOffset();return(a>0?"-":(a*=-1,"+"))+Ic(a/60|0,"0",2)+Ic(a%60,"0",2)}function fDt(i,a){return Ic(i.getUTCDate(),a,2)}function A7e(i,a){return Ic(i.getUTCHours(),a,2)}function L7e(i,a){return Ic(i.getUTCHours()%12||12,a,2)}function M7e(i,a){return Ic(1+O1t.count(nT(i),i),a,3)}function dDt(i,a){return Ic(i.getUTCMilliseconds(),a,3)}function D7e(i,a){return dDt(i,a)+"000"}function I7e(i,a){return Ic(i.getUTCMonth()+1,a,2)}function O7e(i,a){return Ic(i.getUTCMinutes(),a,2)}function P7e(i,a){return Ic(i.getUTCSeconds(),a,2)}function F7e(i){var a=i.getUTCDay();return a===0?7:a}function N7e(i,a){return Ic(rDt.count(nT(i)-1,i),a,2)}function gDt(i){var a=i.getUTCDay();return a>=4||a===0?MA(i):MA.ceil(i)}function B7e(i,a){return i=gDt(i),Ic(MA.count(nT(i),i)+(nT(i).getUTCDay()===4),a,2)}function R7e(i){return i.getUTCDay()}function j7e(i,a){return Ic(QU.count(nT(i)-1,i),a,2)}function $7e(i,a){return Ic(i.getUTCFullYear()%100,a,2)}function z7e(i,a){return i=gDt(i),Ic(i.getUTCFullYear()%100,a,2)}function q7e(i,a){return Ic(i.getUTCFullYear()%1e4,a,4)}function H7e(i,a){var f=i.getUTCDay();return i=f>=4||f===0?MA(i):MA.ceil(i),Ic(i.getUTCFullYear()%1e4,a,4)}function V7e(){return"+0000"}function pDt(){return"%"}function bDt(i){return+i}function wDt(i){return Math.floor(+i/1e3)}var DA,ZU;G7e({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function G7e(i){return DA=GEe(i),ZU=DA.format,DA.parse,DA.utcFormat,DA.utcParse,DA}function U7e(i){return new Date(i)}function W7e(i){return i instanceof Date?+i:+new Date(+i)}function vDt(i,a,f,p,w,m,b,E,_,A){var I=QMt(),B=I.invert,N=I.domain,R=A(".%L"),z=A(":%S"),W=A("%I:%M"),et=A("%I %p"),st=A("%a %d"),at=A("%b %d"),bt=A("%B"),mt=A("%Y");function yt(ft){return(_(ft)1?0:i<-1?qP:Math.acos(i)}function yDt(i){return i>=1?JU:i<=-1?-JU:Math.asin(i)}function xDt(i){let a=3;return i.digits=function(f){if(!arguments.length)return a;if(f==null)a=null;else{const p=Math.floor(f);if(!(p>=0))throw new RangeError(`invalid digits: ${f}`);a=p}return i},()=>new dEe(a)}function J7e(i){return i.innerRadius}function tTe(i){return i.outerRadius}function eTe(i){return i.startAngle}function nTe(i){return i.endAngle}function rTe(i){return i&&i.padAngle}function iTe(i,a,f,p,w,m,b,E){var _=f-i,A=p-a,I=b-w,B=E-m,N=B*_-I*A;if(!(N*NIt*It+Ot*Ot&&(vt=pt,X=U),{cx:vt,cy:X,x01:-I,y01:-B,x11:vt*(w/yt-1),y11:X*(w/yt-1)}}function OA(){var i=J7e,a=tTe,f=Qh(0),p=null,w=eTe,m=nTe,b=rTe,E=null,_=xDt(A);function A(){var I,B,N=+i.apply(this,arguments),R=+a.apply(this,arguments),z=w.apply(this,arguments)-JU,W=m.apply(this,arguments)-JU,et=mDt(W-z),st=W>z;if(E||(E=I=_()),Ry0))E.moveTo(0,0);else if(et>tW-y0)E.moveTo(R*rT(z),R*h3(z)),E.arc(0,0,R,z,W,!st),N>y0&&(E.moveTo(N*rT(W),N*h3(W)),E.arc(0,0,N,W,z,st));else{var at=z,bt=W,mt=z,yt=W,ft=et,ut=et,vt=b.apply(this,arguments)/2,X=vt>y0&&(p?+p.apply(this,arguments):IA(N*N+R*R)),pt=N1t(mDt(R-N)/2,+f.apply(this,arguments)),U=pt,Tt=pt,nt,It;if(X>y0){var Ot=yDt(X/N*h3(vt)),Bt=yDt(X/R*h3(vt));(ft-=Ot*2)>y0?(Ot*=st?1:-1,mt+=Ot,yt-=Ot):(ft=0,mt=yt=(z+W)/2),(ut-=Bt*2)>y0?(Bt*=st?1:-1,at+=Bt,bt-=Bt):(ut=0,at=bt=(z+W)/2)}var Et=R*rT(at),Z=R*h3(at),Ct=N*rT(yt),xt=N*h3(yt);if(pt>y0){var Ht=R*rT(bt),Le=R*h3(bt),Ft=N*rT(mt),gn=N*h3(mt),Se;if(ety0?Tt>y0?(nt=eW(Ft,gn,Et,Z,R,Tt,st),It=eW(Ht,Le,Ct,xt,R,Tt,st),E.moveTo(nt.cx+nt.x01,nt.cy+nt.y01),Tty0)||!(ft>y0)?E.lineTo(Ct,xt):U>y0?(nt=eW(Ct,xt,Ht,Le,N,-U,st),It=eW(Et,Z,Ft,gn,N,-U,st),E.lineTo(nt.cx+nt.x01,nt.cy+nt.y01),Ui?1:a>=i?0:NaN}function cTe(i){return i}function uTe(){var i=cTe,a=oTe,f=null,p=Qh(0),w=Qh(tW),m=Qh(0);function b(E){var _,A=(E=kDt(E)).length,I,B,N=0,R=new Array(A),z=new Array(A),W=+p.apply(this,arguments),et=Math.min(tW,Math.max(-tW,w.apply(this,arguments)-W)),st,at=Math.min(Math.abs(et)/A,m.apply(this,arguments)),bt=at*(et<0?-1:1),mt;for(_=0;_0&&(N+=mt);for(a!=null?R.sort(function(yt,ft){return a(z[yt],z[ft])}):f!=null&&R.sort(function(yt,ft){return f(E[yt],E[ft])}),_=0,B=N?(et-A*bt)/N:0;_0?mt*B:0)+bt,z[I]={data:E[I],index:_,value:mt,startAngle:W,endAngle:st,padAngle:at};return z}return b.value=function(E){return arguments.length?(i=typeof E=="function"?E:Qh(+E),b):i},b.sortValues=function(E){return arguments.length?(a=E,f=null,b):a},b.sort=function(E){return arguments.length?(f=E,a=null,b):f},b.startAngle=function(E){return arguments.length?(p=typeof E=="function"?E:Qh(+E),b):p},b.endAngle=function(E){return arguments.length?(w=typeof E=="function"?E:Qh(+E),b):w},b.padAngle=function(E){return arguments.length?(m=typeof E=="function"?E:Qh(+E),b):m},b}class TDt{constructor(a,f){this._context=a,this._x=f}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(a,f){switch(a=+a,f=+f,this._point){case 0:{this._point=1,this._line?this._context.lineTo(a,f):this._context.moveTo(a,f);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+a)/2,this._y0,this._x0,f,a,f):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+f)/2,a,this._y0,a,f);break}}this._x0=a,this._y0=f}}function lTe(i){return new TDt(i,!0)}function hTe(i){return new TDt(i,!1)}function ak(){}function nW(i,a,f){i._context.bezierCurveTo((2*i._x0+i._x1)/3,(2*i._y0+i._y1)/3,(i._x0+2*i._x1)/3,(i._y0+2*i._y1)/3,(i._x0+4*i._x1+a)/6,(i._y0+4*i._y1+f)/6)}function rW(i){this._context=i}rW.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:nW(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(i,a){switch(i=+i,a=+a,this._point){case 0:this._point=1,this._line?this._context.lineTo(i,a):this._context.moveTo(i,a);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:nW(this,i,a);break}this._x0=this._x1,this._x1=i,this._y0=this._y1,this._y1=a}};function HP(i){return new rW(i)}function CDt(i){this._context=i}CDt.prototype={areaStart:ak,areaEnd:ak,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(i,a){switch(i=+i,a=+a,this._point){case 0:this._point=1,this._x2=i,this._y2=a;break;case 1:this._point=2,this._x3=i,this._y3=a;break;case 2:this._point=3,this._x4=i,this._y4=a,this._context.moveTo((this._x0+4*this._x1+i)/6,(this._y0+4*this._y1+a)/6);break;default:nW(this,i,a);break}this._x0=this._x1,this._x1=i,this._y0=this._y1,this._y1=a}};function fTe(i){return new CDt(i)}function _Dt(i){this._context=i}_Dt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(i,a){switch(i=+i,a=+a,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var f=(this._x0+4*this._x1+i)/6,p=(this._y0+4*this._y1+a)/6;this._line?this._context.lineTo(f,p):this._context.moveTo(f,p);break;case 3:this._point=4;default:nW(this,i,a);break}this._x0=this._x1,this._x1=i,this._y0=this._y1,this._y1=a}};function dTe(i){return new _Dt(i)}function SDt(i,a){this._basis=new rW(i),this._beta=a}SDt.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var i=this._x,a=this._y,f=i.length-1;if(f>0)for(var p=i[0],w=a[0],m=i[f]-p,b=a[f]-w,E=-1,_;++E<=f;)_=E/f,this._basis.point(this._beta*i[E]+(1-this._beta)*(p+_*m),this._beta*a[E]+(1-this._beta)*(w+_*b));this._x=this._y=null,this._basis.lineEnd()},point:function(i,a){this._x.push(+i),this._y.push(+a)}};const gTe=function i(a){function f(p){return a===1?new rW(p):new SDt(p,a)}return f.beta=function(p){return i(+p)},f}(.85);function iW(i,a,f){i._context.bezierCurveTo(i._x1+i._k*(i._x2-i._x0),i._y1+i._k*(i._y2-i._y0),i._x2+i._k*(i._x1-a),i._y2+i._k*(i._y1-f),i._x2,i._y2)}function B1t(i,a){this._context=i,this._k=(1-a)/6}B1t.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:iW(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(i,a){switch(i=+i,a=+a,this._point){case 0:this._point=1,this._line?this._context.lineTo(i,a):this._context.moveTo(i,a);break;case 1:this._point=2,this._x1=i,this._y1=a;break;case 2:this._point=3;default:iW(this,i,a);break}this._x0=this._x1,this._x1=this._x2,this._x2=i,this._y0=this._y1,this._y1=this._y2,this._y2=a}};const pTe=function i(a){function f(p){return new B1t(p,a)}return f.tension=function(p){return i(+p)},f}(0);function R1t(i,a){this._context=i,this._k=(1-a)/6}R1t.prototype={areaStart:ak,areaEnd:ak,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},point:function(i,a){switch(i=+i,a=+a,this._point){case 0:this._point=1,this._x3=i,this._y3=a;break;case 1:this._point=2,this._context.moveTo(this._x4=i,this._y4=a);break;case 2:this._point=3,this._x5=i,this._y5=a;break;default:iW(this,i,a);break}this._x0=this._x1,this._x1=this._x2,this._x2=i,this._y0=this._y1,this._y1=this._y2,this._y2=a}};const bTe=function i(a){function f(p){return new R1t(p,a)}return f.tension=function(p){return i(+p)},f}(0);function j1t(i,a){this._context=i,this._k=(1-a)/6}j1t.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(i,a){switch(i=+i,a=+a,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:iW(this,i,a);break}this._x0=this._x1,this._x1=this._x2,this._x2=i,this._y0=this._y1,this._y1=this._y2,this._y2=a}};const wTe=function i(a){function f(p){return new j1t(p,a)}return f.tension=function(p){return i(+p)},f}(0);function $1t(i,a,f){var p=i._x1,w=i._y1,m=i._x2,b=i._y2;if(i._l01_a>y0){var E=2*i._l01_2a+3*i._l01_a*i._l12_a+i._l12_2a,_=3*i._l01_a*(i._l01_a+i._l12_a);p=(p*E-i._x0*i._l12_2a+i._x2*i._l01_2a)/_,w=(w*E-i._y0*i._l12_2a+i._y2*i._l01_2a)/_}if(i._l23_a>y0){var A=2*i._l23_2a+3*i._l23_a*i._l12_a+i._l12_2a,I=3*i._l23_a*(i._l23_a+i._l12_a);m=(m*A+i._x1*i._l23_2a-a*i._l12_2a)/I,b=(b*A+i._y1*i._l23_2a-f*i._l12_2a)/I}i._context.bezierCurveTo(p,w,m,b,i._x2,i._y2)}function ADt(i,a){this._context=i,this._alpha=a}ADt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(i,a){if(i=+i,a=+a,this._point){var f=this._x2-i,p=this._y2-a;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(f*f+p*p,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(i,a):this._context.moveTo(i,a);break;case 1:this._point=2;break;case 2:this._point=3;default:$1t(this,i,a);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=i,this._y0=this._y1,this._y1=this._y2,this._y2=a}};const vTe=function i(a){function f(p){return a?new ADt(p,a):new B1t(p,0)}return f.alpha=function(p){return i(+p)},f}(.5);function LDt(i,a){this._context=i,this._alpha=a}LDt.prototype={areaStart:ak,areaEnd:ak,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},point:function(i,a){if(i=+i,a=+a,this._point){var f=this._x2-i,p=this._y2-a;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(f*f+p*p,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=i,this._y3=a;break;case 1:this._point=2,this._context.moveTo(this._x4=i,this._y4=a);break;case 2:this._point=3,this._x5=i,this._y5=a;break;default:$1t(this,i,a);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=i,this._y0=this._y1,this._y1=this._y2,this._y2=a}};const mTe=function i(a){function f(p){return a?new LDt(p,a):new R1t(p,0)}return f.alpha=function(p){return i(+p)},f}(.5);function MDt(i,a){this._context=i,this._alpha=a}MDt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(i,a){if(i=+i,a=+a,this._point){var f=this._x2-i,p=this._y2-a;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(f*f+p*p,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:$1t(this,i,a);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=i,this._y0=this._y1,this._y1=this._y2,this._y2=a}};const yTe=function i(a){function f(p){return a?new MDt(p,a):new j1t(p,0)}return f.alpha=function(p){return i(+p)},f}(.5);function DDt(i){this._context=i}DDt.prototype={areaStart:ak,areaEnd:ak,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(i,a){i=+i,a=+a,this._point?this._context.lineTo(i,a):(this._point=1,this._context.moveTo(i,a))}};function xTe(i){return new DDt(i)}function IDt(i){return i<0?-1:1}function ODt(i,a,f){var p=i._x1-i._x0,w=a-i._x1,m=(i._y1-i._y0)/(p||w<0&&-0),b=(f-i._y1)/(w||p<0&&-0),E=(m*w+b*p)/(p+w);return(IDt(m)+IDt(b))*Math.min(Math.abs(m),Math.abs(b),.5*Math.abs(E))||0}function PDt(i,a){var f=i._x1-i._x0;return f?(3*(i._y1-i._y0)/f-a)/2:a}function z1t(i,a,f){var p=i._x0,w=i._y0,m=i._x1,b=i._y1,E=(m-p)/3;i._context.bezierCurveTo(p+E,w+E*a,m-E,b-E*f,m,b)}function sW(i){this._context=i}sW.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:z1t(this,this._t0,PDt(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(i,a){var f=NaN;if(i=+i,a=+a,!(i===this._x1&&a===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(i,a):this._context.moveTo(i,a);break;case 1:this._point=2;break;case 2:this._point=3,z1t(this,PDt(this,f=ODt(this,i,a)),f);break;default:z1t(this,this._t0,f=ODt(this,i,a));break}this._x0=this._x1,this._x1=i,this._y0=this._y1,this._y1=a,this._t0=f}}};function FDt(i){this._context=new NDt(i)}(FDt.prototype=Object.create(sW.prototype)).point=function(i,a){sW.prototype.point.call(this,a,i)};function NDt(i){this._context=i}NDt.prototype={moveTo:function(i,a){this._context.moveTo(a,i)},closePath:function(){this._context.closePath()},lineTo:function(i,a){this._context.lineTo(a,i)},bezierCurveTo:function(i,a,f,p,w,m){this._context.bezierCurveTo(a,i,p,f,m,w)}};function kTe(i){return new sW(i)}function ETe(i){return new FDt(i)}function BDt(i){this._context=i}BDt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var i=this._x,a=this._y,f=i.length;if(f)if(this._line?this._context.lineTo(i[0],a[0]):this._context.moveTo(i[0],a[0]),f===2)this._context.lineTo(i[1],a[1]);else for(var p=RDt(i),w=RDt(a),m=0,b=1;b=0;--a)w[a]=(b[a]-w[a+1])/m[a];for(m[f-1]=(i[f]+w[f-1])/2,a=0;a=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(i,a){switch(i=+i,a=+a,this._point){case 0:this._point=1,this._line?this._context.lineTo(i,a):this._context.moveTo(i,a);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,a),this._context.lineTo(i,a);else{var f=this._x*(1-this._t)+i*this._t;this._context.lineTo(f,this._y),this._context.lineTo(f,a)}break}}this._x=i,this._y=a}};function CTe(i){return new aW(i,.5)}function _Te(i){return new aW(i,0)}function STe(i){return new aW(i,1)}function VP(i,a,f){this.k=i,this.x=a,this.y=f}VP.prototype={constructor:VP,scale:function(i){return i===1?this:new VP(this.k*i,this.x,this.y)},translate:function(i,a){return i===0&a===0?this:new VP(this.k,this.x+this.k*i,this.y+this.k*a)},apply:function(i){return[i[0]*this.k+this.x,i[1]*this.k+this.y]},applyX:function(i){return i*this.k+this.x},applyY:function(i){return i*this.k+this.y},invert:function(i){return[(i[0]-this.x)/this.k,(i[1]-this.y)/this.k]},invertX:function(i){return(i-this.x)/this.k},invertY:function(i){return(i-this.y)/this.k},rescaleX:function(i){return i.copy().domain(i.range().map(this.invertX,this).map(i.invert,i))},rescaleY:function(i){return i.copy().domain(i.range().map(this.invertY,this).map(i.invert,i))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}},VP.prototype;/*! @license DOMPurify 3.0.5 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.5/LICENSE */const{entries:jDt,setPrototypeOf:$Dt,isFrozen:ATe,getPrototypeOf:LTe,getOwnPropertyDescriptor:MTe}=Object;let{freeze:ug,seal:Jv,create:DTe}=Object,{apply:q1t,construct:H1t}=typeof Reflect<"u"&&Reflect;q1t||(q1t=function(a,f,p){return a.apply(f,p)}),ug||(ug=function(a){return a}),Jv||(Jv=function(a){return a}),H1t||(H1t=function(a,f){return new a(...f)});const ITe=J2(Array.prototype.forEach),zDt=J2(Array.prototype.pop),GP=J2(Array.prototype.push),oW=J2(String.prototype.toLowerCase),V1t=J2(String.prototype.toString),OTe=J2(String.prototype.match),tm=J2(String.prototype.replace),PTe=J2(String.prototype.indexOf),FTe=J2(String.prototype.trim),Pb=J2(RegExp.prototype.test),UP=NTe(TypeError);function J2(i){return function(a){for(var f=arguments.length,p=new Array(f>1?f-1:0),w=1;w/gm),zTe=Jv(/\${[\w\W]*}/gm),qTe=Jv(/^data-[\-\w.\u00B7-\uFFFF]/),HTe=Jv(/^aria-[\-\w]+$/),UDt=Jv(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),VTe=Jv(/^(?:\w+script|data):/i),GTe=Jv(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),WDt=Jv(/^html$/i);var YDt=Object.freeze({__proto__:null,MUSTACHE_EXPR:jTe,ERB_EXPR:$Te,TMPLIT_EXPR:zTe,DATA_ATTR:qTe,ARIA_ATTR:HTe,IS_ALLOWED_URI:UDt,IS_SCRIPT_OR_DATA:VTe,ATTR_WHITESPACE:GTe,DOCTYPE_NAME:WDt});const UTe=()=>typeof window>"u"?null:window,WTe=function(a,f){if(typeof a!="object"||typeof a.createPolicy!="function")return null;let p=null;const w="data-tt-policy-suffix";f&&f.hasAttribute(w)&&(p=f.getAttribute(w));const m="dompurify"+(p?"#"+p:"");try{return a.createPolicy(m,{createHTML(b){return b},createScriptURL(b){return b}})}catch{return console.warn("TrustedTypes policy "+m+" could not be created."),null}};function KDt(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:UTe();const a=Bi=>KDt(Bi);if(a.version="3.0.5",a.removed=[],!i||!i.document||i.document.nodeType!==9)return a.isSupported=!1,a;const f=i.document,p=f.currentScript;let{document:w}=i;const{DocumentFragment:m,HTMLTemplateElement:b,Node:E,Element:_,NodeFilter:A,NamedNodeMap:I=i.NamedNodeMap||i.MozNamedAttrMap,HTMLFormElement:B,DOMParser:N,trustedTypes:R}=i,z=_.prototype,W=cW(z,"cloneNode"),et=cW(z,"nextSibling"),st=cW(z,"childNodes"),at=cW(z,"parentNode");if(typeof b=="function"){const Bi=w.createElement("template");Bi.content&&Bi.content.ownerDocument&&(w=Bi.content.ownerDocument)}let bt,mt="";const{implementation:yt,createNodeIterator:ft,createDocumentFragment:ut,getElementsByTagName:vt}=w,{importNode:X}=f;let pt={};a.isSupported=typeof jDt=="function"&&typeof at=="function"&&yt&&yt.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:U,ERB_EXPR:Tt,TMPLIT_EXPR:nt,DATA_ATTR:It,ARIA_ATTR:Ot,IS_SCRIPT_OR_DATA:Bt,ATTR_WHITESPACE:Et}=YDt;let{IS_ALLOWED_URI:Z}=YDt,Ct=null;const xt=mo({},[...qDt,...G1t,...U1t,...W1t,...HDt]);let Ht=null;const Le=mo({},[...VDt,...Y1t,...GDt,...uW]);let Ft=Object.seal(Object.create(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),gn=null,Se=null,me=!0,Ve=!0,Ye=!1,ce=!0,ke=!1,zt=!1,re=!1,se=!1,Pe=!1,te=!1,Me=!1,de=!0,on=!1;const ni="user-content-";let Ks=!0,ws=!1,fo={},Xi=null;const Er=mo({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Xn=null;const di=mo({},["audio","video","img","source","image","track"]);let Ee=null;const Kn=mo({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),He="http://www.w3.org/1998/Math/MathML",Ti="http://www.w3.org/2000/svg",pn="http://www.w3.org/1999/xhtml";let Es=pn,qa=!1,Ma=null;const Gs=mo({},[He,Ti,pn],V1t);let Po;const vs=["application/xhtml+xml","text/html"],ru="text/html";let zs,Du=null;const pm=w.createElement("form"),uw=function(cn){return cn instanceof RegExp||cn instanceof Function},Wu=function(cn){if(!(Du&&Du===cn)){if((!cn||typeof cn!="object")&&(cn={}),cn=PA(cn),Po=vs.indexOf(cn.PARSER_MEDIA_TYPE)===-1?Po=ru:Po=cn.PARSER_MEDIA_TYPE,zs=Po==="application/xhtml+xml"?V1t:oW,Ct="ALLOWED_TAGS"in cn?mo({},cn.ALLOWED_TAGS,zs):xt,Ht="ALLOWED_ATTR"in cn?mo({},cn.ALLOWED_ATTR,zs):Le,Ma="ALLOWED_NAMESPACES"in cn?mo({},cn.ALLOWED_NAMESPACES,V1t):Gs,Ee="ADD_URI_SAFE_ATTR"in cn?mo(PA(Kn),cn.ADD_URI_SAFE_ATTR,zs):Kn,Xn="ADD_DATA_URI_TAGS"in cn?mo(PA(di),cn.ADD_DATA_URI_TAGS,zs):di,Xi="FORBID_CONTENTS"in cn?mo({},cn.FORBID_CONTENTS,zs):Er,gn="FORBID_TAGS"in cn?mo({},cn.FORBID_TAGS,zs):{},Se="FORBID_ATTR"in cn?mo({},cn.FORBID_ATTR,zs):{},fo="USE_PROFILES"in cn?cn.USE_PROFILES:!1,me=cn.ALLOW_ARIA_ATTR!==!1,Ve=cn.ALLOW_DATA_ATTR!==!1,Ye=cn.ALLOW_UNKNOWN_PROTOCOLS||!1,ce=cn.ALLOW_SELF_CLOSE_IN_ATTR!==!1,ke=cn.SAFE_FOR_TEMPLATES||!1,zt=cn.WHOLE_DOCUMENT||!1,Pe=cn.RETURN_DOM||!1,te=cn.RETURN_DOM_FRAGMENT||!1,Me=cn.RETURN_TRUSTED_TYPE||!1,se=cn.FORCE_BODY||!1,de=cn.SANITIZE_DOM!==!1,on=cn.SANITIZE_NAMED_PROPS||!1,Ks=cn.KEEP_CONTENT!==!1,ws=cn.IN_PLACE||!1,Z=cn.ALLOWED_URI_REGEXP||UDt,Es=cn.NAMESPACE||pn,Ft=cn.CUSTOM_ELEMENT_HANDLING||{},cn.CUSTOM_ELEMENT_HANDLING&&uw(cn.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ft.tagNameCheck=cn.CUSTOM_ELEMENT_HANDLING.tagNameCheck),cn.CUSTOM_ELEMENT_HANDLING&&uw(cn.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ft.attributeNameCheck=cn.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),cn.CUSTOM_ELEMENT_HANDLING&&typeof cn.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(Ft.allowCustomizedBuiltInElements=cn.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),ke&&(Ve=!1),te&&(Pe=!0),fo&&(Ct=mo({},[...HDt]),Ht=[],fo.html===!0&&(mo(Ct,qDt),mo(Ht,VDt)),fo.svg===!0&&(mo(Ct,G1t),mo(Ht,Y1t),mo(Ht,uW)),fo.svgFilters===!0&&(mo(Ct,U1t),mo(Ht,Y1t),mo(Ht,uW)),fo.mathMl===!0&&(mo(Ct,W1t),mo(Ht,GDt),mo(Ht,uW))),cn.ADD_TAGS&&(Ct===xt&&(Ct=PA(Ct)),mo(Ct,cn.ADD_TAGS,zs)),cn.ADD_ATTR&&(Ht===Le&&(Ht=PA(Ht)),mo(Ht,cn.ADD_ATTR,zs)),cn.ADD_URI_SAFE_ATTR&&mo(Ee,cn.ADD_URI_SAFE_ATTR,zs),cn.FORBID_CONTENTS&&(Xi===Er&&(Xi=PA(Xi)),mo(Xi,cn.FORBID_CONTENTS,zs)),Ks&&(Ct["#text"]=!0),zt&&mo(Ct,["html","head","body"]),Ct.table&&(mo(Ct,["tbody"]),delete gn.tbody),cn.TRUSTED_TYPES_POLICY){if(typeof cn.TRUSTED_TYPES_POLICY.createHTML!="function")throw UP('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof cn.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw UP('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');bt=cn.TRUSTED_TYPES_POLICY,mt=bt.createHTML("")}else bt===void 0&&(bt=WTe(R,p)),bt!==null&&typeof mt=="string"&&(mt=bt.createHTML(""));ug&&ug(cn),Du=cn}},th=mo({},["mi","mo","mn","ms","mtext"]),Fa=mo({},["foreignobject","desc","title","annotation-xml"]),Ml=mo({},["title","style","font","a","script"]),ha=mo({},G1t);mo(ha,U1t),mo(ha,BTe);const bc=mo({},W1t);mo(bc,RTe);const Cc=function(cn){let kr=at(cn);(!kr||!kr.tagName)&&(kr={namespaceURI:Es,tagName:"template"});const Ei=oW(cn.tagName),Jo=oW(kr.tagName);return Ma[cn.namespaceURI]?cn.namespaceURI===Ti?kr.namespaceURI===pn?Ei==="svg":kr.namespaceURI===He?Ei==="svg"&&(Jo==="annotation-xml"||th[Jo]):!!ha[Ei]:cn.namespaceURI===He?kr.namespaceURI===pn?Ei==="math":kr.namespaceURI===Ti?Ei==="math"&&Fa[Jo]:!!bc[Ei]:cn.namespaceURI===pn?kr.namespaceURI===Ti&&!Fa[Jo]||kr.namespaceURI===He&&!th[Jo]?!1:!bc[Ei]&&(Ml[Ei]||!ha[Ei]):!!(Po==="application/xhtml+xml"&&Ma[cn.namespaceURI]):!1},pa=function(cn){GP(a.removed,{element:cn});try{cn.parentNode.removeChild(cn)}catch{cn.remove()}},Da=function(cn,kr){try{GP(a.removed,{attribute:kr.getAttributeNode(cn),from:kr})}catch{GP(a.removed,{attribute:null,from:kr})}if(kr.removeAttribute(cn),cn==="is"&&!Ht[cn])if(Pe||te)try{pa(kr)}catch{}else try{kr.setAttribute(cn,"")}catch{}},Ha=function(cn){let kr,Ei;if(se)cn=""+cn;else{const rf=OTe(cn,/^[\r\n\t ]+/);Ei=rf&&rf[0]}Po==="application/xhtml+xml"&&Es===pn&&(cn=''+cn+"");const Jo=bt?bt.createHTML(cn):cn;if(Es===pn)try{kr=new N().parseFromString(Jo,Po)}catch{}if(!kr||!kr.documentElement){kr=yt.createDocument(Es,"template",null);try{kr.documentElement.innerHTML=qa?mt:Jo}catch{}}const wc=kr.body||kr.documentElement;return cn&&Ei&&wc.insertBefore(w.createTextNode(Ei),wc.childNodes[0]||null),Es===pn?vt.call(kr,zt?"html":"body")[0]:zt?kr.documentElement:wc},Dl=function(cn){return ft.call(cn.ownerDocument||cn,cn,A.SHOW_ELEMENT|A.SHOW_COMMENT|A.SHOW_TEXT,null,!1)},_c=function(cn){return cn instanceof B&&(typeof cn.nodeName!="string"||typeof cn.textContent!="string"||typeof cn.removeChild!="function"||!(cn.attributes instanceof I)||typeof cn.removeAttribute!="function"||typeof cn.setAttribute!="function"||typeof cn.namespaceURI!="string"||typeof cn.insertBefore!="function"||typeof cn.hasChildNodes!="function")},lw=function(cn){return typeof E=="object"?cn instanceof E:cn&&typeof cn=="object"&&typeof cn.nodeType=="number"&&typeof cn.nodeName=="string"},eh=function(cn,kr,Ei){pt[cn]&&ITe(pt[cn],Jo=>{Jo.call(a,kr,Ei,Du)})},ed=function(cn){let kr;if(eh("beforeSanitizeElements",cn,null),_c(cn))return pa(cn),!0;const Ei=zs(cn.nodeName);if(eh("uponSanitizeElement",cn,{tagName:Ei,allowedTags:Ct}),cn.hasChildNodes()&&!lw(cn.firstElementChild)&&(!lw(cn.content)||!lw(cn.content.firstElementChild))&&Pb(/<[/\w]/g,cn.innerHTML)&&Pb(/<[/\w]/g,cn.textContent))return pa(cn),!0;if(!Ct[Ei]||gn[Ei]){if(!gn[Ei]&&nd(Ei)&&(Ft.tagNameCheck instanceof RegExp&&Pb(Ft.tagNameCheck,Ei)||Ft.tagNameCheck instanceof Function&&Ft.tagNameCheck(Ei)))return!1;if(Ks&&!Xi[Ei]){const Jo=at(cn)||cn.parentNode,wc=st(cn)||cn.childNodes;if(wc&&Jo){const rf=wc.length;for(let Oc=rf-1;Oc>=0;--Oc)Jo.insertBefore(W(wc[Oc],!0),et(cn))}}return pa(cn),!0}return cn instanceof _&&!Cc(cn)||(Ei==="noscript"||Ei==="noembed"||Ei==="noframes")&&Pb(/<\/no(script|embed|frames)/i,cn.innerHTML)?(pa(cn),!0):(ke&&cn.nodeType===3&&(kr=cn.textContent,kr=tm(kr,U," "),kr=tm(kr,Tt," "),kr=tm(kr,nt," "),cn.textContent!==kr&&(GP(a.removed,{element:cn.cloneNode()}),cn.textContent=kr)),eh("afterSanitizeElements",cn,null),!1)},jd=function(cn,kr,Ei){if(de&&(kr==="id"||kr==="name")&&(Ei in w||Ei in pm))return!1;if(!(Ve&&!Se[kr]&&Pb(It,kr))){if(!(me&&Pb(Ot,kr))){if(!Ht[kr]||Se[kr]){if(!(nd(cn)&&(Ft.tagNameCheck instanceof RegExp&&Pb(Ft.tagNameCheck,cn)||Ft.tagNameCheck instanceof Function&&Ft.tagNameCheck(cn))&&(Ft.attributeNameCheck instanceof RegExp&&Pb(Ft.attributeNameCheck,kr)||Ft.attributeNameCheck instanceof Function&&Ft.attributeNameCheck(kr))||kr==="is"&&Ft.allowCustomizedBuiltInElements&&(Ft.tagNameCheck instanceof RegExp&&Pb(Ft.tagNameCheck,Ei)||Ft.tagNameCheck instanceof Function&&Ft.tagNameCheck(Ei))))return!1}else if(!Ee[kr]){if(!Pb(Z,tm(Ei,Et,""))){if(!((kr==="src"||kr==="xlink:href"||kr==="href")&&cn!=="script"&&PTe(Ei,"data:")===0&&Xn[cn])){if(!(Ye&&!Pb(Bt,tm(Ei,Et,"")))){if(Ei)return!1}}}}}}return!0},nd=function(cn){return cn.indexOf("-")>0},$d=function(cn){let kr,Ei,Jo,wc;eh("beforeSanitizeAttributes",cn,null);const{attributes:rf}=cn;if(!rf)return;const Oc={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ht};for(wc=rf.length;wc--;){kr=rf[wc];const{name:sf,namespaceURI:af}=kr;if(Ei=sf==="value"?kr.value:FTe(kr.value),Jo=zs(sf),Oc.attrName=Jo,Oc.attrValue=Ei,Oc.keepAttr=!0,Oc.forceKeepAttr=void 0,eh("uponSanitizeAttribute",cn,Oc),Ei=Oc.attrValue,Oc.forceKeepAttr||(Da(sf,cn),!Oc.keepAttr))continue;if(!ce&&Pb(/\/>/i,Ei)){Da(sf,cn);continue}ke&&(Ei=tm(Ei,U," "),Ei=tm(Ei,Tt," "),Ei=tm(Ei,nt," "));const Qi=zs(cn.nodeName);if(jd(Qi,Jo,Ei)){if(on&&(Jo==="id"||Jo==="name")&&(Da(sf,cn),Ei=ni+Ei),bt&&typeof R=="object"&&typeof R.getAttributeType=="function"&&!af)switch(R.getAttributeType(Qi,Jo)){case"TrustedHTML":{Ei=bt.createHTML(Ei);break}case"TrustedScriptURL":{Ei=bt.createScriptURL(Ei);break}}try{af?cn.setAttributeNS(af,sf,Ei):cn.setAttribute(sf,Ei),zDt(a.removed)}catch{}}}eh("afterSanitizeAttributes",cn,null)},A0=function Bi(cn){let kr;const Ei=Dl(cn);for(eh("beforeSanitizeShadowDOM",cn,null);kr=Ei.nextNode();)eh("uponSanitizeShadowNode",kr,null),!ed(kr)&&(kr.content instanceof m&&Bi(kr.content),$d(kr));eh("afterSanitizeShadowDOM",cn,null)};return a.sanitize=function(Bi){let cn=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},kr,Ei,Jo,wc;if(qa=!Bi,qa&&(Bi=""),typeof Bi!="string"&&!lw(Bi))if(typeof Bi.toString=="function"){if(Bi=Bi.toString(),typeof Bi!="string")throw UP("dirty is not a string, aborting")}else throw UP("toString is not a function");if(!a.isSupported)return Bi;if(re||Wu(cn),a.removed=[],typeof Bi=="string"&&(ws=!1),ws){if(Bi.nodeName){const sf=zs(Bi.nodeName);if(!Ct[sf]||gn[sf])throw UP("root node is forbidden and cannot be sanitized in-place")}}else if(Bi instanceof E)kr=Ha(""),Ei=kr.ownerDocument.importNode(Bi,!0),Ei.nodeType===1&&Ei.nodeName==="BODY"||Ei.nodeName==="HTML"?kr=Ei:kr.appendChild(Ei);else{if(!Pe&&!ke&&!zt&&Bi.indexOf("<")===-1)return bt&&Me?bt.createHTML(Bi):Bi;if(kr=Ha(Bi),!kr)return Pe?null:Me?mt:""}kr&&se&&pa(kr.firstChild);const rf=Dl(ws?Bi:kr);for(;Jo=rf.nextNode();)ed(Jo)||(Jo.content instanceof m&&A0(Jo.content),$d(Jo));if(ws)return Bi;if(Pe){if(te)for(wc=ut.call(kr.ownerDocument);kr.firstChild;)wc.appendChild(kr.firstChild);else wc=kr;return(Ht.shadowroot||Ht.shadowrootmode)&&(wc=X.call(f,wc,!0)),wc}let Oc=zt?kr.outerHTML:kr.innerHTML;return zt&&Ct["!doctype"]&&kr.ownerDocument&&kr.ownerDocument.doctype&&kr.ownerDocument.doctype.name&&Pb(WDt,kr.ownerDocument.doctype.name)&&(Oc=" +`+Oc),ke&&(Oc=tm(Oc,U," "),Oc=tm(Oc,Tt," "),Oc=tm(Oc,nt," ")),bt&&Me?bt.createHTML(Oc):Oc},a.setConfig=function(Bi){Wu(Bi),re=!0},a.clearConfig=function(){Du=null,re=!1},a.isValidAttribute=function(Bi,cn,kr){Du||Wu({});const Ei=zs(Bi),Jo=zs(cn);return jd(Ei,Jo,kr)},a.addHook=function(Bi,cn){typeof cn=="function"&&(pt[Bi]=pt[Bi]||[],GP(pt[Bi],cn))},a.removeHook=function(Bi){if(pt[Bi])return zDt(pt[Bi])},a.removeHooks=function(Bi){pt[Bi]&&(pt[Bi]=[])},a.removeAllHooks=function(){pt={}},a}var lW=KDt();const WP=//gi,YTe=i=>i?ZDt(i).replace(/\\n/g,"#br#").split("#br#"):[""],XDt=i=>lW.sanitize(i),QDt=(i,a)=>{var f;if(((f=a.flowchart)==null?void 0:f.htmlLabels)!==!1){const p=a.securityLevel;p==="antiscript"||p==="strict"?i=XDt(i):p!=="loose"&&(i=ZDt(i),i=i.replace(//g,">"),i=i.replace(/=/g,"="),i=ZTe(i))}return i},Q1=(i,a)=>i&&(a.dompurifyConfig?i=lW.sanitize(QDt(i,a),a.dompurifyConfig).toString():i=lW.sanitize(QDt(i,a),{FORBID_TAGS:["style"]}).toString(),i),KTe=(i,a)=>typeof i=="string"?Q1(i,a):i.flat().map(f=>Q1(f,a)),XTe=i=>WP.test(i),QTe=i=>i.split(WP),ZTe=i=>i.replace(/#br#/g,"
"),ZDt=i=>i.replace(WP,"#br#"),JTe=i=>{let a="";return i&&(a=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,a=a.replaceAll(/\(/g,"\\("),a=a.replaceAll(/\)/g,"\\)")),a},o1=i=>!(i===!1||["false","null","0"].includes(String(i).trim().toLowerCase())),tCe=function(...i){const a=i.filter(f=>!isNaN(f));return Math.max(...a)},eCe=function(...i){const a=i.filter(f=>!isNaN(f));return Math.min(...a)},YP=function(i){const a=i.split(/(,)/),f=[];for(let p=0;p0&&p+1Math.max(0,i.split(a).length-1),nCe=(i,a)=>{const f=K1t(i,"~"),p=K1t(a,"~");return f===1&&p===1},rCe=i=>{const a=K1t(i,"~");let f=!1;if(a<=1)return i;a%2!==0&&i.startsWith("~")&&(i=i.substring(1),f=!0);const p=[...i];let w=p.indexOf("~"),m=p.lastIndexOf("~");for(;w!==-1&&m!==-1&&w!==m;)p[w]="<",p[m]=">",w=p.indexOf("~"),m=p.lastIndexOf("~");return f&&p.unshift("~"),p.join("")},Kr={getRows:YTe,sanitizeText:Q1,sanitizeTextOrArray:KTe,hasBreaks:XTe,splitBreaks:QTe,lineBreakRegex:WP,removeScript:XDt,getUrl:JTe,evaluate:o1,getMax:tCe,getMin:eCe},hW={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:i=>i>=255?255:i<0?0:i,g:i=>i>=255?255:i<0?0:i,b:i=>i>=255?255:i<0?0:i,h:i=>i%360,s:i=>i>=100?100:i<0?0:i,l:i=>i>=100?100:i<0?0:i,a:i=>i>=1?1:i<0?0:i},toLinear:i=>{const a=i/255;return i>.03928?Math.pow((a+.055)/1.055,2.4):a/12.92},hue2rgb:(i,a,f)=>(f<0&&(f+=1),f>1&&(f-=1),f<1/6?i+(a-i)*6*f:f<1/2?a:f<2/3?i+(a-i)*(2/3-f)*6:i),hsl2rgb:({h:i,s:a,l:f},p)=>{if(!a)return f*2.55;i/=360,a/=100,f/=100;const w=f<.5?f*(1+a):f+a-f*a,m=2*f-w;switch(p){case"r":return hW.hue2rgb(m,w,i+1/3)*255;case"g":return hW.hue2rgb(m,w,i)*255;case"b":return hW.hue2rgb(m,w,i-1/3)*255}},rgb2hsl:({r:i,g:a,b:f},p)=>{i/=255,a/=255,f/=255;const w=Math.max(i,a,f),m=Math.min(i,a,f),b=(w+m)/2;if(p==="l")return b*100;if(w===m)return 0;const E=w-m,_=b>.5?E/(2-w-m):E/(w+m);if(p==="s")return _*100;switch(w){case i:return((a-f)/E+(aa>f?Math.min(a,Math.max(f,i)):Math.min(f,Math.max(a,i)),round:i=>Math.round(i*1e10)/1e10},unit:{dec2hex:i=>{const a=Math.round(i).toString(16);return a.length>1?a:`0${a}`}}},ok={};for(let i=0;i<=255;i++)ok[i]=ga.unit.dec2hex(i);const x0={ALL:0,RGB:1,HSL:2};class iCe{constructor(){this.type=x0.ALL}get(){return this.type}set(a){if(this.type&&this.type!==a)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=a}reset(){this.type=x0.ALL}is(a){return this.type===a}}const sCe=iCe;class aCe{constructor(a,f){this.color=f,this.changed=!1,this.data=a,this.type=new sCe}set(a,f){return this.color=f,this.changed=!1,this.data=a,this.type.type=x0.ALL,this}_ensureHSL(){const a=this.data,{h:f,s:p,l:w}=a;f===void 0&&(a.h=ga.channel.rgb2hsl(a,"h")),p===void 0&&(a.s=ga.channel.rgb2hsl(a,"s")),w===void 0&&(a.l=ga.channel.rgb2hsl(a,"l"))}_ensureRGB(){const a=this.data,{r:f,g:p,b:w}=a;f===void 0&&(a.r=ga.channel.hsl2rgb(a,"r")),p===void 0&&(a.g=ga.channel.hsl2rgb(a,"g")),w===void 0&&(a.b=ga.channel.hsl2rgb(a,"b"))}get r(){const a=this.data,f=a.r;return!this.type.is(x0.HSL)&&f!==void 0?f:(this._ensureHSL(),ga.channel.hsl2rgb(a,"r"))}get g(){const a=this.data,f=a.g;return!this.type.is(x0.HSL)&&f!==void 0?f:(this._ensureHSL(),ga.channel.hsl2rgb(a,"g"))}get b(){const a=this.data,f=a.b;return!this.type.is(x0.HSL)&&f!==void 0?f:(this._ensureHSL(),ga.channel.hsl2rgb(a,"b"))}get h(){const a=this.data,f=a.h;return!this.type.is(x0.RGB)&&f!==void 0?f:(this._ensureRGB(),ga.channel.rgb2hsl(a,"h"))}get s(){const a=this.data,f=a.s;return!this.type.is(x0.RGB)&&f!==void 0?f:(this._ensureRGB(),ga.channel.rgb2hsl(a,"s"))}get l(){const a=this.data,f=a.l;return!this.type.is(x0.RGB)&&f!==void 0?f:(this._ensureRGB(),ga.channel.rgb2hsl(a,"l"))}get a(){return this.data.a}set r(a){this.type.set(x0.RGB),this.changed=!0,this.data.r=a}set g(a){this.type.set(x0.RGB),this.changed=!0,this.data.g=a}set b(a){this.type.set(x0.RGB),this.changed=!0,this.data.b=a}set h(a){this.type.set(x0.HSL),this.changed=!0,this.data.h=a}set s(a){this.type.set(x0.HSL),this.changed=!0,this.data.s=a}set l(a){this.type.set(x0.HSL),this.changed=!0,this.data.l=a}set a(a){this.changed=!0,this.data.a=a}}const oCe=aCe,fW=new oCe({r:0,g:0,b:0,a:0},"transparent"),JDt={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:i=>{if(i.charCodeAt(0)!==35)return;const a=i.match(JDt.re);if(!a)return;const f=a[1],p=parseInt(f,16),w=f.length,m=w%4===0,b=w>4,E=b?1:17,_=b?8:4,A=m?0:-1,I=b?255:15;return fW.set({r:(p>>_*(A+3)&I)*E,g:(p>>_*(A+2)&I)*E,b:(p>>_*(A+1)&I)*E,a:m?(p&I)*E/255:1},i)},stringify:i=>{const{r:a,g:f,b:p,a:w}=i;return w<1?`#${ok[Math.round(a)]}${ok[Math.round(f)]}${ok[Math.round(p)]}${ok[Math.round(w*255)]}`:`#${ok[Math.round(a)]}${ok[Math.round(f)]}${ok[Math.round(p)]}`}},KP=JDt,dW={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:i=>{const a=i.match(dW.hueRe);if(a){const[,f,p]=a;switch(p){case"grad":return ga.channel.clamp.h(parseFloat(f)*.9);case"rad":return ga.channel.clamp.h(parseFloat(f)*180/Math.PI);case"turn":return ga.channel.clamp.h(parseFloat(f)*360)}}return ga.channel.clamp.h(parseFloat(i))},parse:i=>{const a=i.charCodeAt(0);if(a!==104&&a!==72)return;const f=i.match(dW.re);if(!f)return;const[,p,w,m,b,E]=f;return fW.set({h:dW._hue2deg(p),s:ga.channel.clamp.s(parseFloat(w)),l:ga.channel.clamp.l(parseFloat(m)),a:b?ga.channel.clamp.a(E?parseFloat(b)/100:parseFloat(b)):1},i)},stringify:i=>{const{h:a,s:f,l:p,a:w}=i;return w<1?`hsla(${ga.lang.round(a)}, ${ga.lang.round(f)}%, ${ga.lang.round(p)}%, ${w})`:`hsl(${ga.lang.round(a)}, ${ga.lang.round(f)}%, ${ga.lang.round(p)}%)`}},gW=dW,pW={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:i=>{i=i.toLowerCase();const a=pW.colors[i];if(a)return KP.parse(a)},stringify:i=>{const a=KP.stringify(i);for(const f in pW.colors)if(pW.colors[f]===a)return f}},tIt=pW,eIt={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:i=>{const a=i.charCodeAt(0);if(a!==114&&a!==82)return;const f=i.match(eIt.re);if(!f)return;const[,p,w,m,b,E,_,A,I]=f;return fW.set({r:ga.channel.clamp.r(w?parseFloat(p)*2.55:parseFloat(p)),g:ga.channel.clamp.g(b?parseFloat(m)*2.55:parseFloat(m)),b:ga.channel.clamp.b(_?parseFloat(E)*2.55:parseFloat(E)),a:A?ga.channel.clamp.a(I?parseFloat(A)/100:parseFloat(A)):1},i)},stringify:i=>{const{r:a,g:f,b:p,a:w}=i;return w<1?`rgba(${ga.lang.round(a)}, ${ga.lang.round(f)}, ${ga.lang.round(p)}, ${ga.lang.round(w)})`:`rgb(${ga.lang.round(a)}, ${ga.lang.round(f)}, ${ga.lang.round(p)})`}},bW=eIt,em={format:{keyword:tIt,hex:KP,rgb:bW,rgba:bW,hsl:gW,hsla:gW},parse:i=>{if(typeof i!="string")return i;const a=KP.parse(i)||bW.parse(i)||gW.parse(i)||tIt.parse(i);if(a)return a;throw new Error(`Unsupported color format: "${i}"`)},stringify:i=>!i.changed&&i.color?i.color:i.type.is(x0.HSL)||i.data.r===void 0?gW.stringify(i):i.a<1||!Number.isInteger(i.r)||!Number.isInteger(i.g)||!Number.isInteger(i.b)?bW.stringify(i):KP.stringify(i)},nIt=(i,a)=>{const f=em.parse(i);for(const p in a)f[p]=ga.channel.clamp[p](a[p]);return em.stringify(f)},FA=(i,a,f=0,p=1)=>{if(typeof i!="number")return nIt(i,{a});const w=fW.set({r:ga.channel.clamp.r(i),g:ga.channel.clamp.g(a),b:ga.channel.clamp.b(f),a:ga.channel.clamp.a(p)});return em.stringify(w)},cCe=(i,a)=>ga.lang.round(em.parse(i)[a]),uCe=i=>{const{r:a,g:f,b:p}=em.parse(i),w=.2126*ga.channel.toLinear(a)+.7152*ga.channel.toLinear(f)+.0722*ga.channel.toLinear(p);return ga.lang.round(w)},lCe=i=>uCe(i)>=.5,iT=i=>!lCe(i),rIt=(i,a,f)=>{const p=em.parse(i),w=p[a],m=ga.channel.clamp[a](w+f);return w!==m&&(p[a]=m),em.stringify(p)},bs=(i,a)=>rIt(i,"l",a),$s=(i,a)=>rIt(i,"l",-a),xn=(i,a)=>{const f=em.parse(i),p={};for(const w in a)a[w]&&(p[w]=f[w]+a[w]);return nIt(i,p)},hCe=(i,a,f=50)=>{const{r:p,g:w,b:m,a:b}=em.parse(i),{r:E,g:_,b:A,a:I}=em.parse(a),B=f/100,N=B*2-1,R=b-I,W=((N*R===-1?N:(N+R)/(1+N*R))+1)/2,et=1-W,st=p*W+E*et,at=w*W+_*et,bt=m*W+A*et,mt=b*B+I*(1-B);return FA(st,at,bt,mt)},Di=(i,a=100)=>{const f=em.parse(i);return f.r=255-f.r,f.g=255-f.g,f.b=255-f.b,hCe(f,i,a)},lg=(i,a)=>a?xn(i,{s:-40,l:10}):xn(i,{s:-40,l:-10}),wW="#ffffff",vW="#f2f2f2";let fCe=class{constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){var f,p,w,m,b,E,_,A,I,B,N;if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||xn(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||xn(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||lg(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||lg(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||lg(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||lg(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||Di(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||Di(this.tertiaryColor),this.lineColor=this.lineColor||Di(this.background),this.arrowheadColor=this.arrowheadColor||Di(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?$s(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||"grey",this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||$s(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||Di(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||bs(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||xn(this.primaryColor,{h:30}),this.cScale4=this.cScale4||xn(this.primaryColor,{h:60}),this.cScale5=this.cScale5||xn(this.primaryColor,{h:90}),this.cScale6=this.cScale6||xn(this.primaryColor,{h:120}),this.cScale7=this.cScale7||xn(this.primaryColor,{h:150}),this.cScale8=this.cScale8||xn(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||xn(this.primaryColor,{h:270}),this.cScale10=this.cScale10||xn(this.primaryColor,{h:300}),this.cScale11=this.cScale11||xn(this.primaryColor,{h:330}),this.darkMode)for(let R=0;R{this[p]=a[p]}),this.updateColors(),f.forEach(p=>{this[p]=a[p]})}};const dCe=i=>{const a=new fCe;return a.calculate(i),a};let gCe=class{constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=bs(this.primaryColor,16),this.tertiaryColor=xn(this.primaryColor,{h:-160}),this.primaryBorderColor=Di(this.background),this.secondaryBorderColor=lg(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=lg(this.tertiaryColor,this.darkMode),this.primaryTextColor=Di(this.primaryColor),this.secondaryTextColor=Di(this.secondaryColor),this.tertiaryTextColor=Di(this.tertiaryColor),this.lineColor=Di(this.background),this.textColor=Di(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=bs(Di("#323D47"),10),this.lineColor="calculated",this.border1="#81B1DB",this.border2=FA(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=$s("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=$s(this.sectionBkgColor,10),this.taskBorderColor=FA(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=FA(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){var a,f,p,w,m,b,E,_,A,I,B;this.secondBkg=bs(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=bs(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.mainContrastColor,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=bs(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=xn(this.primaryColor,{h:64}),this.fillType3=xn(this.secondaryColor,{h:64}),this.fillType4=xn(this.primaryColor,{h:-64}),this.fillType5=xn(this.secondaryColor,{h:-64}),this.fillType6=xn(this.primaryColor,{h:128}),this.fillType7=xn(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||xn(this.primaryColor,{h:30}),this.cScale4=this.cScale4||xn(this.primaryColor,{h:60}),this.cScale5=this.cScale5||xn(this.primaryColor,{h:90}),this.cScale6=this.cScale6||xn(this.primaryColor,{h:120}),this.cScale7=this.cScale7||xn(this.primaryColor,{h:150}),this.cScale8=this.cScale8||xn(this.primaryColor,{h:210}),this.cScale9=this.cScale9||xn(this.primaryColor,{h:270}),this.cScale10=this.cScale10||xn(this.primaryColor,{h:300}),this.cScale11=this.cScale11||xn(this.primaryColor,{h:330});for(let N=0;N{this[p]=a[p]}),this.updateColors(),f.forEach(p=>{this[p]=a[p]})}};const pCe=i=>{const a=new gCe;return a.calculate(i),a};let bCe=class{constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=xn(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=xn(this.primaryColor,{h:-160}),this.primaryBorderColor=lg(this.primaryColor,this.darkMode),this.secondaryBorderColor=lg(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=lg(this.tertiaryColor,this.darkMode),this.primaryTextColor=Di(this.primaryColor),this.secondaryTextColor=Di(this.secondaryColor),this.tertiaryTextColor=Di(this.tertiaryColor),this.lineColor=Di(this.background),this.textColor=Di(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#e8e8e8",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.sectionBkgColor=FA(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){var a,f,p,w,m,b,E,_,A,I,B;this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||xn(this.primaryColor,{h:30}),this.cScale4=this.cScale4||xn(this.primaryColor,{h:60}),this.cScale5=this.cScale5||xn(this.primaryColor,{h:90}),this.cScale6=this.cScale6||xn(this.primaryColor,{h:120}),this.cScale7=this.cScale7||xn(this.primaryColor,{h:150}),this.cScale8=this.cScale8||xn(this.primaryColor,{h:210}),this.cScale9=this.cScale9||xn(this.primaryColor,{h:270}),this.cScale10=this.cScale10||xn(this.primaryColor,{h:300}),this.cScale11=this.cScale11||xn(this.primaryColor,{h:330}),this["cScalePeer1"]=this["cScalePeer1"]||$s(this.secondaryColor,45),this["cScalePeer2"]=this["cScalePeer2"]||$s(this.tertiaryColor,40);for(let N=0;N{this[p]=a[p]}),this.updateColors(),f.forEach(p=>{this[p]=a[p]})}};const X1t=i=>{const a=new bCe;return a.calculate(i),a};let wCe=class{constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=bs("#cde498",10),this.primaryBorderColor=lg(this.primaryColor,this.darkMode),this.secondaryBorderColor=lg(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=lg(this.tertiaryColor,this.darkMode),this.primaryTextColor=Di(this.primaryColor),this.secondaryTextColor=Di(this.secondaryColor),this.tertiaryTextColor=Di(this.primaryColor),this.lineColor=Di(this.background),this.textColor=Di(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="grey",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){var a,f,p,w,m,b,E,_,A,I,B;this.actorBorder=$s(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||xn(this.primaryColor,{h:30}),this.cScale4=this.cScale4||xn(this.primaryColor,{h:60}),this.cScale5=this.cScale5||xn(this.primaryColor,{h:90}),this.cScale6=this.cScale6||xn(this.primaryColor,{h:120}),this.cScale7=this.cScale7||xn(this.primaryColor,{h:150}),this.cScale8=this.cScale8||xn(this.primaryColor,{h:210}),this.cScale9=this.cScale9||xn(this.primaryColor,{h:270}),this.cScale10=this.cScale10||xn(this.primaryColor,{h:300}),this.cScale11=this.cScale11||xn(this.primaryColor,{h:330}),this["cScalePeer1"]=this["cScalePeer1"]||$s(this.secondaryColor,45),this["cScalePeer2"]=this["cScalePeer2"]||$s(this.tertiaryColor,40);for(let N=0;N{this[p]=a[p]}),this.updateColors(),f.forEach(p=>{this[p]=a[p]})}};const vCe=i=>{const a=new wCe;return a.calculate(i),a};class mCe{constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=bs(this.contrast,55),this.background="#ffffff",this.tertiaryColor=xn(this.primaryColor,{h:-160}),this.primaryBorderColor=lg(this.primaryColor,this.darkMode),this.secondaryBorderColor=lg(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=lg(this.tertiaryColor,this.darkMode),this.primaryTextColor=Di(this.primaryColor),this.secondaryTextColor=Di(this.secondaryColor),this.tertiaryTextColor=Di(this.tertiaryColor),this.lineColor=Di(this.background),this.textColor=Di(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){var a,f,p,w,m,b,E,_,A,I,B;this.secondBkg=bs(this.contrast,55),this.border2=this.contrast,this.actorBorder=bs(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.lineColor,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let N=0;N{this[p]=a[p]}),this.updateColors(),f.forEach(p=>{this[p]=a[p]})}}const T5={base:{getThemeVariables:dCe},dark:{getThemeVariables:pCe},default:{getThemeVariables:X1t},forest:{getThemeVariables:vCe},neutral:{getThemeVariables:i=>{const a=new mCe;return a.calculate(i),a}}},C5={flowchart:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"]},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},theme:"default",maxTextSize:5e4,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize"],deterministicIds:!1,fontSize:16},iIt={...C5,deterministicIDSeed:void 0,themeCSS:void 0,themeVariables:T5.default.getThemeVariables(),sequence:{...C5.sequence,messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},noteFont:function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},actorFont:function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}}},gantt:{...C5.gantt,tickInterval:void 0,useWidth:void 0},c4:{...C5.c4,useWidth:void 0,personFont:function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},external_personFont:function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},systemFont:function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},external_systemFont:function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},system_dbFont:function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},external_system_dbFont:function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},system_queueFont:function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},external_system_queueFont:function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},containerFont:function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},external_containerFont:function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},container_dbFont:function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},external_container_dbFont:function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},container_queueFont:function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},external_container_queueFont:function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},componentFont:function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},external_componentFont:function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},component_dbFont:function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},external_component_dbFont:function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},component_queueFont:function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},external_component_queueFont:function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},boundaryFont:function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},messageFont:function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}}},pie:{...C5.pie,useWidth:984},xyChart:{...C5.xyChart,useWidth:void 0},requirement:{...C5.requirement,useWidth:void 0},gitGraph:{...C5.gitGraph,useMaxWidth:!1},sankey:{...C5.sankey,useMaxWidth:!1}},sIt=(i,a="")=>Object.keys(i).reduce((f,p)=>Array.isArray(i[p])?f:typeof i[p]=="object"&&i[p]!==null?[...f,a+p,...sIt(i[p],"")]:[...f,a+p],[]),yCe=new Set(sIt(iIt,"")),Zh=iIt,mW=i=>{if(Ut.debug("sanitizeDirective called with",i),!(typeof i!="object"||i==null)){if(Array.isArray(i)){i.forEach(a=>mW(a));return}for(const a of Object.keys(i)){if(Ut.debug("Checking key",a),a.startsWith("__")||a.includes("proto")||a.includes("constr")||!yCe.has(a)||i[a]==null){Ut.debug("sanitize deleting key: ",a),delete i[a];continue}if(typeof i[a]=="object"){Ut.debug("sanitizing object",a),mW(i[a]);continue}const f=["themeCSS","fontFamily","altFontFamily"];for(const p of f)a.includes(p)&&(Ut.debug("sanitizing css option",a),i[a]=xCe(i[a]))}if(i.themeVariables)for(const a of Object.keys(i.themeVariables)){const f=i.themeVariables[a];f!=null&&f.match&&!f.match(/^[\d "#%(),.;A-Za-z]+$/)&&(i.themeVariables[a]="")}Ut.debug("After sanitization",i)}},xCe=i=>{let a=0,f=0;for(const p of i){if(a{for(const{id:a,detector:f,loader:p}of i)uIt(a,f,p)},uIt=(i,a,f)=>{NA[i]?Ut.error(`Detector with key ${i} already exists`):NA[i]={detector:a,loader:f},Ut.debug(`Detector with key ${i} added${f?" with loader":""}`)},ECe=i=>NA[i].loader,Q1t=(i,a,{depth:f=2,clobber:p=!1}={})=>{const w={depth:f,clobber:p};return Array.isArray(a)&&!Array.isArray(i)?(a.forEach(m=>Q1t(i,m,w)),i):Array.isArray(a)&&Array.isArray(i)?(a.forEach(m=>{i.includes(m)||i.push(m)}),i):i===void 0||f<=0?i!=null&&typeof i=="object"&&typeof a=="object"?Object.assign(i,a):a:(a!==void 0&&typeof i=="object"&&typeof a=="object"&&Object.keys(a).forEach(m=>{typeof a[m]=="object"&&(i[m]===void 0||typeof i[m]=="object")?(i[m]===void 0&&(i[m]=Array.isArray(a[m])?[]:{}),i[m]=Q1t(i[m],a[m],{depth:f-1,clobber:p})):(p||typeof i[m]!="object"&&typeof a[m]!="object")&&(i[m]=a[m])}),i)},Z1=Q1t;var TCe=typeof global=="object"&&global&&global.Object===Object&&global;const lIt=TCe;var CCe=typeof self=="object"&&self&&self.Object===Object&&self,_Ce=lIt||CCe||Function("return this")();const nm=_Ce;var SCe=nm.Symbol;const tw=SCe;var hIt=Object.prototype,ACe=hIt.hasOwnProperty,LCe=hIt.toString,QP=tw?tw.toStringTag:void 0;function MCe(i){var a=ACe.call(i,QP),f=i[QP];try{i[QP]=void 0;var p=!0}catch{}var w=LCe.call(i);return p&&(a?i[QP]=f:delete i[QP]),w}var DCe=Object.prototype,ICe=DCe.toString;function OCe(i){return ICe.call(i)}var PCe="[object Null]",FCe="[object Undefined]",fIt=tw?tw.toStringTag:void 0;function sT(i){return i==null?i===void 0?FCe:PCe:fIt&&fIt in Object(i)?MCe(i):OCe(i)}function Fb(i){var a=typeof i;return i!=null&&(a=="object"||a=="function")}var NCe="[object AsyncFunction]",BCe="[object Function]",RCe="[object GeneratorFunction]",jCe="[object Proxy]";function BA(i){if(!Fb(i))return!1;var a=sT(i);return a==BCe||a==RCe||a==NCe||a==jCe}var $Ce=nm["__core-js_shared__"];const Z1t=$Ce;var dIt=function(){var i=/[^.]+$/.exec(Z1t&&Z1t.keys&&Z1t.keys.IE_PROTO||"");return i?"Symbol(src)_1."+i:""}();function zCe(i){return!!dIt&&dIt in i}var qCe=Function.prototype,HCe=qCe.toString;function aT(i){if(i!=null){try{return HCe.call(i)}catch{}try{return i+""}catch{}}return""}var VCe=/[\\^$.*+?()[\]{}|]/g,GCe=/^\[object .+?Constructor\]$/,UCe=Function.prototype,WCe=Object.prototype,YCe=UCe.toString,KCe=WCe.hasOwnProperty,XCe=RegExp("^"+YCe.call(KCe).replace(VCe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function QCe(i){if(!Fb(i)||zCe(i))return!1;var a=BA(i)?XCe:GCe;return a.test(aT(i))}function ZCe(i,a){return i==null?void 0:i[a]}function oT(i,a){var f=ZCe(i,a);return QCe(f)?f:void 0}var JCe=oT(Object,"create");const ZP=JCe;function t9e(){this.__data__=ZP?ZP(null):{},this.size=0}function e9e(i){var a=this.has(i)&&delete this.__data__[i];return this.size-=a?1:0,a}var n9e="__lodash_hash_undefined__",r9e=Object.prototype,i9e=r9e.hasOwnProperty;function s9e(i){var a=this.__data__;if(ZP){var f=a[i];return f===n9e?void 0:f}return i9e.call(a,i)?a[i]:void 0}var a9e=Object.prototype,o9e=a9e.hasOwnProperty;function c9e(i){var a=this.__data__;return ZP?a[i]!==void 0:o9e.call(a,i)}var u9e="__lodash_hash_undefined__";function l9e(i,a){var f=this.__data__;return this.size+=this.has(i)?0:1,f[i]=ZP&&a===void 0?u9e:a,this}function cT(i){var a=-1,f=i==null?0:i.length;for(this.clear();++a-1}function w9e(i,a){var f=this.__data__,p=xW(f,i);return p<0?(++this.size,f.push([i,a])):f[p][1]=a,this}function _5(i){var a=-1,f=i==null?0:i.length;for(this.clear();++a-1&&i%1==0&&i<=U9e}function ck(i){return i!=null&&rdt(i.length)&&!BA(i)}function _It(i){return f3(i)&&ck(i)}function W9e(){return!1}var SIt=typeof exports=="object"&&exports&&!exports.nodeType&&exports,AIt=SIt&&typeof module=="object"&&module&&!module.nodeType&&module,Y9e=AIt&&AIt.exports===SIt,LIt=Y9e?nm.Buffer:void 0,K9e=LIt?LIt.isBuffer:void 0,X9e=K9e||W9e;const zA=X9e;var Q9e="[object Object]",Z9e=Function.prototype,J9e=Object.prototype,MIt=Z9e.toString,t_e=J9e.hasOwnProperty,e_e=MIt.call(Object);function DIt(i){if(!f3(i)||sT(i)!=Q9e)return!1;var a=ndt(i);if(a===null)return!0;var f=t_e.call(a,"constructor")&&a.constructor;return typeof f=="function"&&f instanceof f&&MIt.call(f)==e_e}var n_e="[object Arguments]",r_e="[object Array]",i_e="[object Boolean]",s_e="[object Date]",a_e="[object Error]",o_e="[object Function]",c_e="[object Map]",u_e="[object Number]",l_e="[object Object]",h_e="[object RegExp]",f_e="[object Set]",d_e="[object String]",g_e="[object WeakMap]",p_e="[object ArrayBuffer]",b_e="[object DataView]",w_e="[object Float32Array]",v_e="[object Float64Array]",m_e="[object Int8Array]",y_e="[object Int16Array]",x_e="[object Int32Array]",k_e="[object Uint8Array]",E_e="[object Uint8ClampedArray]",T_e="[object Uint16Array]",C_e="[object Uint32Array]",bl={};bl[w_e]=bl[v_e]=bl[m_e]=bl[y_e]=bl[x_e]=bl[k_e]=bl[E_e]=bl[T_e]=bl[C_e]=!0,bl[n_e]=bl[r_e]=bl[p_e]=bl[i_e]=bl[b_e]=bl[s_e]=bl[a_e]=bl[o_e]=bl[c_e]=bl[u_e]=bl[l_e]=bl[h_e]=bl[f_e]=bl[d_e]=bl[g_e]=!1;function __e(i){return f3(i)&&rdt(i.length)&&!!bl[sT(i)]}function SW(i){return function(a){return i(a)}}var IIt=typeof exports=="object"&&exports&&!exports.nodeType&&exports,tF=IIt&&typeof module=="object"&&module&&!module.nodeType&&module,S_e=tF&&tF.exports===IIt,idt=S_e&&lIt.process,A_e=function(){try{var i=tF&&tF.require&&tF.require("util").types;return i||idt&&idt.binding&&idt.binding("util")}catch{}}();const qA=A_e;var OIt=qA&&qA.isTypedArray,L_e=OIt?SW(OIt):__e;const AW=L_e;function sdt(i,a){if(!(a==="constructor"&&typeof i[a]=="function")&&a!="__proto__")return i[a]}var M_e=Object.prototype,D_e=M_e.hasOwnProperty;function LW(i,a,f){var p=i[a];(!(D_e.call(i,a)&&RA(p,f))||f===void 0&&!(a in i))&&TW(i,a,f)}function eF(i,a,f,p){var w=!f;f||(f={});for(var m=-1,b=a.length;++m-1&&i%1==0&&i0){if(++a>=U_e)return arguments[0]}else a=0;return i.apply(void 0,arguments)}}var X_e=K_e(G_e);const RIt=X_e;function DW(i,a){return RIt(BIt(i,a,lT),i+"")}function nF(i,a,f){if(!Fb(f))return!1;var p=typeof a;return(p=="number"?ck(f)&&MW(a,f.length):p=="string"&&a in f)?RA(f[a],i):!1}function Q_e(i){return DW(function(a,f){var p=-1,w=f.length,m=w>1?f[w-1]:void 0,b=w>2?f[2]:void 0;for(m=i.length>3&&typeof m=="function"?(w--,m):void 0,b&&nF(f[0],f[1],b)&&(m=w<3?void 0:m,w=1),a=Object(a);++pE.args);mW(b),p=Z1(p,[...b])}else p=f.args;if(!p)return;let w=yW(i,a);const m="config";return p[m]!==void 0&&(w==="flowchart-v2"&&(w="flowchart"),p[w]=p[m],delete p[m]),p},$It=function(i,a=null){try{const f=new RegExp(`[%]{2}(?![{]${tSe.source})(?=[}][%]{2}).* +`,"ig");i=i.trim().replace(f,"").replace(/'/gm,'"'),Ut.debug(`Detecting diagram directive${a!==null?" type:"+a:""} based on the text:${i}`);let p;const w=[];for(;(p=XP.exec(i))!==null;)if(p.index===XP.lastIndex&&XP.lastIndex++,p&&!a||a&&p[1]&&p[1].match(a)||a&&p[2]&&p[2].match(a)){const m=p[1]?p[1]:p[2],b=p[3]?p[3].trim():p[4]?JSON.parse(p[4].trim()):null;w.push({type:m,args:b})}return w.length===0?{type:i,args:null}:w.length===1?w[0]:w}catch(f){return Ut.error(`ERROR: ${f.message} - Unable to parse directive type: '${a}' based on the text: '${i}'`),{type:void 0,args:null}}},nSe=function(i){return i.replace(XP,"")},rSe=function(i,a){for(const[f,p]of a.entries())if(p.match(i))return f;return-1};function ew(i,a){if(!i)return a;const f=`curve${i.charAt(0).toUpperCase()+i.slice(1)}`;return J_e[f]??a}function iSe(i,a){const f=i.trim();if(f)return a.securityLevel!=="loose"?ik(f):f}const sSe=(i,...a)=>{const f=i.split("."),p=f.length-1,w=f[p];let m=window;for(let b=0;b{f+=zIt(w,a),a=w});const p=f/2;return adt(i,p)}function oSe(i){return i.length===1?i[0]:aSe(i)}const qIt=(i,a=2)=>{const f=Math.pow(10,a);return Math.round(i*f)/f},adt=(i,a)=>{let f,p=a;for(const w of i){if(f){const m=zIt(w,f);if(m=1)return{x:w.x,y:w.y};if(b>0&&b<1)return{x:qIt((1-b)*f.x+b*w.x,5),y:qIt((1-b)*f.y+b*w.y,5)}}}f=w}throw new Error("Could not find a suitable point for the given distance")},cSe=(i,a,f)=>{Ut.info(`our points ${JSON.stringify(a)}`),a[0]!==f&&(a=a.reverse());const w=adt(a,25),m=i?10:5,b=Math.atan2(a[0].y-w.y,a[0].x-w.x),E={x:0,y:0};return E.x=Math.sin(b)*m+(a[0].x+w.x)/2,E.y=-Math.cos(b)*m+(a[0].y+w.y)/2,E};function uSe(i,a,f){const p=structuredClone(f);Ut.info("our points",p),a!=="start_left"&&a!=="start_right"&&p.reverse();const w=25+i,m=adt(p,w),b=10+i*.5,E=Math.atan2(p[0].y-m.y,p[0].x-m.x),_={x:0,y:0};return a==="start_left"?(_.x=Math.sin(E+Math.PI)*b+(p[0].x+m.x)/2,_.y=-Math.cos(E+Math.PI)*b+(p[0].y+m.y)/2):a==="end_right"?(_.x=Math.sin(E-Math.PI)*b+(p[0].x+m.x)/2-5,_.y=-Math.cos(E-Math.PI)*b+(p[0].y+m.y)/2-5):a==="end_left"?(_.x=Math.sin(E)*b+(p[0].x+m.x)/2-5,_.y=-Math.cos(E)*b+(p[0].y+m.y)/2-5):(_.x=Math.sin(E)*b+(p[0].x+m.x)/2,_.y=-Math.cos(E)*b+(p[0].y+m.y)/2),_}function im(i){let a="",f="";for(const p of i)p!==void 0&&(p.startsWith("color:")||p.startsWith("text-align:")?f=f+p+";":a=a+p+";");return{style:a,labelStyle:f}}let HIt=0;const VIt=()=>(HIt++,"id-"+Math.random().toString(36).substr(2,12)+"-"+HIt);function lSe(i){let a="";const f="0123456789abcdef",p=f.length;for(let w=0;wlSe(i.length),hSe=function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},fSe=function(i,a){const f=a.text.replace(Kr.lineBreakRegex," "),[,p]=VA(a.fontSize),w=i.append("text");w.attr("x",a.x),w.attr("y",a.y),w.style("text-anchor",a.anchor),w.style("font-family",a.fontFamily),w.style("font-size",p),w.style("font-weight",a.fontWeight),w.attr("fill",a.fill),a.class!==void 0&&w.attr("class",a.class);const m=w.append("tspan");return m.attr("x",a.x+a.textMargin*2),m.attr("fill",a.fill),m.text(f),w},UIt=jA((i,a,f)=>{if(!i||(f=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
"},f),Kr.lineBreakRegex.test(i)))return i;const p=i.split(" "),w=[];let m="";return p.forEach((b,E)=>{const _=d3(`${b} `,f),A=d3(m,f);if(_>a){const{hyphenatedStrings:N,remainingWord:R}=dSe(b,a,"-",f);w.push(m,...N),m=R}else A+_>=a?(w.push(m),m=b):m=[m,b].filter(Boolean).join(" ");E+1===p.length&&w.push(m)}),w.filter(b=>b!=="").join(f.joinWith)},(i,a,f)=>`${i}${a}${f.fontSize}${f.fontWeight}${f.fontFamily}${f.joinWith}`),dSe=jA((i,a,f="-",p)=>{p=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},p);const w=[...i],m=[];let b="";return w.forEach((E,_)=>{const A=`${b}${E}`;if(d3(A,p)>=a){const B=_+1,N=w.length===B,R=`${A}${f}`;m.push(N?A:R),b=""}else b=A}),{hyphenatedStrings:m,remainingWord:b}},(i,a,f="-",p)=>`${i}${a}${f}${p.fontSize}${p.fontWeight}${p.fontFamily}`);function odt(i,a){return cdt(i,a).height}function d3(i,a){return cdt(i,a).width}const cdt=jA((i,a)=>{const{fontSize:f=12,fontFamily:p="Arial",fontWeight:w=400}=a;if(!i)return{width:0,height:0};const[,m]=VA(f),b=["sans-serif",p],E=i.split(Kr.lineBreakRegex),_=[],A=yr("body");if(!A.remove)return{width:0,height:0,lineHeight:0};const I=A.append("svg");for(const N of b){let R=0;const z={width:0,height:0,lineHeight:0};for(const W of E){const et=hSe();et.text=W||jIt;const st=fSe(I,et).style("font-size",m).style("font-weight",w).style("font-family",N),at=(st._groups||st)[0][0].getBBox();if(at.width===0&&at.height===0)throw new Error("svg element not in render tree");z.width=Math.round(Math.max(z.width,at.width)),R=Math.round(at.height),z.height+=R,z.lineHeight=Math.round(Math.max(z.lineHeight,R))}_.push(z)}I.remove();const B=isNaN(_[1].height)||isNaN(_[1].width)||isNaN(_[1].lineHeight)||_[0].height>_[1].height&&_[0].width>_[1].width&&_[0].lineHeight>_[1].lineHeight?0:1;return _[B]},(i,a)=>`${i}${a.fontSize}${a.fontWeight}${a.fontFamily}`);class gSe{constructor(a=!1,f){this.count=0,this.count=f?f.length:0,this.next=a?()=>this.count++:()=>Date.now()}}let OW;const pSe=function(i){return OW=OW||document.createElement("div"),i=escape(i).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),OW.innerHTML=i,unescape(OW.textContent)};function WIt(i){return"str"in i}const bSe=(i,a,f,p)=>{var m;if(!p)return;const w=(m=i.node())==null?void 0:m.getBBox();w&&i.append("text").text(p).attr("x",w.x+w.width/2).attr("y",-f).attr("class",a)},VA=i=>{if(typeof i=="number")return[i,i+"px"];const a=parseInt(i??"",10);return Number.isNaN(a)?[void 0,void 0]:i===String(a)?[a,i+"px"]:[a,i]};function rF(i,a){return IW({},i,a)}const $a={assignWithDepth:Z1,wrapLabel:UIt,calculateTextHeight:odt,calculateTextWidth:d3,calculateTextDimensions:cdt,cleanAndMerge:rF,detectInit:eSe,detectDirective:$It,isSubstringInArray:rSe,interpolateToCurve:ew,calcLabelPosition:oSe,calcCardinalityPosition:cSe,calcTerminalLabelPosition:uSe,formatUrl:iSe,getStylesFromArray:im,generateId:VIt,random:GIt,runFunc:sSe,entityDecode:pSe,insertTitle:bSe,parseFontSize:VA,InitIDGenerator:gSe};var YIt="comm",KIt="rule",XIt="decl",wSe="@import",vSe="@keyframes",mSe=Math.abs,udt=String.fromCharCode;function QIt(i){return i.trim()}function ldt(i,a,f){return i.replace(a,f)}function ySe(i,a){return i.indexOf(a)}function iF(i,a){return i.charCodeAt(a)|0}function sF(i,a,f){return i.slice(a,f)}function uk(i){return i.length}function ZIt(i){return i.length}function PW(i,a){return a.push(i),i}var FW=1,GA=1,JIt=0,nw=0,Of=0,UA="";function hdt(i,a,f,p,w,m,b){return{value:i,root:a,parent:f,type:p,props:w,children:m,line:FW,column:GA,length:b,return:""}}function xSe(){return Of}function kSe(){return Of=nw>0?iF(UA,--nw):0,GA--,Of===10&&(GA=1,FW--),Of}function sm(){return Of=nw2||fdt(Of)>3?"":" "}function _Se(i,a){for(;--a&&sm()&&!(Of<48||Of>102||Of>57&&Of<65||Of>70&&Of<97););return BW(i,NW()+(a<6&&hT()==32&&sm()==32))}function gdt(i){for(;sm();)switch(Of){case i:return nw;case 34:case 39:i!==34&&i!==39&&gdt(Of);break;case 40:i===41&&gdt(i);break;case 92:sm();break}return nw}function SSe(i,a){for(;sm()&&i+Of!==47+10;)if(i+Of===42+42&&hT()===47)break;return"/*"+BW(a,nw-1)+"*"+udt(i===47?i:sm())}function ASe(i){for(;!fdt(hT());)sm();return BW(i,nw)}function LSe(i){return TSe(RW("",null,null,null,[""],i=ESe(i),0,[0],i))}function RW(i,a,f,p,w,m,b,E,_){for(var A=0,I=0,B=b,N=0,R=0,z=0,W=1,et=1,st=1,at=0,bt="",mt=w,yt=m,ft=p,ut=bt;et;)switch(z=at,at=sm()){case 40:if(z!=108&&iF(ut,B-1)==58){ySe(ut+=ldt(ddt(at),"&","&\f"),"&\f")!=-1&&(st=-1);break}case 34:case 39:case 91:ut+=ddt(at);break;case 9:case 10:case 13:case 32:ut+=CSe(z);break;case 92:ut+=_Se(NW()-1,7);continue;case 47:switch(hT()){case 42:case 47:PW(MSe(SSe(sm(),NW()),a,f),_);break;default:ut+="/"}break;case 123*W:E[A++]=uk(ut)*st;case 125*W:case 59:case 0:switch(at){case 0:case 125:et=0;case 59+I:R>0&&uk(ut)-B&&PW(R>32?eOt(ut+";",p,f,B-1):eOt(ldt(ut," ","")+";",p,f,B-2),_);break;case 59:ut+=";";default:if(PW(ft=tOt(ut,a,f,A,I,w,E,bt,mt=[],yt=[],B),m),at===123)if(I===0)RW(ut,a,ft,ft,mt,m,B,E,yt);else switch(N===99&&iF(ut,3)===110?100:N){case 100:case 109:case 115:RW(i,ft,ft,p&&PW(tOt(i,ft,ft,0,0,w,E,bt,w,mt=[],B),yt),w,yt,B,E,p?mt:yt);break;default:RW(ut,ft,ft,ft,[""],yt,0,E,yt)}}A=I=R=0,W=st=1,bt=ut="",B=b;break;case 58:B=1+uk(ut),R=z;default:if(W<1){if(at==123)--W;else if(at==125&&W++==0&&kSe()==125)continue}switch(ut+=udt(at),at*W){case 38:st=I>0?1:(ut+="\f",-1);break;case 44:E[A++]=(uk(ut)-1)*st,st=1;break;case 64:hT()===45&&(ut+=ddt(sm())),N=hT(),I=B=uk(bt=ut+=ASe(NW())),at++;break;case 45:z===45&&uk(ut)==2&&(W=0)}}return m}function tOt(i,a,f,p,w,m,b,E,_,A,I){for(var B=w-1,N=w===0?m:[""],R=ZIt(N),z=0,W=0,et=0;z0?N[st]+" "+at:ldt(at,/&\f/g,N[st])))&&(_[et++]=bt);return hdt(i,a,f,w===0?KIt:E,_,A,I)}function MSe(i,a,f){return hdt(i,a,f,YIt,udt(xSe()),sF(i,2,-2),0)}function eOt(i,a,f,p){return hdt(i,a,f,XIt,sF(i,0,p),sF(i,p+1,-1),p)}function pdt(i,a){for(var f="",p=ZIt(i),w=0;w{let f=Z1({},i),p={};for(const w of a)aOt(w),p=Z1(p,w);if(f=Z1(f,p),p.theme&&p.theme in T5){const w=Z1({},rOt),m=Z1(w.themeVariables||{},p.themeVariables);f.theme&&f.theme in T5&&(f.themeVariables=T5[f.theme].getThemeVariables(m))}return aF=f,cOt(aF),aF},ISe=i=>(fp=Z1({},WA),fp=Z1(fp,i),i.theme&&T5[i.theme]&&(fp.themeVariables=T5[i.theme].getThemeVariables(i.themeVariables)),jW(fp,YA),fp),OSe=i=>{rOt=Z1({},i)},PSe=i=>(fp=Z1(fp,i),jW(fp,YA),fp),iOt=()=>Z1({},fp),sOt=i=>(cOt(i),Z1(aF,i),Fd()),Fd=()=>Z1({},aF),aOt=i=>{i&&(["secure",...fp.secure??[]].forEach(a=>{Object.hasOwn(i,a)&&(Ut.debug(`Denied attempt to modify a secure key ${a}`,i[a]),delete i[a])}),Object.keys(i).forEach(a=>{a.startsWith("__")&&delete i[a]}),Object.keys(i).forEach(a=>{typeof i[a]=="string"&&(i[a].includes("<")||i[a].includes(">")||i[a].includes("url(data:"))&&delete i[a],typeof i[a]=="object"&&aOt(i[a])}))},FSe=i=>{mW(i),i.fontFamily&&(!i.themeVariables||!i.themeVariables.fontFamily)&&(i.themeVariables={fontFamily:i.fontFamily}),YA.push(i),jW(fp,YA)},$W=(i=fp)=>{YA=[],jW(i,YA)},NSe={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead."},oOt={},BSe=i=>{oOt[i]||(Ut.warn(NSe[i]),oOt[i]=!0)},cOt=i=>{i&&(i.lazyLoadedDiagrams||i.loadExternalDiagramsAtStartup)&&BSe("LAZY_LOAD_DEPRECATED")},uOt="c4",RSe={id:uOt,detector:i=>/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>nIe);return{id:uOt,diagram:i}}},lOt="flowchart",jSe={id:lOt,detector:(i,a)=>{var f,p;return((f=a==null?void 0:a.flowchart)==null?void 0:f.defaultRenderer)==="dagre-wrapper"||((p=a==null?void 0:a.flowchart)==null?void 0:p.defaultRenderer)==="elk"?!1:/^\s*graph/.test(i)},loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>cze);return{id:lOt,diagram:i}}},hOt="flowchart-v2",$Se={id:hOt,detector:(i,a)=>{var f,p,w;return((f=a==null?void 0:a.flowchart)==null?void 0:f.defaultRenderer)==="dagre-d3"||((p=a==null?void 0:a.flowchart)==null?void 0:p.defaultRenderer)==="elk"?!1:/^\s*graph/.test(i)&&((w=a==null?void 0:a.flowchart)==null?void 0:w.defaultRenderer)==="dagre-wrapper"?!0:/^\s*flowchart/.test(i)},loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>uze);return{id:hOt,diagram:i}}},fOt="er",zSe={id:fOt,detector:i=>/^\s*erDiagram/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>Fze);return{id:fOt,diagram:i}}},dOt="gitGraph",qSe={id:dOt,detector:i=>/^\s*gitGraph/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>aqe);return{id:dOt,diagram:i}}},gOt="gantt",HSe={id:gOt,detector:i=>/^\s*gantt/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>Kqe);return{id:gOt,diagram:i}}},pOt="info",VSe={id:pOt,detector:i=>/^\s*info/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>Qqe);return{id:pOt,diagram:i}}},bOt="pie",GSe={id:bOt,detector:i=>/^\s*pie/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>rHe);return{id:bOt,diagram:i}}},wOt="quadrantChart",USe={id:wOt,detector:i=>/^\s*quadrantChart/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>mHe);return{id:wOt,diagram:i}}},vOt="xychart",WSe={id:vOt,detector:i=>/^\s*xychart-beta/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>HHe);return{id:vOt,diagram:i}}},mOt="requirement",YSe={id:mOt,detector:i=>/^\s*requirement(Diagram)?/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>JHe);return{id:mOt,diagram:i}}},yOt="sequence",KSe={id:yOt,detector:i=>/^\s*sequenceDiagram/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>iGe);return{id:yOt,diagram:i}}},xOt="class",XSe={id:xOt,detector:(i,a)=>{var f;return((f=a==null?void 0:a.class)==null?void 0:f.defaultRenderer)==="dagre-wrapper"?!1:/^\s*classDiagram/.test(i)},loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>AGe);return{id:xOt,diagram:i}}},kOt="classDiagram",QSe={id:kOt,detector:(i,a)=>{var f;return/^\s*classDiagram/.test(i)&&((f=a==null?void 0:a.class)==null?void 0:f.defaultRenderer)==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(i)},loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>PGe);return{id:kOt,diagram:i}}},EOt="state",ZSe={id:EOt,detector:(i,a)=>{var f;return((f=a==null?void 0:a.state)==null?void 0:f.defaultRenderer)==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(i)},loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>xUe);return{id:EOt,diagram:i}}},TOt="stateDiagram",JSe={id:TOt,detector:(i,a)=>{var f;return!!(/^\s*stateDiagram-v2/.test(i)||/^\s*stateDiagram/.test(i)&&((f=a==null?void 0:a.state)==null?void 0:f.defaultRenderer)==="dagre-wrapper")},loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>$Ue);return{id:TOt,diagram:i}}},COt="journey",tAe={id:COt,detector:i=>/^\s*journey/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>sWe);return{id:COt,diagram:i}}},eAe=function(i,a){for(let f of a)i.attr(f[0],f[1])},nAe=function(i,a,f){let p=new Map;return f?(p.set("width","100%"),p.set("style",`max-width: ${a}px;`)):(p.set("height",i),p.set("width",a)),p},k0=function(i,a,f,p){const w=nAe(a,f,p);eAe(i,w)},fT=function(i,a,f,p){const w=a.node().getBBox(),m=w.width,b=w.height;Ut.info(`SVG bounds: ${m}x${b}`,w);let E=0,_=0;Ut.info(`Graph bounds: ${E}x${_}`,i),E=m+f*2,_=b+f*2,Ut.info(`Calculated bounds: ${E}x${_}`),k0(a,_,E,p);const A=`${w.x-f} ${w.y-f} ${w.width+2*f} ${w.height+2*f}`;a.attr("viewBox",A)},zW={},rAe=(i,a,f)=>{let p="";return i in zW&&zW[i]?p=zW[i](f):Ut.warn(`No theme found for ${i}`),` & { + font-family: ${f.fontFamily}; + font-size: ${f.fontSize}; + fill: ${f.textColor} + } + + /* Classes common for multiple diagrams */ + + & .error-icon { + fill: ${f.errorBkgColor}; + } + & .error-text { + fill: ${f.errorTextColor}; + stroke: ${f.errorTextColor}; + } + + & .edge-thickness-normal { + stroke-width: 2px; + } + & .edge-thickness-thick { + stroke-width: 3.5px + } + & .edge-pattern-solid { + stroke-dasharray: 0; + } + + & .edge-pattern-dashed{ + stroke-dasharray: 3; + } + .edge-pattern-dotted { + stroke-dasharray: 2; + } + + & .marker { + fill: ${f.lineColor}; + stroke: ${f.lineColor}; + } + & .marker.cross { + stroke: ${f.lineColor}; + } + + & svg { + font-family: ${f.fontFamily}; + font-size: ${f.fontSize}; + } + + ${p} + + ${a} +`},iAe=(i,a)=>{a!==void 0&&(zW[i]=a)},sAe=rAe;let bdt="",wdt="",vdt="";const mdt=i=>Q1(i,Fd()),hg=()=>{bdt="",vdt="",wdt=""},E0=i=>{bdt=mdt(i).replace(/^\s+/g,"")},fg=()=>bdt,dg=i=>{vdt=mdt(i).replace(/\n\s+/g,` +`)},gg=()=>vdt,Nb=i=>{wdt=mdt(i)},pg=()=>wdt,_Ot=Object.freeze(Object.defineProperty({__proto__:null,clear:hg,getAccDescription:gg,getAccTitle:fg,getDiagramTitle:pg,setAccDescription:dg,setAccTitle:E0,setDiagramTitle:Nb},Symbol.toStringTag,{value:"Module"})),aAe=Ut,oAe=Xft,Oe=Fd,cAe=sOt,SOt=WA,uAe=i=>Q1(i,Oe()),AOt=fT,lAe=()=>_Ot,qW={},HW=(i,a,f)=>{var p;if(qW[i])throw new Error(`Diagram ${i} already registered.`);qW[i]=a,f&&uIt(i,f),iAe(i,a.styles),(p=a.injectUtils)==null||p.call(a,aAe,oAe,Oe,uAe,AOt,lAe(),()=>{})},ydt=i=>{if(i in qW)return qW[i];throw new hAe(i)};class hAe extends Error{constructor(a){super(`Diagram ${a} not found.`)}}const VW=i=>{var w;const{securityLevel:a}=Oe();let f=yr("body");if(a==="sandbox"){const b=((w=yr(`#i${i}`).node())==null?void 0:w.contentDocument)??document;f=yr(b.body)}return f.select(`#${i}`)},LOt={draw:(i,a,f)=>{Ut.debug(`renering svg for syntax error +`);const p=VW(a);p.attr("viewBox","0 0 2412 512"),k0(p,100,512,!0);const w=p.append("g");w.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),w.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),w.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),w.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),w.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),w.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),w.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),w.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${f}`)}},fAe=LOt,dAe={db:{},renderer:LOt,parser:{parser:{yy:{}},parse:()=>{}}},MOt="flowchart-elk",gAe={id:MOt,detector:(i,a)=>{var f;return!!(/^\s*flowchart-elk/.test(i)||/^\s*flowchart|graph/.test(i)&&((f=a==null?void 0:a.flowchart)==null?void 0:f.defaultRenderer)==="elk")},loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>xWe);return{id:MOt,diagram:i}}},DOt="timeline",pAe={id:DOt,detector:i=>/^\s*timeline/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>$We);return{id:DOt,diagram:i}}},IOt="mindmap",bAe={id:IOt,detector:i=>/^\s*mindmap/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>bYe);return{id:IOt,diagram:i}}},OOt="sankey",wAe={id:OOt,detector:i=>/^\s*sankey-beta/.test(i),loader:async()=>{const{diagram:i}=await Promise.resolve().then(()=>UYe);return{id:OOt,diagram:i}}};let POt=!1;const xdt=()=>{POt||(POt=!0,HW("error",dAe,i=>i.toLowerCase().trim()==="error"),HW("---",{db:{clear:()=>{}},styles:{},renderer:{draw:()=>{}},parser:{parser:{yy:{}},parse:()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")}},init:()=>null},i=>i.toLowerCase().trimStart().startsWith("---")),cIt(RSe,QSe,XSe,zSe,HSe,VSe,GSe,YSe,KSe,gAe,$Se,jSe,bAe,pAe,qSe,JSe,ZSe,tAe,USe,wAe,WSe))};class FOt{constructor(a,f={}){this.text=a,this.metadata=f,this.type="graph",this.text+=` +`;const p=Fd();try{this.type=yW(a,p)}catch(m){this.type="error",this.detectError=m}const w=ydt(this.type);Ut.debug("Type "+this.type),this.db=w.db,this.renderer=w.renderer,this.parser=w.parser,this.parser.parser.yy=this.db,this.init=w.init,this.parse()}parse(){var f,p,w,m,b;if(this.detectError)throw this.detectError;(p=(f=this.db).clear)==null||p.call(f);const a=Fd();(w=this.init)==null||w.call(this,a),this.metadata.title&&((b=(m=this.db).setDiagramTitle)==null||b.call(m,this.metadata.title)),this.parser.parse(this.text)}async render(a,f){await this.renderer.draw(this.text,a,f,this)}getParser(){return this.parser}getType(){return this.type}}const kdt=async(i,a={})=>{const f=yW(i,Fd());try{ydt(f)}catch{const w=ECe(f);if(!w)throw new oIt(`Diagram ${f} not found.`);const{id:m,diagram:b}=await w();HW(m,b)}return new FOt(i,a)};let Edt=[];const vAe=i=>{Edt.push(i)},mAe=()=>{Edt.forEach(i=>{i()}),Edt=[]};var yAe=kIt(Object.keys,Object);const xAe=yAe;var kAe=Object.prototype,EAe=kAe.hasOwnProperty;function NOt(i){if(!_W(i))return xAe(i);var a=[];for(var f in Object(i))EAe.call(i,f)&&f!="constructor"&&a.push(f);return a}var TAe=oT(nm,"DataView");const Tdt=TAe;var CAe=oT(nm,"Promise");const Cdt=CAe;var _Ae=oT(nm,"Set");const KA=_Ae;var SAe=oT(nm,"WeakMap");const _dt=SAe;var BOt="[object Map]",AAe="[object Object]",ROt="[object Promise]",jOt="[object Set]",$Ot="[object WeakMap]",zOt="[object DataView]",LAe=aT(Tdt),MAe=aT(JP),DAe=aT(Cdt),IAe=aT(KA),OAe=aT(_dt),dT=sT;(Tdt&&dT(new Tdt(new ArrayBuffer(1)))!=zOt||JP&&dT(new JP)!=BOt||Cdt&&dT(Cdt.resolve())!=ROt||KA&&dT(new KA)!=jOt||_dt&&dT(new _dt)!=$Ot)&&(dT=function(i){var a=sT(i),f=a==AAe?i.constructor:void 0,p=f?aT(f):"";if(p)switch(p){case LAe:return zOt;case MAe:return BOt;case DAe:return ROt;case IAe:return jOt;case OAe:return $Ot}return a});const XA=dT;var PAe="[object Map]",FAe="[object Set]",NAe=Object.prototype,BAe=NAe.hasOwnProperty;function oF(i){if(i==null)return!0;if(ck(i)&&(If(i)||typeof i=="string"||typeof i.splice=="function"||zA(i)||AW(i)||$A(i)))return!i.length;var a=XA(i);if(a==PAe||a==FAe)return!i.size;if(_W(i))return!NOt(i).length;for(var f in i)if(BAe.call(i,f))return!1;return!0}const RAe="graphics-document document";function jAe(i,a){i.attr("role",RAe),a!==""&&i.attr("aria-roledescription",a)}function $Ae(i,a,f,p){if(i.insert!==void 0){if(f){const w=`chart-desc-${p}`;i.attr("aria-describedby",w),i.insert("desc",":first-child").attr("id",w).text(f)}if(a){const w=`chart-title-${p}`;i.attr("aria-labelledby",w),i.insert("title",":first-child").attr("id",w).text(a)}}}const zAe=i=>i.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart();/*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT */function qOt(i){return typeof i>"u"||i===null}function qAe(i){return typeof i=="object"&&i!==null}function HAe(i){return Array.isArray(i)?i:qOt(i)?[]:[i]}function VAe(i,a){var f,p,w,m;if(a)for(m=Object.keys(a),f=0,p=m.length;fE&&(m=" ... ",a=p-E+m.length),f-p>E&&(b=" ...",f=p+E-b.length),{str:m+i.slice(a,f).replace(/\t/g,"→")+b,pos:p-a+m.length}}function Adt(i,a){return bg.repeat(" ",a-i.length)+i}function JAe(i,a){if(a=Object.create(a||null),!i.buffer)return null;a.maxLength||(a.maxLength=79),typeof a.indent!="number"&&(a.indent=1),typeof a.linesBefore!="number"&&(a.linesBefore=3),typeof a.linesAfter!="number"&&(a.linesAfter=2);for(var f=/\r?\n|\r|\0/g,p=[0],w=[],m,b=-1;m=f.exec(i.buffer);)w.push(m.index),p.push(m.index+m[0].length),i.position<=m.index&&b<0&&(b=p.length-2);b<0&&(b=p.length-1);var E="",_,A,I=Math.min(i.line+a.linesAfter,w.length).toString().length,B=a.maxLength-(a.indent+I+3);for(_=1;_<=a.linesBefore&&!(b-_<0);_++)A=Sdt(i.buffer,p[b-_],w[b-_],i.position-(p[b]-p[b-_]),B),E=bg.repeat(" ",a.indent)+Adt((i.line-_+1).toString(),I)+" | "+A.str+` +`+E;for(A=Sdt(i.buffer,p[b],w[b],i.position,B),E+=bg.repeat(" ",a.indent)+Adt((i.line+1).toString(),I)+" | "+A.str+` +`,E+=bg.repeat("-",a.indent+I+3+A.pos)+`^ +`,_=1;_<=a.linesAfter&&!(b+_>=w.length);_++)A=Sdt(i.buffer,p[b+_],w[b+_],i.position-(p[b]-p[b+_]),B),E+=bg.repeat(" ",a.indent)+Adt((i.line+_+1).toString(),I)+" | "+A.str+` +`;return E.replace(/\n$/,"")}var tLe=JAe,eLe=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],nLe=["scalar","sequence","mapping"];function rLe(i){var a={};return i!==null&&Object.keys(i).forEach(function(f){i[f].forEach(function(p){a[String(p)]=f})}),a}function iLe(i,a){if(a=a||{},Object.keys(a).forEach(function(f){if(eLe.indexOf(f)===-1)throw new A5('Unknown option "'+f+'" is met in definition of "'+i+'" YAML type.')}),this.options=a,this.tag=i,this.kind=a.kind||null,this.resolve=a.resolve||function(){return!0},this.construct=a.construct||function(f){return f},this.instanceOf=a.instanceOf||null,this.predicate=a.predicate||null,this.represent=a.represent||null,this.representName=a.representName||null,this.defaultStyle=a.defaultStyle||null,this.multi=a.multi||!1,this.styleAliases=rLe(a.styleAliases||null),nLe.indexOf(this.kind)===-1)throw new A5('Unknown kind "'+this.kind+'" is specified for "'+i+'" YAML type.')}var T0=iLe;function VOt(i,a){var f=[];return i[a].forEach(function(p){var w=f.length;f.forEach(function(m,b){m.tag===p.tag&&m.kind===p.kind&&m.multi===p.multi&&(w=b)}),f[w]=p}),f}function sLe(){var i={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},a,f;function p(w){w.multi?(i.multi[w.kind].push(w),i.multi.fallback.push(w)):i[w.kind][w.tag]=i.fallback[w.tag]=w}for(a=0,f=arguments.length;a=0?"0b"+i.toString(2):"-0b"+i.toString(2).slice(1)},octal:function(i){return i>=0?"0o"+i.toString(8):"-0o"+i.toString(8).slice(1)},decimal:function(i){return i.toString(10)},hexadecimal:function(i){return i>=0?"0x"+i.toString(16).toUpperCase():"-0x"+i.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),_Le=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function SLe(i){return!(i===null||!_Le.test(i)||i[i.length-1]==="_")}function ALe(i){var a,f;return a=i.replace(/_/g,"").toLowerCase(),f=a[0]==="-"?-1:1,"+-".indexOf(a[0])>=0&&(a=a.slice(1)),a===".inf"?f===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:a===".nan"?NaN:f*parseFloat(a,10)}var LLe=/^[-+]?[0-9]+e/;function MLe(i,a){var f;if(isNaN(i))switch(a){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===i)switch(a){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===i)switch(a){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(bg.isNegativeZero(i))return"-0.0";return f=i.toString(10),LLe.test(f)?f.replace("e",".e"):f}function DLe(i){return Object.prototype.toString.call(i)==="[object Number]"&&(i%1!==0||bg.isNegativeZero(i))}var ILe=new T0("tag:yaml.org,2002:float",{kind:"scalar",resolve:SLe,construct:ALe,predicate:DLe,represent:MLe,defaultStyle:"lowercase"}),GOt=lLe.extend({implicit:[gLe,vLe,CLe,ILe]}),OLe=GOt,UOt=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),WOt=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function PLe(i){return i===null?!1:UOt.exec(i)!==null||WOt.exec(i)!==null}function FLe(i){var a,f,p,w,m,b,E,_=0,A=null,I,B,N;if(a=UOt.exec(i),a===null&&(a=WOt.exec(i)),a===null)throw new Error("Date resolve error");if(f=+a[1],p=+a[2]-1,w=+a[3],!a[4])return new Date(Date.UTC(f,p,w));if(m=+a[4],b=+a[5],E=+a[6],a[7]){for(_=a[7].slice(0,3);_.length<3;)_+="0";_=+_}return a[9]&&(I=+a[10],B=+(a[11]||0),A=(I*60+B)*6e4,a[9]==="-"&&(A=-A)),N=new Date(Date.UTC(f,p,w,m,b,E,_)),A&&N.setTime(N.getTime()-A),N}function NLe(i){return i.toISOString()}var BLe=new T0("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:PLe,construct:FLe,instanceOf:Date,represent:NLe});function RLe(i){return i==="<<"||i===null}var jLe=new T0("tag:yaml.org,2002:merge",{kind:"scalar",resolve:RLe}),Mdt=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function $Le(i){if(i===null)return!1;var a,f,p=0,w=i.length,m=Mdt;for(f=0;f64)){if(a<0)return!1;p+=6}return p%8===0}function zLe(i){var a,f,p=i.replace(/[\r\n=]/g,""),w=p.length,m=Mdt,b=0,E=[];for(a=0;a>16&255),E.push(b>>8&255),E.push(b&255)),b=b<<6|m.indexOf(p.charAt(a));return f=w%4*6,f===0?(E.push(b>>16&255),E.push(b>>8&255),E.push(b&255)):f===18?(E.push(b>>10&255),E.push(b>>2&255)):f===12&&E.push(b>>4&255),new Uint8Array(E)}function qLe(i){var a="",f=0,p,w,m=i.length,b=Mdt;for(p=0;p>18&63],a+=b[f>>12&63],a+=b[f>>6&63],a+=b[f&63]),f=(f<<8)+i[p];return w=m%3,w===0?(a+=b[f>>18&63],a+=b[f>>12&63],a+=b[f>>6&63],a+=b[f&63]):w===2?(a+=b[f>>10&63],a+=b[f>>4&63],a+=b[f<<2&63],a+=b[64]):w===1&&(a+=b[f>>2&63],a+=b[f<<4&63],a+=b[64],a+=b[64]),a}function HLe(i){return Object.prototype.toString.call(i)==="[object Uint8Array]"}var VLe=new T0("tag:yaml.org,2002:binary",{kind:"scalar",resolve:$Le,construct:zLe,predicate:HLe,represent:qLe}),GLe=Object.prototype.hasOwnProperty,ULe=Object.prototype.toString;function WLe(i){if(i===null)return!0;var a=[],f,p,w,m,b,E=i;for(f=0,p=E.length;f>10)+55296,(i-65536&1023)+56320)}for(var ePt=new Array(256),nPt=new Array(256),ZA=0;ZA<256;ZA++)ePt[ZA]=tPt(ZA)?1:0,nPt[ZA]=tPt(ZA);function dMe(i,a){this.input=i,this.filename=a.filename||null,this.schema=a.schema||iMe,this.onWarning=a.onWarning||null,this.legacy=a.legacy||!1,this.json=a.json||!1,this.listener=a.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=i.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function rPt(i,a){var f={name:i.filename,buffer:i.input.slice(0,-1),position:i.position,line:i.line,column:i.position-i.lineStart};return f.snippet=tLe(f),new A5(a,f)}function Ss(i,a){throw rPt(i,a)}function WW(i,a){i.onWarning&&i.onWarning.call(null,rPt(i,a))}var iPt={YAML:function(a,f,p){var w,m,b;a.version!==null&&Ss(a,"duplication of %YAML directive"),p.length!==1&&Ss(a,"YAML directive accepts exactly one argument"),w=/^([0-9]+)\.([0-9]+)$/.exec(p[0]),w===null&&Ss(a,"ill-formed argument of the YAML directive"),m=parseInt(w[1],10),b=parseInt(w[2],10),m!==1&&Ss(a,"unacceptable YAML version of the document"),a.version=p[0],a.checkLineBreaks=b<2,b!==1&&b!==2&&WW(a,"unsupported YAML version of the document")},TAG:function(a,f,p){var w,m;p.length!==2&&Ss(a,"TAG directive accepts exactly two arguments"),w=p[0],m=p[1],QOt.test(w)||Ss(a,"ill-formed tag handle (first argument) of the TAG directive"),lk.call(a.tagMap,w)&&Ss(a,'there is a previously declared suffix for "'+w+'" tag handle'),ZOt.test(m)||Ss(a,"ill-formed tag prefix (second argument) of the TAG directive");try{m=decodeURIComponent(m)}catch{Ss(a,"tag prefix is malformed: "+m)}a.tagMap[w]=m}};function hk(i,a,f,p){var w,m,b,E;if(a1&&(i.result+=bg.repeat(` +`,a-1))}function gMe(i,a,f){var p,w,m,b,E,_,A,I,B=i.kind,N=i.result,R;if(R=i.input.charCodeAt(i.position),dp(R)||QA(R)||R===35||R===38||R===42||R===33||R===124||R===62||R===39||R===34||R===37||R===64||R===96||(R===63||R===45)&&(w=i.input.charCodeAt(i.position+1),dp(w)||f&&QA(w)))return!1;for(i.kind="scalar",i.result="",m=b=i.position,E=!1;R!==0;){if(R===58){if(w=i.input.charCodeAt(i.position+1),dp(w)||f&&QA(w))break}else if(R===35){if(p=i.input.charCodeAt(i.position-1),dp(p))break}else{if(i.position===i.lineStart&&YW(i)||f&&QA(R))break;if(g3(R))if(_=i.line,A=i.lineStart,I=i.lineIndent,Pf(i,!1,-1),i.lineIndent>=a){E=!0,R=i.input.charCodeAt(i.position);continue}else{i.position=b,i.line=_,i.lineStart=A,i.lineIndent=I;break}}E&&(hk(i,m,b,!1),Odt(i,i.line-_),m=b=i.position,E=!1),gT(R)||(b=i.position+1),R=i.input.charCodeAt(++i.position)}return hk(i,m,b,!1),i.result?!0:(i.kind=B,i.result=N,!1)}function pMe(i,a){var f,p,w;if(f=i.input.charCodeAt(i.position),f!==39)return!1;for(i.kind="scalar",i.result="",i.position++,p=w=i.position;(f=i.input.charCodeAt(i.position))!==0;)if(f===39)if(hk(i,p,i.position,!0),f=i.input.charCodeAt(++i.position),f===39)p=i.position,i.position++,w=i.position;else return!0;else g3(f)?(hk(i,p,w,!0),Odt(i,Pf(i,!1,a)),p=w=i.position):i.position===i.lineStart&&YW(i)?Ss(i,"unexpected end of the document within a single quoted scalar"):(i.position++,w=i.position);Ss(i,"unexpected end of the stream within a single quoted scalar")}function bMe(i,a){var f,p,w,m,b,E;if(E=i.input.charCodeAt(i.position),E!==34)return!1;for(i.kind="scalar",i.result="",i.position++,f=p=i.position;(E=i.input.charCodeAt(i.position))!==0;){if(E===34)return hk(i,f,i.position,!0),i.position++,!0;if(E===92){if(hk(i,f,i.position,!0),E=i.input.charCodeAt(++i.position),g3(E))Pf(i,!1,a);else if(E<256&&ePt[E])i.result+=nPt[E],i.position++;else if((b=lMe(E))>0){for(w=b,m=0;w>0;w--)E=i.input.charCodeAt(++i.position),(b=uMe(E))>=0?m=(m<<4)+b:Ss(i,"expected hexadecimal character");i.result+=fMe(m),i.position++}else Ss(i,"unknown escape sequence");f=p=i.position}else g3(E)?(hk(i,f,p,!0),Odt(i,Pf(i,!1,a)),f=p=i.position):i.position===i.lineStart&&YW(i)?Ss(i,"unexpected end of the document within a double quoted scalar"):(i.position++,p=i.position)}Ss(i,"unexpected end of the stream within a double quoted scalar")}function wMe(i,a){var f=!0,p,w,m,b=i.tag,E,_=i.anchor,A,I,B,N,R,z=Object.create(null),W,et,st,at;if(at=i.input.charCodeAt(i.position),at===91)I=93,R=!1,E=[];else if(at===123)I=125,R=!0,E={};else return!1;for(i.anchor!==null&&(i.anchorMap[i.anchor]=E),at=i.input.charCodeAt(++i.position);at!==0;){if(Pf(i,!0,a),at=i.input.charCodeAt(i.position),at===I)return i.position++,i.tag=b,i.anchor=_,i.kind=R?"mapping":"sequence",i.result=E,!0;f?at===44&&Ss(i,"expected the node content, but found ','"):Ss(i,"missed comma between flow collection entries"),et=W=st=null,B=N=!1,at===63&&(A=i.input.charCodeAt(i.position+1),dp(A)&&(B=N=!0,i.position++,Pf(i,!0,a))),p=i.line,w=i.lineStart,m=i.position,tL(i,a,GW,!1,!0),et=i.tag,W=i.result,Pf(i,!0,a),at=i.input.charCodeAt(i.position),(N||i.line===p)&&at===58&&(B=!0,at=i.input.charCodeAt(++i.position),Pf(i,!0,a),tL(i,a,GW,!1,!0),st=i.result),R?JA(i,E,z,et,W,st,p,w,m):B?E.push(JA(i,null,z,et,W,st,p,w,m)):E.push(W),Pf(i,!0,a),at=i.input.charCodeAt(i.position),at===44?(f=!0,at=i.input.charCodeAt(++i.position)):f=!1}Ss(i,"unexpected end of the stream within a flow collection")}function vMe(i,a){var f,p,w=Ddt,m=!1,b=!1,E=a,_=0,A=!1,I,B;if(B=i.input.charCodeAt(i.position),B===124)p=!1;else if(B===62)p=!0;else return!1;for(i.kind="scalar",i.result="";B!==0;)if(B=i.input.charCodeAt(++i.position),B===43||B===45)Ddt===w?w=B===43?XOt:sMe:Ss(i,"repeat of a chomping mode identifier");else if((I=hMe(B))>=0)I===0?Ss(i,"bad explicit indentation width of a block scalar; it cannot be less than one"):b?Ss(i,"repeat of an indentation width identifier"):(E=a+I-1,b=!0);else break;if(gT(B)){do B=i.input.charCodeAt(++i.position);while(gT(B));if(B===35)do B=i.input.charCodeAt(++i.position);while(!g3(B)&&B!==0)}for(;B!==0;){for(Idt(i),i.lineIndent=0,B=i.input.charCodeAt(i.position);(!b||i.lineIndentE&&(E=i.lineIndent),g3(B)){_++;continue}if(i.lineIndenta)&&_!==0)Ss(i,"bad indentation of a sequence entry");else if(i.lineIndenta)&&(et&&(b=i.line,E=i.lineStart,_=i.position),tL(i,a,UW,!0,w)&&(et?z=i.result:W=i.result),et||(JA(i,B,N,R,z,W,b,E,_),R=z=W=null),Pf(i,!0,-1),at=i.input.charCodeAt(i.position)),(i.line===m||i.lineIndent>a)&&at!==0)Ss(i,"bad indentation of a mapping entry");else if(i.lineIndenta?_=1:i.lineIndent===a?_=0:i.lineIndenta?_=1:i.lineIndent===a?_=0:i.lineIndent tag; it should be "scalar", not "'+i.kind+'"'),B=0,N=i.implicitTypes.length;B"),i.result!==null&&z.kind!==i.kind&&Ss(i,"unacceptable node kind for !<"+i.tag+'> tag; it should be "'+z.kind+'", not "'+i.kind+'"'),z.resolve(i.result,i.tag)?(i.result=z.construct(i.result,i.tag),i.anchor!==null&&(i.anchorMap[i.anchor]=i.result)):Ss(i,"cannot resolve a node with !<"+i.tag+"> explicit tag")}return i.listener!==null&&i.listener("close",i),i.tag!==null||i.anchor!==null||I}function EMe(i){var a=i.position,f,p,w,m=!1,b;for(i.version=null,i.checkLineBreaks=i.legacy,i.tagMap=Object.create(null),i.anchorMap=Object.create(null);(b=i.input.charCodeAt(i.position))!==0&&(Pf(i,!0,-1),b=i.input.charCodeAt(i.position),!(i.lineIndent>0||b!==37));){for(m=!0,b=i.input.charCodeAt(++i.position),f=i.position;b!==0&&!dp(b);)b=i.input.charCodeAt(++i.position);for(p=i.input.slice(f,i.position),w=[],p.length<1&&Ss(i,"directive name must not be less than one character in length");b!==0;){for(;gT(b);)b=i.input.charCodeAt(++i.position);if(b===35){do b=i.input.charCodeAt(++i.position);while(b!==0&&!g3(b));break}if(g3(b))break;for(f=i.position;b!==0&&!dp(b);)b=i.input.charCodeAt(++i.position);w.push(i.input.slice(f,i.position))}b!==0&&Idt(i),lk.call(iPt,p)?iPt[p](i,p,w):WW(i,'unknown document directive "'+p+'"')}if(Pf(i,!0,-1),i.lineIndent===0&&i.input.charCodeAt(i.position)===45&&i.input.charCodeAt(i.position+1)===45&&i.input.charCodeAt(i.position+2)===45?(i.position+=3,Pf(i,!0,-1)):m&&Ss(i,"directives end mark is expected"),tL(i,i.lineIndent-1,UW,!1,!0),Pf(i,!0,-1),i.checkLineBreaks&&oMe.test(i.input.slice(a,i.position))&&WW(i,"non-ASCII line breaks are interpreted as content"),i.documents.push(i.result),i.position===i.lineStart&&YW(i)){i.input.charCodeAt(i.position)===46&&(i.position+=3,Pf(i,!0,-1));return}if(i.position"u"&&(f=a,a=null);var p=oPt(i,f);if(typeof a!="function")return p;for(var w=0,m=p.length;wi.replace(/\r\n?/g,` +`).replace(/<(\w+)([^>]*)>/g,(a,f,p)=>"<"+f+p.replace(/="([^"]*)"/g,"='$1'")+">"),OMe=i=>{const{text:a,metadata:f}=DMe(i),{displayMode:p,title:w,config:m={}}=f;return p&&(m.gantt||(m.gantt={}),m.gantt.displayMode=p),{title:w,config:m,text:a}},PMe=i=>{const a=$a.detectInit(i)??{},f=$a.detectDirective(i,"wrap");return Array.isArray(f)?a.wrap=f.some(({type:p})=>{}):(f==null?void 0:f.type)==="wrap"&&(a.wrap=!0),{text:nSe(i),directive:a}};function FMe(i){const a=IMe(i),f=OMe(a),p=PMe(f.text),w=rF(f.config,p.directive);return i=zAe(p.text),{code:i,title:f.title,config:w}}const NMe=5e4,BMe="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",RMe="sandbox",jMe="loose",$Me="http://www.w3.org/2000/svg",zMe="http://www.w3.org/1999/xlink",qMe="http://www.w3.org/1999/xhtml",HMe="100%",VMe="100%",GMe="border:0;margin:0;",UMe="margin:0",WMe="allow-top-navigation-by-user-activation allow-popups",YMe='The "iframe" tag is not supported by your browser.',KMe=["foreignobject"],XMe=["dominant-baseline"];function cPt(i){const a=FMe(i);return $W(),FSe(a.config??{}),a}async function QMe(i,a){xdt(),i=cPt(i).code;try{await kdt(i)}catch(f){if(a!=null&&a.suppressErrors)return!1;throw f}return!0}const ZMe=function(i){let a=i;return a=a.replace(/style.*:\S*#.*;/g,function(f){return f.substring(0,f.length-1)}),a=a.replace(/classDef.*:\S*#.*;/g,function(f){return f.substring(0,f.length-1)}),a=a.replace(/#\w+;/g,function(f){const p=f.substring(1,f.length-1);return/^\+?\d+$/.test(p)?"fl°°"+p+"¶ß":"fl°"+p+"¶ß"}),a},uF=function(i){return i.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},uPt=(i,a,f=[])=>` +.${i} ${a} { ${f.join(" !important; ")} !important; }`,JMe=(i,a={})=>{var p;let f="";if(i.themeCSS!==void 0&&(f+=` +${i.themeCSS}`),i.fontFamily!==void 0&&(f+=` +:root { --mermaid-font-family: ${i.fontFamily}}`),i.altFontFamily!==void 0&&(f+=` +:root { --mermaid-alt-font-family: ${i.altFontFamily}}`),!oF(a)){const E=i.htmlLabels||((p=i.flowchart)==null?void 0:p.htmlLabels)?["> *","span"]:["rect","polygon","ellipse","circle","path"];for(const _ in a){const A=a[_];oF(A.styles)||E.forEach(I=>{f+=uPt(A.id,I,A.styles)}),oF(A.textStyles)||(f+=uPt(A.id,"tspan",A.textStyles))}}return f},tDe=(i,a,f,p)=>{const w=JMe(i,f),m=sAe(a,w,i.themeVariables);return pdt(LSe(`${p}{${m}}`),DSe)},eDe=(i="",a,f)=>{let p=i;return!f&&!a&&(p=p.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),p=uF(p),p=p.replace(/
/g,"
"),p},nDe=(i="",a)=>{var w,m;const f=(m=(w=a==null?void 0:a.viewBox)==null?void 0:w.baseVal)!=null&&m.height?a.viewBox.baseVal.height+"px":VMe,p=btoa(''+i+"");return``},lPt=(i,a,f,p,w)=>{const m=i.append("div");m.attr("id",f),p&&m.attr("style",p);const b=m.append("svg").attr("id",a).attr("width","100%").attr("xmlns",$Me);return w&&b.attr("xmlns:xlink",w),b.append("g"),i};function hPt(i,a){return i.append("iframe").attr("id",a).attr("style","width: 100%; height: 100%;").attr("sandbox","")}const rDe=(i,a,f,p)=>{var w,m,b;(w=i.getElementById(a))==null||w.remove(),(m=i.getElementById(f))==null||m.remove(),(b=i.getElementById(p))==null||b.remove()},iDe=async function(i,a,f){var nt,It,Ot,Bt,Et,Z;xdt();const p=cPt(a);a=p.code;const w=Fd();Ut.debug(w),a.length>((w==null?void 0:w.maxTextSize)??NMe)&&(a=BMe);const m="#"+i,b="i"+i,E="#"+b,_="d"+i,A="#"+_;let I=yr("body");const B=w.securityLevel===RMe,N=w.securityLevel===jMe,R=w.fontFamily;if(f!==void 0){if(f&&(f.innerHTML=""),B){const Ct=hPt(yr(f),b);I=yr(Ct.nodes()[0].contentDocument.body),I.node().style.margin=0}else I=yr(f);lPt(I,i,_,`font-family: ${R}`,zMe)}else{if(rDe(document,i,_,b),B){const Ct=hPt(yr("body"),b);I=yr(Ct.nodes()[0].contentDocument.body),I.node().style.margin=0}else I=yr("body");lPt(I,i,_)}a=ZMe(a);let z,W;try{z=await kdt(a,{title:p.title})}catch(Ct){z=new FOt("error"),W=Ct}const et=I.select(A).node(),st=z.type,at=et.firstChild,bt=at.firstChild,mt=(It=(nt=z.renderer).getClasses)==null?void 0:It.call(nt,a,z),yt=tDe(w,st,mt,m),ft=document.createElement("style");ft.innerHTML=yt,at.insertBefore(ft,bt);try{await z.renderer.draw(a,i,nOt,z)}catch(Ct){throw fAe.draw(a,i,nOt),Ct}const ut=I.select(`${A} svg`),vt=(Bt=(Ot=z.db).getAccTitle)==null?void 0:Bt.call(Ot),X=(Z=(Et=z.db).getAccDescription)==null?void 0:Z.call(Et);aDe(st,ut,vt,X),I.select(`[id="${i}"]`).selectAll("foreignobject > *").attr("xmlns",qMe);let pt=I.select(A).node().innerHTML;if(Ut.debug("config.arrowMarkerAbsolute",w.arrowMarkerAbsolute),pt=eDe(pt,B,o1(w.arrowMarkerAbsolute)),B){const Ct=I.select(A+" svg").node();pt=nDe(pt,Ct)}else N||(pt=lW.sanitize(pt,{ADD_TAGS:KMe,ADD_ATTR:XMe}));if(mAe(),W)throw W;const Tt=yr(B?E:A).node();return Tt&&"remove"in Tt&&Tt.remove(),{svg:pt,bindFunctions:z.db.bindFunctions}};function sDe(i={}){var f;i!=null&&i.fontFamily&&!((f=i.themeVariables)!=null&&f.fontFamily)&&(i.themeVariables||(i.themeVariables={}),i.themeVariables.fontFamily=i.fontFamily),OSe(i),i!=null&&i.theme&&i.theme in T5?i.themeVariables=T5[i.theme].getThemeVariables(i.themeVariables):i&&(i.themeVariables=T5.default.getThemeVariables(i.themeVariables));const a=typeof i=="object"?ISe(i):iOt();Xft(a.logLevel),xdt()}function aDe(i,a,f,p){jAe(a,i),$Ae(a,f,p,a.attr("id"))}const pT=Object.freeze({render:iDe,parse:QMe,getDiagramFromText:kdt,initialize:sDe,getConfig:Fd,setConfig:sOt,getSiteConfig:iOt,updateSiteConfig:PSe,reset:()=>{$W()},globalReset:()=>{$W(WA)},defaultConfig:WA});Xft(Fd().logLevel),$W(Fd());const oDe=async()=>{Ut.debug("Loading registered diagrams");const a=(await Promise.allSettled(Object.entries(NA).map(async([f,{detector:p,loader:w}])=>{if(w)try{ydt(f)}catch{try{const{diagram:b,id:E}=await w();HW(E,b,p)}catch(b){throw Ut.error(`Failed to load external diagram with key ${f}. Removing from detectors.`),delete NA[f],b}}}))).filter(f=>f.status==="rejected");if(a.length>0){Ut.error(`Failed to load ${a.length} external diagrams`);for(const f of a)Ut.error(f);throw new Error(`Failed to load ${a.length} external diagrams`)}},cDe=(i,a,f)=>{Ut.warn(i),WIt(i)?(f&&f(i.str,i.hash),a.push({...i,message:i.str,error:i})):(f&&f(i),i instanceof Error&&a.push({str:i.message,message:i.message,hash:i.name,error:i}))},fPt=async function(i={querySelector:".mermaid"}){try{await uDe(i)}catch(a){if(WIt(a)&&Ut.error(a.str),Bb.parseError&&Bb.parseError(a),!i.suppressErrors)throw Ut.error("Use the suppressErrors option to suppress these errors"),a}},uDe=async function({postRenderCallback:i,querySelector:a,nodes:f}={querySelector:".mermaid"}){const p=pT.getConfig();Ut.debug(`${i?"":"No "}Callback function found`);let w;if(f)w=f;else if(a)w=document.querySelectorAll(a);else throw new Error("Nodes and querySelector are both undefined");Ut.debug(`Found ${w.length} diagrams`),(p==null?void 0:p.startOnLoad)!==void 0&&(Ut.debug("Start On Load: "+(p==null?void 0:p.startOnLoad)),pT.updateSiteConfig({startOnLoad:p==null?void 0:p.startOnLoad}));const m=new $a.InitIDGenerator(p.deterministicIds,p.deterministicIDSeed);let b;const E=[];for(const _ of Array.from(w)){Ut.info("Rendering diagram: "+_.id);/*! Check if previously processed */if(_.getAttribute("data-processed"))continue;_.setAttribute("data-processed","true");const A=`mermaid-${m.next()}`;b=_.innerHTML,b=xA($a.entityDecode(b)).trim().replace(//gi,"
");const I=$a.detectInit(b);I&&Ut.debug("Detected early reinit: ",I);try{const{svg:B,bindFunctions:N}=await bPt(A,b,_);_.innerHTML=B,i&&await i(A),N&&N(_)}catch(B){cDe(B,E,Bb.parseError)}}if(E.length>0)throw E[0]},dPt=function(i){pT.initialize(i)},lDe=async function(i,a,f){Ut.warn("mermaid.init is deprecated. Please use run instead."),i&&dPt(i);const p={postRenderCallback:f,querySelector:".mermaid"};typeof a=="string"?p.querySelector=a:a&&(a instanceof HTMLElement?p.nodes=[a]:p.nodes=a),await fPt(p)},hDe=async(i,{lazyLoad:a=!0}={})=>{cIt(...i),a===!1&&await oDe()},gPt=function(){if(Bb.startOnLoad){const{startOnLoad:i}=pT.getConfig();i&&Bb.run().catch(a=>Ut.error("Mermaid failed to initialize",a))}};if(typeof document<"u"){/*! + * Wait for document loaded before starting the execution + */window.addEventListener("load",gPt,!1)}const fDe=function(i){Bb.parseError=i},KW=[];let Pdt=!1;const pPt=async()=>{if(!Pdt){for(Pdt=!0;KW.length>0;){const i=KW.shift();if(i)try{await i()}catch(a){Ut.error("Error executing queue",a)}}Pdt=!1}},dDe=async(i,a)=>new Promise((f,p)=>{const w=()=>new Promise((m,b)=>{pT.parse(i,a).then(E=>{m(E),f(E)},E=>{var _;Ut.error("Error parsing",E),(_=Bb.parseError)==null||_.call(Bb,E),b(E),p(E)})});KW.push(w),pPt().catch(p)}),bPt=(i,a,f)=>new Promise((p,w)=>{const m=()=>new Promise((b,E)=>{pT.render(i,a,f).then(_=>{b(_),p(_)},_=>{var A;Ut.error("Error parsing",_),(A=Bb.parseError)==null||A.call(Bb,_),E(_),w(_)})});KW.push(m),pPt().catch(w)}),Bb={startOnLoad:!0,mermaidAPI:pT,parse:dDe,render:bPt,init:lDe,run:fPt,registerExternalDiagrams:hDe,initialize:dPt,parseError:void 0,contentLoaded:gPt,setParseErrorHandler:fDe,detectType:yW};var XW=function(){var i=function(Xi,Er,Xn,di){for(Xn=Xn||{},di=Xi.length;di--;Xn[Xi[di]]=Er);return Xn},a=[1,24],f=[1,25],p=[1,26],w=[1,27],m=[1,28],b=[1,63],E=[1,64],_=[1,65],A=[1,66],I=[1,67],B=[1,68],N=[1,69],R=[1,29],z=[1,30],W=[1,31],et=[1,32],st=[1,33],at=[1,34],bt=[1,35],mt=[1,36],yt=[1,37],ft=[1,38],ut=[1,39],vt=[1,40],X=[1,41],pt=[1,42],U=[1,43],Tt=[1,44],nt=[1,45],It=[1,46],Ot=[1,47],Bt=[1,48],Et=[1,50],Z=[1,51],Ct=[1,52],xt=[1,53],Ht=[1,54],Le=[1,55],Ft=[1,56],gn=[1,57],Se=[1,58],me=[1,59],Ve=[1,60],Ye=[14,42],ce=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],ke=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],zt=[1,82],re=[1,83],se=[1,84],Pe=[1,85],te=[12,14,42],Me=[12,14,33,42],de=[12,14,33,42,76,77,79,80],on=[12,33],ni=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],Ks={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:function(Er,Xn,di,Ee,Kn,He,Ti){var pn=He.length-1;switch(Kn){case 3:Ee.setDirection("TB");break;case 4:Ee.setDirection("BT");break;case 5:Ee.setDirection("RL");break;case 6:Ee.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:Ee.setC4Type(He[pn-3]);break;case 19:Ee.setTitle(He[pn].substring(6)),this.$=He[pn].substring(6);break;case 20:Ee.setAccDescription(He[pn].substring(15)),this.$=He[pn].substring(15);break;case 21:this.$=He[pn].trim(),Ee.setTitle(this.$);break;case 22:case 23:this.$=He[pn].trim(),Ee.setAccDescription(this.$);break;case 28:case 29:He[pn].splice(2,0,"ENTERPRISE"),Ee.addPersonOrSystemBoundary(...He[pn]),this.$=He[pn];break;case 30:Ee.addPersonOrSystemBoundary(...He[pn]),this.$=He[pn];break;case 31:He[pn].splice(2,0,"CONTAINER"),Ee.addContainerBoundary(...He[pn]),this.$=He[pn];break;case 32:Ee.addDeploymentNode("node",...He[pn]),this.$=He[pn];break;case 33:Ee.addDeploymentNode("nodeL",...He[pn]),this.$=He[pn];break;case 34:Ee.addDeploymentNode("nodeR",...He[pn]),this.$=He[pn];break;case 35:Ee.popBoundaryParseStack();break;case 39:Ee.addPersonOrSystem("person",...He[pn]),this.$=He[pn];break;case 40:Ee.addPersonOrSystem("external_person",...He[pn]),this.$=He[pn];break;case 41:Ee.addPersonOrSystem("system",...He[pn]),this.$=He[pn];break;case 42:Ee.addPersonOrSystem("system_db",...He[pn]),this.$=He[pn];break;case 43:Ee.addPersonOrSystem("system_queue",...He[pn]),this.$=He[pn];break;case 44:Ee.addPersonOrSystem("external_system",...He[pn]),this.$=He[pn];break;case 45:Ee.addPersonOrSystem("external_system_db",...He[pn]),this.$=He[pn];break;case 46:Ee.addPersonOrSystem("external_system_queue",...He[pn]),this.$=He[pn];break;case 47:Ee.addContainer("container",...He[pn]),this.$=He[pn];break;case 48:Ee.addContainer("container_db",...He[pn]),this.$=He[pn];break;case 49:Ee.addContainer("container_queue",...He[pn]),this.$=He[pn];break;case 50:Ee.addContainer("external_container",...He[pn]),this.$=He[pn];break;case 51:Ee.addContainer("external_container_db",...He[pn]),this.$=He[pn];break;case 52:Ee.addContainer("external_container_queue",...He[pn]),this.$=He[pn];break;case 53:Ee.addComponent("component",...He[pn]),this.$=He[pn];break;case 54:Ee.addComponent("component_db",...He[pn]),this.$=He[pn];break;case 55:Ee.addComponent("component_queue",...He[pn]),this.$=He[pn];break;case 56:Ee.addComponent("external_component",...He[pn]),this.$=He[pn];break;case 57:Ee.addComponent("external_component_db",...He[pn]),this.$=He[pn];break;case 58:Ee.addComponent("external_component_queue",...He[pn]),this.$=He[pn];break;case 60:Ee.addRel("rel",...He[pn]),this.$=He[pn];break;case 61:Ee.addRel("birel",...He[pn]),this.$=He[pn];break;case 62:Ee.addRel("rel_u",...He[pn]),this.$=He[pn];break;case 63:Ee.addRel("rel_d",...He[pn]),this.$=He[pn];break;case 64:Ee.addRel("rel_l",...He[pn]),this.$=He[pn];break;case 65:Ee.addRel("rel_r",...He[pn]),this.$=He[pn];break;case 66:Ee.addRel("rel_b",...He[pn]),this.$=He[pn];break;case 67:He[pn].splice(0,1),Ee.addRel("rel",...He[pn]),this.$=He[pn];break;case 68:Ee.updateElStyle("update_el_style",...He[pn]),this.$=He[pn];break;case 69:Ee.updateRelStyle("update_rel_style",...He[pn]),this.$=He[pn];break;case 70:Ee.updateLayoutConfig("update_layout_config",...He[pn]),this.$=He[pn];break;case 71:this.$=[He[pn]];break;case 72:He[pn].unshift(He[pn-1]),this.$=He[pn];break;case 73:case 75:this.$=He[pn].trim();break;case 74:let Es={};Es[He[pn-1].trim()]=He[pn].trim(),this.$=Es;break;case 76:this.$="";break}},table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:a,23:f,24:p,26:w,28:m,29:49,30:61,32:62,34:b,36:E,37:_,38:A,39:I,40:B,41:N,43:23,44:R,45:z,46:W,47:et,48:st,49:at,50:bt,51:mt,52:yt,53:ft,54:ut,55:vt,56:X,57:pt,58:U,59:Tt,60:nt,61:It,62:Ot,63:Bt,64:Et,65:Z,66:Ct,67:xt,68:Ht,69:Le,70:Ft,71:gn,72:Se,73:me,74:Ve},{13:70,19:20,20:21,21:22,22:a,23:f,24:p,26:w,28:m,29:49,30:61,32:62,34:b,36:E,37:_,38:A,39:I,40:B,41:N,43:23,44:R,45:z,46:W,47:et,48:st,49:at,50:bt,51:mt,52:yt,53:ft,54:ut,55:vt,56:X,57:pt,58:U,59:Tt,60:nt,61:It,62:Ot,63:Bt,64:Et,65:Z,66:Ct,67:xt,68:Ht,69:Le,70:Ft,71:gn,72:Se,73:me,74:Ve},{13:71,19:20,20:21,21:22,22:a,23:f,24:p,26:w,28:m,29:49,30:61,32:62,34:b,36:E,37:_,38:A,39:I,40:B,41:N,43:23,44:R,45:z,46:W,47:et,48:st,49:at,50:bt,51:mt,52:yt,53:ft,54:ut,55:vt,56:X,57:pt,58:U,59:Tt,60:nt,61:It,62:Ot,63:Bt,64:Et,65:Z,66:Ct,67:xt,68:Ht,69:Le,70:Ft,71:gn,72:Se,73:me,74:Ve},{13:72,19:20,20:21,21:22,22:a,23:f,24:p,26:w,28:m,29:49,30:61,32:62,34:b,36:E,37:_,38:A,39:I,40:B,41:N,43:23,44:R,45:z,46:W,47:et,48:st,49:at,50:bt,51:mt,52:yt,53:ft,54:ut,55:vt,56:X,57:pt,58:U,59:Tt,60:nt,61:It,62:Ot,63:Bt,64:Et,65:Z,66:Ct,67:xt,68:Ht,69:Le,70:Ft,71:gn,72:Se,73:me,74:Ve},{13:73,19:20,20:21,21:22,22:a,23:f,24:p,26:w,28:m,29:49,30:61,32:62,34:b,36:E,37:_,38:A,39:I,40:B,41:N,43:23,44:R,45:z,46:W,47:et,48:st,49:at,50:bt,51:mt,52:yt,53:ft,54:ut,55:vt,56:X,57:pt,58:U,59:Tt,60:nt,61:It,62:Ot,63:Bt,64:Et,65:Z,66:Ct,67:xt,68:Ht,69:Le,70:Ft,71:gn,72:Se,73:me,74:Ve},{14:[1,74]},i(Ye,[2,13],{43:23,29:49,30:61,32:62,20:75,34:b,36:E,37:_,38:A,39:I,40:B,41:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt,51:mt,52:yt,53:ft,54:ut,55:vt,56:X,57:pt,58:U,59:Tt,60:nt,61:It,62:Ot,63:Bt,64:Et,65:Z,66:Ct,67:xt,68:Ht,69:Le,70:Ft,71:gn,72:Se,73:me,74:Ve}),i(Ye,[2,14]),i(ce,[2,16],{12:[1,76]}),i(Ye,[2,36],{12:[1,77]}),i(ke,[2,19]),i(ke,[2,20]),{25:[1,78]},{27:[1,79]},i(ke,[2,23]),{35:80,75:81,76:zt,77:re,79:se,80:Pe},{35:86,75:81,76:zt,77:re,79:se,80:Pe},{35:87,75:81,76:zt,77:re,79:se,80:Pe},{35:88,75:81,76:zt,77:re,79:se,80:Pe},{35:89,75:81,76:zt,77:re,79:se,80:Pe},{35:90,75:81,76:zt,77:re,79:se,80:Pe},{35:91,75:81,76:zt,77:re,79:se,80:Pe},{35:92,75:81,76:zt,77:re,79:se,80:Pe},{35:93,75:81,76:zt,77:re,79:se,80:Pe},{35:94,75:81,76:zt,77:re,79:se,80:Pe},{35:95,75:81,76:zt,77:re,79:se,80:Pe},{35:96,75:81,76:zt,77:re,79:se,80:Pe},{35:97,75:81,76:zt,77:re,79:se,80:Pe},{35:98,75:81,76:zt,77:re,79:se,80:Pe},{35:99,75:81,76:zt,77:re,79:se,80:Pe},{35:100,75:81,76:zt,77:re,79:se,80:Pe},{35:101,75:81,76:zt,77:re,79:se,80:Pe},{35:102,75:81,76:zt,77:re,79:se,80:Pe},{35:103,75:81,76:zt,77:re,79:se,80:Pe},{35:104,75:81,76:zt,77:re,79:se,80:Pe},i(te,[2,59]),{35:105,75:81,76:zt,77:re,79:se,80:Pe},{35:106,75:81,76:zt,77:re,79:se,80:Pe},{35:107,75:81,76:zt,77:re,79:se,80:Pe},{35:108,75:81,76:zt,77:re,79:se,80:Pe},{35:109,75:81,76:zt,77:re,79:se,80:Pe},{35:110,75:81,76:zt,77:re,79:se,80:Pe},{35:111,75:81,76:zt,77:re,79:se,80:Pe},{35:112,75:81,76:zt,77:re,79:se,80:Pe},{35:113,75:81,76:zt,77:re,79:se,80:Pe},{35:114,75:81,76:zt,77:re,79:se,80:Pe},{35:115,75:81,76:zt,77:re,79:se,80:Pe},{20:116,29:49,30:61,32:62,34:b,36:E,37:_,38:A,39:I,40:B,41:N,43:23,44:R,45:z,46:W,47:et,48:st,49:at,50:bt,51:mt,52:yt,53:ft,54:ut,55:vt,56:X,57:pt,58:U,59:Tt,60:nt,61:It,62:Ot,63:Bt,64:Et,65:Z,66:Ct,67:xt,68:Ht,69:Le,70:Ft,71:gn,72:Se,73:me,74:Ve},{12:[1,118],33:[1,117]},{35:119,75:81,76:zt,77:re,79:se,80:Pe},{35:120,75:81,76:zt,77:re,79:se,80:Pe},{35:121,75:81,76:zt,77:re,79:se,80:Pe},{35:122,75:81,76:zt,77:re,79:se,80:Pe},{35:123,75:81,76:zt,77:re,79:se,80:Pe},{35:124,75:81,76:zt,77:re,79:se,80:Pe},{35:125,75:81,76:zt,77:re,79:se,80:Pe},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},i(Ye,[2,15]),i(ce,[2,17],{21:22,19:130,22:a,23:f,24:p,26:w,28:m}),i(Ye,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:a,23:f,24:p,26:w,28:m,34:b,36:E,37:_,38:A,39:I,40:B,41:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt,51:mt,52:yt,53:ft,54:ut,55:vt,56:X,57:pt,58:U,59:Tt,60:nt,61:It,62:Ot,63:Bt,64:Et,65:Z,66:Ct,67:xt,68:Ht,69:Le,70:Ft,71:gn,72:Se,73:me,74:Ve}),i(ke,[2,21]),i(ke,[2,22]),i(te,[2,39]),i(Me,[2,71],{75:81,35:132,76:zt,77:re,79:se,80:Pe}),i(de,[2,73]),{78:[1,133]},i(de,[2,75]),i(de,[2,76]),i(te,[2,40]),i(te,[2,41]),i(te,[2,42]),i(te,[2,43]),i(te,[2,44]),i(te,[2,45]),i(te,[2,46]),i(te,[2,47]),i(te,[2,48]),i(te,[2,49]),i(te,[2,50]),i(te,[2,51]),i(te,[2,52]),i(te,[2,53]),i(te,[2,54]),i(te,[2,55]),i(te,[2,56]),i(te,[2,57]),i(te,[2,58]),i(te,[2,60]),i(te,[2,61]),i(te,[2,62]),i(te,[2,63]),i(te,[2,64]),i(te,[2,65]),i(te,[2,66]),i(te,[2,67]),i(te,[2,68]),i(te,[2,69]),i(te,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},i(on,[2,28]),i(on,[2,29]),i(on,[2,30]),i(on,[2,31]),i(on,[2,32]),i(on,[2,33]),i(on,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},i(ce,[2,18]),i(Ye,[2,38]),i(Me,[2,72]),i(de,[2,74]),i(te,[2,24]),i(te,[2,35]),i(ni,[2,25]),i(ni,[2,26],{12:[1,138]}),i(ni,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:function(Er,Xn){if(Xn.recoverable)this.trace(Er);else{var di=new Error(Er);throw di.hash=Xn,di}},parse:function(Er){var Xn=this,di=[0],Ee=[],Kn=[null],He=[],Ti=this.table,pn="",Es=0,qa=0,Ma=2,Gs=1,Po=He.slice.call(arguments,1),vs=Object.create(this.lexer),ru={yy:{}};for(var zs in this.yy)Object.prototype.hasOwnProperty.call(this.yy,zs)&&(ru.yy[zs]=this.yy[zs]);vs.setInput(Er,ru.yy),ru.yy.lexer=vs,ru.yy.parser=this,typeof vs.yylloc>"u"&&(vs.yylloc={});var Du=vs.yylloc;He.push(Du);var pm=vs.options&&vs.options.ranges;typeof ru.yy.parseError=="function"?this.parseError=ru.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function uw(){var Dl;return Dl=Ee.pop()||vs.lex()||Gs,typeof Dl!="number"&&(Dl instanceof Array&&(Ee=Dl,Dl=Ee.pop()),Dl=Xn.symbols_[Dl]||Dl),Dl}for(var Wu,th,Fa,Ml,ha={},bc,Cc,pa,Da;;){if(th=di[di.length-1],this.defaultActions[th]?Fa=this.defaultActions[th]:((Wu===null||typeof Wu>"u")&&(Wu=uw()),Fa=Ti[th]&&Ti[th][Wu]),typeof Fa>"u"||!Fa.length||!Fa[0]){var Ha="";Da=[];for(bc in Ti[th])this.terminals_[bc]&&bc>Ma&&Da.push("'"+this.terminals_[bc]+"'");vs.showPosition?Ha="Parse error on line "+(Es+1)+`: +`+vs.showPosition()+` +Expecting `+Da.join(", ")+", got '"+(this.terminals_[Wu]||Wu)+"'":Ha="Parse error on line "+(Es+1)+": Unexpected "+(Wu==Gs?"end of input":"'"+(this.terminals_[Wu]||Wu)+"'"),this.parseError(Ha,{text:vs.match,token:this.terminals_[Wu]||Wu,line:vs.yylineno,loc:Du,expected:Da})}if(Fa[0]instanceof Array&&Fa.length>1)throw new Error("Parse Error: multiple actions possible at state: "+th+", token: "+Wu);switch(Fa[0]){case 1:di.push(Wu),Kn.push(vs.yytext),He.push(vs.yylloc),di.push(Fa[1]),Wu=null,qa=vs.yyleng,pn=vs.yytext,Es=vs.yylineno,Du=vs.yylloc;break;case 2:if(Cc=this.productions_[Fa[1]][1],ha.$=Kn[Kn.length-Cc],ha._$={first_line:He[He.length-(Cc||1)].first_line,last_line:He[He.length-1].last_line,first_column:He[He.length-(Cc||1)].first_column,last_column:He[He.length-1].last_column},pm&&(ha._$.range=[He[He.length-(Cc||1)].range[0],He[He.length-1].range[1]]),Ml=this.performAction.apply(ha,[pn,qa,Es,ru.yy,Fa[1],Kn,He].concat(Po)),typeof Ml<"u")return Ml;Cc&&(di=di.slice(0,-1*Cc*2),Kn=Kn.slice(0,-1*Cc),He=He.slice(0,-1*Cc)),di.push(this.productions_[Fa[1]][0]),Kn.push(ha.$),He.push(ha._$),pa=Ti[di[di.length-2]][di[di.length-1]],di.push(pa);break;case 3:return!0}}return!0}},ws=function(){var Xi={EOF:1,parseError:function(Xn,di){if(this.yy.parser)this.yy.parser.parseError(Xn,di);else throw new Error(Xn)},setInput:function(Er,Xn){return this.yy=Xn||this.yy||{},this._input=Er,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var Er=this._input[0];this.yytext+=Er,this.yyleng++,this.offset++,this.match+=Er,this.matched+=Er;var Xn=Er.match(/(?:\r\n?|\n).*/g);return Xn?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Er},unput:function(Er){var Xn=Er.length,di=Er.split(/(?:\r\n?|\n)/g);this._input=Er+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Xn),this.offset-=Xn;var Ee=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),di.length-1&&(this.yylineno-=di.length-1);var Kn=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:di?(di.length===Ee.length?this.yylloc.first_column:0)+Ee[Ee.length-di.length].length-di[0].length:this.yylloc.first_column-Xn},this.options.ranges&&(this.yylloc.range=[Kn[0],Kn[0]+this.yyleng-Xn]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(Er){this.unput(this.match.slice(Er))},pastInput:function(){var Er=this.matched.substr(0,this.matched.length-this.match.length);return(Er.length>20?"...":"")+Er.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var Er=this.match;return Er.length<20&&(Er+=this._input.substr(0,20-Er.length)),(Er.substr(0,20)+(Er.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var Er=this.pastInput(),Xn=new Array(Er.length+1).join("-");return Er+this.upcomingInput()+` +`+Xn+"^"},test_match:function(Er,Xn){var di,Ee,Kn;if(this.options.backtrack_lexer&&(Kn={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Kn.yylloc.range=this.yylloc.range.slice(0))),Ee=Er[0].match(/(?:\r\n?|\n).*/g),Ee&&(this.yylineno+=Ee.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Ee?Ee[Ee.length-1].length-Ee[Ee.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Er[0].length},this.yytext+=Er[0],this.match+=Er[0],this.matches=Er,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Er[0].length),this.matched+=Er[0],di=this.performAction.call(this,this.yy,this,Xn,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),di)return di;if(this._backtrack){for(var He in Kn)this[He]=Kn[He];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Er,Xn,di,Ee;this._more||(this.yytext="",this.match="");for(var Kn=this._currentRules(),He=0;HeXn[0].length)){if(Xn=di,Ee=He,this.options.backtrack_lexer){if(Er=this.test_match(di,Kn[He]),Er!==!1)return Er;if(this._backtrack){Xn=!1;continue}else return!1}else if(!this.options.flex)break}return Xn?(Er=this.test_match(Xn,Kn[Ee]),Er!==!1?Er:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var Xn=this.next();return Xn||this.lex()},begin:function(Xn){this.conditionStack.push(Xn)},popState:function(){var Xn=this.conditionStack.length-1;return Xn>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(Xn){return Xn=this.conditionStack.length-1-Math.abs(Xn||0),Xn>=0?this.conditionStack[Xn]:"INITIAL"},pushState:function(Xn){this.begin(Xn)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(Xn,di,Ee,Kn){switch(Ee){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),26;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;case 23:return this.begin("person"),44;case 24:return this.begin("system_ext_queue"),51;case 25:return this.begin("system_ext_db"),50;case 26:return this.begin("system_ext"),49;case 27:return this.begin("system_queue"),48;case 28:return this.begin("system_db"),47;case 29:return this.begin("system"),46;case 30:return this.begin("boundary"),37;case 31:return this.begin("enterprise_boundary"),34;case 32:return this.begin("system_boundary"),36;case 33:return this.begin("container_ext_queue"),57;case 34:return this.begin("container_ext_db"),56;case 35:return this.begin("container_ext"),55;case 36:return this.begin("container_queue"),54;case 37:return this.begin("container_db"),53;case 38:return this.begin("container"),52;case 39:return this.begin("container_boundary"),38;case 40:return this.begin("component_ext_queue"),63;case 41:return this.begin("component_ext_db"),62;case 42:return this.begin("component_ext"),61;case 43:return this.begin("component_queue"),60;case 44:return this.begin("component_db"),59;case 45:return this.begin("component"),58;case 46:return this.begin("node"),39;case 47:return this.begin("node"),39;case 48:return this.begin("node_l"),40;case 49:return this.begin("node_r"),41;case 50:return this.begin("rel"),64;case 51:return this.begin("birel"),65;case 52:return this.begin("rel_u"),66;case 53:return this.begin("rel_u"),66;case 54:return this.begin("rel_d"),67;case 55:return this.begin("rel_d"),67;case 56:return this.begin("rel_l"),68;case 57:return this.begin("rel_l"),68;case 58:return this.begin("rel_r"),69;case 59:return this.begin("rel_r"),69;case 60:return this.begin("rel_b"),70;case 61:return this.begin("rel_index"),71;case 62:return this.begin("update_el_style"),72;case 63:return this.begin("update_rel_style"),73;case 64:return this.begin("update_layout_config"),74;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return Xi}();Ks.lexer=ws;function fo(){this.yy={}}return fo.prototype=Ks,Ks.Parser=fo,new fo}();XW.parser=XW;const gDe=XW;let am=[],fk=[""],wg="global",om="",p3=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],lF=[],Fdt="",Ndt=!1,QW=4,ZW=2;var wPt;const pDe=function(){return wPt},bDe=function(i){wPt=Q1(i,Oe())},wDe=function(i,a,f,p,w,m,b,E,_){if(i==null||a===void 0||a===null||f===void 0||f===null||p===void 0||p===null)return;let A={};const I=lF.find(B=>B.from===a&&B.to===f);if(I?A=I:lF.push(A),A.type=i,A.from=a,A.to=f,A.label={text:p},w==null)A.techn={text:""};else if(typeof w=="object"){let[B,N]=Object.entries(w)[0];A[B]={text:N}}else A.techn={text:w};if(m==null)A.descr={text:""};else if(typeof m=="object"){let[B,N]=Object.entries(m)[0];A[B]={text:N}}else A.descr={text:m};if(typeof b=="object"){let[B,N]=Object.entries(b)[0];A[B]=N}else A.sprite=b;if(typeof E=="object"){let[B,N]=Object.entries(E)[0];A[B]=N}else A.tags=E;if(typeof _=="object"){let[B,N]=Object.entries(_)[0];A[B]=N}else A.link=_;A.wrap=dk()},vDe=function(i,a,f,p,w,m,b){if(a===null||f===null)return;let E={};const _=am.find(A=>A.alias===a);if(_&&a===_.alias?E=_:(E.alias=a,am.push(E)),f==null?E.label={text:""}:E.label={text:f},p==null)E.descr={text:""};else if(typeof p=="object"){let[A,I]=Object.entries(p)[0];E[A]={text:I}}else E.descr={text:p};if(typeof w=="object"){let[A,I]=Object.entries(w)[0];E[A]=I}else E.sprite=w;if(typeof m=="object"){let[A,I]=Object.entries(m)[0];E[A]=I}else E.tags=m;if(typeof b=="object"){let[A,I]=Object.entries(b)[0];E[A]=I}else E.link=b;E.typeC4Shape={text:i},E.parentBoundary=wg,E.wrap=dk()},mDe=function(i,a,f,p,w,m,b,E){if(a===null||f===null)return;let _={};const A=am.find(I=>I.alias===a);if(A&&a===A.alias?_=A:(_.alias=a,am.push(_)),f==null?_.label={text:""}:_.label={text:f},p==null)_.techn={text:""};else if(typeof p=="object"){let[I,B]=Object.entries(p)[0];_[I]={text:B}}else _.techn={text:p};if(w==null)_.descr={text:""};else if(typeof w=="object"){let[I,B]=Object.entries(w)[0];_[I]={text:B}}else _.descr={text:w};if(typeof m=="object"){let[I,B]=Object.entries(m)[0];_[I]=B}else _.sprite=m;if(typeof b=="object"){let[I,B]=Object.entries(b)[0];_[I]=B}else _.tags=b;if(typeof E=="object"){let[I,B]=Object.entries(E)[0];_[I]=B}else _.link=E;_.wrap=dk(),_.typeC4Shape={text:i},_.parentBoundary=wg},yDe=function(i,a,f,p,w,m,b,E){if(a===null||f===null)return;let _={};const A=am.find(I=>I.alias===a);if(A&&a===A.alias?_=A:(_.alias=a,am.push(_)),f==null?_.label={text:""}:_.label={text:f},p==null)_.techn={text:""};else if(typeof p=="object"){let[I,B]=Object.entries(p)[0];_[I]={text:B}}else _.techn={text:p};if(w==null)_.descr={text:""};else if(typeof w=="object"){let[I,B]=Object.entries(w)[0];_[I]={text:B}}else _.descr={text:w};if(typeof m=="object"){let[I,B]=Object.entries(m)[0];_[I]=B}else _.sprite=m;if(typeof b=="object"){let[I,B]=Object.entries(b)[0];_[I]=B}else _.tags=b;if(typeof E=="object"){let[I,B]=Object.entries(E)[0];_[I]=B}else _.link=E;_.wrap=dk(),_.typeC4Shape={text:i},_.parentBoundary=wg},xDe=function(i,a,f,p,w){if(i===null||a===null)return;let m={};const b=p3.find(E=>E.alias===i);if(b&&i===b.alias?m=b:(m.alias=i,p3.push(m)),a==null?m.label={text:""}:m.label={text:a},f==null)m.type={text:"system"};else if(typeof f=="object"){let[E,_]=Object.entries(f)[0];m[E]={text:_}}else m.type={text:f};if(typeof p=="object"){let[E,_]=Object.entries(p)[0];m[E]=_}else m.tags=p;if(typeof w=="object"){let[E,_]=Object.entries(w)[0];m[E]=_}else m.link=w;m.parentBoundary=wg,m.wrap=dk(),om=wg,wg=i,fk.push(om)},kDe=function(i,a,f,p,w){if(i===null||a===null)return;let m={};const b=p3.find(E=>E.alias===i);if(b&&i===b.alias?m=b:(m.alias=i,p3.push(m)),a==null?m.label={text:""}:m.label={text:a},f==null)m.type={text:"container"};else if(typeof f=="object"){let[E,_]=Object.entries(f)[0];m[E]={text:_}}else m.type={text:f};if(typeof p=="object"){let[E,_]=Object.entries(p)[0];m[E]=_}else m.tags=p;if(typeof w=="object"){let[E,_]=Object.entries(w)[0];m[E]=_}else m.link=w;m.parentBoundary=wg,m.wrap=dk(),om=wg,wg=i,fk.push(om)},EDe=function(i,a,f,p,w,m,b,E){if(a===null||f===null)return;let _={};const A=p3.find(I=>I.alias===a);if(A&&a===A.alias?_=A:(_.alias=a,p3.push(_)),f==null?_.label={text:""}:_.label={text:f},p==null)_.type={text:"node"};else if(typeof p=="object"){let[I,B]=Object.entries(p)[0];_[I]={text:B}}else _.type={text:p};if(w==null)_.descr={text:""};else if(typeof w=="object"){let[I,B]=Object.entries(w)[0];_[I]={text:B}}else _.descr={text:w};if(typeof b=="object"){let[I,B]=Object.entries(b)[0];_[I]=B}else _.tags=b;if(typeof E=="object"){let[I,B]=Object.entries(E)[0];_[I]=B}else _.link=E;_.nodeType=i,_.parentBoundary=wg,_.wrap=dk(),om=wg,wg=a,fk.push(om)},TDe=function(){wg=om,fk.pop(),om=fk.pop(),fk.push(om)},CDe=function(i,a,f,p,w,m,b,E,_,A,I){let B=am.find(N=>N.alias===a);if(!(B===void 0&&(B=p3.find(N=>N.alias===a),B===void 0))){if(f!=null)if(typeof f=="object"){let[N,R]=Object.entries(f)[0];B[N]=R}else B.bgColor=f;if(p!=null)if(typeof p=="object"){let[N,R]=Object.entries(p)[0];B[N]=R}else B.fontColor=p;if(w!=null)if(typeof w=="object"){let[N,R]=Object.entries(w)[0];B[N]=R}else B.borderColor=w;if(m!=null)if(typeof m=="object"){let[N,R]=Object.entries(m)[0];B[N]=R}else B.shadowing=m;if(b!=null)if(typeof b=="object"){let[N,R]=Object.entries(b)[0];B[N]=R}else B.shape=b;if(E!=null)if(typeof E=="object"){let[N,R]=Object.entries(E)[0];B[N]=R}else B.sprite=E;if(_!=null)if(typeof _=="object"){let[N,R]=Object.entries(_)[0];B[N]=R}else B.techn=_;if(A!=null)if(typeof A=="object"){let[N,R]=Object.entries(A)[0];B[N]=R}else B.legendText=A;if(I!=null)if(typeof I=="object"){let[N,R]=Object.entries(I)[0];B[N]=R}else B.legendSprite=I}},_De=function(i,a,f,p,w,m,b){const E=lF.find(_=>_.from===a&&_.to===f);if(E!==void 0){if(p!=null)if(typeof p=="object"){let[_,A]=Object.entries(p)[0];E[_]=A}else E.textColor=p;if(w!=null)if(typeof w=="object"){let[_,A]=Object.entries(w)[0];E[_]=A}else E.lineColor=w;if(m!=null)if(typeof m=="object"){let[_,A]=Object.entries(m)[0];E[_]=parseInt(A)}else E.offsetX=parseInt(m);if(b!=null)if(typeof b=="object"){let[_,A]=Object.entries(b)[0];E[_]=parseInt(A)}else E.offsetY=parseInt(b)}},SDe=function(i,a,f){let p=QW,w=ZW;if(typeof a=="object"){const m=Object.values(a)[0];p=parseInt(m)}else p=parseInt(a);if(typeof f=="object"){const m=Object.values(f)[0];w=parseInt(m)}else w=parseInt(f);p>=1&&(QW=p),w>=1&&(ZW=w)},ADe=function(){return QW},LDe=function(){return ZW},MDe=function(){return wg},DDe=function(){return om},vPt=function(i){return i==null?am:am.filter(a=>a.parentBoundary===i)},IDe=function(i){return am.find(a=>a.alias===i)},ODe=function(i){return Object.keys(vPt(i))},PDe=function(i){return i==null?p3:p3.filter(a=>a.parentBoundary===i)},FDe=function(){return lF},NDe=function(){return Fdt},BDe=function(i){Ndt=i},dk=function(){return Ndt},Bdt={addPersonOrSystem:vDe,addPersonOrSystemBoundary:xDe,addContainer:mDe,addContainerBoundary:kDe,addComponent:yDe,addDeploymentNode:EDe,popBoundaryParseStack:TDe,addRel:wDe,updateElStyle:CDe,updateRelStyle:_De,updateLayoutConfig:SDe,autoWrap:dk,setWrap:BDe,getC4ShapeArray:vPt,getC4Shape:IDe,getC4ShapeKeys:ODe,getBoundarys:PDe,getCurrentBoundaryParse:MDe,getParentBoundaryParse:DDe,getRels:FDe,getTitle:NDe,getC4Type:pDe,getC4ShapeInRow:ADe,getC4BoundaryInRow:LDe,setAccTitle:E0,getAccTitle:fg,getAccDescription:gg,setAccDescription:dg,getConfig:()=>Oe().c4,clear:function(){am=[],p3=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],om="",wg="global",fk=[""],lF=[],fk=[""],Fdt="",Ndt=!1,QW=4,ZW=2},LINETYPE:{SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},setTitle:function(i){Fdt=Q1(i,Oe())},setC4Type:bDe},JW=(i,a)=>{const f=i.append("rect");if(f.attr("x",a.x),f.attr("y",a.y),f.attr("fill",a.fill),f.attr("stroke",a.stroke),f.attr("width",a.width),f.attr("height",a.height),a.rx!==void 0&&f.attr("rx",a.rx),a.ry!==void 0&&f.attr("ry",a.ry),a.attrs!==void 0)for(const p in a.attrs)f.attr(p,a.attrs[p]);return a.class!==void 0&&f.attr("class",a.class),f},mPt=(i,a)=>{const f={x:a.startx,y:a.starty,width:a.stopx-a.startx,height:a.stopy-a.starty,fill:a.fill,stroke:a.stroke,class:"rect"};JW(i,f).lower()},RDe=(i,a)=>{const f=a.text.replace(WP," "),p=i.append("text");p.attr("x",a.x),p.attr("y",a.y),p.attr("class","legend"),p.style("text-anchor",a.anchor),a.class!==void 0&&p.attr("class",a.class);const w=p.append("tspan");return w.attr("x",a.x+a.textMargin*2),w.text(f),p},jDe=(i,a,f,p)=>{const w=i.append("image");w.attr("x",a),w.attr("y",f);const m=ik(p);w.attr("xlink:href",m)},$De=(i,a,f,p)=>{const w=i.append("use");w.attr("x",a),w.attr("y",f);const m=ik(p);w.attr("xlink:href",`#${m}`)},bT=()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),Rdt=()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),jdt=function(i,a){return JW(i,a)},yPt=function(i,a,f,p,w,m){const b=i.append("image");b.attr("width",a),b.attr("height",f),b.attr("x",p),b.attr("y",w);let E=m.startsWith("data:image/png;base64")?m:ik(m);b.attr("xlink:href",E)},zDe=(i,a,f)=>{const p=i.append("g");let w=0;for(let m of a){let b=m.textColor?m.textColor:"#444444",E=m.lineColor?m.lineColor:"#444444",_=m.offsetX?parseInt(m.offsetX):0,A=m.offsetY?parseInt(m.offsetY):0,I="";if(w===0){let N=p.append("line");N.attr("x1",m.startPoint.x),N.attr("y1",m.startPoint.y),N.attr("x2",m.endPoint.x),N.attr("y2",m.endPoint.y),N.attr("stroke-width","1"),N.attr("stroke",E),N.style("fill","none"),m.type!=="rel_b"&&N.attr("marker-end","url("+I+"#arrowhead)"),(m.type==="birel"||m.type==="rel_b")&&N.attr("marker-start","url("+I+"#arrowend)"),w=-1}else{let N=p.append("path");N.attr("fill","none").attr("stroke-width","1").attr("stroke",E).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",m.startPoint.x).replaceAll("starty",m.startPoint.y).replaceAll("controlx",m.startPoint.x+(m.endPoint.x-m.startPoint.x)/2-(m.endPoint.x-m.startPoint.x)/4).replaceAll("controly",m.startPoint.y+(m.endPoint.y-m.startPoint.y)/2).replaceAll("stopx",m.endPoint.x).replaceAll("stopy",m.endPoint.y)),m.type!=="rel_b"&&N.attr("marker-end","url("+I+"#arrowhead)"),(m.type==="birel"||m.type==="rel_b")&&N.attr("marker-start","url("+I+"#arrowend)")}let B=f.messageFont();L5(f)(m.label.text,p,Math.min(m.startPoint.x,m.endPoint.x)+Math.abs(m.endPoint.x-m.startPoint.x)/2+_,Math.min(m.startPoint.y,m.endPoint.y)+Math.abs(m.endPoint.y-m.startPoint.y)/2+A,m.label.width,m.label.height,{fill:b},B),m.techn&&m.techn.text!==""&&(B=f.messageFont(),L5(f)("["+m.techn.text+"]",p,Math.min(m.startPoint.x,m.endPoint.x)+Math.abs(m.endPoint.x-m.startPoint.x)/2+_,Math.min(m.startPoint.y,m.endPoint.y)+Math.abs(m.endPoint.y-m.startPoint.y)/2+f.messageFontSize+5+A,Math.max(m.label.width,m.techn.width),m.techn.height,{fill:b,"font-style":"italic"},B))}},qDe=function(i,a,f){const p=i.append("g");let w=a.bgColor?a.bgColor:"none",m=a.borderColor?a.borderColor:"#444444",b=a.fontColor?a.fontColor:"black",E={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};a.nodeType&&(E={"stroke-width":1});let _={x:a.x,y:a.y,fill:w,stroke:m,width:a.width,height:a.height,rx:2.5,ry:2.5,attrs:E};jdt(p,_);let A=f.boundaryFont();A.fontWeight="bold",A.fontSize=A.fontSize+2,A.fontColor=b,L5(f)(a.label.text,p,a.x,a.y+a.label.Y,a.width,a.height,{fill:"#444444"},A),a.type&&a.type.text!==""&&(A=f.boundaryFont(),A.fontColor=b,L5(f)(a.type.text,p,a.x,a.y+a.type.Y,a.width,a.height,{fill:"#444444"},A)),a.descr&&a.descr.text!==""&&(A=f.boundaryFont(),A.fontSize=A.fontSize-2,A.fontColor=b,L5(f)(a.descr.text,p,a.x,a.y+a.descr.Y,a.width,a.height,{fill:"#444444"},A))},HDe=function(i,a,f){var B;let p=a.bgColor?a.bgColor:f[a.typeC4Shape.text+"_bg_color"],w=a.borderColor?a.borderColor:f[a.typeC4Shape.text+"_border_color"],m=a.fontColor?a.fontColor:"#FFFFFF",b="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(a.typeC4Shape.text){case"person":b="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":b="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}const E=i.append("g");E.attr("class","person-man");const _=bT();switch(a.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":_.x=a.x,_.y=a.y,_.fill=p,_.width=a.width,_.height=a.height,_.stroke=w,_.rx=2.5,_.ry=2.5,_.attrs={"stroke-width":.5},jdt(E,_);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":E.append("path").attr("fill",p).attr("stroke-width","0.5").attr("stroke",w).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",a.x).replaceAll("starty",a.y).replaceAll("half",a.width/2).replaceAll("height",a.height)),E.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",w).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",a.x).replaceAll("starty",a.y).replaceAll("half",a.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":E.append("path").attr("fill",p).attr("stroke-width","0.5").attr("stroke",w).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",a.x).replaceAll("starty",a.y).replaceAll("width",a.width).replaceAll("half",a.height/2)),E.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",w).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",a.x+a.width).replaceAll("starty",a.y).replaceAll("half",a.height/2));break}let A=ZDe(f,a.typeC4Shape.text);switch(E.append("text").attr("fill",m).attr("font-family",A.fontFamily).attr("font-size",A.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",a.typeC4Shape.width).attr("x",a.x+a.width/2-a.typeC4Shape.width/2).attr("y",a.y+a.typeC4Shape.Y).text("<<"+a.typeC4Shape.text+">>"),a.typeC4Shape.text){case"person":case"external_person":yPt(E,48,48,a.x+a.width/2-24,a.y+a.image.Y,b);break}let I=f[a.typeC4Shape.text+"Font"]();return I.fontWeight="bold",I.fontSize=I.fontSize+2,I.fontColor=m,L5(f)(a.label.text,E,a.x,a.y+a.label.Y,a.width,a.height,{fill:m},I),I=f[a.typeC4Shape.text+"Font"](),I.fontColor=m,a.techn&&((B=a.techn)==null?void 0:B.text)!==""?L5(f)(a.techn.text,E,a.x,a.y+a.techn.Y,a.width,a.height,{fill:m,"font-style":"italic"},I):a.type&&a.type.text!==""&&L5(f)(a.type.text,E,a.x,a.y+a.type.Y,a.width,a.height,{fill:m,"font-style":"italic"},I),a.descr&&a.descr.text!==""&&(I=f.personFont(),I.fontColor=m,L5(f)(a.descr.text,E,a.x,a.y+a.descr.Y,a.width,a.height,{fill:m},I)),a.height},VDe=function(i){i.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},GDe=function(i){i.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},UDe=function(i){i.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},WDe=function(i){i.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},YDe=function(i){i.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},KDe=function(i){i.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},XDe=function(i){i.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},QDe=function(i){const f=i.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);f.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),f.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},ZDe=(i,a)=>({fontFamily:i[a+"FontFamily"],fontSize:i[a+"FontSize"],fontWeight:i[a+"FontWeight"]}),L5=function(){function i(w,m,b,E,_,A,I){const B=m.append("text").attr("x",b+_/2).attr("y",E+A/2+5).style("text-anchor","middle").text(w);p(B,I)}function a(w,m,b,E,_,A,I,B){const{fontSize:N,fontFamily:R,fontWeight:z}=B,W=w.split(Kr.lineBreakRegex);for(let et=0;et=this.data.widthLimit||p>=this.data.widthLimit||this.nextData.cnt>xPt)&&(f=this.nextData.startx+a.margin+ds.nextLinePaddingX,w=this.nextData.stopy+a.margin*2,this.nextData.stopx=p=f+a.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=m=w+a.height,this.nextData.cnt=1),a.x=f,a.y=w,this.updateVal(this.data,"startx",f,Math.min),this.updateVal(this.data,"starty",w,Math.min),this.updateVal(this.data,"stopx",p,Math.max),this.updateVal(this.data,"stopy",m,Math.max),this.updateVal(this.nextData,"startx",f,Math.min),this.updateVal(this.nextData,"starty",w,Math.min),this.updateVal(this.nextData,"stopx",p,Math.max),this.updateVal(this.nextData,"stopy",m,Math.max)}init(a){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},zdt(a.db.getConfig())}bumpLastMargin(a){this.data.stopx+=a,this.data.stopy+=a}}const zdt=function(i){Z1(ds,i),i.fontFamily&&(ds.personFontFamily=ds.systemFontFamily=ds.messageFontFamily=i.fontFamily),i.fontSize&&(ds.personFontSize=ds.systemFontSize=ds.messageFontSize=i.fontSize),i.fontWeight&&(ds.personFontWeight=ds.systemFontWeight=ds.messageFontWeight=i.fontWeight)},hF=(i,a)=>({fontFamily:i[a+"FontFamily"],fontSize:i[a+"FontSize"],fontWeight:i[a+"FontWeight"]}),nY=i=>({fontFamily:i.boundaryFontFamily,fontSize:i.boundaryFontSize,fontWeight:i.boundaryFontWeight}),JDe=i=>({fontFamily:i.messageFontFamily,fontSize:i.messageFontSize,fontWeight:i.messageFontWeight});function cm(i,a,f,p,w){if(!a[i].width)if(f)a[i].text=UIt(a[i].text,w,p),a[i].textLines=a[i].text.split(Kr.lineBreakRegex).length,a[i].width=w,a[i].height=odt(a[i].text,p);else{let m=a[i].text.split(Kr.lineBreakRegex);a[i].textLines=m.length;let b=0;a[i].height=0,a[i].width=0;for(const E of m)a[i].width=Math.max(d3(E,p),a[i].width),b=odt(E,p),a[i].height=a[i].height+b}}const EPt=function(i,a,f){a.x=f.data.startx,a.y=f.data.starty,a.width=f.data.stopx-f.data.startx,a.height=f.data.stopy-f.data.starty,a.label.y=ds.c4ShapeMargin-35;let p=a.wrap&&ds.wrap,w=nY(ds);w.fontSize=w.fontSize+2,w.fontWeight="bold";let m=d3(a.label.text,w);cm("label",a,p,w,m),b3.drawBoundary(i,a,ds)},TPt=function(i,a,f,p){let w=0;for(const m of p){w=0;const b=f[m];let E=hF(ds,b.typeC4Shape.text);switch(E.fontSize=E.fontSize-2,b.typeC4Shape.width=d3("«"+b.typeC4Shape.text+"»",E),b.typeC4Shape.height=E.fontSize+2,b.typeC4Shape.Y=ds.c4ShapePadding,w=b.typeC4Shape.Y+b.typeC4Shape.height-4,b.image={width:0,height:0,Y:0},b.typeC4Shape.text){case"person":case"external_person":b.image.width=48,b.image.height=48,b.image.Y=w,w=b.image.Y+b.image.height;break}b.sprite&&(b.image.width=48,b.image.height=48,b.image.Y=w,w=b.image.Y+b.image.height);let _=b.wrap&&ds.wrap,A=ds.width-ds.c4ShapePadding*2,I=hF(ds,b.typeC4Shape.text);if(I.fontSize=I.fontSize+2,I.fontWeight="bold",cm("label",b,_,I,A),b.label.Y=w+8,w=b.label.Y+b.label.height,b.type&&b.type.text!==""){b.type.text="["+b.type.text+"]";let R=hF(ds,b.typeC4Shape.text);cm("type",b,_,R,A),b.type.Y=w+5,w=b.type.Y+b.type.height}else if(b.techn&&b.techn.text!==""){b.techn.text="["+b.techn.text+"]";let R=hF(ds,b.techn.text);cm("techn",b,_,R,A),b.techn.Y=w+5,w=b.techn.Y+b.techn.height}let B=w,N=b.label.width;if(b.descr&&b.descr.text!==""){let R=hF(ds,b.typeC4Shape.text);cm("descr",b,_,R,A),b.descr.Y=w+20,w=b.descr.Y+b.descr.height,N=Math.max(b.label.width,b.descr.width),B=w-b.descr.textLines*5}N=N+ds.c4ShapePadding,b.width=Math.max(b.width||ds.width,N,ds.width),b.height=Math.max(b.height||ds.height,B,ds.height),b.margin=b.margin||ds.c4ShapeMargin,i.insert(b),b3.drawC4Shape(a,b,ds)}i.bumpLastMargin(ds.c4ShapeMargin)};let rw=class{constructor(a,f){this.x=a,this.y=f}},CPt=function(i,a){let f=i.x,p=i.y,w=a.x,m=a.y,b=f+i.width/2,E=p+i.height/2,_=Math.abs(f-w),A=Math.abs(p-m),I=A/_,B=i.height/i.width,N=null;return p==m&&fw?N=new rw(f,E):f==w&&pm&&(N=new rw(b,p)),f>w&&p=I?N=new rw(f,E+I*i.width/2):N=new rw(b-_/A*i.height/2,p+i.height):f=I?N=new rw(f+i.width,E+I*i.width/2):N=new rw(b+_/A*i.height/2,p+i.height):fm?B>=I?N=new rw(f+i.width,E-I*i.width/2):N=new rw(b+i.height/2*_/A,p):f>w&&p>m&&(B>=I?N=new rw(f,E-i.width/2*I):N=new rw(b-i.height/2*_/A,p)),N},tIe=function(i,a){let f={x:0,y:0};f.x=a.x+a.width/2,f.y=a.y+a.height/2;let p=CPt(i,f);f.x=i.x+i.width/2,f.y=i.y+i.height/2;let w=CPt(a,f);return{startPoint:p,endPoint:w}};const eIe=function(i,a,f,p){let w=0;for(let m of a){w=w+1;let b=m.wrap&&ds.wrap,E=JDe(ds);p.db.getC4Type()==="C4Dynamic"&&(m.label.text=w+": "+m.label.text);let A=d3(m.label.text,E);cm("label",m,b,E,A),m.techn&&m.techn.text!==""&&(A=d3(m.techn.text,E),cm("techn",m,b,E,A)),m.descr&&m.descr.text!==""&&(A=d3(m.descr.text,E),cm("descr",m,b,E,A));let I=f(m.from),B=f(m.to),N=tIe(I,B);m.startPoint=N.startPoint,m.endPoint=N.endPoint}b3.drawRels(i,a,ds)};function _Pt(i,a,f,p,w){let m=new kPt(w);m.data.widthLimit=f.data.widthLimit/Math.min($dt,p.length);for(let[b,E]of p.entries()){let _=0;E.image={width:0,height:0,Y:0},E.sprite&&(E.image.width=48,E.image.height=48,E.image.Y=_,_=E.image.Y+E.image.height);let A=E.wrap&&ds.wrap,I=nY(ds);if(I.fontSize=I.fontSize+2,I.fontWeight="bold",cm("label",E,A,I,m.data.widthLimit),E.label.Y=_+8,_=E.label.Y+E.label.height,E.type&&E.type.text!==""){E.type.text="["+E.type.text+"]";let z=nY(ds);cm("type",E,A,z,m.data.widthLimit),E.type.Y=_+5,_=E.type.Y+E.type.height}if(E.descr&&E.descr.text!==""){let z=nY(ds);z.fontSize=z.fontSize-2,cm("descr",E,A,z,m.data.widthLimit),E.descr.Y=_+20,_=E.descr.Y+E.descr.height}if(b==0||b%$dt===0){let z=f.data.startx+ds.diagramMarginX,W=f.data.stopy+ds.diagramMarginY+_;m.setData(z,z,W,W)}else{let z=m.data.stopx!==m.data.startx?m.data.stopx+ds.diagramMarginX:m.data.startx,W=m.data.starty;m.setData(z,z,W,W)}m.name=E.alias;let B=w.db.getC4ShapeArray(E.alias),N=w.db.getC4ShapeKeys(E.alias);N.length>0&&TPt(m,i,B,N),a=E.alias;let R=w.db.getBoundarys(a);R.length>0&&_Pt(i,a,m,R,w),E.alias!=="global"&&EPt(i,E,m),f.data.stopy=Math.max(m.data.stopy+ds.c4ShapeMargin,f.data.stopy),f.data.stopx=Math.max(m.data.stopx+ds.c4ShapeMargin,f.data.stopx),tY=Math.max(tY,f.data.stopx),eY=Math.max(eY,f.data.stopy)}}const SPt={drawPersonOrSystemArray:TPt,drawBoundary:EPt,setConf:zdt,draw:function(i,a,f,p){ds=Oe().c4;const w=Oe().securityLevel;let m;w==="sandbox"&&(m=yr("#i"+a));const b=yr(w==="sandbox"?m.nodes()[0].contentDocument.body:"body");let E=p.db;p.db.setWrap(ds.wrap),xPt=E.getC4ShapeInRow(),$dt=E.getC4BoundaryInRow(),Ut.debug(`C:${JSON.stringify(ds,null,2)}`);const _=w==="sandbox"?b.select(`[id="${a}"]`):yr(`[id="${a}"]`);b3.insertComputerIcon(_),b3.insertDatabaseIcon(_),b3.insertClockIcon(_);let A=new kPt(p);A.setData(ds.diagramMarginX,ds.diagramMarginX,ds.diagramMarginY,ds.diagramMarginY),A.data.widthLimit=screen.availWidth,tY=ds.diagramMarginX,eY=ds.diagramMarginY;const I=p.db.getTitle();let B=p.db.getBoundarys("");_Pt(_,"",A,B,p),b3.insertArrowHead(_),b3.insertArrowEnd(_),b3.insertArrowCrossHead(_),b3.insertArrowFilledHead(_),eIe(_,p.db.getRels(),p.db.getC4Shape,p),A.data.stopx=tY,A.data.stopy=eY;const N=A.data;let z=N.stopy-N.starty+2*ds.diagramMarginY;const et=N.stopx-N.startx+2*ds.diagramMarginX;I&&_.append("text").text(I).attr("x",(N.stopx-N.startx)/2-4*ds.diagramMarginX).attr("y",N.starty+ds.diagramMarginY),k0(_,z,et,ds.useMaxWidth);const st=I?60:0;_.attr("viewBox",N.startx-ds.diagramMarginX+" -"+(ds.diagramMarginY+st)+" "+et+" "+(z+st)),Ut.debug("models:",N)}},nIe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:gDe,db:Bdt,renderer:SPt,styles:i=>`.person { + stroke: ${i.personBorder}; + fill: ${i.personBkg}; + } +`,init:({c4:i,wrap:a})=>{SPt.setConf(i),Bdt.setWrap(a)}}},Symbol.toStringTag,{value:"Module"}));var qdt=function(){var i=function(af,Qi,Ts,ka){for(Ts=Ts||{},ka=af.length;ka--;Ts[af[ka]]=Qi);return Ts},a=[1,4],f=[1,3],p=[1,5],w=[1,8,9,10,11,27,34,36,38,42,58,81,82,83,84,85,86,99,102,103,106,108,111,112,113,118,119,120,121],m=[2,2],b=[1,13],E=[1,14],_=[1,15],A=[1,16],I=[1,23],B=[1,25],N=[1,26],R=[1,27],z=[1,49],W=[1,48],et=[1,29],st=[1,30],at=[1,31],bt=[1,32],mt=[1,33],yt=[1,44],ft=[1,46],ut=[1,42],vt=[1,47],X=[1,43],pt=[1,50],U=[1,45],Tt=[1,51],nt=[1,52],It=[1,34],Ot=[1,35],Bt=[1,36],Et=[1,37],Z=[1,57],Ct=[1,8,9,10,11,27,32,34,36,38,42,58,81,82,83,84,85,86,99,102,103,106,108,111,112,113,118,119,120,121],xt=[1,61],Ht=[1,60],Le=[1,62],Ft=[8,9,11,73,75],gn=[1,88],Se=[1,93],me=[1,92],Ve=[1,89],Ye=[1,85],ce=[1,91],ke=[1,87],zt=[1,94],re=[1,90],se=[1,95],Pe=[1,86],te=[8,9,10,11,73,75],Me=[8,9,10,11,44,73,75],de=[8,9,10,11,29,42,44,46,48,50,52,54,56,58,61,63,65,66,68,73,75,86,99,102,103,106,108,111,112,113],on=[8,9,11,42,58,73,75,86,99,102,103,106,108,111,112,113],ni=[42,58,86,99,102,103,106,108,111,112,113],Ks=[1,121],ws=[1,120],fo=[1,128],Xi=[1,142],Er=[1,143],Xn=[1,144],di=[1,145],Ee=[1,130],Kn=[1,132],He=[1,136],Ti=[1,137],pn=[1,138],Es=[1,139],qa=[1,140],Ma=[1,141],Gs=[1,146],Po=[1,147],vs=[1,126],ru=[1,127],zs=[1,134],Du=[1,129],pm=[1,133],uw=[1,131],Wu=[8,9,10,11,27,32,34,36,38,42,58,81,82,83,84,85,86,99,102,103,106,108,111,112,113,118,119,120,121],th=[1,149],Fa=[8,9,11],Ml=[8,9,10,11,14,42,58,86,102,103,106,108,111,112,113],ha=[1,169],bc=[1,165],Cc=[1,166],pa=[1,170],Da=[1,167],Ha=[1,168],Dl=[75,113,116],_c=[8,9,10,11,12,14,27,29,32,42,58,73,81,82,83,84,85,86,87,102,106,108,111,112,113],lw=[10,103],eh=[31,47,49,51,53,55,60,62,64,65,67,69,113,114,115],ed=[1,235],jd=[1,233],nd=[1,237],$d=[1,231],A0=[1,232],Bi=[1,234],cn=[1,236],kr=[1,238],Ei=[1,255],Jo=[8,9,11,103],wc=[8,9,10,11,58,81,102,103,106,107,108,109],rf={trace:function(){},yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeperator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,verticeStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,link:39,node:40,styledVertex:41,AMP:42,vertex:43,STYLE_SEPARATOR:44,idString:45,DOUBLECIRCLESTART:46,DOUBLECIRCLEEND:47,PS:48,PE:49,"(-":50,"-)":51,STADIUMSTART:52,STADIUMEND:53,SUBROUTINESTART:54,SUBROUTINEEND:55,VERTEX_WITH_PROPS_START:56,"NODE_STRING[field]":57,COLON:58,"NODE_STRING[value]":59,PIPE:60,CYLINDERSTART:61,CYLINDEREND:62,DIAMOND_START:63,DIAMOND_STOP:64,TAGEND:65,TRAPSTART:66,TRAPEND:67,INVTRAPSTART:68,INVTRAPEND:69,linkStatement:70,arrowText:71,TESTSTR:72,START_LINK:73,edgeText:74,LINK:75,edgeTextToken:76,STR:77,MD_STR:78,textToken:79,keywords:80,STYLE:81,LINKSTYLE:82,CLASSDEF:83,CLASS:84,CLICK:85,DOWN:86,UP:87,textNoTagsToken:88,stylesOpt:89,"idString[vertex]":90,"idString[class]":91,CALLBACKNAME:92,CALLBACKARGS:93,HREF:94,LINK_TARGET:95,"STR[link]":96,"STR[tooltip]":97,alphaNum:98,DEFAULT:99,numList:100,INTERPOLATE:101,NUM:102,COMMA:103,style:104,styleComponent:105,NODE_STRING:106,UNIT:107,BRKT:108,PCT:109,idStringToken:110,MINUS:111,MULT:112,UNICODE_TEXT:113,TEXT:114,TAGSTART:115,EDGE_TEXT:116,alphaNumToken:117,direction_tb:118,direction_bt:119,direction_rl:120,direction_lr:121,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",42:"AMP",44:"STYLE_SEPARATOR",46:"DOUBLECIRCLESTART",47:"DOUBLECIRCLEEND",48:"PS",49:"PE",50:"(-",51:"-)",52:"STADIUMSTART",53:"STADIUMEND",54:"SUBROUTINESTART",55:"SUBROUTINEEND",56:"VERTEX_WITH_PROPS_START",57:"NODE_STRING[field]",58:"COLON",59:"NODE_STRING[value]",60:"PIPE",61:"CYLINDERSTART",62:"CYLINDEREND",63:"DIAMOND_START",64:"DIAMOND_STOP",65:"TAGEND",66:"TRAPSTART",67:"TRAPEND",68:"INVTRAPSTART",69:"INVTRAPEND",72:"TESTSTR",73:"START_LINK",75:"LINK",77:"STR",78:"MD_STR",81:"STYLE",82:"LINKSTYLE",83:"CLASSDEF",84:"CLASS",85:"CLICK",86:"DOWN",87:"UP",90:"idString[vertex]",91:"idString[class]",92:"CALLBACKNAME",93:"CALLBACKARGS",94:"HREF",95:"LINK_TARGET",96:"STR[link]",97:"STR[tooltip]",99:"DEFAULT",101:"INTERPOLATE",102:"NUM",103:"COMMA",106:"NODE_STRING",107:"UNIT",108:"BRKT",109:"PCT",111:"MINUS",112:"MULT",113:"UNICODE_TEXT",114:"TEXT",115:"TAGSTART",116:"EDGE_TEXT",118:"direction_tb",119:"direction_bt",120:"direction_rl",121:"direction_lr"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[20,3],[20,4],[20,2],[20,1],[40,1],[40,5],[41,1],[41,3],[43,4],[43,4],[43,6],[43,4],[43,4],[43,4],[43,8],[43,4],[43,4],[43,4],[43,6],[43,4],[43,4],[43,4],[43,4],[43,4],[43,1],[39,2],[39,3],[39,3],[39,1],[39,3],[74,1],[74,2],[74,1],[74,1],[70,1],[71,3],[30,1],[30,2],[30,1],[30,1],[80,1],[80,1],[80,1],[80,1],[80,1],[80,1],[80,1],[80,1],[80,1],[80,1],[80,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[100,1],[100,3],[89,1],[89,3],[104,1],[104,2],[105,1],[105,1],[105,1],[105,1],[105,1],[105,1],[105,1],[105,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[110,1],[79,1],[79,1],[79,1],[79,1],[88,1],[88,1],[88,1],[88,1],[88,1],[88,1],[88,1],[88,1],[88,1],[88,1],[88,1],[76,1],[76,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[117,1],[45,1],[45,2],[98,1],[98,2],[33,1],[33,1],[33,1],[33,1]],performAction:function(Qi,Ts,ka,xi,Yc,Ce,vp){var Be=Ce.length-1;switch(Yc){case 2:this.$=[];break;case 3:(!Array.isArray(Ce[Be])||Ce[Be].length>0)&&Ce[Be-1].push(Ce[Be]),this.$=Ce[Be-1];break;case 4:case 176:this.$=Ce[Be];break;case 11:xi.setDirection("TB"),this.$="TB";break;case 12:xi.setDirection(Ce[Be-1]),this.$=Ce[Be-1];break;case 27:this.$=Ce[Be-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=xi.addSubGraph(Ce[Be-6],Ce[Be-1],Ce[Be-4]);break;case 34:this.$=xi.addSubGraph(Ce[Be-3],Ce[Be-1],Ce[Be-3]);break;case 35:this.$=xi.addSubGraph(void 0,Ce[Be-1],void 0);break;case 37:this.$=Ce[Be].trim(),xi.setAccTitle(this.$);break;case 38:case 39:this.$=Ce[Be].trim(),xi.setAccDescription(this.$);break;case 43:xi.addLink(Ce[Be-2].stmt,Ce[Be],Ce[Be-1]),this.$={stmt:Ce[Be],nodes:Ce[Be].concat(Ce[Be-2].nodes)};break;case 44:xi.addLink(Ce[Be-3].stmt,Ce[Be-1],Ce[Be-2]),this.$={stmt:Ce[Be-1],nodes:Ce[Be-1].concat(Ce[Be-3].nodes)};break;case 45:this.$={stmt:Ce[Be-1],nodes:Ce[Be-1]};break;case 46:this.$={stmt:Ce[Be],nodes:Ce[Be]};break;case 47:this.$=[Ce[Be]];break;case 48:this.$=Ce[Be-4].concat(Ce[Be]);break;case 49:this.$=Ce[Be];break;case 50:this.$=Ce[Be-2],xi.setClass(Ce[Be-2],Ce[Be]);break;case 51:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"square");break;case 52:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"doublecircle");break;case 53:this.$=Ce[Be-5],xi.addVertex(Ce[Be-5],Ce[Be-2],"circle");break;case 54:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"ellipse");break;case 55:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"stadium");break;case 56:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"subroutine");break;case 57:this.$=Ce[Be-7],xi.addVertex(Ce[Be-7],Ce[Be-1],"rect",void 0,void 0,void 0,Object.fromEntries([[Ce[Be-5],Ce[Be-3]]]));break;case 58:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"cylinder");break;case 59:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"round");break;case 60:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"diamond");break;case 61:this.$=Ce[Be-5],xi.addVertex(Ce[Be-5],Ce[Be-2],"hexagon");break;case 62:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"odd");break;case 63:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"trapezoid");break;case 64:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"inv_trapezoid");break;case 65:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"lean_right");break;case 66:this.$=Ce[Be-3],xi.addVertex(Ce[Be-3],Ce[Be-1],"lean_left");break;case 67:this.$=Ce[Be],xi.addVertex(Ce[Be]);break;case 68:Ce[Be-1].text=Ce[Be],this.$=Ce[Be-1];break;case 69:case 70:Ce[Be-2].text=Ce[Be-1],this.$=Ce[Be-2];break;case 71:this.$=Ce[Be];break;case 72:var Bf=xi.destructLink(Ce[Be],Ce[Be-2]);this.$={type:Bf.type,stroke:Bf.stroke,length:Bf.length,text:Ce[Be-1]};break;case 73:this.$={text:Ce[Be],type:"text"};break;case 74:this.$={text:Ce[Be-1].text+""+Ce[Be],type:Ce[Be-1].type};break;case 75:this.$={text:Ce[Be],type:"string"};break;case 76:this.$={text:Ce[Be],type:"markdown"};break;case 77:var Bf=xi.destructLink(Ce[Be]);this.$={type:Bf.type,stroke:Bf.stroke,length:Bf.length};break;case 78:this.$=Ce[Be-1];break;case 79:this.$={text:Ce[Be],type:"text"};break;case 80:this.$={text:Ce[Be-1].text+""+Ce[Be],type:Ce[Be-1].type};break;case 81:this.$={text:Ce[Be],type:"string"};break;case 82:case 97:this.$={text:Ce[Be],type:"markdown"};break;case 94:this.$={text:Ce[Be],type:"text"};break;case 95:this.$={text:Ce[Be-1].text+""+Ce[Be],type:Ce[Be-1].type};break;case 96:this.$={text:Ce[Be],type:"text"};break;case 98:this.$=Ce[Be-4],xi.addClass(Ce[Be-2],Ce[Be]);break;case 99:this.$=Ce[Be-4],xi.setClass(Ce[Be-2],Ce[Be]);break;case 100:case 108:this.$=Ce[Be-1],xi.setClickEvent(Ce[Be-1],Ce[Be]);break;case 101:case 109:this.$=Ce[Be-3],xi.setClickEvent(Ce[Be-3],Ce[Be-2]),xi.setTooltip(Ce[Be-3],Ce[Be]);break;case 102:this.$=Ce[Be-2],xi.setClickEvent(Ce[Be-2],Ce[Be-1],Ce[Be]);break;case 103:this.$=Ce[Be-4],xi.setClickEvent(Ce[Be-4],Ce[Be-3],Ce[Be-2]),xi.setTooltip(Ce[Be-4],Ce[Be]);break;case 104:this.$=Ce[Be-2],xi.setLink(Ce[Be-2],Ce[Be]);break;case 105:this.$=Ce[Be-4],xi.setLink(Ce[Be-4],Ce[Be-2]),xi.setTooltip(Ce[Be-4],Ce[Be]);break;case 106:this.$=Ce[Be-4],xi.setLink(Ce[Be-4],Ce[Be-2],Ce[Be]);break;case 107:this.$=Ce[Be-6],xi.setLink(Ce[Be-6],Ce[Be-4],Ce[Be]),xi.setTooltip(Ce[Be-6],Ce[Be-2]);break;case 110:this.$=Ce[Be-1],xi.setLink(Ce[Be-1],Ce[Be]);break;case 111:this.$=Ce[Be-3],xi.setLink(Ce[Be-3],Ce[Be-2]),xi.setTooltip(Ce[Be-3],Ce[Be]);break;case 112:this.$=Ce[Be-3],xi.setLink(Ce[Be-3],Ce[Be-2],Ce[Be]);break;case 113:this.$=Ce[Be-5],xi.setLink(Ce[Be-5],Ce[Be-4],Ce[Be]),xi.setTooltip(Ce[Be-5],Ce[Be-2]);break;case 114:this.$=Ce[Be-4],xi.addVertex(Ce[Be-2],void 0,void 0,Ce[Be]);break;case 115:this.$=Ce[Be-4],xi.updateLink([Ce[Be-2]],Ce[Be]);break;case 116:this.$=Ce[Be-4],xi.updateLink(Ce[Be-2],Ce[Be]);break;case 117:this.$=Ce[Be-8],xi.updateLinkInterpolate([Ce[Be-6]],Ce[Be-2]),xi.updateLink([Ce[Be-6]],Ce[Be]);break;case 118:this.$=Ce[Be-8],xi.updateLinkInterpolate(Ce[Be-6],Ce[Be-2]),xi.updateLink(Ce[Be-6],Ce[Be]);break;case 119:this.$=Ce[Be-6],xi.updateLinkInterpolate([Ce[Be-4]],Ce[Be]);break;case 120:this.$=Ce[Be-6],xi.updateLinkInterpolate(Ce[Be-4],Ce[Be]);break;case 121:case 123:this.$=[Ce[Be]];break;case 122:case 124:Ce[Be-2].push(Ce[Be]),this.$=Ce[Be-2];break;case 126:this.$=Ce[Be-1]+Ce[Be];break;case 174:this.$=Ce[Be];break;case 175:this.$=Ce[Be-1]+""+Ce[Be];break;case 177:this.$=Ce[Be-1]+""+Ce[Be];break;case 178:this.$={stmt:"dir",value:"TB"};break;case 179:this.$={stmt:"dir",value:"BT"};break;case 180:this.$={stmt:"dir",value:"RL"};break;case 181:this.$={stmt:"dir",value:"LR"};break}},table:[{3:1,4:2,9:a,10:f,12:p},{1:[3]},i(w,m,{5:6}),{4:7,9:a,10:f,12:p},{4:8,9:a,10:f,12:p},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:b,9:E,10:_,11:A,20:17,22:18,23:19,24:20,25:21,26:22,27:I,33:24,34:B,36:N,38:R,40:28,41:38,42:z,43:39,45:40,58:W,81:et,82:st,83:at,84:bt,85:mt,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt,118:It,119:Ot,120:Bt,121:Et},i(w,[2,9]),i(w,[2,10]),i(w,[2,11]),{8:[1,54],9:[1,55],10:Z,15:53,18:56},i(Ct,[2,3]),i(Ct,[2,4]),i(Ct,[2,5]),i(Ct,[2,6]),i(Ct,[2,7]),i(Ct,[2,8]),{8:xt,9:Ht,11:Le,21:58,39:59,70:63,73:[1,64],75:[1,65]},{8:xt,9:Ht,11:Le,21:66},{8:xt,9:Ht,11:Le,21:67},{8:xt,9:Ht,11:Le,21:68},{8:xt,9:Ht,11:Le,21:69},{8:xt,9:Ht,11:Le,21:70},{8:xt,9:Ht,10:[1,71],11:Le,21:72},i(Ct,[2,36]),{35:[1,73]},{37:[1,74]},i(Ct,[2,39]),i(Ft,[2,46],{18:75,10:Z}),{10:[1,76]},{10:[1,77]},{10:[1,78]},{10:[1,79]},{14:gn,42:Se,58:me,77:[1,83],86:Ve,92:[1,80],94:[1,81],98:82,102:Ye,103:ce,106:ke,108:zt,111:re,112:se,113:Pe,117:84},i(Ct,[2,178]),i(Ct,[2,179]),i(Ct,[2,180]),i(Ct,[2,181]),i(te,[2,47]),i(te,[2,49],{44:[1,96]}),i(Me,[2,67],{110:109,29:[1,97],42:z,46:[1,98],48:[1,99],50:[1,100],52:[1,101],54:[1,102],56:[1,103],58:W,61:[1,104],63:[1,105],65:[1,106],66:[1,107],68:[1,108],86:yt,99:ft,102:ut,103:vt,106:X,108:pt,111:U,112:Tt,113:nt}),i(de,[2,174]),i(de,[2,135]),i(de,[2,136]),i(de,[2,137]),i(de,[2,138]),i(de,[2,139]),i(de,[2,140]),i(de,[2,141]),i(de,[2,142]),i(de,[2,143]),i(de,[2,144]),i(de,[2,145]),i(w,[2,12]),i(w,[2,18]),i(w,[2,19]),{9:[1,110]},i(on,[2,26],{18:111,10:Z}),i(Ct,[2,27]),{40:112,41:38,42:z,43:39,45:40,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt},i(Ct,[2,40]),i(Ct,[2,41]),i(Ct,[2,42]),i(ni,[2,71],{71:113,60:[1,115],72:[1,114]}),{74:116,76:117,77:[1,118],78:[1,119],113:Ks,116:ws},i([42,58,60,72,86,99,102,103,106,108,111,112,113],[2,77]),i(Ct,[2,28]),i(Ct,[2,29]),i(Ct,[2,30]),i(Ct,[2,31]),i(Ct,[2,32]),{10:fo,12:Xi,14:Er,27:Xn,28:122,32:di,42:Ee,58:Kn,73:He,77:[1,124],78:[1,125],80:135,81:Ti,82:pn,83:Es,84:qa,85:Ma,86:Gs,87:Po,88:123,102:vs,106:ru,108:zs,111:Du,112:pm,113:uw},i(Wu,m,{5:148}),i(Ct,[2,37]),i(Ct,[2,38]),i(Ft,[2,45],{42:th}),{42:z,45:150,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt},{99:[1,151],100:152,102:[1,153]},{42:z,45:154,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt},{42:z,45:155,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt},i(Fa,[2,100],{10:[1,156],93:[1,157]}),{77:[1,158]},i(Fa,[2,108],{117:160,10:[1,159],14:gn,42:Se,58:me,86:Ve,102:Ye,103:ce,106:ke,108:zt,111:re,112:se,113:Pe}),i(Fa,[2,110],{10:[1,161]}),i(Ml,[2,176]),i(Ml,[2,163]),i(Ml,[2,164]),i(Ml,[2,165]),i(Ml,[2,166]),i(Ml,[2,167]),i(Ml,[2,168]),i(Ml,[2,169]),i(Ml,[2,170]),i(Ml,[2,171]),i(Ml,[2,172]),i(Ml,[2,173]),{42:z,45:162,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt},{30:163,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{30:171,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{30:173,48:[1,172],65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{30:174,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{30:175,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{30:176,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{106:[1,177]},{30:178,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{30:179,63:[1,180],65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{30:181,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{30:182,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{30:183,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},i(de,[2,175]),i(w,[2,20]),i(on,[2,25]),i(Ft,[2,43],{18:184,10:Z}),i(ni,[2,68],{10:[1,185]}),{10:[1,186]},{30:187,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{75:[1,188],76:189,113:Ks,116:ws},i(Dl,[2,73]),i(Dl,[2,75]),i(Dl,[2,76]),i(Dl,[2,161]),i(Dl,[2,162]),{8:xt,9:Ht,10:fo,11:Le,12:Xi,14:Er,21:191,27:Xn,29:[1,190],32:di,42:Ee,58:Kn,73:He,80:135,81:Ti,82:pn,83:Es,84:qa,85:Ma,86:Gs,87:Po,88:192,102:vs,106:ru,108:zs,111:Du,112:pm,113:uw},i(_c,[2,94]),i(_c,[2,96]),i(_c,[2,97]),i(_c,[2,150]),i(_c,[2,151]),i(_c,[2,152]),i(_c,[2,153]),i(_c,[2,154]),i(_c,[2,155]),i(_c,[2,156]),i(_c,[2,157]),i(_c,[2,158]),i(_c,[2,159]),i(_c,[2,160]),i(_c,[2,83]),i(_c,[2,84]),i(_c,[2,85]),i(_c,[2,86]),i(_c,[2,87]),i(_c,[2,88]),i(_c,[2,89]),i(_c,[2,90]),i(_c,[2,91]),i(_c,[2,92]),i(_c,[2,93]),{6:11,7:12,8:b,9:E,10:_,11:A,20:17,22:18,23:19,24:20,25:21,26:22,27:I,32:[1,193],33:24,34:B,36:N,38:R,40:28,41:38,42:z,43:39,45:40,58:W,81:et,82:st,83:at,84:bt,85:mt,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt,118:It,119:Ot,120:Bt,121:Et},{10:Z,18:194},{10:[1,195],42:z,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:109,111:U,112:Tt,113:nt},{10:[1,196]},{10:[1,197],103:[1,198]},i(lw,[2,121]),{10:[1,199],42:z,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:109,111:U,112:Tt,113:nt},{10:[1,200],42:z,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:109,111:U,112:Tt,113:nt},{77:[1,201]},i(Fa,[2,102],{10:[1,202]}),i(Fa,[2,104],{10:[1,203]}),{77:[1,204]},i(Ml,[2,177]),{77:[1,205],95:[1,206]},i(te,[2,50],{110:109,42:z,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,111:U,112:Tt,113:nt}),{31:[1,207],65:ha,79:208,113:pa,114:Da,115:Ha},i(eh,[2,79]),i(eh,[2,81]),i(eh,[2,82]),i(eh,[2,146]),i(eh,[2,147]),i(eh,[2,148]),i(eh,[2,149]),{47:[1,209],65:ha,79:208,113:pa,114:Da,115:Ha},{30:210,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{49:[1,211],65:ha,79:208,113:pa,114:Da,115:Ha},{51:[1,212],65:ha,79:208,113:pa,114:Da,115:Ha},{53:[1,213],65:ha,79:208,113:pa,114:Da,115:Ha},{55:[1,214],65:ha,79:208,113:pa,114:Da,115:Ha},{58:[1,215]},{62:[1,216],65:ha,79:208,113:pa,114:Da,115:Ha},{64:[1,217],65:ha,79:208,113:pa,114:Da,115:Ha},{30:218,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},{31:[1,219],65:ha,79:208,113:pa,114:Da,115:Ha},{65:ha,67:[1,220],69:[1,221],79:208,113:pa,114:Da,115:Ha},{65:ha,67:[1,223],69:[1,222],79:208,113:pa,114:Da,115:Ha},i(Ft,[2,44],{42:th}),i(ni,[2,70]),i(ni,[2,69]),{60:[1,224],65:ha,79:208,113:pa,114:Da,115:Ha},i(ni,[2,72]),i(Dl,[2,74]),{30:225,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},i(Wu,m,{5:226}),i(_c,[2,95]),i(Ct,[2,35]),{41:227,42:z,43:39,45:40,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt},{10:ed,58:jd,81:nd,89:228,102:$d,104:229,105:230,106:A0,107:Bi,108:cn,109:kr},{10:ed,58:jd,81:nd,89:239,101:[1,240],102:$d,104:229,105:230,106:A0,107:Bi,108:cn,109:kr},{10:ed,58:jd,81:nd,89:241,101:[1,242],102:$d,104:229,105:230,106:A0,107:Bi,108:cn,109:kr},{102:[1,243]},{10:ed,58:jd,81:nd,89:244,102:$d,104:229,105:230,106:A0,107:Bi,108:cn,109:kr},{42:z,45:245,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt},i(Fa,[2,101]),{77:[1,246]},{77:[1,247],95:[1,248]},i(Fa,[2,109]),i(Fa,[2,111],{10:[1,249]}),i(Fa,[2,112]),i(Me,[2,51]),i(eh,[2,80]),i(Me,[2,52]),{49:[1,250],65:ha,79:208,113:pa,114:Da,115:Ha},i(Me,[2,59]),i(Me,[2,54]),i(Me,[2,55]),i(Me,[2,56]),{106:[1,251]},i(Me,[2,58]),i(Me,[2,60]),{64:[1,252],65:ha,79:208,113:pa,114:Da,115:Ha},i(Me,[2,62]),i(Me,[2,63]),i(Me,[2,65]),i(Me,[2,64]),i(Me,[2,66]),i([10,42,58,86,99,102,103,106,108,111,112,113],[2,78]),{31:[1,253],65:ha,79:208,113:pa,114:Da,115:Ha},{6:11,7:12,8:b,9:E,10:_,11:A,20:17,22:18,23:19,24:20,25:21,26:22,27:I,32:[1,254],33:24,34:B,36:N,38:R,40:28,41:38,42:z,43:39,45:40,58:W,81:et,82:st,83:at,84:bt,85:mt,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt,118:It,119:Ot,120:Bt,121:Et},i(te,[2,48]),i(Fa,[2,114],{103:Ei}),i(Jo,[2,123],{105:256,10:ed,58:jd,81:nd,102:$d,106:A0,107:Bi,108:cn,109:kr}),i(wc,[2,125]),i(wc,[2,127]),i(wc,[2,128]),i(wc,[2,129]),i(wc,[2,130]),i(wc,[2,131]),i(wc,[2,132]),i(wc,[2,133]),i(wc,[2,134]),i(Fa,[2,115],{103:Ei}),{10:[1,257]},i(Fa,[2,116],{103:Ei}),{10:[1,258]},i(lw,[2,122]),i(Fa,[2,98],{103:Ei}),i(Fa,[2,99],{110:109,42:z,58:W,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,111:U,112:Tt,113:nt}),i(Fa,[2,103]),i(Fa,[2,105],{10:[1,259]}),i(Fa,[2,106]),{95:[1,260]},{49:[1,261]},{60:[1,262]},{64:[1,263]},{8:xt,9:Ht,11:Le,21:264},i(Ct,[2,34]),{10:ed,58:jd,81:nd,102:$d,104:265,105:230,106:A0,107:Bi,108:cn,109:kr},i(wc,[2,126]),{14:gn,42:Se,58:me,86:Ve,98:266,102:Ye,103:ce,106:ke,108:zt,111:re,112:se,113:Pe,117:84},{14:gn,42:Se,58:me,86:Ve,98:267,102:Ye,103:ce,106:ke,108:zt,111:re,112:se,113:Pe,117:84},{95:[1,268]},i(Fa,[2,113]),i(Me,[2,53]),{30:269,65:ha,77:bc,78:Cc,79:164,113:pa,114:Da,115:Ha},i(Me,[2,61]),i(Wu,m,{5:270}),i(Jo,[2,124],{105:256,10:ed,58:jd,81:nd,102:$d,106:A0,107:Bi,108:cn,109:kr}),i(Fa,[2,119],{117:160,10:[1,271],14:gn,42:Se,58:me,86:Ve,102:Ye,103:ce,106:ke,108:zt,111:re,112:se,113:Pe}),i(Fa,[2,120],{117:160,10:[1,272],14:gn,42:Se,58:me,86:Ve,102:Ye,103:ce,106:ke,108:zt,111:re,112:se,113:Pe}),i(Fa,[2,107]),{31:[1,273],65:ha,79:208,113:pa,114:Da,115:Ha},{6:11,7:12,8:b,9:E,10:_,11:A,20:17,22:18,23:19,24:20,25:21,26:22,27:I,32:[1,274],33:24,34:B,36:N,38:R,40:28,41:38,42:z,43:39,45:40,58:W,81:et,82:st,83:at,84:bt,85:mt,86:yt,99:ft,102:ut,103:vt,106:X,108:pt,110:41,111:U,112:Tt,113:nt,118:It,119:Ot,120:Bt,121:Et},{10:ed,58:jd,81:nd,89:275,102:$d,104:229,105:230,106:A0,107:Bi,108:cn,109:kr},{10:ed,58:jd,81:nd,89:276,102:$d,104:229,105:230,106:A0,107:Bi,108:cn,109:kr},i(Me,[2,57]),i(Ct,[2,33]),i(Fa,[2,117],{103:Ei}),i(Fa,[2,118],{103:Ei})],defaultActions:{},parseError:function(Qi,Ts){if(Ts.recoverable)this.trace(Qi);else{var ka=new Error(Qi);throw ka.hash=Ts,ka}},parse:function(Qi){var Ts=this,ka=[0],xi=[],Yc=[null],Ce=[],vp=this.table,Be="",Bf=0,yg=0,bm=2,Ek=1,E3=Ce.slice.call(arguments,1),Il=Object.create(this.lexer),L0={yy:{}};for(var hw in this.yy)Object.prototype.hasOwnProperty.call(this.yy,hw)&&(L0.yy[hw]=this.yy[hw]);Il.setInput(Qi,L0.yy),L0.yy.lexer=Il,L0.yy.parser=this,typeof Il.yylloc>"u"&&(Il.yylloc={});var H5=Il.yylloc;Ce.push(H5);var Hb=Il.options&&Il.options.ranges;typeof L0.yy.parseError=="function"?this.parseError=L0.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function V5(){var xg;return xg=xi.pop()||Il.lex()||Ek,typeof xg!="number"&&(xg instanceof Array&&(xi=xg,xg=xi.pop()),xg=Ts.symbols_[xg]||xg),xg}for(var f1,rd,id,G5,fw={},U5,mp,W5,T3;;){if(rd=ka[ka.length-1],this.defaultActions[rd]?id=this.defaultActions[rd]:((f1===null||typeof f1>"u")&&(f1=V5()),id=vp[rd]&&vp[rd][f1]),typeof id>"u"||!id.length||!id[0]){var wm="";T3=[];for(U5 in vp[rd])this.terminals_[U5]&&U5>bm&&T3.push("'"+this.terminals_[U5]+"'");Il.showPosition?wm="Parse error on line "+(Bf+1)+`: +`+Il.showPosition()+` +Expecting `+T3.join(", ")+", got '"+(this.terminals_[f1]||f1)+"'":wm="Parse error on line "+(Bf+1)+": Unexpected "+(f1==Ek?"end of input":"'"+(this.terminals_[f1]||f1)+"'"),this.parseError(wm,{text:Il.match,token:this.terminals_[f1]||f1,line:Il.yylineno,loc:H5,expected:T3})}if(id[0]instanceof Array&&id.length>1)throw new Error("Parse Error: multiple actions possible at state: "+rd+", token: "+f1);switch(id[0]){case 1:ka.push(f1),Yc.push(Il.yytext),Ce.push(Il.yylloc),ka.push(id[1]),f1=null,yg=Il.yyleng,Be=Il.yytext,Bf=Il.yylineno,H5=Il.yylloc;break;case 2:if(mp=this.productions_[id[1]][1],fw.$=Yc[Yc.length-mp],fw._$={first_line:Ce[Ce.length-(mp||1)].first_line,last_line:Ce[Ce.length-1].last_line,first_column:Ce[Ce.length-(mp||1)].first_column,last_column:Ce[Ce.length-1].last_column},Hb&&(fw._$.range=[Ce[Ce.length-(mp||1)].range[0],Ce[Ce.length-1].range[1]]),G5=this.performAction.apply(fw,[Be,yg,Bf,L0.yy,id[1],Yc,Ce].concat(E3)),typeof G5<"u")return G5;mp&&(ka=ka.slice(0,-1*mp*2),Yc=Yc.slice(0,-1*mp),Ce=Ce.slice(0,-1*mp)),ka.push(this.productions_[id[1]][0]),Yc.push(fw.$),Ce.push(fw._$),W5=vp[ka[ka.length-2]][ka[ka.length-1]],ka.push(W5);break;case 3:return!0}}return!0}},Oc=function(){var af={EOF:1,parseError:function(Ts,ka){if(this.yy.parser)this.yy.parser.parseError(Ts,ka);else throw new Error(Ts)},setInput:function(Qi,Ts){return this.yy=Ts||this.yy||{},this._input=Qi,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var Qi=this._input[0];this.yytext+=Qi,this.yyleng++,this.offset++,this.match+=Qi,this.matched+=Qi;var Ts=Qi.match(/(?:\r\n?|\n).*/g);return Ts?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Qi},unput:function(Qi){var Ts=Qi.length,ka=Qi.split(/(?:\r\n?|\n)/g);this._input=Qi+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ts),this.offset-=Ts;var xi=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ka.length-1&&(this.yylineno-=ka.length-1);var Yc=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ka?(ka.length===xi.length?this.yylloc.first_column:0)+xi[xi.length-ka.length].length-ka[0].length:this.yylloc.first_column-Ts},this.options.ranges&&(this.yylloc.range=[Yc[0],Yc[0]+this.yyleng-Ts]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(Qi){this.unput(this.match.slice(Qi))},pastInput:function(){var Qi=this.matched.substr(0,this.matched.length-this.match.length);return(Qi.length>20?"...":"")+Qi.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var Qi=this.match;return Qi.length<20&&(Qi+=this._input.substr(0,20-Qi.length)),(Qi.substr(0,20)+(Qi.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var Qi=this.pastInput(),Ts=new Array(Qi.length+1).join("-");return Qi+this.upcomingInput()+` +`+Ts+"^"},test_match:function(Qi,Ts){var ka,xi,Yc;if(this.options.backtrack_lexer&&(Yc={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Yc.yylloc.range=this.yylloc.range.slice(0))),xi=Qi[0].match(/(?:\r\n?|\n).*/g),xi&&(this.yylineno+=xi.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:xi?xi[xi.length-1].length-xi[xi.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Qi[0].length},this.yytext+=Qi[0],this.match+=Qi[0],this.matches=Qi,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Qi[0].length),this.matched+=Qi[0],ka=this.performAction.call(this,this.yy,this,Ts,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ka)return ka;if(this._backtrack){for(var Ce in Yc)this[Ce]=Yc[Ce];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Qi,Ts,ka,xi;this._more||(this.yytext="",this.match="");for(var Yc=this._currentRules(),Ce=0;CeTs[0].length)){if(Ts=ka,xi=Ce,this.options.backtrack_lexer){if(Qi=this.test_match(ka,Yc[Ce]),Qi!==!1)return Qi;if(this._backtrack){Ts=!1;continue}else return!1}else if(!this.options.flex)break}return Ts?(Qi=this.test_match(Ts,Yc[xi]),Qi!==!1?Qi:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var Ts=this.next();return Ts||this.lex()},begin:function(Ts){this.conditionStack.push(Ts)},popState:function(){var Ts=this.conditionStack.length-1;return Ts>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(Ts){return Ts=this.conditionStack.length-1-Math.abs(Ts||0),Ts>=0?this.conditionStack[Ts]:"INITIAL"},pushState:function(Ts){this.begin(Ts)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(Ts,ka,xi,Yc){switch(xi){case 0:return this.begin("acc_title"),34;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),36;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:this.begin("callbackname");break;case 8:this.popState();break;case 9:this.popState(),this.begin("callbackargs");break;case 10:return 92;case 11:this.popState();break;case 12:return 93;case 13:return"MD_STR";case 14:this.popState();break;case 15:this.begin("md_string");break;case 16:return"STR";case 17:this.popState();break;case 18:this.pushState("string");break;case 19:return 81;case 20:return 99;case 21:return 82;case 22:return 101;case 23:return 83;case 24:return 84;case 25:return 94;case 26:this.begin("click");break;case 27:this.popState();break;case 28:return 85;case 29:return Ts.lex.firstGraph()&&this.begin("dir"),12;case 30:return Ts.lex.firstGraph()&&this.begin("dir"),12;case 31:return Ts.lex.firstGraph()&&this.begin("dir"),12;case 32:return 27;case 33:return 32;case 34:return 95;case 35:return 95;case 36:return 95;case 37:return 95;case 38:return this.popState(),13;case 39:return this.popState(),14;case 40:return this.popState(),14;case 41:return this.popState(),14;case 42:return this.popState(),14;case 43:return this.popState(),14;case 44:return this.popState(),14;case 45:return this.popState(),14;case 46:return this.popState(),14;case 47:return this.popState(),14;case 48:return this.popState(),14;case 49:return 118;case 50:return 119;case 51:return 120;case 52:return 121;case 53:return 102;case 54:return 108;case 55:return 44;case 56:return 58;case 57:return 42;case 58:return 8;case 59:return 103;case 60:return 112;case 61:return this.popState(),75;case 62:return this.pushState("edgeText"),73;case 63:return 116;case 64:return this.popState(),75;case 65:return this.pushState("thickEdgeText"),73;case 66:return 116;case 67:return this.popState(),75;case 68:return this.pushState("dottedEdgeText"),73;case 69:return 116;case 70:return 75;case 71:return this.popState(),51;case 72:return"TEXT";case 73:return this.pushState("ellipseText"),50;case 74:return this.popState(),53;case 75:return this.pushState("text"),52;case 76:return this.popState(),55;case 77:return this.pushState("text"),54;case 78:return 56;case 79:return this.pushState("text"),65;case 80:return this.popState(),62;case 81:return this.pushState("text"),61;case 82:return this.popState(),47;case 83:return this.pushState("text"),46;case 84:return this.popState(),67;case 85:return this.popState(),69;case 86:return 114;case 87:return this.pushState("trapText"),66;case 88:return this.pushState("trapText"),68;case 89:return 115;case 90:return 65;case 91:return 87;case 92:return"SEP";case 93:return 86;case 94:return 112;case 95:return 108;case 96:return 42;case 97:return 106;case 98:return 111;case 99:return 113;case 100:return this.popState(),60;case 101:return this.pushState("text"),60;case 102:return this.popState(),49;case 103:return this.pushState("text"),48;case 104:return this.popState(),31;case 105:return this.pushState("text"),29;case 106:return this.popState(),64;case 107:return this.pushState("text"),63;case 108:return"TEXT";case 109:return"QUOTE";case 110:return 9;case 111:return 10;case 112:return 11}},rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{callbackargs:{rules:[11,12,15,18,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},callbackname:{rules:[8,9,10,15,18,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},href:{rules:[15,18,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},click:{rules:[15,18,27,28,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},dottedEdgeText:{rules:[15,18,67,69,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},thickEdgeText:{rules:[15,18,64,66,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},edgeText:{rules:[15,18,61,63,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},trapText:{rules:[15,18,70,73,75,77,81,83,84,85,86,87,88,101,103,105,107],inclusive:!1},ellipseText:{rules:[15,18,70,71,72,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},text:{rules:[15,18,70,73,74,75,76,77,80,81,82,83,87,88,100,101,102,103,104,105,106,107,108],inclusive:!1},vertex:{rules:[15,18,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},dir:{rules:[15,18,38,39,40,41,42,43,44,45,46,47,48,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},acc_descr_multiline:{rules:[5,6,15,18,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},acc_descr:{rules:[3,15,18,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},acc_title:{rules:[1,15,18,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},md_string:{rules:[13,14,15,18,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},string:{rules:[15,16,17,18,70,73,75,77,81,83,87,88,101,103,105,107],inclusive:!1},INITIAL:{rules:[0,2,4,7,15,18,19,20,21,22,23,24,25,26,29,30,31,32,33,34,35,36,37,49,50,51,52,53,54,55,56,57,58,59,60,61,62,64,65,67,68,70,73,75,77,78,79,81,83,87,88,89,90,91,92,93,94,95,96,97,98,99,101,103,105,107,109,110,111,112],inclusive:!0}}};return af}();rf.lexer=Oc;function sf(){this.yy={}}return sf.prototype=rf,rf.Parser=sf,new sf}();qdt.parser=qdt;const Hdt=qdt,rIe="flowchart-";let APt=0,Vdt=Oe(),wl={},gk=[],eL={},M5=[],rY={},iY={},sY=0,Gdt=!0,iw,aY,oY=[];const cY=i=>Kr.sanitizeText(i,Vdt),fF=function(i){const a=Object.keys(wl);for(const f of a)if(wl[f].id===i)return wl[f].domId;return i},LPt=function(i,a,f,p,w,m,b={}){let E,_=i;_!==void 0&&_.trim().length!==0&&(wl[_]===void 0&&(wl[_]={id:_,labelType:"text",domId:rIe+_+"-"+APt,styles:[],classes:[]}),APt++,a!==void 0?(Vdt=Oe(),E=cY(a.text.trim()),wl[_].labelType=a.type,E[0]==='"'&&E[E.length-1]==='"'&&(E=E.substring(1,E.length-1)),wl[_].text=E):wl[_].text===void 0&&(wl[_].text=i),f!==void 0&&(wl[_].type=f),p!=null&&p.forEach(function(A){wl[_].styles.push(A)}),w!=null&&w.forEach(function(A){wl[_].classes.push(A)}),m!==void 0&&(wl[_].dir=m),wl[_].props===void 0?wl[_].props=b:b!==void 0&&Object.assign(wl[_].props,b))},MPt=function(i,a,f){const m={start:i,end:a,type:void 0,text:"",labelType:"text"};Ut.info("abc78 Got edge...",m);const b=f.text;if(b!==void 0&&(m.text=cY(b.text.trim()),m.text[0]==='"'&&m.text[m.text.length-1]==='"'&&(m.text=m.text.substring(1,m.text.length-1)),m.labelType=b.type),f!==void 0&&(m.type=f.type,m.stroke=f.stroke,m.length=f.length),(m==null?void 0:m.length)>10&&(m.length=10),gk.length<280)Ut.info("abc78 pushing edge..."),gk.push(m);else throw new Error("Too many edges")},DPt=function(i,a,f){Ut.info("addLink (abc78)",i,a,f);let p,w;for(p=0;p/)&&(iw="LR"),iw.match(/.*v/)&&(iw="TB"),iw==="TD"&&(iw="TB")},uY=function(i,a){i.split(",").forEach(function(f){let p=f;wl[p]!==void 0&&wl[p].classes.push(a),rY[p]!==void 0&&rY[p].classes.push(a)})},iIe=function(i,a){i.split(",").forEach(function(f){a!==void 0&&(iY[aY==="gen-1"?fF(f):f]=cY(a))})},sIe=function(i,a,f){let p=fF(i);if(Oe().securityLevel!=="loose"||a===void 0)return;let w=[];if(typeof f=="string"){w=f.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let m=0;m")),w.classed("hover",!0)}).on("mouseout",function(){a.transition().duration(500).style("opacity",0),yr(this).classed("hover",!1)})};oY.push(VPt);const GPt=function(i="gen-1"){wl={},eL={},gk=[],oY=[VPt],M5=[],rY={},sY=0,iY={},Gdt=!0,aY=i,hg()},UPt=i=>{aY=i||"gen-2"},WPt=function(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"},YPt=function(i,a,f){let p=i.text.trim(),w=f.text;i===f&&f.text.match(/\s/)&&(p=void 0);function m(I){const B={boolean:{},number:{},string:{}},N=[];let R;return{nodeList:I.filter(function(W){const et=typeof W;return W.stmt&&W.stmt==="dir"?(R=W.value,!1):W.trim()===""?!1:et in B?B[et].hasOwnProperty(W)?!1:B[et][W]=!0:N.includes(W)?!1:N.push(W)}),dir:R}}let b=[];const{nodeList:E,dir:_}=m(b.concat.apply(b,a));if(b=E,aY==="gen-1")for(let I=0;I2e3)return;if(KPt[dF]=a,M5[a].id===i)return{result:!0,count:0};let p=0,w=1;for(;p=0){const b=XPt(i,m);if(b.result)return{result:!0,count:w+b.count};w=w+b.count}p=p+1}return{result:!1,count:w}},QPt=function(i){return KPt[i]},ZPt=function(){dF=-1,M5.length>0&&XPt("none",M5.length-1)},JPt=function(){return M5},tFt=()=>Gdt?(Gdt=!1,!0):!1,oIe=i=>{let a=i.trim(),f="arrow_open";switch(a[0]){case"<":f="arrow_point",a=a.slice(1);break;case"x":f="arrow_cross",a=a.slice(1);break;case"o":f="arrow_circle",a=a.slice(1);break}let p="normal";return a.includes("=")&&(p="thick"),a.includes(".")&&(p="dotted"),{type:f,stroke:p}},cIe=(i,a)=>{const f=a.length;let p=0;for(let w=0;w{const a=i.trim();let f=a.slice(0,-1),p="arrow_open";switch(a.slice(-1)){case"x":p="arrow_cross",a[0]==="x"&&(p="double_"+p,f=f.slice(1));break;case">":p="arrow_point",a[0]==="<"&&(p="double_"+p,f=f.slice(1));break;case"o":p="arrow_circle",a[0]==="o"&&(p="double_"+p,f=f.slice(1));break}let w="normal",m=f.length-1;f[0]==="="&&(w="thick"),f[0]==="~"&&(w="invisible");let b=cIe(".",f);return b&&(w="dotted",m=b),{type:p,stroke:w,length:m}},eFt=(i,a)=>{const f=uIe(i);let p;if(a){if(p=oIe(a),p.stroke!==f.stroke)return{type:"INVALID",stroke:"INVALID"};if(p.type==="arrow_open")p.type=f.type;else{if(p.type!==f.type)return{type:"INVALID",stroke:"INVALID"};p.type="double_"+p.type}return p.type==="double_arrow"&&(p.type="double_arrow_point"),p.length=f.length,p}return f},nFt=(i,a)=>{let f=!1;return i.forEach(p=>{p.nodes.indexOf(a)>=0&&(f=!0)}),f},rFt=(i,a)=>{const f=[];return i.nodes.forEach((p,w)=>{nFt(a,p)||f.push(i.nodes[w])}),{nodes:f}},iFt={firstGraph:tFt},wT={defaultConfig:()=>SOt.flowchart,setAccTitle:E0,getAccTitle:fg,getAccDescription:gg,setAccDescription:dg,addVertex:LPt,lookUpDomId:fF,addLink:DPt,updateLinkInterpolate:IPt,updateLink:OPt,addClass:PPt,setDirection:FPt,setClass:uY,setTooltip:iIe,getTooltip:BPt,setClickEvent:RPt,setLink:NPt,bindFunctions:jPt,getDirection:$Pt,getVertices:zPt,getEdges:qPt,getClasses:HPt,clear:GPt,setGen:UPt,defaultStyle:WPt,addSubGraph:YPt,getDepthFirstPos:QPt,indexNodes:ZPt,getSubGraphs:JPt,destructLink:eFt,lex:iFt,exists:nFt,makeUniq:rFt,setDiagramTitle:Nb,getDiagramTitle:pg},lIe=Object.freeze(Object.defineProperty({__proto__:null,addClass:PPt,addLink:DPt,addSingleLink:MPt,addSubGraph:YPt,addVertex:LPt,bindFunctions:jPt,clear:GPt,default:wT,defaultStyle:WPt,destructLink:eFt,firstGraph:tFt,getClasses:HPt,getDepthFirstPos:QPt,getDirection:$Pt,getEdges:qPt,getSubGraphs:JPt,getTooltip:BPt,getVertices:zPt,indexNodes:ZPt,lex:iFt,lookUpDomId:fF,setClass:uY,setClickEvent:RPt,setDirection:FPt,setGen:UPt,setLink:NPt,updateLink:OPt,updateLinkInterpolate:IPt},Symbol.toStringTag,{value:"Module"}));var hIe="[object Symbol]";function vT(i){return typeof i=="symbol"||f3(i)&&sT(i)==hIe}function nL(i,a){for(var f=-1,p=i==null?0:i.length,w=Array(p);++f-1}function Rb(i){return ck(i)?PIt(i):NOt(i)}var LIe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,MIe=/^\w*$/;function Udt(i,a){if(If(i))return!1;var f=typeof i;return f=="number"||f=="symbol"||f=="boolean"||i==null||vT(i)?!0:MIe.test(i)||!LIe.test(i)||a!=null&&i in Object(a)}var DIe=500;function IIe(i){var a=jA(i,function(p){return f.size===DIe&&f.clear(),p}),f=a.cache;return a}var OIe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,PIe=/\\(\\)?/g,FIe=IIe(function(i){var a=[];return i.charCodeAt(0)===46&&a.push(""),i.replace(OIe,function(f,p,w,m){a.push(w?m.replace(PIe,"$1"):p||f)}),a});const NIe=FIe;function fFt(i){return i==null?"":oFt(i)}function hY(i,a){return If(i)?i:Udt(i,a)?[i]:NIe(fFt(i))}var BIe=1/0;function gF(i){if(typeof i=="string"||vT(i))return i;var a=i+"";return a=="0"&&1/i==-BIe?"-0":a}function fY(i,a){a=hY(a,i);for(var f=0,p=a.length;i!=null&&f0&&f(E)?a>1?dY(E,a-1,f,p,w):Wdt(w,E):p||(w[w.length]=E)}return w}function rL(i){var a=i==null?0:i.length;return a?dY(i,1):[]}function $Ie(i){return RIt(BIt(i,void 0,rL),i+"")}function zIe(i,a,f,p){var w=-1,m=i==null?0:i.length;for(p&&m&&(f=i[++w]);++wE))return!1;var A=m.get(i),I=m.get(a);if(A&&I)return A==a&&I==i;var B=-1,N=!0,R=f&pPe?new bF:void 0;for(m.set(i,a),m.set(a,i);++B2?a[2]:void 0;for(w&&nF(a[0],a[1],w)&&(p=1);++f-1?w[m?a[b]:b]:void 0}}var iFe=Math.max;function sFe(i,a,f){var p=i==null?0:i.length;if(!p)return-1;var w=f==null?0:EIe(f);return w<0&&(w=iFe(p+w,0)),hFt(i,pk(a),w)}var aFe=rFe(sFe);const e0t=aFe;function RFt(i,a){var f=-1,p=ck(i)?Array(i.length):[];return pY(i,function(w,m,b){p[++f]=a(w,m,b)}),p}function Ff(i,a){var f=If(i)?nL:RFt;return f(i,pk(a))}function oFe(i,a){return i==null?i:tdt(i,t0t(a),uT)}function cFe(i,a){return i&&Jdt(i,t0t(a))}function uFe(i,a){return i>a}var lFe=Object.prototype,hFe=lFe.hasOwnProperty;function fFe(i,a){return i!=null&&hFe.call(i,a)}function za(i,a){return i!=null&&PFt(i,a,fFe)}function dFe(i,a){return nL(a,function(f){return i[f]})}function I5(i){return i==null?[]:dFe(i,Rb(i))}function Jh(i){return i===void 0}function jFt(i,a){return ia||m&&b&&_&&!E&&!A||p&&b&&_||!f&&_||!w)return 1;if(!p&&!m&&!A&&i=E)return _;var A=f[p];return _*(A=="desc"?-1:1)}}return i.index-a.index}function mFe(i,a,f){a.length?a=nL(a,function(m){return If(m)?function(b){return fY(b,m.length===1?m[0]:m)}:m}):a=[lT];var p=-1;a=nL(a,SW(pk));var w=RFt(i,function(m,b,E){var _=nL(a,function(A){return A(m)});return{criteria:_,index:++p,value:m}});return bFe(w,function(m,b){return vFe(m,b,f)})}function yFe(i,a){return pFe(i,a,function(f,p){return FFt(i,p)})}var xFe=$Ie(function(i,a){return i==null?{}:yFe(i,a)});const vF=xFe;var kFe=Math.ceil,EFe=Math.max;function TFe(i,a,f,p){for(var w=-1,m=EFe(kFe((a-i)/(f||1)),0),b=Array(m);m--;)b[p?m:++w]=i,i+=f;return b}function CFe(i){return function(a,f,p){return p&&typeof p!="number"&&nF(a,f,p)&&(f=p=void 0),a=lY(a),f===void 0?(f=a,a=0):f=lY(f),p=p===void 0?a1&&nF(i,a[0],a[1])?a=[]:f>2&&nF(a[0],a[1],a[2])&&(a=[a[0]]),mFe(i,dY(a,1),[])});const yF=AFe;var LFe=1/0,MFe=KA&&1/Xdt(new KA([,-0]))[1]==LFe?function(i){return new KA(i)}:TIe;const DFe=MFe;var IFe=200;function OFe(i,a,f){var p=-1,w=AIe,m=i.length,b=!0,E=[],_=E;if(f)b=!1,w=eFe;else if(m>=IFe){var A=a?null:DFe(i);if(A)return Xdt(A);b=!1,w=_Ft,_=new bF}else _=a?[]:E;t:for(;++p1?w.setNode(m,f):w.setNode(m)}),this}setNode(a,f){return za(this._nodes,a)?(arguments.length>1&&(this._nodes[a]=f),this):(this._nodes[a]=arguments.length>1?f:this._defaultNodeLabelFn(a),this._isCompound&&(this._parent[a]=xT,this._children[a]={},this._children[xT][a]=!0),this._in[a]={},this._preds[a]={},this._out[a]={},this._sucs[a]={},++this._nodeCount,this)}node(a){return this._nodes[a]}hasNode(a){return za(this._nodes,a)}removeNode(a){var f=this;if(za(this._nodes,a)){var p=function(w){f.removeEdge(f._edgeObjs[w])};delete this._nodes[a],this._isCompound&&(this._removeFromParentsChildList(a),delete this._parent[a],cr(this.children(a),function(w){f.setParent(w)}),delete this._children[a]),cr(Rb(this._in[a]),p),delete this._in[a],delete this._preds[a],cr(Rb(this._out[a]),p),delete this._out[a],delete this._sucs[a],--this._nodeCount}return this}setParent(a,f){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(Jh(f))f=xT;else{f+="";for(var p=f;!Jh(p);p=this.parent(p))if(p===a)throw new Error("Setting "+f+" as parent of "+a+" would create a cycle");this.setNode(f)}return this.setNode(a),this._removeFromParentsChildList(a),this._parent[a]=f,this._children[f][a]=!0,this}_removeFromParentsChildList(a){delete this._children[this._parent[a]][a]}parent(a){if(this._isCompound){var f=this._parent[a];if(f!==xT)return f}}children(a){if(Jh(a)&&(a=xT),this._isCompound){var f=this._children[a];if(f)return Rb(f)}else{if(a===xT)return this.nodes();if(this.hasNode(a))return[]}}predecessors(a){var f=this._preds[a];if(f)return Rb(f)}successors(a){var f=this._sucs[a];if(f)return Rb(f)}neighbors(a){var f=this.predecessors(a);if(f)return FFe(f,this.successors(a))}isLeaf(a){var f;return this.isDirected()?f=this.successors(a):f=this.neighbors(a),f.length===0}filterNodes(a){var f=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});f.setGraph(this.graph());var p=this;cr(this._nodes,function(b,E){a(E)&&f.setNode(E,b)}),cr(this._edgeObjs,function(b){f.hasNode(b.v)&&f.hasNode(b.w)&&f.setEdge(b,p.edge(b))});var w={};function m(b){var E=p.parent(b);return E===void 0||f.hasNode(E)?(w[b]=E,E):E in w?w[E]:m(E)}return this._isCompound&&cr(f.nodes(),function(b){f.setParent(b,m(b))}),f}setDefaultEdgeLabel(a){return BA(a)||(a=HA(a)),this._defaultEdgeLabelFn=a,this}edgeCount(){return this._edgeCount}edges(){return I5(this._edgeObjs)}setPath(a,f){var p=this,w=arguments;return mF(a,function(m,b){return w.length>1?p.setEdge(m,b,f):p.setEdge(m,b),b}),this}setEdge(){var a,f,p,w,m=!1,b=arguments[0];typeof b=="object"&&b!==null&&"v"in b?(a=b.v,f=b.w,p=b.name,arguments.length===2&&(w=arguments[1],m=!0)):(a=b,f=arguments[1],p=arguments[3],arguments.length>2&&(w=arguments[2],m=!0)),a=""+a,f=""+f,Jh(p)||(p=""+p);var E=xF(this._isDirected,a,f,p);if(za(this._edgeLabels,E))return m&&(this._edgeLabels[E]=w),this;if(!Jh(p)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(a),this.setNode(f),this._edgeLabels[E]=m?w:this._defaultEdgeLabelFn(a,f,p);var _=$Fe(this._isDirected,a,f,p);return a=_.v,f=_.w,Object.freeze(_),this._edgeObjs[E]=_,zFt(this._preds[f],a),zFt(this._sucs[a],f),this._in[f][E]=_,this._out[a][E]=_,this._edgeCount++,this}edge(a,f,p){var w=arguments.length===1?i0t(this._isDirected,arguments[0]):xF(this._isDirected,a,f,p);return this._edgeLabels[w]}hasEdge(a,f,p){var w=arguments.length===1?i0t(this._isDirected,arguments[0]):xF(this._isDirected,a,f,p);return za(this._edgeLabels,w)}removeEdge(a,f,p){var w=arguments.length===1?i0t(this._isDirected,arguments[0]):xF(this._isDirected,a,f,p),m=this._edgeObjs[w];return m&&(a=m.v,f=m.w,delete this._edgeLabels[w],delete this._edgeObjs[w],qFt(this._preds[f],a),qFt(this._sucs[a],f),delete this._in[f][w],delete this._out[a][w],this._edgeCount--),this}inEdges(a,f){var p=this._in[a];if(p){var w=I5(p);return f?D5(w,function(m){return m.v===f}):w}}outEdges(a,f){var p=this._out[a];if(p){var w=I5(p);return f?D5(w,function(m){return m.w===f}):w}}nodeEdges(a,f){var p=this.inEdges(a,f);if(p)return p.concat(this.outEdges(a,f))}}c1.prototype._nodeCount=0,c1.prototype._edgeCount=0;function zFt(i,a){i[a]?i[a]++:i[a]=1}function qFt(i,a){--i[a]||delete i[a]}function xF(i,a,f,p){var w=""+a,m=""+f;if(!i&&w>m){var b=w;w=m,m=b}return w+$Ft+m+$Ft+(Jh(p)?jFe:p)}function $Fe(i,a,f,p){var w=""+a,m=""+f;if(!i&&w>m){var b=w;w=m,m=b}var E={v:w,w:m};return p&&(E.name=p),E}function i0t(i,a){return xF(i,a.v,a.w,a.name)}class zFe{constructor(){var a={};a._next=a._prev=a,this._sentinel=a}dequeue(){var a=this._sentinel,f=a._prev;if(f!==a)return HFt(f),f}enqueue(a){var f=this._sentinel;a._prev&&a._next&&HFt(a),a._next=f._next,f._next._prev=a,f._next=a,a._prev=f}toString(){for(var a=[],f=this._sentinel,p=f._prev;p!==f;)a.push(JSON.stringify(p,qFe)),p=p._prev;return"["+a.join(", ")+"]"}}function HFt(i){i._prev._next=i._next,i._next._prev=i._prev,delete i._next,delete i._prev}function qFe(i,a){if(i!=="_next"&&i!=="_prev")return a}var HFe=HA(1);function VFe(i,a){if(i.nodeCount()<=1)return[];var f=UFe(i,a||HFe),p=GFe(f.graph,f.buckets,f.zeroIdx);return rL(Ff(p,function(w){return i.outEdges(w.v,w.w)}))}function GFe(i,a,f){for(var p=[],w=a[a.length-1],m=a[0],b;i.nodeCount();){for(;b=m.dequeue();)s0t(i,a,f,b);for(;b=w.dequeue();)s0t(i,a,f,b);if(i.nodeCount()){for(var E=a.length-2;E>0;--E)if(b=a[E].dequeue(),b){p=p.concat(s0t(i,a,f,b,!0));break}}}return p}function s0t(i,a,f,p,w){var m=w?[]:void 0;return cr(i.inEdges(p.v),function(b){var E=i.edge(b),_=i.node(b.v);w&&m.push({v:b.v,w:b.w}),_.out-=E,a0t(a,f,_)}),cr(i.outEdges(p.v),function(b){var E=i.edge(b),_=b.w,A=i.node(_);A.in-=E,a0t(a,f,A)}),i.removeNode(p.v),m}function UFe(i,a){var f=new c1,p=0,w=0;cr(i.nodes(),function(E){f.setNode(E,{v:E,in:0,out:0})}),cr(i.edges(),function(E){var _=f.edge(E.v,E.w)||0,A=a(E),I=_+A;f.setEdge(E.v,E.w,I),w=Math.max(w,f.node(E.v).out+=A),p=Math.max(p,f.node(E.w).in+=A)});var m=yT(w+p+3).map(function(){return new zFe}),b=p+1;return cr(f.nodes(),function(E){a0t(m,b,f.node(E))}),{graph:f,buckets:m,zeroIdx:b}}function a0t(i,a,f){f.out?f.in?i[f.out-f.in+a].enqueue(f):i[i.length-1].enqueue(f):i[0].enqueue(f)}function WFe(i){var a=i.graph().acyclicer==="greedy"?VFe(i,f(i)):YFe(i);cr(a,function(p){var w=i.edge(p);i.removeEdge(p),w.forwardName=p.name,w.reversed=!0,i.setEdge(p.w,p.v,w,vY("rev"))});function f(p){return function(w){return p.edge(w).weight}}}function YFe(i){var a=[],f={},p={};function w(m){za(p,m)||(p[m]=!0,f[m]=!0,cr(i.outEdges(m),function(b){za(f,b.w)?a.push(b):w(b.w)}),delete f[m])}return cr(i.nodes(),w),a}function KFe(i){cr(i.edges(),function(a){var f=i.edge(a);if(f.reversed){i.removeEdge(a);var p=f.forwardName;delete f.reversed,delete f.forwardName,i.setEdge(a.w,a.v,f,p)}})}function sL(i,a,f,p){var w;do w=vY(p);while(i.hasNode(w));return f.dummy=a,i.setNode(w,f),w}function XFe(i){var a=new c1().setGraph(i.graph());return cr(i.nodes(),function(f){a.setNode(f,i.node(f))}),cr(i.edges(),function(f){var p=a.edge(f.v,f.w)||{weight:0,minlen:1},w=i.edge(f);a.setEdge(f.v,f.w,{weight:p.weight+w.weight,minlen:Math.max(p.minlen,w.minlen)})}),a}function VFt(i){var a=new c1({multigraph:i.isMultigraph()}).setGraph(i.graph());return cr(i.nodes(),function(f){i.children(f).length||a.setNode(f,i.node(f))}),cr(i.edges(),function(f){a.setEdge(f,i.edge(f))}),a}function GFt(i,a){var f=i.x,p=i.y,w=a.x-f,m=a.y-p,b=i.width/2,E=i.height/2;if(!w&&!m)throw new Error("Not possible to find intersection inside of the rectangle");var _,A;return Math.abs(m)*b>Math.abs(w)*E?(m<0&&(E=-E),_=E*w/m,A=E):(w<0&&(b=-b),_=b,A=b*m/w),{x:f+_,y:p+A}}function mY(i){var a=Ff(yT(WFt(i)+1),function(){return[]});return cr(i.nodes(),function(f){var p=i.node(f),w=p.rank;Jh(w)||(a[w][p.order]=f)}),a}function QFe(i){var a=wF(Ff(i.nodes(),function(f){return i.node(f).rank}));cr(i.nodes(),function(f){var p=i.node(f);za(p,"rank")&&(p.rank-=a)})}function ZFe(i){var a=wF(Ff(i.nodes(),function(m){return i.node(m).rank})),f=[];cr(i.nodes(),function(m){var b=i.node(m).rank-a;f[b]||(f[b]=[]),f[b].push(m)});var p=0,w=i.graph().nodeRankFactor;cr(f,function(m,b){Jh(m)&&b%w!==0?--p:p&&cr(m,function(E){i.node(E).rank+=p})})}function UFt(i,a,f,p){var w={width:0,height:0};return arguments.length>=4&&(w.rank=f,w.order=p),sL(i,"border",w,a)}function WFt(i){return mT(Ff(i.nodes(),function(a){var f=i.node(a).rank;if(!Jh(f))return f}))}function JFe(i,a){var f={lhs:[],rhs:[]};return cr(i,function(p){a(p)?f.lhs.push(p):f.rhs.push(p)}),f}function tNe(i,a){var f=NFt();try{return a()}finally{console.log(i+" time: "+(NFt()-f)+"ms")}}function eNe(i,a){return a()}function nNe(i){function a(f){var p=i.children(f),w=i.node(f);if(p.length&&cr(p,a),za(w,"minRank")){w.borderLeft=[],w.borderRight=[];for(var m=w.minRank,b=w.maxRank+1;mb.lim&&(E=b,_=!0);var A=D5(a.edges(),function(I){return _===sNt(i,i.node(I.v),E)&&_!==sNt(i,i.node(I.w),E)});return r0t(A,function(I){return kF(a,I)})}function iNt(i,a,f,p){var w=f.v,m=f.w;i.removeEdge(w,m),i.setEdge(p.v,p.w,{}),h0t(i),l0t(i,a),wNe(i,a)}function wNe(i,a){var f=e0t(i.nodes(),function(w){return!a.node(w).parent}),p=pNe(i,f);p=p.slice(1),cr(p,function(w){var m=i.node(w).parent,b=a.edge(w,m),E=!1;b||(b=a.edge(m,w),E=!0),a.node(w).rank=a.node(m).rank+(E?b.minlen:-b.minlen)})}function vNe(i,a,f){return i.hasEdge(a,f)}function sNt(i,a,f){return f.low<=a.lim&&a.lim<=f.lim}function mNe(i){switch(i.graph().ranker){case"network-simplex":aNt(i);break;case"tight-tree":xNe(i);break;case"longest-path":yNe(i);break;default:aNt(i)}}var yNe=u0t;function xNe(i){u0t(i),QFt(i)}function aNt(i){kT(i)}function kNe(i){var a=sL(i,"root",{},"_root"),f=ENe(i),p=mT(I5(f))-1,w=2*p+1;i.graph().nestingRoot=a,cr(i.edges(),function(b){i.edge(b).minlen*=w});var m=TNe(i)+1;cr(i.children(),function(b){oNt(i,a,w,m,p,f,b)}),i.graph().nodeRankFactor=w}function oNt(i,a,f,p,w,m,b){var E=i.children(b);if(!E.length){b!==a&&i.setEdge(a,b,{weight:0,minlen:f});return}var _=UFt(i,"_bt"),A=UFt(i,"_bb"),I=i.node(b);i.setParent(_,b),I.borderTop=_,i.setParent(A,b),I.borderBottom=A,cr(E,function(B){oNt(i,a,f,p,w,m,B);var N=i.node(B),R=N.borderTop?N.borderTop:B,z=N.borderBottom?N.borderBottom:B,W=N.borderTop?p:2*p,et=R!==z?1:w-m[b]+1;i.setEdge(_,R,{weight:W,minlen:et,nestingEdge:!0}),i.setEdge(z,A,{weight:W,minlen:et,nestingEdge:!0})}),i.parent(b)||i.setEdge(a,_,{weight:0,minlen:w+m[b]})}function ENe(i){var a={};function f(p,w){var m=i.children(p);m&&m.length&&cr(m,function(b){f(b,w+1)}),a[p]=w}return cr(i.children(),function(p){f(p,1)}),a}function TNe(i){return mF(i.edges(),function(a,f){return a+i.edge(f).weight},0)}function CNe(i){var a=i.graph();i.removeNode(a.nestingRoot),delete a.nestingRoot,cr(i.edges(),function(f){var p=i.edge(f);p.nestingEdge&&i.removeEdge(f)})}function _Ne(i,a,f){var p={},w;cr(f,function(m){for(var b=i.parent(m),E,_;b;){if(E=i.parent(b),E?(_=p[E],p[E]=b):(_=w,w=b),_&&_!==b){a.setEdge(_,b);return}b=E}})}function SNe(i,a,f){var p=ANe(i),w=new c1({compound:!0}).setGraph({root:p}).setDefaultNodeLabel(function(m){return i.node(m)});return cr(i.nodes(),function(m){var b=i.node(m),E=i.parent(m);(b.rank===a||b.minRank<=a&&a<=b.maxRank)&&(w.setNode(m),w.setParent(m,E||p),cr(i[f](m),function(_){var A=_.v===m?_.w:_.v,I=w.edge(A,m),B=Jh(I)?0:I.weight;w.setEdge(A,m,{weight:i.edge(_).weight+B})}),za(b,"minRank")&&w.setNode(m,{borderLeft:b.borderLeft[a],borderRight:b.borderRight[a]}))}),w}function ANe(i){for(var a;i.hasNode(a=vY("_root")););return a}function LNe(i,a){for(var f=0,p=1;p0;)I%2&&(B+=E[I+1]),I=I-1>>1,E[I]+=A.weight;_+=A.weight*B})),_}function DNe(i){var a={},f=D5(i.nodes(),function(E){return!i.children(E).length}),p=mT(Ff(f,function(E){return i.node(E).rank})),w=Ff(yT(p+1),function(){return[]});function m(E){if(!za(a,E)){a[E]=!0;var _=i.node(E);w[_.rank].push(E),cr(i.successors(E),m)}}var b=yF(f,function(E){return i.node(E).rank});return cr(b,m),w}function INe(i,a){return Ff(a,function(f){var p=i.inEdges(f);if(p.length){var w=mF(p,function(m,b){var E=i.edge(b),_=i.node(b.v);return{sum:m.sum+E.weight*_.order,weight:m.weight+E.weight}},{sum:0,weight:0});return{v:f,barycenter:w.sum/w.weight,weight:w.weight}}else return{v:f}})}function ONe(i,a){var f={};cr(i,function(w,m){var b=f[w.v]={indegree:0,in:[],out:[],vs:[w.v],i:m};Jh(w.barycenter)||(b.barycenter=w.barycenter,b.weight=w.weight)}),cr(a.edges(),function(w){var m=f[w.v],b=f[w.w];!Jh(m)&&!Jh(b)&&(b.indegree++,m.out.push(f[w.w]))});var p=D5(f,function(w){return!w.indegree});return PNe(p)}function PNe(i){var a=[];function f(m){return function(b){b.merged||(Jh(b.barycenter)||Jh(m.barycenter)||b.barycenter>=m.barycenter)&&FNe(m,b)}}function p(m){return function(b){b.in.push(m),--b.indegree===0&&i.push(b)}}for(;i.length;){var w=i.pop();a.push(w),cr(w.in.reverse(),f(w)),cr(w.out,p(w))}return Ff(D5(a,function(m){return!m.merged}),function(m){return vF(m,["vs","i","barycenter","weight"])})}function FNe(i,a){var f=0,p=0;i.weight&&(f+=i.barycenter*i.weight,p+=i.weight),a.weight&&(f+=a.barycenter*a.weight,p+=a.weight),i.vs=a.vs.concat(i.vs),i.barycenter=f/p,i.weight=p,i.i=Math.min(a.i,i.i),a.merged=!0}function NNe(i,a){var f=JFe(i,function(I){return za(I,"barycenter")}),p=f.lhs,w=yF(f.rhs,function(I){return-I.i}),m=[],b=0,E=0,_=0;p.sort(BNe(!!a)),_=cNt(m,w,_),cr(p,function(I){_+=I.vs.length,m.push(I.vs),b+=I.barycenter*I.weight,E+=I.weight,_=cNt(m,w,_)});var A={vs:rL(m)};return E&&(A.barycenter=b/E,A.weight=E),A}function cNt(i,a,f){for(var p;a.length&&(p=bY(a)).i<=f;)a.pop(),i.push(p.vs),f++;return f}function BNe(i){return function(a,f){return a.barycenterf.barycenter?1:i?f.i-a.i:a.i-f.i}}function uNt(i,a,f,p){var w=i.children(a),m=i.node(a),b=m?m.borderLeft:void 0,E=m?m.borderRight:void 0,_={};b&&(w=D5(w,function(z){return z!==b&&z!==E}));var A=INe(i,w);cr(A,function(z){if(i.children(z.v).length){var W=uNt(i,z.v,f,p);_[z.v]=W,za(W,"barycenter")&&jNe(z,W)}});var I=ONe(A,f);RNe(I,_);var B=NNe(I,p);if(b&&(B.vs=rL([b,B.vs,E]),i.predecessors(b).length)){var N=i.node(i.predecessors(b)[0]),R=i.node(i.predecessors(E)[0]);za(B,"barycenter")||(B.barycenter=0,B.weight=0),B.barycenter=(B.barycenter*B.weight+N.order+R.order)/(B.weight+2),B.weight+=2}return B}function RNe(i,a){cr(i,function(f){f.vs=rL(f.vs.map(function(p){return a[p]?a[p].vs:p}))})}function jNe(i,a){Jh(i.barycenter)?(i.barycenter=a.barycenter,i.weight=a.weight):(i.barycenter=(i.barycenter*i.weight+a.barycenter*a.weight)/(i.weight+a.weight),i.weight+=a.weight)}function $Ne(i){var a=WFt(i),f=lNt(i,yT(1,a+1),"inEdges"),p=lNt(i,yT(a-1,-1,-1),"outEdges"),w=DNe(i);hNt(i,w);for(var m=Number.POSITIVE_INFINITY,b,E=0,_=0;_<4;++E,++_){zNe(E%2?f:p,E%4>=2),w=mY(i);var A=LNe(i,w);Ab||E>a[_].lim));for(A=_,_=p;(_=i.parent(_))!==A;)m.push(_);return{path:w.concat(m.reverse()),lca:A}}function VNe(i){var a={},f=0;function p(w){var m=f;cr(i.children(w),p),a[w]={low:m,lim:f++}}return cr(i.children(),p),a}function GNe(i,a){var f={};function p(w,m){var b=0,E=0,_=w.length,A=bY(m);return cr(m,function(I,B){var N=WNe(i,I),R=N?i.node(N).order:_;(N||I===A)&&(cr(m.slice(E,B+1),function(z){cr(i.predecessors(z),function(W){var et=i.node(W),st=et.order;(stA)&&fNt(f,N,I)})})}function w(m,b){var E=-1,_,A=0;return cr(b,function(I,B){if(i.node(I).dummy==="border"){var N=i.predecessors(I);N.length&&(_=i.node(N[0]).order,p(b,A,B,E,_),A=B,E=_)}p(b,A,b.length,_,m.length)}),b}return mF(a,w),f}function WNe(i,a){if(i.node(a).dummy)return e0t(i.predecessors(a),function(f){return i.node(f).dummy})}function fNt(i,a,f){if(a>f){var p=a;a=f,f=p}var w=i[a];w||(i[a]=w={}),w[f]=!0}function YNe(i,a,f){if(a>f){var p=a;a=f,f=p}return za(i[a],f)}function KNe(i,a,f,p){var w={},m={},b={};return cr(a,function(E){cr(E,function(_,A){w[_]=_,m[_]=_,b[_]=A})}),cr(a,function(E){var _=-1;cr(E,function(A){var I=p(A);if(I.length){I=yF(I,function(W){return b[W]});for(var B=(I.length-1)/2,N=Math.floor(B),R=Math.ceil(B);N<=R;++N){var z=I[N];m[A]===A&&_0}function v3(i,a,f){var p=i.x,w=i.y,m=[],b=Number.POSITIVE_INFINITY,E=Number.POSITIVE_INFINITY;a.forEach(function(z){b=Math.min(b,z.x),E=Math.min(E,z.y)});for(var _=p-i.width/2-b,A=w-i.height/2-E,I=0;I1&&m.sort(function(z,W){var et=z.x-f.x,st=z.y-f.y,at=Math.sqrt(et*et+st*st),bt=W.x-f.x,mt=W.y-f.y,yt=Math.sqrt(bt*bt+mt*mt);return atMath.abs(w)*E?(m<0&&(E=-E),_=m===0?0:E*w/m,A=E):(w<0&&(b=-b),_=b,A=w===0?0:b*m/w),{x:f+_,y:p+A}}var E0t={rect:ZBe,ellipse:JBe,circle:tRe,diamond:eRe};function QBe(i){E0t=i}function ZBe(i,a,f){var p=i.insert("rect",":first-child").attr("rx",f.rx).attr("ry",f.ry).attr("x",-a.width/2).attr("y",-a.height/2).attr("width",a.width).attr("height",a.height);return f.intersect=function(w){return k0t(f,w)},p}function JBe(i,a,f){var p=a.width/2,w=a.height/2,m=i.insert("ellipse",":first-child").attr("x",-a.width/2).attr("y",-a.height/2).attr("rx",p).attr("ry",w);return f.intersect=function(b){return vNt(f,p,w,b)},m}function tRe(i,a,f){var p=Math.max(a.width,a.height)/2,w=i.insert("circle",":first-child").attr("x",-a.width/2).attr("y",-a.height/2).attr("r",p);return f.intersect=function(m){return KBe(f,p,m)},w}function eRe(i,a,f){var p=a.width*Math.SQRT2/2,w=a.height*Math.SQRT2/2,m=[{x:0,y:-w},{x:-p,y:0},{x:0,y:w},{x:p,y:0}],b=i.insert("polygon",":first-child").attr("points",m.map(function(E){return E.x+","+E.y}).join(" "));return f.intersect=function(E){return v3(f,m,E)},b}function nRe(){var i=function(a,f){sRe(f);var p=EF(a,"output"),w=EF(p,"clusters"),m=EF(p,"edgePaths"),b=m0t(EF(p,"edgeLabels"),f),E=x0t(EF(p,"nodes"),f,E0t);aL(f),YBe(E,f),WBe(b,f),y0t(m,f,p0t);var _=v0t(w,f);UBe(_,f),aRe(f)};return i.createNodes=function(a){return arguments.length?(GBe(a),i):x0t},i.createClusters=function(a){return arguments.length?(BBe(a),i):v0t},i.createEdgeLabels=function(a){return arguments.length?(RBe(a),i):m0t},i.createEdgePaths=function(a){return arguments.length?(jBe(a),i):y0t},i.shapes=function(a){return arguments.length?(QBe(a),i):E0t},i.arrows=function(a){return arguments.length?(MBe(a),i):p0t},i}var rRe={paddingLeft:10,paddingRight:10,paddingTop:10,paddingBottom:10,rx:0,ry:0,shape:"rect"},iRe={arrowhead:"normal",curve:cg};function sRe(i){i.nodes().forEach(function(a){var f=i.node(a);!za(f,"label")&&!i.children(a).length&&(f.label=a),za(f,"paddingX")&&iL(f,{paddingLeft:f.paddingX,paddingRight:f.paddingX}),za(f,"paddingY")&&iL(f,{paddingTop:f.paddingY,paddingBottom:f.paddingY}),za(f,"padding")&&iL(f,{paddingLeft:f.padding,paddingRight:f.padding,paddingTop:f.padding,paddingBottom:f.padding}),iL(f,rRe),cr(["paddingLeft","paddingRight","paddingTop","paddingBottom"],function(p){f[p]=Number(f[p])}),za(f,"width")&&(f._prevWidth=f.width),za(f,"height")&&(f._prevHeight=f.height)}),i.edges().forEach(function(a){var f=i.edge(a);za(f,"label")||(f.label=""),iL(f,iRe)})}function aRe(i){cr(i.nodes(),function(a){var f=i.node(a);za(f,"_prevWidth")?f.width=f._prevWidth:delete f.width,za(f,"_prevHeight")?f.height=f._prevHeight:delete f.height,delete f._prevWidth,delete f._prevHeight})}function EF(i,a){var f=i.select("g."+a);return f.empty()&&(f=i.append("g").attr("class",a)),f}function yNt(i,a,f){const p=a.width,w=a.height,m=(p+w)*.9,b=[{x:m/2,y:0},{x:m,y:-m/2},{x:m/2,y:-m},{x:0,y:-m/2}],E=O5(i,m,m,b);return f.intersect=function(_){return v3(f,b,_)},E}function xNt(i,a,f){const w=a.height,m=w/4,b=a.width+2*m,E=[{x:m,y:0},{x:b-m,y:0},{x:b,y:-w/2},{x:b-m,y:-w},{x:m,y:-w},{x:0,y:-w/2}],_=O5(i,b,w,E);return f.intersect=function(A){return v3(f,E,A)},_}function kNt(i,a,f){const p=a.width,w=a.height,m=[{x:-w/2,y:0},{x:p,y:0},{x:p,y:-w},{x:-w/2,y:-w},{x:0,y:-w/2}],b=O5(i,p,w,m);return f.intersect=function(E){return v3(f,m,E)},b}function ENt(i,a,f){const p=a.width,w=a.height,m=[{x:-2*w/6,y:0},{x:p-w/6,y:0},{x:p+2*w/6,y:-w},{x:w/6,y:-w}],b=O5(i,p,w,m);return f.intersect=function(E){return v3(f,m,E)},b}function TNt(i,a,f){const p=a.width,w=a.height,m=[{x:2*w/6,y:0},{x:p+w/6,y:0},{x:p-2*w/6,y:-w},{x:-w/6,y:-w}],b=O5(i,p,w,m);return f.intersect=function(E){return v3(f,m,E)},b}function CNt(i,a,f){const p=a.width,w=a.height,m=[{x:-2*w/6,y:0},{x:p+2*w/6,y:0},{x:p-w/6,y:-w},{x:w/6,y:-w}],b=O5(i,p,w,m);return f.intersect=function(E){return v3(f,m,E)},b}function _Nt(i,a,f){const p=a.width,w=a.height,m=[{x:w/6,y:0},{x:p-w/6,y:0},{x:p+2*w/6,y:-w},{x:-2*w/6,y:-w}],b=O5(i,p,w,m);return f.intersect=function(E){return v3(f,m,E)},b}function SNt(i,a,f){const p=a.width,w=a.height,m=[{x:0,y:0},{x:p+w/2,y:0},{x:p,y:-w/2},{x:p+w/2,y:-w},{x:0,y:-w}],b=O5(i,p,w,m);return f.intersect=function(E){return v3(f,m,E)},b}function ANt(i,a,f){const p=a.height,w=a.width+p/4,m=i.insert("rect",":first-child").attr("rx",p/2).attr("ry",p/2).attr("x",-w/2).attr("y",-p/2).attr("width",w).attr("height",p);return f.intersect=function(b){return k0t(f,b)},m}function LNt(i,a,f){const p=a.width,w=a.height,m=[{x:0,y:0},{x:p,y:0},{x:p,y:-w},{x:0,y:-w},{x:0,y:0},{x:-8,y:0},{x:p+8,y:0},{x:p+8,y:-w},{x:-8,y:-w},{x:-8,y:0}],b=O5(i,p,w,m);return f.intersect=function(E){return v3(f,m,E)},b}function MNt(i,a,f){const p=a.width,w=p/2,m=w/(2.5+p/50),b=a.height+m,E="M 0,"+m+" a "+w+","+m+" 0,0,0 "+p+" 0 a "+w+","+m+" 0,0,0 "+-p+" 0 l 0,"+b+" a "+w+","+m+" 0,0,0 "+p+" 0 l 0,"+-b,_=i.attr("label-offset-y",m).insert("path",":first-child").attr("d",E).attr("transform","translate("+-p/2+","+-(b/2+m)+")");return f.intersect=function(A){const I=k0t(f,A),B=I.x-f.x;if(w!=0&&(Math.abs(B)f.height/2-m)){let N=m*m*(1-B*B/(w*w));N!=0&&(N=Math.sqrt(N)),N=m-N,A.y-f.y>0&&(N=-N),I.y+=N}return I},_}function oRe(i){i.shapes().question=yNt,i.shapes().hexagon=xNt,i.shapes().stadium=ANt,i.shapes().subroutine=LNt,i.shapes().cylinder=MNt,i.shapes().rect_left_inv_arrow=kNt,i.shapes().lean_right=ENt,i.shapes().lean_left=TNt,i.shapes().trapezoid=CNt,i.shapes().inv_trapezoid=_Nt,i.shapes().rect_right_inv_arrow=SNt}function cRe(i){i({question:yNt}),i({hexagon:xNt}),i({stadium:ANt}),i({subroutine:LNt}),i({cylinder:MNt}),i({rect_left_inv_arrow:kNt}),i({lean_right:ENt}),i({lean_left:TNt}),i({trapezoid:CNt}),i({inv_trapezoid:_Nt}),i({rect_right_inv_arrow:SNt})}function O5(i,a,f,p){return i.insert("polygon",":first-child").attr("points",p.map(function(w){return w.x+","+w.y}).join(" ")).attr("transform","translate("+-a/2+","+f/2+")")}const uRe={addToRender:oRe,addToRenderV2:cRe},DNt={},lRe=function(i){const a=Object.keys(i);for(const f of a)DNt[f]=i[f]},INt=function(i,a,f,p,w,m){const b=p?p.select(`[id="${f}"]`):yr(`[id="${f}"]`),E=w||document;Object.keys(i).forEach(function(A){const I=i[A];let B="default";I.classes.length>0&&(B=I.classes.join(" "));const N=im(I.styles);let R=I.text!==void 0?I.text:I.id,z;if(o1(Oe().flowchart.htmlLabels)){const st={label:R.replace(/fa[blrs]?:fa-[\w-]+/g,at=>``)};z=b0t(b,st).node(),z.parentNode.removeChild(z)}else{const st=E.createElementNS("http://www.w3.org/2000/svg","text");st.setAttribute("style",N.labelStyle.replace("color:","fill:"));const at=R.split(Kr.lineBreakRegex);for(const bt of at){const mt=E.createElementNS("http://www.w3.org/2000/svg","tspan");mt.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),mt.setAttribute("dy","1em"),mt.setAttribute("x","1"),mt.textContent=bt,st.appendChild(mt)}z=st}let W=0,et="";switch(I.type){case"round":W=5,et="rect";break;case"square":et="rect";break;case"diamond":et="question";break;case"hexagon":et="hexagon";break;case"odd":et="rect_left_inv_arrow";break;case"lean_right":et="lean_right";break;case"lean_left":et="lean_left";break;case"trapezoid":et="trapezoid";break;case"inv_trapezoid":et="inv_trapezoid";break;case"odd_right":et="rect_left_inv_arrow";break;case"circle":et="circle";break;case"ellipse":et="ellipse";break;case"stadium":et="stadium";break;case"subroutine":et="subroutine";break;case"cylinder":et="cylinder";break;case"group":et="rect";break;default:et="rect"}Ut.warn("Adding node",I.id,I.domId),a.setNode(m.db.lookUpDomId(I.id),{labelType:"svg",labelStyle:N.labelStyle,shape:et,label:z,rx:W,ry:W,class:B,style:N.style,id:m.db.lookUpDomId(I.id)})})},ONt=function(i,a,f){let p=0,w,m;if(i.defaultStyle!==void 0){const b=im(i.defaultStyle);w=b.style,m=b.labelStyle}i.forEach(function(b){p++;const E="L-"+b.start+"-"+b.end,_="LS-"+b.start,A="LE-"+b.end,I={};b.type==="arrow_open"?I.arrowhead="none":I.arrowhead="normal";let B="",N="";if(b.style!==void 0){const R=im(b.style);B=R.style,N=R.labelStyle}else switch(b.stroke){case"normal":B="fill:none",w!==void 0&&(B=w),m!==void 0&&(N=m);break;case"dotted":B="fill:none;stroke-width:2px;stroke-dasharray:3;";break;case"thick":B=" stroke-width: 3.5px;fill:none";break}I.style=B,I.labelStyle=N,b.interpolate!==void 0?I.curve=ew(b.interpolate,cg):i.defaultInterpolate!==void 0?I.curve=ew(i.defaultInterpolate,cg):I.curve=ew(DNt.curve,cg),b.text===void 0?b.style!==void 0&&(I.arrowheadStyle="fill: #333"):(I.arrowheadStyle="fill: #333",I.labelpos="c",o1(Oe().flowchart.htmlLabels)?(I.labelType="html",I.label=`${b.text.replace(/fa[blrs]?:fa-[\w-]+/g,R=>``)}`):(I.labelType="text",I.label=b.text.replace(Kr.lineBreakRegex,` +`),b.style===void 0&&(I.style=I.style||"stroke: #333; stroke-width: 1.5px;fill:none"),I.labelStyle=I.labelStyle.replace("color:","fill:"))),I.id=E,I.class=_+" "+A,I.minlen=b.length||1,a.setEdge(f.db.lookUpDomId(b.start),f.db.lookUpDomId(b.end),I,p)})},hRe={setConf:lRe,addVertices:INt,addEdges:ONt,getClasses:function(i,a){return Ut.info("Extracting classes"),a.db.getClasses()},draw:function(i,a,f,p){Ut.info("Drawing flowchart");const{securityLevel:w,flowchart:m}=Oe();let b;w==="sandbox"&&(b=yr("#i"+a));const E=yr(w==="sandbox"?b.nodes()[0].contentDocument.body:"body"),_=w==="sandbox"?b.nodes()[0].contentDocument:document;let A=p.db.getDirection();A===void 0&&(A="TD");const I=m.nodeSpacing||50,B=m.rankSpacing||50,N=new c1({multigraph:!0,compound:!0}).setGraph({rankdir:A,nodesep:I,ranksep:B,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});let R;const z=p.db.getSubGraphs();for(let ft=z.length-1;ft>=0;ft--)R=z[ft],p.db.addVertex(R.id,R.title,"group",void 0,R.classes);const W=p.db.getVertices();Ut.warn("Get vertices",W);const et=p.db.getEdges();let st=0;for(st=z.length-1;st>=0;st--){R=z[st],sMt("cluster").append("text");for(let ft=0;ft{a.forEach(w=>{pRe[w](i,f,p)})},pRe={extension:(i,a,f)=>{Ut.trace("Making markers for ",f),i.append("defs").append("marker").attr("id",f+"_"+a+"-extensionStart").attr("class","marker extension "+a).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),i.append("defs").append("marker").attr("id",f+"_"+a+"-extensionEnd").attr("class","marker extension "+a).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},composition:(i,a,f)=>{i.append("defs").append("marker").attr("id",f+"_"+a+"-compositionStart").attr("class","marker composition "+a).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id",f+"_"+a+"-compositionEnd").attr("class","marker composition "+a).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},aggregation:(i,a,f)=>{i.append("defs").append("marker").attr("id",f+"_"+a+"-aggregationStart").attr("class","marker aggregation "+a).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id",f+"_"+a+"-aggregationEnd").attr("class","marker aggregation "+a).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},dependency:(i,a,f)=>{i.append("defs").append("marker").attr("id",f+"_"+a+"-dependencyStart").attr("class","marker dependency "+a).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id",f+"_"+a+"-dependencyEnd").attr("class","marker dependency "+a).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},lollipop:(i,a,f)=>{i.append("defs").append("marker").attr("id",f+"_"+a+"-lollipopStart").attr("class","marker lollipop "+a).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),i.append("defs").append("marker").attr("id",f+"_"+a+"-lollipopEnd").attr("class","marker lollipop "+a).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},point:(i,a,f)=>{i.append("marker").attr("id",f+"_"+a+"-pointEnd").attr("class","marker "+a).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),i.append("marker").attr("id",f+"_"+a+"-pointStart").attr("class","marker "+a).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},circle:(i,a,f)=>{i.append("marker").attr("id",f+"_"+a+"-circleEnd").attr("class","marker "+a).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),i.append("marker").attr("id",f+"_"+a+"-circleStart").attr("class","marker "+a).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},cross:(i,a,f)=>{i.append("marker").attr("id",f+"_"+a+"-crossEnd").attr("class","marker cross "+a).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),i.append("marker").attr("id",f+"_"+a+"-crossStart").attr("class","marker cross "+a).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},barb:(i,a,f)=>{i.append("defs").append("marker").attr("id",f+"_"+a+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")}},PNt=gRe;function bRe(i,a){a&&i.attr("style",a)}function wRe(i){const a=yr(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),f=a.append("xhtml:div"),p=i.label,w=i.isNode?"nodeLabel":"edgeLabel";return f.html('"+p+""),bRe(f,i.labelStyle),f.style("display","inline-block"),f.style("white-space","nowrap"),f.attr("xmlns","http://www.w3.org/1999/xhtml"),a.node()}const gp=(i,a,f,p)=>{let w=i||"";if(typeof w=="object"&&(w=w[0]),o1(Oe().flowchart.htmlLabels)){w=w.replace(/\\n|\n/g,"
"),Ut.info("vertexText"+w);const m={isNode:p,label:uF(w).replace(/fa[blrs]?:fa-[\w-]+/g,E=>``),labelStyle:a.replace("fill:","color:")};return wRe(m)}else{const m=document.createElementNS("http://www.w3.org/2000/svg","text");m.setAttribute("style",a.replace("color:","fill:"));let b=[];typeof w=="string"?b=w.split(/\\n|\n|/gi):Array.isArray(w)?b=w:b=[];for(const E of b){const _=document.createElementNS("http://www.w3.org/2000/svg","tspan");_.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),_.setAttribute("dy","1em"),_.setAttribute("x","0"),f?_.setAttribute("class","title-row"):_.setAttribute("class","row"),_.textContent=E.trim(),m.appendChild(_)}return m}},vRe={};function mRe(i,a){const f=a||vRe,p=typeof f.includeImageAlt=="boolean"?f.includeImageAlt:!0,w=typeof f.includeHtml=="boolean"?f.includeHtml:!0;return FNt(i,p,w)}function FNt(i,a,f){if(yRe(i)){if("value"in i)return i.type==="html"&&!f?"":i.value;if(a&&"alt"in i&&i.alt)return i.alt;if("children"in i)return NNt(i.children,a,f)}return Array.isArray(i)?NNt(i,a,f):""}function NNt(i,a,f){const p=[];let w=-1;for(;++ww?0:w+a:a=a>w?w:a,f=f>0?f:0,p.length<1e4)b=Array.from(p),b.unshift(a,f),i.splice(...b);else for(f&&i.splice(a,f);m0?(m3(i,i.length,0,a),i):a}const BNt={}.hasOwnProperty;function xRe(i){const a={};let f=-1;for(;++fb))return;const ut=a.events.length;let vt=ut,X,pt;for(;vt--;)if(a.events[vt][0]==="exit"&&a.events[vt][1].type==="chunkFlow"){if(X){pt=a.events[vt][1].end;break}X=!0}for(st(p),ft=ut;ftbt;){const yt=f[mt];a.containerState=yt[1],yt[0].exit.call(a,i)}f.length=bt}function at(){w.write([null]),m=void 0,w=void 0,a.containerState._closeFlow=void 0}}function PRe(i,a,f){return il(i,i.attempt(this.parser.constructs.document,a,f),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function jNt(i){if(i===null||pp(i)||LRe(i))return 1;if(ARe(i))return 2}function _0t(i,a,f){const p=[];let w=-1;for(;++w1&&i[f][1].end.offset-i[f][1].start.offset>1?2:1;const B=Object.assign({},i[p][1].end),N=Object.assign({},i[f][1].start);$Nt(B,-_),$Nt(N,_),b={type:_>1?"strongSequence":"emphasisSequence",start:B,end:Object.assign({},i[p][1].end)},E={type:_>1?"strongSequence":"emphasisSequence",start:Object.assign({},i[f][1].start),end:N},m={type:_>1?"strongText":"emphasisText",start:Object.assign({},i[p][1].end),end:Object.assign({},i[f][1].start)},w={type:_>1?"strong":"emphasis",start:Object.assign({},b.start),end:Object.assign({},E.end)},i[p][1].end=Object.assign({},b.start),i[f][1].start=Object.assign({},E.end),A=[],i[p][1].end.offset-i[p][1].start.offset&&(A=sw(A,[["enter",i[p][1],a],["exit",i[p][1],a]])),A=sw(A,[["enter",w,a],["enter",b,a],["exit",b,a],["enter",m,a]]),A=sw(A,_0t(a.parser.constructs.insideSpan.null,i.slice(p+1,f),a)),A=sw(A,[["exit",m,a],["enter",E,a],["exit",E,a],["exit",w,a]]),i[f][1].end.offset-i[f][1].start.offset?(I=2,A=sw(A,[["enter",i[f][1],a],["exit",i[f][1],a]])):I=0,m3(i,p-1,f-p+3,A),f=p+A.length-I-2;break}}for(f=-1;++f0&&Wc(ft)?il(i,at,"linePrefix",m+1)(ft):at(ft)}function at(ft){return ft===null||xa(ft)?i.check(GNt,W,mt)(ft):(i.enter("codeFlowValue"),bt(ft))}function bt(ft){return ft===null||xa(ft)?(i.exit("codeFlowValue"),at(ft)):(i.consume(ft),bt)}function mt(ft){return i.exit("codeFenced"),a(ft)}function yt(ft,ut,vt){let X=0;return pt;function pt(Ot){return ft.enter("lineEnding"),ft.consume(Ot),ft.exit("lineEnding"),U}function U(Ot){return ft.enter("codeFencedFence"),Wc(Ot)?il(ft,Tt,"linePrefix",p.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(Ot):Tt(Ot)}function Tt(Ot){return Ot===E?(ft.enter("codeFencedFenceSequence"),nt(Ot)):vt(Ot)}function nt(Ot){return Ot===E?(X++,ft.consume(Ot),nt):X>=b?(ft.exit("codeFencedFenceSequence"),Wc(Ot)?il(ft,It,"whitespace")(Ot):It(Ot)):vt(Ot)}function It(Ot){return Ot===null||xa(Ot)?(ft.exit("codeFencedFence"),ut(Ot)):vt(Ot)}}}function URe(i,a,f){const p=this;return w;function w(b){return b===null?f(b):(i.enter("lineEnding"),i.consume(b),i.exit("lineEnding"),m)}function m(b){return p.parser.lazy[p.now().line]?f(b):a(b)}}const L0t={name:"codeIndented",tokenize:YRe},WRe={tokenize:KRe,partial:!0};function YRe(i,a,f){const p=this;return w;function w(A){return i.enter("codeIndented"),il(i,m,"linePrefix",4+1)(A)}function m(A){const I=p.events[p.events.length-1];return I&&I[1].type==="linePrefix"&&I[2].sliceSerialize(I[1],!0).length>=4?b(A):f(A)}function b(A){return A===null?_(A):xa(A)?i.attempt(WRe,b,_)(A):(i.enter("codeFlowValue"),E(A))}function E(A){return A===null||xa(A)?(i.exit("codeFlowValue"),b(A)):(i.consume(A),E)}function _(A){return i.exit("codeIndented"),a(A)}}function KRe(i,a,f){const p=this;return w;function w(b){return p.parser.lazy[p.now().line]?f(b):xa(b)?(i.enter("lineEnding"),i.consume(b),i.exit("lineEnding"),w):il(i,m,"linePrefix",4+1)(b)}function m(b){const E=p.events[p.events.length-1];return E&&E[1].type==="linePrefix"&&E[2].sliceSerialize(E[1],!0).length>=4?a(b):xa(b)?w(b):f(b)}}const XRe={name:"codeText",tokenize:JRe,resolve:QRe,previous:ZRe};function QRe(i){let a=i.length-4,f=3,p,w;if((i[f][1].type==="lineEnding"||i[f][1].type==="space")&&(i[a][1].type==="lineEnding"||i[a][1].type==="space")){for(p=f;++p=4?a(b):i.interrupt(p.parser.constructs.flow,f,a)(b)}}function YNt(i,a,f,p,w,m,b,E,_){const A=_||Number.POSITIVE_INFINITY;let I=0;return B;function B(st){return st===60?(i.enter(p),i.enter(w),i.enter(m),i.consume(st),i.exit(m),N):st===null||st===32||st===41||T0t(st)?f(st):(i.enter(p),i.enter(b),i.enter(E),i.enter("chunkString",{contentType:"string"}),W(st))}function N(st){return st===62?(i.enter(m),i.consume(st),i.exit(m),i.exit(w),i.exit(p),a):(i.enter(E),i.enter("chunkString",{contentType:"string"}),R(st))}function R(st){return st===62?(i.exit("chunkString"),i.exit(E),N(st)):st===null||st===60||xa(st)?f(st):(i.consume(st),st===92?z:R)}function z(st){return st===60||st===62||st===92?(i.consume(st),R):R(st)}function W(st){return!I&&(st===null||st===41||pp(st))?(i.exit("chunkString"),i.exit(E),i.exit(b),i.exit(p),a(st)):I999||R===null||R===91||R===93&&!_||R===94&&!E&&"_hiddenFootnoteSupport"in b.parser.constructs?f(R):R===93?(i.exit(m),i.enter(w),i.consume(R),i.exit(w),i.exit(p),a):xa(R)?(i.enter("lineEnding"),i.consume(R),i.exit("lineEnding"),I):(i.enter("chunkString",{contentType:"string"}),B(R))}function B(R){return R===null||R===91||R===93||xa(R)||E++>999?(i.exit("chunkString"),I(R)):(i.consume(R),_||(_=!Wc(R)),R===92?N:B)}function N(R){return R===91||R===92||R===93?(i.consume(R),E++,B):B(R)}}function XNt(i,a,f,p,w,m){let b;return E;function E(N){return N===34||N===39||N===40?(i.enter(p),i.enter(w),i.consume(N),i.exit(w),b=N===40?41:N,_):f(N)}function _(N){return N===b?(i.enter(w),i.consume(N),i.exit(w),i.exit(p),a):(i.enter(m),A(N))}function A(N){return N===b?(i.exit(m),_(b)):N===null?f(N):xa(N)?(i.enter("lineEnding"),i.consume(N),i.exit("lineEnding"),il(i,A,"linePrefix")):(i.enter("chunkString",{contentType:"string"}),I(N))}function I(N){return N===b||N===null||xa(N)?(i.exit("chunkString"),A(N)):(i.consume(N),N===92?B:I)}function B(N){return N===b||N===92?(i.consume(N),I):I(N)}}function TF(i,a){let f;return p;function p(w){return xa(w)?(i.enter("lineEnding"),i.consume(w),i.exit("lineEnding"),f=!0,p):Wc(w)?il(i,p,f?"linePrefix":"lineSuffix")(w):a(w)}}function oL(i){return i.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const aje={name:"definition",tokenize:cje},oje={tokenize:uje,partial:!0};function cje(i,a,f){const p=this;let w;return m;function m(R){return i.enter("definition"),b(R)}function b(R){return KNt.call(p,i,E,f,"definitionLabel","definitionLabelMarker","definitionLabelString")(R)}function E(R){return w=oL(p.sliceSerialize(p.events[p.events.length-1][1]).slice(1,-1)),R===58?(i.enter("definitionMarker"),i.consume(R),i.exit("definitionMarker"),_):f(R)}function _(R){return pp(R)?TF(i,A)(R):A(R)}function A(R){return YNt(i,I,f,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(R)}function I(R){return i.attempt(oje,B,B)(R)}function B(R){return Wc(R)?il(i,N,"whitespace")(R):N(R)}function N(R){return R===null||xa(R)?(i.exit("definition"),p.parser.defined.push(w),a(R)):f(R)}}function uje(i,a,f){return p;function p(E){return pp(E)?TF(i,w)(E):f(E)}function w(E){return XNt(i,m,f,"definitionTitle","definitionTitleMarker","definitionTitleString")(E)}function m(E){return Wc(E)?il(i,b,"whitespace")(E):b(E)}function b(E){return E===null||xa(E)?a(E):f(E)}}const lje={name:"hardBreakEscape",tokenize:hje};function hje(i,a,f){return p;function p(m){return i.enter("hardBreakEscape"),i.consume(m),w}function w(m){return xa(m)?(i.exit("hardBreakEscape"),a(m)):f(m)}}const fje={name:"headingAtx",tokenize:gje,resolve:dje};function dje(i,a){let f=i.length-2,p=3,w,m;return i[p][1].type==="whitespace"&&(p+=2),f-2>p&&i[f][1].type==="whitespace"&&(f-=2),i[f][1].type==="atxHeadingSequence"&&(p===f-1||f-4>p&&i[f-2][1].type==="whitespace")&&(f-=p+1===f?2:4),f>p&&(w={type:"atxHeadingText",start:i[p][1].start,end:i[f][1].end},m={type:"chunkText",start:i[p][1].start,end:i[f][1].end,contentType:"text"},m3(i,p,f-p+1,[["enter",w,a],["enter",m,a],["exit",m,a],["exit",w,a]])),i}function gje(i,a,f){let p=0;return w;function w(I){return i.enter("atxHeading"),m(I)}function m(I){return i.enter("atxHeadingSequence"),b(I)}function b(I){return I===35&&p++<6?(i.consume(I),b):I===null||pp(I)?(i.exit("atxHeadingSequence"),E(I)):f(I)}function E(I){return I===35?(i.enter("atxHeadingSequence"),_(I)):I===null||xa(I)?(i.exit("atxHeading"),a(I)):Wc(I)?il(i,E,"whitespace")(I):(i.enter("atxHeadingText"),A(I))}function _(I){return I===35?(i.consume(I),_):(i.exit("atxHeadingSequence"),E(I))}function A(I){return I===null||I===35||pp(I)?(i.exit("atxHeadingText"),E(I)):(i.consume(I),A)}}const pje=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],QNt=["pre","script","style","textarea"],bje={name:"htmlFlow",tokenize:yje,resolveTo:mje,concrete:!0},wje={tokenize:kje,partial:!0},vje={tokenize:xje,partial:!0};function mje(i){let a=i.length;for(;a--&&!(i[a][0]==="enter"&&i[a][1].type==="htmlFlow"););return a>1&&i[a-2][1].type==="linePrefix"&&(i[a][1].start=i[a-2][1].start,i[a+1][1].start=i[a-2][1].start,i.splice(a-2,2)),i}function yje(i,a,f){const p=this;let w,m,b,E,_;return A;function A(Ft){return I(Ft)}function I(Ft){return i.enter("htmlFlow"),i.enter("htmlFlowData"),i.consume(Ft),B}function B(Ft){return Ft===33?(i.consume(Ft),N):Ft===47?(i.consume(Ft),m=!0,W):Ft===63?(i.consume(Ft),w=3,p.interrupt?a:xt):y3(Ft)?(i.consume(Ft),b=String.fromCharCode(Ft),et):f(Ft)}function N(Ft){return Ft===45?(i.consume(Ft),w=2,R):Ft===91?(i.consume(Ft),w=5,E=0,z):y3(Ft)?(i.consume(Ft),w=4,p.interrupt?a:xt):f(Ft)}function R(Ft){return Ft===45?(i.consume(Ft),p.interrupt?a:xt):f(Ft)}function z(Ft){const gn="CDATA[";return Ft===gn.charCodeAt(E++)?(i.consume(Ft),E===gn.length?p.interrupt?a:Tt:z):f(Ft)}function W(Ft){return y3(Ft)?(i.consume(Ft),b=String.fromCharCode(Ft),et):f(Ft)}function et(Ft){if(Ft===null||Ft===47||Ft===62||pp(Ft)){const gn=Ft===47,Se=b.toLowerCase();return!gn&&!m&&QNt.includes(Se)?(w=1,p.interrupt?a(Ft):Tt(Ft)):pje.includes(b.toLowerCase())?(w=6,gn?(i.consume(Ft),st):p.interrupt?a(Ft):Tt(Ft)):(w=7,p.interrupt&&!p.parser.lazy[p.now().line]?f(Ft):m?at(Ft):bt(Ft))}return Ft===45||lm(Ft)?(i.consume(Ft),b+=String.fromCharCode(Ft),et):f(Ft)}function st(Ft){return Ft===62?(i.consume(Ft),p.interrupt?a:Tt):f(Ft)}function at(Ft){return Wc(Ft)?(i.consume(Ft),at):pt(Ft)}function bt(Ft){return Ft===47?(i.consume(Ft),pt):Ft===58||Ft===95||y3(Ft)?(i.consume(Ft),mt):Wc(Ft)?(i.consume(Ft),bt):pt(Ft)}function mt(Ft){return Ft===45||Ft===46||Ft===58||Ft===95||lm(Ft)?(i.consume(Ft),mt):yt(Ft)}function yt(Ft){return Ft===61?(i.consume(Ft),ft):Wc(Ft)?(i.consume(Ft),yt):bt(Ft)}function ft(Ft){return Ft===null||Ft===60||Ft===61||Ft===62||Ft===96?f(Ft):Ft===34||Ft===39?(i.consume(Ft),_=Ft,ut):Wc(Ft)?(i.consume(Ft),ft):vt(Ft)}function ut(Ft){return Ft===_?(i.consume(Ft),_=null,X):Ft===null||xa(Ft)?f(Ft):(i.consume(Ft),ut)}function vt(Ft){return Ft===null||Ft===34||Ft===39||Ft===47||Ft===60||Ft===61||Ft===62||Ft===96||pp(Ft)?yt(Ft):(i.consume(Ft),vt)}function X(Ft){return Ft===47||Ft===62||Wc(Ft)?bt(Ft):f(Ft)}function pt(Ft){return Ft===62?(i.consume(Ft),U):f(Ft)}function U(Ft){return Ft===null||xa(Ft)?Tt(Ft):Wc(Ft)?(i.consume(Ft),U):f(Ft)}function Tt(Ft){return Ft===45&&w===2?(i.consume(Ft),Bt):Ft===60&&w===1?(i.consume(Ft),Et):Ft===62&&w===4?(i.consume(Ft),Ht):Ft===63&&w===3?(i.consume(Ft),xt):Ft===93&&w===5?(i.consume(Ft),Ct):xa(Ft)&&(w===6||w===7)?(i.exit("htmlFlowData"),i.check(wje,Le,nt)(Ft)):Ft===null||xa(Ft)?(i.exit("htmlFlowData"),nt(Ft)):(i.consume(Ft),Tt)}function nt(Ft){return i.check(vje,It,Le)(Ft)}function It(Ft){return i.enter("lineEnding"),i.consume(Ft),i.exit("lineEnding"),Ot}function Ot(Ft){return Ft===null||xa(Ft)?nt(Ft):(i.enter("htmlFlowData"),Tt(Ft))}function Bt(Ft){return Ft===45?(i.consume(Ft),xt):Tt(Ft)}function Et(Ft){return Ft===47?(i.consume(Ft),b="",Z):Tt(Ft)}function Z(Ft){if(Ft===62){const gn=b.toLowerCase();return QNt.includes(gn)?(i.consume(Ft),Ht):Tt(Ft)}return y3(Ft)&&b.length<8?(i.consume(Ft),b+=String.fromCharCode(Ft),Z):Tt(Ft)}function Ct(Ft){return Ft===93?(i.consume(Ft),xt):Tt(Ft)}function xt(Ft){return Ft===62?(i.consume(Ft),Ht):Ft===45&&w===2?(i.consume(Ft),xt):Tt(Ft)}function Ht(Ft){return Ft===null||xa(Ft)?(i.exit("htmlFlowData"),Le(Ft)):(i.consume(Ft),Ht)}function Le(Ft){return i.exit("htmlFlow"),a(Ft)}}function xje(i,a,f){const p=this;return w;function w(b){return xa(b)?(i.enter("lineEnding"),i.consume(b),i.exit("lineEnding"),m):f(b)}function m(b){return p.parser.lazy[p.now().line]?f(b):a(b)}}function kje(i,a,f){return p;function p(w){return i.enter("lineEnding"),i.consume(w),i.exit("lineEnding"),i.attempt(yY,a,f)}}const Eje={name:"htmlText",tokenize:Tje};function Tje(i,a,f){const p=this;let w,m,b;return E;function E(xt){return i.enter("htmlText"),i.enter("htmlTextData"),i.consume(xt),_}function _(xt){return xt===33?(i.consume(xt),A):xt===47?(i.consume(xt),yt):xt===63?(i.consume(xt),bt):y3(xt)?(i.consume(xt),vt):f(xt)}function A(xt){return xt===45?(i.consume(xt),I):xt===91?(i.consume(xt),m=0,z):y3(xt)?(i.consume(xt),at):f(xt)}function I(xt){return xt===45?(i.consume(xt),R):f(xt)}function B(xt){return xt===null?f(xt):xt===45?(i.consume(xt),N):xa(xt)?(b=B,Et(xt)):(i.consume(xt),B)}function N(xt){return xt===45?(i.consume(xt),R):B(xt)}function R(xt){return xt===62?Bt(xt):xt===45?N(xt):B(xt)}function z(xt){const Ht="CDATA[";return xt===Ht.charCodeAt(m++)?(i.consume(xt),m===Ht.length?W:z):f(xt)}function W(xt){return xt===null?f(xt):xt===93?(i.consume(xt),et):xa(xt)?(b=W,Et(xt)):(i.consume(xt),W)}function et(xt){return xt===93?(i.consume(xt),st):W(xt)}function st(xt){return xt===62?Bt(xt):xt===93?(i.consume(xt),st):W(xt)}function at(xt){return xt===null||xt===62?Bt(xt):xa(xt)?(b=at,Et(xt)):(i.consume(xt),at)}function bt(xt){return xt===null?f(xt):xt===63?(i.consume(xt),mt):xa(xt)?(b=bt,Et(xt)):(i.consume(xt),bt)}function mt(xt){return xt===62?Bt(xt):bt(xt)}function yt(xt){return y3(xt)?(i.consume(xt),ft):f(xt)}function ft(xt){return xt===45||lm(xt)?(i.consume(xt),ft):ut(xt)}function ut(xt){return xa(xt)?(b=ut,Et(xt)):Wc(xt)?(i.consume(xt),ut):Bt(xt)}function vt(xt){return xt===45||lm(xt)?(i.consume(xt),vt):xt===47||xt===62||pp(xt)?X(xt):f(xt)}function X(xt){return xt===47?(i.consume(xt),Bt):xt===58||xt===95||y3(xt)?(i.consume(xt),pt):xa(xt)?(b=X,Et(xt)):Wc(xt)?(i.consume(xt),X):Bt(xt)}function pt(xt){return xt===45||xt===46||xt===58||xt===95||lm(xt)?(i.consume(xt),pt):U(xt)}function U(xt){return xt===61?(i.consume(xt),Tt):xa(xt)?(b=U,Et(xt)):Wc(xt)?(i.consume(xt),U):X(xt)}function Tt(xt){return xt===null||xt===60||xt===61||xt===62||xt===96?f(xt):xt===34||xt===39?(i.consume(xt),w=xt,nt):xa(xt)?(b=Tt,Et(xt)):Wc(xt)?(i.consume(xt),Tt):(i.consume(xt),It)}function nt(xt){return xt===w?(i.consume(xt),w=void 0,Ot):xt===null?f(xt):xa(xt)?(b=nt,Et(xt)):(i.consume(xt),nt)}function It(xt){return xt===null||xt===34||xt===39||xt===60||xt===61||xt===96?f(xt):xt===47||xt===62||pp(xt)?X(xt):(i.consume(xt),It)}function Ot(xt){return xt===47||xt===62||pp(xt)?X(xt):f(xt)}function Bt(xt){return xt===62?(i.consume(xt),i.exit("htmlTextData"),i.exit("htmlText"),a):f(xt)}function Et(xt){return i.exit("htmlTextData"),i.enter("lineEnding"),i.consume(xt),i.exit("lineEnding"),Z}function Z(xt){return Wc(xt)?il(i,Ct,"linePrefix",p.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(xt):Ct(xt)}function Ct(xt){return i.enter("htmlTextData"),b(xt)}}const M0t={name:"labelEnd",tokenize:Mje,resolveTo:Lje,resolveAll:Aje},Cje={tokenize:Dje},_je={tokenize:Ije},Sje={tokenize:Oje};function Aje(i){let a=-1;for(;++a=3&&(A===null||xa(A))?(i.exit("thematicBreak"),a(A)):f(A)}function _(A){return A===w?(i.consume(A),p++,_):(i.exit("thematicBreakSequence"),Wc(A)?il(i,E,"whitespace")(A):E(A))}}const bp={name:"list",tokenize:qje,continuation:{tokenize:Hje},exit:Gje},$je={tokenize:Uje,partial:!0},zje={tokenize:Vje,partial:!0};function qje(i,a,f){const p=this,w=p.events[p.events.length-1];let m=w&&w[1].type==="linePrefix"?w[2].sliceSerialize(w[1],!0).length:0,b=0;return E;function E(R){const z=p.containerState.type||(R===42||R===43||R===45?"listUnordered":"listOrdered");if(z==="listUnordered"?!p.containerState.marker||R===p.containerState.marker:C0t(R)){if(p.containerState.type||(p.containerState.type=z,i.enter(z,{_container:!0})),z==="listUnordered")return i.enter("listItemPrefix"),R===42||R===45?i.check(xY,f,A)(R):A(R);if(!p.interrupt||R===49)return i.enter("listItemPrefix"),i.enter("listItemValue"),_(R)}return f(R)}function _(R){return C0t(R)&&++b<10?(i.consume(R),_):(!p.interrupt||b<2)&&(p.containerState.marker?R===p.containerState.marker:R===41||R===46)?(i.exit("listItemValue"),A(R)):f(R)}function A(R){return i.enter("listItemMarker"),i.consume(R),i.exit("listItemMarker"),p.containerState.marker=p.containerState.marker||R,i.check(yY,p.interrupt?f:I,i.attempt($je,N,B))}function I(R){return p.containerState.initialBlankLine=!0,m++,N(R)}function B(R){return Wc(R)?(i.enter("listItemPrefixWhitespace"),i.consume(R),i.exit("listItemPrefixWhitespace"),N):f(R)}function N(R){return p.containerState.size=m+p.sliceSerialize(i.exit("listItemPrefix"),!0).length,a(R)}}function Hje(i,a,f){const p=this;return p.containerState._closeFlow=void 0,i.check(yY,w,m);function w(E){return p.containerState.furtherBlankLines=p.containerState.furtherBlankLines||p.containerState.initialBlankLine,il(i,a,"listItemIndent",p.containerState.size+1)(E)}function m(E){return p.containerState.furtherBlankLines||!Wc(E)?(p.containerState.furtherBlankLines=void 0,p.containerState.initialBlankLine=void 0,b(E)):(p.containerState.furtherBlankLines=void 0,p.containerState.initialBlankLine=void 0,i.attempt(zje,a,b)(E))}function b(E){return p.containerState._closeFlow=!0,p.interrupt=void 0,il(i,i.attempt(bp,a,f),"linePrefix",p.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(E)}}function Vje(i,a,f){const p=this;return il(i,w,"listItemIndent",p.containerState.size+1);function w(m){const b=p.events[p.events.length-1];return b&&b[1].type==="listItemIndent"&&b[2].sliceSerialize(b[1],!0).length===p.containerState.size?a(m):f(m)}}function Gje(i){i.exit(this.containerState.type)}function Uje(i,a,f){const p=this;return il(i,w,"listItemPrefixWhitespace",p.parser.constructs.disable.null.includes("codeIndented")?void 0:4+1);function w(m){const b=p.events[p.events.length-1];return!Wc(m)&&b&&b[1].type==="listItemPrefixWhitespace"?a(m):f(m)}}const ZNt={name:"setextUnderline",tokenize:Yje,resolveTo:Wje};function Wje(i,a){let f=i.length,p,w,m;for(;f--;)if(i[f][0]==="enter"){if(i[f][1].type==="content"){p=f;break}i[f][1].type==="paragraph"&&(w=f)}else i[f][1].type==="content"&&i.splice(f,1),!m&&i[f][1].type==="definition"&&(m=f);const b={type:"setextHeading",start:Object.assign({},i[w][1].start),end:Object.assign({},i[i.length-1][1].end)};return i[w][1].type="setextHeadingText",m?(i.splice(w,0,["enter",b,a]),i.splice(m+1,0,["exit",i[p][1],a]),i[p][1].end=Object.assign({},i[m][1].end)):i[p][1]=b,i.push(["exit",b,a]),i}function Yje(i,a,f){const p=this;let w;return m;function m(A){let I=p.events.length,B;for(;I--;)if(p.events[I][1].type!=="lineEnding"&&p.events[I][1].type!=="linePrefix"&&p.events[I][1].type!=="content"){B=p.events[I][1].type==="paragraph";break}return!p.parser.lazy[p.now().line]&&(p.interrupt||B)?(i.enter("setextHeadingLine"),w=A,b(A)):f(A)}function b(A){return i.enter("setextHeadingLineSequence"),E(A)}function E(A){return A===w?(i.consume(A),E):(i.exit("setextHeadingLineSequence"),Wc(A)?il(i,_,"lineSuffix")(A):_(A))}function _(A){return A===null||xa(A)?(i.exit("setextHeadingLine"),a(A)):f(A)}}const Kje={tokenize:Xje};function Xje(i){const a=this,f=i.attempt(yY,p,i.attempt(this.parser.constructs.flowInitial,w,il(i,i.attempt(this.parser.constructs.flow,w,i.attempt(eje,w)),"linePrefix")));return f;function p(m){if(m===null){i.consume(m);return}return i.enter("lineEndingBlank"),i.consume(m),i.exit("lineEndingBlank"),a.currentConstruct=void 0,f}function w(m){if(m===null){i.consume(m);return}return i.enter("lineEnding"),i.consume(m),i.exit("lineEnding"),a.currentConstruct=void 0,f}}const Qje={resolveAll:tBt()},Zje=JNt("string"),Jje=JNt("text");function JNt(i){return{tokenize:a,resolveAll:tBt(i==="text"?t$e:void 0)};function a(f){const p=this,w=this.parser.constructs[i],m=f.attempt(w,b,E);return b;function b(I){return A(I)?m(I):E(I)}function E(I){if(I===null){f.consume(I);return}return f.enter("data"),f.consume(I),_}function _(I){return A(I)?(f.exit("data"),m(I)):(f.consume(I),_)}function A(I){if(I===null)return!0;const B=w[I];let N=-1;if(B)for(;++N-1){const E=b[0];typeof E=="string"?b[0]=E.slice(p):b.shift()}m>0&&b.push(i[w].slice(0,m))}return b}function r$e(i,a){let f=-1;const p=[];let w;for(;++f13&&f<32||f>126&&f<160||f>55295&&f<57344||f>64975&&f<65008||(f&65535)===65535||(f&65535)===65534||f>1114111?"�":String.fromCharCode(f)}const c$e=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function u$e(i){return i.replace(c$e,l$e)}function l$e(i,a,f){if(a)return a;if(f.charCodeAt(0)===35){const w=f.charCodeAt(1),m=w===120||w===88;return nBt(f.slice(m?2:1),m?16:10)}return A0t(f)||i}function kY(i){return!i||typeof i!="object"?"":"position"in i||"type"in i?rBt(i.position):"start"in i||"end"in i?rBt(i):"line"in i||"column"in i?I0t(i):""}function I0t(i){return iBt(i&&i.line)+":"+iBt(i&&i.column)}function rBt(i){return I0t(i&&i.start)+"-"+I0t(i&&i.end)}function iBt(i){return i&&typeof i=="number"?i:1}const sBt={}.hasOwnProperty,aBt=function(i,a,f){return typeof a!="string"&&(f=a,a=void 0),h$e(f)(o$e(s$e(f).document().write(a$e()(i,a,!0))))};function h$e(i){const a={transforms:[],canContainEols:["emphasis","fragment","heading","paragraph","strong"],enter:{autolink:E(Ks),autolinkProtocol:U,autolinkEmail:U,atxHeading:E(Me),blockQuote:E(zt),characterEscape:U,characterReference:U,codeFenced:E(re),codeFencedFenceInfo:_,codeFencedFenceMeta:_,codeIndented:E(re,_),codeText:E(se,_),codeTextData:U,data:U,codeFlowValue:U,definition:E(Pe),definitionDestinationString:_,definitionLabelString:_,definitionTitleString:_,emphasis:E(te),hardBreakEscape:E(de),hardBreakTrailing:E(de),htmlFlow:E(on,_),htmlFlowData:U,htmlText:E(on,_),htmlTextData:U,image:E(ni),label:_,link:E(Ks),listItem:E(fo),listItemValue:z,listOrdered:E(ws,R),listUnordered:E(ws),paragraph:E(Xi),reference:Se,referenceString:_,resourceDestinationString:_,resourceTitleString:_,setextHeading:E(Me),strong:E(Er),thematicBreak:E(di)},exit:{atxHeading:I(),atxHeadingSequence:ut,autolink:I(),autolinkEmail:ke,autolinkProtocol:ce,blockQuote:I(),characterEscapeValue:Tt,characterReferenceMarkerHexadecimal:Ve,characterReferenceMarkerNumeric:Ve,characterReferenceValue:Ye,codeFenced:I(at),codeFencedFence:st,codeFencedFenceInfo:W,codeFencedFenceMeta:et,codeFlowValue:Tt,codeIndented:I(bt),codeText:I(Et),codeTextData:Tt,data:Tt,definition:I(),definitionDestinationString:ft,definitionLabelString:mt,definitionTitleString:yt,emphasis:I(),hardBreakEscape:I(It),hardBreakTrailing:I(It),htmlFlow:I(Ot),htmlFlowData:Tt,htmlText:I(Bt),htmlTextData:Tt,image:I(Ct),label:Ht,labelText:xt,lineEnding:nt,link:I(Z),listItem:I(),listOrdered:I(),listUnordered:I(),paragraph:I(),referenceString:me,resourceDestinationString:Le,resourceTitleString:Ft,resource:gn,setextHeading:I(pt),setextHeadingLineSequence:X,setextHeadingText:vt,strong:I(),thematicBreak:I()}};oBt(a,(i||{}).mdastExtensions||[]);const f={};return p;function p(Ee){let Kn={type:"root",children:[]};const He={stack:[Kn],tokenStack:[],config:a,enter:A,exit:B,buffer:_,resume:N,setData:m,getData:b},Ti=[];let pn=-1;for(;++pn0){const Es=He.tokenStack[He.tokenStack.length-1];(Es[1]||cBt).call(He,void 0,Es[0])}for(Kn.position={start:wk(Ee.length>0?Ee[0][1].start:{line:1,column:1,offset:0}),end:wk(Ee.length>0?Ee[Ee.length-2][1].end:{line:1,column:1,offset:0})},pn=-1;++pn{I!==0&&(w++,p.push([])),A.split(" ").forEach(B=>{B&&p[w].push({content:B,type:E})})}):(b.type==="strong"||b.type==="emphasis")&&b.children.forEach(_=>{m(_,b.type)})}return f.forEach(b=>{b.type==="paragraph"&&b.children.forEach(E=>{m(E)})}),p}function p$e(i){const{children:a}=aBt(i);function f(p){return p.type==="text"?p.value.replace(/\n/g,"
"):p.type==="strong"?`${p.children.map(f).join("")}`:p.type==="emphasis"?`${p.children.map(f).join("")}`:p.type==="paragraph"?`

${p.children.map(f).join("")}

`:`Unsupported markdown: ${p.type}`}return a.map(f).join("")}function b$e(i){return Intl.Segmenter?[...new Intl.Segmenter().segment(i)].map(a=>a.segment):[...i]}function w$e(i,a){const f=b$e(a.content);return uBt(i,[],f,a.type)}function uBt(i,a,f,p){if(f.length===0)return[{content:a.join(""),type:p},{content:"",type:p}];const[w,...m]=f,b=[...a,w];return i([{content:b.join(""),type:p}])?uBt(i,b,m,p):(a.length===0&&w&&(a.push(w),f.shift()),[{content:a.join(""),type:p},{content:f.join(""),type:p}])}function v$e(i,a){if(i.some(({content:f})=>f.includes(` +`)))throw new Error("splitLineToFitWidth does not support newlines in the line");return O0t(i,a)}function O0t(i,a,f=[],p=[]){if(i.length===0)return p.length>0&&f.push(p),f.length>0?f:[];let w="";i[0].content===" "&&(w=" ",i.shift());const m=i.shift()??{content:" ",type:"normal"},b=[...p];if(w!==""&&b.push({content:w,type:"normal"}),b.push(m),a(b))return O0t(i,a,f,b);if(p.length>0)f.push(p),i.unshift(m);else if(m.content){const[E,_]=w$e(a,m);f.push([E]),_.content&&i.unshift(_)}return O0t(i,a,f)}function m$e(i,a){a&&i.attr("style",a)}function y$e(i,a,f,p,w=!1){const m=i.append("foreignObject"),b=m.append("xhtml:div"),E=a.label,_=a.isNode?"nodeLabel":"edgeLabel";b.html(` + "+E+""),m$e(b,a.labelStyle),b.style("display","table-cell"),b.style("white-space","nowrap"),b.style("max-width",f+"px"),b.attr("xmlns","http://www.w3.org/1999/xhtml"),w&&b.attr("class","labelBkg");let A=b.node().getBoundingClientRect();return A.width===f&&(b.style("display","table"),b.style("white-space","break-spaces"),b.style("width",f+"px"),A=b.node().getBoundingClientRect()),m.style("width",A.width),m.style("height",A.height),m.node()}function P0t(i,a,f){return i.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",a*f-.1+"em").attr("dy",f+"em")}function x$e(i,a,f){const p=i.append("text"),w=P0t(p,1,a);F0t(w,f);const m=w.node().getComputedTextLength();return p.remove(),m}function k$e(i,a,f){var b;const p=i.append("text"),w=P0t(p,1,a);F0t(w,[{content:f,type:"normal"}]);const m=(b=w.node())==null?void 0:b.getBoundingClientRect();return m&&p.remove(),m}function E$e(i,a,f,p=!1){const m=a.append("g"),b=m.insert("rect").attr("class","background"),E=m.append("text").attr("y","-10.1");let _=0;for(const A of f){const I=N=>x$e(m,1.1,N)<=i,B=I(A)?[A]:v$e(A,I);for(const N of B){const R=P0t(E,_,1.1);F0t(R,N),_++}}if(p){const A=E.node().getBBox(),I=2;return b.attr("x",-I).attr("y",-I).attr("width",A.width+2*I).attr("height",A.height+2*I),m.node()}else return E.node()}function F0t(i,a){i.text(""),a.forEach((f,p)=>{const w=i.append("tspan").attr("font-style",f.type==="emphasis"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",f.type==="strong"?"bold":"normal");p===0?w.text(f.content):w.text(" "+f.content)})}const EY=(i,a="",{style:f="",isTitle:p=!1,classes:w="",useHtmlLabels:m=!0,isNode:b=!0,width:E=200,addSvgBackground:_=!1}={})=>{if(Ut.info("createText",a,f,p,w,m,b,_),m){const A=p$e(a),I={isNode:b,label:uF(A).replace(/fa[blrs]?:fa-[\w-]+/g,N=>``),labelStyle:f.replace("fill:","color:")};return y$e(i,I,E,w,_)}else{const A=g$e(a);return E$e(E,i,A,_)}},Nd=async(i,a,f,p)=>{let w;const m=a.useHtmlLabels||o1(Oe().flowchart.htmlLabels);f?w=f:w="node default";const b=i.insert("g").attr("class",w).attr("id",a.domId||a.id),E=b.insert("g").attr("class","label").attr("style",a.labelStyle);let _;a.labelText===void 0?_="":_=typeof a.labelText=="string"?a.labelText:a.labelText[0];const A=E.node();let I;a.labelType==="markdown"?I=EY(E,Q1(uF(_),Oe()),{useHtmlLabels:m,width:a.width||Oe().flowchart.wrappingWidth,classes:"markdown-node-label"}):I=A.appendChild(gp(Q1(uF(_),Oe()),a.labelStyle,!1,p));let B=I.getBBox();const N=a.padding/2;if(o1(Oe().flowchart.htmlLabels)){const R=I.children[0],z=yr(I),W=R.getElementsByTagName("img");if(W){const et=_.replace(/]*>/g,"").trim()==="";await Promise.all([...W].map(st=>new Promise(at=>{function bt(){if(st.style.display="flex",st.style.flexDirection="column",et){const mt=Oe().fontSize?Oe().fontSize:window.getComputedStyle(document.body).fontSize,yt=5;st.style.width=parseInt(mt,10)*yt+"px"}else st.style.width="100%";at(st)}setTimeout(()=>{st.complete&&bt()}),st.addEventListener("error",bt),st.addEventListener("load",bt)})))}B=R.getBoundingClientRect(),z.attr("width",B.width),z.attr("height",B.height)}return m?E.attr("transform","translate("+-B.width/2+", "+-B.height/2+")"):E.attr("transform","translate(0, "+-B.height/2+")"),a.centerLabel&&E.attr("transform","translate("+-B.width/2+", "+-B.height/2+")"),E.insert("rect",":first-child"),{shapeSvg:b,bbox:B,halfPadding:N,label:E}},tf=(i,a)=>{const f=a.node().getBBox();i.width=f.width,i.height=f.height};function F5(i,a,f,p){return i.insert("polygon",":first-child").attr("points",p.map(function(w){return w.x+","+w.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-a/2+","+f/2+")")}let Ho={},hm={},lBt={};const T$e=()=>{hm={},lBt={},Ho={}},TY=(i,a)=>(Ut.trace("In isDecendant",a," ",i," = ",hm[a].includes(i)),!!hm[a].includes(i)),C$e=(i,a)=>(Ut.info("Decendants of ",a," is ",hm[a]),Ut.info("Edge is ",i),i.v===a||i.w===a?!1:hm[a]?hm[a].includes(i.v)||TY(i.v,a)||TY(i.w,a)||hm[a].includes(i.w):(Ut.debug("Tilt, ",a,",not in decendants"),!1)),hBt=(i,a,f,p)=>{Ut.warn("Copying children of ",i,"root",p,"data",a.node(i),p);const w=a.children(i)||[];i!==p&&w.push(i),Ut.warn("Copying (nodes) clusterId",i,"nodes",w),w.forEach(m=>{if(a.children(m).length>0)hBt(m,a,f,p);else{const b=a.node(m);Ut.info("cp ",m," to ",p," with parent ",i),f.setNode(m,b),p!==a.parent(m)&&(Ut.warn("Setting parent",m,a.parent(m)),f.setParent(m,a.parent(m))),i!==p&&m!==i?(Ut.debug("Setting parent",m,i),f.setParent(m,i)):(Ut.info("In copy ",i,"root",p,"data",a.node(i),p),Ut.debug("Not Setting parent for node=",m,"cluster!==rootId",i!==p,"node!==clusterId",m!==i));const E=a.edges(m);Ut.debug("Copying Edges",E),E.forEach(_=>{Ut.info("Edge",_);const A=a.edge(_.v,_.w,_.name);Ut.info("Edge data",A,p);try{C$e(_,p)?(Ut.info("Copying as ",_.v,_.w,A,_.name),f.setEdge(_.v,_.w,A,_.name),Ut.info("newGraph edges ",f.edges(),f.edge(f.edges()[0]))):Ut.info("Skipping copy of edge ",_.v,"-->",_.w," rootId: ",p," clusterId:",i)}catch(I){Ut.error(I)}})}Ut.debug("Removing node",m),a.removeNode(m)})},fBt=(i,a)=>{const f=a.children(i);let p=[...f];for(const w of f)lBt[w]=i,p=[...p,...fBt(w,a)];return p},CF=(i,a)=>{Ut.trace("Searching",i);const f=a.children(i);if(Ut.trace("Searching children of id ",i,f),f.length<1)return Ut.trace("This is a valid node",i),i;for(const p of f){const w=CF(p,a);if(w)return Ut.trace("Found replacement for",i," => ",w),w}},CY=i=>!Ho[i]||!Ho[i].externalConnections?i:Ho[i]?Ho[i].id:i,_$e=(i,a)=>{if(!i||a>10){Ut.debug("Opting out, no graph ");return}else Ut.debug("Opting in, graph ");i.nodes().forEach(function(f){i.children(f).length>0&&(Ut.warn("Cluster identified",f," Replacement id in edges: ",CF(f,i)),hm[f]=fBt(f,i),Ho[f]={id:CF(f,i),clusterData:i.node(f)})}),i.nodes().forEach(function(f){const p=i.children(f),w=i.edges();p.length>0?(Ut.debug("Cluster identified",f,hm),w.forEach(m=>{if(m.v!==f&&m.w!==f){const b=TY(m.v,f),E=TY(m.w,f);b^E&&(Ut.warn("Edge: ",m," leaves cluster ",f),Ut.warn("Decendants of XXX ",f,": ",hm[f]),Ho[f].externalConnections=!0)}})):Ut.debug("Not a cluster ",f,hm)}),i.edges().forEach(function(f){const p=i.edge(f);Ut.warn("Edge "+f.v+" -> "+f.w+": "+JSON.stringify(f)),Ut.warn("Edge "+f.v+" -> "+f.w+": "+JSON.stringify(i.edge(f)));let w=f.v,m=f.w;if(Ut.warn("Fix XXX",Ho,"ids:",f.v,f.w,"Translating: ",Ho[f.v]," --- ",Ho[f.w]),Ho[f.v]&&Ho[f.w]&&Ho[f.v]===Ho[f.w]){Ut.warn("Fixing and trixing link to self - removing XXX",f.v,f.w,f.name),Ut.warn("Fixing and trixing - removing XXX",f.v,f.w,f.name),w=CY(f.v),m=CY(f.w),i.removeEdge(f.v,f.w,f.name);const b=f.w+"---"+f.v;i.setNode(b,{domId:b,id:b,labelStyle:"",labelText:p.label,padding:0,shape:"labelRect",style:""});const E=structuredClone(p),_=structuredClone(p);E.label="",E.arrowTypeEnd="none",_.label="",E.fromCluster=f.v,_.toCluster=f.v,i.setEdge(w,b,E,f.name+"-cyclic-special"),i.setEdge(b,m,_,f.name+"-cyclic-special")}else(Ho[f.v]||Ho[f.w])&&(Ut.warn("Fixing and trixing - removing XXX",f.v,f.w,f.name),w=CY(f.v),m=CY(f.w),i.removeEdge(f.v,f.w,f.name),w!==f.v&&(p.fromCluster=f.v),m!==f.w&&(p.toCluster=f.w),Ut.warn("Fix Replacing with XXX",w,m,f.name),i.setEdge(w,m,p,f.name))}),Ut.warn("Adjusted Graph",P5(i)),dBt(i,0),Ut.trace(Ho)},dBt=(i,a)=>{if(Ut.warn("extractor - ",a,P5(i),i.children("D")),a>10){Ut.error("Bailing out");return}let f=i.nodes(),p=!1;for(const w of f){const m=i.children(w);p=p||m.length>0}if(!p){Ut.debug("Done, no node has children",i.nodes());return}Ut.debug("Nodes = ",f,a);for(const w of f)if(Ut.debug("Extracting node",w,Ho,Ho[w]&&!Ho[w].externalConnections,!i.parent(w),i.node(w),i.children("D")," Depth ",a),!Ho[w])Ut.debug("Not a cluster",w,a);else if(!Ho[w].externalConnections&&i.children(w)&&i.children(w).length>0){Ut.warn("Cluster without external connections, without a parent and with children",w,a);let b=i.graph().rankdir==="TB"?"LR":"TB";Ho[w]&&Ho[w].clusterData&&Ho[w].clusterData.dir&&(b=Ho[w].clusterData.dir,Ut.warn("Fixing dir",Ho[w].clusterData.dir,b));const E=new c1({multigraph:!0,compound:!0}).setGraph({rankdir:b,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});Ut.warn("Old graph before copy",P5(i)),hBt(w,i,E,w),i.setNode(w,{clusterNode:!0,id:w,clusterData:Ho[w].clusterData,labelText:Ho[w].labelText,graph:E}),Ut.warn("New graph after copy node: (",w,")",P5(E)),Ut.debug("Old graph after copy",P5(i))}else Ut.warn("Cluster ** ",w," **not meeting the criteria !externalConnections:",!Ho[w].externalConnections," no parent: ",!i.parent(w)," children ",i.children(w)&&i.children(w).length>0,i.children("D"),a),Ut.debug(Ho);f=i.nodes(),Ut.warn("New list of nodes",f);for(const w of f){const m=i.node(w);Ut.warn(" Now next level",w,m),m.clusterNode&&dBt(m.graph,a+1)}},gBt=(i,a)=>{if(a.length===0)return[];let f=Object.assign(a);return a.forEach(p=>{const w=i.children(p),m=gBt(i,w);f=[...f,...m]}),f},S$e=i=>gBt(i,i.children());function A$e(i,a){return i.intersect(a)}function pBt(i,a,f,p){var w=i.x,m=i.y,b=w-p.x,E=m-p.y,_=Math.sqrt(a*a*E*E+f*f*b*b),A=Math.abs(a*f*b/_);p.x0}function D$e(i,a,f){var p=i.x,w=i.y,m=[],b=Number.POSITIVE_INFINITY,E=Number.POSITIVE_INFINITY;typeof a.forEach=="function"?a.forEach(function(z){b=Math.min(b,z.x),E=Math.min(E,z.y)}):(b=Math.min(b,a.x),E=Math.min(E,a.y));for(var _=p-i.width/2-b,A=w-i.height/2-E,I=0;I1&&m.sort(function(z,W){var et=z.x-f.x,st=z.y-f.y,at=Math.sqrt(et*et+st*st),bt=W.x-f.x,mt=W.y-f.y,yt=Math.sqrt(bt*bt+mt*mt);return at{var f=i.x,p=i.y,w=a.x-f,m=a.y-p,b=i.width/2,E=i.height/2,_,A;return Math.abs(m)*b>Math.abs(w)*E?(m<0&&(E=-E),_=m===0?0:E*w/m,A=E):(w<0&&(b=-b),_=b,A=w===0?0:b*m/w),{x:f+_,y:p+A}},kh={node:A$e,circle:L$e,ellipse:pBt,polygon:D$e,rect:_F},I$e=async(i,a)=>{a.useHtmlLabels||Oe().flowchart.htmlLabels||(a.centerLabel=!0);const{shapeSvg:p,bbox:w,halfPadding:m}=await Nd(i,a,"node "+a.classes,!0);Ut.info("Classes = ",a.classes);const b=p.insert("rect",":first-child");return b.attr("rx",a.rx).attr("ry",a.ry).attr("x",-w.width/2-m).attr("y",-w.height/2-m).attr("width",w.width+a.padding).attr("height",w.height+a.padding),tf(a,b),a.intersect=function(E){return kh.rect(a,E)},p},wBt=i=>i?" "+i:"",jb=(i,a)=>`${a||"node default"}${wBt(i.classes)} ${wBt(i.class)}`,vBt=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=p.width+a.padding,m=p.height+a.padding,b=w+m,E=[{x:b/2,y:0},{x:b,y:-b/2},{x:b/2,y:-b},{x:0,y:-b/2}];Ut.info("Question main (Circle)");const _=F5(f,b,b,E);return _.attr("style",a.style),tf(a,_),a.intersect=function(A){return Ut.warn("Intersect called"),kh.polygon(a,E,A)},f},O$e=(i,a)=>{const f=i.insert("g").attr("class","node default").attr("id",a.domId||a.id),p=28,w=[{x:0,y:p/2},{x:p/2,y:0},{x:0,y:-p/2},{x:-p/2,y:0}];return f.insert("polygon",":first-child").attr("points",w.map(function(b){return b.x+","+b.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),a.width=28,a.height=28,a.intersect=function(b){return kh.circle(a,14,b)},f},P$e=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=4,m=p.height+a.padding,b=m/w,E=p.width+2*b+a.padding,_=[{x:b,y:0},{x:E-b,y:0},{x:E,y:-m/2},{x:E-b,y:-m},{x:b,y:-m},{x:0,y:-m/2}],A=F5(f,E,m,_);return A.attr("style",a.style),tf(a,A),a.intersect=function(I){return kh.polygon(a,_,I)},f},F$e=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=p.width+a.padding,m=p.height+a.padding,b=[{x:-m/2,y:0},{x:w,y:0},{x:w,y:-m},{x:-m/2,y:-m},{x:0,y:-m/2}];return F5(f,w,m,b).attr("style",a.style),a.width=w+m,a.height=m,a.intersect=function(_){return kh.polygon(a,b,_)},f},N$e=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a),!0),w=p.width+a.padding,m=p.height+a.padding,b=[{x:-2*m/6,y:0},{x:w-m/6,y:0},{x:w+2*m/6,y:-m},{x:m/6,y:-m}],E=F5(f,w,m,b);return E.attr("style",a.style),tf(a,E),a.intersect=function(_){return kh.polygon(a,b,_)},f},B$e=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=p.width+a.padding,m=p.height+a.padding,b=[{x:2*m/6,y:0},{x:w+m/6,y:0},{x:w-2*m/6,y:-m},{x:-m/6,y:-m}],E=F5(f,w,m,b);return E.attr("style",a.style),tf(a,E),a.intersect=function(_){return kh.polygon(a,b,_)},f},R$e=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=p.width+a.padding,m=p.height+a.padding,b=[{x:-2*m/6,y:0},{x:w+2*m/6,y:0},{x:w-m/6,y:-m},{x:m/6,y:-m}],E=F5(f,w,m,b);return E.attr("style",a.style),tf(a,E),a.intersect=function(_){return kh.polygon(a,b,_)},f},j$e=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=p.width+a.padding,m=p.height+a.padding,b=[{x:m/6,y:0},{x:w-m/6,y:0},{x:w+2*m/6,y:-m},{x:-2*m/6,y:-m}],E=F5(f,w,m,b);return E.attr("style",a.style),tf(a,E),a.intersect=function(_){return kh.polygon(a,b,_)},f},$$e=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=p.width+a.padding,m=p.height+a.padding,b=[{x:0,y:0},{x:w+m/2,y:0},{x:w,y:-m/2},{x:w+m/2,y:-m},{x:0,y:-m}],E=F5(f,w,m,b);return E.attr("style",a.style),tf(a,E),a.intersect=function(_){return kh.polygon(a,b,_)},f},z$e=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=p.width+a.padding,m=w/2,b=m/(2.5+w/50),E=p.height+b+a.padding,_="M 0,"+b+" a "+m+","+b+" 0,0,0 "+w+" 0 a "+m+","+b+" 0,0,0 "+-w+" 0 l 0,"+E+" a "+m+","+b+" 0,0,0 "+w+" 0 l 0,"+-E,A=f.attr("label-offset-y",b).insert("path",":first-child").attr("style",a.style).attr("d",_).attr("transform","translate("+-w/2+","+-(E/2+b)+")");return tf(a,A),a.intersect=function(I){const B=kh.rect(a,I),N=B.x-a.x;if(m!=0&&(Math.abs(N)a.height/2-b)){let R=b*b*(1-N*N/(m*m));R!=0&&(R=Math.sqrt(R)),R=b-R,I.y-a.y>0&&(R=-R),B.y+=R}return B},f},q$e=async(i,a)=>{const{shapeSvg:f,bbox:p,halfPadding:w}=await Nd(i,a,"node "+a.classes+" "+a.class,!0),m=f.insert("rect",":first-child"),b=p.width+a.padding,E=p.height+a.padding;if(m.attr("class","basic label-container").attr("style",a.style).attr("rx",a.rx).attr("ry",a.ry).attr("x",-p.width/2-w).attr("y",-p.height/2-w).attr("width",b).attr("height",E),a.props){const _=new Set(Object.keys(a.props));a.props.borders&&(mBt(m,a.props.borders,b,E),_.delete("borders")),_.forEach(A=>{Ut.warn(`Unknown node property ${A}`)})}return tf(a,m),a.intersect=function(_){return kh.rect(a,_)},f},H$e=async(i,a)=>{const{shapeSvg:f}=await Nd(i,a,"label",!0);Ut.trace("Classes = ",a.class);const p=f.insert("rect",":first-child"),w=0,m=0;if(p.attr("width",w).attr("height",m),f.attr("class","label edgeLabel"),a.props){const b=new Set(Object.keys(a.props));a.props.borders&&(mBt(p,a.props.borders,w,m),b.delete("borders")),b.forEach(E=>{Ut.warn(`Unknown node property ${E}`)})}return tf(a,p),a.intersect=function(b){return kh.rect(a,b)},f};function mBt(i,a,f,p){const w=[],m=E=>{w.push(E,0)},b=E=>{w.push(0,E)};a.includes("t")?(Ut.debug("add top border"),m(f)):b(f),a.includes("r")?(Ut.debug("add right border"),m(p)):b(p),a.includes("b")?(Ut.debug("add bottom border"),m(f)):b(f),a.includes("l")?(Ut.debug("add left border"),m(p)):b(p),i.attr("stroke-dasharray",w.join(" "))}const V$e=(i,a)=>{let f;a.classes?f="node "+a.classes:f="node default";const p=i.insert("g").attr("class",f).attr("id",a.domId||a.id),w=p.insert("rect",":first-child"),m=p.insert("line"),b=p.insert("g").attr("class","label"),E=a.labelText.flat?a.labelText.flat():a.labelText;let _="";typeof E=="object"?_=E[0]:_=E,Ut.info("Label text abc79",_,E,typeof E=="object");const A=b.node().appendChild(gp(_,a.labelStyle,!0,!0));let I={width:0,height:0};if(o1(Oe().flowchart.htmlLabels)){const W=A.children[0],et=yr(A);I=W.getBoundingClientRect(),et.attr("width",I.width),et.attr("height",I.height)}Ut.info("Text 2",E);const B=E.slice(1,E.length);let N=A.getBBox();const R=b.node().appendChild(gp(B.join?B.join("
"):B,a.labelStyle,!0,!0));if(o1(Oe().flowchart.htmlLabels)){const W=R.children[0],et=yr(R);I=W.getBoundingClientRect(),et.attr("width",I.width),et.attr("height",I.height)}const z=a.padding/2;return yr(R).attr("transform","translate( "+(I.width>N.width?0:(N.width-I.width)/2)+", "+(N.height+z+5)+")"),yr(A).attr("transform","translate( "+(I.width{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=p.height+a.padding,m=p.width+w/4+a.padding,b=f.insert("rect",":first-child").attr("style",a.style).attr("rx",w/2).attr("ry",w/2).attr("x",-m/2).attr("y",-w/2).attr("width",m).attr("height",w);return tf(a,b),a.intersect=function(E){return kh.rect(a,E)},f},U$e=async(i,a)=>{const{shapeSvg:f,bbox:p,halfPadding:w}=await Nd(i,a,jb(a,void 0),!0),m=f.insert("circle",":first-child");return m.attr("style",a.style).attr("rx",a.rx).attr("ry",a.ry).attr("r",p.width/2+w).attr("width",p.width+a.padding).attr("height",p.height+a.padding),Ut.info("Circle main"),tf(a,m),a.intersect=function(b){return Ut.info("Circle intersect",a,p.width/2+w,b),kh.circle(a,p.width/2+w,b)},f},W$e=async(i,a)=>{const{shapeSvg:f,bbox:p,halfPadding:w}=await Nd(i,a,jb(a,void 0),!0),m=5,b=f.insert("g",":first-child"),E=b.insert("circle"),_=b.insert("circle");return b.attr("class",a.class),E.attr("style",a.style).attr("rx",a.rx).attr("ry",a.ry).attr("r",p.width/2+w+m).attr("width",p.width+a.padding+m*2).attr("height",p.height+a.padding+m*2),_.attr("style",a.style).attr("rx",a.rx).attr("ry",a.ry).attr("r",p.width/2+w).attr("width",p.width+a.padding).attr("height",p.height+a.padding),Ut.info("DoubleCircle main"),tf(a,E),a.intersect=function(A){return Ut.info("DoubleCircle intersect",a,p.width/2+w+m,A),kh.circle(a,p.width/2+w+m,A)},f},Y$e=async(i,a)=>{const{shapeSvg:f,bbox:p}=await Nd(i,a,jb(a,void 0),!0),w=p.width+a.padding,m=p.height+a.padding,b=[{x:0,y:0},{x:w,y:0},{x:w,y:-m},{x:0,y:-m},{x:0,y:0},{x:-8,y:0},{x:w+8,y:0},{x:w+8,y:-m},{x:-8,y:-m},{x:-8,y:0}],E=F5(f,w,m,b);return E.attr("style",a.style),tf(a,E),a.intersect=function(_){return kh.polygon(a,b,_)},f},K$e=(i,a)=>{const f=i.insert("g").attr("class","node default").attr("id",a.domId||a.id),p=f.insert("circle",":first-child");return p.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),tf(a,p),a.intersect=function(w){return kh.circle(a,7,w)},f},yBt=(i,a,f)=>{const p=i.insert("g").attr("class","node default").attr("id",a.domId||a.id);let w=70,m=10;f==="LR"&&(w=10,m=70);const b=p.append("rect").attr("x",-1*w/2).attr("y",-1*m/2).attr("width",w).attr("height",m).attr("class","fork-join");return tf(a,b),a.height=a.height+a.padding/2,a.width=a.width+a.padding/2,a.intersect=function(E){return kh.rect(a,E)},p},xBt={rhombus:vBt,question:vBt,rect:q$e,labelRect:H$e,rectWithTitle:V$e,choice:O$e,circle:U$e,doublecircle:W$e,stadium:G$e,hexagon:P$e,rect_left_inv_arrow:F$e,lean_right:N$e,lean_left:B$e,trapezoid:R$e,inv_trapezoid:j$e,rect_right_inv_arrow:$$e,cylinder:z$e,start:K$e,end:(i,a)=>{const f=i.insert("g").attr("class","node default").attr("id",a.domId||a.id),p=f.insert("circle",":first-child"),w=f.insert("circle",":first-child");return w.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),p.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),tf(a,w),a.intersect=function(m){return kh.circle(a,7,m)},f},note:I$e,subroutine:Y$e,fork:yBt,join:yBt,class_box:(i,a)=>{const f=a.padding/2,p=4,w=8;let m;a.classes?m="node "+a.classes:m="node default";const b=i.insert("g").attr("class",m).attr("id",a.domId||a.id),E=b.insert("rect",":first-child"),_=b.insert("line"),A=b.insert("line");let I=0,B=p;const N=b.insert("g").attr("class","label");let R=0;const z=a.classData.annotations&&a.classData.annotations[0],W=a.classData.annotations[0]?"«"+a.classData.annotations[0]+"»":"",et=N.node().appendChild(gp(W,a.labelStyle,!0,!0));let st=et.getBBox();if(o1(Oe().flowchart.htmlLabels)){const vt=et.children[0],X=yr(et);st=vt.getBoundingClientRect(),X.attr("width",st.width),X.attr("height",st.height)}a.classData.annotations[0]&&(B+=st.height+p,I+=st.width);let at=a.classData.label;a.classData.type!==void 0&&a.classData.type!==""&&(Oe().flowchart.htmlLabels?at+="<"+a.classData.type+">":at+="<"+a.classData.type+">");const bt=N.node().appendChild(gp(at,a.labelStyle,!0,!0));yr(bt).attr("class","classTitle");let mt=bt.getBBox();if(o1(Oe().flowchart.htmlLabels)){const vt=bt.children[0],X=yr(bt);mt=vt.getBoundingClientRect(),X.attr("width",mt.width),X.attr("height",mt.height)}B+=mt.height+p,mt.width>I&&(I=mt.width);const yt=[];a.classData.members.forEach(vt=>{const X=vt.getDisplayDetails();let pt=X.displayText;Oe().flowchart.htmlLabels&&(pt=pt.replace(//g,">"));const U=N.node().appendChild(gp(pt,X.cssStyle?X.cssStyle:a.labelStyle,!0,!0));let Tt=U.getBBox();if(o1(Oe().flowchart.htmlLabels)){const nt=U.children[0],It=yr(U);Tt=nt.getBoundingClientRect(),It.attr("width",Tt.width),It.attr("height",Tt.height)}Tt.width>I&&(I=Tt.width),B+=Tt.height+p,yt.push(U)}),B+=w;const ft=[];if(a.classData.methods.forEach(vt=>{const X=vt.getDisplayDetails();let pt=X.displayText;Oe().flowchart.htmlLabels&&(pt=pt.replace(//g,">"));const U=N.node().appendChild(gp(pt,X.cssStyle?X.cssStyle:a.labelStyle,!0,!0));let Tt=U.getBBox();if(o1(Oe().flowchart.htmlLabels)){const nt=U.children[0],It=yr(U);Tt=nt.getBoundingClientRect(),It.attr("width",Tt.width),It.attr("height",Tt.height)}Tt.width>I&&(I=Tt.width),B+=Tt.height+p,ft.push(U)}),B+=w,z){let vt=(I-st.width)/2;yr(et).attr("transform","translate( "+(-1*I/2+vt)+", "+-1*B/2+")"),R=st.height+p}let ut=(I-mt.width)/2;return yr(bt).attr("transform","translate( "+(-1*I/2+ut)+", "+(-1*B/2+R)+")"),R+=mt.height+p,_.attr("class","divider").attr("x1",-I/2-f).attr("x2",I/2+f).attr("y1",-B/2-f+w+R).attr("y2",-B/2-f+w+R),R+=w,yt.forEach(vt=>{yr(vt).attr("transform","translate( "+-I/2+", "+(-1*B/2+R+w/2)+")");const X=vt==null?void 0:vt.getBBox();R+=((X==null?void 0:X.height)??0)+p}),R+=w,A.attr("class","divider").attr("x1",-I/2-f).attr("x2",I/2+f).attr("y1",-B/2-f+w+R).attr("y2",-B/2-f+w+R),R+=w,ft.forEach(vt=>{yr(vt).attr("transform","translate( "+-I/2+", "+(-1*B/2+R)+")");const X=vt==null?void 0:vt.getBBox();R+=((X==null?void 0:X.height)??0)+p}),E.attr("class","outer title-state").attr("x",-I/2-f).attr("y",-(B/2)-f).attr("width",I+a.padding).attr("height",B+a.padding),tf(a,E),a.intersect=function(vt){return kh.rect(a,vt)},b}};let cL={};const kBt=async(i,a,f)=>{let p,w;if(a.link){let m;Oe().securityLevel==="sandbox"?m="_top":a.linkTarget&&(m=a.linkTarget||"_blank"),p=i.insert("svg:a").attr("xlink:href",a.link).attr("target",m),w=await xBt[a.shape](p,a,f)}else w=await xBt[a.shape](i,a,f),p=w;return a.tooltip&&w.attr("title",a.tooltip),a.class&&w.attr("class","node default "+a.class),cL[a.id]=p,a.haveCallback&&cL[a.id].attr("class",cL[a.id].attr("class")+" clickable"),p},X$e=(i,a)=>{cL[a.id]=i},Q$e=()=>{cL={}},EBt=i=>{const a=cL[i.id];Ut.trace("Transforming node",i.diff,i,"translate("+(i.x-i.width/2-5)+", "+i.width/2+")");const f=8,p=i.diff||0;return i.clusterNode?a.attr("transform","translate("+(i.x+p-i.width/2)+", "+(i.y-i.height/2-f)+")"):a.attr("transform","translate("+i.x+", "+i.y+")"),p},Z$e={rect:(i,a)=>{Ut.info("Creating subgraph rect for ",a.id,a);const f=i.insert("g").attr("class","cluster"+(a.class?" "+a.class:"")).attr("id",a.id),p=f.insert("rect",":first-child"),w=o1(Oe().flowchart.htmlLabels),m=f.insert("g").attr("class","cluster-label"),b=a.labelType==="markdown"?EY(m,a.labelText,{style:a.labelStyle,useHtmlLabels:w}):m.node().appendChild(gp(a.labelText,a.labelStyle,void 0,!0));let E=b.getBBox();if(o1(Oe().flowchart.htmlLabels)){const N=b.children[0],R=yr(b);E=N.getBoundingClientRect(),R.attr("width",E.width),R.attr("height",E.height)}const _=0*a.padding,A=_/2,I=a.width<=E.width+_?E.width+_:a.width;a.width<=E.width+_?a.diff=(E.width-a.width)/2-a.padding/2:a.diff=-a.padding/2,Ut.trace("Data ",a,JSON.stringify(a)),p.attr("style",a.style).attr("rx",a.rx).attr("ry",a.ry).attr("x",a.x-I/2).attr("y",a.y-a.height/2-A).attr("width",I).attr("height",a.height+_),w?m.attr("transform","translate("+(a.x-E.width/2)+", "+(a.y-a.height/2)+")"):m.attr("transform","translate("+a.x+", "+(a.y-a.height/2)+")");const B=p.node().getBBox();return a.width=B.width,a.height=B.height,a.intersect=function(N){return _F(a,N)},f},roundedWithTitle:(i,a)=>{const f=i.insert("g").attr("class",a.classes).attr("id",a.id),p=f.insert("rect",":first-child"),w=f.insert("g").attr("class","cluster-label"),m=f.append("rect"),b=w.node().appendChild(gp(a.labelText,a.labelStyle,void 0,!0));let E=b.getBBox();if(o1(Oe().flowchart.htmlLabels)){const N=b.children[0],R=yr(b);E=N.getBoundingClientRect(),R.attr("width",E.width),R.attr("height",E.height)}E=b.getBBox();const _=0*a.padding,A=_/2,I=a.width<=E.width+a.padding?E.width+a.padding:a.width;a.width<=E.width+a.padding?a.diff=(E.width+a.padding*0-a.width)/2:a.diff=-a.padding/2,p.attr("class","outer").attr("x",a.x-I/2-A).attr("y",a.y-a.height/2-A).attr("width",I+_).attr("height",a.height+_),m.attr("class","inner").attr("x",a.x-I/2-A).attr("y",a.y-a.height/2-A+E.height-1).attr("width",I+_).attr("height",a.height+_-E.height-3),w.attr("transform","translate("+(a.x-E.width/2)+", "+(a.y-a.height/2-a.padding/3+(o1(Oe().flowchart.htmlLabels)?5:3))+")");const B=p.node().getBBox();return a.height=B.height,a.intersect=function(N){return _F(a,N)},f},noteGroup:(i,a)=>{const f=i.insert("g").attr("class","note-cluster").attr("id",a.id),p=f.insert("rect",":first-child"),w=0*a.padding,m=w/2;p.attr("rx",a.rx).attr("ry",a.ry).attr("x",a.x-a.width/2-m).attr("y",a.y-a.height/2-m).attr("width",a.width+w).attr("height",a.height+w).attr("fill","none");const b=p.node().getBBox();return a.width=b.width,a.height=b.height,a.intersect=function(E){return _F(a,E)},f},divider:(i,a)=>{const f=i.insert("g").attr("class",a.classes).attr("id",a.id),p=f.insert("rect",":first-child"),w=0*a.padding,m=w/2;p.attr("class","divider").attr("x",a.x-a.width/2-m).attr("y",a.y-a.height/2).attr("width",a.width+w).attr("height",a.height+w);const b=p.node().getBBox();return a.width=b.width,a.height=b.height,a.diff=-a.padding/2,a.intersect=function(E){return _F(a,E)},f}};let TBt={};const J$e=(i,a)=>{Ut.trace("Inserting cluster");const f=a.shape||"rect";TBt[a.id]=Z$e[f](i,a)},tze=()=>{TBt={}},vk={aggregation:18,extension:18,composition:18,dependency:6,lollipop:13.5,arrow_point:5.3};function _Y(i,a){i=SY(i),a=SY(a);const[f,p]=[i.x,i.y],[w,m]=[a.x,a.y],b=w-f,E=m-p;return{angle:Math.atan(E/b),deltaX:b,deltaY:E}}const SY=i=>Array.isArray(i)?{x:i[0],y:i[1]}:i,CBt=i=>({x:function(a,f,p){let w=0;if(f===0&&Object.hasOwn(vk,i.arrowTypeStart)){const{angle:m,deltaX:b}=_Y(p[0],p[1]);w=vk[i.arrowTypeStart]*Math.cos(m)*(b>=0?1:-1)}else if(f===p.length-1&&Object.hasOwn(vk,i.arrowTypeEnd)){const{angle:m,deltaX:b}=_Y(p[p.length-1],p[p.length-2]);w=vk[i.arrowTypeEnd]*Math.cos(m)*(b>=0?1:-1)}return SY(a).x+w},y:function(a,f,p){let w=0;if(f===0&&Object.hasOwn(vk,i.arrowTypeStart)){const{angle:m,deltaY:b}=_Y(p[0],p[1]);w=vk[i.arrowTypeStart]*Math.abs(Math.sin(m))*(b>=0?1:-1)}else if(f===p.length-1&&Object.hasOwn(vk,i.arrowTypeEnd)){const{angle:m,deltaY:b}=_Y(p[p.length-1],p[p.length-2]);w=vk[i.arrowTypeEnd]*Math.abs(Math.sin(m))*(b>=0?1:-1)}return SY(a).y+w}});let AY={},Bd={};const eze=()=>{AY={},Bd={}},_Bt=(i,a)=>{const f=o1(Oe().flowchart.htmlLabels),p=a.labelType==="markdown"?EY(i,a.label,{style:a.labelStyle,useHtmlLabels:f,addSvgBackground:!0}):gp(a.label,a.labelStyle);Ut.info("abc82",a,a.labelType);const w=i.insert("g").attr("class","edgeLabel"),m=w.insert("g").attr("class","label");m.node().appendChild(p);let b=p.getBBox();if(f){const _=p.children[0],A=yr(p);b=_.getBoundingClientRect(),A.attr("width",b.width),A.attr("height",b.height)}m.attr("transform","translate("+-b.width/2+", "+-b.height/2+")"),AY[a.id]=w,a.width=b.width,a.height=b.height;let E;if(a.startLabelLeft){const _=gp(a.startLabelLeft,a.labelStyle),A=i.insert("g").attr("class","edgeTerminals"),I=A.insert("g").attr("class","inner");E=I.node().appendChild(_);const B=_.getBBox();I.attr("transform","translate("+-B.width/2+", "+-B.height/2+")"),Bd[a.id]||(Bd[a.id]={}),Bd[a.id].startLeft=A,LY(E,a.startLabelLeft)}if(a.startLabelRight){const _=gp(a.startLabelRight,a.labelStyle),A=i.insert("g").attr("class","edgeTerminals"),I=A.insert("g").attr("class","inner");E=A.node().appendChild(_),I.node().appendChild(_);const B=_.getBBox();I.attr("transform","translate("+-B.width/2+", "+-B.height/2+")"),Bd[a.id]||(Bd[a.id]={}),Bd[a.id].startRight=A,LY(E,a.startLabelRight)}if(a.endLabelLeft){const _=gp(a.endLabelLeft,a.labelStyle),A=i.insert("g").attr("class","edgeTerminals"),I=A.insert("g").attr("class","inner");E=I.node().appendChild(_);const B=_.getBBox();I.attr("transform","translate("+-B.width/2+", "+-B.height/2+")"),A.node().appendChild(_),Bd[a.id]||(Bd[a.id]={}),Bd[a.id].endLeft=A,LY(E,a.endLabelLeft)}if(a.endLabelRight){const _=gp(a.endLabelRight,a.labelStyle),A=i.insert("g").attr("class","edgeTerminals"),I=A.insert("g").attr("class","inner");E=I.node().appendChild(_);const B=_.getBBox();I.attr("transform","translate("+-B.width/2+", "+-B.height/2+")"),A.node().appendChild(_),Bd[a.id]||(Bd[a.id]={}),Bd[a.id].endRight=A,LY(E,a.endLabelRight)}return p};function LY(i,a){Oe().flowchart.htmlLabels&&i&&(i.style.width=a.length*9+"px",i.style.height="12px")}const nze=(i,a)=>{Ut.info("Moving label abc78 ",i.id,i.label,AY[i.id]);let f=a.updatedPath?a.updatedPath:a.originalPath;if(i.label){const p=AY[i.id];let w=i.x,m=i.y;if(f){const b=$a.calcLabelPosition(f);Ut.info("Moving label "+i.label+" from (",w,",",m,") to (",b.x,",",b.y,") abc78"),a.updatedPath&&(w=b.x,m=b.y)}p.attr("transform","translate("+w+", "+m+")")}if(i.startLabelLeft){const p=Bd[i.id].startLeft;let w=i.x,m=i.y;if(f){const b=$a.calcTerminalLabelPosition(i.arrowTypeStart?10:0,"start_left",f);w=b.x,m=b.y}p.attr("transform","translate("+w+", "+m+")")}if(i.startLabelRight){const p=Bd[i.id].startRight;let w=i.x,m=i.y;if(f){const b=$a.calcTerminalLabelPosition(i.arrowTypeStart?10:0,"start_right",f);w=b.x,m=b.y}p.attr("transform","translate("+w+", "+m+")")}if(i.endLabelLeft){const p=Bd[i.id].endLeft;let w=i.x,m=i.y;if(f){const b=$a.calcTerminalLabelPosition(i.arrowTypeEnd?10:0,"end_left",f);w=b.x,m=b.y}p.attr("transform","translate("+w+", "+m+")")}if(i.endLabelRight){const p=Bd[i.id].endRight;let w=i.x,m=i.y;if(f){const b=$a.calcTerminalLabelPosition(i.arrowTypeEnd?10:0,"end_right",f);w=b.x,m=b.y}p.attr("transform","translate("+w+", "+m+")")}},rze=(i,a)=>{const f=i.x,p=i.y,w=Math.abs(a.x-f),m=Math.abs(a.y-p),b=i.width/2,E=i.height/2;return w>=b||m>=E},ize=(i,a,f)=>{Ut.warn(`intersection calc abc89: + outsidePoint: ${JSON.stringify(a)} + insidePoint : ${JSON.stringify(f)} + node : x:${i.x} y:${i.y} w:${i.width} h:${i.height}`);const p=i.x,w=i.y,m=Math.abs(p-f.x),b=i.width/2;let E=f.xMath.abs(p-a.x)*_){let B=f.y{Ut.warn("abc88 cutPathAtIntersect",i,a);let f=[],p=i[0],w=!1;return i.forEach(m=>{if(Ut.info("abc88 checking point",m,a),!rze(a,m)&&!w){const b=ize(a,p,m);Ut.warn("abc88 inside",m,p,b),Ut.warn("abc88 intersection",b);let E=!1;f.forEach(_=>{E=E||_.x===b.x&&_.y===b.y}),f.some(_=>_.x===b.x&&_.y===b.y)?Ut.warn("abc88 no intersect",b,f):f.push(b),w=!0}else Ut.warn("abc88 outside",m,p),p=m,w||f.push(m)}),Ut.warn("abc88 returning points",f),f},sze=function(i,a,f,p,w,m,b){let E=f.points,_=!1;const A=m.node(a.v);var I=m.node(a.w);Ut.info("abc88 InsertEdge: ",f),I.intersect&&A.intersect&&(E=E.slice(1,f.points.length-1),E.unshift(A.intersect(E[0])),Ut.info("Last point",E[E.length-1],I,I.intersect(E[E.length-1])),E.push(I.intersect(E[E.length-1]))),f.toCluster&&(Ut.info("to cluster abc88",p[f.toCluster]),E=SBt(f.points,p[f.toCluster].node),_=!0),f.fromCluster&&(Ut.info("from cluster abc88",p[f.fromCluster]),E=SBt(E.reverse(),p[f.fromCluster].node).reverse(),_=!0);const B=E.filter(mt=>!Number.isNaN(mt.y));let N=HP;f.curve&&(w==="graph"||w==="flowchart")&&(N=f.curve);const{x:R,y:z}=CBt(f),W=E5().x(R).y(z).curve(N);let et;switch(f.thickness){case"normal":et="edge-thickness-normal";break;case"thick":et="edge-thickness-thick";break;case"invisible":et="edge-thickness-thick";break;default:et=""}switch(f.pattern){case"solid":et+=" edge-pattern-solid";break;case"dotted":et+=" edge-pattern-dotted";break;case"dashed":et+=" edge-pattern-dashed";break}const st=i.append("path").attr("d",W(B)).attr("id",f.id).attr("class"," "+et+(f.classes?" "+f.classes:"")).attr("style",f.style);let at="";switch((Oe().flowchart.arrowMarkerAbsolute||Oe().state.arrowMarkerAbsolute)&&(at=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,at=at.replace(/\(/g,"\\("),at=at.replace(/\)/g,"\\)")),Ut.info("arrowTypeStart",f.arrowTypeStart),Ut.info("arrowTypeEnd",f.arrowTypeEnd),f.arrowTypeStart){case"arrow_cross":st.attr("marker-start","url("+at+"#"+b+"_"+w+"-crossStart)");break;case"arrow_point":st.attr("marker-start","url("+at+"#"+b+"_"+w+"-pointStart)");break;case"arrow_barb":st.attr("marker-start","url("+at+"#"+b+"_"+w+"-barbStart)");break;case"arrow_circle":st.attr("marker-start","url("+at+"#"+b+"_"+w+"-circleStart)");break;case"aggregation":st.attr("marker-start","url("+at+"#"+b+"_"+w+"-aggregationStart)");break;case"extension":st.attr("marker-start","url("+at+"#"+b+"_"+w+"-extensionStart)");break;case"composition":st.attr("marker-start","url("+at+"#"+b+"_"+w+"-compositionStart)");break;case"dependency":st.attr("marker-start","url("+at+"#"+b+"_"+w+"-dependencyStart)");break;case"lollipop":st.attr("marker-start","url("+at+"#"+b+"_"+w+"-lollipopStart)");break}switch(f.arrowTypeEnd){case"arrow_cross":st.attr("marker-end","url("+at+"#"+b+"_"+w+"-crossEnd)");break;case"arrow_point":st.attr("marker-end","url("+at+"#"+b+"_"+w+"-pointEnd)");break;case"arrow_barb":st.attr("marker-end","url("+at+"#"+b+"_"+w+"-barbEnd)");break;case"arrow_circle":st.attr("marker-end","url("+at+"#"+b+"_"+w+"-circleEnd)");break;case"aggregation":st.attr("marker-end","url("+at+"#"+b+"_"+w+"-aggregationEnd)");break;case"extension":st.attr("marker-end","url("+at+"#"+b+"_"+w+"-extensionEnd)");break;case"composition":st.attr("marker-end","url("+at+"#"+b+"_"+w+"-compositionEnd)");break;case"dependency":st.attr("marker-end","url("+at+"#"+b+"_"+w+"-dependencyEnd)");break;case"lollipop":st.attr("marker-end","url("+at+"#"+b+"_"+w+"-lollipopEnd)");break}let bt={};return _&&(bt.updatedPath=E),bt.originalPath=f.points,bt},ABt=async(i,a,f,p,w)=>{Ut.info("Graph in recursive render: XXX",P5(a),w);const m=a.graph().rankdir;Ut.trace("Dir in recursive render - dir:",m);const b=i.insert("g").attr("class","root");a.nodes()?Ut.info("Recursive render XXX",a.nodes()):Ut.info("No nodes found for",a),a.edges().length>0&&Ut.trace("Recursive edges",a.edge(a.edges()[0]));const E=b.insert("g").attr("class","clusters"),_=b.insert("g").attr("class","edgePaths"),A=b.insert("g").attr("class","edgeLabels"),I=b.insert("g").attr("class","nodes");await Promise.all(a.nodes().map(async function(N){const R=a.node(N);if(w!==void 0){const z=JSON.parse(JSON.stringify(w.clusterData));Ut.info("Setting data for cluster XXX (",N,") ",z,w),a.setNode(w.id,z),a.parent(N)||(Ut.trace("Setting parent",N,w.id),a.setParent(N,w.id,z))}if(Ut.info("(Insert) Node XXX"+N+": "+JSON.stringify(a.node(N))),R&&R.clusterNode){Ut.info("Cluster identified",N,R.width,a.node(N));const z=await ABt(I,R.graph,f,p,a.node(N)),W=z.elem;tf(R,W),R.diff=z.diff||0,Ut.info("Node bounds (abc123)",N,R,R.width,R.x,R.y),X$e(W,R),Ut.warn("Recursive render complete ",W,R)}else a.children(N).length>0?(Ut.info("Cluster - the non recursive path XXX",N,R.id,R,a),Ut.info(CF(R.id,a)),Ho[R.id]={id:CF(R.id,a),node:R}):(Ut.info("Node - the non recursive path",N,R.id,R),await kBt(I,a.node(N),m))})),a.edges().forEach(function(N){const R=a.edge(N.v,N.w,N.name);Ut.info("Edge "+N.v+" -> "+N.w+": "+JSON.stringify(N)),Ut.info("Edge "+N.v+" -> "+N.w+": ",N," ",JSON.stringify(a.edge(N))),Ut.info("Fix",Ho,"ids:",N.v,N.w,"Translateing: ",Ho[N.v],Ho[N.w]),_Bt(A,R)}),a.edges().forEach(function(N){Ut.info("Edge "+N.v+" -> "+N.w+": "+JSON.stringify(N))}),Ut.info("#############################################"),Ut.info("### Layout ###"),Ut.info("#############################################"),Ut.info(a),aL(a),Ut.info("Graph after layout:",P5(a));let B=0;return S$e(a).forEach(function(N){const R=a.node(N);Ut.info("Position "+N+": "+JSON.stringify(a.node(N))),Ut.info("Position "+N+": ("+R.x,","+R.y,") width: ",R.width," height: ",R.height),R&&R.clusterNode?EBt(R):a.children(N).length>0?(J$e(E,R),Ho[R.id].node=R):EBt(R)}),a.edges().forEach(function(N){const R=a.edge(N);Ut.info("Edge "+N.v+" -> "+N.w+": "+JSON.stringify(R),R);const z=sze(_,N,R,Ho,f,a,p);nze(R,z)}),a.nodes().forEach(function(N){const R=a.node(N);Ut.info(N,R.type,R.diff),R.type==="group"&&(B=R.diff)}),{elem:b,diff:B}},N0t=async(i,a,f,p,w)=>{PNt(i,f,p,w),Q$e(),eze(),tze(),T$e(),Ut.warn("Graph at first:",JSON.stringify(P5(a))),_$e(a),Ut.warn("Graph after:",JSON.stringify(P5(a))),await ABt(i,a,p,w)},LBt={},aze=function(i){const a=Object.keys(i);for(const f of a)LBt[f]=i[f]},MBt=function(i,a,f,p,w,m){const b=p.select(`[id="${f}"]`);Object.keys(i).forEach(function(_){const A=i[_];let I="default";A.classes.length>0&&(I=A.classes.join(" ")),I=I+" flowchart-label";const B=im(A.styles);let N=A.text!==void 0?A.text:A.id,R;if(Ut.info("vertex",A,A.labelType),A.labelType==="markdown")Ut.info("vertex",A,A.labelType);else if(o1(Oe().flowchart.htmlLabels)){const et={label:N.replace(/fa[blrs]?:fa-[\w-]+/g,st=>``)};R=b0t(b,et).node(),R.parentNode.removeChild(R)}else{const et=w.createElementNS("http://www.w3.org/2000/svg","text");et.setAttribute("style",B.labelStyle.replace("color:","fill:"));const st=N.split(Kr.lineBreakRegex);for(const at of st){const bt=w.createElementNS("http://www.w3.org/2000/svg","tspan");bt.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),bt.setAttribute("dy","1em"),bt.setAttribute("x","1"),bt.textContent=at,et.appendChild(bt)}R=et}let z=0,W="";switch(A.type){case"round":z=5,W="rect";break;case"square":W="rect";break;case"diamond":W="question";break;case"hexagon":W="hexagon";break;case"odd":W="rect_left_inv_arrow";break;case"lean_right":W="lean_right";break;case"lean_left":W="lean_left";break;case"trapezoid":W="trapezoid";break;case"inv_trapezoid":W="inv_trapezoid";break;case"odd_right":W="rect_left_inv_arrow";break;case"circle":W="circle";break;case"ellipse":W="ellipse";break;case"stadium":W="stadium";break;case"subroutine":W="subroutine";break;case"cylinder":W="cylinder";break;case"group":W="rect";break;case"doublecircle":W="doublecircle";break;default:W="rect"}a.setNode(A.id,{labelStyle:B.labelStyle,shape:W,labelText:N,labelType:A.labelType,rx:z,ry:z,class:I,style:B.style,id:A.id,link:A.link,linkTarget:A.linkTarget,tooltip:m.db.getTooltip(A.id)||"",domId:m.db.lookUpDomId(A.id),haveCallback:A.haveCallback,width:A.type==="group"?500:void 0,dir:A.dir,type:A.type,props:A.props,padding:Oe().flowchart.padding}),Ut.info("setNode",{labelStyle:B.labelStyle,labelType:A.labelType,shape:W,labelText:N,rx:z,ry:z,class:I,style:B.style,id:A.id,domId:m.db.lookUpDomId(A.id),width:A.type==="group"?500:void 0,type:A.type,dir:A.dir,props:A.props,padding:Oe().flowchart.padding})})},DBt=function(i,a,f){Ut.info("abc78 edges = ",i);let p=0,w={},m,b;if(i.defaultStyle!==void 0){const E=im(i.defaultStyle);m=E.style,b=E.labelStyle}i.forEach(function(E){p++;const _="L-"+E.start+"-"+E.end;w[_]===void 0?(w[_]=0,Ut.info("abc78 new entry",_,w[_])):(w[_]++,Ut.info("abc78 new entry",_,w[_]));let A=_+"-"+w[_];Ut.info("abc78 new link id to be used is",_,A,w[_]);const I="LS-"+E.start,B="LE-"+E.end,N={style:"",labelStyle:""};switch(N.minlen=E.length||1,E.type==="arrow_open"?N.arrowhead="none":N.arrowhead="normal",N.arrowTypeStart="arrow_open",N.arrowTypeEnd="arrow_open",E.type){case"double_arrow_cross":N.arrowTypeStart="arrow_cross";case"arrow_cross":N.arrowTypeEnd="arrow_cross";break;case"double_arrow_point":N.arrowTypeStart="arrow_point";case"arrow_point":N.arrowTypeEnd="arrow_point";break;case"double_arrow_circle":N.arrowTypeStart="arrow_circle";case"arrow_circle":N.arrowTypeEnd="arrow_circle";break}let R="",z="";switch(E.stroke){case"normal":R="fill:none;",m!==void 0&&(R=m),b!==void 0&&(z=b),N.thickness="normal",N.pattern="solid";break;case"dotted":N.thickness="normal",N.pattern="dotted",N.style="fill:none;stroke-width:2px;stroke-dasharray:3;";break;case"thick":N.thickness="thick",N.pattern="solid",N.style="stroke-width: 3.5px;fill:none;";break;case"invisible":N.thickness="invisible",N.pattern="solid",N.style="stroke-width: 0;fill:none;";break}if(E.style!==void 0){const W=im(E.style);R=W.style,z=W.labelStyle}N.style=N.style+=R,N.labelStyle=N.labelStyle+=z,E.interpolate!==void 0?N.curve=ew(E.interpolate,cg):i.defaultInterpolate!==void 0?N.curve=ew(i.defaultInterpolate,cg):N.curve=ew(LBt.curve,cg),E.text===void 0?E.style!==void 0&&(N.arrowheadStyle="fill: #333"):(N.arrowheadStyle="fill: #333",N.labelpos="c"),N.labelType=E.labelType,N.label=E.text.replace(Kr.lineBreakRegex,` +`),E.style===void 0&&(N.style=N.style||"stroke: #333; stroke-width: 1.5px;fill:none;"),N.labelStyle=N.labelStyle.replace("color:","fill:"),N.id=A,N.classes="flowchart-link "+I+" "+B,a.setEdge(E.start,E.end,N,p)})},B0t={setConf:aze,addVertices:MBt,addEdges:DBt,getClasses:function(i,a){return a.db.getClasses()},draw:async function(i,a,f,p){Ut.info("Drawing flowchart");let w=p.db.getDirection();w===void 0&&(w="TD");const{securityLevel:m,flowchart:b}=Oe(),E=b.nodeSpacing||50,_=b.rankSpacing||50;let A;m==="sandbox"&&(A=yr("#i"+a));const I=yr(m==="sandbox"?A.nodes()[0].contentDocument.body:"body"),B=m==="sandbox"?A.nodes()[0].contentDocument:document,N=new c1({multigraph:!0,compound:!0}).setGraph({rankdir:w,nodesep:E,ranksep:_,marginx:0,marginy:0}).setDefaultEdgeLabel(function(){return{}});let R;const z=p.db.getSubGraphs();Ut.info("Subgraphs - ",z);for(let yt=z.length-1;yt>=0;yt--)R=z[yt],Ut.info("Subgraph - ",R),p.db.addVertex(R.id,{text:R.title,type:R.labelType},"group",void 0,R.classes,R.dir);const W=p.db.getVertices(),et=p.db.getEdges();Ut.info("Edges",et);let st=0;for(st=z.length-1;st>=0;st--){R=z[st],sMt("cluster").append("text");for(let yt=0;yt{const f=cCe,p=f(i,"r"),w=f(i,"g"),m=f(i,"b");return FA(p,w,m,a)},IBt=i=>`.label { + font-family: ${i.fontFamily}; + color: ${i.nodeTextColor||i.textColor}; + } + .cluster-label text { + fill: ${i.titleColor}; + } + .cluster-label span,p { + color: ${i.titleColor}; + } + + .label text,span,p { + fill: ${i.nodeTextColor||i.textColor}; + color: ${i.nodeTextColor||i.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${i.mainBkg}; + stroke: ${i.nodeBorder}; + stroke-width: 1px; + } + .flowchart-label text { + text-anchor: middle; + } + // .flowchart-label .text-outer-tspan { + // text-anchor: middle; + // } + // .flowchart-label .text-inner-tspan { + // text-anchor: start; + // } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${i.arrowheadColor}; + } + + .edgePath .path { + stroke: ${i.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${i.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${i.edgeLabelBackground}; + rect { + opacity: 0.5; + background-color: ${i.edgeLabelBackground}; + fill: ${i.edgeLabelBackground}; + } + text-align: center; + } + + /* For html labels only */ + .labelBkg { + background-color: ${oze(i.edgeLabelBackground,.5)}; + // background-color: + } + + .cluster rect { + fill: ${i.clusterBkg}; + stroke: ${i.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${i.titleColor}; + } + + .cluster span,p { + color: ${i.titleColor}; + } + /* .cluster div { + color: ${i.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${i.fontFamily}; + font-size: 12px; + background: ${i.tertiaryColor}; + border: 1px solid ${i.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${i.textColor}; + } +`,cze=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:Hdt,db:wT,renderer:B0t,styles:IBt,init:i=>{i.flowchart||(i.flowchart={}),i.flowchart.arrowMarkerAbsolute=i.arrowMarkerAbsolute,hRe.setConf(i.flowchart),wT.clear(),wT.setGen("gen-1")}}},Symbol.toStringTag,{value:"Module"})),uze=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:Hdt,db:wT,renderer:B0t,styles:IBt,init:i=>{i.flowchart||(i.flowchart={}),i.flowchart.arrowMarkerAbsolute=i.arrowMarkerAbsolute,cAe({flowchart:{arrowMarkerAbsolute:i.arrowMarkerAbsolute}}),B0t.setConf(i.flowchart),wT.clear(),wT.setGen("gen-2")}}},Symbol.toStringTag,{value:"Module"}));var R0t=function(){var i=function(vt,X,pt,U){for(pt=pt||{},U=vt.length;U--;pt[vt[U]]=X);return pt},a=[6,8,10,20,22,24,26,27,28],f=[1,10],p=[1,11],w=[1,12],m=[1,13],b=[1,14],E=[1,15],_=[1,21],A=[1,22],I=[1,23],B=[1,24],N=[1,25],R=[6,8,10,13,15,18,19,20,22,24,26,27,28,41,42,43,44,45],z=[1,34],W=[27,28,46,47],et=[41,42,43,44,45],st=[17,34],at=[1,54],bt=[1,53],mt=[17,34,36,38],yt={trace:function(){},yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,":":13,role:14,BLOCK_START:15,attributes:16,BLOCK_STOP:17,SQS:18,SQE:19,title:20,title_value:21,acc_title:22,acc_title_value:23,acc_descr:24,acc_descr_value:25,acc_descr_multiline_value:26,ALPHANUM:27,ENTITY_NAME:28,attribute:29,attributeType:30,attributeName:31,attributeKeyTypeList:32,attributeComment:33,ATTRIBUTE_WORD:34,attributeKeyType:35,COMMA:36,ATTRIBUTE_KEY:37,COMMENT:38,cardinality:39,relType:40,ZERO_OR_ONE:41,ZERO_OR_MORE:42,ONE_OR_MORE:43,ONLY_ONE:44,MD_PARENT:45,NON_IDENTIFYING:46,IDENTIFYING:47,WORD:48,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:":",15:"BLOCK_START",17:"BLOCK_STOP",18:"SQS",19:"SQE",20:"title",21:"title_value",22:"acc_title",23:"acc_title_value",24:"acc_descr",25:"acc_descr_value",26:"acc_descr_multiline_value",27:"ALPHANUM",28:"ENTITY_NAME",34:"ATTRIBUTE_WORD",36:"COMMA",37:"ATTRIBUTE_KEY",38:"COMMENT",41:"ZERO_OR_ONE",42:"ZERO_OR_MORE",43:"ONE_OR_MORE",44:"ONLY_ONE",45:"MD_PARENT",46:"NON_IDENTIFYING",47:"IDENTIFYING",48:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,4],[9,3],[9,1],[9,7],[9,6],[9,4],[9,2],[9,2],[9,2],[9,1],[11,1],[11,1],[16,1],[16,2],[29,2],[29,3],[29,3],[29,4],[30,1],[31,1],[32,1],[32,3],[35,1],[33,1],[12,3],[39,1],[39,1],[39,1],[39,1],[39,1],[40,1],[40,1],[14,1],[14,1],[14,1]],performAction:function(X,pt,U,Tt,nt,It,Ot){var Bt=It.length-1;switch(nt){case 1:break;case 2:this.$=[];break;case 3:It[Bt-1].push(It[Bt]),this.$=It[Bt-1];break;case 4:case 5:this.$=It[Bt];break;case 6:case 7:this.$=[];break;case 8:Tt.addEntity(It[Bt-4]),Tt.addEntity(It[Bt-2]),Tt.addRelationship(It[Bt-4],It[Bt],It[Bt-2],It[Bt-3]);break;case 9:Tt.addEntity(It[Bt-3]),Tt.addAttributes(It[Bt-3],It[Bt-1]);break;case 10:Tt.addEntity(It[Bt-2]);break;case 11:Tt.addEntity(It[Bt]);break;case 12:Tt.addEntity(It[Bt-6],It[Bt-4]),Tt.addAttributes(It[Bt-6],It[Bt-1]);break;case 13:Tt.addEntity(It[Bt-5],It[Bt-3]);break;case 14:Tt.addEntity(It[Bt-3],It[Bt-1]);break;case 15:case 16:this.$=It[Bt].trim(),Tt.setAccTitle(this.$);break;case 17:case 18:this.$=It[Bt].trim(),Tt.setAccDescription(this.$);break;case 19:case 43:this.$=It[Bt];break;case 20:case 41:case 42:this.$=It[Bt].replace(/"/g,"");break;case 21:case 29:this.$=[It[Bt]];break;case 22:It[Bt].push(It[Bt-1]),this.$=It[Bt];break;case 23:this.$={attributeType:It[Bt-1],attributeName:It[Bt]};break;case 24:this.$={attributeType:It[Bt-2],attributeName:It[Bt-1],attributeKeyTypeList:It[Bt]};break;case 25:this.$={attributeType:It[Bt-2],attributeName:It[Bt-1],attributeComment:It[Bt]};break;case 26:this.$={attributeType:It[Bt-3],attributeName:It[Bt-2],attributeKeyTypeList:It[Bt-1],attributeComment:It[Bt]};break;case 27:case 28:case 31:this.$=It[Bt];break;case 30:It[Bt-2].push(It[Bt]),this.$=It[Bt-2];break;case 32:this.$=It[Bt].replace(/"/g,"");break;case 33:this.$={cardA:It[Bt],relType:It[Bt-1],cardB:It[Bt-2]};break;case 34:this.$=Tt.Cardinality.ZERO_OR_ONE;break;case 35:this.$=Tt.Cardinality.ZERO_OR_MORE;break;case 36:this.$=Tt.Cardinality.ONE_OR_MORE;break;case 37:this.$=Tt.Cardinality.ONLY_ONE;break;case 38:this.$=Tt.Cardinality.MD_PARENT;break;case 39:this.$=Tt.Identification.NON_IDENTIFYING;break;case 40:this.$=Tt.Identification.IDENTIFYING;break}},table:[{3:1,4:[1,2]},{1:[3]},i(a,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,20:f,22:p,24:w,26:m,27:b,28:E},i(a,[2,7],{1:[2,1]}),i(a,[2,3]),{9:16,11:9,20:f,22:p,24:w,26:m,27:b,28:E},i(a,[2,5]),i(a,[2,6]),i(a,[2,11],{12:17,39:20,15:[1,18],18:[1,19],41:_,42:A,43:I,44:B,45:N}),{21:[1,26]},{23:[1,27]},{25:[1,28]},i(a,[2,18]),i(R,[2,19]),i(R,[2,20]),i(a,[2,4]),{11:29,27:b,28:E},{16:30,17:[1,31],29:32,30:33,34:z},{11:35,27:b,28:E},{40:36,46:[1,37],47:[1,38]},i(W,[2,34]),i(W,[2,35]),i(W,[2,36]),i(W,[2,37]),i(W,[2,38]),i(a,[2,15]),i(a,[2,16]),i(a,[2,17]),{13:[1,39]},{17:[1,40]},i(a,[2,10]),{16:41,17:[2,21],29:32,30:33,34:z},{31:42,34:[1,43]},{34:[2,27]},{19:[1,44]},{39:45,41:_,42:A,43:I,44:B,45:N},i(et,[2,39]),i(et,[2,40]),{14:46,27:[1,49],28:[1,48],48:[1,47]},i(a,[2,9]),{17:[2,22]},i(st,[2,23],{32:50,33:51,35:52,37:at,38:bt}),i([17,34,37,38],[2,28]),i(a,[2,14],{15:[1,55]}),i([27,28],[2,33]),i(a,[2,8]),i(a,[2,41]),i(a,[2,42]),i(a,[2,43]),i(st,[2,24],{33:56,36:[1,57],38:bt}),i(st,[2,25]),i(mt,[2,29]),i(st,[2,32]),i(mt,[2,31]),{16:58,17:[1,59],29:32,30:33,34:z},i(st,[2,26]),{35:60,37:at},{17:[1,61]},i(a,[2,13]),i(mt,[2,30]),i(a,[2,12])],defaultActions:{34:[2,27],41:[2,22]},parseError:function(X,pt){if(pt.recoverable)this.trace(X);else{var U=new Error(X);throw U.hash=pt,U}},parse:function(X){var pt=this,U=[0],Tt=[],nt=[null],It=[],Ot=this.table,Bt="",Et=0,Z=0,Ct=2,xt=1,Ht=It.slice.call(arguments,1),Le=Object.create(this.lexer),Ft={yy:{}};for(var gn in this.yy)Object.prototype.hasOwnProperty.call(this.yy,gn)&&(Ft.yy[gn]=this.yy[gn]);Le.setInput(X,Ft.yy),Ft.yy.lexer=Le,Ft.yy.parser=this,typeof Le.yylloc>"u"&&(Le.yylloc={});var Se=Le.yylloc;It.push(Se);var me=Le.options&&Le.options.ranges;typeof Ft.yy.parseError=="function"?this.parseError=Ft.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ve(){var on;return on=Tt.pop()||Le.lex()||xt,typeof on!="number"&&(on instanceof Array&&(Tt=on,on=Tt.pop()),on=pt.symbols_[on]||on),on}for(var Ye,ce,ke,zt,re={},se,Pe,te,Me;;){if(ce=U[U.length-1],this.defaultActions[ce]?ke=this.defaultActions[ce]:((Ye===null||typeof Ye>"u")&&(Ye=Ve()),ke=Ot[ce]&&Ot[ce][Ye]),typeof ke>"u"||!ke.length||!ke[0]){var de="";Me=[];for(se in Ot[ce])this.terminals_[se]&&se>Ct&&Me.push("'"+this.terminals_[se]+"'");Le.showPosition?de="Parse error on line "+(Et+1)+`: +`+Le.showPosition()+` +Expecting `+Me.join(", ")+", got '"+(this.terminals_[Ye]||Ye)+"'":de="Parse error on line "+(Et+1)+": Unexpected "+(Ye==xt?"end of input":"'"+(this.terminals_[Ye]||Ye)+"'"),this.parseError(de,{text:Le.match,token:this.terminals_[Ye]||Ye,line:Le.yylineno,loc:Se,expected:Me})}if(ke[0]instanceof Array&&ke.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ce+", token: "+Ye);switch(ke[0]){case 1:U.push(Ye),nt.push(Le.yytext),It.push(Le.yylloc),U.push(ke[1]),Ye=null,Z=Le.yyleng,Bt=Le.yytext,Et=Le.yylineno,Se=Le.yylloc;break;case 2:if(Pe=this.productions_[ke[1]][1],re.$=nt[nt.length-Pe],re._$={first_line:It[It.length-(Pe||1)].first_line,last_line:It[It.length-1].last_line,first_column:It[It.length-(Pe||1)].first_column,last_column:It[It.length-1].last_column},me&&(re._$.range=[It[It.length-(Pe||1)].range[0],It[It.length-1].range[1]]),zt=this.performAction.apply(re,[Bt,Z,Et,Ft.yy,ke[1],nt,It].concat(Ht)),typeof zt<"u")return zt;Pe&&(U=U.slice(0,-1*Pe*2),nt=nt.slice(0,-1*Pe),It=It.slice(0,-1*Pe)),U.push(this.productions_[ke[1]][0]),nt.push(re.$),It.push(re._$),te=Ot[U[U.length-2]][U[U.length-1]],U.push(te);break;case 3:return!0}}return!0}},ft=function(){var vt={EOF:1,parseError:function(pt,U){if(this.yy.parser)this.yy.parser.parseError(pt,U);else throw new Error(pt)},setInput:function(X,pt){return this.yy=pt||this.yy||{},this._input=X,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var X=this._input[0];this.yytext+=X,this.yyleng++,this.offset++,this.match+=X,this.matched+=X;var pt=X.match(/(?:\r\n?|\n).*/g);return pt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),X},unput:function(X){var pt=X.length,U=X.split(/(?:\r\n?|\n)/g);this._input=X+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-pt),this.offset-=pt;var Tt=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),U.length-1&&(this.yylineno-=U.length-1);var nt=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:U?(U.length===Tt.length?this.yylloc.first_column:0)+Tt[Tt.length-U.length].length-U[0].length:this.yylloc.first_column-pt},this.options.ranges&&(this.yylloc.range=[nt[0],nt[0]+this.yyleng-pt]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(X){this.unput(this.match.slice(X))},pastInput:function(){var X=this.matched.substr(0,this.matched.length-this.match.length);return(X.length>20?"...":"")+X.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var X=this.match;return X.length<20&&(X+=this._input.substr(0,20-X.length)),(X.substr(0,20)+(X.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var X=this.pastInput(),pt=new Array(X.length+1).join("-");return X+this.upcomingInput()+` +`+pt+"^"},test_match:function(X,pt){var U,Tt,nt;if(this.options.backtrack_lexer&&(nt={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(nt.yylloc.range=this.yylloc.range.slice(0))),Tt=X[0].match(/(?:\r\n?|\n).*/g),Tt&&(this.yylineno+=Tt.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Tt?Tt[Tt.length-1].length-Tt[Tt.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+X[0].length},this.yytext+=X[0],this.match+=X[0],this.matches=X,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(X[0].length),this.matched+=X[0],U=this.performAction.call(this,this.yy,this,pt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),U)return U;if(this._backtrack){for(var It in nt)this[It]=nt[It];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var X,pt,U,Tt;this._more||(this.yytext="",this.match="");for(var nt=this._currentRules(),It=0;Itpt[0].length)){if(pt=U,Tt=It,this.options.backtrack_lexer){if(X=this.test_match(U,nt[It]),X!==!1)return X;if(this._backtrack){pt=!1;continue}else return!1}else if(!this.options.flex)break}return pt?(X=this.test_match(pt,nt[Tt]),X!==!1?X:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var pt=this.next();return pt||this.lex()},begin:function(pt){this.conditionStack.push(pt)},popState:function(){var pt=this.conditionStack.length-1;return pt>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(pt){return pt=this.conditionStack.length-1-Math.abs(pt||0),pt>=0?this.conditionStack[pt]:"INITIAL"},pushState:function(pt){this.begin(pt)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(pt,U,Tt,nt){switch(Tt){case 0:return this.begin("acc_title"),22;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),24;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 10;case 8:break;case 9:return 8;case 10:return 28;case 11:return 48;case 12:return 4;case 13:return this.begin("block"),15;case 14:return 36;case 15:break;case 16:return 37;case 17:return 34;case 18:return 34;case 19:return 38;case 20:break;case 21:return this.popState(),17;case 22:return U.yytext[0];case 23:return 18;case 24:return 19;case 25:return 41;case 26:return 43;case 27:return 43;case 28:return 43;case 29:return 41;case 30:return 41;case 31:return 42;case 32:return 42;case 33:return 42;case 34:return 42;case 35:return 42;case 36:return 43;case 37:return 42;case 38:return 43;case 39:return 44;case 40:return 44;case 41:return 44;case 42:return 44;case 43:return 41;case 44:return 42;case 45:return 43;case 46:return 45;case 47:return 46;case 48:return 47;case 49:return 47;case 50:return 46;case 51:return 46;case 52:return 46;case 53:return 27;case 54:return U.yytext[0];case 55:return 6}},rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:,)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:(.*?)[~](.*?)*[~])/i,/^(?:[\*A-Za-z_][A-Za-z0-9\-_\[\]\(\)]*)/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\s*u\b)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:[A-Za-z_][A-Za-z0-9\-_]*)/i,/^(?:.)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[14,15,16,17,18,19,20,21,22],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55],inclusive:!0}}};return vt}();yt.lexer=ft;function ut(){this.yy={}}return ut.prototype=yt,yt.Parser=ut,new ut}();R0t.parser=R0t;const lze=R0t;let mk={},j0t=[];const hze={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"},fze={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},OBt=function(i,a=void 0){return mk[i]===void 0?(mk[i]={attributes:[],alias:a},Ut.info("Added new entity :",i)):mk[i]&&!mk[i].alias&&a&&(mk[i].alias=a,Ut.info(`Add alias '${a}' to entity '${i}'`)),mk[i]},dze={Cardinality:hze,Identification:fze,getConfig:()=>Oe().er,addEntity:OBt,addAttributes:function(i,a){let f=OBt(i),p;for(p=a.length-1;p>=0;p--)f.attributes.push(a[p]),Ut.debug("Added attribute ",a[p].attributeName)},getEntities:()=>mk,addRelationship:function(i,a,f,p){let w={entityA:i,roleA:a,entityB:f,relSpec:p};j0t.push(w),Ut.debug("Added new relationship :",w)},getRelationships:()=>j0t,clear:function(){mk={},j0t=[],hg()},setAccTitle:E0,getAccTitle:fg,setAccDescription:dg,getAccDescription:gg,setDiagramTitle:Nb,getDiagramTitle:pg},fm={ONLY_ONE_START:"ONLY_ONE_START",ONLY_ONE_END:"ONLY_ONE_END",ZERO_OR_ONE_START:"ZERO_OR_ONE_START",ZERO_OR_ONE_END:"ZERO_OR_ONE_END",ONE_OR_MORE_START:"ONE_OR_MORE_START",ONE_OR_MORE_END:"ONE_OR_MORE_END",ZERO_OR_MORE_START:"ZERO_OR_MORE_START",ZERO_OR_MORE_END:"ZERO_OR_MORE_END",MD_PARENT_END:"MD_PARENT_END",MD_PARENT_START:"MD_PARENT_START"},dm={ERMarkers:fm,insertMarkers:function(i,a){let f;i.append("defs").append("marker").attr("id",fm.MD_PARENT_START).attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id",fm.MD_PARENT_END).attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id",fm.ONLY_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",a.stroke).attr("fill","none").attr("d","M9,0 L9,18 M15,0 L15,18"),i.append("defs").append("marker").attr("id",fm.ONLY_ONE_END).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("stroke",a.stroke).attr("fill","none").attr("d","M3,0 L3,18 M9,0 L9,18"),f=i.append("defs").append("marker").attr("id",fm.ZERO_OR_ONE_START).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),f.append("circle").attr("stroke",a.stroke).attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),f.append("path").attr("stroke",a.stroke).attr("fill","none").attr("d","M9,0 L9,18"),f=i.append("defs").append("marker").attr("id",fm.ZERO_OR_ONE_END).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto"),f.append("circle").attr("stroke",a.stroke).attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),f.append("path").attr("stroke",a.stroke).attr("fill","none").attr("d","M21,0 L21,18"),i.append("defs").append("marker").attr("id",fm.ONE_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",a.stroke).attr("fill","none").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),i.append("defs").append("marker").attr("id",fm.ONE_OR_MORE_END).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("stroke",a.stroke).attr("fill","none").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18"),f=i.append("defs").append("marker").attr("id",fm.ZERO_OR_MORE_START).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),f.append("circle").attr("stroke",a.stroke).attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),f.append("path").attr("stroke",a.stroke).attr("fill","none").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18"),f=i.append("defs").append("marker").attr("id",fm.ZERO_OR_MORE_END).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto"),f.append("circle").attr("stroke",a.stroke).attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),f.append("path").attr("stroke",a.stroke).attr("fill","none").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")}},gze=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function pze(i){return typeof i=="string"&&gze.test(i)}const Rd=[];for(let i=0;i<256;++i)Rd.push((i+256).toString(16).slice(1));function bze(i,a=0){return(Rd[i[a+0]]+Rd[i[a+1]]+Rd[i[a+2]]+Rd[i[a+3]]+"-"+Rd[i[a+4]]+Rd[i[a+5]]+"-"+Rd[i[a+6]]+Rd[i[a+7]]+"-"+Rd[i[a+8]]+Rd[i[a+9]]+"-"+Rd[i[a+10]]+Rd[i[a+11]]+Rd[i[a+12]]+Rd[i[a+13]]+Rd[i[a+14]]+Rd[i[a+15]]).toLowerCase()}function wze(i){if(!pze(i))throw TypeError("Invalid UUID");let a;const f=new Uint8Array(16);return f[0]=(a=parseInt(i.slice(0,8),16))>>>24,f[1]=a>>>16&255,f[2]=a>>>8&255,f[3]=a&255,f[4]=(a=parseInt(i.slice(9,13),16))>>>8,f[5]=a&255,f[6]=(a=parseInt(i.slice(14,18),16))>>>8,f[7]=a&255,f[8]=(a=parseInt(i.slice(19,23),16))>>>8,f[9]=a&255,f[10]=(a=parseInt(i.slice(24,36),16))/1099511627776&255,f[11]=a/4294967296&255,f[12]=a>>>24&255,f[13]=a>>>16&255,f[14]=a>>>8&255,f[15]=a&255,f}function vze(i){i=unescape(encodeURIComponent(i));const a=[];for(let f=0;f>>32-a}function Eze(i){const a=[1518500249,1859775393,2400959708,3395469782],f=[1732584193,4023233417,2562383102,271733878,3285377520];if(typeof i=="string"){const b=unescape(encodeURIComponent(i));i=[];for(let E=0;E>>0;N=B,B=I,I=$0t(A,30)>>>0,A=_,_=W}f[0]=f[0]+_>>>0,f[1]=f[1]+A>>>0,f[2]=f[2]+I>>>0,f[3]=f[3]+B>>>0,f[4]=f[4]+N>>>0}return[f[0]>>24&255,f[0]>>16&255,f[0]>>8&255,f[0]&255,f[1]>>24&255,f[1]>>16&255,f[1]>>8&255,f[1]&255,f[2]>>24&255,f[2]>>16&255,f[2]>>8&255,f[2]&255,f[3]>>24&255,f[3]>>16&255,f[3]>>8&255,f[3]&255,f[4]>>24&255,f[4]>>16&255,f[4]>>8&255,f[4]&255]}const Tze=xze("v5",80,Eze),Cze=/[^\dA-Za-z](\W)*/g;let u1={},SF=new Map;const _ze=function(i){const a=Object.keys(i);for(const f of a)u1[f]=i[f]},Sze=(i,a,f)=>{const p=u1.entityPadding/3,w=u1.entityPadding/3,m=u1.fontSize*.85,b=a.node().getBBox(),E=[];let _=!1,A=!1,I=0,B=0,N=0,R=0,z=b.height+p*2,W=1;f.forEach(bt=>{bt.attributeKeyTypeList!==void 0&&bt.attributeKeyTypeList.length>0&&(_=!0),bt.attributeComment!==void 0&&(A=!0)}),f.forEach(bt=>{const mt=`${a.node().id}-attr-${W}`;let yt=0;const ft=YP(bt.attributeType),ut=i.append("text").classed("er entityLabel",!0).attr("id",`${mt}-type`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",Oe().fontFamily).style("font-size",m+"px").text(ft),vt=i.append("text").classed("er entityLabel",!0).attr("id",`${mt}-name`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",Oe().fontFamily).style("font-size",m+"px").text(bt.attributeName),X={};X.tn=ut,X.nn=vt;const pt=ut.node().getBBox(),U=vt.node().getBBox();if(I=Math.max(I,pt.width),B=Math.max(B,U.width),yt=Math.max(pt.height,U.height),_){const Tt=bt.attributeKeyTypeList!==void 0?bt.attributeKeyTypeList.join(","):"",nt=i.append("text").classed("er entityLabel",!0).attr("id",`${mt}-key`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",Oe().fontFamily).style("font-size",m+"px").text(Tt);X.kn=nt;const It=nt.node().getBBox();N=Math.max(N,It.width),yt=Math.max(yt,It.height)}if(A){const Tt=i.append("text").classed("er entityLabel",!0).attr("id",`${mt}-comment`).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","left").style("font-family",Oe().fontFamily).style("font-size",m+"px").text(bt.attributeComment||"");X.cn=Tt;const nt=Tt.node().getBBox();R=Math.max(R,nt.width),yt=Math.max(yt,nt.height)}X.height=yt,E.push(X),z+=yt+p*2,W+=1});let et=4;_&&(et+=2),A&&(et+=2);const st=I+B+N+R,at={width:Math.max(u1.minEntityWidth,Math.max(b.width+u1.entityPadding*2,st+w*et)),height:f.length>0?z:Math.max(u1.minEntityHeight,b.height+u1.entityPadding*2)};if(f.length>0){const bt=Math.max(0,(at.width-st-w*et)/(et/2));a.attr("transform","translate("+at.width/2+","+(p+b.height/2)+")");let mt=b.height+p*2,yt="attributeBoxOdd";E.forEach(ft=>{const ut=mt+p+ft.height/2;ft.tn.attr("transform","translate("+w+","+ut+")");const vt=i.insert("rect","#"+ft.tn.node().id).classed(`er ${yt}`,!0).attr("x",0).attr("y",mt).attr("width",I+w*2+bt).attr("height",ft.height+p*2),X=parseFloat(vt.attr("x"))+parseFloat(vt.attr("width"));ft.nn.attr("transform","translate("+(X+w)+","+ut+")");const pt=i.insert("rect","#"+ft.nn.node().id).classed(`er ${yt}`,!0).attr("x",X).attr("y",mt).attr("width",B+w*2+bt).attr("height",ft.height+p*2);let U=parseFloat(pt.attr("x"))+parseFloat(pt.attr("width"));if(_){ft.kn.attr("transform","translate("+(U+w)+","+ut+")");const Tt=i.insert("rect","#"+ft.kn.node().id).classed(`er ${yt}`,!0).attr("x",U).attr("y",mt).attr("width",N+w*2+bt).attr("height",ft.height+p*2);U=parseFloat(Tt.attr("x"))+parseFloat(Tt.attr("width"))}A&&(ft.cn.attr("transform","translate("+(U+w)+","+ut+")"),i.insert("rect","#"+ft.cn.node().id).classed(`er ${yt}`,"true").attr("x",U).attr("y",mt).attr("width",R+w*2+bt).attr("height",ft.height+p*2)),mt+=ft.height+p*2,yt=yt==="attributeBoxOdd"?"attributeBoxEven":"attributeBoxOdd"})}else at.height=Math.max(u1.minEntityHeight,z),a.attr("transform","translate("+at.width/2+","+at.height/2+")");return at},Aze=function(i,a,f){const p=Object.keys(a);let w;return p.forEach(function(m){const b=Pze(m,"entity");SF.set(m,b);const E=i.append("g").attr("id",b);w=w===void 0?b:w;const _="text-"+b,A=E.append("text").classed("er entityLabel",!0).attr("id",_).attr("x",0).attr("y",0).style("dominant-baseline","middle").style("text-anchor","middle").style("font-family",Oe().fontFamily).style("font-size",u1.fontSize+"px").text(a[m].alias??m),{width:I,height:B}=Sze(E,A,a[m].attributes),R=E.insert("rect","#"+_).classed("er entityBox",!0).attr("x",0).attr("y",0).attr("width",I).attr("height",B).node().getBBox();f.setNode(b,{width:R.width,height:R.height,shape:"rect",id:b})}),w},Lze=function(i,a){a.nodes().forEach(function(f){f!==void 0&&a.node(f)!==void 0&&i.select("#"+f).attr("transform","translate("+(a.node(f).x-a.node(f).width/2)+","+(a.node(f).y-a.node(f).height/2)+" )")})},PBt=function(i){return(i.entityA+i.roleA+i.entityB).replace(/\s/g,"")},Mze=function(i,a){return i.forEach(function(f){a.setEdge(SF.get(f.entityA),SF.get(f.entityB),{relationship:f},PBt(f))}),i};let FBt=0;const Dze=function(i,a,f,p,w){FBt++;const m=f.edge(SF.get(a.entityA),SF.get(a.entityB),PBt(a)),b=E5().x(function(z){return z.x}).y(function(z){return z.y}).curve(HP),E=i.insert("path","#"+p).classed("er relationshipLine",!0).attr("d",b(m.points)).style("stroke",u1.stroke).style("fill","none");a.relSpec.relType===w.db.Identification.NON_IDENTIFYING&&E.attr("stroke-dasharray","8,8");let _="";switch(u1.arrowMarkerAbsolute&&(_=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,_=_.replace(/\(/g,"\\("),_=_.replace(/\)/g,"\\)")),a.relSpec.cardA){case w.db.Cardinality.ZERO_OR_ONE:E.attr("marker-end","url("+_+"#"+dm.ERMarkers.ZERO_OR_ONE_END+")");break;case w.db.Cardinality.ZERO_OR_MORE:E.attr("marker-end","url("+_+"#"+dm.ERMarkers.ZERO_OR_MORE_END+")");break;case w.db.Cardinality.ONE_OR_MORE:E.attr("marker-end","url("+_+"#"+dm.ERMarkers.ONE_OR_MORE_END+")");break;case w.db.Cardinality.ONLY_ONE:E.attr("marker-end","url("+_+"#"+dm.ERMarkers.ONLY_ONE_END+")");break;case w.db.Cardinality.MD_PARENT:E.attr("marker-end","url("+_+"#"+dm.ERMarkers.MD_PARENT_END+")");break}switch(a.relSpec.cardB){case w.db.Cardinality.ZERO_OR_ONE:E.attr("marker-start","url("+_+"#"+dm.ERMarkers.ZERO_OR_ONE_START+")");break;case w.db.Cardinality.ZERO_OR_MORE:E.attr("marker-start","url("+_+"#"+dm.ERMarkers.ZERO_OR_MORE_START+")");break;case w.db.Cardinality.ONE_OR_MORE:E.attr("marker-start","url("+_+"#"+dm.ERMarkers.ONE_OR_MORE_START+")");break;case w.db.Cardinality.ONLY_ONE:E.attr("marker-start","url("+_+"#"+dm.ERMarkers.ONLY_ONE_START+")");break;case w.db.Cardinality.MD_PARENT:E.attr("marker-start","url("+_+"#"+dm.ERMarkers.MD_PARENT_START+")");break}const A=E.node().getTotalLength(),I=E.node().getPointAtLength(A*.5),B="rel"+FBt,R=i.append("text").classed("er relationshipLabel",!0).attr("id",B).attr("x",I.x).attr("y",I.y).style("text-anchor","middle").style("dominant-baseline","middle").style("font-family",Oe().fontFamily).style("font-size",u1.fontSize+"px").text(a.roleA).node().getBBox();i.insert("rect","#"+B).classed("er relationshipLabelBox",!0).attr("x",I.x-R.width/2).attr("y",I.y-R.height/2).attr("width",R.width).attr("height",R.height)},Ize=function(i,a,f,p){u1=Oe().er,Ut.info("Drawing ER diagram");const w=Oe().securityLevel;let m;w==="sandbox"&&(m=yr("#i"+a));const E=yr(w==="sandbox"?m.nodes()[0].contentDocument.body:"body").select(`[id='${a}']`);dm.insertMarkers(E,u1);let _;_=new c1({multigraph:!0,directed:!0,compound:!1}).setGraph({rankdir:u1.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel(function(){return{}});const A=Aze(E,p.db.getEntities(),_),I=Mze(p.db.getRelationships(),_);aL(_),Lze(E,_),I.forEach(function(W){Dze(E,W,_,A,p)});const B=u1.diagramPadding;$a.insertTitle(E,"entityTitleText",u1.titleTopMargin,p.db.getDiagramTitle());const N=E.node().getBBox(),R=N.width+B*2,z=N.height+B*2;k0(E,z,R,u1.useMaxWidth),E.attr("viewBox",`${N.x-B} ${N.y-B} ${R} ${z}`)},Oze="28e9f9db-3c8d-5aa5-9faf-44286ae5937c";function Pze(i="",a=""){const f=i.replace(Cze,"");return`${NBt(a)}${NBt(f)}${Tze(i,Oze)}`}function NBt(i=""){return i.length>0?`${i}-`:""}const Fze=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:lze,db:dze,renderer:{setConf:_ze,draw:Ize},styles:i=>` + .entityBox { + fill: ${i.mainBkg}; + stroke: ${i.nodeBorder}; + } + + .attributeBoxOdd { + fill: ${i.attributeBackgroundColorOdd}; + stroke: ${i.nodeBorder}; + } + + .attributeBoxEven { + fill: ${i.attributeBackgroundColorEven}; + stroke: ${i.nodeBorder}; + } + + .relationshipLabelBox { + fill: ${i.tertiaryColor}; + opacity: 0.7; + background-color: ${i.tertiaryColor}; + rect { + opacity: 0.5; + } + } + + .relationshipLine { + stroke: ${i.lineColor}; + } + + .entityTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${i.textColor}; + } + #MD_PARENT_START { + fill: #f5f5f5 !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; + } + #MD_PARENT_END { + fill: #f5f5f5 !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; + } + +`}},Symbol.toStringTag,{value:"Module"}));var z0t=function(){var i=function(yt,ft,ut,vt){for(ut=ut||{},vt=yt.length;vt--;ut[yt[vt]]=ft);return ut},a=[1,3],f=[1,6],p=[1,4],w=[1,5],m=[2,5],b=[1,12],E=[5,7,13,19,21,23,24,26,28,31,36,39,46],_=[7,13,19,21,23,24,26,28,31,36,39],A=[7,12,13,19,21,23,24,26,28,31,36,39],I=[7,13,46],B=[1,42],N=[1,41],R=[7,13,29,32,34,37,46],z=[1,55],W=[1,56],et=[1,57],st=[7,13,32,34,41,46],at={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,GG:5,document:6,EOF:7,":":8,DIR:9,options:10,body:11,OPT:12,NL:13,line:14,statement:15,commitStatement:16,mergeStatement:17,cherryPickStatement:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,section:24,branchStatement:25,CHECKOUT:26,ref:27,BRANCH:28,ORDER:29,NUM:30,CHERRY_PICK:31,COMMIT_ID:32,STR:33,COMMIT_TAG:34,EMPTYSTR:35,MERGE:36,COMMIT_TYPE:37,commitType:38,COMMIT:39,commit_arg:40,COMMIT_MSG:41,NORMAL:42,REVERSE:43,HIGHLIGHT:44,ID:45,";":46,$accept:0,$end:1},terminals_:{2:"error",5:"GG",7:"EOF",8:":",9:"DIR",12:"OPT",13:"NL",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"section",26:"CHECKOUT",28:"BRANCH",29:"ORDER",30:"NUM",31:"CHERRY_PICK",32:"COMMIT_ID",33:"STR",34:"COMMIT_TAG",35:"EMPTYSTR",36:"MERGE",37:"COMMIT_TYPE",39:"COMMIT",41:"COMMIT_MSG",42:"NORMAL",43:"REVERSE",44:"HIGHLIGHT",45:"ID",46:";"},productions_:[0,[3,2],[3,3],[3,4],[3,5],[6,0],[6,2],[10,2],[10,1],[11,0],[11,2],[14,2],[14,1],[15,1],[15,1],[15,1],[15,2],[15,2],[15,1],[15,1],[15,1],[15,2],[25,2],[25,4],[18,3],[18,5],[18,5],[18,5],[18,5],[17,2],[17,4],[17,4],[17,4],[17,6],[17,6],[17,6],[17,6],[17,6],[17,6],[17,8],[17,8],[17,8],[17,8],[17,8],[17,8],[16,2],[16,3],[16,3],[16,5],[16,5],[16,3],[16,5],[16,5],[16,5],[16,5],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,3],[16,5],[16,5],[16,5],[16,5],[16,5],[16,5],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,7],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[16,9],[40,0],[40,1],[38,1],[38,1],[38,1],[27,1],[27,1],[4,1],[4,1],[4,1]],performAction:function(ft,ut,vt,X,pt,U,Tt){var nt=U.length-1;switch(pt){case 2:return U[nt];case 3:return U[nt-1];case 4:return X.setDirection(U[nt-3]),U[nt-1];case 6:X.setOptions(U[nt-1]),this.$=U[nt];break;case 7:U[nt-1]+=U[nt],this.$=U[nt-1];break;case 9:this.$=[];break;case 10:U[nt-1].push(U[nt]),this.$=U[nt-1];break;case 11:this.$=U[nt-1];break;case 16:this.$=U[nt].trim(),X.setAccTitle(this.$);break;case 17:case 18:this.$=U[nt].trim(),X.setAccDescription(this.$);break;case 19:X.addSection(U[nt].substr(8)),this.$=U[nt].substr(8);break;case 21:X.checkout(U[nt]);break;case 22:X.branch(U[nt]);break;case 23:X.branch(U[nt-2],U[nt]);break;case 24:X.cherryPick(U[nt],"",void 0);break;case 25:X.cherryPick(U[nt-2],"",U[nt]);break;case 26:case 28:X.cherryPick(U[nt-2],"","");break;case 27:X.cherryPick(U[nt],"",U[nt-2]);break;case 29:X.merge(U[nt],"","","");break;case 30:X.merge(U[nt-2],U[nt],"","");break;case 31:X.merge(U[nt-2],"",U[nt],"");break;case 32:X.merge(U[nt-2],"","",U[nt]);break;case 33:X.merge(U[nt-4],U[nt],"",U[nt-2]);break;case 34:X.merge(U[nt-4],"",U[nt],U[nt-2]);break;case 35:X.merge(U[nt-4],"",U[nt-2],U[nt]);break;case 36:X.merge(U[nt-4],U[nt-2],U[nt],"");break;case 37:X.merge(U[nt-4],U[nt-2],"",U[nt]);break;case 38:X.merge(U[nt-4],U[nt],U[nt-2],"");break;case 39:X.merge(U[nt-6],U[nt-4],U[nt-2],U[nt]);break;case 40:X.merge(U[nt-6],U[nt],U[nt-4],U[nt-2]);break;case 41:X.merge(U[nt-6],U[nt-4],U[nt],U[nt-2]);break;case 42:X.merge(U[nt-6],U[nt-2],U[nt-4],U[nt]);break;case 43:X.merge(U[nt-6],U[nt],U[nt-2],U[nt-4]);break;case 44:X.merge(U[nt-6],U[nt-2],U[nt],U[nt-4]);break;case 45:X.commit(U[nt]);break;case 46:X.commit("","",X.commitType.NORMAL,U[nt]);break;case 47:X.commit("","",U[nt],"");break;case 48:X.commit("","",U[nt],U[nt-2]);break;case 49:X.commit("","",U[nt-2],U[nt]);break;case 50:X.commit("",U[nt],X.commitType.NORMAL,"");break;case 51:X.commit("",U[nt-2],X.commitType.NORMAL,U[nt]);break;case 52:X.commit("",U[nt],X.commitType.NORMAL,U[nt-2]);break;case 53:X.commit("",U[nt-2],U[nt],"");break;case 54:X.commit("",U[nt],U[nt-2],"");break;case 55:X.commit("",U[nt-4],U[nt-2],U[nt]);break;case 56:X.commit("",U[nt-4],U[nt],U[nt-2]);break;case 57:X.commit("",U[nt-2],U[nt-4],U[nt]);break;case 58:X.commit("",U[nt],U[nt-4],U[nt-2]);break;case 59:X.commit("",U[nt],U[nt-2],U[nt-4]);break;case 60:X.commit("",U[nt-2],U[nt],U[nt-4]);break;case 61:X.commit(U[nt],"",X.commitType.NORMAL,"");break;case 62:X.commit(U[nt],"",X.commitType.NORMAL,U[nt-2]);break;case 63:X.commit(U[nt-2],"",X.commitType.NORMAL,U[nt]);break;case 64:X.commit(U[nt-2],"",U[nt],"");break;case 65:X.commit(U[nt],"",U[nt-2],"");break;case 66:X.commit(U[nt],U[nt-2],X.commitType.NORMAL,"");break;case 67:X.commit(U[nt-2],U[nt],X.commitType.NORMAL,"");break;case 68:X.commit(U[nt-4],"",U[nt-2],U[nt]);break;case 69:X.commit(U[nt-4],"",U[nt],U[nt-2]);break;case 70:X.commit(U[nt-2],"",U[nt-4],U[nt]);break;case 71:X.commit(U[nt],"",U[nt-4],U[nt-2]);break;case 72:X.commit(U[nt],"",U[nt-2],U[nt-4]);break;case 73:X.commit(U[nt-2],"",U[nt],U[nt-4]);break;case 74:X.commit(U[nt-4],U[nt],U[nt-2],"");break;case 75:X.commit(U[nt-4],U[nt-2],U[nt],"");break;case 76:X.commit(U[nt-2],U[nt],U[nt-4],"");break;case 77:X.commit(U[nt],U[nt-2],U[nt-4],"");break;case 78:X.commit(U[nt],U[nt-4],U[nt-2],"");break;case 79:X.commit(U[nt-2],U[nt-4],U[nt],"");break;case 80:X.commit(U[nt-4],U[nt],X.commitType.NORMAL,U[nt-2]);break;case 81:X.commit(U[nt-4],U[nt-2],X.commitType.NORMAL,U[nt]);break;case 82:X.commit(U[nt-2],U[nt],X.commitType.NORMAL,U[nt-4]);break;case 83:X.commit(U[nt],U[nt-2],X.commitType.NORMAL,U[nt-4]);break;case 84:X.commit(U[nt],U[nt-4],X.commitType.NORMAL,U[nt-2]);break;case 85:X.commit(U[nt-2],U[nt-4],X.commitType.NORMAL,U[nt]);break;case 86:X.commit(U[nt-6],U[nt-4],U[nt-2],U[nt]);break;case 87:X.commit(U[nt-6],U[nt-4],U[nt],U[nt-2]);break;case 88:X.commit(U[nt-6],U[nt-2],U[nt-4],U[nt]);break;case 89:X.commit(U[nt-6],U[nt],U[nt-4],U[nt-2]);break;case 90:X.commit(U[nt-6],U[nt-2],U[nt],U[nt-4]);break;case 91:X.commit(U[nt-6],U[nt],U[nt-2],U[nt-4]);break;case 92:X.commit(U[nt-4],U[nt-6],U[nt-2],U[nt]);break;case 93:X.commit(U[nt-4],U[nt-6],U[nt],U[nt-2]);break;case 94:X.commit(U[nt-2],U[nt-6],U[nt-4],U[nt]);break;case 95:X.commit(U[nt],U[nt-6],U[nt-4],U[nt-2]);break;case 96:X.commit(U[nt-2],U[nt-6],U[nt],U[nt-4]);break;case 97:X.commit(U[nt],U[nt-6],U[nt-2],U[nt-4]);break;case 98:X.commit(U[nt],U[nt-4],U[nt-2],U[nt-6]);break;case 99:X.commit(U[nt-2],U[nt-4],U[nt],U[nt-6]);break;case 100:X.commit(U[nt],U[nt-2],U[nt-4],U[nt-6]);break;case 101:X.commit(U[nt-2],U[nt],U[nt-4],U[nt-6]);break;case 102:X.commit(U[nt-4],U[nt-2],U[nt],U[nt-6]);break;case 103:X.commit(U[nt-4],U[nt],U[nt-2],U[nt-6]);break;case 104:X.commit(U[nt-2],U[nt-4],U[nt-6],U[nt]);break;case 105:X.commit(U[nt],U[nt-4],U[nt-6],U[nt-2]);break;case 106:X.commit(U[nt-2],U[nt],U[nt-6],U[nt-4]);break;case 107:X.commit(U[nt],U[nt-2],U[nt-6],U[nt-4]);break;case 108:X.commit(U[nt-4],U[nt-2],U[nt-6],U[nt]);break;case 109:X.commit(U[nt-4],U[nt],U[nt-6],U[nt-2]);break;case 110:this.$="";break;case 111:this.$=U[nt];break;case 112:this.$=X.commitType.NORMAL;break;case 113:this.$=X.commitType.REVERSE;break;case 114:this.$=X.commitType.HIGHLIGHT;break}},table:[{3:1,4:2,5:a,7:f,13:p,46:w},{1:[3]},{3:7,4:2,5:a,7:f,13:p,46:w},{6:8,7:m,8:[1,9],9:[1,10],10:11,13:b},i(E,[2,117]),i(E,[2,118]),i(E,[2,119]),{1:[2,1]},{7:[1,13]},{6:14,7:m,10:11,13:b},{8:[1,15]},i(_,[2,9],{11:16,12:[1,17]}),i(A,[2,8]),{1:[2,2]},{7:[1,18]},{6:19,7:m,10:11,13:b},{7:[2,6],13:[1,22],14:20,15:21,16:23,17:24,18:25,19:[1,26],21:[1,27],23:[1,28],24:[1,29],25:30,26:[1,31],28:[1,35],31:[1,34],36:[1,33],39:[1,32]},i(A,[2,7]),{1:[2,3]},{7:[1,36]},i(_,[2,10]),{4:37,7:f,13:p,46:w},i(_,[2,12]),i(I,[2,13]),i(I,[2,14]),i(I,[2,15]),{20:[1,38]},{22:[1,39]},i(I,[2,18]),i(I,[2,19]),i(I,[2,20]),{27:40,33:B,45:N},i(I,[2,110],{40:43,32:[1,46],33:[1,48],34:[1,44],37:[1,45],41:[1,47]}),{27:49,33:B,45:N},{32:[1,50],34:[1,51]},{27:52,33:B,45:N},{1:[2,4]},i(_,[2,11]),i(I,[2,16]),i(I,[2,17]),i(I,[2,21]),i(R,[2,115]),i(R,[2,116]),i(I,[2,45]),{33:[1,53]},{38:54,42:z,43:W,44:et},{33:[1,58]},{33:[1,59]},i(I,[2,111]),i(I,[2,29],{32:[1,60],34:[1,62],37:[1,61]}),{33:[1,63]},{33:[1,64],35:[1,65]},i(I,[2,22],{29:[1,66]}),i(I,[2,46],{32:[1,68],37:[1,67],41:[1,69]}),i(I,[2,47],{32:[1,71],34:[1,70],41:[1,72]}),i(st,[2,112]),i(st,[2,113]),i(st,[2,114]),i(I,[2,50],{34:[1,73],37:[1,74],41:[1,75]}),i(I,[2,61],{32:[1,78],34:[1,76],37:[1,77]}),{33:[1,79]},{38:80,42:z,43:W,44:et},{33:[1,81]},i(I,[2,24],{34:[1,82]}),{32:[1,83]},{32:[1,84]},{30:[1,85]},{38:86,42:z,43:W,44:et},{33:[1,87]},{33:[1,88]},{33:[1,89]},{33:[1,90]},{33:[1,91]},{33:[1,92]},{38:93,42:z,43:W,44:et},{33:[1,94]},{33:[1,95]},{38:96,42:z,43:W,44:et},{33:[1,97]},i(I,[2,30],{34:[1,99],37:[1,98]}),i(I,[2,31],{32:[1,101],34:[1,100]}),i(I,[2,32],{32:[1,102],37:[1,103]}),{33:[1,104],35:[1,105]},{33:[1,106]},{33:[1,107]},i(I,[2,23]),i(I,[2,48],{32:[1,108],41:[1,109]}),i(I,[2,52],{37:[1,110],41:[1,111]}),i(I,[2,62],{32:[1,113],37:[1,112]}),i(I,[2,49],{32:[1,114],41:[1,115]}),i(I,[2,54],{34:[1,116],41:[1,117]}),i(I,[2,65],{32:[1,119],34:[1,118]}),i(I,[2,51],{37:[1,120],41:[1,121]}),i(I,[2,53],{34:[1,122],41:[1,123]}),i(I,[2,66],{34:[1,125],37:[1,124]}),i(I,[2,63],{32:[1,127],37:[1,126]}),i(I,[2,64],{32:[1,129],34:[1,128]}),i(I,[2,67],{34:[1,131],37:[1,130]}),{38:132,42:z,43:W,44:et},{33:[1,133]},{33:[1,134]},{33:[1,135]},{33:[1,136]},{38:137,42:z,43:W,44:et},i(I,[2,25]),i(I,[2,26]),i(I,[2,27]),i(I,[2,28]),{33:[1,138]},{33:[1,139]},{38:140,42:z,43:W,44:et},{33:[1,141]},{38:142,42:z,43:W,44:et},{33:[1,143]},{33:[1,144]},{33:[1,145]},{33:[1,146]},{33:[1,147]},{33:[1,148]},{33:[1,149]},{38:150,42:z,43:W,44:et},{33:[1,151]},{33:[1,152]},{33:[1,153]},{38:154,42:z,43:W,44:et},{33:[1,155]},{38:156,42:z,43:W,44:et},{33:[1,157]},{33:[1,158]},{33:[1,159]},{38:160,42:z,43:W,44:et},{33:[1,161]},i(I,[2,36],{34:[1,162]}),i(I,[2,37],{37:[1,163]}),i(I,[2,35],{32:[1,164]}),i(I,[2,38],{34:[1,165]}),i(I,[2,33],{37:[1,166]}),i(I,[2,34],{32:[1,167]}),i(I,[2,59],{41:[1,168]}),i(I,[2,72],{32:[1,169]}),i(I,[2,60],{41:[1,170]}),i(I,[2,83],{37:[1,171]}),i(I,[2,73],{32:[1,172]}),i(I,[2,82],{37:[1,173]}),i(I,[2,58],{41:[1,174]}),i(I,[2,71],{32:[1,175]}),i(I,[2,57],{41:[1,176]}),i(I,[2,77],{34:[1,177]}),i(I,[2,70],{32:[1,178]}),i(I,[2,76],{34:[1,179]}),i(I,[2,56],{41:[1,180]}),i(I,[2,84],{37:[1,181]}),i(I,[2,55],{41:[1,182]}),i(I,[2,78],{34:[1,183]}),i(I,[2,79],{34:[1,184]}),i(I,[2,85],{37:[1,185]}),i(I,[2,69],{32:[1,186]}),i(I,[2,80],{37:[1,187]}),i(I,[2,68],{32:[1,188]}),i(I,[2,74],{34:[1,189]}),i(I,[2,75],{34:[1,190]}),i(I,[2,81],{37:[1,191]}),{33:[1,192]},{38:193,42:z,43:W,44:et},{33:[1,194]},{33:[1,195]},{38:196,42:z,43:W,44:et},{33:[1,197]},{33:[1,198]},{33:[1,199]},{33:[1,200]},{38:201,42:z,43:W,44:et},{33:[1,202]},{38:203,42:z,43:W,44:et},{33:[1,204]},{33:[1,205]},{33:[1,206]},{33:[1,207]},{33:[1,208]},{33:[1,209]},{33:[1,210]},{38:211,42:z,43:W,44:et},{33:[1,212]},{33:[1,213]},{33:[1,214]},{38:215,42:z,43:W,44:et},{33:[1,216]},{38:217,42:z,43:W,44:et},{33:[1,218]},{33:[1,219]},{33:[1,220]},{38:221,42:z,43:W,44:et},i(I,[2,39]),i(I,[2,41]),i(I,[2,40]),i(I,[2,42]),i(I,[2,44]),i(I,[2,43]),i(I,[2,100]),i(I,[2,101]),i(I,[2,98]),i(I,[2,99]),i(I,[2,103]),i(I,[2,102]),i(I,[2,107]),i(I,[2,106]),i(I,[2,105]),i(I,[2,104]),i(I,[2,109]),i(I,[2,108]),i(I,[2,97]),i(I,[2,96]),i(I,[2,95]),i(I,[2,94]),i(I,[2,92]),i(I,[2,93]),i(I,[2,91]),i(I,[2,90]),i(I,[2,89]),i(I,[2,88]),i(I,[2,86]),i(I,[2,87])],defaultActions:{7:[2,1],13:[2,2],18:[2,3],36:[2,4]},parseError:function(ft,ut){if(ut.recoverable)this.trace(ft);else{var vt=new Error(ft);throw vt.hash=ut,vt}},parse:function(ft){var ut=this,vt=[0],X=[],pt=[null],U=[],Tt=this.table,nt="",It=0,Ot=0,Bt=2,Et=1,Z=U.slice.call(arguments,1),Ct=Object.create(this.lexer),xt={yy:{}};for(var Ht in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ht)&&(xt.yy[Ht]=this.yy[Ht]);Ct.setInput(ft,xt.yy),xt.yy.lexer=Ct,xt.yy.parser=this,typeof Ct.yylloc>"u"&&(Ct.yylloc={});var Le=Ct.yylloc;U.push(Le);var Ft=Ct.options&&Ct.options.ranges;typeof xt.yy.parseError=="function"?this.parseError=xt.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function gn(){var te;return te=X.pop()||Ct.lex()||Et,typeof te!="number"&&(te instanceof Array&&(X=te,te=X.pop()),te=ut.symbols_[te]||te),te}for(var Se,me,Ve,Ye,ce={},ke,zt,re,se;;){if(me=vt[vt.length-1],this.defaultActions[me]?Ve=this.defaultActions[me]:((Se===null||typeof Se>"u")&&(Se=gn()),Ve=Tt[me]&&Tt[me][Se]),typeof Ve>"u"||!Ve.length||!Ve[0]){var Pe="";se=[];for(ke in Tt[me])this.terminals_[ke]&&ke>Bt&&se.push("'"+this.terminals_[ke]+"'");Ct.showPosition?Pe="Parse error on line "+(It+1)+`: +`+Ct.showPosition()+` +Expecting `+se.join(", ")+", got '"+(this.terminals_[Se]||Se)+"'":Pe="Parse error on line "+(It+1)+": Unexpected "+(Se==Et?"end of input":"'"+(this.terminals_[Se]||Se)+"'"),this.parseError(Pe,{text:Ct.match,token:this.terminals_[Se]||Se,line:Ct.yylineno,loc:Le,expected:se})}if(Ve[0]instanceof Array&&Ve.length>1)throw new Error("Parse Error: multiple actions possible at state: "+me+", token: "+Se);switch(Ve[0]){case 1:vt.push(Se),pt.push(Ct.yytext),U.push(Ct.yylloc),vt.push(Ve[1]),Se=null,Ot=Ct.yyleng,nt=Ct.yytext,It=Ct.yylineno,Le=Ct.yylloc;break;case 2:if(zt=this.productions_[Ve[1]][1],ce.$=pt[pt.length-zt],ce._$={first_line:U[U.length-(zt||1)].first_line,last_line:U[U.length-1].last_line,first_column:U[U.length-(zt||1)].first_column,last_column:U[U.length-1].last_column},Ft&&(ce._$.range=[U[U.length-(zt||1)].range[0],U[U.length-1].range[1]]),Ye=this.performAction.apply(ce,[nt,Ot,It,xt.yy,Ve[1],pt,U].concat(Z)),typeof Ye<"u")return Ye;zt&&(vt=vt.slice(0,-1*zt*2),pt=pt.slice(0,-1*zt),U=U.slice(0,-1*zt)),vt.push(this.productions_[Ve[1]][0]),pt.push(ce.$),U.push(ce._$),re=Tt[vt[vt.length-2]][vt[vt.length-1]],vt.push(re);break;case 3:return!0}}return!0}},bt=function(){var yt={EOF:1,parseError:function(ut,vt){if(this.yy.parser)this.yy.parser.parseError(ut,vt);else throw new Error(ut)},setInput:function(ft,ut){return this.yy=ut||this.yy||{},this._input=ft,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var ft=this._input[0];this.yytext+=ft,this.yyleng++,this.offset++,this.match+=ft,this.matched+=ft;var ut=ft.match(/(?:\r\n?|\n).*/g);return ut?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ft},unput:function(ft){var ut=ft.length,vt=ft.split(/(?:\r\n?|\n)/g);this._input=ft+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-ut),this.offset-=ut;var X=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),vt.length-1&&(this.yylineno-=vt.length-1);var pt=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:vt?(vt.length===X.length?this.yylloc.first_column:0)+X[X.length-vt.length].length-vt[0].length:this.yylloc.first_column-ut},this.options.ranges&&(this.yylloc.range=[pt[0],pt[0]+this.yyleng-ut]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(ft){this.unput(this.match.slice(ft))},pastInput:function(){var ft=this.matched.substr(0,this.matched.length-this.match.length);return(ft.length>20?"...":"")+ft.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var ft=this.match;return ft.length<20&&(ft+=this._input.substr(0,20-ft.length)),(ft.substr(0,20)+(ft.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var ft=this.pastInput(),ut=new Array(ft.length+1).join("-");return ft+this.upcomingInput()+` +`+ut+"^"},test_match:function(ft,ut){var vt,X,pt;if(this.options.backtrack_lexer&&(pt={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(pt.yylloc.range=this.yylloc.range.slice(0))),X=ft[0].match(/(?:\r\n?|\n).*/g),X&&(this.yylineno+=X.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:X?X[X.length-1].length-X[X.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+ft[0].length},this.yytext+=ft[0],this.match+=ft[0],this.matches=ft,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(ft[0].length),this.matched+=ft[0],vt=this.performAction.call(this,this.yy,this,ut,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),vt)return vt;if(this._backtrack){for(var U in pt)this[U]=pt[U];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var ft,ut,vt,X;this._more||(this.yytext="",this.match="");for(var pt=this._currentRules(),U=0;Uut[0].length)){if(ut=vt,X=U,this.options.backtrack_lexer){if(ft=this.test_match(vt,pt[U]),ft!==!1)return ft;if(this._backtrack){ut=!1;continue}else return!1}else if(!this.options.flex)break}return ut?(ft=this.test_match(ut,pt[X]),ft!==!1?ft:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var ut=this.next();return ut||this.lex()},begin:function(ut){this.conditionStack.push(ut)},popState:function(){var ut=this.conditionStack.length-1;return ut>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(ut){return ut=this.conditionStack.length-1-Math.abs(ut||0),ut>=0?this.conditionStack[ut]:"INITIAL"},pushState:function(ut){this.begin(ut)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(ut,vt,X,pt){switch(X){case 0:return this.begin("acc_title"),19;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),21;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 13;case 8:break;case 9:break;case 10:return 5;case 11:return 39;case 12:return 32;case 13:return 37;case 14:return 41;case 15:return 42;case 16:return 43;case 17:return 44;case 18:return 34;case 19:return 28;case 20:return 29;case 21:return 36;case 22:return 31;case 23:return 26;case 24:return 9;case 25:return 9;case 26:return 8;case 27:return"CARET";case 28:this.begin("options");break;case 29:this.popState();break;case 30:return 12;case 31:return 35;case 32:this.begin("string");break;case 33:this.popState();break;case 34:return 33;case 35:return 30;case 36:return 45;case 37:return 7}},rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit(?=\s|$))/i,/^(?:id:)/i,/^(?:type:)/i,/^(?:msg:)/i,/^(?:NORMAL\b)/i,/^(?:REVERSE\b)/i,/^(?:HIGHLIGHT\b)/i,/^(?:tag:)/i,/^(?:branch(?=\s|$))/i,/^(?:order:)/i,/^(?:merge(?=\s|$))/i,/^(?:cherry-pick(?=\s|$))/i,/^(?:checkout(?=\s|$))/i,/^(?:LR\b)/i,/^(?:TB\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:[ \r\n\t]+end\b)/i,/^(?:[\s\S]+(?=[ \r\n\t]+end))/i,/^(?:["]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[0-9]+(?=\s|$))/i,/^(?:\w([-\./\w]*[-\w])?)/i,/^(?:$)/i,/^(?:\s+)/i],conditions:{acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},options:{rules:[29,30],inclusive:!1},string:{rules:[33,34],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,31,32,35,36,37,38],inclusive:!0}}};return yt}();at.lexer=bt;function mt(){this.yy={}}return mt.prototype=at,at.Parser=mt,new mt}();z0t.parser=z0t;const Nze=z0t;let MY=Oe().gitGraph.mainBranchName,Bze=Oe().gitGraph.mainBranchOrder,l1={},vg=null,AF={};AF[MY]={name:MY,order:Bze};let Nf={};Nf[MY]=vg;let J1=MY,BBt="LR",ET=0;function q0t(){return GIt({length:7})}function Rze(i,a){const f=Object.create(null);return i.reduce((p,w)=>{const m=a(w);return f[m]||(f[m]=!0,p.push(w)),p},[])}const jze=function(i){BBt=i};let RBt={};const $ze=function(i){Ut.debug("options str",i),i=i&&i.trim(),i=i||"{}";try{RBt=JSON.parse(i)}catch(a){Ut.error("error while parsing gitGraph options",a.message)}},zze=function(){return RBt},qze=function(i,a,f,p){Ut.debug("Entering commit:",i,a,f,p),a=Kr.sanitizeText(a,Oe()),i=Kr.sanitizeText(i,Oe()),p=Kr.sanitizeText(p,Oe());const w={id:a||ET+"-"+q0t(),message:i,seq:ET++,type:f||LF.NORMAL,tag:p||"",parents:vg==null?[]:[vg.id],branch:J1};vg=w,l1[w.id]=w,Nf[J1]=w.id,Ut.debug("in pushCommit "+w.id)},Hze=function(i,a){if(i=Kr.sanitizeText(i,Oe()),Nf[i]===void 0)Nf[i]=vg!=null?vg.id:null,AF[i]={name:i,order:a?parseInt(a,10):null},jBt(i),Ut.debug("in createBranch");else{let f=new Error('Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout '+i+'")');throw f.hash={text:"branch "+i,token:"branch "+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"checkout '+i+'"']},f}},Vze=function(i,a,f,p){i=Kr.sanitizeText(i,Oe()),a=Kr.sanitizeText(a,Oe());const w=l1[Nf[J1]],m=l1[Nf[i]];if(J1===i){let E=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw E.hash={text:"merge "+i,token:"merge "+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},E}else if(w===void 0||!w){let E=new Error('Incorrect usage of "merge". Current branch ('+J1+")has no commits");throw E.hash={text:"merge "+i,token:"merge "+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["commit"]},E}else if(Nf[i]===void 0){let E=new Error('Incorrect usage of "merge". Branch to be merged ('+i+") does not exist");throw E.hash={text:"merge "+i,token:"merge "+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch "+i]},E}else if(m===void 0||!m){let E=new Error('Incorrect usage of "merge". Branch to be merged ('+i+") has no commits");throw E.hash={text:"merge "+i,token:"merge "+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"commit"']},E}else if(w===m){let E=new Error('Incorrect usage of "merge". Both branches have same head');throw E.hash={text:"merge "+i,token:"merge "+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["branch abc"]},E}else if(a&&l1[a]!==void 0){let E=new Error('Incorrect usage of "merge". Commit with id:'+a+" already exists, use different custom Id");throw E.hash={text:"merge "+i+a+f+p,token:"merge "+i+a+f+p,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["merge "+i+" "+a+"_UNIQUE "+f+" "+p]},E}const b={id:a||ET+"-"+q0t(),message:"merged branch "+i+" into "+J1,seq:ET++,parents:[vg==null?null:vg.id,Nf[i]],branch:J1,type:LF.MERGE,customType:f,customId:!!a,tag:p||""};vg=b,l1[b.id]=b,Nf[J1]=b.id,Ut.debug(Nf),Ut.debug("in mergeBranch")},Gze=function(i,a,f){if(Ut.debug("Entering cherryPick:",i,a,f),i=Kr.sanitizeText(i,Oe()),a=Kr.sanitizeText(a,Oe()),f=Kr.sanitizeText(f,Oe()),!i||l1[i]===void 0){let m=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw m.hash={text:"cherryPick "+i+" "+a,token:"cherryPick "+i+" "+a,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},m}let p=l1[i],w=p.branch;if(p.type===LF.MERGE){let m=new Error('Incorrect usage of "cherryPick". Source commit should not be a merge commit');throw m.hash={text:"cherryPick "+i+" "+a,token:"cherryPick "+i+" "+a,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},m}if(!a||l1[a]===void 0){if(w===J1){let E=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw E.hash={text:"cherryPick "+i+" "+a,token:"cherryPick "+i+" "+a,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},E}const m=l1[Nf[J1]];if(m===void 0||!m){let E=new Error('Incorrect usage of "cherry-pick". Current branch ('+J1+")has no commits");throw E.hash={text:"cherryPick "+i+" "+a,token:"cherryPick "+i+" "+a,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["cherry-pick abc"]},E}const b={id:ET+"-"+q0t(),message:"cherry-picked "+p+" into "+J1,seq:ET++,parents:[vg==null?null:vg.id,p.id],branch:J1,type:LF.CHERRY_PICK,tag:f??"cherry-pick:"+p.id};vg=b,l1[b.id]=b,Nf[J1]=b.id,Ut.debug(Nf),Ut.debug("in cherryPick")}},jBt=function(i){if(i=Kr.sanitizeText(i,Oe()),Nf[i]===void 0){let a=new Error('Trying to checkout branch which is not yet created. (Help try using "branch '+i+'")');throw a.hash={text:"checkout "+i,token:"checkout "+i,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"branch '+i+'"']},a}else{J1=i;const a=Nf[J1];vg=l1[a]}};function $Bt(i,a,f){const p=i.indexOf(a);p===-1?i.push(f):i.splice(p,1,f)}function zBt(i){const a=i.reduce((w,m)=>w.seq>m.seq?w:m,i[0]);let f="";i.forEach(function(w){w===a?f+=" *":f+=" |"});const p=[f,a.id,a.seq];for(let w in Nf)Nf[w]===a.id&&p.push(w);if(Ut.debug(p.join(" ")),a.parents&&a.parents.length==2){const w=l1[a.parents[0]];$Bt(i,a,w),i.push(l1[a.parents[1]])}else{if(a.parents.length==0)return;{const w=l1[a.parents];$Bt(i,a,w)}}i=Rze(i,w=>w.id),zBt(i)}const Uze=function(){Ut.debug(l1);const i=qBt()[0];zBt([i])},Wze=function(){l1={},vg=null;let i=Oe().gitGraph.mainBranchName,a=Oe().gitGraph.mainBranchOrder;Nf={},Nf[i]=null,AF={},AF[i]={name:i,order:a},J1=i,ET=0,hg()},Yze=function(){return Object.values(AF).map((a,f)=>a.order!==null?a:{...a,order:parseFloat(`0.${f}`,10)}).sort((a,f)=>a.order-f.order).map(({name:a})=>({name:a}))},Kze=function(){return Nf},Xze=function(){return l1},qBt=function(){const i=Object.keys(l1).map(function(a){return l1[a]});return i.forEach(function(a){Ut.debug(a.id)}),i.sort((a,f)=>a.seq-f.seq),i},Qze=function(){return J1},Zze=function(){return BBt},Jze=function(){return vg},LF={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},tqe={getConfig:()=>Oe().gitGraph,setDirection:jze,setOptions:$ze,getOptions:zze,commit:qze,branch:Hze,merge:Vze,cherryPick:Gze,checkout:jBt,prettyPrint:Uze,clear:Wze,getBranchesAsObjArray:Yze,getBranches:Kze,getCommits:Xze,getCommitsArray:qBt,getCurrentBranch:Qze,getDirection:Zze,getHead:Jze,setAccTitle:E0,getAccTitle:fg,getAccDescription:gg,setAccDescription:dg,setDiagramTitle:Nb,getDiagramTitle:pg,commitType:LF};let MF={};const $b={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},TT=8;let td={},DF={},DY=[],IF=0,C0="LR";const eqe=()=>{td={},DF={},MF={},IF=0,DY=[],C0="LR"},HBt=i=>{const a=document.createElementNS("http://www.w3.org/2000/svg","text");let f=[];typeof i=="string"?f=i.split(/\\n|\n|/gi):Array.isArray(i)?f=i:f=[];for(const p of f){const w=document.createElementNS("http://www.w3.org/2000/svg","tspan");w.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),w.setAttribute("dy","1em"),w.setAttribute("x","0"),w.setAttribute("class","row"),w.textContent=p.trim(),a.appendChild(w)}return a},VBt=(i,a,f)=>{const p=Oe().gitGraph,w=i.append("g").attr("class","commit-bullets"),m=i.append("g").attr("class","commit-labels");let b=0;C0==="TB"&&(b=30),Object.keys(a).sort((A,I)=>a[A].seq-a[I].seq).forEach(A=>{const I=a[A],B=C0==="TB"?b+10:td[I.branch].pos,N=C0==="TB"?td[I.branch].pos:b+10;if(f){let R,z=I.customType!==void 0&&I.customType!==""?I.customType:I.type;switch(z){case $b.NORMAL:R="commit-normal";break;case $b.REVERSE:R="commit-reverse";break;case $b.HIGHLIGHT:R="commit-highlight";break;case $b.MERGE:R="commit-merge";break;case $b.CHERRY_PICK:R="commit-cherry-pick";break;default:R="commit-normal"}if(z===$b.HIGHLIGHT){const W=w.append("rect");W.attr("x",N-10),W.attr("y",B-10),W.attr("height",20),W.attr("width",20),W.attr("class",`commit ${I.id} commit-highlight${td[I.branch].index%TT} ${R}-outer`),w.append("rect").attr("x",N-6).attr("y",B-6).attr("height",12).attr("width",12).attr("class",`commit ${I.id} commit${td[I.branch].index%TT} ${R}-inner`)}else if(z===$b.CHERRY_PICK)w.append("circle").attr("cx",N).attr("cy",B).attr("r",10).attr("class",`commit ${I.id} ${R}`),w.append("circle").attr("cx",N-3).attr("cy",B+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${I.id} ${R}`),w.append("circle").attr("cx",N+3).attr("cy",B+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${I.id} ${R}`),w.append("line").attr("x1",N+3).attr("y1",B+1).attr("x2",N).attr("y2",B-5).attr("stroke","#fff").attr("class",`commit ${I.id} ${R}`),w.append("line").attr("x1",N-3).attr("y1",B+1).attr("x2",N).attr("y2",B-5).attr("stroke","#fff").attr("class",`commit ${I.id} ${R}`);else{const W=w.append("circle");if(W.attr("cx",N),W.attr("cy",B),W.attr("r",I.type===$b.MERGE?9:10),W.attr("class",`commit ${I.id} commit${td[I.branch].index%TT}`),z===$b.MERGE){const et=w.append("circle");et.attr("cx",N),et.attr("cy",B),et.attr("r",6),et.attr("class",`commit ${R} ${I.id} commit${td[I.branch].index%TT}`)}z===$b.REVERSE&&w.append("path").attr("d",`M ${N-5},${B-5}L${N+5},${B+5}M${N-5},${B+5}L${N+5},${B-5}`).attr("class",`commit ${R} ${I.id} commit${td[I.branch].index%TT}`)}}if(C0==="TB"?DF[I.id]={x:N,y:b+10}:DF[I.id]={x:b+10,y:B},f){if(I.type!==$b.CHERRY_PICK&&(I.customId&&I.type===$b.MERGE||I.type!==$b.MERGE)&&p.showCommitLabel){const W=m.append("g"),et=W.insert("rect").attr("class","commit-label-bkg"),st=W.append("text").attr("x",b).attr("y",B+25).attr("class","commit-label").text(I.id);let at=st.node().getBBox();if(et.attr("x",b+10-at.width/2-2).attr("y",B+13.5).attr("width",at.width+2*2).attr("height",at.height+2*2),C0==="TB"&&(et.attr("x",N-(at.width+4*4+5)).attr("y",B-12),st.attr("x",N-(at.width+4*4)).attr("y",B+at.height-12)),C0!=="TB"&&st.attr("x",b+10-at.width/2),p.rotateCommitLabel)if(C0==="TB")st.attr("transform","rotate(-45, "+N+", "+B+")"),et.attr("transform","rotate(-45, "+N+", "+B+")");else{let bt=-7.5-(at.width+10)/25*9.5,mt=10+at.width/25*8.5;W.attr("transform","translate("+bt+", "+mt+") rotate(-45, "+b+", "+B+")")}}if(I.tag){const W=m.insert("polygon"),et=m.append("circle"),st=m.append("text").attr("y",B-16).attr("class","tag-label").text(I.tag);let at=st.node().getBBox();st.attr("x",b+10-at.width/2);const bt=at.height/2,mt=B-19.2;W.attr("class","tag-label-bkg").attr("points",` + ${b-at.width/2-4/2},${mt+2} + ${b-at.width/2-4/2},${mt-2} + ${b+10-at.width/2-4},${mt-bt-2} + ${b+10+at.width/2+4},${mt-bt-2} + ${b+10+at.width/2+4},${mt+bt+2} + ${b+10-at.width/2-4},${mt+bt+2}`),et.attr("cx",b-at.width/2+4/2).attr("cy",mt).attr("r",1.5).attr("class","tag-hole"),C0==="TB"&&(W.attr("class","tag-label-bkg").attr("points",` + ${N},${b+2} + ${N},${b-2} + ${N+10},${b-bt-2} + ${N+10+at.width+4},${b-bt-2} + ${N+10+at.width+4},${b+bt+2} + ${N+10},${b+bt+2}`).attr("transform","translate(12,12) rotate(45, "+N+","+b+")"),et.attr("cx",N+4/2).attr("cy",b).attr("transform","translate(12,12) rotate(45, "+N+","+b+")"),st.attr("x",N+5).attr("y",b+3).attr("transform","translate(14,14) rotate(45, "+N+","+b+")"))}}b+=50,b>IF&&(IF=b)})},nqe=(i,a,f)=>Object.keys(f).filter(m=>f[m].branch===a.branch&&f[m].seq>i.seq&&f[m].seq0,OF=(i,a,f=0)=>{const p=i+Math.abs(i-a)/2;if(f>5)return p;if(DY.every(b=>Math.abs(b-p)>=10))return DY.push(p),p;const m=Math.abs(i-a);return OF(i,a-m/5,f+1)},rqe=(i,a,f,p)=>{const w=DF[a.id],m=DF[f.id],b=nqe(a,f,p);let E="",_="",A=0,I=0,B=td[f.branch].index,N;if(b){E="A 10 10, 0, 0, 0,",_="A 10 10, 0, 0, 1,",A=10,I=10,B=td[f.branch].index;const R=w.ym.x&&(E="A 20 20, 0, 0, 0,",_="A 20 20, 0, 0, 1,",A=20,I=20,B=td[a.branch].index,N=`M ${w.x} ${w.y} L ${w.x} ${m.y-A} ${_} ${w.x-I} ${m.y} L ${m.x} ${m.y}`),w.x===m.x&&(B=td[a.branch].index,N=`M ${w.x} ${w.y} L ${w.x+A} ${w.y} ${E} ${w.x+I} ${m.y+A} L ${m.x} ${m.y}`)):(w.ym.y&&(E="A 20 20, 0, 0, 0,",A=20,I=20,B=td[a.branch].index,N=`M ${w.x} ${w.y} L ${m.x-A} ${w.y} ${E} ${m.x} ${w.y-I} L ${m.x} ${m.y}`),w.y===m.y&&(B=td[a.branch].index,N=`M ${w.x} ${w.y} L ${w.x} ${m.y-A} ${E} ${w.x+I} ${m.y} L ${m.x} ${m.y}`));i.append("path").attr("d",N).attr("class","arrow arrow"+B%TT)},iqe=(i,a)=>{const f=i.append("g").attr("class","commit-arrows");Object.keys(a).forEach(p=>{const w=a[p];w.parents&&w.parents.length>0&&w.parents.forEach(m=>{rqe(f,a[m],w,a)})})},sqe=(i,a)=>{const f=Oe().gitGraph,p=i.append("g");a.forEach((w,m)=>{const b=m%TT,E=td[w.name].pos,_=p.append("line");_.attr("x1",0),_.attr("y1",E),_.attr("x2",IF),_.attr("y2",E),_.attr("class","branch branch"+b),C0==="TB"&&(_.attr("y1",30),_.attr("x1",E),_.attr("y2",IF),_.attr("x2",E)),DY.push(E);let A=w.name;const I=HBt(A),B=p.insert("rect"),R=p.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+b);R.node().appendChild(I);let z=I.getBBox();B.attr("class","branchLabelBkg label"+b).attr("rx",4).attr("ry",4).attr("x",-z.width-4-(f.rotateCommitLabel===!0?30:0)).attr("y",-z.height/2+8).attr("width",z.width+18).attr("height",z.height+4),R.attr("transform","translate("+(-z.width-14-(f.rotateCommitLabel===!0?30:0))+", "+(E-z.height/2-1)+")"),C0==="TB"&&(B.attr("x",E-z.width/2-10).attr("y",0),R.attr("transform","translate("+(E-z.width/2-5)+", 0)")),C0!=="TB"&&B.attr("transform","translate(-19, "+(E-z.height/2)+")")})},aqe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:Nze,db:tqe,renderer:{draw:function(i,a,f,p){eqe();const w=Oe(),m=w.gitGraph;Ut.debug("in gitgraph renderer",i+` +`,"id:",a,f),MF=p.db.getCommits();const b=p.db.getBranchesAsObjArray();C0=p.db.getDirection();const E=yr(`[id="${a}"]`);let _=0;b.forEach((A,I)=>{const B=HBt(A.name),N=E.append("g"),R=N.insert("g").attr("class","branchLabel"),z=R.insert("g").attr("class","label branch-label");z.node().appendChild(B);let W=B.getBBox();td[A.name]={pos:_,index:I},_+=50+(m.rotateCommitLabel?40:0)+(C0==="TB"?W.width/2:0),z.remove(),R.remove(),N.remove()}),VBt(E,MF,!1),m.showBranches&&sqe(E,b),iqe(E,MF),VBt(E,MF,!0),$a.insertTitle(E,"gitTitleText",m.titleTopMargin,p.db.getDiagramTitle()),AOt(void 0,E,m.diagramPadding,m.useMaxWidth??w.useMaxWidth)}},styles:i=>` + .commit-id, + .commit-msg, + .branch-label { + fill: lightgrey; + color: lightgrey; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } + ${[0,1,2,3,4,5,6,7].map(a=>` + .branch-label${a} { fill: ${i["gitBranchLabel"+a]}; } + .commit${a} { stroke: ${i["git"+a]}; fill: ${i["git"+a]}; } + .commit-highlight${a} { stroke: ${i["gitInv"+a]}; fill: ${i["gitInv"+a]}; } + .label${a} { fill: ${i["git"+a]}; } + .arrow${a} { stroke: ${i["git"+a]}; } + `).join(` +`)} + + .branch { + stroke-width: 1; + stroke: ${i.lineColor}; + stroke-dasharray: 2; + } + .commit-label { font-size: ${i.commitLabelFontSize}; fill: ${i.commitLabelColor};} + .commit-label-bkg { font-size: ${i.commitLabelFontSize}; fill: ${i.commitLabelBackground}; opacity: 0.5; } + .tag-label { font-size: ${i.tagLabelFontSize}; fill: ${i.tagLabelColor};} + .tag-label-bkg { fill: ${i.tagLabelBackground}; stroke: ${i.tagLabelBorder}; } + .tag-hole { fill: ${i.textColor}; } + + .commit-merge { + stroke: ${i.primaryColor}; + fill: ${i.primaryColor}; + } + .commit-reverse { + stroke: ${i.primaryColor}; + fill: ${i.primaryColor}; + stroke-width: 3; + } + .commit-highlight-outer { + } + .commit-highlight-inner { + stroke: ${i.primaryColor}; + fill: ${i.primaryColor}; + } + + .arrow { stroke-width: 8; stroke-linecap: round; fill: none} + .gitTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${i.textColor}; + } +`}},Symbol.toStringTag,{value:"Module"}));var H0t=function(){var i=function(U,Tt,nt,It){for(nt=nt||{},It=U.length;It--;nt[U[It]]=Tt);return nt},a=[6,8,10,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,30,32,33,35,37],f=[1,25],p=[1,26],w=[1,27],m=[1,28],b=[1,29],E=[1,30],_=[1,31],A=[1,9],I=[1,10],B=[1,11],N=[1,12],R=[1,13],z=[1,14],W=[1,15],et=[1,16],st=[1,18],at=[1,19],bt=[1,20],mt=[1,21],yt=[1,22],ft=[1,24],ut=[1,32],vt={trace:function(){},yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,dateFormat:19,inclusiveEndDates:20,topAxis:21,axisFormat:22,tickInterval:23,excludes:24,includes:25,todayMarker:26,title:27,acc_title:28,acc_title_value:29,acc_descr:30,acc_descr_value:31,acc_descr_multiline_value:32,section:33,clickStatement:34,taskTxt:35,taskData:36,click:37,callbackname:38,callbackargs:39,href:40,clickStatementDebug:41,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",19:"dateFormat",20:"inclusiveEndDates",21:"topAxis",22:"axisFormat",23:"tickInterval",24:"excludes",25:"includes",26:"todayMarker",27:"title",28:"acc_title",29:"acc_title_value",30:"acc_descr",31:"acc_descr_value",32:"acc_descr_multiline_value",33:"section",35:"taskTxt",36:"taskData",37:"click",38:"callbackname",39:"callbackargs",40:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[34,2],[34,3],[34,3],[34,4],[34,3],[34,4],[34,2],[41,2],[41,3],[41,3],[41,4],[41,3],[41,4],[41,2]],performAction:function(Tt,nt,It,Ot,Bt,Et,Z){var Ct=Et.length-1;switch(Bt){case 1:return Et[Ct-1];case 2:this.$=[];break;case 3:Et[Ct-1].push(Et[Ct]),this.$=Et[Ct-1];break;case 4:case 5:this.$=Et[Ct];break;case 6:case 7:this.$=[];break;case 8:Ot.setWeekday("monday");break;case 9:Ot.setWeekday("tuesday");break;case 10:Ot.setWeekday("wednesday");break;case 11:Ot.setWeekday("thursday");break;case 12:Ot.setWeekday("friday");break;case 13:Ot.setWeekday("saturday");break;case 14:Ot.setWeekday("sunday");break;case 15:Ot.setDateFormat(Et[Ct].substr(11)),this.$=Et[Ct].substr(11);break;case 16:Ot.enableInclusiveEndDates(),this.$=Et[Ct].substr(18);break;case 17:Ot.TopAxis(),this.$=Et[Ct].substr(8);break;case 18:Ot.setAxisFormat(Et[Ct].substr(11)),this.$=Et[Ct].substr(11);break;case 19:Ot.setTickInterval(Et[Ct].substr(13)),this.$=Et[Ct].substr(13);break;case 20:Ot.setExcludes(Et[Ct].substr(9)),this.$=Et[Ct].substr(9);break;case 21:Ot.setIncludes(Et[Ct].substr(9)),this.$=Et[Ct].substr(9);break;case 22:Ot.setTodayMarker(Et[Ct].substr(12)),this.$=Et[Ct].substr(12);break;case 24:Ot.setDiagramTitle(Et[Ct].substr(6)),this.$=Et[Ct].substr(6);break;case 25:this.$=Et[Ct].trim(),Ot.setAccTitle(this.$);break;case 26:case 27:this.$=Et[Ct].trim(),Ot.setAccDescription(this.$);break;case 28:Ot.addSection(Et[Ct].substr(8)),this.$=Et[Ct].substr(8);break;case 30:Ot.addTask(Et[Ct-1],Et[Ct]),this.$="task";break;case 31:this.$=Et[Ct-1],Ot.setClickEvent(Et[Ct-1],Et[Ct],null);break;case 32:this.$=Et[Ct-2],Ot.setClickEvent(Et[Ct-2],Et[Ct-1],Et[Ct]);break;case 33:this.$=Et[Ct-2],Ot.setClickEvent(Et[Ct-2],Et[Ct-1],null),Ot.setLink(Et[Ct-2],Et[Ct]);break;case 34:this.$=Et[Ct-3],Ot.setClickEvent(Et[Ct-3],Et[Ct-2],Et[Ct-1]),Ot.setLink(Et[Ct-3],Et[Ct]);break;case 35:this.$=Et[Ct-2],Ot.setClickEvent(Et[Ct-2],Et[Ct],null),Ot.setLink(Et[Ct-2],Et[Ct-1]);break;case 36:this.$=Et[Ct-3],Ot.setClickEvent(Et[Ct-3],Et[Ct-1],Et[Ct]),Ot.setLink(Et[Ct-3],Et[Ct-2]);break;case 37:this.$=Et[Ct-1],Ot.setLink(Et[Ct-1],Et[Ct]);break;case 38:case 44:this.$=Et[Ct-1]+" "+Et[Ct];break;case 39:case 40:case 42:this.$=Et[Ct-2]+" "+Et[Ct-1]+" "+Et[Ct];break;case 41:case 43:this.$=Et[Ct-3]+" "+Et[Ct-2]+" "+Et[Ct-1]+" "+Et[Ct];break}},table:[{3:1,4:[1,2]},{1:[3]},i(a,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:f,13:p,14:w,15:m,16:b,17:E,18:_,19:A,20:I,21:B,22:N,23:R,24:z,25:W,26:et,27:st,28:at,30:bt,32:mt,33:yt,34:23,35:ft,37:ut},i(a,[2,7],{1:[2,1]}),i(a,[2,3]),{9:33,11:17,12:f,13:p,14:w,15:m,16:b,17:E,18:_,19:A,20:I,21:B,22:N,23:R,24:z,25:W,26:et,27:st,28:at,30:bt,32:mt,33:yt,34:23,35:ft,37:ut},i(a,[2,5]),i(a,[2,6]),i(a,[2,15]),i(a,[2,16]),i(a,[2,17]),i(a,[2,18]),i(a,[2,19]),i(a,[2,20]),i(a,[2,21]),i(a,[2,22]),i(a,[2,23]),i(a,[2,24]),{29:[1,34]},{31:[1,35]},i(a,[2,27]),i(a,[2,28]),i(a,[2,29]),{36:[1,36]},i(a,[2,8]),i(a,[2,9]),i(a,[2,10]),i(a,[2,11]),i(a,[2,12]),i(a,[2,13]),i(a,[2,14]),{38:[1,37],40:[1,38]},i(a,[2,4]),i(a,[2,25]),i(a,[2,26]),i(a,[2,30]),i(a,[2,31],{39:[1,39],40:[1,40]}),i(a,[2,37],{38:[1,41]}),i(a,[2,32],{40:[1,42]}),i(a,[2,33]),i(a,[2,35],{39:[1,43]}),i(a,[2,34]),i(a,[2,36])],defaultActions:{},parseError:function(Tt,nt){if(nt.recoverable)this.trace(Tt);else{var It=new Error(Tt);throw It.hash=nt,It}},parse:function(Tt){var nt=this,It=[0],Ot=[],Bt=[null],Et=[],Z=this.table,Ct="",xt=0,Ht=0,Le=2,Ft=1,gn=Et.slice.call(arguments,1),Se=Object.create(this.lexer),me={yy:{}};for(var Ve in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ve)&&(me.yy[Ve]=this.yy[Ve]);Se.setInput(Tt,me.yy),me.yy.lexer=Se,me.yy.parser=this,typeof Se.yylloc>"u"&&(Se.yylloc={});var Ye=Se.yylloc;Et.push(Ye);var ce=Se.options&&Se.options.ranges;typeof me.yy.parseError=="function"?this.parseError=me.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ke(){var ws;return ws=Ot.pop()||Se.lex()||Ft,typeof ws!="number"&&(ws instanceof Array&&(Ot=ws,ws=Ot.pop()),ws=nt.symbols_[ws]||ws),ws}for(var zt,re,se,Pe,te={},Me,de,on,ni;;){if(re=It[It.length-1],this.defaultActions[re]?se=this.defaultActions[re]:((zt===null||typeof zt>"u")&&(zt=ke()),se=Z[re]&&Z[re][zt]),typeof se>"u"||!se.length||!se[0]){var Ks="";ni=[];for(Me in Z[re])this.terminals_[Me]&&Me>Le&&ni.push("'"+this.terminals_[Me]+"'");Se.showPosition?Ks="Parse error on line "+(xt+1)+`: +`+Se.showPosition()+` +Expecting `+ni.join(", ")+", got '"+(this.terminals_[zt]||zt)+"'":Ks="Parse error on line "+(xt+1)+": Unexpected "+(zt==Ft?"end of input":"'"+(this.terminals_[zt]||zt)+"'"),this.parseError(Ks,{text:Se.match,token:this.terminals_[zt]||zt,line:Se.yylineno,loc:Ye,expected:ni})}if(se[0]instanceof Array&&se.length>1)throw new Error("Parse Error: multiple actions possible at state: "+re+", token: "+zt);switch(se[0]){case 1:It.push(zt),Bt.push(Se.yytext),Et.push(Se.yylloc),It.push(se[1]),zt=null,Ht=Se.yyleng,Ct=Se.yytext,xt=Se.yylineno,Ye=Se.yylloc;break;case 2:if(de=this.productions_[se[1]][1],te.$=Bt[Bt.length-de],te._$={first_line:Et[Et.length-(de||1)].first_line,last_line:Et[Et.length-1].last_line,first_column:Et[Et.length-(de||1)].first_column,last_column:Et[Et.length-1].last_column},ce&&(te._$.range=[Et[Et.length-(de||1)].range[0],Et[Et.length-1].range[1]]),Pe=this.performAction.apply(te,[Ct,Ht,xt,me.yy,se[1],Bt,Et].concat(gn)),typeof Pe<"u")return Pe;de&&(It=It.slice(0,-1*de*2),Bt=Bt.slice(0,-1*de),Et=Et.slice(0,-1*de)),It.push(this.productions_[se[1]][0]),Bt.push(te.$),Et.push(te._$),on=Z[It[It.length-2]][It[It.length-1]],It.push(on);break;case 3:return!0}}return!0}},X=function(){var U={EOF:1,parseError:function(nt,It){if(this.yy.parser)this.yy.parser.parseError(nt,It);else throw new Error(nt)},setInput:function(Tt,nt){return this.yy=nt||this.yy||{},this._input=Tt,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var Tt=this._input[0];this.yytext+=Tt,this.yyleng++,this.offset++,this.match+=Tt,this.matched+=Tt;var nt=Tt.match(/(?:\r\n?|\n).*/g);return nt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Tt},unput:function(Tt){var nt=Tt.length,It=Tt.split(/(?:\r\n?|\n)/g);this._input=Tt+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-nt),this.offset-=nt;var Ot=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),It.length-1&&(this.yylineno-=It.length-1);var Bt=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:It?(It.length===Ot.length?this.yylloc.first_column:0)+Ot[Ot.length-It.length].length-It[0].length:this.yylloc.first_column-nt},this.options.ranges&&(this.yylloc.range=[Bt[0],Bt[0]+this.yyleng-nt]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(Tt){this.unput(this.match.slice(Tt))},pastInput:function(){var Tt=this.matched.substr(0,this.matched.length-this.match.length);return(Tt.length>20?"...":"")+Tt.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var Tt=this.match;return Tt.length<20&&(Tt+=this._input.substr(0,20-Tt.length)),(Tt.substr(0,20)+(Tt.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var Tt=this.pastInput(),nt=new Array(Tt.length+1).join("-");return Tt+this.upcomingInput()+` +`+nt+"^"},test_match:function(Tt,nt){var It,Ot,Bt;if(this.options.backtrack_lexer&&(Bt={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Bt.yylloc.range=this.yylloc.range.slice(0))),Ot=Tt[0].match(/(?:\r\n?|\n).*/g),Ot&&(this.yylineno+=Ot.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Ot?Ot[Ot.length-1].length-Ot[Ot.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Tt[0].length},this.yytext+=Tt[0],this.match+=Tt[0],this.matches=Tt,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Tt[0].length),this.matched+=Tt[0],It=this.performAction.call(this,this.yy,this,nt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),It)return It;if(this._backtrack){for(var Et in Bt)this[Et]=Bt[Et];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Tt,nt,It,Ot;this._more||(this.yytext="",this.match="");for(var Bt=this._currentRules(),Et=0;Etnt[0].length)){if(nt=It,Ot=Et,this.options.backtrack_lexer){if(Tt=this.test_match(It,Bt[Et]),Tt!==!1)return Tt;if(this._backtrack){nt=!1;continue}else return!1}else if(!this.options.flex)break}return nt?(Tt=this.test_match(nt,Bt[Ot]),Tt!==!1?Tt:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var nt=this.next();return nt||this.lex()},begin:function(nt){this.conditionStack.push(nt)},popState:function(){var nt=this.conditionStack.length-1;return nt>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(nt){return nt=this.conditionStack.length-1-Math.abs(nt||0),nt>=0?this.conditionStack[nt]:"INITIAL"},pushState:function(nt){this.begin(nt)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(nt,It,Ot,Bt){switch(Ot){case 0:return this.begin("open_directive"),"open_directive";case 1:return this.begin("acc_title"),28;case 2:return this.popState(),"acc_title_value";case 3:return this.begin("acc_descr"),30;case 4:return this.popState(),"acc_descr_value";case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:break;case 15:this.begin("href");break;case 16:this.popState();break;case 17:return 40;case 18:this.begin("callbackname");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callbackargs");break;case 21:return 38;case 22:this.popState();break;case 23:return 39;case 24:this.begin("click");break;case 25:this.popState();break;case 26:return 37;case 27:return 4;case 28:return 19;case 29:return 20;case 30:return 21;case 31:return 22;case 32:return 23;case 33:return 25;case 34:return 24;case 35:return 26;case 36:return 12;case 37:return 13;case 38:return 14;case 39:return 15;case 40:return 16;case 41:return 17;case 42:return 18;case 43:return"date";case 44:return 27;case 45:return"accDescription";case 46:return 33;case 47:return 35;case 48:return 36;case 49:return":";case 50:return 6;case 51:return"INVALID"}},rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[22,23],inclusive:!1},callbackname:{rules:[19,20,21],inclusive:!1},href:{rules:[16,17],inclusive:!1},click:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,18,24,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return U}();vt.lexer=X;function pt(){this.yy={}}return pt.prototype=vt,vt.Parser=pt,new pt}();H0t.parser=H0t;const oqe=H0t;var GBt={exports:{}};(function(i,a){(function(f,p){i.exports=p()})(b0,function(){var f="day";return function(p,w,m){var b=function(A){return A.add(4-A.isoWeekday(),f)},E=w.prototype;E.isoWeekYear=function(){return b(this).year()},E.isoWeek=function(A){if(!this.$utils().u(A))return this.add(7*(A-this.isoWeek()),f);var I,B,N,R,z=b(this),W=(I=this.isoWeekYear(),B=this.$u,N=(B?m.utc:m)().year(I).startOf("year"),R=4-N.isoWeekday(),N.isoWeekday()>4&&(R+=7),N.add(R,f));return z.diff(W,"week")+1},E.isoWeekday=function(A){return this.$utils().u(A)?this.day()||7:this.day(this.day()%7?A:A-7)};var _=E.startOf;E.startOf=function(A,I){var B=this.$utils(),N=!!B.u(I)||I;return B.p(A)==="isoweek"?N?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):_.bind(this)(A,I)}}})})(GBt);var cqe=GBt.exports;const uqe=G7(cqe);var UBt={exports:{}};(function(i,a){(function(f,p){i.exports=p()})(b0,function(){var f={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},p=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,w=/\d\d/,m=/\d\d?/,b=/\d*[^-_:/,()\s\d]+/,E={},_=function(W){return(W=+W)+(W>68?1900:2e3)},A=function(W){return function(et){this[W]=+et}},I=[/[+-]\d\d:?(\d\d)?|Z/,function(W){(this.zone||(this.zone={})).offset=function(et){if(!et||et==="Z")return 0;var st=et.match(/([+-]|\d\d)/g),at=60*st[1]+(+st[2]||0);return at===0?0:st[0]==="+"?-at:at}(W)}],B=function(W){var et=E[W];return et&&(et.indexOf?et:et.s.concat(et.f))},N=function(W,et){var st,at=E.meridiem;if(at){for(var bt=1;bt<=24;bt+=1)if(W.indexOf(at(bt,0,et))>-1){st=bt>12;break}}else st=W===(et?"pm":"PM");return st},R={A:[b,function(W){this.afternoon=N(W,!1)}],a:[b,function(W){this.afternoon=N(W,!0)}],S:[/\d/,function(W){this.milliseconds=100*+W}],SS:[w,function(W){this.milliseconds=10*+W}],SSS:[/\d{3}/,function(W){this.milliseconds=+W}],s:[m,A("seconds")],ss:[m,A("seconds")],m:[m,A("minutes")],mm:[m,A("minutes")],H:[m,A("hours")],h:[m,A("hours")],HH:[m,A("hours")],hh:[m,A("hours")],D:[m,A("day")],DD:[w,A("day")],Do:[b,function(W){var et=E.ordinal,st=W.match(/\d+/);if(this.day=st[0],et)for(var at=1;at<=31;at+=1)et(at).replace(/\[|\]/g,"")===W&&(this.day=at)}],M:[m,A("month")],MM:[w,A("month")],MMM:[b,function(W){var et=B("months"),st=(B("monthsShort")||et.map(function(at){return at.slice(0,3)})).indexOf(W)+1;if(st<1)throw new Error;this.month=st%12||st}],MMMM:[b,function(W){var et=B("months").indexOf(W)+1;if(et<1)throw new Error;this.month=et%12||et}],Y:[/[+-]?\d+/,A("year")],YY:[w,function(W){this.year=_(W)}],YYYY:[/\d{4}/,A("year")],Z:I,ZZ:I};function z(W){var et,st;et=W,st=E&&E.formats;for(var at=(W=et.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(X,pt,U){var Tt=U&&U.toUpperCase();return pt||st[U]||f[U]||st[Tt].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(nt,It,Ot){return It||Ot.slice(1)})})).match(p),bt=at.length,mt=0;mt-1)return new Date((Et==="X"?1e3:1)*Bt);var Ct=z(Et)(Bt),xt=Ct.year,Ht=Ct.month,Le=Ct.day,Ft=Ct.hours,gn=Ct.minutes,Se=Ct.seconds,me=Ct.milliseconds,Ve=Ct.zone,Ye=new Date,ce=Le||(xt||Ht?1:Ye.getDate()),ke=xt||Ye.getFullYear(),zt=0;xt&&!Ht||(zt=Ht>0?Ht-1:Ye.getMonth());var re=Ft||0,se=gn||0,Pe=Se||0,te=me||0;return Ve?new Date(Date.UTC(ke,zt,ce,re,se,Pe,te+60*Ve.offset*1e3)):Z?new Date(Date.UTC(ke,zt,ce,re,se,Pe,te)):new Date(ke,zt,ce,re,se,Pe,te)}catch{return new Date("")}}(yt,vt,ft),this.init(),Tt&&Tt!==!0&&(this.$L=this.locale(Tt).$L),U&&yt!=this.format(vt)&&(this.$d=new Date("")),E={}}else if(vt instanceof Array)for(var nt=vt.length,It=1;It<=nt;It+=1){ut[1]=vt[It-1];var Ot=st.apply(this,ut);if(Ot.isValid()){this.$d=Ot.$d,this.$L=Ot.$L,this.init();break}It===nt&&(this.$d=new Date(""))}else bt.call(this,mt)}}})})(UBt);var lqe=UBt.exports;const hqe=G7(lqe);var WBt={exports:{}};(function(i,a){(function(f,p){i.exports=p()})(b0,function(){return function(f,p){var w=p.prototype,m=w.format;w.format=function(b){var E=this,_=this.$locale();if(!this.isValid())return m.bind(this)(b);var A=this.$utils(),I=(b||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(B){switch(B){case"Q":return Math.ceil((E.$M+1)/3);case"Do":return _.ordinal(E.$D);case"gggg":return E.weekYear();case"GGGG":return E.isoWeekYear();case"wo":return _.ordinal(E.week(),"W");case"w":case"ww":return A.s(E.week(),B==="w"?1:2,"0");case"W":case"WW":return A.s(E.isoWeek(),B==="W"?1:2,"0");case"k":case"kk":return A.s(String(E.$H===0?24:E.$H),B==="k"?1:2,"0");case"X":return Math.floor(E.$d.getTime()/1e3);case"x":return E.$d.getTime();case"z":return"["+E.offsetName()+"]";case"zzz":return"["+E.offsetName("long")+"]";default:return B}});return m.bind(this)(I)}}})})(WBt);var fqe=WBt.exports;const dqe=G7(fqe);w0.extend(uqe),w0.extend(hqe),w0.extend(dqe);let x3="",V0t="",G0t,U0t="",PF=[],FF=[],W0t={},Y0t=[],IY=[],uL="",K0t="";const YBt=["active","done","crit","milestone"];let X0t=[],NF=!1,Q0t=!1,Z0t="sunday",J0t=0;const gqe=function(){Y0t=[],IY=[],uL="",X0t=[],OY=0,egt=void 0,PY=void 0,h1=[],x3="",V0t="",K0t="",G0t=void 0,U0t="",PF=[],FF=[],NF=!1,Q0t=!1,J0t=0,W0t={},hg(),Z0t="sunday"},pqe=function(i){V0t=i},bqe=function(){return V0t},wqe=function(i){G0t=i},vqe=function(){return G0t},mqe=function(i){U0t=i},yqe=function(){return U0t},xqe=function(i){x3=i},kqe=function(){NF=!0},Eqe=function(){return NF},Tqe=function(){Q0t=!0},Cqe=function(){return Q0t},_qe=function(i){K0t=i},Sqe=function(){return K0t},Aqe=function(){return x3},Lqe=function(i){PF=i.toLowerCase().split(/[\s,]+/)},Mqe=function(){return PF},Dqe=function(i){FF=i.toLowerCase().split(/[\s,]+/)},Iqe=function(){return FF},Oqe=function(){return W0t},Pqe=function(i){uL=i,Y0t.push(i)},Fqe=function(){return Y0t},Nqe=function(){let i=tRt();const a=10;let f=0;for(;!i&&f=6&&f.includes("weekends")||f.includes(i.format("dddd").toLowerCase())?!0:f.includes(i.format(a.trim()))},Bqe=function(i){Z0t=i},Rqe=function(){return Z0t},XBt=function(i,a,f,p){if(!f.length||i.manualEndTime)return;let w;i.startTime instanceof Date?w=w0(i.startTime):w=w0(i.startTime,a,!0),w=w.add(1,"d");let m;i.endTime instanceof Date?m=w0(i.endTime):m=w0(i.endTime,a,!0);const[b,E]=jqe(w,m,a,f,p);i.endTime=b.toDate(),i.renderEndTime=E},jqe=function(i,a,f,p,w){let m=!1,b=null;for(;i<=a;)m||(b=a.toDate()),m=KBt(i,f,p,w),m&&(a=a.add(1,"d")),i=i.add(1,"d");return[a,b]},tgt=function(i,a,f){f=f.trim();const w=/^after\s+([\d\w- ]+)/.exec(f.trim());if(w!==null){let b=null;if(w[1].split(" ").forEach(function(E){let _=hL(E);_!==void 0&&(b?_.endTime>b.endTime&&(b=_):b=_)}),b)return b.endTime;{const E=new Date;return E.setHours(0,0,0,0),E}}let m=w0(f,a.trim(),!0);if(m.isValid())return m.toDate();{Ut.debug("Invalid date:"+f),Ut.debug("With date format:"+a.trim());const b=new Date(f);if(b===void 0||isNaN(b.getTime())||b.getFullYear()<-1e4||b.getFullYear()>1e4)throw new Error("Invalid date:"+f);return b}},QBt=function(i){const a=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(i.trim());return a!==null?[Number.parseFloat(a[1]),a[2]]:[NaN,"ms"]},ZBt=function(i,a,f,p=!1){f=f.trim();let w=w0(f,a.trim(),!0);if(w.isValid())return p&&(w=w.add(1,"d")),w.toDate();let m=w0(i);const[b,E]=QBt(f);if(!Number.isNaN(b)){const _=m.add(b,E);_.isValid()&&(m=_)}return m.toDate()};let OY=0;const lL=function(i){return i===void 0?(OY=OY+1,"task"+OY):i},$qe=function(i,a){let f;a.substr(0,1)===":"?f=a.substr(1,a.length):f=a;const p=f.split(","),w={};rRt(p,w,YBt);for(let b=0;b{window.open(f,"_self")}),W0t[p]=f)}),eRt(i,"clickable")},eRt=function(i,a){i.split(",").forEach(function(f){let p=hL(f);p!==void 0&&p.classes.push(a)})},Gqe=function(i,a,f){if(Oe().securityLevel!=="loose"||a===void 0)return;let p=[];if(typeof f=="string"){p=f.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let m=0;m{$a.runFunc(a,...p)})},nRt=function(i,a){X0t.push(function(){const f=document.querySelector(`[id="${i}"]`);f!==null&&f.addEventListener("click",function(){a()})},function(){const f=document.querySelector(`[id="${i}-text"]`);f!==null&&f.addEventListener("click",function(){a()})})},Uqe={getConfig:()=>Oe().gantt,clear:gqe,setDateFormat:xqe,getDateFormat:Aqe,enableInclusiveEndDates:kqe,endDatesAreInclusive:Eqe,enableTopAxis:Tqe,topAxisEnabled:Cqe,setAxisFormat:pqe,getAxisFormat:bqe,setTickInterval:wqe,getTickInterval:vqe,setTodayMarker:mqe,getTodayMarker:yqe,setAccTitle:E0,getAccTitle:fg,setDiagramTitle:Nb,getDiagramTitle:pg,setDisplayMode:_qe,getDisplayMode:Sqe,setAccDescription:dg,getAccDescription:gg,addSection:Pqe,getSections:Fqe,getTasks:Nqe,addTask:qqe,findTaskById:hL,addTaskOrg:Hqe,setIncludes:Lqe,getIncludes:Mqe,setExcludes:Dqe,getExcludes:Iqe,setClickEvent:function(i,a,f){i.split(",").forEach(function(p){Gqe(p,a,f)}),eRt(i,"clickable")},setLink:Vqe,getLinks:Oqe,bindFunctions:function(i){X0t.forEach(function(a){a(i)})},parseDuration:QBt,isInvalidDate:KBt,setWeekday:Bqe,getWeekday:Rqe};function rRt(i,a,f){let p=!0;for(;p;)p=!1,f.forEach(function(w){const m="^\\s*"+w+"\\s*$",b=new RegExp(m);i[0].match(b)&&(a[w]=!0,i.shift(1),p=!0)})}const Wqe=function(){Ut.debug("Something is calling, setConf, remove the call")},iRt={monday:BP,tuesday:JMt,wednesday:tDt,thursday:tT,friday:eDt,saturday:nDt,sunday:NP},Yqe=(i,a)=>{let f=[...i].map(()=>-1/0),p=[...i].sort((m,b)=>m.startTime-b.startTime||m.order-b.order),w=0;for(const m of p)for(let b=0;b=f[b]){f[b]=m.endTime,m.order=b+a,b>w&&(w=b);break}return w};let N5;const Kqe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:oqe,db:Uqe,renderer:{setConf:Wqe,draw:function(i,a,f,p){const w=Oe().gantt,m=Oe().securityLevel;let b;m==="sandbox"&&(b=yr("#i"+a));const E=yr(m==="sandbox"?b.nodes()[0].contentDocument.body:"body"),_=m==="sandbox"?b.nodes()[0].contentDocument:document,A=_.getElementById(a);N5=A.parentElement.offsetWidth,N5===void 0&&(N5=1200),w.useWidth!==void 0&&(N5=w.useWidth);const I=p.db.getTasks();let B=[];for(const vt of I)B.push(vt.type);B=ut(B);const N={};let R=2*w.topPadding;if(p.db.getDisplayMode()==="compact"||w.displayMode==="compact"){const vt={};for(const pt of I)vt[pt.section]===void 0?vt[pt.section]=[pt]:vt[pt.section].push(pt);let X=0;for(const pt of Object.keys(vt)){const U=Yqe(vt[pt],X)+1;X+=U,R+=U*(w.barHeight+w.barGap),N[pt]=U}}else{R+=I.length*(w.barHeight+w.barGap);for(const vt of B)N[vt]=I.filter(X=>X.type===vt).length}A.setAttribute("viewBox","0 0 "+N5+" "+R);const z=E.select(`[id="${a}"]`),W=Y7e().domain([Mxe(I,function(vt){return vt.startTime}),Lxe(I,function(vt){return vt.endTime})]).rangeRound([0,N5-w.leftPadding-w.rightPadding]);function et(vt,X){const pt=vt.startTime,U=X.startTime;let Tt=0;return pt>U?Tt=1:ptxt.order))].map(xt=>vt.find(Ht=>Ht.order===xt));z.append("g").selectAll("rect").data(Bt).enter().append("rect").attr("x",0).attr("y",function(xt,Ht){return Ht=xt.order,Ht*X+pt-2}).attr("width",function(){return It-w.rightPadding/2}).attr("height",X).attr("class",function(xt){for(const[Ht,Le]of B.entries())if(xt.type===Le)return"section section"+Ht%w.numberSectionStyles;return"section section0"});const Et=z.append("g").selectAll("rect").data(vt).enter(),Z=p.db.getLinks();if(Et.append("rect").attr("id",function(xt){return xt.id}).attr("rx",3).attr("ry",3).attr("x",function(xt){return xt.milestone?W(xt.startTime)+U+.5*(W(xt.endTime)-W(xt.startTime))-.5*Tt:W(xt.startTime)+U}).attr("y",function(xt,Ht){return Ht=xt.order,Ht*X+pt}).attr("width",function(xt){return xt.milestone?Tt:W(xt.renderEndTime||xt.endTime)-W(xt.startTime)}).attr("height",Tt).attr("transform-origin",function(xt,Ht){return Ht=xt.order,(W(xt.startTime)+U+.5*(W(xt.endTime)-W(xt.startTime))).toString()+"px "+(Ht*X+pt+.5*Tt).toString()+"px"}).attr("class",function(xt){const Ht="task";let Le="";xt.classes.length>0&&(Le=xt.classes.join(" "));let Ft=0;for(const[Se,me]of B.entries())xt.type===me&&(Ft=Se%w.numberSectionStyles);let gn="";return xt.active?xt.crit?gn+=" activeCrit":gn=" active":xt.done?xt.crit?gn=" doneCrit":gn=" done":xt.crit&&(gn+=" crit"),gn.length===0&&(gn=" task"),xt.milestone&&(gn=" milestone "+gn),gn+=Ft,gn+=" "+Le,Ht+gn}),Et.append("text").attr("id",function(xt){return xt.id+"-text"}).text(function(xt){return xt.task}).attr("font-size",w.fontSize).attr("x",function(xt){let Ht=W(xt.startTime),Le=W(xt.renderEndTime||xt.endTime);xt.milestone&&(Ht+=.5*(W(xt.endTime)-W(xt.startTime))-.5*Tt),xt.milestone&&(Le=Ht+Tt);const Ft=this.getBBox().width;return Ft>Le-Ht?Le+Ft+1.5*w.leftPadding>It?Ht+U-5:Le+U+5:(Le-Ht)/2+Ht+U}).attr("y",function(xt,Ht){return Ht=xt.order,Ht*X+w.barHeight/2+(w.fontSize/2-2)+pt}).attr("text-height",Tt).attr("class",function(xt){const Ht=W(xt.startTime);let Le=W(xt.endTime);xt.milestone&&(Le=Ht+Tt);const Ft=this.getBBox().width;let gn="";xt.classes.length>0&&(gn=xt.classes.join(" "));let Se=0;for(const[Ve,Ye]of B.entries())xt.type===Ye&&(Se=Ve%w.numberSectionStyles);let me="";return xt.active&&(xt.crit?me="activeCritText"+Se:me="activeText"+Se),xt.done?xt.crit?me=me+" doneCritText"+Se:me=me+" doneText"+Se:xt.crit&&(me=me+" critText"+Se),xt.milestone&&(me+=" milestoneText"),Ft>Le-Ht?Le+Ft+1.5*w.leftPadding>It?gn+" taskTextOutsideLeft taskTextOutside"+Se+" "+me:gn+" taskTextOutsideRight taskTextOutside"+Se+" "+me+" width-"+Ft:gn+" taskText taskText"+Se+" "+me+" width-"+Ft}),Oe().securityLevel==="sandbox"){let xt;xt=yr("#i"+a);const Ht=xt.nodes()[0].contentDocument;Et.filter(function(Le){return Z[Le.id]!==void 0}).each(function(Le){var Ft=Ht.querySelector("#"+Le.id),gn=Ht.querySelector("#"+Le.id+"-text");const Se=Ft.parentNode;var me=Ht.createElement("a");me.setAttribute("xlink:href",Z[Le.id]),me.setAttribute("target","_top"),Se.appendChild(me),me.appendChild(Ft),me.appendChild(gn)})}}function bt(vt,X,pt,U,Tt,nt,It,Ot){if(It.length===0&&Ot.length===0)return;let Bt,Et;for(const{startTime:Ft,endTime:gn}of nt)(Bt===void 0||FtEt)&&(Et=gn);if(!Bt||!Et)return;if(w0(Et).diff(w0(Bt),"year")>5){Ut.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}const Z=p.db.getDateFormat(),Ct=[];let xt=null,Ht=w0(Bt);for(;Ht.valueOf()<=Et;)p.db.isInvalidDate(Ht,Z,It,Ot)?xt?xt.end=Ht:xt={start:Ht,end:Ht}:xt&&(Ct.push(xt),xt=null),Ht=Ht.add(1,"d");z.append("g").selectAll("rect").data(Ct).enter().append("rect").attr("id",function(Ft){return"exclude-"+Ft.start.format("YYYY-MM-DD")}).attr("x",function(Ft){return W(Ft.start)+pt}).attr("y",w.gridLineStartPadding).attr("width",function(Ft){const gn=Ft.end.add(1,"day");return W(gn)-W(Ft.start)}).attr("height",Tt-X-w.gridLineStartPadding).attr("transform-origin",function(Ft,gn){return(W(Ft.start)+pt+.5*(W(Ft.end)-W(Ft.start))).toString()+"px "+(gn*vt+.5*Tt).toString()+"px"}).attr("class","exclude-range")}function mt(vt,X,pt,U){let Tt=jxe(W).tickSize(-U+X+w.gridLineStartPadding).tickFormat(ZU(p.db.getAxisFormat()||w.axisFormat||"%Y-%m-%d"));const It=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(p.db.getTickInterval()||w.tickInterval);if(It!==null){const Ot=It[1],Bt=It[2],Et=p.db.getWeekday()||w.weekday;switch(Bt){case"millisecond":Tt.ticks(LA.every(Ot));break;case"second":Tt.ticks(sk.every(Ot));break;case"minute":Tt.ticks(PP.every(Ot));break;case"hour":Tt.ticks(FP.every(Ot));break;case"day":Tt.ticks(Z7.every(Ot));break;case"week":Tt.ticks(iRt[Et].every(Ot));break;case"month":Tt.ticks(RP.every(Ot));break}}if(z.append("g").attr("class","grid").attr("transform","translate("+vt+", "+(U-50)+")").call(Tt).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),p.db.topAxisEnabled()||w.topAxis){let Ot=Rxe(W).tickSize(-U+X+w.gridLineStartPadding).tickFormat(ZU(p.db.getAxisFormat()||w.axisFormat||"%Y-%m-%d"));if(It!==null){const Bt=It[1],Et=It[2],Z=p.db.getWeekday()||w.weekday;switch(Et){case"millisecond":Ot.ticks(LA.every(Bt));break;case"second":Ot.ticks(sk.every(Bt));break;case"minute":Ot.ticks(PP.every(Bt));break;case"hour":Ot.ticks(FP.every(Bt));break;case"day":Ot.ticks(Z7.every(Bt));break;case"week":Ot.ticks(iRt[Z].every(Bt));break;case"month":Ot.ticks(RP.every(Bt));break}}z.append("g").attr("class","grid").attr("transform","translate("+vt+", "+X+")").call(Ot).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}function yt(vt,X){let pt=0;const U=Object.keys(N).map(Tt=>[Tt,N[Tt]]);z.append("g").selectAll("text").data(U).enter().append(function(Tt){const nt=Tt[0].split(Kr.lineBreakRegex),It=-(nt.length-1)/2,Ot=_.createElementNS("http://www.w3.org/2000/svg","text");Ot.setAttribute("dy",It+"em");for(const[Bt,Et]of nt.entries()){const Z=_.createElementNS("http://www.w3.org/2000/svg","tspan");Z.setAttribute("alignment-baseline","central"),Z.setAttribute("x","10"),Bt>0&&Z.setAttribute("dy","1em"),Z.textContent=Et,Ot.appendChild(Z)}return Ot}).attr("x",10).attr("y",function(Tt,nt){if(nt>0)for(let It=0;It` + .mermaid-main-font { + font-family: "trebuchet ms", verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } + .exclude-range { + fill: ${i.excludeBkgColor}; + } + + .section { + stroke: none; + opacity: 0.2; + } + + .section0 { + fill: ${i.sectionBkgColor}; + } + + .section2 { + fill: ${i.sectionBkgColor2}; + } + + .section1, + .section3 { + fill: ${i.altSectionBkgColor}; + opacity: 0.2; + } + + .sectionTitle0 { + fill: ${i.titleColor}; + } + + .sectionTitle1 { + fill: ${i.titleColor}; + } + + .sectionTitle2 { + fill: ${i.titleColor}; + } + + .sectionTitle3 { + fill: ${i.titleColor}; + } + + .sectionTitle { + text-anchor: start; + // font-size: ${i.ganttFontSize}; + // text-height: 14px; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + + } + + + /* Grid and axis */ + + .grid .tick { + stroke: ${i.gridColor}; + opacity: 0.8; + shape-rendering: crispEdges; + text { + font-family: ${i.fontFamily}; + fill: ${i.textColor}; + } + } + + .grid path { + stroke-width: 0; + } + + + /* Today line */ + + .today { + fill: none; + stroke: ${i.todayLineColor}; + stroke-width: 2px; + } + + + /* Task styling */ + + /* Default task */ + + .task { + stroke-width: 2; + } + + .taskText { + text-anchor: middle; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } + + // .taskText:not([font-size]) { + // font-size: ${i.ganttFontSize}; + // } + + .taskTextOutsideRight { + fill: ${i.taskTextDarkColor}; + text-anchor: start; + // font-size: ${i.ganttFontSize}; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + + } + + .taskTextOutsideLeft { + fill: ${i.taskTextDarkColor}; + text-anchor: end; + // font-size: ${i.ganttFontSize}; + } + + /* Special case clickable */ + .task.clickable { + cursor: pointer; + } + .taskText.clickable { + cursor: pointer; + fill: ${i.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideLeft.clickable { + cursor: pointer; + fill: ${i.taskTextClickableColor} !important; + font-weight: bold; + } + + .taskTextOutsideRight.clickable { + cursor: pointer; + fill: ${i.taskTextClickableColor} !important; + font-weight: bold; + } + + /* Specific task settings for the sections*/ + + .taskText0, + .taskText1, + .taskText2, + .taskText3 { + fill: ${i.taskTextColor}; + } + + .task0, + .task1, + .task2, + .task3 { + fill: ${i.taskBkgColor}; + stroke: ${i.taskBorderColor}; + } + + .taskTextOutside0, + .taskTextOutside2 + { + fill: ${i.taskTextOutsideColor}; + } + + .taskTextOutside1, + .taskTextOutside3 { + fill: ${i.taskTextOutsideColor}; + } + + + /* Active task */ + + .active0, + .active1, + .active2, + .active3 { + fill: ${i.activeTaskBkgColor}; + stroke: ${i.activeTaskBorderColor}; + } + + .activeText0, + .activeText1, + .activeText2, + .activeText3 { + fill: ${i.taskTextDarkColor} !important; + } + + + /* Completed task */ + + .done0, + .done1, + .done2, + .done3 { + stroke: ${i.doneTaskBorderColor}; + fill: ${i.doneTaskBkgColor}; + stroke-width: 2; + } + + .doneText0, + .doneText1, + .doneText2, + .doneText3 { + fill: ${i.taskTextDarkColor} !important; + } + + + /* Tasks on the critical line */ + + .crit0, + .crit1, + .crit2, + .crit3 { + stroke: ${i.critBorderColor}; + fill: ${i.critBkgColor}; + stroke-width: 2; + } + + .activeCrit0, + .activeCrit1, + .activeCrit2, + .activeCrit3 { + stroke: ${i.critBorderColor}; + fill: ${i.activeTaskBkgColor}; + stroke-width: 2; + } + + .doneCrit0, + .doneCrit1, + .doneCrit2, + .doneCrit3 { + stroke: ${i.critBorderColor}; + fill: ${i.doneTaskBkgColor}; + stroke-width: 2; + cursor: pointer; + shape-rendering: crispEdges; + } + + .milestone { + transform: rotate(45deg) scale(0.8,0.8); + } + + .milestoneText { + font-style: italic; + } + .doneCritText0, + .doneCritText1, + .doneCritText2, + .doneCritText3 { + fill: ${i.taskTextDarkColor} !important; + } + + .activeCritText0, + .activeCritText1, + .activeCritText2, + .activeCritText3 { + fill: ${i.taskTextDarkColor} !important; + } + + .titleText { + text-anchor: middle; + font-size: 18px; + fill: ${i.textColor} ; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + } +`}},Symbol.toStringTag,{value:"Module"}));var ngt=function(){var i=function(m,b,E,_){for(E=E||{},_=m.length;_--;E[m[_]]=b);return E},a=[6,9,10],f={trace:function(){},yy:{},symbols_:{error:2,start:3,info:4,document:5,EOF:6,line:7,statement:8,NL:9,showInfo:10,$accept:0,$end:1},terminals_:{2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},productions_:[0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],performAction:function(b,E,_,A,I,B,N){switch(B.length-1,I){case 1:return A;case 4:break;case 6:A.setInfo(!0);break}},table:[{3:1,4:[1,2]},{1:[3]},i(a,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},i(a,[2,3]),i(a,[2,4]),i(a,[2,5]),i(a,[2,6])],defaultActions:{4:[2,1]},parseError:function(b,E){if(E.recoverable)this.trace(b);else{var _=new Error(b);throw _.hash=E,_}},parse:function(b){var E=this,_=[0],A=[],I=[null],B=[],N=this.table,R="",z=0,W=0,et=2,st=1,at=B.slice.call(arguments,1),bt=Object.create(this.lexer),mt={yy:{}};for(var yt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,yt)&&(mt.yy[yt]=this.yy[yt]);bt.setInput(b,mt.yy),mt.yy.lexer=bt,mt.yy.parser=this,typeof bt.yylloc>"u"&&(bt.yylloc={});var ft=bt.yylloc;B.push(ft);var ut=bt.options&&bt.options.ranges;typeof mt.yy.parseError=="function"?this.parseError=mt.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function vt(){var Ct;return Ct=A.pop()||bt.lex()||st,typeof Ct!="number"&&(Ct instanceof Array&&(A=Ct,Ct=A.pop()),Ct=E.symbols_[Ct]||Ct),Ct}for(var X,pt,U,Tt,nt={},It,Ot,Bt,Et;;){if(pt=_[_.length-1],this.defaultActions[pt]?U=this.defaultActions[pt]:((X===null||typeof X>"u")&&(X=vt()),U=N[pt]&&N[pt][X]),typeof U>"u"||!U.length||!U[0]){var Z="";Et=[];for(It in N[pt])this.terminals_[It]&&It>et&&Et.push("'"+this.terminals_[It]+"'");bt.showPosition?Z="Parse error on line "+(z+1)+`: +`+bt.showPosition()+` +Expecting `+Et.join(", ")+", got '"+(this.terminals_[X]||X)+"'":Z="Parse error on line "+(z+1)+": Unexpected "+(X==st?"end of input":"'"+(this.terminals_[X]||X)+"'"),this.parseError(Z,{text:bt.match,token:this.terminals_[X]||X,line:bt.yylineno,loc:ft,expected:Et})}if(U[0]instanceof Array&&U.length>1)throw new Error("Parse Error: multiple actions possible at state: "+pt+", token: "+X);switch(U[0]){case 1:_.push(X),I.push(bt.yytext),B.push(bt.yylloc),_.push(U[1]),X=null,W=bt.yyleng,R=bt.yytext,z=bt.yylineno,ft=bt.yylloc;break;case 2:if(Ot=this.productions_[U[1]][1],nt.$=I[I.length-Ot],nt._$={first_line:B[B.length-(Ot||1)].first_line,last_line:B[B.length-1].last_line,first_column:B[B.length-(Ot||1)].first_column,last_column:B[B.length-1].last_column},ut&&(nt._$.range=[B[B.length-(Ot||1)].range[0],B[B.length-1].range[1]]),Tt=this.performAction.apply(nt,[R,W,z,mt.yy,U[1],I,B].concat(at)),typeof Tt<"u")return Tt;Ot&&(_=_.slice(0,-1*Ot*2),I=I.slice(0,-1*Ot),B=B.slice(0,-1*Ot)),_.push(this.productions_[U[1]][0]),I.push(nt.$),B.push(nt._$),Bt=N[_[_.length-2]][_[_.length-1]],_.push(Bt);break;case 3:return!0}}return!0}},p=function(){var m={EOF:1,parseError:function(E,_){if(this.yy.parser)this.yy.parser.parseError(E,_);else throw new Error(E)},setInput:function(b,E){return this.yy=E||this.yy||{},this._input=b,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var b=this._input[0];this.yytext+=b,this.yyleng++,this.offset++,this.match+=b,this.matched+=b;var E=b.match(/(?:\r\n?|\n).*/g);return E?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),b},unput:function(b){var E=b.length,_=b.split(/(?:\r\n?|\n)/g);this._input=b+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-E),this.offset-=E;var A=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),_.length-1&&(this.yylineno-=_.length-1);var I=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:_?(_.length===A.length?this.yylloc.first_column:0)+A[A.length-_.length].length-_[0].length:this.yylloc.first_column-E},this.options.ranges&&(this.yylloc.range=[I[0],I[0]+this.yyleng-E]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(b){this.unput(this.match.slice(b))},pastInput:function(){var b=this.matched.substr(0,this.matched.length-this.match.length);return(b.length>20?"...":"")+b.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var b=this.match;return b.length<20&&(b+=this._input.substr(0,20-b.length)),(b.substr(0,20)+(b.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var b=this.pastInput(),E=new Array(b.length+1).join("-");return b+this.upcomingInput()+` +`+E+"^"},test_match:function(b,E){var _,A,I;if(this.options.backtrack_lexer&&(I={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(I.yylloc.range=this.yylloc.range.slice(0))),A=b[0].match(/(?:\r\n?|\n).*/g),A&&(this.yylineno+=A.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:A?A[A.length-1].length-A[A.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],_=this.performAction.call(this,this.yy,this,E,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),_)return _;if(this._backtrack){for(var B in I)this[B]=I[B];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var b,E,_,A;this._more||(this.yytext="",this.match="");for(var I=this._currentRules(),B=0;BE[0].length)){if(E=_,A=B,this.options.backtrack_lexer){if(b=this.test_match(_,I[B]),b!==!1)return b;if(this._backtrack){E=!1;continue}else return!1}else if(!this.options.flex)break}return E?(b=this.test_match(E,I[A]),b!==!1?b:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var E=this.next();return E||this.lex()},begin:function(E){this.conditionStack.push(E)},popState:function(){var E=this.conditionStack.length-1;return E>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(E){return E=this.conditionStack.length-1-Math.abs(E||0),E>=0?this.conditionStack[E]:"INITIAL"},pushState:function(E){this.begin(E)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(E,_,A,I){switch(A){case 0:return 4;case 1:return 9;case 2:return"space";case 3:return 10;case 4:return 6;case 5:return"TXT"}},rules:[/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],conditions:{INITIAL:{rules:[0,1,2,3,4,5],inclusive:!0}}};return m}();f.lexer=p;function w(){this.yy={}}return w.prototype=f,f.Parser=w,new w}();ngt.parser=ngt;const Xqe=ngt,sRt={info:!1};let rgt=sRt.info;const Qqe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:Xqe,db:{clear:()=>{rgt=sRt.info},setInfo:i=>{rgt=i},getInfo:()=>rgt},renderer:{draw:(i,a,f)=>{Ut.debug(`rendering info diagram +`+i);const p=VW(a);k0(p,100,400,!0),p.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${f}`)}}}},Symbol.toStringTag,{value:"Module"}));var igt=function(){var i=function(bt,mt,yt,ft){for(yt=yt||{},ft=bt.length;ft--;yt[bt[ft]]=mt);return yt},a=[1,3],f=[1,4],p=[1,5],w=[1,6],m=[1,10,12,14,16,18,19,20,21,22],b=[2,4],E=[1,5,10,12,14,16,18,19,20,21,22],_=[20,21,22],A=[2,7],I=[1,12],B=[1,13],N=[1,14],R=[1,15],z=[1,16],W=[1,17],et={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,PIE:5,document:6,showData:7,line:8,statement:9,txt:10,value:11,title:12,title_value:13,acc_title:14,acc_title_value:15,acc_descr:16,acc_descr_value:17,acc_descr_multiline_value:18,section:19,NEWLINE:20,";":21,EOF:22,$accept:0,$end:1},terminals_:{2:"error",5:"PIE",7:"showData",10:"txt",11:"value",12:"title",13:"title_value",14:"acc_title",15:"acc_title_value",16:"acc_descr",17:"acc_descr_value",18:"acc_descr_multiline_value",19:"section",20:"NEWLINE",21:";",22:"EOF"},productions_:[0,[3,2],[3,2],[3,3],[6,0],[6,2],[8,2],[9,0],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[4,1],[4,1],[4,1]],performAction:function(mt,yt,ft,ut,vt,X,pt){var U=X.length-1;switch(vt){case 3:ut.setShowData(!0);break;case 6:this.$=X[U-1];break;case 8:ut.addSection(X[U-1],ut.cleanupValue(X[U]));break;case 9:this.$=X[U].trim(),ut.setDiagramTitle(this.$);break;case 10:this.$=X[U].trim(),ut.setAccTitle(this.$);break;case 11:case 12:this.$=X[U].trim(),ut.setAccDescription(this.$);break;case 13:ut.addSection(X[U].substr(8)),this.$=X[U].substr(8);break}},table:[{3:1,4:2,5:a,20:f,21:p,22:w},{1:[3]},{3:7,4:2,5:a,20:f,21:p,22:w},i(m,b,{6:8,7:[1,9]}),i(E,[2,14]),i(E,[2,15]),i(E,[2,16]),{1:[2,1]},i(_,A,{8:10,9:11,1:[2,2],10:I,12:B,14:N,16:R,18:z,19:W}),i(m,b,{6:18}),i(m,[2,5]),{4:19,20:f,21:p,22:w},{11:[1,20]},{13:[1,21]},{15:[1,22]},{17:[1,23]},i(_,[2,12]),i(_,[2,13]),i(_,A,{8:10,9:11,1:[2,3],10:I,12:B,14:N,16:R,18:z,19:W}),i(m,[2,6]),i(_,[2,8]),i(_,[2,9]),i(_,[2,10]),i(_,[2,11])],defaultActions:{7:[2,1]},parseError:function(mt,yt){if(yt.recoverable)this.trace(mt);else{var ft=new Error(mt);throw ft.hash=yt,ft}},parse:function(mt){var yt=this,ft=[0],ut=[],vt=[null],X=[],pt=this.table,U="",Tt=0,nt=0,It=2,Ot=1,Bt=X.slice.call(arguments,1),Et=Object.create(this.lexer),Z={yy:{}};for(var Ct in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Ct)&&(Z.yy[Ct]=this.yy[Ct]);Et.setInput(mt,Z.yy),Z.yy.lexer=Et,Z.yy.parser=this,typeof Et.yylloc>"u"&&(Et.yylloc={});var xt=Et.yylloc;X.push(xt);var Ht=Et.options&&Et.options.ranges;typeof Z.yy.parseError=="function"?this.parseError=Z.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Le(){var se;return se=ut.pop()||Et.lex()||Ot,typeof se!="number"&&(se instanceof Array&&(ut=se,se=ut.pop()),se=yt.symbols_[se]||se),se}for(var Ft,gn,Se,me,Ve={},Ye,ce,ke,zt;;){if(gn=ft[ft.length-1],this.defaultActions[gn]?Se=this.defaultActions[gn]:((Ft===null||typeof Ft>"u")&&(Ft=Le()),Se=pt[gn]&&pt[gn][Ft]),typeof Se>"u"||!Se.length||!Se[0]){var re="";zt=[];for(Ye in pt[gn])this.terminals_[Ye]&&Ye>It&&zt.push("'"+this.terminals_[Ye]+"'");Et.showPosition?re="Parse error on line "+(Tt+1)+`: +`+Et.showPosition()+` +Expecting `+zt.join(", ")+", got '"+(this.terminals_[Ft]||Ft)+"'":re="Parse error on line "+(Tt+1)+": Unexpected "+(Ft==Ot?"end of input":"'"+(this.terminals_[Ft]||Ft)+"'"),this.parseError(re,{text:Et.match,token:this.terminals_[Ft]||Ft,line:Et.yylineno,loc:xt,expected:zt})}if(Se[0]instanceof Array&&Se.length>1)throw new Error("Parse Error: multiple actions possible at state: "+gn+", token: "+Ft);switch(Se[0]){case 1:ft.push(Ft),vt.push(Et.yytext),X.push(Et.yylloc),ft.push(Se[1]),Ft=null,nt=Et.yyleng,U=Et.yytext,Tt=Et.yylineno,xt=Et.yylloc;break;case 2:if(ce=this.productions_[Se[1]][1],Ve.$=vt[vt.length-ce],Ve._$={first_line:X[X.length-(ce||1)].first_line,last_line:X[X.length-1].last_line,first_column:X[X.length-(ce||1)].first_column,last_column:X[X.length-1].last_column},Ht&&(Ve._$.range=[X[X.length-(ce||1)].range[0],X[X.length-1].range[1]]),me=this.performAction.apply(Ve,[U,nt,Tt,Z.yy,Se[1],vt,X].concat(Bt)),typeof me<"u")return me;ce&&(ft=ft.slice(0,-1*ce*2),vt=vt.slice(0,-1*ce),X=X.slice(0,-1*ce)),ft.push(this.productions_[Se[1]][0]),vt.push(Ve.$),X.push(Ve._$),ke=pt[ft[ft.length-2]][ft[ft.length-1]],ft.push(ke);break;case 3:return!0}}return!0}},st=function(){var bt={EOF:1,parseError:function(yt,ft){if(this.yy.parser)this.yy.parser.parseError(yt,ft);else throw new Error(yt)},setInput:function(mt,yt){return this.yy=yt||this.yy||{},this._input=mt,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var mt=this._input[0];this.yytext+=mt,this.yyleng++,this.offset++,this.match+=mt,this.matched+=mt;var yt=mt.match(/(?:\r\n?|\n).*/g);return yt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),mt},unput:function(mt){var yt=mt.length,ft=mt.split(/(?:\r\n?|\n)/g);this._input=mt+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-yt),this.offset-=yt;var ut=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ft.length-1&&(this.yylineno-=ft.length-1);var vt=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ft?(ft.length===ut.length?this.yylloc.first_column:0)+ut[ut.length-ft.length].length-ft[0].length:this.yylloc.first_column-yt},this.options.ranges&&(this.yylloc.range=[vt[0],vt[0]+this.yyleng-yt]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(mt){this.unput(this.match.slice(mt))},pastInput:function(){var mt=this.matched.substr(0,this.matched.length-this.match.length);return(mt.length>20?"...":"")+mt.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var mt=this.match;return mt.length<20&&(mt+=this._input.substr(0,20-mt.length)),(mt.substr(0,20)+(mt.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var mt=this.pastInput(),yt=new Array(mt.length+1).join("-");return mt+this.upcomingInput()+` +`+yt+"^"},test_match:function(mt,yt){var ft,ut,vt;if(this.options.backtrack_lexer&&(vt={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(vt.yylloc.range=this.yylloc.range.slice(0))),ut=mt[0].match(/(?:\r\n?|\n).*/g),ut&&(this.yylineno+=ut.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ut?ut[ut.length-1].length-ut[ut.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+mt[0].length},this.yytext+=mt[0],this.match+=mt[0],this.matches=mt,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(mt[0].length),this.matched+=mt[0],ft=this.performAction.call(this,this.yy,this,yt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ft)return ft;if(this._backtrack){for(var X in vt)this[X]=vt[X];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var mt,yt,ft,ut;this._more||(this.yytext="",this.match="");for(var vt=this._currentRules(),X=0;Xyt[0].length)){if(yt=ft,ut=X,this.options.backtrack_lexer){if(mt=this.test_match(ft,vt[X]),mt!==!1)return mt;if(this._backtrack){yt=!1;continue}else return!1}else if(!this.options.flex)break}return yt?(mt=this.test_match(yt,vt[ut]),mt!==!1?mt:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var yt=this.next();return yt||this.lex()},begin:function(yt){this.conditionStack.push(yt)},popState:function(){var yt=this.conditionStack.length-1;return yt>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(yt){return yt=this.conditionStack.length-1-Math.abs(yt||0),yt>=0?this.conditionStack[yt]:"INITIAL"},pushState:function(yt){this.begin(yt)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(yt,ft,ut,vt){switch(ut){case 0:break;case 1:break;case 2:return 20;case 3:break;case 4:break;case 5:return this.begin("title"),12;case 6:return this.popState(),"title_value";case 7:return this.begin("acc_title"),14;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),16;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:this.begin("string");break;case 15:this.popState();break;case 16:return"txt";case 17:return 5;case 18:return 7;case 19:return"value";case 20:return 22}},rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:[\s]+)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:pie\b)/i,/^(?:showData\b)/i,/^(?::[\s]*[\d]+(?:\.[\d]+)?)/i,/^(?:$)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[6],inclusive:!1},string:{rules:[15,16],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,7,9,11,14,17,18,19,20],inclusive:!0}}};return bt}();et.lexer=st;function at(){this.yy={}}return at.prototype=et,et.Parser=at,new at}();igt.parser=igt;const Zqe=igt,aRt=Zh.pie,FY={sections:{},showData:!1,config:aRt};let NY=FY.sections,sgt=FY.showData;const Jqe=structuredClone(aRt),tHe={getConfig:()=>structuredClone(Jqe),clear:()=>{NY=structuredClone(FY.sections),sgt=FY.showData,hg()},setDiagramTitle:Nb,getDiagramTitle:pg,setAccTitle:E0,getAccTitle:fg,setAccDescription:dg,getAccDescription:gg,addSection:(i,a)=>{i=Q1(i,Oe()),NY[i]===void 0&&(NY[i]=a,Ut.debug(`added new section: ${i}, with value: ${a}`))},getSections:()=>NY,cleanupValue:i=>(i.substring(0,1)===":"&&(i=i.substring(1).trim()),Number(i.trim())),setShowData:i=>{sgt=i},getShowData:()=>sgt},eHe=i=>` + .pieCircle{ + stroke: ${i.pieStrokeColor}; + stroke-width : ${i.pieStrokeWidth}; + opacity : ${i.pieOpacity}; + } + .pieOuterCircle{ + stroke: ${i.pieOuterStrokeColor}; + stroke-width: ${i.pieOuterStrokeWidth}; + fill: none; + } + .pieTitleText { + text-anchor: middle; + font-size: ${i.pieTitleTextSize}; + fill: ${i.pieTitleTextColor}; + font-family: ${i.fontFamily}; + } + .slice { + font-family: ${i.fontFamily}; + fill: ${i.pieSectionTextColor}; + font-size:${i.pieSectionTextSize}; + // fill: white; + } + .legend text { + fill: ${i.pieLegendTextColor}; + font-family: ${i.fontFamily}; + font-size: ${i.pieLegendTextSize}; + } +`,nHe=i=>{const a=Object.entries(i).map(p=>({label:p[0],value:p[1]})).sort((p,w)=>w.value-p.value);return uTe().value(p=>p.value)(a)},rHe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:Zqe,db:tHe,renderer:{draw:(i,a,f,p)=>{var pt,U;Ut.debug(`rendering pie chart +`+i);const w=p.db,m=Oe(),b=rF(w.getConfig(),m.pie),E=450,_=((U=(pt=document.getElementById(a))==null?void 0:pt.parentElement)==null?void 0:U.offsetWidth)??b.useWidth,A=VW(a);A.attr("viewBox",`0 0 ${_} ${E}`),k0(A,E,_,b.useMaxWidth);const I=40,B=18,N=4,R=A.append("g");R.attr("transform","translate("+_/2+","+E/2+")");const{themeVariables:z}=m;let[W]=VA(z.pieOuterStrokeWidth);W??(W=2);const et=b.textPosition,st=Math.min(_,E)/2-I,at=OA().innerRadius(0).outerRadius(st),bt=OA().innerRadius(st*et).outerRadius(st*et);R.append("circle").attr("cx",0).attr("cy",0).attr("r",st+W/2).attr("class","pieOuterCircle");const mt=w.getSections(),yt=nHe(mt),ft=[z.pie1,z.pie2,z.pie3,z.pie4,z.pie5,z.pie6,z.pie7,z.pie8,z.pie9,z.pie10,z.pie11,z.pie12],ut=XU(ft);R.selectAll("mySlices").data(yt).enter().append("path").attr("d",at).attr("fill",Tt=>ut(Tt.data.label)).attr("class","pieCircle");let vt=0;Object.keys(mt).forEach(Tt=>{vt+=mt[Tt]}),R.selectAll("mySlices").data(yt).enter().append("text").text(Tt=>(Tt.data.value/vt*100).toFixed(0)+"%").attr("transform",Tt=>"translate("+bt.centroid(Tt)+")").style("text-anchor","middle").attr("class","slice"),R.append("text").text(w.getDiagramTitle()).attr("x",0).attr("y",-(E-50)/2).attr("class","pieTitleText");const X=R.selectAll(".legend").data(ut.domain()).enter().append("g").attr("class","legend").attr("transform",(Tt,nt)=>{const It=B+N,Ot=It*ut.domain().length/2,Bt=12*B,Et=nt*It-Ot;return"translate("+Bt+","+Et+")"});X.append("rect").attr("width",B).attr("height",B).style("fill",ut).style("stroke",ut),X.data(yt).append("text").attr("x",B+N).attr("y",B-N).text(Tt=>{const{label:nt,value:It}=Tt.data;return w.getShowData()?`${nt} [${It}]`:nt})}},styles:eHe}},Symbol.toStringTag,{value:"Module"}));var agt=function(){var i=function(Se,me,Ve,Ye){for(Ve=Ve||{},Ye=Se.length;Ye--;Ve[Se[Ye]]=me);return Ve},a=[1,3],f=[1,4],p=[1,5],w=[1,6],m=[1,7],b=[1,5,13,15,17,19,20,25,27,28,29,30,31,32,33,34,37,38,40,41,42,43,44,45,46,47,48,49,50],E=[1,5,6,13,15,17,19,20,25,27,28,29,30,31,32,33,34,37,38,40,41,42,43,44,45,46,47,48,49,50],_=[32,33,34],A=[2,7],I=[1,13],B=[1,17],N=[1,18],R=[1,19],z=[1,20],W=[1,21],et=[1,22],st=[1,23],at=[1,24],bt=[1,25],mt=[1,26],yt=[1,27],ft=[1,30],ut=[1,31],vt=[1,32],X=[1,33],pt=[1,34],U=[1,35],Tt=[1,36],nt=[1,37],It=[1,38],Ot=[1,39],Bt=[1,40],Et=[1,41],Z=[1,42],Ct=[1,57],xt=[1,58],Ht=[5,22,26,32,33,34,40,41,42,43,44,45,46,47,48,49,50,51],Le={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,SPACE:5,QUADRANT:6,document:7,line:8,statement:9,axisDetails:10,quadrantDetails:11,points:12,title:13,title_value:14,acc_title:15,acc_title_value:16,acc_descr:17,acc_descr_value:18,acc_descr_multiline_value:19,section:20,text:21,point_start:22,point_x:23,point_y:24,"X-AXIS":25,"AXIS-TEXT-DELIMITER":26,"Y-AXIS":27,QUADRANT_1:28,QUADRANT_2:29,QUADRANT_3:30,QUADRANT_4:31,NEWLINE:32,SEMI:33,EOF:34,alphaNumToken:35,textNoTagsToken:36,STR:37,MD_STR:38,alphaNum:39,PUNCTUATION:40,AMP:41,NUM:42,ALPHA:43,COMMA:44,PLUS:45,EQUALS:46,MULT:47,DOT:48,BRKT:49,UNDERSCORE:50,MINUS:51,$accept:0,$end:1},terminals_:{2:"error",5:"SPACE",6:"QUADRANT",13:"title",14:"title_value",15:"acc_title",16:"acc_title_value",17:"acc_descr",18:"acc_descr_value",19:"acc_descr_multiline_value",20:"section",22:"point_start",23:"point_x",24:"point_y",25:"X-AXIS",26:"AXIS-TEXT-DELIMITER",27:"Y-AXIS",28:"QUADRANT_1",29:"QUADRANT_2",30:"QUADRANT_3",31:"QUADRANT_4",32:"NEWLINE",33:"SEMI",34:"EOF",37:"STR",38:"MD_STR",40:"PUNCTUATION",41:"AMP",42:"NUM",43:"ALPHA",44:"COMMA",45:"PLUS",46:"EQUALS",47:"MULT",48:"DOT",49:"BRKT",50:"UNDERSCORE",51:"MINUS"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[9,0],[9,2],[9,1],[9,1],[9,1],[9,2],[9,2],[9,2],[9,1],[9,1],[12,4],[10,4],[10,3],[10,2],[10,4],[10,3],[10,2],[11,2],[11,2],[11,2],[11,2],[4,1],[4,1],[4,1],[21,1],[21,2],[21,1],[21,1],[39,1],[39,2],[35,1],[35,1],[35,1],[35,1],[35,1],[35,1],[35,1],[35,1],[35,1],[35,1],[35,1],[36,1],[36,1],[36,1]],performAction:function(me,Ve,Ye,ce,ke,zt,re){var se=zt.length-1;switch(ke){case 12:this.$=zt[se].trim(),ce.setDiagramTitle(this.$);break;case 13:this.$=zt[se].trim(),ce.setAccTitle(this.$);break;case 14:case 15:this.$=zt[se].trim(),ce.setAccDescription(this.$);break;case 16:ce.addSection(zt[se].substr(8)),this.$=zt[se].substr(8);break;case 17:ce.addPoint(zt[se-3],zt[se-1],zt[se]);break;case 18:ce.setXAxisLeftText(zt[se-2]),ce.setXAxisRightText(zt[se]);break;case 19:zt[se-1].text+=" ⟶ ",ce.setXAxisLeftText(zt[se-1]);break;case 20:ce.setXAxisLeftText(zt[se]);break;case 21:ce.setYAxisBottomText(zt[se-2]),ce.setYAxisTopText(zt[se]);break;case 22:zt[se-1].text+=" ⟶ ",ce.setYAxisBottomText(zt[se-1]);break;case 23:ce.setYAxisBottomText(zt[se]);break;case 24:ce.setQuadrant1Text(zt[se]);break;case 25:ce.setQuadrant2Text(zt[se]);break;case 26:ce.setQuadrant3Text(zt[se]);break;case 27:ce.setQuadrant4Text(zt[se]);break;case 31:this.$={text:zt[se],type:"text"};break;case 32:this.$={text:zt[se-1].text+""+zt[se],type:zt[se-1].type};break;case 33:this.$={text:zt[se],type:"text"};break;case 34:this.$={text:zt[se],type:"markdown"};break;case 35:this.$=zt[se];break;case 36:this.$=zt[se-1]+""+zt[se];break}},table:[{3:1,4:2,5:a,6:f,32:p,33:w,34:m},{1:[3]},{3:8,4:2,5:a,6:f,32:p,33:w,34:m},{3:9,4:2,5:a,6:f,32:p,33:w,34:m},i(b,[2,4],{7:10}),i(E,[2,28]),i(E,[2,29]),i(E,[2,30]),{1:[2,1]},{1:[2,2]},i(_,A,{8:11,9:12,10:14,11:15,12:16,21:28,35:29,1:[2,3],5:I,13:B,15:N,17:R,19:z,20:W,25:et,27:st,28:at,29:bt,30:mt,31:yt,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z}),i(b,[2,5]),{4:43,32:p,33:w,34:m},i(_,A,{10:14,11:15,12:16,21:28,35:29,9:44,5:I,13:B,15:N,17:R,19:z,20:W,25:et,27:st,28:at,29:bt,30:mt,31:yt,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z}),i(_,[2,9]),i(_,[2,10]),i(_,[2,11]),{14:[1,45]},{16:[1,46]},{18:[1,47]},i(_,[2,15]),i(_,[2,16]),{21:48,35:29,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z},{21:49,35:29,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z},{21:50,35:29,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z},{21:51,35:29,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z},{21:52,35:29,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z},{21:53,35:29,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z},{5:Ct,22:[1,54],35:56,36:55,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z,51:xt},i(Ht,[2,31]),i(Ht,[2,33]),i(Ht,[2,34]),i(Ht,[2,37]),i(Ht,[2,38]),i(Ht,[2,39]),i(Ht,[2,40]),i(Ht,[2,41]),i(Ht,[2,42]),i(Ht,[2,43]),i(Ht,[2,44]),i(Ht,[2,45]),i(Ht,[2,46]),i(Ht,[2,47]),i(b,[2,6]),i(_,[2,8]),i(_,[2,12]),i(_,[2,13]),i(_,[2,14]),i(_,[2,20],{36:55,35:56,5:Ct,26:[1,59],40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z,51:xt}),i(_,[2,23],{36:55,35:56,5:Ct,26:[1,60],40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z,51:xt}),i(_,[2,24],{36:55,35:56,5:Ct,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z,51:xt}),i(_,[2,25],{36:55,35:56,5:Ct,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z,51:xt}),i(_,[2,26],{36:55,35:56,5:Ct,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z,51:xt}),i(_,[2,27],{36:55,35:56,5:Ct,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z,51:xt}),{23:[1,61]},i(Ht,[2,32]),i(Ht,[2,48]),i(Ht,[2,49]),i(Ht,[2,50]),i(_,[2,19],{35:29,21:62,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z}),i(_,[2,22],{35:29,21:63,37:ft,38:ut,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z}),{24:[1,64]},i(_,[2,18],{36:55,35:56,5:Ct,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z,51:xt}),i(_,[2,21],{36:55,35:56,5:Ct,40:vt,41:X,42:pt,43:U,44:Tt,45:nt,46:It,47:Ot,48:Bt,49:Et,50:Z,51:xt}),i(_,[2,17])],defaultActions:{8:[2,1],9:[2,2]},parseError:function(me,Ve){if(Ve.recoverable)this.trace(me);else{var Ye=new Error(me);throw Ye.hash=Ve,Ye}},parse:function(me){var Ve=this,Ye=[0],ce=[],ke=[null],zt=[],re=this.table,se="",Pe=0,te=0,Me=2,de=1,on=zt.slice.call(arguments,1),ni=Object.create(this.lexer),Ks={yy:{}};for(var ws in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ws)&&(Ks.yy[ws]=this.yy[ws]);ni.setInput(me,Ks.yy),Ks.yy.lexer=ni,Ks.yy.parser=this,typeof ni.yylloc>"u"&&(ni.yylloc={});var fo=ni.yylloc;zt.push(fo);var Xi=ni.options&&ni.options.ranges;typeof Ks.yy.parseError=="function"?this.parseError=Ks.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Er(){var Gs;return Gs=ce.pop()||ni.lex()||de,typeof Gs!="number"&&(Gs instanceof Array&&(ce=Gs,Gs=ce.pop()),Gs=Ve.symbols_[Gs]||Gs),Gs}for(var Xn,di,Ee,Kn,He={},Ti,pn,Es,qa;;){if(di=Ye[Ye.length-1],this.defaultActions[di]?Ee=this.defaultActions[di]:((Xn===null||typeof Xn>"u")&&(Xn=Er()),Ee=re[di]&&re[di][Xn]),typeof Ee>"u"||!Ee.length||!Ee[0]){var Ma="";qa=[];for(Ti in re[di])this.terminals_[Ti]&&Ti>Me&&qa.push("'"+this.terminals_[Ti]+"'");ni.showPosition?Ma="Parse error on line "+(Pe+1)+`: +`+ni.showPosition()+` +Expecting `+qa.join(", ")+", got '"+(this.terminals_[Xn]||Xn)+"'":Ma="Parse error on line "+(Pe+1)+": Unexpected "+(Xn==de?"end of input":"'"+(this.terminals_[Xn]||Xn)+"'"),this.parseError(Ma,{text:ni.match,token:this.terminals_[Xn]||Xn,line:ni.yylineno,loc:fo,expected:qa})}if(Ee[0]instanceof Array&&Ee.length>1)throw new Error("Parse Error: multiple actions possible at state: "+di+", token: "+Xn);switch(Ee[0]){case 1:Ye.push(Xn),ke.push(ni.yytext),zt.push(ni.yylloc),Ye.push(Ee[1]),Xn=null,te=ni.yyleng,se=ni.yytext,Pe=ni.yylineno,fo=ni.yylloc;break;case 2:if(pn=this.productions_[Ee[1]][1],He.$=ke[ke.length-pn],He._$={first_line:zt[zt.length-(pn||1)].first_line,last_line:zt[zt.length-1].last_line,first_column:zt[zt.length-(pn||1)].first_column,last_column:zt[zt.length-1].last_column},Xi&&(He._$.range=[zt[zt.length-(pn||1)].range[0],zt[zt.length-1].range[1]]),Kn=this.performAction.apply(He,[se,te,Pe,Ks.yy,Ee[1],ke,zt].concat(on)),typeof Kn<"u")return Kn;pn&&(Ye=Ye.slice(0,-1*pn*2),ke=ke.slice(0,-1*pn),zt=zt.slice(0,-1*pn)),Ye.push(this.productions_[Ee[1]][0]),ke.push(He.$),zt.push(He._$),Es=re[Ye[Ye.length-2]][Ye[Ye.length-1]],Ye.push(Es);break;case 3:return!0}}return!0}},Ft=function(){var Se={EOF:1,parseError:function(Ve,Ye){if(this.yy.parser)this.yy.parser.parseError(Ve,Ye);else throw new Error(Ve)},setInput:function(me,Ve){return this.yy=Ve||this.yy||{},this._input=me,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var me=this._input[0];this.yytext+=me,this.yyleng++,this.offset++,this.match+=me,this.matched+=me;var Ve=me.match(/(?:\r\n?|\n).*/g);return Ve?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),me},unput:function(me){var Ve=me.length,Ye=me.split(/(?:\r\n?|\n)/g);this._input=me+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ve),this.offset-=Ve;var ce=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Ye.length-1&&(this.yylineno-=Ye.length-1);var ke=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Ye?(Ye.length===ce.length?this.yylloc.first_column:0)+ce[ce.length-Ye.length].length-Ye[0].length:this.yylloc.first_column-Ve},this.options.ranges&&(this.yylloc.range=[ke[0],ke[0]+this.yyleng-Ve]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(me){this.unput(this.match.slice(me))},pastInput:function(){var me=this.matched.substr(0,this.matched.length-this.match.length);return(me.length>20?"...":"")+me.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var me=this.match;return me.length<20&&(me+=this._input.substr(0,20-me.length)),(me.substr(0,20)+(me.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var me=this.pastInput(),Ve=new Array(me.length+1).join("-");return me+this.upcomingInput()+` +`+Ve+"^"},test_match:function(me,Ve){var Ye,ce,ke;if(this.options.backtrack_lexer&&(ke={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ke.yylloc.range=this.yylloc.range.slice(0))),ce=me[0].match(/(?:\r\n?|\n).*/g),ce&&(this.yylineno+=ce.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ce?ce[ce.length-1].length-ce[ce.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+me[0].length},this.yytext+=me[0],this.match+=me[0],this.matches=me,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(me[0].length),this.matched+=me[0],Ye=this.performAction.call(this,this.yy,this,Ve,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Ye)return Ye;if(this._backtrack){for(var zt in ke)this[zt]=ke[zt];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var me,Ve,Ye,ce;this._more||(this.yytext="",this.match="");for(var ke=this._currentRules(),zt=0;ztVe[0].length)){if(Ve=Ye,ce=zt,this.options.backtrack_lexer){if(me=this.test_match(Ye,ke[zt]),me!==!1)return me;if(this._backtrack){Ve=!1;continue}else return!1}else if(!this.options.flex)break}return Ve?(me=this.test_match(Ve,ke[ce]),me!==!1?me:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var Ve=this.next();return Ve||this.lex()},begin:function(Ve){this.conditionStack.push(Ve)},popState:function(){var Ve=this.conditionStack.length-1;return Ve>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(Ve){return Ve=this.conditionStack.length-1-Math.abs(Ve||0),Ve>=0?this.conditionStack[Ve]:"INITIAL"},pushState:function(Ve){this.begin(Ve)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(Ve,Ye,ce,ke){switch(ce){case 0:break;case 1:break;case 2:return 32;case 3:break;case 4:return this.begin("title"),13;case 5:return this.popState(),"title_value";case 6:return this.begin("acc_title"),15;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),17;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 25;case 14:return 27;case 15:return 26;case 16:return 28;case 17:return 29;case 18:return 30;case 19:return 31;case 20:this.begin("md_string");break;case 21:return"MD_STR";case 22:this.popState();break;case 23:this.begin("string");break;case 24:this.popState();break;case 25:return"STR";case 26:return this.begin("point_start"),22;case 27:return this.begin("point_x"),23;case 28:this.popState();break;case 29:this.popState(),this.begin("point_y");break;case 30:return this.popState(),24;case 31:return 6;case 32:return 43;case 33:return"COLON";case 34:return 45;case 35:return 44;case 36:return 46;case 37:return 46;case 38:return 47;case 39:return 49;case 40:return 50;case 41:return 48;case 42:return 41;case 43:return 51;case 44:return 42;case 45:return 5;case 46:return 33;case 47:return 40;case 48:return 34}},rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{point_y:{rules:[30],inclusive:!1},point_x:{rules:[29],inclusive:!1},point_start:{rules:[27,28],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[21,22],inclusive:!1},string:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,23,26,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],inclusive:!0}}};return Se}();Le.lexer=Ft;function gn(){this.yy={}}return gn.prototype=Le,Le.Parser=gn,new gn}();agt.parser=agt;const iHe=agt,mg=X1t();class sHe{constructor(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){var a,f,p,w,m,b,E,_,A,I,B,N,R,z,W,et,st,at;return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:((a=Zh.quadrantChart)==null?void 0:a.chartWidth)||500,chartWidth:((f=Zh.quadrantChart)==null?void 0:f.chartHeight)||500,titlePadding:((p=Zh.quadrantChart)==null?void 0:p.titlePadding)||10,titleFontSize:((w=Zh.quadrantChart)==null?void 0:w.titleFontSize)||20,quadrantPadding:((m=Zh.quadrantChart)==null?void 0:m.quadrantPadding)||5,xAxisLabelPadding:((b=Zh.quadrantChart)==null?void 0:b.xAxisLabelPadding)||5,yAxisLabelPadding:((E=Zh.quadrantChart)==null?void 0:E.yAxisLabelPadding)||5,xAxisLabelFontSize:((_=Zh.quadrantChart)==null?void 0:_.xAxisLabelFontSize)||16,yAxisLabelFontSize:((A=Zh.quadrantChart)==null?void 0:A.yAxisLabelFontSize)||16,quadrantLabelFontSize:((I=Zh.quadrantChart)==null?void 0:I.quadrantLabelFontSize)||16,quadrantTextTopPadding:((B=Zh.quadrantChart)==null?void 0:B.quadrantTextTopPadding)||5,pointTextPadding:((N=Zh.quadrantChart)==null?void 0:N.pointTextPadding)||5,pointLabelFontSize:((R=Zh.quadrantChart)==null?void 0:R.pointLabelFontSize)||12,pointRadius:((z=Zh.quadrantChart)==null?void 0:z.pointRadius)||5,xAxisPosition:((W=Zh.quadrantChart)==null?void 0:W.xAxisPosition)||"top",yAxisPosition:((et=Zh.quadrantChart)==null?void 0:et.yAxisPosition)||"left",quadrantInternalBorderStrokeWidth:((st=Zh.quadrantChart)==null?void 0:st.quadrantInternalBorderStrokeWidth)||1,quadrantExternalBorderStrokeWidth:((at=Zh.quadrantChart)==null?void 0:at.quadrantExternalBorderStrokeWidth)||2}}getDefaultThemeConfig(){return{quadrant1Fill:mg.quadrant1Fill,quadrant2Fill:mg.quadrant2Fill,quadrant3Fill:mg.quadrant3Fill,quadrant4Fill:mg.quadrant4Fill,quadrant1TextFill:mg.quadrant1TextFill,quadrant2TextFill:mg.quadrant2TextFill,quadrant3TextFill:mg.quadrant3TextFill,quadrant4TextFill:mg.quadrant4TextFill,quadrantPointFill:mg.quadrantPointFill,quadrantPointTextFill:mg.quadrantPointTextFill,quadrantXAxisTextFill:mg.quadrantXAxisTextFill,quadrantYAxisTextFill:mg.quadrantYAxisTextFill,quadrantTitleFill:mg.quadrantTitleFill,quadrantInternalBorderStrokeFill:mg.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:mg.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),Ut.info("clear called")}setData(a){this.data={...this.data,...a}}addPoints(a){this.data.points=[...a,...this.data.points]}setConfig(a){Ut.trace("setConfig called with: ",a),this.config={...this.config,...a}}setThemeConfig(a){Ut.trace("setThemeConfig called with: ",a),this.themeConfig={...this.themeConfig,...a}}calculateSpace(a,f,p,w){const m=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,b={top:a==="top"&&f?m:0,bottom:a==="bottom"&&f?m:0},E=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,_={left:this.config.yAxisPosition==="left"&&p?E:0,right:this.config.yAxisPosition==="right"&&p?E:0},A=this.config.titleFontSize+this.config.titlePadding*2,I={top:w?A:0},B=this.config.quadrantPadding+_.left,N=this.config.quadrantPadding+b.top+I.top,R=this.config.chartWidth-this.config.quadrantPadding*2-_.left-_.right,z=this.config.chartHeight-this.config.quadrantPadding*2-b.top-b.bottom-I.top,W=R/2,et=z/2;return{xAxisSpace:b,yAxisSpace:_,titleSpace:I,quadrantSpace:{quadrantLeft:B,quadrantTop:N,quadrantWidth:R,quadrantHalfWidth:W,quadrantHeight:z,quadrantHalfHeight:et}}}getAxisLabels(a,f,p,w){const{quadrantSpace:m,titleSpace:b}=w,{quadrantHalfHeight:E,quadrantHeight:_,quadrantLeft:A,quadrantHalfWidth:I,quadrantTop:B,quadrantWidth:N}=m,R=!!this.data.xAxisRightText,z=!!this.data.yAxisTopText,W=[];return this.data.xAxisLeftText&&f&&W.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:A+(R?I/2:0),y:a==="top"?this.config.xAxisLabelPadding+b.top:this.config.xAxisLabelPadding+B+_+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:R?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&f&&W.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:A+I+(R?I/2:0),y:a==="top"?this.config.xAxisLabelPadding+b.top:this.config.xAxisLabelPadding+B+_+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:R?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&p&&W.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+A+N+this.config.quadrantPadding,y:B+_-(z?E/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:z?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&p&&W.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+A+N+this.config.quadrantPadding,y:B+E-(z?E/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:z?"center":"left",horizontalPos:"top",rotation:-90}),W}getQuadrants(a){const{quadrantSpace:f}=a,{quadrantHalfHeight:p,quadrantLeft:w,quadrantHalfWidth:m,quadrantTop:b}=f,E=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:w+m,y:b,width:m,height:p,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:w,y:b,width:m,height:p,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:w,y:b+p,width:m,height:p,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:w+m,y:b+p,width:m,height:p,fill:this.themeConfig.quadrant4Fill}];for(const _ of E)_.text.x=_.x+_.width/2,this.data.points.length===0?(_.text.y=_.y+_.height/2,_.text.horizontalPos="middle"):(_.text.y=_.y+this.config.quadrantTextTopPadding,_.text.horizontalPos="top");return E}getQuadrantPoints(a){const{quadrantSpace:f}=a,{quadrantHeight:p,quadrantLeft:w,quadrantTop:m,quadrantWidth:b}=f,E=AA().domain([0,1]).range([w,b+w]),_=AA().domain([0,1]).range([p+m,m]);return this.data.points.map(I=>({x:E(I.x),y:_(I.y),fill:this.themeConfig.quadrantPointFill,radius:this.config.pointRadius,text:{text:I.text,fill:this.themeConfig.quadrantPointTextFill,x:E(I.x),y:_(I.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0}}))}getBorders(a){const f=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:p}=a,{quadrantHalfHeight:w,quadrantHeight:m,quadrantLeft:b,quadrantHalfWidth:E,quadrantTop:_,quadrantWidth:A}=p;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:b-f,y1:_,x2:b+A+f,y2:_},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:b+A,y1:_+f,x2:b+A,y2:_+m-f},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:b-f,y1:_+m,x2:b+A+f,y2:_+m},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:b,y1:_+f,x2:b,y2:_+m-f},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:b+E,y1:_+f,x2:b+E,y2:_+m-f},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:b+f,y1:_+w,x2:b+A-f,y2:_+w}]}getTitle(a){if(a)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){const a=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),f=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),p=this.config.showTitle&&!!this.data.titleText,w=this.data.points.length>0?"bottom":this.config.xAxisPosition,m=this.calculateSpace(w,a,f,p);return{points:this.getQuadrantPoints(m),quadrants:this.getQuadrants(m),axisLabels:this.getAxisLabels(w,a,f,m),borderLines:this.getBorders(m),title:this.getTitle(p)}}}const aHe=Oe();function B5(i){return Q1(i.trim(),aHe)}const _0=new sHe;function oHe(i){_0.setData({quadrant1Text:B5(i.text)})}function cHe(i){_0.setData({quadrant2Text:B5(i.text)})}function uHe(i){_0.setData({quadrant3Text:B5(i.text)})}function lHe(i){_0.setData({quadrant4Text:B5(i.text)})}function hHe(i){_0.setData({xAxisLeftText:B5(i.text)})}function fHe(i){_0.setData({xAxisRightText:B5(i.text)})}function dHe(i){_0.setData({yAxisTopText:B5(i.text)})}function gHe(i){_0.setData({yAxisBottomText:B5(i.text)})}function pHe(i,a,f){_0.addPoints([{x:a,y:f,text:B5(i.text)}])}function bHe(i){_0.setConfig({chartWidth:i})}function wHe(i){_0.setConfig({chartHeight:i})}function vHe(){const i=Oe(),{themeVariables:a,quadrantChart:f}=i;return f&&_0.setConfig(f),_0.setThemeConfig({quadrant1Fill:a.quadrant1Fill,quadrant2Fill:a.quadrant2Fill,quadrant3Fill:a.quadrant3Fill,quadrant4Fill:a.quadrant4Fill,quadrant1TextFill:a.quadrant1TextFill,quadrant2TextFill:a.quadrant2TextFill,quadrant3TextFill:a.quadrant3TextFill,quadrant4TextFill:a.quadrant4TextFill,quadrantPointFill:a.quadrantPointFill,quadrantPointTextFill:a.quadrantPointTextFill,quadrantXAxisTextFill:a.quadrantXAxisTextFill,quadrantYAxisTextFill:a.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:a.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:a.quadrantInternalBorderStrokeFill,quadrantTitleFill:a.quadrantTitleFill}),_0.setData({titleText:pg()}),_0.build()}const mHe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:iHe,db:{setWidth:bHe,setHeight:wHe,setQuadrant1Text:oHe,setQuadrant2Text:cHe,setQuadrant3Text:uHe,setQuadrant4Text:lHe,setXAxisLeftText:hHe,setXAxisRightText:fHe,setYAxisTopText:dHe,setYAxisBottomText:gHe,addPoint:pHe,getQuadrantData:vHe,clear:function(){_0.clear(),hg()},setAccTitle:E0,getAccTitle:fg,setDiagramTitle:Nb,getDiagramTitle:pg,getAccDescription:gg,setAccDescription:dg},renderer:{draw:(i,a,f,p)=>{var vt,X,pt;function w(U){return U==="top"?"hanging":"middle"}function m(U){return U==="left"?"start":"middle"}function b(U){return`translate(${U.x}, ${U.y}) rotate(${U.rotation||0})`}const E=Oe();Ut.debug(`Rendering quadrant chart +`+i);const _=E.securityLevel;let A;_==="sandbox"&&(A=yr("#i"+a));const B=yr(_==="sandbox"?A.nodes()[0].contentDocument.body:"body").select(`[id="${a}"]`),N=B.append("g").attr("class","main"),R=((vt=E.quadrantChart)==null?void 0:vt.chartWidth)||500,z=((X=E.quadrantChart)==null?void 0:X.chartHeight)||500;k0(B,z,R,((pt=E.quadrantChart)==null?void 0:pt.useMaxWidth)||!0),B.attr("viewBox","0 0 "+R+" "+z),p.db.setHeight(z),p.db.setWidth(R);const W=p.db.getQuadrantData(),et=N.append("g").attr("class","quadrants"),st=N.append("g").attr("class","border"),at=N.append("g").attr("class","data-points"),bt=N.append("g").attr("class","labels"),mt=N.append("g").attr("class","title");W.title&&mt.append("text").attr("x",0).attr("y",0).attr("fill",W.title.fill).attr("font-size",W.title.fontSize).attr("dominant-baseline",w(W.title.horizontalPos)).attr("text-anchor",m(W.title.verticalPos)).attr("transform",b(W.title)).text(W.title.text),W.borderLines&&st.selectAll("line").data(W.borderLines).enter().append("line").attr("x1",U=>U.x1).attr("y1",U=>U.y1).attr("x2",U=>U.x2).attr("y2",U=>U.y2).style("stroke",U=>U.strokeFill).style("stroke-width",U=>U.strokeWidth);const yt=et.selectAll("g.quadrant").data(W.quadrants).enter().append("g").attr("class","quadrant");yt.append("rect").attr("x",U=>U.x).attr("y",U=>U.y).attr("width",U=>U.width).attr("height",U=>U.height).attr("fill",U=>U.fill),yt.append("text").attr("x",0).attr("y",0).attr("fill",U=>U.text.fill).attr("font-size",U=>U.text.fontSize).attr("dominant-baseline",U=>w(U.text.horizontalPos)).attr("text-anchor",U=>m(U.text.verticalPos)).attr("transform",U=>b(U.text)).text(U=>U.text.text),bt.selectAll("g.label").data(W.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(U=>U.text).attr("fill",U=>U.fill).attr("font-size",U=>U.fontSize).attr("dominant-baseline",U=>w(U.horizontalPos)).attr("text-anchor",U=>m(U.verticalPos)).attr("transform",U=>b(U));const ut=at.selectAll("g.data-point").data(W.points).enter().append("g").attr("class","data-point");ut.append("circle").attr("cx",U=>U.x).attr("cy",U=>U.y).attr("r",U=>U.radius).attr("fill",U=>U.fill),ut.append("text").attr("x",0).attr("y",0).text(U=>U.text.text).attr("fill",U=>U.text.fill).attr("font-size",U=>U.text.fontSize).attr("dominant-baseline",U=>w(U.text.horizontalPos)).attr("text-anchor",U=>m(U.text.verticalPos)).attr("transform",U=>b(U.text))}},styles:()=>""}},Symbol.toStringTag,{value:"Module"}));var ogt=function(){var i=function(Ot,Bt,Et,Z){for(Et=Et||{},Z=Ot.length;Z--;Et[Ot[Z]]=Bt);return Et},a=[1,10,12,14,16,18,19,21,23],f=[2,6],p=[1,3],w=[1,5],m=[1,6],b=[1,7],E=[1,5,10,12,14,16,18,19,21,23,34,35,36],_=[1,25],A=[1,26],I=[1,28],B=[1,29],N=[1,30],R=[1,31],z=[1,32],W=[1,33],et=[1,34],st=[1,35],at=[1,36],bt=[1,37],mt=[1,43],yt=[1,42],ft=[1,47],ut=[1,50],vt=[1,10,12,14,16,18,19,21,23,34,35,36],X=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],pt=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],U=[1,64],Tt={trace:function(){},yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:function(Bt,Et,Z,Ct,xt,Ht,Le){var Ft=Ht.length-1;switch(xt){case 5:Ct.setOrientation(Ht[Ft]);break;case 9:Ct.setDiagramTitle(Ht[Ft].text.trim());break;case 12:Ct.setLineData({text:"",type:"text"},Ht[Ft]);break;case 13:Ct.setLineData(Ht[Ft-1],Ht[Ft]);break;case 14:Ct.setBarData({text:"",type:"text"},Ht[Ft]);break;case 15:Ct.setBarData(Ht[Ft-1],Ht[Ft]);break;case 16:this.$=Ht[Ft].trim(),Ct.setAccTitle(this.$);break;case 17:case 18:this.$=Ht[Ft].trim(),Ct.setAccDescription(this.$);break;case 19:this.$=Ht[Ft-1];break;case 20:this.$=[Number(Ht[Ft-2]),...Ht[Ft]];break;case 21:this.$=[Number(Ht[Ft])];break;case 22:Ct.setXAxisTitle(Ht[Ft]);break;case 23:Ct.setXAxisTitle(Ht[Ft-1]);break;case 24:Ct.setXAxisTitle({type:"text",text:""});break;case 25:Ct.setXAxisBand(Ht[Ft]);break;case 26:Ct.setXAxisRangeData(Number(Ht[Ft-2]),Number(Ht[Ft]));break;case 27:this.$=Ht[Ft-1];break;case 28:this.$=[Ht[Ft-2],...Ht[Ft]];break;case 29:this.$=[Ht[Ft]];break;case 30:Ct.setYAxisTitle(Ht[Ft]);break;case 31:Ct.setYAxisTitle(Ht[Ft-1]);break;case 32:Ct.setYAxisTitle({type:"text",text:""});break;case 33:Ct.setYAxisRangeData(Number(Ht[Ft-2]),Number(Ht[Ft]));break;case 37:this.$={text:Ht[Ft],type:"text"};break;case 38:this.$={text:Ht[Ft],type:"text"};break;case 39:this.$={text:Ht[Ft],type:"markdown"};break;case 40:this.$=Ht[Ft];break;case 41:this.$=Ht[Ft-1]+""+Ht[Ft];break}},table:[i(a,f,{3:1,4:2,7:4,5:p,34:w,35:m,36:b}),{1:[3]},i(a,f,{4:2,7:4,3:8,5:p,34:w,35:m,36:b}),i(a,f,{4:2,7:4,6:9,3:10,5:p,8:[1,11],34:w,35:m,36:b}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},i(E,[2,34]),i(E,[2,35]),i(E,[2,36]),{1:[2,1]},i(a,f,{4:2,7:4,3:21,5:p,34:w,35:m,36:b}),{1:[2,3]},i(E,[2,5]),i(a,[2,7],{4:22,34:w,35:m,36:b}),{11:23,37:24,38:_,39:A,40:27,41:I,42:B,43:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt},{11:39,13:38,24:mt,27:yt,29:40,30:41,37:24,38:_,39:A,40:27,41:I,42:B,43:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt},{11:45,15:44,27:ft,33:46,37:24,38:_,39:A,40:27,41:I,42:B,43:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt},{11:49,17:48,24:ut,37:24,38:_,39:A,40:27,41:I,42:B,43:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt},{11:52,17:51,24:ut,37:24,38:_,39:A,40:27,41:I,42:B,43:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt},{20:[1,53]},{22:[1,54]},i(vt,[2,18]),{1:[2,2]},i(vt,[2,8]),i(vt,[2,9]),i(X,[2,37],{40:55,41:I,42:B,43:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt}),i(X,[2,38]),i(X,[2,39]),i(pt,[2,40]),i(pt,[2,42]),i(pt,[2,43]),i(pt,[2,44]),i(pt,[2,45]),i(pt,[2,46]),i(pt,[2,47]),i(pt,[2,48]),i(pt,[2,49]),i(pt,[2,50]),i(pt,[2,51]),i(vt,[2,10]),i(vt,[2,22],{30:41,29:56,24:mt,27:yt}),i(vt,[2,24]),i(vt,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:_,39:A,40:27,41:I,42:B,43:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt},i(vt,[2,11]),i(vt,[2,30],{33:60,27:ft}),i(vt,[2,32]),{31:[1,61]},i(vt,[2,12]),{17:62,24:ut},{25:63,27:U},i(vt,[2,14]),{17:65,24:ut},i(vt,[2,16]),i(vt,[2,17]),i(pt,[2,41]),i(vt,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},i(vt,[2,31]),{27:[1,69]},i(vt,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},i(vt,[2,15]),i(vt,[2,26]),i(vt,[2,27]),{11:59,32:72,37:24,38:_,39:A,40:27,41:I,42:B,43:N,44:R,45:z,46:W,47:et,48:st,49:at,50:bt},i(vt,[2,33]),i(vt,[2,19]),{25:73,27:U},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:function(Bt,Et){if(Et.recoverable)this.trace(Bt);else{var Z=new Error(Bt);throw Z.hash=Et,Z}},parse:function(Bt){var Et=this,Z=[0],Ct=[],xt=[null],Ht=[],Le=this.table,Ft="",gn=0,Se=0,me=2,Ve=1,Ye=Ht.slice.call(arguments,1),ce=Object.create(this.lexer),ke={yy:{}};for(var zt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,zt)&&(ke.yy[zt]=this.yy[zt]);ce.setInput(Bt,ke.yy),ke.yy.lexer=ce,ke.yy.parser=this,typeof ce.yylloc>"u"&&(ce.yylloc={});var re=ce.yylloc;Ht.push(re);var se=ce.options&&ce.options.ranges;typeof ke.yy.parseError=="function"?this.parseError=ke.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Pe(){var Xn;return Xn=Ct.pop()||ce.lex()||Ve,typeof Xn!="number"&&(Xn instanceof Array&&(Ct=Xn,Xn=Ct.pop()),Xn=Et.symbols_[Xn]||Xn),Xn}for(var te,Me,de,on,ni={},Ks,ws,fo,Xi;;){if(Me=Z[Z.length-1],this.defaultActions[Me]?de=this.defaultActions[Me]:((te===null||typeof te>"u")&&(te=Pe()),de=Le[Me]&&Le[Me][te]),typeof de>"u"||!de.length||!de[0]){var Er="";Xi=[];for(Ks in Le[Me])this.terminals_[Ks]&&Ks>me&&Xi.push("'"+this.terminals_[Ks]+"'");ce.showPosition?Er="Parse error on line "+(gn+1)+`: +`+ce.showPosition()+` +Expecting `+Xi.join(", ")+", got '"+(this.terminals_[te]||te)+"'":Er="Parse error on line "+(gn+1)+": Unexpected "+(te==Ve?"end of input":"'"+(this.terminals_[te]||te)+"'"),this.parseError(Er,{text:ce.match,token:this.terminals_[te]||te,line:ce.yylineno,loc:re,expected:Xi})}if(de[0]instanceof Array&&de.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Me+", token: "+te);switch(de[0]){case 1:Z.push(te),xt.push(ce.yytext),Ht.push(ce.yylloc),Z.push(de[1]),te=null,Se=ce.yyleng,Ft=ce.yytext,gn=ce.yylineno,re=ce.yylloc;break;case 2:if(ws=this.productions_[de[1]][1],ni.$=xt[xt.length-ws],ni._$={first_line:Ht[Ht.length-(ws||1)].first_line,last_line:Ht[Ht.length-1].last_line,first_column:Ht[Ht.length-(ws||1)].first_column,last_column:Ht[Ht.length-1].last_column},se&&(ni._$.range=[Ht[Ht.length-(ws||1)].range[0],Ht[Ht.length-1].range[1]]),on=this.performAction.apply(ni,[Ft,Se,gn,ke.yy,de[1],xt,Ht].concat(Ye)),typeof on<"u")return on;ws&&(Z=Z.slice(0,-1*ws*2),xt=xt.slice(0,-1*ws),Ht=Ht.slice(0,-1*ws)),Z.push(this.productions_[de[1]][0]),xt.push(ni.$),Ht.push(ni._$),fo=Le[Z[Z.length-2]][Z[Z.length-1]],Z.push(fo);break;case 3:return!0}}return!0}},nt=function(){var Ot={EOF:1,parseError:function(Et,Z){if(this.yy.parser)this.yy.parser.parseError(Et,Z);else throw new Error(Et)},setInput:function(Bt,Et){return this.yy=Et||this.yy||{},this._input=Bt,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var Bt=this._input[0];this.yytext+=Bt,this.yyleng++,this.offset++,this.match+=Bt,this.matched+=Bt;var Et=Bt.match(/(?:\r\n?|\n).*/g);return Et?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Bt},unput:function(Bt){var Et=Bt.length,Z=Bt.split(/(?:\r\n?|\n)/g);this._input=Bt+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Et),this.offset-=Et;var Ct=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Z.length-1&&(this.yylineno-=Z.length-1);var xt=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Z?(Z.length===Ct.length?this.yylloc.first_column:0)+Ct[Ct.length-Z.length].length-Z[0].length:this.yylloc.first_column-Et},this.options.ranges&&(this.yylloc.range=[xt[0],xt[0]+this.yyleng-Et]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(Bt){this.unput(this.match.slice(Bt))},pastInput:function(){var Bt=this.matched.substr(0,this.matched.length-this.match.length);return(Bt.length>20?"...":"")+Bt.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var Bt=this.match;return Bt.length<20&&(Bt+=this._input.substr(0,20-Bt.length)),(Bt.substr(0,20)+(Bt.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var Bt=this.pastInput(),Et=new Array(Bt.length+1).join("-");return Bt+this.upcomingInput()+` +`+Et+"^"},test_match:function(Bt,Et){var Z,Ct,xt;if(this.options.backtrack_lexer&&(xt={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(xt.yylloc.range=this.yylloc.range.slice(0))),Ct=Bt[0].match(/(?:\r\n?|\n).*/g),Ct&&(this.yylineno+=Ct.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Ct?Ct[Ct.length-1].length-Ct[Ct.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Bt[0].length},this.yytext+=Bt[0],this.match+=Bt[0],this.matches=Bt,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Bt[0].length),this.matched+=Bt[0],Z=this.performAction.call(this,this.yy,this,Et,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Z)return Z;if(this._backtrack){for(var Ht in xt)this[Ht]=xt[Ht];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Bt,Et,Z,Ct;this._more||(this.yytext="",this.match="");for(var xt=this._currentRules(),Ht=0;HtEt[0].length)){if(Et=Z,Ct=Ht,this.options.backtrack_lexer){if(Bt=this.test_match(Z,xt[Ht]),Bt!==!1)return Bt;if(this._backtrack){Et=!1;continue}else return!1}else if(!this.options.flex)break}return Et?(Bt=this.test_match(Et,xt[Ct]),Bt!==!1?Bt:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var Et=this.next();return Et||this.lex()},begin:function(Et){this.conditionStack.push(Et)},popState:function(){var Et=this.conditionStack.length-1;return Et>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(Et){return Et=this.conditionStack.length-1-Math.abs(Et||0),Et>=0?this.conditionStack[Et]:"INITIAL"},pushState:function(Et){this.begin(Et)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(Et,Z,Ct,xt){switch(Ct){case 0:break;case 1:break;case 2:return this.popState(),34;case 3:return this.popState(),34;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;case 8:return this.popState(),"acc_title_value";case 9:return this.pushState("acc_descr"),21;case 10:return this.popState(),"acc_descr_value";case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 8;case 16:return this.pushState("axis_data"),"X_AXIS";case 17:return this.pushState("axis_data"),"Y_AXIS";case 18:return this.pushState("axis_band_data"),24;case 19:return 31;case 20:return this.pushState("data"),16;case 21:return this.pushState("data"),18;case 22:return this.pushState("data_inner"),24;case 23:return 27;case 24:return this.popState(),26;case 25:this.popState();break;case 26:this.pushState("string");break;case 27:this.popState();break;case 28:return"STR";case 29:return 24;case 30:return 26;case 31:return 43;case 32:return"COLON";case 33:return 44;case 34:return 28;case 35:return 45;case 36:return 46;case 37:return 48;case 38:return 50;case 39:return 47;case 40:return 41;case 41:return 49;case 42:return 42;case 43:break;case 44:return 35;case 45:return 36}},rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\{)/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,20,21,22,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,23,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[27,28],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0}}};return Ot}();Tt.lexer=nt;function It(){this.yy={}}return It.prototype=Tt,Tt.Parser=It,new It}();ogt.parser=ogt;const yHe=ogt;function oRt(i){return i.type==="bar"}function cRt(i){return i.type==="band"}function BF(i){return i.type==="linear"}class uRt{constructor(a){this.parentGroup=a}getMaxDimension(a,f){if(!this.parentGroup)return{width:a.reduce((m,b)=>Math.max(b.length,m),0)*f,height:f};const p={width:0,height:0},w=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",f);for(const m of a){const b=k$e(w,1,m),E=b?b.width:m.length*f,_=b?b.height:f;p.width=Math.max(p.width,E),p.height=Math.max(p.height,_)}return w.remove(),p}}const lRt=.7,hRt=.2;class fRt{constructor(a,f,p,w){this.axisConfig=a,this.title=f,this.textDimensionCalculator=p,this.axisThemeConfig=w,this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left",this.showTitle=!1,this.showLabel=!1,this.showTick=!1,this.showAxisLine=!1,this.outerPadding=0,this.titleTextHeight=0,this.labelTextHeight=0,this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}setRange(a){this.range=a,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=a[1]-a[0]:this.boundingRect.width=a[1]-a[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(a){this.axisPosition=a,this.setRange(this.range)}getTickDistance(){const a=this.getRange();return Math.abs(a[0]-a[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(a=>a.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){lRt*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor(lRt*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(a){let f=a.height;if(this.axisConfig.showAxisLine&&f>this.axisConfig.axisLineWidth&&(f-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){const p=this.getLabelDimension(),w=hRt*a.width;this.outerPadding=Math.min(p.width/2,w);const m=p.height+this.axisConfig.labelPadding*2;this.labelTextHeight=p.height,m<=f&&(f-=m,this.showLabel=!0)}if(this.axisConfig.showTick&&f>=this.axisConfig.tickLength&&(this.showTick=!0,f-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){const p=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),w=p.height+this.axisConfig.titlePadding*2;this.titleTextHeight=p.height,w<=f&&(f-=w,this.showTitle=!0)}this.boundingRect.width=a.width,this.boundingRect.height=a.height-f}calculateSpaceIfDrawnVertical(a){let f=a.width;if(this.axisConfig.showAxisLine&&f>this.axisConfig.axisLineWidth&&(f-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){const p=this.getLabelDimension(),w=hRt*a.height;this.outerPadding=Math.min(p.height/2,w);const m=p.width+this.axisConfig.labelPadding*2;m<=f&&(f-=m,this.showLabel=!0)}if(this.axisConfig.showTick&&f>=this.axisConfig.tickLength&&(this.showTick=!0,f-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){const p=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),w=p.height+this.axisConfig.titlePadding*2;this.titleTextHeight=p.height,w<=f&&(f-=w,this.showTitle=!0)}this.boundingRect.width=a.width-f,this.boundingRect.height=a.height}calculateSpace(a){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(a):this.calculateSpaceIfDrawnHorizontally(a),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(a){this.boundingRect.x=a.x,this.boundingRect.y=a.y}getDrawableElementsForLeftAxis(){const a=[];if(this.showAxisLine){const f=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;a.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${f},${this.boundingRect.y} L ${f},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&a.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(f=>({text:f.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(f),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){const f=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);a.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(p=>({path:`M ${f},${this.getScaleValue(p)} L ${f-this.axisConfig.tickLength},${this.getScaleValue(p)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&a.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),a}getDrawableElementsForBottomAxis(){const a=[];if(this.showAxisLine){const f=this.boundingRect.y+this.axisConfig.axisLineWidth/2;a.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${f} L ${this.boundingRect.x+this.boundingRect.width},${f}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&a.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(f=>({text:f.toString(),x:this.getScaleValue(f),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){const f=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);a.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(p=>({path:`M ${this.getScaleValue(p)},${f} L ${this.getScaleValue(p)},${f+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&a.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),a}getDrawableElementsForTopAxis(){const a=[];if(this.showAxisLine){const f=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;a.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${f} L ${this.boundingRect.x+this.boundingRect.width},${f}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&a.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(f=>({text:f.toString(),x:this.getScaleValue(f),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){const f=this.boundingRect.y;a.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(p=>({path:`M ${this.getScaleValue(p)},${f+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(p)},${f+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&a.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),a}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}}class xHe extends fRt{constructor(a,f,p,w,m){super(a,w,m,f),this.categories=p,this.scale=S1t().domain(this.categories).range(this.getRange())}setRange(a){super.setRange(a)}recalculateScale(){this.scale=S1t().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),Ut.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(a){return this.scale(a)||this.getRange()[0]}}class kHe extends fRt{constructor(a,f,p,w,m){super(a,w,m,f),this.domain=p,this.scale=AA().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){const a=[...this.domain];this.axisPosition==="left"&&a.reverse(),this.scale=AA().domain(a).range(this.getRange())}getScaleValue(a){return this.scale(a)}}function dRt(i,a,f,p){const w=new uRt(p);return cRt(i)?new xHe(a,f,i.categories,i.title,w):new kHe(a,f,[i.min,i.max],i.title,w)}class EHe{constructor(a,f,p,w){this.textDimensionCalculator=a,this.chartConfig=f,this.chartData=p,this.chartThemeConfig=w,this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}setBoundingBoxXY(a){this.boundingRect.x=a.x,this.boundingRect.y=a.y}calculateSpace(a){const f=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),p=Math.max(f.width,a.width),w=f.height+2*this.chartConfig.titlePadding;return f.width<=p&&f.height<=w&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=p,this.boundingRect.height=w,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){const a=[];return this.showChartTitle&&a.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),a}}function THe(i,a,f,p){const w=new uRt(p);return new EHe(w,i,a,f)}class CHe{constructor(a,f,p,w,m){this.plotData=a,this.xAxis=f,this.yAxis=p,this.orientation=w,this.plotIndex=m}getDrawableElement(){const a=this.plotData.data.map(p=>[this.xAxis.getScaleValue(p[0]),this.yAxis.getScaleValue(p[1])]);let f;return this.orientation==="horizontal"?f=E5().y(p=>p[0]).x(p=>p[1])(a):f=E5().x(p=>p[0]).y(p=>p[1])(a),f?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:f,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}}class _He{constructor(a,f,p,w,m,b){this.barData=a,this.boundingRect=f,this.xAxis=p,this.yAxis=w,this.orientation=m,this.plotIndex=b}getDrawableElement(){const a=this.barData.data.map(m=>[this.xAxis.getScaleValue(m[0]),this.yAxis.getScaleValue(m[1])]),f=.05,p=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-f),w=p/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:a.map(m=>({x:this.boundingRect.x,y:m[0]-w,height:p,width:m[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:a.map(m=>({x:m[0]-w,y:m[1],width:p,height:this.boundingRect.y+this.boundingRect.height-m[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}}class SHe{constructor(a,f,p){this.chartConfig=a,this.chartData=f,this.chartThemeConfig=p,this.boundingRect={x:0,y:0,width:0,height:0}}setAxes(a,f){this.xAxis=a,this.yAxis=f}setBoundingBoxXY(a){this.boundingRect.x=a.x,this.boundingRect.y=a.y}calculateSpace(a){return this.boundingRect.width=a.width,this.boundingRect.height=a.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");const a=[];for(const[f,p]of this.chartData.plots.entries())switch(p.type){case"line":{const w=new CHe(p,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,f);a.push(...w.getDrawableElement())}break;case"bar":{const w=new _He(p,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,f);a.push(...w.getDrawableElement())}break}return a}}function AHe(i,a,f){return new SHe(i,a,f)}class LHe{constructor(a,f,p,w){this.chartConfig=a,this.chartData=f,this.componentStore={title:THe(a,f,p,w),plot:AHe(a,f,p),xAxis:dRt(f.xAxis,a.xAxis,{titleColor:p.xAxisTitleColor,labelColor:p.xAxisLabelColor,tickColor:p.xAxisTickColor,axisLineColor:p.xAxisLineColor},w),yAxis:dRt(f.yAxis,a.yAxis,{titleColor:p.yAxisTitleColor,labelColor:p.yAxisLabelColor,tickColor:p.yAxisTickColor,axisLineColor:p.yAxisLineColor},w)}}calculateVerticalSpace(){let a=this.chartConfig.width,f=this.chartConfig.height,p=0,w=0,m=Math.floor(a*this.chartConfig.plotReservedSpacePercent/100),b=Math.floor(f*this.chartConfig.plotReservedSpacePercent/100),E=this.componentStore.plot.calculateSpace({width:m,height:b});a-=E.width,f-=E.height,E=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:f}),w=E.height,f-=E.height,this.componentStore.xAxis.setAxisPosition("bottom"),E=this.componentStore.xAxis.calculateSpace({width:a,height:f}),f-=E.height,this.componentStore.yAxis.setAxisPosition("left"),E=this.componentStore.yAxis.calculateSpace({width:a,height:f}),p=E.width,a-=E.width,a>0&&(m+=a,a=0),f>0&&(b+=f,f=0),this.componentStore.plot.calculateSpace({width:m,height:b}),this.componentStore.plot.setBoundingBoxXY({x:p,y:w}),this.componentStore.xAxis.setRange([p,p+m]),this.componentStore.xAxis.setBoundingBoxXY({x:p,y:w+b}),this.componentStore.yAxis.setRange([w,w+b]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:w}),this.chartData.plots.some(_=>oRt(_))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizonatalSpace(){let a=this.chartConfig.width,f=this.chartConfig.height,p=0,w=0,m=0,b=Math.floor(a*this.chartConfig.plotReservedSpacePercent/100),E=Math.floor(f*this.chartConfig.plotReservedSpacePercent/100),_=this.componentStore.plot.calculateSpace({width:b,height:E});a-=_.width,f-=_.height,_=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:f}),p=_.height,f-=_.height,this.componentStore.xAxis.setAxisPosition("left"),_=this.componentStore.xAxis.calculateSpace({width:a,height:f}),a-=_.width,w=_.width,this.componentStore.yAxis.setAxisPosition("top"),_=this.componentStore.yAxis.calculateSpace({width:a,height:f}),f-=_.height,m=p+_.height,a>0&&(b+=a,a=0),f>0&&(E+=f,f=0),this.componentStore.plot.calculateSpace({width:b,height:E}),this.componentStore.plot.setBoundingBoxXY({x:w,y:m}),this.componentStore.yAxis.setRange([w,w+b]),this.componentStore.yAxis.setBoundingBoxXY({x:w,y:p}),this.componentStore.xAxis.setRange([m,m+E]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:m}),this.chartData.plots.some(A=>oRt(A))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizonatalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();const a=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(const f of Object.values(this.componentStore))a.push(...f.getDrawableElements());return a}}class MHe{static build(a,f,p,w){return new LHe(a,f,p,w).getDrawableElement()}}let RF=0,gRt,jF=bRt(),$F=pRt(),fu=wRt(),cgt=$F.plotColorPalette.split(",").map(i=>i.trim()),BY=!1,ugt=!1;function pRt(){const i=X1t(),a=Fd();return rF(i.xyChart,a.themeVariables.xyChart)}function bRt(){const i=Fd();return rF(Zh.xyChart,i.xyChart)}function wRt(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function lgt(i){const a=Fd();return Q1(i.trim(),a)}function DHe(i){gRt=i}function IHe(i){i==="horizontal"?jF.chartOrientation="horizontal":jF.chartOrientation="vertical"}function OHe(i){fu.xAxis.title=lgt(i.text)}function vRt(i,a){fu.xAxis={type:"linear",title:fu.xAxis.title,min:i,max:a},BY=!0}function PHe(i){fu.xAxis={type:"band",title:fu.xAxis.title,categories:i.map(a=>lgt(a.text))},BY=!0}function FHe(i){fu.yAxis.title=lgt(i.text)}function NHe(i,a){fu.yAxis={type:"linear",title:fu.yAxis.title,min:i,max:a},ugt=!0}function BHe(i){const a=Math.min(...i),f=Math.max(...i),p=BF(fu.yAxis)?fu.yAxis.min:1/0,w=BF(fu.yAxis)?fu.yAxis.max:-1/0;fu.yAxis={type:"linear",title:fu.yAxis.title,min:Math.min(p,a),max:Math.max(w,f)}}function mRt(i){let a=[];if(i.length===0)return a;if(!BY){const f=BF(fu.xAxis)?fu.xAxis.min:1/0,p=BF(fu.xAxis)?fu.xAxis.max:-1/0;vRt(Math.min(f,1),Math.max(p,i.length))}if(ugt||BHe(i),cRt(fu.xAxis)&&(a=fu.xAxis.categories.map((f,p)=>[f,i[p]])),BF(fu.xAxis)){const f=fu.xAxis.min,p=fu.xAxis.max,w=(p-f+1)/i.length,m=[];for(let b=f;b<=p;b+=w)m.push(`${b}`);a=m.map((b,E)=>[b,i[E]])}return a}function yRt(i){return cgt[i===0?0:i%cgt.length]}function RHe(i,a){const f=mRt(a);fu.plots.push({type:"line",strokeFill:yRt(RF),strokeWidth:2,data:f}),RF++}function jHe(i,a){const f=mRt(a);fu.plots.push({type:"bar",fill:yRt(RF),data:f}),RF++}function $He(){if(fu.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return fu.title=pg(),MHe.build(jF,fu,$F,gRt)}function zHe(){return $F}function qHe(){return jF}const HHe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:yHe,db:{getDrawableElem:$He,clear:function(){hg(),RF=0,jF=bRt(),fu=wRt(),$F=pRt(),cgt=$F.plotColorPalette.split(",").map(i=>i.trim()),BY=!1,ugt=!1},setAccTitle:E0,getAccTitle:fg,setDiagramTitle:Nb,getDiagramTitle:pg,getAccDescription:gg,setAccDescription:dg,setOrientation:IHe,setXAxisTitle:OHe,setXAxisRangeData:vRt,setXAxisBand:PHe,setYAxisTitle:FHe,setYAxisRangeData:NHe,setLineData:RHe,setBarData:jHe,setTmpSVGG:DHe,getChartThemeConfig:zHe,getChartConfig:qHe},renderer:{draw:(i,a,f,p)=>{const w=p.db,m=w.getChartThemeConfig(),b=w.getChartConfig();function E(et){return et==="top"?"text-before-edge":"middle"}function _(et){return et==="left"?"start":et==="right"?"end":"middle"}function A(et){return`translate(${et.x}, ${et.y}) rotate(${et.rotation||0})`}Ut.debug(`Rendering xychart chart +`+i);const I=VW(a),B=I.append("g").attr("class","main"),N=B.append("rect").attr("width",b.width).attr("height",b.height).attr("class","background");k0(I,b.height,b.width,!0),I.attr("viewBox",`0 0 ${b.width} ${b.height}`),N.attr("fill",m.backgroundColor),w.setTmpSVGG(I.append("g").attr("class","mermaid-tmp-group"));const R=w.getDrawableElem(),z={};function W(et){let st=B,at="";for(const[bt]of et.entries()){let mt=B;bt>0&&z[at]&&(mt=z[at]),at+=et[bt],st=z[at],st||(st=z[at]=mt.append("g").attr("class",et[bt]))}return st}for(const et of R){if(et.data.length===0)continue;const st=W(et.groupTexts);switch(et.type){case"rect":st.selectAll("rect").data(et.data).enter().append("rect").attr("x",at=>at.x).attr("y",at=>at.y).attr("width",at=>at.width).attr("height",at=>at.height).attr("fill",at=>at.fill).attr("stroke",at=>at.strokeFill).attr("stroke-width",at=>at.strokeWidth);break;case"text":st.selectAll("text").data(et.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",at=>at.fill).attr("font-size",at=>at.fontSize).attr("dominant-baseline",at=>E(at.verticalPos)).attr("text-anchor",at=>_(at.horizontalPos)).attr("transform",at=>A(at)).text(at=>at.text);break;case"path":st.selectAll("path").data(et.data).enter().append("path").attr("d",at=>at.path).attr("fill",at=>at.fill?at.fill:"none").attr("stroke",at=>at.strokeFill).attr("stroke-width",at=>at.strokeWidth);break}}}}}},Symbol.toStringTag,{value:"Module"}));var hgt=function(){var i=function(Se,me,Ve,Ye){for(Ve=Ve||{},Ye=Se.length;Ye--;Ve[Se[Ye]]=me);return Ve},a=[1,3],f=[1,4],p=[1,5],w=[1,6],m=[5,6,8,9,11,13,31,32,33,34,35,36,44,62,63],b=[1,18],E=[2,7],_=[1,22],A=[1,23],I=[1,24],B=[1,25],N=[1,26],R=[1,27],z=[1,20],W=[1,28],et=[1,29],st=[62,63],at=[5,8,9,11,13,31,32,33,34,35,36,44,51,53,62,63],bt=[1,47],mt=[1,48],yt=[1,49],ft=[1,50],ut=[1,51],vt=[1,52],X=[1,53],pt=[53,54],U=[1,64],Tt=[1,60],nt=[1,61],It=[1,62],Ot=[1,63],Bt=[1,65],Et=[1,69],Z=[1,70],Ct=[1,67],xt=[1,68],Ht=[5,8,9,11,13,31,32,33,34,35,36,44,62,63],Le={trace:function(){},yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,requirementType:17,requirementName:18,STRUCT_START:19,requirementBody:20,ID:21,COLONSEP:22,id:23,TEXT:24,text:25,RISK:26,riskLevel:27,VERIFYMTHD:28,verifyType:29,STRUCT_STOP:30,REQUIREMENT:31,FUNCTIONAL_REQUIREMENT:32,INTERFACE_REQUIREMENT:33,PERFORMANCE_REQUIREMENT:34,PHYSICAL_REQUIREMENT:35,DESIGN_CONSTRAINT:36,LOW_RISK:37,MED_RISK:38,HIGH_RISK:39,VERIFY_ANALYSIS:40,VERIFY_DEMONSTRATION:41,VERIFY_INSPECTION:42,VERIFY_TEST:43,ELEMENT:44,elementName:45,elementBody:46,TYPE:47,type:48,DOCREF:49,ref:50,END_ARROW_L:51,relationship:52,LINE:53,END_ARROW_R:54,CONTAINS:55,COPIES:56,DERIVES:57,SATISFIES:58,VERIFIES:59,REFINES:60,TRACES:61,unqString:62,qString:63,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",19:"STRUCT_START",21:"ID",22:"COLONSEP",24:"TEXT",26:"RISK",28:"VERIFYMTHD",30:"STRUCT_STOP",31:"REQUIREMENT",32:"FUNCTIONAL_REQUIREMENT",33:"INTERFACE_REQUIREMENT",34:"PERFORMANCE_REQUIREMENT",35:"PHYSICAL_REQUIREMENT",36:"DESIGN_CONSTRAINT",37:"LOW_RISK",38:"MED_RISK",39:"HIGH_RISK",40:"VERIFY_ANALYSIS",41:"VERIFY_DEMONSTRATION",42:"VERIFY_INSPECTION",43:"VERIFY_TEST",44:"ELEMENT",47:"TYPE",49:"DOCREF",51:"END_ARROW_L",53:"LINE",54:"END_ARROW_R",55:"CONTAINS",56:"COPIES",57:"DERIVES",58:"SATISFIES",59:"VERIFIES",60:"REFINES",61:"TRACES",62:"unqString",63:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[14,5],[20,5],[20,5],[20,5],[20,5],[20,2],[20,1],[17,1],[17,1],[17,1],[17,1],[17,1],[17,1],[27,1],[27,1],[27,1],[29,1],[29,1],[29,1],[29,1],[15,5],[46,5],[46,5],[46,2],[46,1],[16,5],[16,5],[52,1],[52,1],[52,1],[52,1],[52,1],[52,1],[52,1],[18,1],[18,1],[23,1],[23,1],[25,1],[25,1],[45,1],[45,1],[48,1],[48,1],[50,1],[50,1]],performAction:function(me,Ve,Ye,ce,ke,zt,re){var se=zt.length-1;switch(ke){case 4:this.$=zt[se].trim(),ce.setAccTitle(this.$);break;case 5:case 6:this.$=zt[se].trim(),ce.setAccDescription(this.$);break;case 7:this.$=[];break;case 13:ce.addRequirement(zt[se-3],zt[se-4]);break;case 14:ce.setNewReqId(zt[se-2]);break;case 15:ce.setNewReqText(zt[se-2]);break;case 16:ce.setNewReqRisk(zt[se-2]);break;case 17:ce.setNewReqVerifyMethod(zt[se-2]);break;case 20:this.$=ce.RequirementType.REQUIREMENT;break;case 21:this.$=ce.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 22:this.$=ce.RequirementType.INTERFACE_REQUIREMENT;break;case 23:this.$=ce.RequirementType.PERFORMANCE_REQUIREMENT;break;case 24:this.$=ce.RequirementType.PHYSICAL_REQUIREMENT;break;case 25:this.$=ce.RequirementType.DESIGN_CONSTRAINT;break;case 26:this.$=ce.RiskLevel.LOW_RISK;break;case 27:this.$=ce.RiskLevel.MED_RISK;break;case 28:this.$=ce.RiskLevel.HIGH_RISK;break;case 29:this.$=ce.VerifyType.VERIFY_ANALYSIS;break;case 30:this.$=ce.VerifyType.VERIFY_DEMONSTRATION;break;case 31:this.$=ce.VerifyType.VERIFY_INSPECTION;break;case 32:this.$=ce.VerifyType.VERIFY_TEST;break;case 33:ce.addElement(zt[se-3]);break;case 34:ce.setNewElementType(zt[se-2]);break;case 35:ce.setNewElementDocRef(zt[se-2]);break;case 38:ce.addRelationship(zt[se-2],zt[se],zt[se-4]);break;case 39:ce.addRelationship(zt[se-2],zt[se-4],zt[se]);break;case 40:this.$=ce.Relationships.CONTAINS;break;case 41:this.$=ce.Relationships.COPIES;break;case 42:this.$=ce.Relationships.DERIVES;break;case 43:this.$=ce.Relationships.SATISFIES;break;case 44:this.$=ce.Relationships.VERIFIES;break;case 45:this.$=ce.Relationships.REFINES;break;case 46:this.$=ce.Relationships.TRACES;break}},table:[{3:1,4:2,6:a,9:f,11:p,13:w},{1:[3]},{3:8,4:2,5:[1,7],6:a,9:f,11:p,13:w},{5:[1,9]},{10:[1,10]},{12:[1,11]},i(m,[2,6]),{3:12,4:2,6:a,9:f,11:p,13:w},{1:[2,2]},{4:17,5:b,7:13,8:E,9:f,11:p,13:w,14:14,15:15,16:16,17:19,23:21,31:_,32:A,33:I,34:B,35:N,36:R,44:z,62:W,63:et},i(m,[2,4]),i(m,[2,5]),{1:[2,1]},{8:[1,30]},{4:17,5:b,7:31,8:E,9:f,11:p,13:w,14:14,15:15,16:16,17:19,23:21,31:_,32:A,33:I,34:B,35:N,36:R,44:z,62:W,63:et},{4:17,5:b,7:32,8:E,9:f,11:p,13:w,14:14,15:15,16:16,17:19,23:21,31:_,32:A,33:I,34:B,35:N,36:R,44:z,62:W,63:et},{4:17,5:b,7:33,8:E,9:f,11:p,13:w,14:14,15:15,16:16,17:19,23:21,31:_,32:A,33:I,34:B,35:N,36:R,44:z,62:W,63:et},{4:17,5:b,7:34,8:E,9:f,11:p,13:w,14:14,15:15,16:16,17:19,23:21,31:_,32:A,33:I,34:B,35:N,36:R,44:z,62:W,63:et},{4:17,5:b,7:35,8:E,9:f,11:p,13:w,14:14,15:15,16:16,17:19,23:21,31:_,32:A,33:I,34:B,35:N,36:R,44:z,62:W,63:et},{18:36,62:[1,37],63:[1,38]},{45:39,62:[1,40],63:[1,41]},{51:[1,42],53:[1,43]},i(st,[2,20]),i(st,[2,21]),i(st,[2,22]),i(st,[2,23]),i(st,[2,24]),i(st,[2,25]),i(at,[2,49]),i(at,[2,50]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{19:[1,44]},{19:[2,47]},{19:[2,48]},{19:[1,45]},{19:[2,53]},{19:[2,54]},{52:46,55:bt,56:mt,57:yt,58:ft,59:ut,60:vt,61:X},{52:54,55:bt,56:mt,57:yt,58:ft,59:ut,60:vt,61:X},{5:[1,55]},{5:[1,56]},{53:[1,57]},i(pt,[2,40]),i(pt,[2,41]),i(pt,[2,42]),i(pt,[2,43]),i(pt,[2,44]),i(pt,[2,45]),i(pt,[2,46]),{54:[1,58]},{5:U,20:59,21:Tt,24:nt,26:It,28:Ot,30:Bt},{5:Et,30:Z,46:66,47:Ct,49:xt},{23:71,62:W,63:et},{23:72,62:W,63:et},i(Ht,[2,13]),{22:[1,73]},{22:[1,74]},{22:[1,75]},{22:[1,76]},{5:U,20:77,21:Tt,24:nt,26:It,28:Ot,30:Bt},i(Ht,[2,19]),i(Ht,[2,33]),{22:[1,78]},{22:[1,79]},{5:Et,30:Z,46:80,47:Ct,49:xt},i(Ht,[2,37]),i(Ht,[2,38]),i(Ht,[2,39]),{23:81,62:W,63:et},{25:82,62:[1,83],63:[1,84]},{27:85,37:[1,86],38:[1,87],39:[1,88]},{29:89,40:[1,90],41:[1,91],42:[1,92],43:[1,93]},i(Ht,[2,18]),{48:94,62:[1,95],63:[1,96]},{50:97,62:[1,98],63:[1,99]},i(Ht,[2,36]),{5:[1,100]},{5:[1,101]},{5:[2,51]},{5:[2,52]},{5:[1,102]},{5:[2,26]},{5:[2,27]},{5:[2,28]},{5:[1,103]},{5:[2,29]},{5:[2,30]},{5:[2,31]},{5:[2,32]},{5:[1,104]},{5:[2,55]},{5:[2,56]},{5:[1,105]},{5:[2,57]},{5:[2,58]},{5:U,20:106,21:Tt,24:nt,26:It,28:Ot,30:Bt},{5:U,20:107,21:Tt,24:nt,26:It,28:Ot,30:Bt},{5:U,20:108,21:Tt,24:nt,26:It,28:Ot,30:Bt},{5:U,20:109,21:Tt,24:nt,26:It,28:Ot,30:Bt},{5:Et,30:Z,46:110,47:Ct,49:xt},{5:Et,30:Z,46:111,47:Ct,49:xt},i(Ht,[2,14]),i(Ht,[2,15]),i(Ht,[2,16]),i(Ht,[2,17]),i(Ht,[2,34]),i(Ht,[2,35])],defaultActions:{8:[2,2],12:[2,1],30:[2,3],31:[2,8],32:[2,9],33:[2,10],34:[2,11],35:[2,12],37:[2,47],38:[2,48],40:[2,53],41:[2,54],83:[2,51],84:[2,52],86:[2,26],87:[2,27],88:[2,28],90:[2,29],91:[2,30],92:[2,31],93:[2,32],95:[2,55],96:[2,56],98:[2,57],99:[2,58]},parseError:function(me,Ve){if(Ve.recoverable)this.trace(me);else{var Ye=new Error(me);throw Ye.hash=Ve,Ye}},parse:function(me){var Ve=this,Ye=[0],ce=[],ke=[null],zt=[],re=this.table,se="",Pe=0,te=0,Me=2,de=1,on=zt.slice.call(arguments,1),ni=Object.create(this.lexer),Ks={yy:{}};for(var ws in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ws)&&(Ks.yy[ws]=this.yy[ws]);ni.setInput(me,Ks.yy),Ks.yy.lexer=ni,Ks.yy.parser=this,typeof ni.yylloc>"u"&&(ni.yylloc={});var fo=ni.yylloc;zt.push(fo);var Xi=ni.options&&ni.options.ranges;typeof Ks.yy.parseError=="function"?this.parseError=Ks.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Er(){var Gs;return Gs=ce.pop()||ni.lex()||de,typeof Gs!="number"&&(Gs instanceof Array&&(ce=Gs,Gs=ce.pop()),Gs=Ve.symbols_[Gs]||Gs),Gs}for(var Xn,di,Ee,Kn,He={},Ti,pn,Es,qa;;){if(di=Ye[Ye.length-1],this.defaultActions[di]?Ee=this.defaultActions[di]:((Xn===null||typeof Xn>"u")&&(Xn=Er()),Ee=re[di]&&re[di][Xn]),typeof Ee>"u"||!Ee.length||!Ee[0]){var Ma="";qa=[];for(Ti in re[di])this.terminals_[Ti]&&Ti>Me&&qa.push("'"+this.terminals_[Ti]+"'");ni.showPosition?Ma="Parse error on line "+(Pe+1)+`: +`+ni.showPosition()+` +Expecting `+qa.join(", ")+", got '"+(this.terminals_[Xn]||Xn)+"'":Ma="Parse error on line "+(Pe+1)+": Unexpected "+(Xn==de?"end of input":"'"+(this.terminals_[Xn]||Xn)+"'"),this.parseError(Ma,{text:ni.match,token:this.terminals_[Xn]||Xn,line:ni.yylineno,loc:fo,expected:qa})}if(Ee[0]instanceof Array&&Ee.length>1)throw new Error("Parse Error: multiple actions possible at state: "+di+", token: "+Xn);switch(Ee[0]){case 1:Ye.push(Xn),ke.push(ni.yytext),zt.push(ni.yylloc),Ye.push(Ee[1]),Xn=null,te=ni.yyleng,se=ni.yytext,Pe=ni.yylineno,fo=ni.yylloc;break;case 2:if(pn=this.productions_[Ee[1]][1],He.$=ke[ke.length-pn],He._$={first_line:zt[zt.length-(pn||1)].first_line,last_line:zt[zt.length-1].last_line,first_column:zt[zt.length-(pn||1)].first_column,last_column:zt[zt.length-1].last_column},Xi&&(He._$.range=[zt[zt.length-(pn||1)].range[0],zt[zt.length-1].range[1]]),Kn=this.performAction.apply(He,[se,te,Pe,Ks.yy,Ee[1],ke,zt].concat(on)),typeof Kn<"u")return Kn;pn&&(Ye=Ye.slice(0,-1*pn*2),ke=ke.slice(0,-1*pn),zt=zt.slice(0,-1*pn)),Ye.push(this.productions_[Ee[1]][0]),ke.push(He.$),zt.push(He._$),Es=re[Ye[Ye.length-2]][Ye[Ye.length-1]],Ye.push(Es);break;case 3:return!0}}return!0}},Ft=function(){var Se={EOF:1,parseError:function(Ve,Ye){if(this.yy.parser)this.yy.parser.parseError(Ve,Ye);else throw new Error(Ve)},setInput:function(me,Ve){return this.yy=Ve||this.yy||{},this._input=me,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var me=this._input[0];this.yytext+=me,this.yyleng++,this.offset++,this.match+=me,this.matched+=me;var Ve=me.match(/(?:\r\n?|\n).*/g);return Ve?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),me},unput:function(me){var Ve=me.length,Ye=me.split(/(?:\r\n?|\n)/g);this._input=me+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ve),this.offset-=Ve;var ce=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Ye.length-1&&(this.yylineno-=Ye.length-1);var ke=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Ye?(Ye.length===ce.length?this.yylloc.first_column:0)+ce[ce.length-Ye.length].length-Ye[0].length:this.yylloc.first_column-Ve},this.options.ranges&&(this.yylloc.range=[ke[0],ke[0]+this.yyleng-Ve]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(me){this.unput(this.match.slice(me))},pastInput:function(){var me=this.matched.substr(0,this.matched.length-this.match.length);return(me.length>20?"...":"")+me.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var me=this.match;return me.length<20&&(me+=this._input.substr(0,20-me.length)),(me.substr(0,20)+(me.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var me=this.pastInput(),Ve=new Array(me.length+1).join("-");return me+this.upcomingInput()+` +`+Ve+"^"},test_match:function(me,Ve){var Ye,ce,ke;if(this.options.backtrack_lexer&&(ke={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ke.yylloc.range=this.yylloc.range.slice(0))),ce=me[0].match(/(?:\r\n?|\n).*/g),ce&&(this.yylineno+=ce.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ce?ce[ce.length-1].length-ce[ce.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+me[0].length},this.yytext+=me[0],this.match+=me[0],this.matches=me,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(me[0].length),this.matched+=me[0],Ye=this.performAction.call(this,this.yy,this,Ve,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Ye)return Ye;if(this._backtrack){for(var zt in ke)this[zt]=ke[zt];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var me,Ve,Ye,ce;this._more||(this.yytext="",this.match="");for(var ke=this._currentRules(),zt=0;ztVe[0].length)){if(Ve=Ye,ce=zt,this.options.backtrack_lexer){if(me=this.test_match(Ye,ke[zt]),me!==!1)return me;if(this._backtrack){Ve=!1;continue}else return!1}else if(!this.options.flex)break}return Ve?(me=this.test_match(Ve,ke[ce]),me!==!1?me:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var Ve=this.next();return Ve||this.lex()},begin:function(Ve){this.conditionStack.push(Ve)},popState:function(){var Ve=this.conditionStack.length-1;return Ve>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(Ve){return Ve=this.conditionStack.length-1-Math.abs(Ve||0),Ve>=0?this.conditionStack[Ve]:"INITIAL"},pushState:function(Ve){this.begin(Ve)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(Ve,Ye,ce,ke){switch(ce){case 0:return"title";case 1:return this.begin("acc_title"),9;case 2:return this.popState(),"acc_title_value";case 3:return this.begin("acc_descr"),11;case 4:return this.popState(),"acc_descr_value";case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 5;case 9:break;case 10:break;case 11:break;case 12:return 8;case 13:return 6;case 14:return 19;case 15:return 30;case 16:return 22;case 17:return 21;case 18:return 24;case 19:return 26;case 20:return 28;case 21:return 31;case 22:return 32;case 23:return 33;case 24:return 34;case 25:return 35;case 26:return 36;case 27:return 37;case 28:return 38;case 29:return 39;case 30:return 40;case 31:return 41;case 32:return 42;case 33:return 43;case 34:return 44;case 35:return 55;case 36:return 56;case 37:return 57;case 38:return 58;case 39:return 59;case 40:return 60;case 41:return 61;case 42:return 47;case 43:return 49;case 44:return 51;case 45:return 54;case 46:return 53;case 47:this.begin("string");break;case 48:this.popState();break;case 49:return"qString";case 50:return Ye.yytext=Ye.yytext.trim(),62}},rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^\r\n\{\<\>\-\=]*)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},unqString:{rules:[],inclusive:!1},token:{rules:[],inclusive:!1},string:{rules:[48,49],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,50],inclusive:!0}}};return Se}();Le.lexer=Ft;function gn(){this.yy={}}return gn.prototype=Le,Le.Parser=gn,new gn}();hgt.parser=hgt;const VHe=hgt;let fgt=[],wp={},zF={},yk={},qF={};const GHe={RequirementType:{REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},RiskLevel:{LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},VerifyType:{VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},Relationships:{CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},getConfig:()=>Oe().req,addRequirement:(i,a)=>(zF[i]===void 0&&(zF[i]={name:i,type:a,id:wp.id,text:wp.text,risk:wp.risk,verifyMethod:wp.verifyMethod}),wp={},zF[i]),getRequirements:()=>zF,setNewReqId:i=>{wp!==void 0&&(wp.id=i)},setNewReqText:i=>{wp!==void 0&&(wp.text=i)},setNewReqRisk:i=>{wp!==void 0&&(wp.risk=i)},setNewReqVerifyMethod:i=>{wp!==void 0&&(wp.verifyMethod=i)},setAccTitle:E0,getAccTitle:fg,setAccDescription:dg,getAccDescription:gg,addElement:i=>(qF[i]===void 0&&(qF[i]={name:i,type:yk.type,docRef:yk.docRef},Ut.info("Added new requirement: ",i)),yk={},qF[i]),getElements:()=>qF,setNewElementType:i=>{yk!==void 0&&(yk.type=i)},setNewElementDocRef:i=>{yk!==void 0&&(yk.docRef=i)},addRelationship:(i,a,f)=>{fgt.push({type:i,src:a,dst:f})},getRelationships:()=>fgt,clear:()=>{fgt=[],wp={},zF={},yk={},qF={},hg()}},UHe=i=>` + + marker { + fill: ${i.relationColor}; + stroke: ${i.relationColor}; + } + + marker.cross { + stroke: ${i.lineColor}; + } + + svg { + font-family: ${i.fontFamily}; + font-size: ${i.fontSize}; + } + + .reqBox { + fill: ${i.requirementBackground}; + fill-opacity: 1.0; + stroke: ${i.requirementBorderColor}; + stroke-width: ${i.requirementBorderSize}; + } + + .reqTitle, .reqLabel{ + fill: ${i.requirementTextColor}; + } + .reqLabelBox { + fill: ${i.relationLabelBackground}; + fill-opacity: 1.0; + } + + .req-title-line { + stroke: ${i.requirementBorderColor}; + stroke-width: ${i.requirementBorderSize}; + } + .relationshipLine { + stroke: ${i.relationColor}; + stroke-width: 1; + } + .relationshipLabel { + fill: ${i.relationLabelColor}; + } + +`,dgt={CONTAINS:"contains",ARROW:"arrow"},xRt={ReqMarkers:dgt,insertLineEndings:(i,a)=>{let f=i.append("defs").append("marker").attr("id",dgt.CONTAINS+"_line_ending").attr("refX",0).attr("refY",a.line_height/2).attr("markerWidth",a.line_height).attr("markerHeight",a.line_height).attr("orient","auto").append("g");f.append("circle").attr("cx",a.line_height/2).attr("cy",a.line_height/2).attr("r",a.line_height/2).attr("fill","none"),f.append("line").attr("x1",0).attr("x2",a.line_height).attr("y1",a.line_height/2).attr("y2",a.line_height/2).attr("stroke-width",1),f.append("line").attr("y1",0).attr("y2",a.line_height).attr("x1",a.line_height/2).attr("x2",a.line_height/2).attr("stroke-width",1),i.append("defs").append("marker").attr("id",dgt.ARROW+"_line_ending").attr("refX",a.line_height).attr("refY",.5*a.line_height).attr("markerWidth",a.line_height).attr("markerHeight",a.line_height).attr("orient","auto").append("path").attr("d",`M0,0 + L${a.line_height},${a.line_height/2} + M${a.line_height},${a.line_height/2} + L0,${a.line_height}`).attr("stroke-width",1)}};let Eh={},kRt=0;const ERt=(i,a)=>i.insert("rect","#"+a).attr("class","req reqBox").attr("x",0).attr("y",0).attr("width",Eh.rect_min_width+"px").attr("height",Eh.rect_min_height+"px"),TRt=(i,a,f)=>{let p=Eh.rect_min_width/2,w=i.append("text").attr("class","req reqLabel reqTitle").attr("id",a).attr("x",p).attr("y",Eh.rect_padding).attr("dominant-baseline","hanging"),m=0;f.forEach(A=>{m==0?w.append("tspan").attr("text-anchor","middle").attr("x",Eh.rect_min_width/2).attr("dy",0).text(A):w.append("tspan").attr("text-anchor","middle").attr("x",Eh.rect_min_width/2).attr("dy",Eh.line_height*.75).text(A),m++});let b=1.5*Eh.rect_padding,E=m*Eh.line_height*.75,_=b+E;return i.append("line").attr("class","req-title-line").attr("x1","0").attr("x2",Eh.rect_min_width).attr("y1",_).attr("y2",_),{titleNode:w,y:_}},CRt=(i,a,f,p)=>{let w=i.append("text").attr("class","req reqLabel").attr("id",a).attr("x",Eh.rect_padding).attr("y",p).attr("dominant-baseline","hanging"),m=0;const b=30;let E=[];return f.forEach(_=>{let A=_.length;for(;A>b&&m<3;){let I=_.substring(0,b);_=_.substring(b,_.length),A=_.length,E[E.length]=I,m++}if(m==3){let I=E[E.length-1];E[E.length-1]=I.substring(0,I.length-4)+"..."}else E[E.length]=_;m=0}),E.forEach(_=>{w.append("tspan").attr("x",Eh.rect_padding).attr("dy",Eh.line_height).text(_)}),w},WHe=(i,a,f,p)=>{const w=a.node().getTotalLength(),m=a.node().getPointAtLength(w*.5),b="rel"+kRt;kRt++;const _=i.append("text").attr("class","req relationshipLabel").attr("id",b).attr("x",m.x).attr("y",m.y).attr("text-anchor","middle").attr("dominant-baseline","middle").text(p).node().getBBox();i.insert("rect","#"+b).attr("class","req reqLabelBox").attr("x",m.x-_.width/2).attr("y",m.y-_.height/2).attr("width",_.width).attr("height",_.height).attr("fill","white").attr("fill-opacity","85%")},YHe=function(i,a,f,p,w){const m=f.edge(fL(a.src),fL(a.dst)),b=E5().x(function(_){return _.x}).y(function(_){return _.y}),E=i.insert("path","#"+p).attr("class","er relationshipLine").attr("d",b(m.points)).attr("fill","none");a.type==w.db.Relationships.CONTAINS?E.attr("marker-start","url("+Kr.getUrl(Eh.arrowMarkerAbsolute)+"#"+a.type+"_line_ending)"):(E.attr("stroke-dasharray","10,7"),E.attr("marker-end","url("+Kr.getUrl(Eh.arrowMarkerAbsolute)+"#"+xRt.ReqMarkers.ARROW+"_line_ending)")),WHe(i,E,Eh,`<<${a.type}>>`)},KHe=(i,a,f)=>{Object.keys(i).forEach(p=>{let w=i[p];p=fL(p),Ut.info("Added new requirement: ",p);const m=f.append("g").attr("id",p),b="req-"+p,E=ERt(m,b);let _=TRt(m,p+"_title",[`<<${w.type}>>`,`${w.name}`]);CRt(m,p+"_body",[`Id: ${w.id}`,`Text: ${w.text}`,`Risk: ${w.risk}`,`Verification: ${w.verifyMethod}`],_.y);const A=E.node().getBBox();a.setNode(p,{width:A.width,height:A.height,shape:"rect",id:p})})},XHe=(i,a,f)=>{Object.keys(i).forEach(p=>{let w=i[p];const m=fL(p),b=f.append("g").attr("id",m),E="element-"+m,_=ERt(b,E);let A=TRt(b,E+"_title",["<>",`${p}`]);CRt(b,E+"_body",[`Type: ${w.type||"Not Specified"}`,`Doc Ref: ${w.docRef||"None"}`],A.y);const I=_.node().getBBox();a.setNode(m,{width:I.width,height:I.height,shape:"rect",id:m})})},QHe=(i,a)=>(i.forEach(function(f){let p=fL(f.src),w=fL(f.dst);a.setEdge(p,w,{relationship:f})}),i),ZHe=function(i,a){a.nodes().forEach(function(f){f!==void 0&&a.node(f)!==void 0&&(i.select("#"+f),i.select("#"+f).attr("transform","translate("+(a.node(f).x-a.node(f).width/2)+","+(a.node(f).y-a.node(f).height/2)+" )"))})},fL=i=>i.replace(/\s/g,"").replace(/\./g,"_"),JHe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:VHe,db:GHe,renderer:{draw:(i,a,f,p)=>{Eh=Oe().requirement;const w=Eh.securityLevel;let m;w==="sandbox"&&(m=yr("#i"+a));const E=yr(w==="sandbox"?m.nodes()[0].contentDocument.body:"body").select(`[id='${a}']`);xRt.insertLineEndings(E,Eh);const _=new c1({multigraph:!1,compound:!1,directed:!0}).setGraph({rankdir:Eh.layoutDirection,marginx:20,marginy:20,nodesep:100,edgesep:100,ranksep:100}).setDefaultEdgeLabel(function(){return{}});let A=p.db.getRequirements(),I=p.db.getElements(),B=p.db.getRelationships();KHe(A,_,E),XHe(I,_,E),QHe(B,_),aL(_),ZHe(E,_),B.forEach(function(et){YHe(E,et,_,a,p)});const N=Eh.rect_padding,R=E.node().getBBox(),z=R.width+N*2,W=R.height+N*2;k0(E,W,z,Eh.useMaxWidth),E.attr("viewBox",`${R.x-N} ${R.y-N} ${z} ${W}`)}},styles:UHe}},Symbol.toStringTag,{value:"Module"}));var ggt=function(){var i=function(ce,ke,zt,re){for(zt=zt||{},re=ce.length;re--;zt[ce[re]]=ke);return zt},a=[1,2],f=[1,3],p=[1,4],w=[2,4],m=[1,9],b=[1,11],E=[1,13],_=[1,14],A=[1,16],I=[1,17],B=[1,18],N=[1,24],R=[1,25],z=[1,26],W=[1,27],et=[1,28],st=[1,29],at=[1,30],bt=[1,31],mt=[1,32],yt=[1,33],ft=[1,34],ut=[1,35],vt=[1,36],X=[1,37],pt=[1,38],U=[1,39],Tt=[1,41],nt=[1,42],It=[1,43],Ot=[1,44],Bt=[1,45],Et=[1,46],Z=[1,4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,48,49,50,52,53,54,59,60,61,62,70],Ct=[4,5,16,50,52,53],xt=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],Ht=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,49,50,52,53,54,59,60,61,62,70],Le=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,48,50,52,53,54,59,60,61,62,70],Ft=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,50,52,53,54,59,60,61,62,70],gn=[68,69,70],Se=[1,120],me={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,box_section:10,box_line:11,participant_statement:12,create:13,box:14,restOfLine:15,end:16,signal:17,autonumber:18,NUM:19,off:20,activate:21,actor:22,deactivate:23,note_statement:24,links_statement:25,link_statement:26,properties_statement:27,details_statement:28,title:29,legacy_title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,loop:36,rect:37,opt:38,alt:39,else_sections:40,par:41,par_sections:42,par_over:43,critical:44,option_sections:45,break:46,option:47,and:48,else:49,participant:50,AS:51,participant_actor:52,destroy:53,note:54,placement:55,text2:56,over:57,actor_pair:58,links:59,link:60,properties:61,details:62,spaceList:63,",":64,left_of:65,right_of:66,signaltype:67,"+":68,"-":69,ACTOR:70,SOLID_OPEN_ARROW:71,DOTTED_OPEN_ARROW:72,SOLID_ARROW:73,DOTTED_ARROW:74,SOLID_CROSS:75,DOTTED_CROSS:76,SOLID_POINT:77,DOTTED_POINT:78,TXT:79,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",13:"create",14:"box",15:"restOfLine",16:"end",18:"autonumber",19:"NUM",20:"off",21:"activate",23:"deactivate",29:"title",30:"legacy_title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"loop",37:"rect",38:"opt",39:"alt",41:"par",43:"par_over",44:"critical",46:"break",47:"option",48:"and",49:"else",50:"participant",51:"AS",52:"participant_actor",53:"destroy",54:"note",57:"over",59:"links",60:"link",61:"properties",62:"details",64:",",65:"left_of",66:"right_of",68:"+",69:"-",70:"ACTOR",71:"SOLID_OPEN_ARROW",72:"DOTTED_OPEN_ARROW",73:"SOLID_ARROW",74:"DOTTED_ARROW",75:"SOLID_CROSS",76:"DOTTED_CROSS",77:"SOLID_POINT",78:"DOTTED_POINT",79:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[10,0],[10,2],[11,2],[11,1],[11,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[45,1],[45,4],[42,1],[42,4],[40,1],[40,4],[12,5],[12,3],[12,5],[12,3],[12,3],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[63,2],[63,1],[58,3],[58,1],[55,1],[55,1],[17,5],[17,5],[17,4],[22,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[56,1]],performAction:function(ke,zt,re,se,Pe,te,Me){var de=te.length-1;switch(Pe){case 3:return se.apply(te[de]),te[de];case 4:case 9:this.$=[];break;case 5:case 10:te[de-1].push(te[de]),this.$=te[de-1];break;case 6:case 7:case 11:case 12:this.$=te[de];break;case 8:case 13:this.$=[];break;case 15:te[de].type="createParticipant",this.$=te[de];break;case 16:te[de-1].unshift({type:"boxStart",boxData:se.parseBoxData(te[de-2])}),te[de-1].push({type:"boxEnd",boxText:te[de-2]}),this.$=te[de-1];break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(te[de-2]),sequenceIndexStep:Number(te[de-1]),sequenceVisible:!0,signalType:se.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(te[de-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:se.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:se.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:se.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"activeStart",signalType:se.LINETYPE.ACTIVE_START,actor:te[de-1]};break;case 23:this.$={type:"activeEnd",signalType:se.LINETYPE.ACTIVE_END,actor:te[de-1]};break;case 29:se.setDiagramTitle(te[de].substring(6)),this.$=te[de].substring(6);break;case 30:se.setDiagramTitle(te[de].substring(7)),this.$=te[de].substring(7);break;case 31:this.$=te[de].trim(),se.setAccTitle(this.$);break;case 32:case 33:this.$=te[de].trim(),se.setAccDescription(this.$);break;case 34:te[de-1].unshift({type:"loopStart",loopText:se.parseMessage(te[de-2]),signalType:se.LINETYPE.LOOP_START}),te[de-1].push({type:"loopEnd",loopText:te[de-2],signalType:se.LINETYPE.LOOP_END}),this.$=te[de-1];break;case 35:te[de-1].unshift({type:"rectStart",color:se.parseMessage(te[de-2]),signalType:se.LINETYPE.RECT_START}),te[de-1].push({type:"rectEnd",color:se.parseMessage(te[de-2]),signalType:se.LINETYPE.RECT_END}),this.$=te[de-1];break;case 36:te[de-1].unshift({type:"optStart",optText:se.parseMessage(te[de-2]),signalType:se.LINETYPE.OPT_START}),te[de-1].push({type:"optEnd",optText:se.parseMessage(te[de-2]),signalType:se.LINETYPE.OPT_END}),this.$=te[de-1];break;case 37:te[de-1].unshift({type:"altStart",altText:se.parseMessage(te[de-2]),signalType:se.LINETYPE.ALT_START}),te[de-1].push({type:"altEnd",signalType:se.LINETYPE.ALT_END}),this.$=te[de-1];break;case 38:te[de-1].unshift({type:"parStart",parText:se.parseMessage(te[de-2]),signalType:se.LINETYPE.PAR_START}),te[de-1].push({type:"parEnd",signalType:se.LINETYPE.PAR_END}),this.$=te[de-1];break;case 39:te[de-1].unshift({type:"parStart",parText:se.parseMessage(te[de-2]),signalType:se.LINETYPE.PAR_OVER_START}),te[de-1].push({type:"parEnd",signalType:se.LINETYPE.PAR_END}),this.$=te[de-1];break;case 40:te[de-1].unshift({type:"criticalStart",criticalText:se.parseMessage(te[de-2]),signalType:se.LINETYPE.CRITICAL_START}),te[de-1].push({type:"criticalEnd",signalType:se.LINETYPE.CRITICAL_END}),this.$=te[de-1];break;case 41:te[de-1].unshift({type:"breakStart",breakText:se.parseMessage(te[de-2]),signalType:se.LINETYPE.BREAK_START}),te[de-1].push({type:"breakEnd",optText:se.parseMessage(te[de-2]),signalType:se.LINETYPE.BREAK_END}),this.$=te[de-1];break;case 43:this.$=te[de-3].concat([{type:"option",optionText:se.parseMessage(te[de-1]),signalType:se.LINETYPE.CRITICAL_OPTION},te[de]]);break;case 45:this.$=te[de-3].concat([{type:"and",parText:se.parseMessage(te[de-1]),signalType:se.LINETYPE.PAR_AND},te[de]]);break;case 47:this.$=te[de-3].concat([{type:"else",altText:se.parseMessage(te[de-1]),signalType:se.LINETYPE.ALT_ELSE},te[de]]);break;case 48:te[de-3].draw="participant",te[de-3].type="addParticipant",te[de-3].description=se.parseMessage(te[de-1]),this.$=te[de-3];break;case 49:te[de-1].draw="participant",te[de-1].type="addParticipant",this.$=te[de-1];break;case 50:te[de-3].draw="actor",te[de-3].type="addParticipant",te[de-3].description=se.parseMessage(te[de-1]),this.$=te[de-3];break;case 51:te[de-1].draw="actor",te[de-1].type="addParticipant",this.$=te[de-1];break;case 52:te[de-1].type="destroyParticipant",this.$=te[de-1];break;case 53:this.$=[te[de-1],{type:"addNote",placement:te[de-2],actor:te[de-1].actor,text:te[de]}];break;case 54:te[de-2]=[].concat(te[de-1],te[de-1]).slice(0,2),te[de-2][0]=te[de-2][0].actor,te[de-2][1]=te[de-2][1].actor,this.$=[te[de-1],{type:"addNote",placement:se.PLACEMENT.OVER,actor:te[de-2].slice(0,2),text:te[de]}];break;case 55:this.$=[te[de-1],{type:"addLinks",actor:te[de-1].actor,text:te[de]}];break;case 56:this.$=[te[de-1],{type:"addALink",actor:te[de-1].actor,text:te[de]}];break;case 57:this.$=[te[de-1],{type:"addProperties",actor:te[de-1].actor,text:te[de]}];break;case 58:this.$=[te[de-1],{type:"addDetails",actor:te[de-1].actor,text:te[de]}];break;case 61:this.$=[te[de-2],te[de]];break;case 62:this.$=te[de];break;case 63:this.$=se.PLACEMENT.LEFTOF;break;case 64:this.$=se.PLACEMENT.RIGHTOF;break;case 65:this.$=[te[de-4],te[de-1],{type:"addMessage",from:te[de-4].actor,to:te[de-1].actor,signalType:te[de-3],msg:te[de],activate:!0},{type:"activeStart",signalType:se.LINETYPE.ACTIVE_START,actor:te[de-1]}];break;case 66:this.$=[te[de-4],te[de-1],{type:"addMessage",from:te[de-4].actor,to:te[de-1].actor,signalType:te[de-3],msg:te[de]},{type:"activeEnd",signalType:se.LINETYPE.ACTIVE_END,actor:te[de-4]}];break;case 67:this.$=[te[de-3],te[de-1],{type:"addMessage",from:te[de-3].actor,to:te[de-1].actor,signalType:te[de-2],msg:te[de]}];break;case 68:this.$={type:"addParticipant",actor:te[de]};break;case 69:this.$=se.LINETYPE.SOLID_OPEN;break;case 70:this.$=se.LINETYPE.DOTTED_OPEN;break;case 71:this.$=se.LINETYPE.SOLID;break;case 72:this.$=se.LINETYPE.DOTTED;break;case 73:this.$=se.LINETYPE.SOLID_CROSS;break;case 74:this.$=se.LINETYPE.DOTTED_CROSS;break;case 75:this.$=se.LINETYPE.SOLID_POINT;break;case 76:this.$=se.LINETYPE.DOTTED_POINT;break;case 77:this.$=se.parseMessage(te[de].trim().substring(1));break}},table:[{3:1,4:a,5:f,6:p},{1:[3]},{3:5,4:a,5:f,6:p},{3:6,4:a,5:f,6:p},i([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],w,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:m,5:b,8:8,9:10,12:12,13:E,14:_,17:15,18:A,21:I,22:40,23:B,24:19,25:20,26:21,27:22,28:23,29:N,30:R,31:z,33:W,35:et,36:st,37:at,38:bt,39:mt,41:yt,43:ft,44:ut,46:vt,50:X,52:pt,53:U,54:Tt,59:nt,60:It,61:Ot,62:Bt,70:Et},i(Z,[2,5]),{9:47,12:12,13:E,14:_,17:15,18:A,21:I,22:40,23:B,24:19,25:20,26:21,27:22,28:23,29:N,30:R,31:z,33:W,35:et,36:st,37:at,38:bt,39:mt,41:yt,43:ft,44:ut,46:vt,50:X,52:pt,53:U,54:Tt,59:nt,60:It,61:Ot,62:Bt,70:Et},i(Z,[2,7]),i(Z,[2,8]),i(Z,[2,14]),{12:48,50:X,52:pt,53:U},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,70:Et},{22:55,70:Et},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},i(Z,[2,29]),i(Z,[2,30]),{32:[1,61]},{34:[1,62]},i(Z,[2,33]),{15:[1,63]},{15:[1,64]},{15:[1,65]},{15:[1,66]},{15:[1,67]},{15:[1,68]},{15:[1,69]},{15:[1,70]},{22:71,70:Et},{22:72,70:Et},{22:73,70:Et},{67:74,71:[1,75],72:[1,76],73:[1,77],74:[1,78],75:[1,79],76:[1,80],77:[1,81],78:[1,82]},{55:83,57:[1,84],65:[1,85],66:[1,86]},{22:87,70:Et},{22:88,70:Et},{22:89,70:Et},{22:90,70:Et},i([5,51,64,71,72,73,74,75,76,77,78,79],[2,68]),i(Z,[2,6]),i(Z,[2,15]),i(Ct,[2,9],{10:91}),i(Z,[2,17]),{5:[1,93],19:[1,92]},{5:[1,94]},i(Z,[2,21]),{5:[1,95]},{5:[1,96]},i(Z,[2,24]),i(Z,[2,25]),i(Z,[2,26]),i(Z,[2,27]),i(Z,[2,28]),i(Z,[2,31]),i(Z,[2,32]),i(xt,w,{7:97}),i(xt,w,{7:98}),i(xt,w,{7:99}),i(Ht,w,{40:100,7:101}),i(Le,w,{42:102,7:103}),i(Le,w,{7:103,42:104}),i(Ft,w,{45:105,7:106}),i(xt,w,{7:107}),{5:[1,109],51:[1,108]},{5:[1,111],51:[1,110]},{5:[1,112]},{22:115,68:[1,113],69:[1,114],70:Et},i(gn,[2,69]),i(gn,[2,70]),i(gn,[2,71]),i(gn,[2,72]),i(gn,[2,73]),i(gn,[2,74]),i(gn,[2,75]),i(gn,[2,76]),{22:116,70:Et},{22:118,58:117,70:Et},{70:[2,63]},{70:[2,64]},{56:119,79:Se},{56:121,79:Se},{56:122,79:Se},{56:123,79:Se},{4:[1,126],5:[1,128],11:125,12:127,16:[1,124],50:X,52:pt,53:U},{5:[1,129]},i(Z,[2,19]),i(Z,[2,20]),i(Z,[2,22]),i(Z,[2,23]),{4:m,5:b,8:8,9:10,12:12,13:E,14:_,16:[1,130],17:15,18:A,21:I,22:40,23:B,24:19,25:20,26:21,27:22,28:23,29:N,30:R,31:z,33:W,35:et,36:st,37:at,38:bt,39:mt,41:yt,43:ft,44:ut,46:vt,50:X,52:pt,53:U,54:Tt,59:nt,60:It,61:Ot,62:Bt,70:Et},{4:m,5:b,8:8,9:10,12:12,13:E,14:_,16:[1,131],17:15,18:A,21:I,22:40,23:B,24:19,25:20,26:21,27:22,28:23,29:N,30:R,31:z,33:W,35:et,36:st,37:at,38:bt,39:mt,41:yt,43:ft,44:ut,46:vt,50:X,52:pt,53:U,54:Tt,59:nt,60:It,61:Ot,62:Bt,70:Et},{4:m,5:b,8:8,9:10,12:12,13:E,14:_,16:[1,132],17:15,18:A,21:I,22:40,23:B,24:19,25:20,26:21,27:22,28:23,29:N,30:R,31:z,33:W,35:et,36:st,37:at,38:bt,39:mt,41:yt,43:ft,44:ut,46:vt,50:X,52:pt,53:U,54:Tt,59:nt,60:It,61:Ot,62:Bt,70:Et},{16:[1,133]},{4:m,5:b,8:8,9:10,12:12,13:E,14:_,16:[2,46],17:15,18:A,21:I,22:40,23:B,24:19,25:20,26:21,27:22,28:23,29:N,30:R,31:z,33:W,35:et,36:st,37:at,38:bt,39:mt,41:yt,43:ft,44:ut,46:vt,49:[1,134],50:X,52:pt,53:U,54:Tt,59:nt,60:It,61:Ot,62:Bt,70:Et},{16:[1,135]},{4:m,5:b,8:8,9:10,12:12,13:E,14:_,16:[2,44],17:15,18:A,21:I,22:40,23:B,24:19,25:20,26:21,27:22,28:23,29:N,30:R,31:z,33:W,35:et,36:st,37:at,38:bt,39:mt,41:yt,43:ft,44:ut,46:vt,48:[1,136],50:X,52:pt,53:U,54:Tt,59:nt,60:It,61:Ot,62:Bt,70:Et},{16:[1,137]},{16:[1,138]},{4:m,5:b,8:8,9:10,12:12,13:E,14:_,16:[2,42],17:15,18:A,21:I,22:40,23:B,24:19,25:20,26:21,27:22,28:23,29:N,30:R,31:z,33:W,35:et,36:st,37:at,38:bt,39:mt,41:yt,43:ft,44:ut,46:vt,47:[1,139],50:X,52:pt,53:U,54:Tt,59:nt,60:It,61:Ot,62:Bt,70:Et},{4:m,5:b,8:8,9:10,12:12,13:E,14:_,16:[1,140],17:15,18:A,21:I,22:40,23:B,24:19,25:20,26:21,27:22,28:23,29:N,30:R,31:z,33:W,35:et,36:st,37:at,38:bt,39:mt,41:yt,43:ft,44:ut,46:vt,50:X,52:pt,53:U,54:Tt,59:nt,60:It,61:Ot,62:Bt,70:Et},{15:[1,141]},i(Z,[2,49]),{15:[1,142]},i(Z,[2,51]),i(Z,[2,52]),{22:143,70:Et},{22:144,70:Et},{56:145,79:Se},{56:146,79:Se},{56:147,79:Se},{64:[1,148],79:[2,62]},{5:[2,55]},{5:[2,77]},{5:[2,56]},{5:[2,57]},{5:[2,58]},i(Z,[2,16]),i(Ct,[2,10]),{12:149,50:X,52:pt,53:U},i(Ct,[2,12]),i(Ct,[2,13]),i(Z,[2,18]),i(Z,[2,34]),i(Z,[2,35]),i(Z,[2,36]),i(Z,[2,37]),{15:[1,150]},i(Z,[2,38]),{15:[1,151]},i(Z,[2,39]),i(Z,[2,40]),{15:[1,152]},i(Z,[2,41]),{5:[1,153]},{5:[1,154]},{56:155,79:Se},{56:156,79:Se},{5:[2,67]},{5:[2,53]},{5:[2,54]},{22:157,70:Et},i(Ct,[2,11]),i(Ht,w,{7:101,40:158}),i(Le,w,{7:103,42:159}),i(Ft,w,{7:106,45:160}),i(Z,[2,48]),i(Z,[2,50]),{5:[2,65]},{5:[2,66]},{79:[2,61]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],defaultActions:{5:[2,1],6:[2,2],85:[2,63],86:[2,64],119:[2,55],120:[2,77],121:[2,56],122:[2,57],123:[2,58],145:[2,67],146:[2,53],147:[2,54],155:[2,65],156:[2,66],157:[2,61],158:[2,47],159:[2,45],160:[2,43]},parseError:function(ke,zt){if(zt.recoverable)this.trace(ke);else{var re=new Error(ke);throw re.hash=zt,re}},parse:function(ke){var zt=this,re=[0],se=[],Pe=[null],te=[],Me=this.table,de="",on=0,ni=0,Ks=2,ws=1,fo=te.slice.call(arguments,1),Xi=Object.create(this.lexer),Er={yy:{}};for(var Xn in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Xn)&&(Er.yy[Xn]=this.yy[Xn]);Xi.setInput(ke,Er.yy),Er.yy.lexer=Xi,Er.yy.parser=this,typeof Xi.yylloc>"u"&&(Xi.yylloc={});var di=Xi.yylloc;te.push(di);var Ee=Xi.options&&Xi.options.ranges;typeof Er.yy.parseError=="function"?this.parseError=Er.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Kn(){var zs;return zs=se.pop()||Xi.lex()||ws,typeof zs!="number"&&(zs instanceof Array&&(se=zs,zs=se.pop()),zs=zt.symbols_[zs]||zs),zs}for(var He,Ti,pn,Es,qa={},Ma,Gs,Po,vs;;){if(Ti=re[re.length-1],this.defaultActions[Ti]?pn=this.defaultActions[Ti]:((He===null||typeof He>"u")&&(He=Kn()),pn=Me[Ti]&&Me[Ti][He]),typeof pn>"u"||!pn.length||!pn[0]){var ru="";vs=[];for(Ma in Me[Ti])this.terminals_[Ma]&&Ma>Ks&&vs.push("'"+this.terminals_[Ma]+"'");Xi.showPosition?ru="Parse error on line "+(on+1)+`: +`+Xi.showPosition()+` +Expecting `+vs.join(", ")+", got '"+(this.terminals_[He]||He)+"'":ru="Parse error on line "+(on+1)+": Unexpected "+(He==ws?"end of input":"'"+(this.terminals_[He]||He)+"'"),this.parseError(ru,{text:Xi.match,token:this.terminals_[He]||He,line:Xi.yylineno,loc:di,expected:vs})}if(pn[0]instanceof Array&&pn.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Ti+", token: "+He);switch(pn[0]){case 1:re.push(He),Pe.push(Xi.yytext),te.push(Xi.yylloc),re.push(pn[1]),He=null,ni=Xi.yyleng,de=Xi.yytext,on=Xi.yylineno,di=Xi.yylloc;break;case 2:if(Gs=this.productions_[pn[1]][1],qa.$=Pe[Pe.length-Gs],qa._$={first_line:te[te.length-(Gs||1)].first_line,last_line:te[te.length-1].last_line,first_column:te[te.length-(Gs||1)].first_column,last_column:te[te.length-1].last_column},Ee&&(qa._$.range=[te[te.length-(Gs||1)].range[0],te[te.length-1].range[1]]),Es=this.performAction.apply(qa,[de,ni,on,Er.yy,pn[1],Pe,te].concat(fo)),typeof Es<"u")return Es;Gs&&(re=re.slice(0,-1*Gs*2),Pe=Pe.slice(0,-1*Gs),te=te.slice(0,-1*Gs)),re.push(this.productions_[pn[1]][0]),Pe.push(qa.$),te.push(qa._$),Po=Me[re[re.length-2]][re[re.length-1]],re.push(Po);break;case 3:return!0}}return!0}},Ve=function(){var ce={EOF:1,parseError:function(zt,re){if(this.yy.parser)this.yy.parser.parseError(zt,re);else throw new Error(zt)},setInput:function(ke,zt){return this.yy=zt||this.yy||{},this._input=ke,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var ke=this._input[0];this.yytext+=ke,this.yyleng++,this.offset++,this.match+=ke,this.matched+=ke;var zt=ke.match(/(?:\r\n?|\n).*/g);return zt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),ke},unput:function(ke){var zt=ke.length,re=ke.split(/(?:\r\n?|\n)/g);this._input=ke+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-zt),this.offset-=zt;var se=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),re.length-1&&(this.yylineno-=re.length-1);var Pe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:re?(re.length===se.length?this.yylloc.first_column:0)+se[se.length-re.length].length-re[0].length:this.yylloc.first_column-zt},this.options.ranges&&(this.yylloc.range=[Pe[0],Pe[0]+this.yyleng-zt]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(ke){this.unput(this.match.slice(ke))},pastInput:function(){var ke=this.matched.substr(0,this.matched.length-this.match.length);return(ke.length>20?"...":"")+ke.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var ke=this.match;return ke.length<20&&(ke+=this._input.substr(0,20-ke.length)),(ke.substr(0,20)+(ke.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var ke=this.pastInput(),zt=new Array(ke.length+1).join("-");return ke+this.upcomingInput()+` +`+zt+"^"},test_match:function(ke,zt){var re,se,Pe;if(this.options.backtrack_lexer&&(Pe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Pe.yylloc.range=this.yylloc.range.slice(0))),se=ke[0].match(/(?:\r\n?|\n).*/g),se&&(this.yylineno+=se.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:se?se[se.length-1].length-se[se.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+ke[0].length},this.yytext+=ke[0],this.match+=ke[0],this.matches=ke,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(ke[0].length),this.matched+=ke[0],re=this.performAction.call(this,this.yy,this,zt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),re)return re;if(this._backtrack){for(var te in Pe)this[te]=Pe[te];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var ke,zt,re,se;this._more||(this.yytext="",this.match="");for(var Pe=this._currentRules(),te=0;tezt[0].length)){if(zt=re,se=te,this.options.backtrack_lexer){if(ke=this.test_match(re,Pe[te]),ke!==!1)return ke;if(this._backtrack){zt=!1;continue}else return!1}else if(!this.options.flex)break}return zt?(ke=this.test_match(zt,Pe[se]),ke!==!1?ke:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var zt=this.next();return zt||this.lex()},begin:function(zt){this.conditionStack.push(zt)},popState:function(){var zt=this.conditionStack.length-1;return zt>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(zt){return zt=this.conditionStack.length-1-Math.abs(zt||0),zt>=0?this.conditionStack[zt]:"INITIAL"},pushState:function(zt){this.begin(zt)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(zt,re,se,Pe){switch(se){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 19;case 7:return this.begin("LINE"),14;case 8:return this.begin("ID"),50;case 9:return this.begin("ID"),52;case 10:return 13;case 11:return this.begin("ID"),53;case 12:return re.yytext=re.yytext.trim(),this.begin("ALIAS"),70;case 13:return this.popState(),this.popState(),this.begin("LINE"),51;case 14:return this.popState(),this.popState(),5;case 15:return this.begin("LINE"),36;case 16:return this.begin("LINE"),37;case 17:return this.begin("LINE"),38;case 18:return this.begin("LINE"),39;case 19:return this.begin("LINE"),49;case 20:return this.begin("LINE"),41;case 21:return this.begin("LINE"),43;case 22:return this.begin("LINE"),48;case 23:return this.begin("LINE"),44;case 24:return this.begin("LINE"),47;case 25:return this.begin("LINE"),46;case 26:return this.popState(),15;case 27:return 16;case 28:return 65;case 29:return 66;case 30:return 59;case 31:return 60;case 32:return 61;case 33:return 62;case 34:return 57;case 35:return 54;case 36:return this.begin("ID"),21;case 37:return this.begin("ID"),23;case 38:return 29;case 39:return 30;case 40:return this.begin("acc_title"),31;case 41:return this.popState(),"acc_title_value";case 42:return this.begin("acc_descr"),33;case 43:return this.popState(),"acc_descr_value";case 44:this.begin("acc_descr_multiline");break;case 45:this.popState();break;case 46:return"acc_descr_multiline_value";case 47:return 6;case 48:return 18;case 49:return 20;case 50:return 64;case 51:return 5;case 52:return re.yytext=re.yytext.trim(),70;case 53:return 73;case 54:return 74;case 55:return 71;case 56:return 72;case 57:return 75;case 58:return 76;case 59:return 77;case 60:return 78;case 61:return 79;case 62:return 68;case 63:return 69;case 64:return 5;case 65:return"INVALID"}},rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:[^\->:\n,;]+?([\-]*[^\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[45,46],inclusive:!1},acc_descr:{rules:[43],inclusive:!1},acc_title:{rules:[41],inclusive:!1},ID:{rules:[2,3,12],inclusive:!1},ALIAS:{rules:[2,3,13,14],inclusive:!1},LINE:{rules:[2,3,26],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,38,39,40,42,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65],inclusive:!0}}};return ce}();me.lexer=Ve;function Ye(){this.yy={}}return Ye.prototype=me,me.Parser=Ye,new Ye}();ggt.parser=ggt;const tVe=ggt;let HF,R5={},pgt={},bgt={},dL=[],zb=[],RY=!1,wgt,j5,VF,gL;const eVe=function(i){dL.push({name:i.text,wrap:i.wrap===void 0&&CT()||!!i.wrap,fill:i.color,actorKeys:[]}),j5=dL.slice(-1)[0]},vgt=function(i,a,f,p){let w=j5;const m=R5[i];if(m){if(j5&&m.box&&j5!==m.box)throw new Error("A same participant should only be defined in one Box: "+m.name+" can't be in '"+m.box.name+"' and in '"+j5.name+"' at the same time.");if(w=m.box?m.box:j5,m.box=w,m&&a===m.name&&f==null)return}(f==null||f.text==null)&&(f={text:a,wrap:null,type:p}),(p==null||f.text==null)&&(f={text:a,wrap:null,type:p}),R5[i]={box:w,name:a,description:f.text,wrap:f.wrap===void 0&&CT()||!!f.wrap,prevActor:HF,links:{},properties:{},actorCnt:null,rectData:null,type:p||"participant"},HF&&R5[HF]&&(R5[HF].nextActor=i),j5&&j5.actorKeys.push(i),HF=i},nVe=i=>{let a,f=0;for(a=0;a>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},b}return zb.push({from:i,to:a,message:f.text,wrap:f.wrap===void 0&&CT()||!!f.wrap,type:p,activate:w}),!0},iVe=function(){return dL.length>0},sVe=function(){return dL.some(i=>i.name)},aVe=function(){return zb},oVe=function(){return dL},cVe=function(){return R5},uVe=function(){return pgt},lVe=function(){return bgt},GF=function(i){return R5[i]},hVe=function(){return Object.keys(R5)},fVe=function(){RY=!0},dVe=function(){RY=!1},gVe=()=>RY,pVe=function(i){wgt=i},CT=()=>wgt!==void 0?wgt:Oe().sequence.wrap,bVe=function(){R5={},pgt={},bgt={},dL=[],zb=[],RY=!1,hg()},wVe=function(i){const a=i.trim(),f={text:a.replace(/^:?(?:no)?wrap:/,"").trim(),wrap:a.match(/^:?wrap:/)!==null?!0:a.match(/^:?nowrap:/)!==null?!1:void 0};return Ut.debug("parseMessage:",f),f},vVe=function(i){const a=i.match(/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/);let f=a!=null&&a[1]?a[1].trim():"transparent",p=a!=null&&a[2]?a[2].trim():void 0;if(window&&window.CSS)window.CSS.supports("color",f)||(f="transparent",p=i.trim());else{const m=new Option().style;m.color=f,m.color!==f&&(f="transparent",p=i.trim())}return{color:f,text:p!==void 0?Q1(p.replace(/^:?(?:no)?wrap:/,""),Oe()):void 0,wrap:p!==void 0?p.match(/^:?wrap:/)!==null?!0:p.match(/^:?nowrap:/)!==null?!1:void 0:void 0}},UF={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32},mVe={FILLED:0,OPEN:1},yVe={LEFTOF:0,RIGHTOF:1,OVER:2},_Rt=function(i,a,f){f.text,f.wrap===void 0&&CT()||f.wrap;const p=[].concat(i,i);zb.push({from:p[0],to:p[1],message:f.text,wrap:f.wrap===void 0&&CT()||!!f.wrap,type:UF.NOTE,placement:a})},SRt=function(i,a){const f=GF(i);try{let p=Q1(a.text,Oe());p=p.replace(/&/g,"&"),p=p.replace(/=/g,"=");const w=JSON.parse(p);mgt(f,w)}catch(p){Ut.error("error while parsing actor link text",p)}},xVe=function(i,a){const f=GF(i);try{const b={};let E=Q1(a.text,Oe());var p=E.indexOf("@");E=E.replace(/&/g,"&"),E=E.replace(/=/g,"=");var w=E.slice(0,p-1).trim(),m=E.slice(p+1).trim();b[w]=m,mgt(f,b)}catch(b){Ut.error("error while parsing actor link text",b)}};function mgt(i,a){if(i.links==null)i.links=a;else for(let f in a)i.links[f]=a[f]}const ARt=function(i,a){const f=GF(i);try{let p=Q1(a.text,Oe());const w=JSON.parse(p);LRt(f,w)}catch(p){Ut.error("error while parsing actor properties text",p)}};function LRt(i,a){if(i.properties==null)i.properties=a;else for(let f in a)i.properties[f]=a[f]}function kVe(){j5=void 0}const MRt=function(i,a){const f=GF(i),p=document.getElementById(a.text);try{const w=p.innerHTML,m=JSON.parse(w);m.properties&&LRt(f,m.properties),m.links&&mgt(f,m.links)}catch(w){Ut.error("error while parsing actor details text",w)}},EVe=function(i,a){if(i!==void 0&&i.properties!==void 0)return i.properties[a]},DRt=function(i){if(Array.isArray(i))i.forEach(function(a){DRt(a)});else switch(i.type){case"sequenceIndex":zb.push({from:void 0,to:void 0,message:{start:i.sequenceIndex,step:i.sequenceIndexStep,visible:i.sequenceVisible},wrap:!1,type:i.signalType});break;case"addParticipant":vgt(i.actor,i.actor,i.description,i.draw);break;case"createParticipant":if(R5[i.actor])throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");VF=i.actor,vgt(i.actor,i.actor,i.description,i.draw),pgt[i.actor]=zb.length;break;case"destroyParticipant":gL=i.actor,bgt[i.actor]=zb.length;break;case"activeStart":ef(i.actor,void 0,void 0,i.signalType);break;case"activeEnd":ef(i.actor,void 0,void 0,i.signalType);break;case"addNote":_Rt(i.actor,i.placement,i.text);break;case"addLinks":SRt(i.actor,i.text);break;case"addALink":xVe(i.actor,i.text);break;case"addProperties":ARt(i.actor,i.text);break;case"addDetails":MRt(i.actor,i.text);break;case"addMessage":if(VF){if(i.to!==VF)throw new Error("The created participant "+VF+" does not have an associated creating message after its declaration. Please check the sequence diagram.");VF=void 0}else if(gL){if(i.to!==gL&&i.from!==gL)throw new Error("The destroyed participant "+gL+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");gL=void 0}ef(i.from,i.to,i.msg,i.signalType,i.activate);break;case"boxStart":eVe(i.boxData);break;case"boxEnd":kVe();break;case"loopStart":ef(void 0,void 0,i.loopText,i.signalType);break;case"loopEnd":ef(void 0,void 0,void 0,i.signalType);break;case"rectStart":ef(void 0,void 0,i.color,i.signalType);break;case"rectEnd":ef(void 0,void 0,void 0,i.signalType);break;case"optStart":ef(void 0,void 0,i.optText,i.signalType);break;case"optEnd":ef(void 0,void 0,void 0,i.signalType);break;case"altStart":ef(void 0,void 0,i.altText,i.signalType);break;case"else":ef(void 0,void 0,i.altText,i.signalType);break;case"altEnd":ef(void 0,void 0,void 0,i.signalType);break;case"setAccTitle":E0(i.text);break;case"parStart":ef(void 0,void 0,i.parText,i.signalType);break;case"and":ef(void 0,void 0,i.parText,i.signalType);break;case"parEnd":ef(void 0,void 0,void 0,i.signalType);break;case"criticalStart":ef(void 0,void 0,i.criticalText,i.signalType);break;case"option":ef(void 0,void 0,i.optionText,i.signalType);break;case"criticalEnd":ef(void 0,void 0,void 0,i.signalType);break;case"breakStart":ef(void 0,void 0,i.breakText,i.signalType);break;case"breakEnd":ef(void 0,void 0,void 0,i.signalType);break}},IRt={addActor:vgt,addMessage:rVe,addSignal:ef,addLinks:SRt,addDetails:MRt,addProperties:ARt,autoWrap:CT,setWrap:pVe,enableSequenceNumbers:fVe,disableSequenceNumbers:dVe,showSequenceNumbers:gVe,getMessages:aVe,getActors:cVe,getCreatedActors:uVe,getDestroyedActors:lVe,getActor:GF,getActorKeys:hVe,getActorProperty:EVe,getAccTitle:fg,getBoxes:oVe,getDiagramTitle:pg,setDiagramTitle:Nb,getConfig:()=>Oe().sequence,clear:bVe,parseMessage:wVe,parseBoxData:vVe,LINETYPE:UF,ARROWTYPE:mVe,PLACEMENT:yVe,addNote:_Rt,setAccTitle:E0,apply:DRt,setAccDescription:dg,getAccDescription:gg,hasAtLeastOneBox:iVe,hasAtLeastOneBoxWithTitle:sVe},TVe=i=>`.actor { + stroke: ${i.actorBorder}; + fill: ${i.actorBkg}; + } + + text.actor > tspan { + fill: ${i.actorTextColor}; + stroke: none; + } + + .actor-line { + stroke: ${i.actorLineColor}; + } + + .messageLine0 { + stroke-width: 1.5; + stroke-dasharray: none; + stroke: ${i.signalColor}; + } + + .messageLine1 { + stroke-width: 1.5; + stroke-dasharray: 2, 2; + stroke: ${i.signalColor}; + } + + #arrowhead path { + fill: ${i.signalColor}; + stroke: ${i.signalColor}; + } + + .sequenceNumber { + fill: ${i.sequenceNumberColor}; + } + + #sequencenumber { + fill: ${i.signalColor}; + } + + #crosshead path { + fill: ${i.signalColor}; + stroke: ${i.signalColor}; + } + + .messageText { + fill: ${i.signalTextColor}; + stroke: none; + } + + .labelBox { + stroke: ${i.labelBoxBorderColor}; + fill: ${i.labelBoxBkgColor}; + } + + .labelText, .labelText > tspan { + fill: ${i.labelTextColor}; + stroke: none; + } + + .loopText, .loopText > tspan { + fill: ${i.loopTextColor}; + stroke: none; + } + + .loopLine { + stroke-width: 2px; + stroke-dasharray: 2, 2; + stroke: ${i.labelBoxBorderColor}; + fill: ${i.labelBoxBorderColor}; + } + + .note { + //stroke: #decc93; + stroke: ${i.noteBorderColor}; + fill: ${i.noteBkgColor}; + } + + .noteText, .noteText > tspan { + fill: ${i.noteTextColor}; + stroke: none; + } + + .activation0 { + fill: ${i.activationBkgColor}; + stroke: ${i.activationBorderColor}; + } + + .activation1 { + fill: ${i.activationBkgColor}; + stroke: ${i.activationBorderColor}; + } + + .activation2 { + fill: ${i.activationBkgColor}; + stroke: ${i.activationBorderColor}; + } + + .actorPopupMenu { + position: absolute; + } + + .actorPopupMenuPanel { + position: absolute; + fill: ${i.actorBkg}; + box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); + filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); +} + .actor-man line { + stroke: ${i.actorBorder}; + fill: ${i.actorBkg}; + } + .actor-man circle, line { + stroke: ${i.actorBorder}; + fill: ${i.actorBkg}; + stroke-width: 2px; + } +`,_T=18*2,ygt=function(i,a){return JW(i,a)},ORt=(i,a)=>{vAe(()=>{const f=document.querySelectorAll(i);f.length!==0&&(f[0].addEventListener("mouseover",function(){AVe("actor"+a+"_popup")}),f[0].addEventListener("mouseout",function(){LVe("actor"+a+"_popup")}))})},CVe=function(i,a,f,p,w){if(a.links===void 0||a.links===null||Object.keys(a.links).length===0)return{height:0,width:0};const m=a.links,b=a.actorCnt,E=a.rectData;var _="none";w&&(_="block !important");const A=i.append("g");A.attr("id","actor"+b+"_popup"),A.attr("class","actorPopupMenu"),A.attr("display",_),ORt("#actor"+b+"_popup",b);var I="";E.class!==void 0&&(I=" "+E.class);let B=E.width>f?E.width:f;const N=A.append("rect");if(N.attr("class","actorPopupMenuPanel"+I),N.attr("x",E.x),N.attr("y",E.height),N.attr("fill",E.fill),N.attr("stroke",E.stroke),N.attr("width",B),N.attr("height",E.height),N.attr("rx",E.rx),N.attr("ry",E.ry),m!=null){var R=20;for(let et in m){var z=A.append("a"),W=ik(m[et]);z.attr("xlink:href",W),z.attr("target","_blank"),GVe(p)(et,z,E.x+10,E.height+R,B,20,{class:"actor"},p),R+=30}}return N.attr("height",R),{height:E.height+R,width:B}},_Ve=function(i){return"var pu = document.getElementById('"+i+"'); if (pu != null) { pu.style.display = 'block'; }"},SVe=function(i){return"var pu = document.getElementById('"+i+"'); if (pu != null) { pu.style.display = 'none'; }"},AVe=function(i){var a=document.getElementById(i);a!=null&&(a.style.display="block")},LVe=function(i){var a=document.getElementById(i);a!=null&&(a.style.display="none")},pL=function(i,a){let f=0,p=0;const w=a.text.split(Kr.lineBreakRegex),[m,b]=VA(a.fontSize);let E=[],_=0,A=()=>a.y;if(a.valign!==void 0&&a.textMargin!==void 0&&a.textMargin>0)switch(a.valign){case"top":case"start":A=()=>Math.round(a.y+a.textMargin);break;case"middle":case"center":A=()=>Math.round(a.y+(f+p+a.textMargin)/2);break;case"bottom":case"end":A=()=>Math.round(a.y+(f+p+2*a.textMargin)-a.textMargin);break}if(a.anchor!==void 0&&a.textMargin!==void 0&&a.width!==void 0)switch(a.anchor){case"left":case"start":a.x=Math.round(a.x+a.textMargin),a.anchor="start",a.dominantBaseline="middle",a.alignmentBaseline="middle";break;case"middle":case"center":a.x=Math.round(a.x+a.width/2),a.anchor="middle",a.dominantBaseline="middle",a.alignmentBaseline="middle";break;case"right":case"end":a.x=Math.round(a.x+a.width-a.textMargin),a.anchor="end",a.dominantBaseline="middle",a.alignmentBaseline="middle";break}for(let[I,B]of w.entries()){a.textMargin!==void 0&&a.textMargin===0&&m!==void 0&&(_=I*m);const N=i.append("text");N.attr("x",a.x),N.attr("y",A()),a.anchor!==void 0&&N.attr("text-anchor",a.anchor).attr("dominant-baseline",a.dominantBaseline).attr("alignment-baseline",a.alignmentBaseline),a.fontFamily!==void 0&&N.style("font-family",a.fontFamily),b!==void 0&&N.style("font-size",b),a.fontWeight!==void 0&&N.style("font-weight",a.fontWeight),a.fill!==void 0&&N.attr("fill",a.fill),a.class!==void 0&&N.attr("class",a.class),a.dy!==void 0?N.attr("dy",a.dy):_!==0&&N.attr("dy",_);const R=B||jIt;if(a.tspan){const z=N.append("tspan");z.attr("x",a.x),a.fill!==void 0&&z.attr("fill",a.fill),z.text(R)}else N.text(R);a.valign!==void 0&&a.textMargin!==void 0&&a.textMargin>0&&(p+=(N._groups||N)[0][0].getBBox().height,f=p),E.push(N)}return E},PRt=function(i,a){function f(w,m,b,E,_){return w+","+m+" "+(w+b)+","+m+" "+(w+b)+","+(m+E-_)+" "+(w+b-_*1.2)+","+(m+E)+" "+w+","+(m+E)}const p=i.append("polygon");return p.attr("points",f(a.x,a.y,a.width,a.height,7)),p.attr("class","labelBox"),a.y=a.y+a.height/2,pL(i,a),p};let gm=-1;const FRt=(i,a,f,p)=>{i.select&&f.forEach(w=>{const m=a[w],b=i.select("#actor"+m.actorCnt);!p.mirrorActors&&m.stopy?b.attr("y2",m.stopy+m.height/2):p.mirrorActors&&b.attr("y2",m.stopy)})},MVe=function(i,a,f,p){const w=p?a.stopy:a.starty,m=a.x+a.width/2,b=w+5,E=i.append("g").lower();var _=E;p||(gm++,_.append("line").attr("id","actor"+gm).attr("x1",m).attr("y1",b).attr("x2",m).attr("y2",2e3).attr("class","actor-line").attr("class","200").attr("stroke-width","0.5px").attr("stroke","#999"),_=E.append("g"),a.actorCnt=gm,a.links!=null&&(_.attr("id","root-"+gm),ORt("#root-"+gm,gm)));const A=bT();var I="actor";a.properties!=null&&a.properties.class?I=a.properties.class:A.fill="#eaeaea",A.x=a.x,A.y=w,A.width=a.width,A.height=a.height,A.class=I,A.rx=3,A.ry=3;const B=ygt(_,A);if(a.rectData=A,a.properties!=null&&a.properties.icon){const R=a.properties.icon.trim();R.charAt(0)==="@"?$De(_,A.x+A.width-20,A.y+10,R.substr(1)):jDe(_,A.x+A.width-20,A.y+10,R)}xgt(f)(a.description,_,A.x,A.y,A.width,A.height,{class:"actor"},f);let N=a.height;if(B.node){const R=B.node().getBBox();a.height=R.height,N=R.height}return N},DVe=function(i,a,f,p){const w=p?a.stopy:a.starty,m=a.x+a.width/2,b=w+80;i.lower(),p||(gm++,i.append("line").attr("id","actor"+gm).attr("x1",m).attr("y1",b).attr("x2",m).attr("y2",2e3).attr("class","actor-line").attr("class","200").attr("stroke-width","0.5px").attr("stroke","#999"),a.actorCnt=gm);const E=i.append("g");E.attr("class","actor-man");const _=bT();_.x=a.x,_.y=w,_.fill="#eaeaea",_.width=a.width,_.height=a.height,_.class="actor",_.rx=3,_.ry=3,E.append("line").attr("id","actor-man-torso"+gm).attr("x1",m).attr("y1",w+25).attr("x2",m).attr("y2",w+45),E.append("line").attr("id","actor-man-arms"+gm).attr("x1",m-_T/2).attr("y1",w+33).attr("x2",m+_T/2).attr("y2",w+33),E.append("line").attr("x1",m-_T/2).attr("y1",w+60).attr("x2",m).attr("y2",w+45),E.append("line").attr("x1",m).attr("y1",w+45).attr("x2",m+_T/2-2).attr("y2",w+60);const A=E.append("circle");A.attr("cx",a.x+a.width/2),A.attr("cy",w+10),A.attr("r",15),A.attr("width",a.width),A.attr("height",a.height);const I=E.node().getBBox();return a.height=I.height,xgt(f)(a.description,E,_.x,_.y+35,_.width,_.height,{class:"actor"},f),a.height},IVe=function(i,a,f,p){switch(a.type){case"actor":return DVe(i,a,f,p);case"participant":return MVe(i,a,f,p)}},OVe=function(i,a,f){const w=i.append("g");NRt(w,a),a.name&&xgt(f)(a.name,w,a.x,a.y+(a.textMaxHeight||0)/2,a.width,0,{class:"text"},f),w.lower()},PVe=function(i){return i.append("g")},FVe=function(i,a,f,p,w){const m=bT(),b=a.anchored;m.x=a.startx,m.y=a.starty,m.class="activation"+w%3,m.width=a.stopx-a.startx,m.height=f-a.starty,ygt(b,m)},NVe=function(i,a,f,p){const{boxMargin:w,boxTextMargin:m,labelBoxHeight:b,labelBoxWidth:E,messageFontFamily:_,messageFontSize:A,messageFontWeight:I}=p,B=i.append("g"),N=function(W,et,st,at){return B.append("line").attr("x1",W).attr("y1",et).attr("x2",st).attr("y2",at).attr("class","loopLine")};N(a.startx,a.starty,a.stopx,a.starty),N(a.stopx,a.starty,a.stopx,a.stopy),N(a.startx,a.stopy,a.stopx,a.stopy),N(a.startx,a.starty,a.startx,a.stopy),a.sections!==void 0&&a.sections.forEach(function(W){N(a.startx,W.y,a.stopx,W.y).style("stroke-dasharray","3, 3")});let R=Rdt();R.text=f,R.x=a.startx,R.y=a.starty,R.fontFamily=_,R.fontSize=A,R.fontWeight=I,R.anchor="middle",R.valign="middle",R.tspan=!1,R.width=E||50,R.height=b||20,R.textMargin=m,R.class="labelText",PRt(B,R),R=BRt(),R.text=a.title,R.x=a.startx+E/2+(a.stopx-a.startx)/2,R.y=a.starty+w+m,R.anchor="middle",R.valign="middle",R.textMargin=m,R.class="loopText",R.fontFamily=_,R.fontSize=A,R.fontWeight=I,R.wrap=!0;let z=pL(B,R);return a.sectionTitles!==void 0&&a.sectionTitles.forEach(function(W,et){if(W.message){R.text=W.message,R.x=a.startx+(a.stopx-a.startx)/2,R.y=a.sections[et].y+w+m,R.class="loopText",R.anchor="middle",R.valign="middle",R.tspan=!1,R.fontFamily=_,R.fontSize=A,R.fontWeight=I,R.wrap=a.wrap,z=pL(B,R);let st=Math.round(z.map(at=>(at._groups||at)[0][0].getBBox().height).reduce((at,bt)=>at+bt));a.sections[et].height+=st-(w+m)}}),a.height=Math.round(a.stopy-a.starty),B},NRt=function(i,a){mPt(i,a)},BVe=function(i){i.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},RVe=function(i){i.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},jVe=function(i){i.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},$Ve=function(i){i.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},zVe=function(i){i.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},qVe=function(i){i.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},HVe=function(i){i.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},BRt=function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},VVe=function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},xgt=function(){function i(w,m,b,E,_,A,I){const B=m.append("text").attr("x",b+_/2).attr("y",E+A/2+5).style("text-anchor","middle").text(w);p(B,I)}function a(w,m,b,E,_,A,I,B){const{actorFontSize:N,actorFontFamily:R,actorFontWeight:z}=B,[W,et]=VA(N),st=w.split(Kr.lineBreakRegex);for(let at=0;ati.height||0))+(this.loops.length===0?0:this.loops.map(i=>i.height||0).reduce((i,a)=>i+a))+(this.messages.length===0?0:this.messages.map(i=>i.height||0).reduce((i,a)=>i+a))+(this.notes.length===0?0:this.notes.map(i=>i.height||0).reduce((i,a)=>i+a))},clear:function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},addBox:function(i){this.boxes.push(i)},addActor:function(i){this.actors.push(i)},addLoop:function(i){this.loops.push(i)},addMessage:function(i){this.messages.push(i)},addNote:function(i){this.notes.push(i)},lastActor:function(){return this.actors[this.actors.length-1]},lastLoop:function(){return this.loops[this.loops.length-1]},lastMessage:function(){return this.messages[this.messages.length-1]},lastNote:function(){return this.notes[this.notes.length-1]},actors:[],boxes:[],loops:[],messages:[],notes:[]},init:function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,jRt(Oe())},updateVal:function(i,a,f,p){i[a]===void 0?i[a]=f:i[a]=p(f,i[a])},updateBounds:function(i,a,f,p){const w=this;let m=0;function b(E){return function(A){m++;const I=w.sequenceItems.length-m+1;w.updateVal(A,"starty",a-I*fn.boxMargin,Math.min),w.updateVal(A,"stopy",p+I*fn.boxMargin,Math.max),w.updateVal(Fr.data,"startx",i-I*fn.boxMargin,Math.min),w.updateVal(Fr.data,"stopx",f+I*fn.boxMargin,Math.max),E!=="activation"&&(w.updateVal(A,"startx",i-I*fn.boxMargin,Math.min),w.updateVal(A,"stopx",f+I*fn.boxMargin,Math.max),w.updateVal(Fr.data,"starty",a-I*fn.boxMargin,Math.min),w.updateVal(Fr.data,"stopy",p+I*fn.boxMargin,Math.max))}}this.sequenceItems.forEach(b()),this.activations.forEach(b("activation"))},insert:function(i,a,f,p){const w=Kr.getMin(i,f),m=Kr.getMax(i,f),b=Kr.getMin(a,p),E=Kr.getMax(a,p);this.updateVal(Fr.data,"startx",w,Math.min),this.updateVal(Fr.data,"starty",b,Math.min),this.updateVal(Fr.data,"stopx",m,Math.max),this.updateVal(Fr.data,"stopy",E,Math.max),this.updateBounds(w,b,m,E)},newActivation:function(i,a,f){const p=f[i.from.actor],w=jY(i.from.actor).length||0,m=p.x+p.width/2+(w-1)*fn.activationWidth/2;this.activations.push({startx:m,starty:this.verticalPos+2,stopx:m+fn.activationWidth,stopy:void 0,actor:i.from.actor,anchored:nf.anchorElement(a)})},endActivation:function(i){const a=this.activations.map(function(f){return f.actor}).lastIndexOf(i.from.actor);return this.activations.splice(a,1)[0]},createLoop:function(i={message:void 0,wrap:!1,width:void 0},a){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:i.message,wrap:i.wrap,width:i.width,height:0,fill:a}},newLoop:function(i={message:void 0,wrap:!1,width:void 0},a){this.sequenceItems.push(this.createLoop(i,a))},endLoop:function(){return this.sequenceItems.pop()},isLoopOverlap:function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},addSectionToLoop:function(i){const a=this.sequenceItems.pop();a.sections=a.sections||[],a.sectionTitles=a.sectionTitles||[],a.sections.push({y:Fr.getVerticalPos(),height:0}),a.sectionTitles.push(i),this.sequenceItems.push(a)},saveVerticalPos:function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},resetVerticalPos:function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},bumpVerticalPos:function(i){this.verticalPos=this.verticalPos+i,this.data.stopy=Kr.getMax(this.data.stopy,this.verticalPos)},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return{bounds:this.data,models:this.models}}},UVe=function(i,a){Fr.bumpVerticalPos(fn.boxMargin),a.height=fn.boxMargin,a.starty=Fr.getVerticalPos();const f=bT();f.x=a.startx,f.y=a.starty,f.width=a.width||fn.width,f.class="note";const p=i.append("g"),w=nf.drawRect(p,f),m=Rdt();m.x=a.startx,m.y=a.starty,m.width=f.width,m.dy="1em",m.text=a.message,m.class="noteText",m.fontFamily=fn.noteFontFamily,m.fontSize=fn.noteFontSize,m.fontWeight=fn.noteFontWeight,m.anchor=fn.noteAlign,m.textMargin=fn.noteMargin,m.valign="center";const b=pL(p,m),E=Math.round(b.map(_=>(_._groups||_)[0][0].getBBox().height).reduce((_,A)=>_+A));w.attr("height",E+2*fn.noteMargin),a.height+=E+2*fn.noteMargin,Fr.bumpVerticalPos(E+2*fn.noteMargin),a.stopy=a.starty+E+2*fn.noteMargin,a.stopx=a.startx+f.width,Fr.insert(a.startx,a.starty,a.stopx,a.stopy),Fr.models.addNote(a)},ST=i=>({fontFamily:i.messageFontFamily,fontSize:i.messageFontSize,fontWeight:i.messageFontWeight}),bL=i=>({fontFamily:i.noteFontFamily,fontSize:i.noteFontSize,fontWeight:i.noteFontWeight}),kgt=i=>({fontFamily:i.actorFontFamily,fontSize:i.actorFontSize,fontWeight:i.actorFontWeight});function WVe(i,a){Fr.bumpVerticalPos(10);const{startx:f,stopx:p,message:w}=a,m=Kr.splitBreaks(w).length,b=$a.calculateTextDimensions(w,ST(fn)),E=b.height/m;a.height+=E,Fr.bumpVerticalPos(E);let _,A=b.height-10;const I=b.width;if(f===p){_=Fr.getVerticalPos()+A,fn.rightAngles||(A+=fn.boxMargin,_=Fr.getVerticalPos()+A),A+=30;const B=Kr.getMax(I/2,fn.width/2);Fr.insert(f-B,Fr.getVerticalPos()-10+A,p+B,Fr.getVerticalPos()+30+A)}else A+=fn.boxMargin,_=Fr.getVerticalPos()+A,Fr.insert(f,_-10,p,_);return Fr.bumpVerticalPos(A),a.height+=A,a.stopy=a.starty+a.height,Fr.insert(a.fromBounds,a.starty,a.toBounds,a.stopy),_}const YVe=function(i,a,f,p){const{startx:w,stopx:m,starty:b,message:E,type:_,sequenceIndex:A,sequenceVisible:I}=a,B=$a.calculateTextDimensions(E,ST(fn)),N=Rdt();N.x=w,N.y=b+10,N.width=m-w,N.class="messageText",N.dy="1em",N.text=E,N.fontFamily=fn.messageFontFamily,N.fontSize=fn.messageFontSize,N.fontWeight=fn.messageFontWeight,N.anchor=fn.messageAlign,N.valign="center",N.textMargin=fn.wrapPadding,N.tspan=!1,pL(i,N);const R=B.width;let z;w===m?fn.rightAngles?z=i.append("path").attr("d",`M ${w},${f} H ${w+Kr.getMax(fn.width/2,R/2)} V ${f+25} H ${w}`):z=i.append("path").attr("d","M "+w+","+f+" C "+(w+60)+","+(f-10)+" "+(w+60)+","+(f+30)+" "+w+","+(f+20)):(z=i.append("line"),z.attr("x1",w),z.attr("y1",f),z.attr("x2",m),z.attr("y2",f)),_===p.db.LINETYPE.DOTTED||_===p.db.LINETYPE.DOTTED_CROSS||_===p.db.LINETYPE.DOTTED_POINT||_===p.db.LINETYPE.DOTTED_OPEN?(z.style("stroke-dasharray","3, 3"),z.attr("class","messageLine1")):z.attr("class","messageLine0");let W="";fn.arrowMarkerAbsolute&&(W=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,W=W.replace(/\(/g,"\\("),W=W.replace(/\)/g,"\\)")),z.attr("stroke-width",2),z.attr("stroke","none"),z.style("fill","none"),(_===p.db.LINETYPE.SOLID||_===p.db.LINETYPE.DOTTED)&&z.attr("marker-end","url("+W+"#arrowhead)"),(_===p.db.LINETYPE.SOLID_POINT||_===p.db.LINETYPE.DOTTED_POINT)&&z.attr("marker-end","url("+W+"#filled-head)"),(_===p.db.LINETYPE.SOLID_CROSS||_===p.db.LINETYPE.DOTTED_CROSS)&&z.attr("marker-end","url("+W+"#crosshead)"),(I||fn.showSequenceNumbers)&&(z.attr("marker-start","url("+W+"#sequencenumber)"),i.append("text").attr("x",w).attr("y",f+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(A))},KVe=function(i,a,f,p,w,m,b){let E=0,_=0,A,I=0;for(const B of p){const N=a[B],R=N.box;A&&A!=R&&(b||Fr.models.addBox(A),_+=fn.boxMargin+A.margin),R&&R!=A&&(b||(R.x=E+_,R.y=w),_+=R.margin),N.width=N.width||fn.width,N.height=Kr.getMax(N.height||fn.height,fn.height),N.margin=N.margin||fn.actorMargin,I=Kr.getMax(I,N.height),f[N.name]&&(_+=N.width/2),N.x=E+_,N.starty=Fr.getVerticalPos(),Fr.insert(N.x,w,N.x+N.width,N.height),E+=N.width+_,N.box&&(N.box.width=E+R.margin-N.box.x),_=N.margin,A=N.box,Fr.models.addActor(N)}A&&!b&&Fr.models.addBox(A),Fr.bumpVerticalPos(I)},Egt=function(i,a,f,p){if(p){let w=0;Fr.bumpVerticalPos(fn.boxMargin*2);for(const m of f){const b=a[m];b.stopy||(b.stopy=Fr.getVerticalPos());const E=nf.drawActor(i,b,fn,!0);w=Kr.getMax(w,E)}Fr.bumpVerticalPos(w+fn.boxMargin)}else for(const w of f){const m=a[w];nf.drawActor(i,m,fn,!1)}},RRt=function(i,a,f,p){let w=0,m=0;for(const b of f){const E=a[b],_=JVe(E),A=nf.drawPopup(i,E,_,fn,fn.forceMenus,p);A.height>w&&(w=A.height),A.width+E.x>m&&(m=A.width+E.x)}return{maxHeight:w,maxWidth:m}},jRt=function(i){Z1(fn,i),i.fontFamily&&(fn.actorFontFamily=fn.noteFontFamily=fn.messageFontFamily=i.fontFamily),i.fontSize&&(fn.actorFontSize=fn.noteFontSize=fn.messageFontSize=i.fontSize),i.fontWeight&&(fn.actorFontWeight=fn.noteFontWeight=fn.messageFontWeight=i.fontWeight)},jY=function(i){return Fr.activations.filter(function(a){return a.actor===i})},$Rt=function(i,a){const f=a[i],p=jY(i),w=p.reduce(function(b,E){return Kr.getMin(b,E.startx)},f.x+f.width/2-1),m=p.reduce(function(b,E){return Kr.getMax(b,E.stopx)},f.x+f.width/2+1);return[w,m]};function k3(i,a,f,p,w){Fr.bumpVerticalPos(f);let m=p;if(a.id&&a.message&&i[a.id]){const b=i[a.id].width,E=ST(fn);a.message=$a.wrapLabel(`[${a.message}]`,b-2*fn.wrapPadding,E),a.width=b,a.wrap=!0;const _=$a.calculateTextDimensions(a.message,E),A=Kr.getMax(_.height,fn.labelBoxHeight);m=p+A,Ut.debug(`${A} - ${a.message}`)}w(a),Fr.bumpVerticalPos(m)}function XVe(i,a,f,p,w,m,b){function E(A,I){A.x{Et.add(Z.from),Et.add(Z.to)}),z=z.filter(Z=>Et.has(Z))}KVe(A,I,B,z,0,W,!1);const mt=rGe(W,I,bt,p);nf.insertArrowHead(A),nf.insertArrowCrossHead(A),nf.insertArrowFilledHead(A),nf.insertSequenceNumber(A);function yt(Et,Z){const Ct=Fr.endActivation(Et);Ct.starty+18>Z&&(Ct.starty=Z-6,Z+=12),nf.drawActivation(A,Ct,Z,fn,jY(Et.from.actor).length),Fr.insert(Ct.startx,Z-10,Ct.stopx,Z)}let ft=1,ut=1;const vt=[],X=[];W.forEach(function(Et,Z){let Ct,xt,Ht;switch(Et.type){case p.db.LINETYPE.NOTE:Fr.resetVerticalPos(),xt=Et.noteModel,UVe(A,xt);break;case p.db.LINETYPE.ACTIVE_START:Fr.newActivation(Et,A,I);break;case p.db.LINETYPE.ACTIVE_END:yt(Et,Fr.getVerticalPos());break;case p.db.LINETYPE.LOOP_START:k3(mt,Et,fn.boxMargin,fn.boxMargin+fn.boxTextMargin,Le=>Fr.newLoop(Le));break;case p.db.LINETYPE.LOOP_END:Ct=Fr.endLoop(),nf.drawLoop(A,Ct,"loop",fn),Fr.bumpVerticalPos(Ct.stopy-Fr.getVerticalPos()),Fr.models.addLoop(Ct);break;case p.db.LINETYPE.RECT_START:k3(mt,Et,fn.boxMargin,fn.boxMargin,Le=>Fr.newLoop(void 0,Le.message));break;case p.db.LINETYPE.RECT_END:Ct=Fr.endLoop(),X.push(Ct),Fr.models.addLoop(Ct),Fr.bumpVerticalPos(Ct.stopy-Fr.getVerticalPos());break;case p.db.LINETYPE.OPT_START:k3(mt,Et,fn.boxMargin,fn.boxMargin+fn.boxTextMargin,Le=>Fr.newLoop(Le));break;case p.db.LINETYPE.OPT_END:Ct=Fr.endLoop(),nf.drawLoop(A,Ct,"opt",fn),Fr.bumpVerticalPos(Ct.stopy-Fr.getVerticalPos()),Fr.models.addLoop(Ct);break;case p.db.LINETYPE.ALT_START:k3(mt,Et,fn.boxMargin,fn.boxMargin+fn.boxTextMargin,Le=>Fr.newLoop(Le));break;case p.db.LINETYPE.ALT_ELSE:k3(mt,Et,fn.boxMargin+fn.boxTextMargin,fn.boxMargin,Le=>Fr.addSectionToLoop(Le));break;case p.db.LINETYPE.ALT_END:Ct=Fr.endLoop(),nf.drawLoop(A,Ct,"alt",fn),Fr.bumpVerticalPos(Ct.stopy-Fr.getVerticalPos()),Fr.models.addLoop(Ct);break;case p.db.LINETYPE.PAR_START:case p.db.LINETYPE.PAR_OVER_START:k3(mt,Et,fn.boxMargin,fn.boxMargin+fn.boxTextMargin,Le=>Fr.newLoop(Le)),Fr.saveVerticalPos();break;case p.db.LINETYPE.PAR_AND:k3(mt,Et,fn.boxMargin+fn.boxTextMargin,fn.boxMargin,Le=>Fr.addSectionToLoop(Le));break;case p.db.LINETYPE.PAR_END:Ct=Fr.endLoop(),nf.drawLoop(A,Ct,"par",fn),Fr.bumpVerticalPos(Ct.stopy-Fr.getVerticalPos()),Fr.models.addLoop(Ct);break;case p.db.LINETYPE.AUTONUMBER:ft=Et.message.start||ft,ut=Et.message.step||ut,Et.message.visible?p.db.enableSequenceNumbers():p.db.disableSequenceNumbers();break;case p.db.LINETYPE.CRITICAL_START:k3(mt,Et,fn.boxMargin,fn.boxMargin+fn.boxTextMargin,Le=>Fr.newLoop(Le));break;case p.db.LINETYPE.CRITICAL_OPTION:k3(mt,Et,fn.boxMargin+fn.boxTextMargin,fn.boxMargin,Le=>Fr.addSectionToLoop(Le));break;case p.db.LINETYPE.CRITICAL_END:Ct=Fr.endLoop(),nf.drawLoop(A,Ct,"critical",fn),Fr.bumpVerticalPos(Ct.stopy-Fr.getVerticalPos()),Fr.models.addLoop(Ct);break;case p.db.LINETYPE.BREAK_START:k3(mt,Et,fn.boxMargin,fn.boxMargin+fn.boxTextMargin,Le=>Fr.newLoop(Le));break;case p.db.LINETYPE.BREAK_END:Ct=Fr.endLoop(),nf.drawLoop(A,Ct,"break",fn),Fr.bumpVerticalPos(Ct.stopy-Fr.getVerticalPos()),Fr.models.addLoop(Ct);break;default:try{Ht=Et.msgModel,Ht.starty=Fr.getVerticalPos(),Ht.sequenceIndex=ft,Ht.sequenceVisible=p.db.showSequenceNumbers();const Le=WVe(A,Ht);XVe(Et,Ht,Le,Z,I,B,N),vt.push({messageModel:Ht,lineStartY:Le}),Fr.models.addMessage(Ht)}catch(Le){Ut.error("error while drawing message",Le)}}[p.db.LINETYPE.SOLID_OPEN,p.db.LINETYPE.DOTTED_OPEN,p.db.LINETYPE.SOLID,p.db.LINETYPE.DOTTED,p.db.LINETYPE.SOLID_CROSS,p.db.LINETYPE.DOTTED_CROSS,p.db.LINETYPE.SOLID_POINT,p.db.LINETYPE.DOTTED_POINT].includes(Et.type)&&(ft=ft+ut)}),Ut.debug("createdActors",B),Ut.debug("destroyedActors",N),Egt(A,I,z,!1),vt.forEach(Et=>YVe(A,Et.messageModel,Et.lineStartY,p)),fn.mirrorActors&&Egt(A,I,z,!0),X.forEach(Et=>nf.drawBackgroundRect(A,Et)),FRt(A,I,z,fn),Fr.models.boxes.forEach(function(Et){Et.height=Fr.getVerticalPos()-Et.y,Fr.insert(Et.x,Et.y,Et.x+Et.width,Et.height),Et.startx=Et.x,Et.starty=Et.y,Et.stopx=Et.startx+Et.width,Et.stopy=Et.starty+Et.height,Et.stroke="rgb(0,0,0, 0.5)",nf.drawBox(A,Et,fn)}),st&&Fr.bumpVerticalPos(fn.boxMargin);const pt=RRt(A,I,z,_),{bounds:U}=Fr.getBounds();let Tt=U.stopy-U.starty;Tt{const b=i[m];b.wrap&&(b.description=$a.wrapLabel(b.description,fn.width-2*fn.wrapPadding,kgt(fn)));const E=$a.calculateTextDimensions(b.description,kgt(fn));b.width=b.wrap?fn.width:Kr.getMax(fn.width,E.width+2*fn.wrapPadding),b.height=b.wrap?Kr.getMax(E.height,fn.height):fn.height,p=Kr.getMax(p,b.height)});for(const m in a){const b=i[m];if(!b)continue;const E=i[b.nextActor];if(!E){const B=a[m]+fn.actorMargin-b.width/2;b.margin=Kr.getMax(B,fn.actorMargin);continue}const A=a[m]+fn.actorMargin-b.width/2-E.width/2;b.margin=Kr.getMax(A,fn.actorMargin)}let w=0;return f.forEach(m=>{const b=ST(fn);let E=m.actorKeys.reduce((I,B)=>I+=i[B].width+(i[B].margin||0),0);E-=2*fn.boxTextMargin,m.wrap&&(m.name=$a.wrapLabel(m.name,E-2*fn.wrapPadding,b));const _=$a.calculateTextDimensions(m.name,b);w=Kr.getMax(_.height,w);const A=Kr.getMax(E,_.width+2*fn.wrapPadding);if(m.margin=fn.boxTextMargin,Em.textMaxHeight=w),Kr.getMax(p,fn.height)}const eGe=function(i,a,f){const p=a[i.from].x,w=a[i.to].x,m=i.wrap&&i.message;let b=$a.calculateTextDimensions(m?$a.wrapLabel(i.message,fn.width,bL(fn)):i.message,bL(fn));const E={width:m?fn.width:Kr.getMax(fn.width,b.width+2*fn.noteMargin),height:0,startx:a[i.from].x,stopx:0,starty:0,stopy:0,message:i.message};return i.placement===f.db.PLACEMENT.RIGHTOF?(E.width=m?Kr.getMax(fn.width,b.width):Kr.getMax(a[i.from].width/2+a[i.to].width/2,b.width+2*fn.noteMargin),E.startx=p+(a[i.from].width+fn.actorMargin)/2):i.placement===f.db.PLACEMENT.LEFTOF?(E.width=m?Kr.getMax(fn.width,b.width+2*fn.noteMargin):Kr.getMax(a[i.from].width/2+a[i.to].width/2,b.width+2*fn.noteMargin),E.startx=p-E.width+(a[i.from].width-fn.actorMargin)/2):i.to===i.from?(b=$a.calculateTextDimensions(m?$a.wrapLabel(i.message,Kr.getMax(fn.width,a[i.from].width),bL(fn)):i.message,bL(fn)),E.width=m?Kr.getMax(fn.width,a[i.from].width):Kr.getMax(a[i.from].width,fn.width,b.width+2*fn.noteMargin),E.startx=p+(a[i.from].width-E.width)/2):(E.width=Math.abs(p+a[i.from].width/2-(w+a[i.to].width/2))+fn.actorMargin,E.startx=p2,B=W=>E?-W:W;i.from===i.to?A=_:(i.activate&&!I&&(A+=B(fn.activationWidth/2-1)),[f.db.LINETYPE.SOLID_OPEN,f.db.LINETYPE.DOTTED_OPEN].includes(i.type)||(A+=B(3)));const N=[p,w,m,b],R=Math.abs(_-A);i.wrap&&i.message&&(i.message=$a.wrapLabel(i.message,Kr.getMax(R+2*fn.wrapPadding,fn.width),ST(fn)));const z=$a.calculateTextDimensions(i.message,ST(fn));return{width:Kr.getMax(i.wrap?0:z.width+2*fn.wrapPadding,R+2*fn.wrapPadding,fn.width),height:0,startx:_,stopx:A,starty:0,stopy:0,message:i.message,type:i.type,wrap:i.wrap,fromBounds:Math.min.apply(null,N),toBounds:Math.max.apply(null,N)}},rGe=function(i,a,f,p){const w={},m=[];let b,E,_;return i.forEach(function(A){switch(A.id=$a.random({length:10}),A.type){case p.db.LINETYPE.LOOP_START:case p.db.LINETYPE.ALT_START:case p.db.LINETYPE.OPT_START:case p.db.LINETYPE.PAR_START:case p.db.LINETYPE.PAR_OVER_START:case p.db.LINETYPE.CRITICAL_START:case p.db.LINETYPE.BREAK_START:m.push({id:A.id,msg:A.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case p.db.LINETYPE.ALT_ELSE:case p.db.LINETYPE.PAR_AND:case p.db.LINETYPE.CRITICAL_OPTION:A.message&&(b=m.pop(),w[b.id]=b,w[A.id]=b,m.push(b));break;case p.db.LINETYPE.LOOP_END:case p.db.LINETYPE.ALT_END:case p.db.LINETYPE.OPT_END:case p.db.LINETYPE.PAR_END:case p.db.LINETYPE.CRITICAL_END:case p.db.LINETYPE.BREAK_END:b=m.pop(),w[b.id]=b;break;case p.db.LINETYPE.ACTIVE_START:{const B=a[A.from?A.from.actor:A.to.actor],N=jY(A.from?A.from.actor:A.to.actor).length,R=B.x+B.width/2+(N-1)*fn.activationWidth/2,z={startx:R,stopx:R+fn.activationWidth,actor:A.from.actor,enabled:!0};Fr.activations.push(z)}break;case p.db.LINETYPE.ACTIVE_END:{const B=Fr.activations.map(N=>N.actor).lastIndexOf(A.from.actor);delete Fr.activations.splice(B,1)[0]}break}A.placement!==void 0?(E=eGe(A,a,p),A.noteModel=E,m.forEach(B=>{b=B,b.from=Kr.getMin(b.from,E.startx),b.to=Kr.getMax(b.to,E.startx+E.width),b.width=Kr.getMax(b.width,Math.abs(b.from-b.to))-fn.labelBoxWidth})):(_=nGe(A,a,p),A.msgModel=_,_.startx&&_.stopx&&m.length>0&&m.forEach(B=>{if(b=B,_.startx===_.stopx){const N=a[A.from],R=a[A.to];b.from=Kr.getMin(N.x-_.width/2,N.x-N.width/2,b.from),b.to=Kr.getMax(R.x+_.width/2,R.x+N.width/2,b.to),b.width=Kr.getMax(b.width,Math.abs(b.to-b.from))-fn.labelBoxWidth}else b.from=Kr.getMin(_.startx,b.from),b.to=Kr.getMax(_.stopx,b.to),b.width=Kr.getMax(b.width,_.width)-fn.labelBoxWidth}))}),Fr.activations=[],Ut.debug("Loop type widths:",w),w},iGe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:tVe,db:IRt,renderer:{bounds:Fr,drawActors:Egt,drawActorsPopup:RRt,setConf:jRt,draw:QVe},styles:TVe,init:({wrap:i})=>{IRt.setWrap(i)}}},Symbol.toStringTag,{value:"Module"}));var Tgt=function(){var i=function(ke,zt,re,se){for(re=re||{},se=ke.length;se--;re[ke[se]]=zt);return re},a=[1,16],f=[1,17],p=[1,18],w=[1,37],m=[1,38],b=[1,24],E=[1,22],_=[1,23],A=[1,29],I=[1,30],B=[1,31],N=[1,32],R=[1,33],z=[1,34],W=[1,25],et=[1,26],st=[1,27],at=[1,28],bt=[1,42],mt=[1,39],yt=[1,40],ft=[1,41],ut=[1,43],vt=[1,9],X=[1,8,9],pt=[1,54],U=[1,55],Tt=[1,56],nt=[1,57],It=[1,58],Ot=[1,59],Bt=[1,60],Et=[1,8,9,38],Z=[1,71],Ct=[1,8,9,12,13,21,36,38,41,58,59,60,61,62,63,64,69,71],xt=[1,8,9,12,13,19,21,36,38,41,45,58,59,60,61,62,63,64,69,71,84,86,87,88,89],Ht=[13,84,86,87,88,89],Le=[13,63,64,84,86,87,88,89],Ft=[13,58,59,60,61,62,84,86,87,88,89],gn=[1,90],Se=[1,8,9,36,38,41],me=[1,8,9,21],Ve={trace:function(){},yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,className:17,classLiteralName:18,GENERICTYPE:19,relationStatement:20,LABEL:21,namespaceStatement:22,classStatement:23,memberStatement:24,annotationStatement:25,clickStatement:26,cssClassStatement:27,noteStatement:28,direction:29,acc_title:30,acc_title_value:31,acc_descr:32,acc_descr_value:33,acc_descr_multiline_value:34,namespaceIdentifier:35,STRUCT_START:36,classStatements:37,STRUCT_STOP:38,NAMESPACE:39,classIdentifier:40,STYLE_SEPARATOR:41,members:42,CLASS:43,ANNOTATION_START:44,ANNOTATION_END:45,MEMBER:46,SEPARATOR:47,relation:48,NOTE_FOR:49,noteText:50,NOTE:51,direction_tb:52,direction_bt:53,direction_rl:54,direction_lr:55,relationType:56,lineType:57,AGGREGATION:58,EXTENSION:59,COMPOSITION:60,DEPENDENCY:61,LOLLIPOP:62,LINE:63,DOTTED_LINE:64,CALLBACK:65,LINK:66,LINK_TARGET:67,CLICK:68,CALLBACK_NAME:69,CALLBACK_ARGS:70,HREF:71,CSSCLASS:72,commentToken:73,textToken:74,graphCodeTokens:75,textNoTagsToken:76,TAGSTART:77,TAGEND:78,"==":79,"--":80,PCT:81,DEFAULT:82,SPACE:83,MINUS:84,keywords:85,UNICODE_TEXT:86,NUM:87,ALPHA:88,BQUOTE_STR:89,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",19:"GENERICTYPE",21:"LABEL",30:"acc_title",31:"acc_title_value",32:"acc_descr",33:"acc_descr_value",34:"acc_descr_multiline_value",36:"STRUCT_START",38:"STRUCT_STOP",39:"NAMESPACE",41:"STYLE_SEPARATOR",43:"CLASS",44:"ANNOTATION_START",45:"ANNOTATION_END",46:"MEMBER",47:"SEPARATOR",49:"NOTE_FOR",51:"NOTE",52:"direction_tb",53:"direction_bt",54:"direction_rl",55:"direction_lr",58:"AGGREGATION",59:"EXTENSION",60:"COMPOSITION",61:"DEPENDENCY",62:"LOLLIPOP",63:"LINE",64:"DOTTED_LINE",65:"CALLBACK",66:"LINK",67:"LINK_TARGET",68:"CLICK",69:"CALLBACK_NAME",70:"CALLBACK_ARGS",71:"HREF",72:"CSSCLASS",75:"graphCodeTokens",77:"TAGSTART",78:"TAGEND",79:"==",80:"--",81:"PCT",82:"DEFAULT",83:"SPACE",84:"MINUS",85:"keywords",86:"UNICODE_TEXT",87:"NUM",88:"ALPHA",89:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,2],[17,1],[17,1],[17,2],[17,2],[17,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[22,4],[22,5],[35,2],[37,1],[37,2],[37,3],[23,1],[23,3],[23,4],[23,6],[40,2],[40,3],[25,4],[42,1],[42,2],[24,1],[24,2],[24,1],[24,1],[20,3],[20,4],[20,4],[20,5],[28,3],[28,2],[29,1],[29,1],[29,1],[29,1],[48,3],[48,2],[48,2],[48,1],[56,1],[56,1],[56,1],[56,1],[56,1],[57,1],[57,1],[26,3],[26,4],[26,3],[26,4],[26,4],[26,5],[26,3],[26,4],[26,4],[26,5],[26,4],[26,5],[26,5],[26,6],[27,3],[73,1],[73,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[74,1],[76,1],[76,1],[76,1],[76,1],[16,1],[16,1],[16,1],[16,1],[18,1],[50,1]],performAction:function(zt,re,se,Pe,te,Me,de){var on=Me.length-1;switch(te){case 8:this.$=Me[on-1];break;case 9:case 11:case 12:this.$=Me[on];break;case 10:case 13:this.$=Me[on-1]+Me[on];break;case 14:case 15:this.$=Me[on-1]+"~"+Me[on]+"~";break;case 16:Pe.addRelation(Me[on]);break;case 17:Me[on-1].title=Pe.cleanupLabel(Me[on]),Pe.addRelation(Me[on-1]);break;case 26:this.$=Me[on].trim(),Pe.setAccTitle(this.$);break;case 27:case 28:this.$=Me[on].trim(),Pe.setAccDescription(this.$);break;case 29:Pe.addClassesToNamespace(Me[on-3],Me[on-1]);break;case 30:Pe.addClassesToNamespace(Me[on-4],Me[on-1]);break;case 31:this.$=Me[on],Pe.addNamespace(Me[on]);break;case 32:this.$=[Me[on]];break;case 33:this.$=[Me[on-1]];break;case 34:Me[on].unshift(Me[on-2]),this.$=Me[on];break;case 36:Pe.setCssClass(Me[on-2],Me[on]);break;case 37:Pe.addMembers(Me[on-3],Me[on-1]);break;case 38:Pe.setCssClass(Me[on-5],Me[on-3]),Pe.addMembers(Me[on-5],Me[on-1]);break;case 39:this.$=Me[on],Pe.addClass(Me[on]);break;case 40:this.$=Me[on-1],Pe.addClass(Me[on-1]),Pe.setClassLabel(Me[on-1],Me[on]);break;case 41:Pe.addAnnotation(Me[on],Me[on-2]);break;case 42:this.$=[Me[on]];break;case 43:Me[on].push(Me[on-1]),this.$=Me[on];break;case 44:break;case 45:Pe.addMember(Me[on-1],Pe.cleanupLabel(Me[on]));break;case 46:break;case 47:break;case 48:this.$={id1:Me[on-2],id2:Me[on],relation:Me[on-1],relationTitle1:"none",relationTitle2:"none"};break;case 49:this.$={id1:Me[on-3],id2:Me[on],relation:Me[on-1],relationTitle1:Me[on-2],relationTitle2:"none"};break;case 50:this.$={id1:Me[on-3],id2:Me[on],relation:Me[on-2],relationTitle1:"none",relationTitle2:Me[on-1]};break;case 51:this.$={id1:Me[on-4],id2:Me[on],relation:Me[on-2],relationTitle1:Me[on-3],relationTitle2:Me[on-1]};break;case 52:Pe.addNote(Me[on],Me[on-1]);break;case 53:Pe.addNote(Me[on]);break;case 54:Pe.setDirection("TB");break;case 55:Pe.setDirection("BT");break;case 56:Pe.setDirection("RL");break;case 57:Pe.setDirection("LR");break;case 58:this.$={type1:Me[on-2],type2:Me[on],lineType:Me[on-1]};break;case 59:this.$={type1:"none",type2:Me[on],lineType:Me[on-1]};break;case 60:this.$={type1:Me[on-1],type2:"none",lineType:Me[on]};break;case 61:this.$={type1:"none",type2:"none",lineType:Me[on]};break;case 62:this.$=Pe.relationType.AGGREGATION;break;case 63:this.$=Pe.relationType.EXTENSION;break;case 64:this.$=Pe.relationType.COMPOSITION;break;case 65:this.$=Pe.relationType.DEPENDENCY;break;case 66:this.$=Pe.relationType.LOLLIPOP;break;case 67:this.$=Pe.lineType.LINE;break;case 68:this.$=Pe.lineType.DOTTED_LINE;break;case 69:case 75:this.$=Me[on-2],Pe.setClickEvent(Me[on-1],Me[on]);break;case 70:case 76:this.$=Me[on-3],Pe.setClickEvent(Me[on-2],Me[on-1]),Pe.setTooltip(Me[on-2],Me[on]);break;case 71:this.$=Me[on-2],Pe.setLink(Me[on-1],Me[on]);break;case 72:this.$=Me[on-3],Pe.setLink(Me[on-2],Me[on-1],Me[on]);break;case 73:this.$=Me[on-3],Pe.setLink(Me[on-2],Me[on-1]),Pe.setTooltip(Me[on-2],Me[on]);break;case 74:this.$=Me[on-4],Pe.setLink(Me[on-3],Me[on-2],Me[on]),Pe.setTooltip(Me[on-3],Me[on-1]);break;case 77:this.$=Me[on-3],Pe.setClickEvent(Me[on-2],Me[on-1],Me[on]);break;case 78:this.$=Me[on-4],Pe.setClickEvent(Me[on-3],Me[on-2],Me[on-1]),Pe.setTooltip(Me[on-3],Me[on]);break;case 79:this.$=Me[on-3],Pe.setLink(Me[on-2],Me[on]);break;case 80:this.$=Me[on-4],Pe.setLink(Me[on-3],Me[on-1],Me[on]);break;case 81:this.$=Me[on-4],Pe.setLink(Me[on-3],Me[on-1]),Pe.setTooltip(Me[on-3],Me[on]);break;case 82:this.$=Me[on-5],Pe.setLink(Me[on-4],Me[on-2],Me[on]),Pe.setTooltip(Me[on-4],Me[on-1]);break;case 83:Pe.setCssClass(Me[on-1],Me[on]);break}},table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:35,17:19,18:36,20:7,22:8,23:9,24:10,25:11,26:12,27:13,28:14,29:15,30:a,32:f,34:p,35:20,39:w,40:21,43:m,44:b,46:E,47:_,49:A,51:I,52:B,53:N,54:R,55:z,65:W,66:et,68:st,72:at,84:bt,86:mt,87:yt,88:ft,89:ut},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},i(vt,[2,5],{8:[1,44]}),{8:[1,45]},i(X,[2,16],{21:[1,46]}),i(X,[2,18]),i(X,[2,19]),i(X,[2,20]),i(X,[2,21]),i(X,[2,22]),i(X,[2,23]),i(X,[2,24]),i(X,[2,25]),{31:[1,47]},{33:[1,48]},i(X,[2,28]),i(X,[2,44],{48:49,56:52,57:53,13:[1,50],21:[1,51],58:pt,59:U,60:Tt,61:nt,62:It,63:Ot,64:Bt}),{36:[1,61]},i(Et,[2,35],{36:[1,63],41:[1,62]}),i(X,[2,46]),i(X,[2,47]),{16:64,84:bt,86:mt,87:yt,88:ft},{16:35,17:65,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},{16:35,17:66,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},{16:35,17:67,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},{13:[1,68]},{16:35,17:69,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},{13:Z,50:70},i(X,[2,54]),i(X,[2,55]),i(X,[2,56]),i(X,[2,57]),i(Ct,[2,11],{16:35,18:36,17:72,19:[1,73],84:bt,86:mt,87:yt,88:ft,89:ut}),i(Ct,[2,12],{19:[1,74]}),{15:75,16:76,84:bt,86:mt,87:yt,88:ft},{16:35,17:77,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},i(xt,[2,97]),i(xt,[2,98]),i(xt,[2,99]),i(xt,[2,100]),i([1,8,9,12,13,19,21,36,38,41,58,59,60,61,62,63,64,69,71],[2,101]),i(vt,[2,6],{10:5,20:7,22:8,23:9,24:10,25:11,26:12,27:13,28:14,29:15,17:19,35:20,40:21,16:35,18:36,5:78,30:a,32:f,34:p,39:w,43:m,44:b,46:E,47:_,49:A,51:I,52:B,53:N,54:R,55:z,65:W,66:et,68:st,72:at,84:bt,86:mt,87:yt,88:ft,89:ut}),{5:79,10:5,16:35,17:19,18:36,20:7,22:8,23:9,24:10,25:11,26:12,27:13,28:14,29:15,30:a,32:f,34:p,35:20,39:w,40:21,43:m,44:b,46:E,47:_,49:A,51:I,52:B,53:N,54:R,55:z,65:W,66:et,68:st,72:at,84:bt,86:mt,87:yt,88:ft,89:ut},i(X,[2,17]),i(X,[2,26]),i(X,[2,27]),{13:[1,81],16:35,17:80,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},{48:82,56:52,57:53,58:pt,59:U,60:Tt,61:nt,62:It,63:Ot,64:Bt},i(X,[2,45]),{57:83,63:Ot,64:Bt},i(Ht,[2,61],{56:84,58:pt,59:U,60:Tt,61:nt,62:It}),i(Le,[2,62]),i(Le,[2,63]),i(Le,[2,64]),i(Le,[2,65]),i(Le,[2,66]),i(Ft,[2,67]),i(Ft,[2,68]),{8:[1,86],23:87,37:85,40:21,43:m},{16:88,84:bt,86:mt,87:yt,88:ft},{42:89,46:gn},{45:[1,91]},{13:[1,92]},{13:[1,93]},{69:[1,94],71:[1,95]},{16:96,84:bt,86:mt,87:yt,88:ft},{13:Z,50:97},i(X,[2,53]),i(X,[2,102]),i(Ct,[2,13]),i(Ct,[2,14]),i(Ct,[2,15]),{36:[2,31]},{15:98,16:76,36:[2,9],84:bt,86:mt,87:yt,88:ft},i(Se,[2,39],{11:99,12:[1,100]}),i(vt,[2,7]),{9:[1,101]},i(me,[2,48]),{16:35,17:102,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},{13:[1,104],16:35,17:103,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},i(Ht,[2,60],{56:105,58:pt,59:U,60:Tt,61:nt,62:It}),i(Ht,[2,59]),{38:[1,106]},{23:87,37:107,40:21,43:m},{8:[1,108],38:[2,32]},i(Et,[2,36],{36:[1,109]}),{38:[1,110]},{38:[2,42],42:111,46:gn},{16:35,17:112,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},i(X,[2,69],{13:[1,113]}),i(X,[2,71],{13:[1,115],67:[1,114]}),i(X,[2,75],{13:[1,116],70:[1,117]}),{13:[1,118]},i(X,[2,83]),i(X,[2,52]),{36:[2,10]},i(Se,[2,40]),{13:[1,119]},{1:[2,4]},i(me,[2,50]),i(me,[2,49]),{16:35,17:120,18:36,84:bt,86:mt,87:yt,88:ft,89:ut},i(Ht,[2,58]),i(X,[2,29]),{38:[1,121]},{23:87,37:122,38:[2,33],40:21,43:m},{42:123,46:gn},i(Et,[2,37]),{38:[2,43]},i(X,[2,41]),i(X,[2,70]),i(X,[2,72]),i(X,[2,73],{67:[1,124]}),i(X,[2,76]),i(X,[2,77],{13:[1,125]}),i(X,[2,79],{13:[1,127],67:[1,126]}),{14:[1,128]},i(me,[2,51]),i(X,[2,30]),{38:[2,34]},{38:[1,129]},i(X,[2,74]),i(X,[2,78]),i(X,[2,80]),i(X,[2,81],{67:[1,130]}),i(Se,[2,8]),i(Et,[2,38]),i(X,[2,82])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],75:[2,31],98:[2,10],101:[2,4],111:[2,43],122:[2,34]},parseError:function(zt,re){if(re.recoverable)this.trace(zt);else{var se=new Error(zt);throw se.hash=re,se}},parse:function(zt){var re=this,se=[0],Pe=[],te=[null],Me=[],de=this.table,on="",ni=0,Ks=0,ws=2,fo=1,Xi=Me.slice.call(arguments,1),Er=Object.create(this.lexer),Xn={yy:{}};for(var di in this.yy)Object.prototype.hasOwnProperty.call(this.yy,di)&&(Xn.yy[di]=this.yy[di]);Er.setInput(zt,Xn.yy),Xn.yy.lexer=Er,Xn.yy.parser=this,typeof Er.yylloc>"u"&&(Er.yylloc={});var Ee=Er.yylloc;Me.push(Ee);var Kn=Er.options&&Er.options.ranges;typeof Xn.yy.parseError=="function"?this.parseError=Xn.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function He(){var Du;return Du=Pe.pop()||Er.lex()||fo,typeof Du!="number"&&(Du instanceof Array&&(Pe=Du,Du=Pe.pop()),Du=re.symbols_[Du]||Du),Du}for(var Ti,pn,Es,qa,Ma={},Gs,Po,vs,ru;;){if(pn=se[se.length-1],this.defaultActions[pn]?Es=this.defaultActions[pn]:((Ti===null||typeof Ti>"u")&&(Ti=He()),Es=de[pn]&&de[pn][Ti]),typeof Es>"u"||!Es.length||!Es[0]){var zs="";ru=[];for(Gs in de[pn])this.terminals_[Gs]&&Gs>ws&&ru.push("'"+this.terminals_[Gs]+"'");Er.showPosition?zs="Parse error on line "+(ni+1)+`: +`+Er.showPosition()+` +Expecting `+ru.join(", ")+", got '"+(this.terminals_[Ti]||Ti)+"'":zs="Parse error on line "+(ni+1)+": Unexpected "+(Ti==fo?"end of input":"'"+(this.terminals_[Ti]||Ti)+"'"),this.parseError(zs,{text:Er.match,token:this.terminals_[Ti]||Ti,line:Er.yylineno,loc:Ee,expected:ru})}if(Es[0]instanceof Array&&Es.length>1)throw new Error("Parse Error: multiple actions possible at state: "+pn+", token: "+Ti);switch(Es[0]){case 1:se.push(Ti),te.push(Er.yytext),Me.push(Er.yylloc),se.push(Es[1]),Ti=null,Ks=Er.yyleng,on=Er.yytext,ni=Er.yylineno,Ee=Er.yylloc;break;case 2:if(Po=this.productions_[Es[1]][1],Ma.$=te[te.length-Po],Ma._$={first_line:Me[Me.length-(Po||1)].first_line,last_line:Me[Me.length-1].last_line,first_column:Me[Me.length-(Po||1)].first_column,last_column:Me[Me.length-1].last_column},Kn&&(Ma._$.range=[Me[Me.length-(Po||1)].range[0],Me[Me.length-1].range[1]]),qa=this.performAction.apply(Ma,[on,Ks,ni,Xn.yy,Es[1],te,Me].concat(Xi)),typeof qa<"u")return qa;Po&&(se=se.slice(0,-1*Po*2),te=te.slice(0,-1*Po),Me=Me.slice(0,-1*Po)),se.push(this.productions_[Es[1]][0]),te.push(Ma.$),Me.push(Ma._$),vs=de[se[se.length-2]][se[se.length-1]],se.push(vs);break;case 3:return!0}}return!0}},Ye=function(){var ke={EOF:1,parseError:function(re,se){if(this.yy.parser)this.yy.parser.parseError(re,se);else throw new Error(re)},setInput:function(zt,re){return this.yy=re||this.yy||{},this._input=zt,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var zt=this._input[0];this.yytext+=zt,this.yyleng++,this.offset++,this.match+=zt,this.matched+=zt;var re=zt.match(/(?:\r\n?|\n).*/g);return re?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),zt},unput:function(zt){var re=zt.length,se=zt.split(/(?:\r\n?|\n)/g);this._input=zt+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-re),this.offset-=re;var Pe=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),se.length-1&&(this.yylineno-=se.length-1);var te=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:se?(se.length===Pe.length?this.yylloc.first_column:0)+Pe[Pe.length-se.length].length-se[0].length:this.yylloc.first_column-re},this.options.ranges&&(this.yylloc.range=[te[0],te[0]+this.yyleng-re]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(zt){this.unput(this.match.slice(zt))},pastInput:function(){var zt=this.matched.substr(0,this.matched.length-this.match.length);return(zt.length>20?"...":"")+zt.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var zt=this.match;return zt.length<20&&(zt+=this._input.substr(0,20-zt.length)),(zt.substr(0,20)+(zt.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var zt=this.pastInput(),re=new Array(zt.length+1).join("-");return zt+this.upcomingInput()+` +`+re+"^"},test_match:function(zt,re){var se,Pe,te;if(this.options.backtrack_lexer&&(te={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(te.yylloc.range=this.yylloc.range.slice(0))),Pe=zt[0].match(/(?:\r\n?|\n).*/g),Pe&&(this.yylineno+=Pe.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Pe?Pe[Pe.length-1].length-Pe[Pe.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+zt[0].length},this.yytext+=zt[0],this.match+=zt[0],this.matches=zt,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(zt[0].length),this.matched+=zt[0],se=this.performAction.call(this,this.yy,this,re,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),se)return se;if(this._backtrack){for(var Me in te)this[Me]=te[Me];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var zt,re,se,Pe;this._more||(this.yytext="",this.match="");for(var te=this._currentRules(),Me=0;Mere[0].length)){if(re=se,Pe=Me,this.options.backtrack_lexer){if(zt=this.test_match(se,te[Me]),zt!==!1)return zt;if(this._backtrack){re=!1;continue}else return!1}else if(!this.options.flex)break}return re?(zt=this.test_match(re,te[Pe]),zt!==!1?zt:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var re=this.next();return re||this.lex()},begin:function(re){this.conditionStack.push(re)},popState:function(){var re=this.conditionStack.length-1;return re>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(re){return re=this.conditionStack.length-1-Math.abs(re||0),re>=0?this.conditionStack[re]:"INITIAL"},pushState:function(re){this.begin(re)},stateStackSize:function(){return this.conditionStack.length},options:{},performAction:function(re,se,Pe,te){switch(Pe){case 0:return 52;case 1:return 53;case 2:return 54;case 3:return 55;case 4:break;case 5:break;case 6:return this.begin("acc_title"),30;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),32;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 69;case 22:this.popState();break;case 23:return 70;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return this.begin("namespace"),39;case 28:return this.popState(),8;case 29:break;case 30:return this.begin("namespace-body"),36;case 31:return this.popState(),38;case 32:return"EOF_IN_STRUCT";case 33:return 8;case 34:break;case 35:return"EDGE_STATE";case 36:return this.begin("class"),43;case 37:return this.popState(),8;case 38:break;case 39:return this.popState(),this.popState(),38;case 40:return this.begin("class-body"),36;case 41:return this.popState(),38;case 42:return"EOF_IN_STRUCT";case 43:return"EDGE_STATE";case 44:return"OPEN_IN_STRUCT";case 45:break;case 46:return"MEMBER";case 47:return 72;case 48:return 65;case 49:return 66;case 50:return 68;case 51:return 49;case 52:return 51;case 53:return 44;case 54:return 45;case 55:return 71;case 56:this.popState();break;case 57:return"GENERICTYPE";case 58:this.begin("generic");break;case 59:this.popState();break;case 60:return"BQUOTE_STR";case 61:this.begin("bqstring");break;case 62:return 67;case 63:return 67;case 64:return 67;case 65:return 67;case 66:return 59;case 67:return 59;case 68:return 61;case 69:return 61;case 70:return 60;case 71:return 58;case 72:return 62;case 73:return 63;case 74:return 64;case 75:return 21;case 76:return 41;case 77:return 84;case 78:return"DOT";case 79:return"PLUS";case 80:return 81;case 81:return"EQUALS";case 82:return"EQUALS";case 83:return 88;case 84:return 12;case 85:return 14;case 86:return"PUNCTUATION";case 87:return 87;case 88:return 86;case 89:return 83;case 90:return 9}},rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,31,32,33,34,35,36,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},namespace:{rules:[26,27,28,29,30,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},"class-body":{rules:[26,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},class:{rules:[26,37,38,39,40,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},acc_descr:{rules:[9,26,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},acc_title:{rules:[7,26,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},callback_args:{rules:[22,23,26,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},callback_name:{rules:[19,20,21,26,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},href:{rules:[26,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},struct:{rules:[26,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},generic:{rules:[26,47,48,49,50,51,52,53,54,55,56,57,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},bqstring:{rules:[26,47,48,49,50,51,52,53,54,55,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},string:{rules:[24,25,26,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,36,47,48,49,50,51,52,53,54,55,58,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90],inclusive:!0}}};return ke}();Ve.lexer=Ye;function ce(){this.yy={}}return ce.prototype=Ve,Ve.Parser=ce,new ce}();Tgt.parser=Tgt;const zRt=Tgt,qRt=["#","+","~","-",""];class HRt{constructor(a,f){this.memberType=f,this.visibility="",this.classifier="";const p=Q1(a,Oe());this.parseMember(p)}getDisplayDetails(){let a=this.visibility+YP(this.id);this.memberType==="method"&&(a+=`(${YP(this.parameters.trim())})`,this.returnType&&(a+=" : "+YP(this.returnType))),a=a.trim();const f=this.parseClassifier();return{displayText:a,cssStyle:f}}parseMember(a){let f="";if(this.memberType==="method"){const p=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/,w=a.match(p);if(w){const m=w[1]?w[1].trim():"";if(qRt.includes(m)&&(this.visibility=m),this.id=w[2].trim(),this.parameters=w[3]?w[3].trim():"",f=w[4]?w[4].trim():"",this.returnType=w[5]?w[5].trim():"",f===""){const b=this.returnType.substring(this.returnType.length-1);b.match(/[$*]/)&&(f=b,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{const p=a.length,w=a.substring(0,1),m=a.substring(p-1);qRt.includes(w)&&(this.visibility=w),m.match(/[*?]/)&&(f=m),this.id=a.substring(this.visibility===""?0:1,f===""?p:p-1)}this.classifier=f}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}}const $Y="classId-";let Cgt=[],Jl={},zY=[],VRt=0,xk={},_gt=0,WF=[];const AT=i=>Kr.sanitizeText(i,Oe()),wL=function(i){const a=Kr.sanitizeText(i,Oe());let f="",p=a;if(a.indexOf("~")>0){const w=a.split("~");p=AT(w[0]),f=AT(w[1])}return{className:p,type:f}},sGe=function(i,a){const f=Kr.sanitizeText(i,Oe());a&&(a=AT(a));const{className:p}=wL(f);Jl[p].label=a},qY=function(i){const a=Kr.sanitizeText(i,Oe()),{className:f,type:p}=wL(a);if(Object.hasOwn(Jl,f))return;const w=Kr.sanitizeText(f,Oe());Jl[w]={id:w,type:p,label:w,cssClasses:[],methods:[],members:[],annotations:[],domId:$Y+w+"-"+VRt},VRt++},GRt=function(i){const a=Kr.sanitizeText(i,Oe());if(a in Jl)return Jl[a].domId;throw new Error("Class not found: "+a)},aGe=function(){Cgt=[],Jl={},zY=[],WF=[],WF.push(WRt),xk={},_gt=0,hg()},oGe=function(i){return Jl[i]},cGe=function(){return Jl},uGe=function(){return Cgt},lGe=function(){return zY},hGe=function(i){Ut.debug("Adding relation: "+JSON.stringify(i)),qY(i.id1),qY(i.id2),i.id1=wL(i.id1).className,i.id2=wL(i.id2).className,i.relationTitle1=Kr.sanitizeText(i.relationTitle1.trim(),Oe()),i.relationTitle2=Kr.sanitizeText(i.relationTitle2.trim(),Oe()),Cgt.push(i)},fGe=function(i,a){const f=wL(i).className;Jl[f].annotations.push(a)},URt=function(i,a){qY(i);const f=wL(i).className,p=Jl[f];if(typeof a=="string"){const w=a.trim();w.startsWith("<<")&&w.endsWith(">>")?p.annotations.push(AT(w.substring(2,w.length-2))):w.indexOf(")")>0?p.methods.push(new HRt(w,"method")):w&&p.members.push(new HRt(w,"attribute"))}},dGe=function(i,a){Array.isArray(a)&&(a.reverse(),a.forEach(f=>URt(i,f)))},gGe=function(i,a){const f={id:`note${zY.length}`,class:a,text:i};zY.push(f)},pGe=function(i){return i.startsWith(":")&&(i=i.substring(1)),AT(i.trim())},Sgt=function(i,a){i.split(",").forEach(function(f){let p=f;f[0].match(/\d/)&&(p=$Y+p),Jl[p]!==void 0&&Jl[p].cssClasses.push(a)})},bGe=function(i,a){i.split(",").forEach(function(f){a!==void 0&&(Jl[f].tooltip=AT(a))})},wGe=function(i,a){return a?xk[a].classes[i].tooltip:Jl[i].tooltip},vGe=function(i,a,f){const p=Oe();i.split(",").forEach(function(w){let m=w;w[0].match(/\d/)&&(m=$Y+m),Jl[m]!==void 0&&(Jl[m].link=$a.formatUrl(a,p),p.securityLevel==="sandbox"?Jl[m].linkTarget="_top":typeof f=="string"?Jl[m].linkTarget=AT(f):Jl[m].linkTarget="_blank")}),Sgt(i,"clickable")},mGe=function(i,a,f){i.split(",").forEach(function(p){yGe(p,a,f),Jl[p].haveCallback=!0}),Sgt(i,"clickable")},yGe=function(i,a,f){const p=Kr.sanitizeText(i,Oe());if(Oe().securityLevel!=="loose"||a===void 0)return;const m=p;if(Jl[m]!==void 0){const b=GRt(m);let E=[];if(typeof f=="string"){E=f.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let _=0;_")),w.classed("hover",!0)}).on("mouseout",function(){a.transition().duration(500).style("opacity",0),yr(this).classed("hover",!1)})};WF.push(WRt);let YRt="TB";const HY={setAccTitle:E0,getAccTitle:fg,getAccDescription:gg,setAccDescription:dg,getConfig:()=>Oe().class,addClass:qY,bindFunctions:xGe,clear:aGe,getClass:oGe,getClasses:cGe,getNotes:lGe,addAnnotation:fGe,addNote:gGe,getRelations:uGe,addRelation:hGe,getDirection:()=>YRt,setDirection:i=>{YRt=i},addMember:URt,addMembers:dGe,cleanupLabel:pGe,lineType:kGe,relationType:EGe,setClickEvent:mGe,setCssClass:Sgt,setLink:vGe,getTooltip:wGe,setTooltip:bGe,lookUpDomId:GRt,setDiagramTitle:Nb,getDiagramTitle:pg,setClassLabel:sGe,addNamespace:function(i){xk[i]===void 0&&(xk[i]={id:i,classes:{},children:{},domId:$Y+i+"-"+_gt},_gt++)},addClassesToNamespace:function(i,a){xk[i]!==void 0&&a.map(f=>{Jl[f].parent=i,xk[i].classes[f]=Jl[f]})},getNamespace:function(i){return xk[i]},getNamespaces:function(){return xk}},KRt=i=>`g.classGroup text { + fill: ${i.nodeBorder||i.classText}; + stroke: none; + font-family: ${i.fontFamily}; + font-size: 10px; + + .title { + font-weight: bolder; + } + +} + +.nodeLabel, .edgeLabel { + color: ${i.classText}; +} +.edgeLabel .label rect { + fill: ${i.mainBkg}; +} +.label text { + fill: ${i.classText}; +} +.edgeLabel .label span { + background: ${i.mainBkg}; +} + +.classTitle { + font-weight: bolder; +} +.node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${i.mainBkg}; + stroke: ${i.nodeBorder}; + stroke-width: 1px; + } + + +.divider { + stroke: ${i.nodeBorder}; + stroke-width: 1; +} + +g.clickable { + cursor: pointer; +} + +g.classGroup rect { + fill: ${i.mainBkg}; + stroke: ${i.nodeBorder}; +} + +g.classGroup line { + stroke: ${i.nodeBorder}; + stroke-width: 1; +} + +.classLabel .box { + stroke: none; + stroke-width: 0; + fill: ${i.mainBkg}; + opacity: 0.5; +} + +.classLabel .label { + fill: ${i.nodeBorder}; + font-size: 10px; +} + +.relation { + stroke: ${i.lineColor}; + stroke-width: 1; + fill: none; +} + +.dashed-line{ + stroke-dasharray: 3; +} + +.dotted-line{ + stroke-dasharray: 1 2; +} + +#compositionStart, .composition { + fill: ${i.lineColor} !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +#compositionEnd, .composition { + fill: ${i.lineColor} !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${i.lineColor} !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +#dependencyStart, .dependency { + fill: ${i.lineColor} !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +#extensionStart, .extension { + fill: transparent !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +#extensionEnd, .extension { + fill: transparent !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +#aggregationStart, .aggregation { + fill: transparent !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +#aggregationEnd, .aggregation { + fill: transparent !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +#lollipopStart, .lollipop { + fill: ${i.mainBkg} !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +#lollipopEnd, .lollipop { + fill: ${i.mainBkg} !important; + stroke: ${i.lineColor} !important; + stroke-width: 1; +} + +.edgeTerminals { + font-size: 11px; +} + +.classTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${i.textColor}; +} +`;let XRt=0;const TGe=function(i,a,f,p,w){const m=function(at){switch(at){case w.db.relationType.AGGREGATION:return"aggregation";case w.db.relationType.EXTENSION:return"extension";case w.db.relationType.COMPOSITION:return"composition";case w.db.relationType.DEPENDENCY:return"dependency";case w.db.relationType.LOLLIPOP:return"lollipop"}};a.points=a.points.filter(at=>!Number.isNaN(at.y));const b=a.points,E=E5().x(function(at){return at.x}).y(function(at){return at.y}).curve(HP),_=i.append("path").attr("d",E(b)).attr("id","edge"+XRt).attr("class","relation");let A="";p.arrowMarkerAbsolute&&(A=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,A=A.replace(/\(/g,"\\("),A=A.replace(/\)/g,"\\)")),f.relation.lineType==1&&_.attr("class","relation dashed-line"),f.relation.lineType==10&&_.attr("class","relation dotted-line"),f.relation.type1!=="none"&&_.attr("marker-start","url("+A+"#"+m(f.relation.type1)+"Start)"),f.relation.type2!=="none"&&_.attr("marker-end","url("+A+"#"+m(f.relation.type2)+"End)");let I,B;const N=a.points.length;let R=$a.calcLabelPosition(a.points);I=R.x,B=R.y;let z,W,et,st;if(N%2!==0&&N>1){let at=$a.calcCardinalityPosition(f.relation.type1!=="none",a.points,a.points[0]),bt=$a.calcCardinalityPosition(f.relation.type2!=="none",a.points,a.points[N-1]);Ut.debug("cardinality_1_point "+JSON.stringify(at)),Ut.debug("cardinality_2_point "+JSON.stringify(bt)),z=at.x,W=at.y,et=bt.x,st=bt.y}if(f.title!==void 0){const at=i.append("g").attr("class","classLabel"),bt=at.append("text").attr("class","label").attr("x",I).attr("y",B).attr("fill","red").attr("text-anchor","middle").text(f.title);window.label=bt;const mt=bt.node().getBBox();at.insert("rect",":first-child").attr("class","box").attr("x",mt.x-p.padding/2).attr("y",mt.y-p.padding/2).attr("width",mt.width+p.padding).attr("height",mt.height+p.padding)}Ut.info("Rendering relation "+JSON.stringify(f)),f.relationTitle1!==void 0&&f.relationTitle1!=="none"&&i.append("g").attr("class","cardinality").append("text").attr("class","type1").attr("x",z).attr("y",W).attr("fill","black").attr("font-size","6").text(f.relationTitle1),f.relationTitle2!==void 0&&f.relationTitle2!=="none"&&i.append("g").attr("class","cardinality").append("text").attr("class","type2").attr("x",et).attr("y",st).attr("fill","black").attr("font-size","6").text(f.relationTitle2),XRt++},CGe=function(i,a,f,p){Ut.debug("Rendering class ",a,f);const w=a.id,m={id:w,label:a.id,width:0,height:0},b=i.append("g").attr("id",p.db.lookUpDomId(w)).attr("class","classGroup");let E;a.link?E=b.append("svg:a").attr("xlink:href",a.link).attr("target",a.linkTarget).append("text").attr("y",f.textHeight+f.padding).attr("x",0):E=b.append("text").attr("y",f.textHeight+f.padding).attr("x",0);let _=!0;a.annotations.forEach(function(bt){const mt=E.append("tspan").text("«"+bt+"»");_||mt.attr("dy",f.textHeight),_=!1});let A=QRt(a);const I=E.append("tspan").text(A).attr("class","title");_||I.attr("dy",f.textHeight);const B=E.node().getBBox().height;let N,R,z;if(a.members.length>0){N=b.append("line").attr("x1",0).attr("y1",f.padding+B+f.dividerMargin/2).attr("y2",f.padding+B+f.dividerMargin/2);const bt=b.append("text").attr("x",f.padding).attr("y",B+f.dividerMargin+f.textHeight).attr("fill","white").attr("class","classText");_=!0,a.members.forEach(function(mt){ZRt(bt,mt,_,f),_=!1}),R=bt.node().getBBox()}if(a.methods.length>0){z=b.append("line").attr("x1",0).attr("y1",f.padding+B+f.dividerMargin+R.height).attr("y2",f.padding+B+f.dividerMargin+R.height);const bt=b.append("text").attr("x",f.padding).attr("y",B+2*f.dividerMargin+R.height+f.textHeight).attr("fill","white").attr("class","classText");_=!0,a.methods.forEach(function(mt){ZRt(bt,mt,_,f),_=!1})}const W=b.node().getBBox();var et=" ";a.cssClasses.length>0&&(et=et+a.cssClasses.join(" "));const at=b.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",W.width+2*f.padding).attr("height",W.height+f.padding+.5*f.dividerMargin).attr("class",et).node().getBBox().width;return E.node().childNodes.forEach(function(bt){bt.setAttribute("x",(at-bt.getBBox().width)/2)}),a.tooltip&&E.insert("title").text(a.tooltip),N&&N.attr("x2",at),z&&z.attr("x2",at),m.width=at,m.height=W.height+f.padding+.5*f.dividerMargin,m},QRt=function(i){let a=i.id;return i.type&&(a+="<"+YP(i.type)+">"),a},_Ge=function(i,a,f,p){Ut.debug("Rendering note ",a,f);const w=a.id,m={id:w,text:a.text,width:0,height:0},b=i.append("g").attr("id",w).attr("class","classGroup");let E=b.append("text").attr("y",f.textHeight+f.padding).attr("x",0);const _=JSON.parse(`"${a.text}"`).split(` +`);_.forEach(function(N){Ut.debug(`Adding line: ${N}`),E.append("tspan").text(N).attr("class","title").attr("dy",f.textHeight)});const A=b.node().getBBox(),B=b.insert("rect",":first-child").attr("x",0).attr("y",0).attr("width",A.width+2*f.padding).attr("height",A.height+_.length*f.textHeight+f.padding+.5*f.dividerMargin).node().getBBox().width;return E.node().childNodes.forEach(function(N){N.setAttribute("x",(B-N.getBBox().width)/2)}),m.width=B,m.height=A.height+_.length*f.textHeight+f.padding+.5*f.dividerMargin,m},ZRt=function(i,a,f,p){const{displayText:w,cssStyle:m}=a.getDisplayDetails(),b=i.append("tspan").attr("x",p.padding).text(w);m!==""&&b.attr("style",a.cssStyle),f||b.attr("dy",p.textHeight)},Agt={getClassTitleString:QRt,drawClass:CGe,drawEdge:TGe,drawNote:_Ge};let VY={};const GY=20,YF=function(i){const a=Object.entries(VY).find(f=>f[1].label===i);if(a)return a[0]},SGe=function(i){i.append("defs").append("marker").attr("id","extensionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),i.append("defs").append("marker").attr("id","extensionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z"),i.append("defs").append("marker").attr("id","compositionStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id","compositionEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id","aggregationStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id","aggregationEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id","dependencyStart").attr("class","extension").attr("refX",0).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),i.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},AGe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:zRt,db:HY,renderer:{draw:function(i,a,f,p){const w=Oe().class;VY={},Ut.info("Rendering diagram "+i);const m=Oe().securityLevel;let b;m==="sandbox"&&(b=yr("#i"+a));const E=yr(m==="sandbox"?b.nodes()[0].contentDocument.body:"body"),_=E.select(`[id='${a}']`);SGe(_);const A=new c1({multigraph:!0});A.setGraph({isMultiGraph:!0}),A.setDefaultEdgeLabel(function(){return{}});const I=p.db.getClasses(),B=Object.keys(I);for(const at of B){const bt=I[at],mt=Agt.drawClass(_,bt,w,p);VY[mt.id]=mt,A.setNode(mt.id,mt),Ut.info("Org height: "+mt.height)}p.db.getRelations().forEach(function(at){Ut.info("tjoho"+YF(at.id1)+YF(at.id2)+JSON.stringify(at)),A.setEdge(YF(at.id1),YF(at.id2),{relation:at},at.title||"DEFAULT")}),p.db.getNotes().forEach(function(at){Ut.debug(`Adding note: ${JSON.stringify(at)}`);const bt=Agt.drawNote(_,at,w,p);VY[bt.id]=bt,A.setNode(bt.id,bt),at.class&&at.class in I&&A.setEdge(at.id,YF(at.class),{relation:{id1:at.id,id2:at.class,relation:{type1:"none",type2:"none",lineType:10}}},"DEFAULT")}),aL(A),A.nodes().forEach(function(at){at!==void 0&&A.node(at)!==void 0&&(Ut.debug("Node "+at+": "+JSON.stringify(A.node(at))),E.select("#"+(p.db.lookUpDomId(at)||at)).attr("transform","translate("+(A.node(at).x-A.node(at).width/2)+","+(A.node(at).y-A.node(at).height/2)+" )"))}),A.edges().forEach(function(at){at!==void 0&&A.edge(at)!==void 0&&(Ut.debug("Edge "+at.v+" -> "+at.w+": "+JSON.stringify(A.edge(at))),Agt.drawEdge(_,A.edge(at),A.edge(at).relation,w,p))});const z=_.node().getBBox(),W=z.width+GY*2,et=z.height+GY*2;k0(_,et,W,w.useMaxWidth);const st=`${z.x-GY} ${z.y-GY} ${W} ${et}`;Ut.debug(`viewBox ${st}`),_.attr("viewBox",st)}},styles:KRt,init:i=>{i.class||(i.class={}),i.class.arrowMarkerAbsolute=i.arrowMarkerAbsolute,HY.clear()}}},Symbol.toStringTag,{value:"Module"})),Lgt=i=>Kr.sanitizeText(i,Oe());let Mgt={dividerMargin:10,padding:5,textHeight:10,curve:void 0};const LGe=function(i,a,f,p){const w=Object.keys(i);Ut.info("keys:",w),Ut.info(i),w.forEach(function(m){var A,I;const b=i[m],_={shape:"rect",id:b.id,domId:b.domId,labelText:Lgt(b.id),labelStyle:"",style:"fill: none; stroke: black",padding:((A=Oe().flowchart)==null?void 0:A.padding)??((I=Oe().class)==null?void 0:I.padding)};a.setNode(b.id,_),JRt(b.classes,a,f,p,b.id),Ut.info("setNode",_)})},JRt=function(i,a,f,p,w){const m=Object.keys(i);Ut.info("keys:",m),Ut.info(i),m.filter(b=>i[b].parent==w).forEach(function(b){var z,W;const E=i[b],_=E.cssClasses.join(" "),A={labelStyle:"",style:""},I=E.label??E.id,B=0,N="class_box",R={labelStyle:A.labelStyle,shape:N,labelText:Lgt(I),classData:E,rx:B,ry:B,class:_,style:A.style,id:E.id,domId:E.domId,tooltip:p.db.getTooltip(E.id,w)||"",haveCallback:E.haveCallback,link:E.link,width:E.type==="group"?500:void 0,type:E.type,padding:((z=Oe().flowchart)==null?void 0:z.padding)??((W=Oe().class)==null?void 0:W.padding)};a.setNode(E.id,R),w&&a.setParent(E.id,w),Ut.info("setNode",R)})},MGe=function(i,a,f,p){Ut.info(i),i.forEach(function(w,m){var W,et;const b=w,E="",_={labelStyle:"",style:""},A=b.text,I=0,B="note",N={labelStyle:_.labelStyle,shape:B,labelText:Lgt(A),noteData:b,rx:I,ry:I,class:E,style:_.style,id:b.id,domId:b.id,tooltip:"",type:"note",padding:((W=Oe().flowchart)==null?void 0:W.padding)??((et=Oe().class)==null?void 0:et.padding)};if(a.setNode(b.id,N),Ut.info("setNode",N),!b.class||!(b.class in p))return;const R=f+m,z={id:`edgeNote${R}`,classes:"relation",pattern:"dotted",arrowhead:"none",startLabelRight:"",endLabelLeft:"",arrowTypeStart:"none",arrowTypeEnd:"none",style:"fill:none",labelStyle:"",curve:ew(Mgt.curve,cg)};a.setEdge(b.id,b.class,z,R)})},DGe=function(i,a){const f=Oe().flowchart;let p=0;i.forEach(function(w){var b;p++;const m={classes:"relation",pattern:w.relation.lineType==1?"dashed":"solid",id:"id"+p,arrowhead:w.type==="arrow_open"?"none":"normal",startLabelRight:w.relationTitle1==="none"?"":w.relationTitle1,endLabelLeft:w.relationTitle2==="none"?"":w.relationTitle2,arrowTypeStart:tjt(w.relation.type1),arrowTypeEnd:tjt(w.relation.type2),style:"fill:none",labelStyle:"",curve:ew(f==null?void 0:f.curve,cg)};if(Ut.info(m,w),w.style!==void 0){const E=im(w.style);m.style=E.style,m.labelStyle=E.labelStyle}w.text=w.title,w.text===void 0?w.style!==void 0&&(m.arrowheadStyle="fill: #333"):(m.arrowheadStyle="fill: #333",m.labelpos="c",((b=Oe().flowchart)==null?void 0:b.htmlLabels)??Oe().htmlLabels?(m.labelType="html",m.label=''+w.text+""):(m.labelType="text",m.label=w.text.replace(Kr.lineBreakRegex,` +`),w.style===void 0&&(m.style=m.style||"stroke: #333; stroke-width: 1.5px;fill:none"),m.labelStyle=m.labelStyle.replace("color:","fill:"))),a.setEdge(w.id1,w.id2,m,p)})},IGe=function(i){Mgt={...Mgt,...i}},OGe=async function(i,a,f,p){Ut.info("Drawing class - ",a);const w=Oe().flowchart??Oe().class,m=Oe().securityLevel;Ut.info("config:",w);const b=(w==null?void 0:w.nodeSpacing)??50,E=(w==null?void 0:w.rankSpacing)??50,_=new c1({multigraph:!0,compound:!0}).setGraph({rankdir:p.db.getDirection(),nodesep:b,ranksep:E,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),A=p.db.getNamespaces(),I=p.db.getClasses(),B=p.db.getRelations(),N=p.db.getNotes();Ut.info(B),LGe(A,_,a,p),JRt(I,_,a,p),DGe(B,_),MGe(N,_,B.length+1,I);let R;m==="sandbox"&&(R=yr("#i"+a));const z=yr(m==="sandbox"?R.nodes()[0].contentDocument.body:"body"),W=z.select(`[id="${a}"]`),et=z.select("#"+a+" g");if(await N0t(et,_,["aggregation","extension","composition","dependency","lollipop"],"classDiagram",a),$a.insertTitle(W,"classTitleText",(w==null?void 0:w.titleTopMargin)??5,p.db.getDiagramTitle()),fT(_,W,w==null?void 0:w.diagramPadding,w==null?void 0:w.useMaxWidth),!(w!=null&&w.htmlLabels)){const st=m==="sandbox"?R.nodes()[0].contentDocument:document,at=st.querySelectorAll('[id="'+a+'"] .edgeLabel .label');for(const bt of at){const mt=bt.getBBox(),yt=st.createElementNS("http://www.w3.org/2000/svg","rect");yt.setAttribute("rx",0),yt.setAttribute("ry",0),yt.setAttribute("width",mt.width),yt.setAttribute("height",mt.height),bt.insertBefore(yt,bt.firstChild)}}};function tjt(i){let a;switch(i){case 0:a="aggregation";break;case 1:a="extension";break;case 2:a="composition";break;case 3:a="dependency";break;case 4:a="lollipop";break;default:a="none"}return a}const PGe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:zRt,db:HY,renderer:{setConf:IGe,draw:OGe},styles:KRt,init:i=>{i.class||(i.class={}),i.class.arrowMarkerAbsolute=i.arrowMarkerAbsolute,HY.clear()}}},Symbol.toStringTag,{value:"Module"}));var Dgt=function(){var i=function(Et,Z,Ct,xt){for(Ct=Ct||{},xt=Et.length;xt--;Ct[Et[xt]]=Z);return Ct},a=[1,2],f=[1,3],p=[1,4],w=[2,4],m=[1,9],b=[1,11],E=[1,15],_=[1,16],A=[1,17],I=[1,18],B=[1,30],N=[1,19],R=[1,20],z=[1,21],W=[1,22],et=[1,23],st=[1,25],at=[1,26],bt=[1,27],mt=[1,28],yt=[1,29],ft=[1,32],ut=[1,33],vt=[1,34],X=[1,35],pt=[1,31],U=[1,4,5,15,16,18,20,21,23,24,25,26,27,28,32,34,36,37,41,44,45,46,47,50],Tt=[1,4,5,13,14,15,16,18,20,21,23,24,25,26,27,28,32,34,36,37,41,44,45,46,47,50],nt=[4,5,15,16,18,20,21,23,24,25,26,27,28,32,34,36,37,41,44,45,46,47,50],It={trace:function(){},yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,cssClassStatement:11,idStatement:12,DESCR:13,"-->":14,HIDE_EMPTY:15,scale:16,WIDTH:17,COMPOSIT_STATE:18,STRUCT_START:19,STRUCT_STOP:20,STATE_DESCR:21,AS:22,ID:23,FORK:24,JOIN:25,CHOICE:26,CONCURRENT:27,note:28,notePosition:29,NOTE_TEXT:30,direction:31,acc_title:32,acc_title_value:33,acc_descr:34,acc_descr_value:35,acc_descr_multiline_value:36,classDef:37,CLASSDEF_ID:38,CLASSDEF_STYLEOPTS:39,DEFAULT:40,class:41,CLASSENTITY_IDS:42,STYLECLASS:43,direction_tb:44,direction_bt:45,direction_rl:46,direction_lr:47,eol:48,";":49,EDGE_STATE:50,STYLE_SEPARATOR:51,left_of:52,right_of:53,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",13:"DESCR",14:"-->",15:"HIDE_EMPTY",16:"scale",17:"WIDTH",18:"COMPOSIT_STATE",19:"STRUCT_START",20:"STRUCT_STOP",21:"STATE_DESCR",22:"AS",23:"ID",24:"FORK",25:"JOIN",26:"CHOICE",27:"CONCURRENT",28:"note",30:"NOTE_TEXT",32:"acc_title",33:"acc_title_value",34:"acc_descr",35:"acc_descr_value",36:"acc_descr_multiline_value",37:"classDef",38:"CLASSDEF_ID",39:"CLASSDEF_STYLEOPTS",40:"DEFAULT",41:"class",42:"CLASSENTITY_IDS",43:"STYLECLASS",44:"direction_tb",45:"direction_bt",46:"direction_rl",47:"direction_lr",49:";",50:"EDGE_STATE",51:"STYLE_SEPARATOR",52:"left_of",53:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[10,3],[10,3],[11,3],[31,1],[31,1],[31,1],[31,1],[48,1],[48,1],[12,1],[12,1],[12,3],[12,3],[29,1],[29,1]],performAction:function(Z,Ct,xt,Ht,Le,Ft,gn){var Se=Ft.length-1;switch(Le){case 3:return Ht.setRootDoc(Ft[Se]),Ft[Se];case 4:this.$=[];break;case 5:Ft[Se]!="nl"&&(Ft[Se-1].push(Ft[Se]),this.$=Ft[Se-1]);break;case 6:case 7:this.$=Ft[Se];break;case 8:this.$="nl";break;case 11:this.$=Ft[Se];break;case 12:const ce=Ft[Se-1];ce.description=Ht.trimColon(Ft[Se]),this.$=ce;break;case 13:this.$={stmt:"relation",state1:Ft[Se-2],state2:Ft[Se]};break;case 14:const ke=Ht.trimColon(Ft[Se]);this.$={stmt:"relation",state1:Ft[Se-3],state2:Ft[Se-1],description:ke};break;case 18:this.$={stmt:"state",id:Ft[Se-3],type:"default",description:"",doc:Ft[Se-1]};break;case 19:var me=Ft[Se],Ve=Ft[Se-2].trim();if(Ft[Se].match(":")){var Ye=Ft[Se].split(":");me=Ye[0],Ve=[Ve,Ye[1]]}this.$={stmt:"state",id:me,type:"default",description:Ve};break;case 20:this.$={stmt:"state",id:Ft[Se-3],type:"default",description:Ft[Se-5],doc:Ft[Se-1]};break;case 21:this.$={stmt:"state",id:Ft[Se],type:"fork"};break;case 22:this.$={stmt:"state",id:Ft[Se],type:"join"};break;case 23:this.$={stmt:"state",id:Ft[Se],type:"choice"};break;case 24:this.$={stmt:"state",id:Ht.getDividerId(),type:"divider"};break;case 25:this.$={stmt:"state",id:Ft[Se-1].trim(),note:{position:Ft[Se-2].trim(),text:Ft[Se].trim()}};break;case 28:this.$=Ft[Se].trim(),Ht.setAccTitle(this.$);break;case 29:case 30:this.$=Ft[Se].trim(),Ht.setAccDescription(this.$);break;case 31:case 32:this.$={stmt:"classDef",id:Ft[Se-1].trim(),classes:Ft[Se].trim()};break;case 33:this.$={stmt:"applyClass",id:Ft[Se-1].trim(),styleClass:Ft[Se].trim()};break;case 34:Ht.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 35:Ht.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 36:Ht.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 37:Ht.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 40:case 41:this.$={stmt:"state",id:Ft[Se].trim(),type:"default",description:""};break;case 42:this.$={stmt:"state",id:Ft[Se-2].trim(),classes:[Ft[Se].trim()],type:"default",description:""};break;case 43:this.$={stmt:"state",id:Ft[Se-2].trim(),classes:[Ft[Se].trim()],type:"default",description:""};break}},table:[{3:1,4:a,5:f,6:p},{1:[3]},{3:5,4:a,5:f,6:p},{3:6,4:a,5:f,6:p},i([1,4,5,15,16,18,21,23,24,25,26,27,28,32,34,36,37,41,44,45,46,47,50],w,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:m,5:b,8:8,9:10,10:12,11:13,12:14,15:E,16:_,18:A,21:I,23:B,24:N,25:R,26:z,27:W,28:et,31:24,32:st,34:at,36:bt,37:mt,41:yt,44:ft,45:ut,46:vt,47:X,50:pt},i(U,[2,5]),{9:36,10:12,11:13,12:14,15:E,16:_,18:A,21:I,23:B,24:N,25:R,26:z,27:W,28:et,31:24,32:st,34:at,36:bt,37:mt,41:yt,44:ft,45:ut,46:vt,47:X,50:pt},i(U,[2,7]),i(U,[2,8]),i(U,[2,9]),i(U,[2,10]),i(U,[2,11],{13:[1,37],14:[1,38]}),i(U,[2,15]),{17:[1,39]},i(U,[2,17],{19:[1,40]}),{22:[1,41]},i(U,[2,21]),i(U,[2,22]),i(U,[2,23]),i(U,[2,24]),{29:42,30:[1,43],52:[1,44],53:[1,45]},i(U,[2,27]),{33:[1,46]},{35:[1,47]},i(U,[2,30]),{38:[1,48],40:[1,49]},{42:[1,50]},i(Tt,[2,40],{51:[1,51]}),i(Tt,[2,41],{51:[1,52]}),i(U,[2,34]),i(U,[2,35]),i(U,[2,36]),i(U,[2,37]),i(U,[2,6]),i(U,[2,12]),{12:53,23:B,50:pt},i(U,[2,16]),i(nt,w,{7:54}),{23:[1,55]},{23:[1,56]},{22:[1,57]},{23:[2,44]},{23:[2,45]},i(U,[2,28]),i(U,[2,29]),{39:[1,58]},{39:[1,59]},{43:[1,60]},{23:[1,61]},{23:[1,62]},i(U,[2,13],{13:[1,63]}),{4:m,5:b,8:8,9:10,10:12,11:13,12:14,15:E,16:_,18:A,20:[1,64],21:I,23:B,24:N,25:R,26:z,27:W,28:et,31:24,32:st,34:at,36:bt,37:mt,41:yt,44:ft,45:ut,46:vt,47:X,50:pt},i(U,[2,19],{19:[1,65]}),{30:[1,66]},{23:[1,67]},i(U,[2,31]),i(U,[2,32]),i(U,[2,33]),i(Tt,[2,42]),i(Tt,[2,43]),i(U,[2,14]),i(U,[2,18]),i(nt,w,{7:68}),i(U,[2,25]),i(U,[2,26]),{4:m,5:b,8:8,9:10,10:12,11:13,12:14,15:E,16:_,18:A,20:[1,69],21:I,23:B,24:N,25:R,26:z,27:W,28:et,31:24,32:st,34:at,36:bt,37:mt,41:yt,44:ft,45:ut,46:vt,47:X,50:pt},i(U,[2,20])],defaultActions:{5:[2,1],6:[2,2],44:[2,44],45:[2,45]},parseError:function(Z,Ct){if(Ct.recoverable)this.trace(Z);else{var xt=new Error(Z);throw xt.hash=Ct,xt}},parse:function(Z){var Ct=this,xt=[0],Ht=[],Le=[null],Ft=[],gn=this.table,Se="",me=0,Ve=0,Ye=2,ce=1,ke=Ft.slice.call(arguments,1),zt=Object.create(this.lexer),re={yy:{}};for(var se in this.yy)Object.prototype.hasOwnProperty.call(this.yy,se)&&(re.yy[se]=this.yy[se]);zt.setInput(Z,re.yy),re.yy.lexer=zt,re.yy.parser=this,typeof zt.yylloc>"u"&&(zt.yylloc={});var Pe=zt.yylloc;Ft.push(Pe);var te=zt.options&&zt.options.ranges;typeof re.yy.parseError=="function"?this.parseError=re.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Me(){var Ee;return Ee=Ht.pop()||zt.lex()||ce,typeof Ee!="number"&&(Ee instanceof Array&&(Ht=Ee,Ee=Ht.pop()),Ee=Ct.symbols_[Ee]||Ee),Ee}for(var de,on,ni,Ks,ws={},fo,Xi,Er,Xn;;){if(on=xt[xt.length-1],this.defaultActions[on]?ni=this.defaultActions[on]:((de===null||typeof de>"u")&&(de=Me()),ni=gn[on]&&gn[on][de]),typeof ni>"u"||!ni.length||!ni[0]){var di="";Xn=[];for(fo in gn[on])this.terminals_[fo]&&fo>Ye&&Xn.push("'"+this.terminals_[fo]+"'");zt.showPosition?di="Parse error on line "+(me+1)+`: +`+zt.showPosition()+` +Expecting `+Xn.join(", ")+", got '"+(this.terminals_[de]||de)+"'":di="Parse error on line "+(me+1)+": Unexpected "+(de==ce?"end of input":"'"+(this.terminals_[de]||de)+"'"),this.parseError(di,{text:zt.match,token:this.terminals_[de]||de,line:zt.yylineno,loc:Pe,expected:Xn})}if(ni[0]instanceof Array&&ni.length>1)throw new Error("Parse Error: multiple actions possible at state: "+on+", token: "+de);switch(ni[0]){case 1:xt.push(de),Le.push(zt.yytext),Ft.push(zt.yylloc),xt.push(ni[1]),de=null,Ve=zt.yyleng,Se=zt.yytext,me=zt.yylineno,Pe=zt.yylloc;break;case 2:if(Xi=this.productions_[ni[1]][1],ws.$=Le[Le.length-Xi],ws._$={first_line:Ft[Ft.length-(Xi||1)].first_line,last_line:Ft[Ft.length-1].last_line,first_column:Ft[Ft.length-(Xi||1)].first_column,last_column:Ft[Ft.length-1].last_column},te&&(ws._$.range=[Ft[Ft.length-(Xi||1)].range[0],Ft[Ft.length-1].range[1]]),Ks=this.performAction.apply(ws,[Se,Ve,me,re.yy,ni[1],Le,Ft].concat(ke)),typeof Ks<"u")return Ks;Xi&&(xt=xt.slice(0,-1*Xi*2),Le=Le.slice(0,-1*Xi),Ft=Ft.slice(0,-1*Xi)),xt.push(this.productions_[ni[1]][0]),Le.push(ws.$),Ft.push(ws._$),Er=gn[xt[xt.length-2]][xt[xt.length-1]],xt.push(Er);break;case 3:return!0}}return!0}},Ot=function(){var Et={EOF:1,parseError:function(Ct,xt){if(this.yy.parser)this.yy.parser.parseError(Ct,xt);else throw new Error(Ct)},setInput:function(Z,Ct){return this.yy=Ct||this.yy||{},this._input=Z,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var Z=this._input[0];this.yytext+=Z,this.yyleng++,this.offset++,this.match+=Z,this.matched+=Z;var Ct=Z.match(/(?:\r\n?|\n).*/g);return Ct?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Z},unput:function(Z){var Ct=Z.length,xt=Z.split(/(?:\r\n?|\n)/g);this._input=Z+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ct),this.offset-=Ct;var Ht=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),xt.length-1&&(this.yylineno-=xt.length-1);var Le=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:xt?(xt.length===Ht.length?this.yylloc.first_column:0)+Ht[Ht.length-xt.length].length-xt[0].length:this.yylloc.first_column-Ct},this.options.ranges&&(this.yylloc.range=[Le[0],Le[0]+this.yyleng-Ct]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(Z){this.unput(this.match.slice(Z))},pastInput:function(){var Z=this.matched.substr(0,this.matched.length-this.match.length);return(Z.length>20?"...":"")+Z.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var Z=this.match;return Z.length<20&&(Z+=this._input.substr(0,20-Z.length)),(Z.substr(0,20)+(Z.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var Z=this.pastInput(),Ct=new Array(Z.length+1).join("-");return Z+this.upcomingInput()+` +`+Ct+"^"},test_match:function(Z,Ct){var xt,Ht,Le;if(this.options.backtrack_lexer&&(Le={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Le.yylloc.range=this.yylloc.range.slice(0))),Ht=Z[0].match(/(?:\r\n?|\n).*/g),Ht&&(this.yylineno+=Ht.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Ht?Ht[Ht.length-1].length-Ht[Ht.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Z[0].length},this.yytext+=Z[0],this.match+=Z[0],this.matches=Z,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Z[0].length),this.matched+=Z[0],xt=this.performAction.call(this,this.yy,this,Ct,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),xt)return xt;if(this._backtrack){for(var Ft in Le)this[Ft]=Le[Ft];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Z,Ct,xt,Ht;this._more||(this.yytext="",this.match="");for(var Le=this._currentRules(),Ft=0;FtCt[0].length)){if(Ct=xt,Ht=Ft,this.options.backtrack_lexer){if(Z=this.test_match(xt,Le[Ft]),Z!==!1)return Z;if(this._backtrack){Ct=!1;continue}else return!1}else if(!this.options.flex)break}return Ct?(Z=this.test_match(Ct,Le[Ht]),Z!==!1?Z:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var Ct=this.next();return Ct||this.lex()},begin:function(Ct){this.conditionStack.push(Ct)},popState:function(){var Ct=this.conditionStack.length-1;return Ct>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(Ct){return Ct=this.conditionStack.length-1-Math.abs(Ct||0),Ct>=0?this.conditionStack[Ct]:"INITIAL"},pushState:function(Ct){this.begin(Ct)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(Ct,xt,Ht,Le){switch(Ht){case 0:return 40;case 1:return 44;case 2:return 45;case 3:return 46;case 4:return 47;case 5:break;case 6:break;case 7:return 5;case 8:break;case 9:break;case 10:break;case 11:break;case 12:return this.pushState("SCALE"),16;case 13:return 17;case 14:this.popState();break;case 15:return this.begin("acc_title"),32;case 16:return this.popState(),"acc_title_value";case 17:return this.begin("acc_descr"),34;case 18:return this.popState(),"acc_descr_value";case 19:this.begin("acc_descr_multiline");break;case 20:this.popState();break;case 21:return"acc_descr_multiline_value";case 22:return this.pushState("CLASSDEF"),37;case 23:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";case 24:return this.popState(),this.pushState("CLASSDEFID"),38;case 25:return this.popState(),39;case 26:return this.pushState("CLASS"),41;case 27:return this.popState(),this.pushState("CLASS_STYLE"),42;case 28:return this.popState(),43;case 29:return this.pushState("SCALE"),16;case 30:return 17;case 31:this.popState();break;case 32:this.pushState("STATE");break;case 33:return this.popState(),xt.yytext=xt.yytext.slice(0,-8).trim(),24;case 34:return this.popState(),xt.yytext=xt.yytext.slice(0,-8).trim(),25;case 35:return this.popState(),xt.yytext=xt.yytext.slice(0,-10).trim(),26;case 36:return this.popState(),xt.yytext=xt.yytext.slice(0,-8).trim(),24;case 37:return this.popState(),xt.yytext=xt.yytext.slice(0,-8).trim(),25;case 38:return this.popState(),xt.yytext=xt.yytext.slice(0,-10).trim(),26;case 39:return 44;case 40:return 45;case 41:return 46;case 42:return 47;case 43:this.pushState("STATE_STRING");break;case 44:return this.pushState("STATE_ID"),"AS";case 45:return this.popState(),"ID";case 46:this.popState();break;case 47:return"STATE_DESCR";case 48:return 18;case 49:this.popState();break;case 50:return this.popState(),this.pushState("struct"),19;case 51:break;case 52:return this.popState(),20;case 53:break;case 54:return this.begin("NOTE"),28;case 55:return this.popState(),this.pushState("NOTE_ID"),52;case 56:return this.popState(),this.pushState("NOTE_ID"),53;case 57:this.popState(),this.pushState("FLOATING_NOTE");break;case 58:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";case 59:break;case 60:return"NOTE_TEXT";case 61:return this.popState(),"ID";case 62:return this.popState(),this.pushState("NOTE_TEXT"),23;case 63:return this.popState(),xt.yytext=xt.yytext.substr(2).trim(),30;case 64:return this.popState(),xt.yytext=xt.yytext.slice(0,-8).trim(),30;case 65:return 6;case 66:return 6;case 67:return 15;case 68:return 50;case 69:return 23;case 70:return xt.yytext=xt.yytext.trim(),13;case 71:return 14;case 72:return 27;case 73:return 51;case 74:return 5;case 75:return"INVALID"}},rules:[/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[9,10],inclusive:!1},struct:{rules:[9,10,22,26,32,39,40,41,42,51,52,53,54,68,69,70,71,72],inclusive:!1},FLOATING_NOTE_ID:{rules:[61],inclusive:!1},FLOATING_NOTE:{rules:[58,59,60],inclusive:!1},NOTE_TEXT:{rules:[63,64],inclusive:!1},NOTE_ID:{rules:[62],inclusive:!1},NOTE:{rules:[55,56,57],inclusive:!1},CLASS_STYLE:{rules:[28],inclusive:!1},CLASS:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[25],inclusive:!1},CLASSDEF:{rules:[23,24],inclusive:!1},acc_descr_multiline:{rules:[20,21],inclusive:!1},acc_descr:{rules:[18],inclusive:!1},acc_title:{rules:[16],inclusive:!1},SCALE:{rules:[13,14,30,31],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[45],inclusive:!1},STATE_STRING:{rules:[46,47],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[9,10,33,34,35,36,37,38,43,44,48,49,50],inclusive:!1},ID:{rules:[9,10],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,10,11,12,15,17,19,22,26,29,32,50,54,65,66,67,68,69,70,71,73,74,75],inclusive:!0}}};return Et}();It.lexer=Ot;function Bt(){this.yy={}}return Bt.prototype=It,It.Parser=Bt,new Bt}();Dgt.parser=Dgt;const ejt=Dgt,FGe="LR",NGe="TB",UY="state",Igt="relation",BGe="classDef",RGe="applyClass",KF="default",njt="divider",Ogt="[*]",rjt="start",ijt=Ogt,sjt="end",ajt="color",ojt="fill",jGe="bgFill",$Ge=",";function cjt(){return{}}let ujt=FGe,WY=[],XF=cjt();const ljt=()=>({relations:[],states:{},documents:{}});let YY={root:ljt()},S0=YY.root,QF=0,hjt=0;const zGe={LINE:0,DOTTED_LINE:1},qGe={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3},KY=i=>JSON.parse(JSON.stringify(i)),HGe=i=>{Ut.info("Setting root doc",i),WY=i},VGe=()=>WY,XY=(i,a,f)=>{if(a.stmt===Igt)XY(i,a.state1,!0),XY(i,a.state2,!1);else if(a.stmt===UY&&(a.id==="[*]"?(a.id=f?i.id+"_start":i.id+"_end",a.start=f):a.id=a.id.trim()),a.doc){const p=[];let w=[],m;for(m=0;m0&&w.length>0){const b={stmt:UY,id:VIt(),type:"divider",doc:KY(w)};p.push(KY(b)),a.doc=p}a.doc.forEach(b=>XY(a,b,!0))}},GGe=()=>(XY({id:"root"},{id:"root",doc:WY},!0),{id:"root",doc:WY}),UGe=i=>{let a;i.doc?a=i.doc:a=i,Ut.info(a),fjt(!0),Ut.info("Extract",a),a.forEach(f=>{switch(f.stmt){case UY:LT(f.id.trim(),f.type,f.doc,f.description,f.note,f.classes,f.styles,f.textStyles);break;case Igt:djt(f.state1,f.state2,f.description);break;case BGe:gjt(f.id.trim(),f.classes);break;case RGe:Bgt(f.id.trim(),f.styleClass);break}})},LT=function(i,a=KF,f=null,p=null,w=null,m=null,b=null,E=null){const _=i==null?void 0:i.trim();S0.states[_]===void 0?(Ut.info("Adding state ",_,p),S0.states[_]={id:_,descriptions:[],type:a,doc:f,note:w,classes:[],styles:[],textStyles:[]}):(S0.states[_].doc||(S0.states[_].doc=f),S0.states[_].type||(S0.states[_].type=a)),p&&(Ut.info("Setting state description",_,p),typeof p=="string"&&Ngt(_,p.trim()),typeof p=="object"&&p.forEach(A=>Ngt(_,A.trim()))),w&&(S0.states[_].note=w,S0.states[_].note.text=Kr.sanitizeText(S0.states[_].note.text,Oe())),m&&(Ut.info("Setting state classes",_,m),(typeof m=="string"?[m]:m).forEach(I=>Bgt(_,I.trim()))),b&&(Ut.info("Setting state styles",_,b),(typeof b=="string"?[b]:b).forEach(I=>nUe(_,I.trim()))),E&&(Ut.info("Setting state styles",_,b),(typeof E=="string"?[E]:E).forEach(I=>rUe(_,I.trim())))},fjt=function(i){YY={root:ljt()},S0=YY.root,QF=0,XF=cjt(),i||hg()},ZF=function(i){return S0.states[i]},WGe=function(){return S0.states},YGe=function(){Ut.info("Documents = ",YY)},KGe=function(){return S0.relations};function Pgt(i=""){let a=i;return i===Ogt&&(QF++,a=`${rjt}${QF}`),a}function Fgt(i="",a=KF){return i===Ogt?rjt:a}function XGe(i=""){let a=i;return i===ijt&&(QF++,a=`${sjt}${QF}`),a}function QGe(i="",a=KF){return i===ijt?sjt:a}function ZGe(i,a,f){let p=Pgt(i.id.trim()),w=Fgt(i.id.trim(),i.type),m=Pgt(a.id.trim()),b=Fgt(a.id.trim(),a.type);LT(p,w,i.doc,i.description,i.note,i.classes,i.styles,i.textStyles),LT(m,b,a.doc,a.description,a.note,a.classes,a.styles,a.textStyles),S0.relations.push({id1:p,id2:m,relationTitle:Kr.sanitizeText(f,Oe())})}const djt=function(i,a,f){if(typeof i=="object")ZGe(i,a,f);else{const p=Pgt(i.trim()),w=Fgt(i),m=XGe(a.trim()),b=QGe(a);LT(p,w),LT(m,b),S0.relations.push({id1:p,id2:m,title:Kr.sanitizeText(f,Oe())})}},Ngt=function(i,a){const f=S0.states[i],p=a.startsWith(":")?a.replace(":","").trim():a;f.descriptions.push(Kr.sanitizeText(p,Oe()))},JGe=function(i){return i.substring(0,1)===":"?i.substr(2).trim():i.trim()},tUe=()=>(hjt++,"divider-id-"+hjt),gjt=function(i,a=""){XF[i]===void 0&&(XF[i]={id:i,styles:[],textStyles:[]});const f=XF[i];a!=null&&a.split($Ge).forEach(p=>{const w=p.replace(/([^;]*);/,"$1").trim();if(p.match(ajt)){const b=w.replace(ojt,jGe).replace(ajt,ojt);f.textStyles.push(b)}f.styles.push(w)})},eUe=function(){return XF},Bgt=function(i,a){i.split(",").forEach(function(f){let p=ZF(f);if(p===void 0){const w=f.trim();LT(w),p=ZF(w)}p.classes.push(a)})},nUe=function(i,a){const f=ZF(i);f!==void 0&&f.textStyles.push(a)},rUe=function(i,a){const f=ZF(i);f!==void 0&&f.textStyles.push(a)},$5={getConfig:()=>Oe().state,addState:LT,clear:fjt,getState:ZF,getStates:WGe,getRelations:KGe,getClasses:eUe,getDirection:()=>ujt,addRelation:djt,getDividerId:tUe,setDirection:i=>{ujt=i},cleanupLabel:JGe,lineType:zGe,relationType:qGe,logDocuments:YGe,getRootDoc:VGe,setRootDoc:HGe,getRootDocV2:GGe,extract:UGe,trimColon:i=>i&&i[0]===":"?i.substr(1).trim():i.trim(),getAccTitle:fg,setAccTitle:E0,getAccDescription:gg,setAccDescription:dg,addStyleClass:gjt,setCssClass:Bgt,addDescription:Ngt,setDiagramTitle:Nb,getDiagramTitle:pg},pjt=i=>` +defs #statediagram-barbEnd { + fill: ${i.transitionColor}; + stroke: ${i.transitionColor}; + } +g.stateGroup text { + fill: ${i.nodeBorder}; + stroke: none; + font-size: 10px; +} +g.stateGroup text { + fill: ${i.textColor}; + stroke: none; + font-size: 10px; + +} +g.stateGroup .state-title { + font-weight: bolder; + fill: ${i.stateLabelColor}; +} + +g.stateGroup rect { + fill: ${i.mainBkg}; + stroke: ${i.nodeBorder}; +} + +g.stateGroup line { + stroke: ${i.lineColor}; + stroke-width: 1; +} + +.transition { + stroke: ${i.transitionColor}; + stroke-width: 1; + fill: none; +} + +.stateGroup .composit { + fill: ${i.background}; + border-bottom: 1px +} + +.stateGroup .alt-composit { + fill: #e0e0e0; + border-bottom: 1px +} + +.state-note { + stroke: ${i.noteBorderColor}; + fill: ${i.noteBkgColor}; + + text { + fill: ${i.noteTextColor}; + stroke: none; + font-size: 10px; + } +} + +.stateLabel .box { + stroke: none; + stroke-width: 0; + fill: ${i.mainBkg}; + opacity: 0.5; +} + +.edgeLabel .label rect { + fill: ${i.labelBackgroundColor}; + opacity: 0.5; +} +.edgeLabel .label text { + fill: ${i.transitionLabelColor||i.tertiaryTextColor}; +} +.label div .edgeLabel { + color: ${i.transitionLabelColor||i.tertiaryTextColor}; +} + +.stateLabel text { + fill: ${i.stateLabelColor}; + font-size: 10px; + font-weight: bold; +} + +.node circle.state-start { + fill: ${i.specialStateColor}; + stroke: ${i.specialStateColor}; +} + +.node .fork-join { + fill: ${i.specialStateColor}; + stroke: ${i.specialStateColor}; +} + +.node circle.state-end { + fill: ${i.innerEndBackground}; + stroke: ${i.background}; + stroke-width: 1.5 +} +.end-state-inner { + fill: ${i.compositeBackground||i.background}; + // stroke: ${i.background}; + stroke-width: 1.5 +} + +.node rect { + fill: ${i.stateBkg||i.mainBkg}; + stroke: ${i.stateBorder||i.nodeBorder}; + stroke-width: 1px; +} +.node polygon { + fill: ${i.mainBkg}; + stroke: ${i.stateBorder||i.nodeBorder};; + stroke-width: 1px; +} +#statediagram-barbEnd { + fill: ${i.lineColor}; +} + +.statediagram-cluster rect { + fill: ${i.compositeTitleBackground}; + stroke: ${i.stateBorder||i.nodeBorder}; + stroke-width: 1px; +} + +.cluster-label, .nodeLabel { + color: ${i.stateLabelColor}; +} + +.statediagram-cluster rect.outer { + rx: 5px; + ry: 5px; +} +.statediagram-state .divider { + stroke: ${i.stateBorder||i.nodeBorder}; +} + +.statediagram-state .title-state { + rx: 5px; + ry: 5px; +} +.statediagram-cluster.statediagram-cluster .inner { + fill: ${i.compositeBackground||i.background}; +} +.statediagram-cluster.statediagram-cluster-alt .inner { + fill: ${i.altBackground?i.altBackground:"#efefef"}; +} + +.statediagram-cluster .inner { + rx:0; + ry:0; +} + +.statediagram-state rect.basic { + rx: 5px; + ry: 5px; +} +.statediagram-state rect.divider { + stroke-dasharray: 10,10; + fill: ${i.altBackground?i.altBackground:"#efefef"}; +} + +.note-edge { + stroke-dasharray: 5; +} + +.statediagram-note rect { + fill: ${i.noteBkgColor}; + stroke: ${i.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} +.statediagram-note rect { + fill: ${i.noteBkgColor}; + stroke: ${i.noteBorderColor}; + stroke-width: 1px; + rx: 0; + ry: 0; +} + +.statediagram-note text { + fill: ${i.noteTextColor}; +} + +.statediagram-note .nodeLabel { + color: ${i.noteTextColor}; +} +.statediagram .edgeLabel { + color: red; // ${i.noteTextColor}; +} + +#dependencyStart, #dependencyEnd { + fill: ${i.lineColor}; + stroke: ${i.lineColor}; + stroke-width: 1; +} + +.statediagramTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${i.textColor}; +} +`,Rgt={},iUe=(i,a)=>{Rgt[i]=a},sUe=i=>Rgt[i],bjt=()=>Object.keys(Rgt),aUe={get:sUe,set:iUe,keys:bjt,size:()=>bjt().length},oUe=i=>i.append("circle").attr("class","start-state").attr("r",Oe().state.sizeUnit).attr("cx",Oe().state.padding+Oe().state.sizeUnit).attr("cy",Oe().state.padding+Oe().state.sizeUnit),cUe=i=>i.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",Oe().state.textHeight).attr("class","divider").attr("x2",Oe().state.textHeight*2).attr("y1",0).attr("y2",0),uUe=(i,a)=>{const f=i.append("text").attr("x",2*Oe().state.padding).attr("y",Oe().state.textHeight+2*Oe().state.padding).attr("font-size",Oe().state.fontSize).attr("class","state-title").text(a.id),p=f.node().getBBox();return i.insert("rect",":first-child").attr("x",Oe().state.padding).attr("y",Oe().state.padding).attr("width",p.width+2*Oe().state.padding).attr("height",p.height+2*Oe().state.padding).attr("rx",Oe().state.radius),f},lUe=(i,a)=>{const f=function(N,R,z){const W=N.append("tspan").attr("x",2*Oe().state.padding).text(R);z||W.attr("dy",Oe().state.textHeight)},w=i.append("text").attr("x",2*Oe().state.padding).attr("y",Oe().state.textHeight+1.3*Oe().state.padding).attr("font-size",Oe().state.fontSize).attr("class","state-title").text(a.descriptions[0]).node().getBBox(),m=w.height,b=i.append("text").attr("x",Oe().state.padding).attr("y",m+Oe().state.padding*.4+Oe().state.dividerMargin+Oe().state.textHeight).attr("class","state-description");let E=!0,_=!0;a.descriptions.forEach(function(N){E||(f(b,N,_),_=!1),E=!1});const A=i.append("line").attr("x1",Oe().state.padding).attr("y1",Oe().state.padding+m+Oe().state.dividerMargin/2).attr("y2",Oe().state.padding+m+Oe().state.dividerMargin/2).attr("class","descr-divider"),I=b.node().getBBox(),B=Math.max(I.width,w.width);return A.attr("x2",B+3*Oe().state.padding),i.insert("rect",":first-child").attr("x",Oe().state.padding).attr("y",Oe().state.padding).attr("width",B+2*Oe().state.padding).attr("height",I.height+m+2*Oe().state.padding).attr("rx",Oe().state.radius),i},hUe=(i,a,f)=>{const p=Oe().state.padding,w=2*Oe().state.padding,m=i.node().getBBox(),b=m.width,E=m.x,_=i.append("text").attr("x",0).attr("y",Oe().state.titleShift).attr("font-size",Oe().state.fontSize).attr("class","state-title").text(a.id),I=_.node().getBBox().width+w;let B=Math.max(I,b);B===b&&(B=B+w);let N;const R=i.node().getBBox();a.doc,N=E-p,I>b&&(N=(b-B)/2+p),Math.abs(E-R.x)b&&(N=E-(I-b)/2);const z=1-Oe().state.textHeight;return i.insert("rect",":first-child").attr("x",N).attr("y",z).attr("class",f?"alt-composit":"composit").attr("width",B).attr("height",R.height+Oe().state.textHeight+Oe().state.titleShift+1).attr("rx","0"),_.attr("x",N+p),I<=b&&_.attr("x",E+(B-w)/2-I/2+p),i.insert("rect",":first-child").attr("x",N).attr("y",Oe().state.titleShift-Oe().state.textHeight-Oe().state.padding).attr("width",B).attr("height",Oe().state.textHeight*3).attr("rx",Oe().state.radius),i.insert("rect",":first-child").attr("x",N).attr("y",Oe().state.titleShift-Oe().state.textHeight-Oe().state.padding).attr("width",B).attr("height",R.height+3+2*Oe().state.textHeight).attr("rx",Oe().state.radius),i},fUe=i=>(i.append("circle").attr("class","end-state-outer").attr("r",Oe().state.sizeUnit+Oe().state.miniPadding).attr("cx",Oe().state.padding+Oe().state.sizeUnit+Oe().state.miniPadding).attr("cy",Oe().state.padding+Oe().state.sizeUnit+Oe().state.miniPadding),i.append("circle").attr("class","end-state-inner").attr("r",Oe().state.sizeUnit).attr("cx",Oe().state.padding+Oe().state.sizeUnit+2).attr("cy",Oe().state.padding+Oe().state.sizeUnit+2)),dUe=(i,a)=>{let f=Oe().state.forkWidth,p=Oe().state.forkHeight;if(a.parentId){let w=f;f=p,p=w}return i.append("rect").style("stroke","black").style("fill","black").attr("width",f).attr("height",p).attr("x",Oe().state.padding).attr("y",Oe().state.padding)},gUe=(i,a,f,p)=>{let w=0;const m=p.append("text");m.style("text-anchor","start"),m.attr("class","noteText");let b=i.replace(/\r\n/g,"
");b=b.replace(/\n/g,"
");const E=b.split(Kr.lineBreakRegex);let _=1.25*Oe().state.noteMargin;for(const A of E){const I=A.trim();if(I.length>0){const B=m.append("tspan");if(B.text(I),_===0){const N=B.node().getBBox();_+=N.height}w+=_,B.attr("x",a+Oe().state.noteMargin),B.attr("y",f+w+1.25*Oe().state.noteMargin)}}return{textWidth:m.node().getBBox().width,textHeight:w}},pUe=(i,a)=>{a.attr("class","state-note");const f=a.append("rect").attr("x",0).attr("y",Oe().state.padding),p=a.append("g"),{textWidth:w,textHeight:m}=gUe(i,0,0,p);return f.attr("height",m+2*Oe().state.noteMargin),f.attr("width",w+Oe().state.noteMargin*2),f},wjt=function(i,a){const f=a.id,p={id:f,label:a.id,width:0,height:0},w=i.append("g").attr("id",f).attr("class","stateGroup");a.type==="start"&&oUe(w),a.type==="end"&&fUe(w),(a.type==="fork"||a.type==="join")&&dUe(w,a),a.type==="note"&&pUe(a.note.text,w),a.type==="divider"&&cUe(w),a.type==="default"&&a.descriptions.length===0&&uUe(w,a),a.type==="default"&&a.descriptions.length>0&&lUe(w,a);const m=w.node().getBBox();return p.width=m.width+2*Oe().state.padding,p.height=m.height+2*Oe().state.padding,aUe.set(f,p),p};let vjt=0;const bUe=function(i,a,f){const p=function(_){switch(_){case $5.relationType.AGGREGATION:return"aggregation";case $5.relationType.EXTENSION:return"extension";case $5.relationType.COMPOSITION:return"composition";case $5.relationType.DEPENDENCY:return"dependency"}};a.points=a.points.filter(_=>!Number.isNaN(_.y));const w=a.points,m=E5().x(function(_){return _.x}).y(function(_){return _.y}).curve(HP),b=i.append("path").attr("d",m(w)).attr("id","edge"+vjt).attr("class","transition");let E="";if(Oe().state.arrowMarkerAbsolute&&(E=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,E=E.replace(/\(/g,"\\("),E=E.replace(/\)/g,"\\)")),b.attr("marker-end","url("+E+"#"+p($5.relationType.DEPENDENCY)+"End)"),f.title!==void 0){const _=i.append("g").attr("class","stateLabel"),{x:A,y:I}=$a.calcLabelPosition(a.points),B=Kr.getRows(f.title);let N=0;const R=[];let z=0,W=0;for(let at=0;at<=B.length;at++){const bt=_.append("text").attr("text-anchor","middle").text(B[at]).attr("x",A).attr("y",I+N),mt=bt.node().getBBox();z=Math.max(z,mt.width),W=Math.min(W,mt.x),Ut.info(mt.x,A,I+N),N===0&&(N=bt.node().getBBox().height,Ut.info("Title height",N,I)),R.push(bt)}let et=N*B.length;if(B.length>1){const at=(B.length-1)*N*.5;R.forEach((bt,mt)=>bt.attr("y",I+mt*N-at)),et=N*B.length}const st=_.node().getBBox();_.insert("rect",":first-child").attr("class","box").attr("x",A-z/2-Oe().state.padding/2).attr("y",I-et/2-Oe().state.padding/2-3.5).attr("width",z+Oe().state.padding).attr("height",et+Oe().state.padding),Ut.info(st)}vjt++};let qb;const jgt={},wUe=function(){},vUe=function(i){i.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},mUe=function(i,a,f,p){qb=Oe().state;const w=Oe().securityLevel;let m;w==="sandbox"&&(m=yr("#i"+a));const b=yr(w==="sandbox"?m.nodes()[0].contentDocument.body:"body"),E=w==="sandbox"?m.nodes()[0].contentDocument:document;Ut.debug("Rendering diagram "+i);const _=b.select(`[id='${a}']`);vUe(_);const A=p.db.getRootDoc();mjt(A,_,void 0,!1,b,E,p);const I=qb.padding,B=_.node().getBBox(),N=B.width+I*2,R=B.height+I*2,z=N*1.75;k0(_,R,z,qb.useMaxWidth),_.attr("viewBox",`${B.x-qb.padding} ${B.y-qb.padding} `+N+" "+R)},yUe=i=>i?i.length*qb.fontSizeFactor:1,mjt=(i,a,f,p,w,m,b)=>{const E=new c1({compound:!0,multigraph:!0});let _,A=!0;for(_=0;_{const mt=bt.parentElement;let yt=0,ft=0;mt&&(mt.parentElement&&(yt=mt.parentElement.getBBox().width),ft=parseInt(mt.getAttribute("data-x-shift"),10),Number.isNaN(ft)&&(ft=0)),bt.setAttribute("x1",0-ft+8),bt.setAttribute("x2",yt-ft-8)})):Ut.debug("No Node "+st+": "+JSON.stringify(E.node(st)))});let W=z.getBBox();E.edges().forEach(function(st){st!==void 0&&E.edge(st)!==void 0&&(Ut.debug("Edge "+st.v+" -> "+st.w+": "+JSON.stringify(E.edge(st))),bUe(a,E.edge(st),E.edge(st).relation))}),W=z.getBBox();const et={id:f||"root",label:f||"root",width:0,height:0};return et.width=W.width+2*qb.padding,et.height=W.height+2*qb.padding,Ut.debug("Doc rendered",et,E),et},xUe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:ejt,db:$5,renderer:{setConf:wUe,draw:mUe},styles:pjt,init:i=>{i.state||(i.state={}),i.state.arrowMarkerAbsolute=i.arrowMarkerAbsolute,$5.clear()}}},Symbol.toStringTag,{value:"Module"})),QY="rect",$gt="rectWithTitle",kUe="start",EUe="end",TUe="divider",CUe="roundedWithTitle",_Ue="note",SUe="noteGroup",vL="statediagram",AUe=`${vL}-state`,yjt="transition",LUe="note",MUe=`${yjt} note-edge`,DUe=`${vL}-${LUe}`,IUe=`${vL}-cluster`,OUe=`${vL}-cluster-alt`,xjt="parent",kjt="note",PUe="state",zgt="----",FUe=`${zgt}${kjt}`,Ejt=`${zgt}${xjt}`,Tjt="fill:none",Cjt="fill: #333",_jt="c",Sjt="text",Ajt="normal";let ZY={},kk=0;const NUe=function(i){const a=Object.keys(i);for(const f of a)i[f]},BUe=function(i,a){return a.db.extract(a.db.getRootDocV2()),a.db.getClasses()};function RUe(i){return i==null?"":i.classes?i.classes.join(" "):""}function qgt(i="",a=0,f="",p=zgt){const w=f!==null&&f.length>0?`${p}${f}`:"";return`${PUe}-${i}${w}-${a}`}const JF=(i,a,f,p,w,m)=>{const b=f.id,E=RUe(p[b]);if(b!=="root"){let _=QY;f.start===!0&&(_=kUe),f.start===!1&&(_=EUe),f.type!==KF&&(_=f.type),ZY[b]||(ZY[b]={id:b,shape:_,description:Kr.sanitizeText(b,Oe()),classes:`${E} ${AUe}`});const A=ZY[b];f.description&&(Array.isArray(A.description)?(A.shape=$gt,A.description.push(f.description)):A.description.length>0?(A.shape=$gt,A.description===b?A.description=[f.description]:A.description=[A.description,f.description]):(A.shape=QY,A.description=f.description),A.description=Kr.sanitizeTextOrArray(A.description,Oe())),A.description.length===1&&A.shape===$gt&&(A.shape=QY),!A.type&&f.doc&&(Ut.info("Setting cluster for ",b,Hgt(f)),A.type="group",A.dir=Hgt(f),A.shape=f.type===njt?TUe:CUe,A.classes=A.classes+" "+IUe+" "+(m?OUe:""));const I={labelStyle:"",shape:A.shape,labelText:A.description,classes:A.classes,style:"",id:b,dir:A.dir,domId:qgt(b,kk),type:A.type,padding:15};if(I.centerLabel=!0,f.note){const B={labelStyle:"",shape:_Ue,labelText:f.note.text,classes:DUe,style:"",id:b+FUe+"-"+kk,domId:qgt(b,kk,kjt),type:A.type,padding:15},N={labelStyle:"",shape:SUe,labelText:f.note.text,classes:A.classes,style:"",id:b+Ejt,domId:qgt(b,kk,xjt),type:"group",padding:0};kk++;const R=b+Ejt;i.setNode(R,N),i.setNode(B.id,B),i.setNode(b,I),i.setParent(b,R),i.setParent(B.id,R);let z=b,W=B.id;f.note.position==="left of"&&(z=B.id,W=b),i.setEdge(z,W,{arrowhead:"none",arrowType:"",style:Tjt,labelStyle:"",classes:MUe,arrowheadStyle:Cjt,labelpos:_jt,labelType:Sjt,thickness:Ajt})}else i.setNode(b,I)}a&&a.id!=="root"&&(Ut.trace("Setting node ",b," to be child of its parent ",a.id),i.setParent(b,a.id)),f.doc&&(Ut.trace("Adding nodes children "),jUe(i,f,f.doc,p,w,!m))},jUe=(i,a,f,p,w,m)=>{Ut.trace("items",f),f.forEach(b=>{switch(b.stmt){case UY:JF(i,a,b,p,w,m);break;case KF:JF(i,a,b,p,w,m);break;case Igt:{JF(i,a,b.state1,p,w,m),JF(i,a,b.state2,p,w,m);const E={id:"edge"+kk,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:Tjt,labelStyle:"",label:Kr.sanitizeText(b.description,Oe()),arrowheadStyle:Cjt,labelpos:_jt,labelType:Sjt,thickness:Ajt,classes:yjt};i.setEdge(b.state1.id,b.state2.id,E,kk),kk++}break}})},Hgt=(i,a=NGe)=>{let f=a;if(i.doc)for(let p=0;p{i.state||(i.state={}),i.state.arrowMarkerAbsolute=i.arrowMarkerAbsolute,$5.clear()}}},Symbol.toStringTag,{value:"Module"}));var Vgt=function(){var i=function(B,N,R,z){for(R=R||{},z=B.length;z--;R[B[z]]=N);return R},a=[6,8,10,11,12,14,16,17,18],f=[1,9],p=[1,10],w=[1,11],m=[1,12],b=[1,13],E=[1,14],_={trace:function(){},yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:function(N,R,z,W,et,st,at){var bt=st.length-1;switch(et){case 1:return st[bt-1];case 2:this.$=[];break;case 3:st[bt-1].push(st[bt]),this.$=st[bt-1];break;case 4:case 5:this.$=st[bt];break;case 6:case 7:this.$=[];break;case 8:W.setDiagramTitle(st[bt].substr(6)),this.$=st[bt].substr(6);break;case 9:this.$=st[bt].trim(),W.setAccTitle(this.$);break;case 10:case 11:this.$=st[bt].trim(),W.setAccDescription(this.$);break;case 12:W.addSection(st[bt].substr(8)),this.$=st[bt].substr(8);break;case 13:W.addTask(st[bt-1],st[bt]),this.$="task";break}},table:[{3:1,4:[1,2]},{1:[3]},i(a,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:f,12:p,14:w,16:m,17:b,18:E},i(a,[2,7],{1:[2,1]}),i(a,[2,3]),{9:15,11:f,12:p,14:w,16:m,17:b,18:E},i(a,[2,5]),i(a,[2,6]),i(a,[2,8]),{13:[1,16]},{15:[1,17]},i(a,[2,11]),i(a,[2,12]),{19:[1,18]},i(a,[2,4]),i(a,[2,9]),i(a,[2,10]),i(a,[2,13])],defaultActions:{},parseError:function(N,R){if(R.recoverable)this.trace(N);else{var z=new Error(N);throw z.hash=R,z}},parse:function(N){var R=this,z=[0],W=[],et=[null],st=[],at=this.table,bt="",mt=0,yt=0,ft=2,ut=1,vt=st.slice.call(arguments,1),X=Object.create(this.lexer),pt={yy:{}};for(var U in this.yy)Object.prototype.hasOwnProperty.call(this.yy,U)&&(pt.yy[U]=this.yy[U]);X.setInput(N,pt.yy),pt.yy.lexer=X,pt.yy.parser=this,typeof X.yylloc>"u"&&(X.yylloc={});var Tt=X.yylloc;st.push(Tt);var nt=X.options&&X.options.ranges;typeof pt.yy.parseError=="function"?this.parseError=pt.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function It(){var Se;return Se=W.pop()||X.lex()||ut,typeof Se!="number"&&(Se instanceof Array&&(W=Se,Se=W.pop()),Se=R.symbols_[Se]||Se),Se}for(var Ot,Bt,Et,Z,Ct={},xt,Ht,Le,Ft;;){if(Bt=z[z.length-1],this.defaultActions[Bt]?Et=this.defaultActions[Bt]:((Ot===null||typeof Ot>"u")&&(Ot=It()),Et=at[Bt]&&at[Bt][Ot]),typeof Et>"u"||!Et.length||!Et[0]){var gn="";Ft=[];for(xt in at[Bt])this.terminals_[xt]&&xt>ft&&Ft.push("'"+this.terminals_[xt]+"'");X.showPosition?gn="Parse error on line "+(mt+1)+`: +`+X.showPosition()+` +Expecting `+Ft.join(", ")+", got '"+(this.terminals_[Ot]||Ot)+"'":gn="Parse error on line "+(mt+1)+": Unexpected "+(Ot==ut?"end of input":"'"+(this.terminals_[Ot]||Ot)+"'"),this.parseError(gn,{text:X.match,token:this.terminals_[Ot]||Ot,line:X.yylineno,loc:Tt,expected:Ft})}if(Et[0]instanceof Array&&Et.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Bt+", token: "+Ot);switch(Et[0]){case 1:z.push(Ot),et.push(X.yytext),st.push(X.yylloc),z.push(Et[1]),Ot=null,yt=X.yyleng,bt=X.yytext,mt=X.yylineno,Tt=X.yylloc;break;case 2:if(Ht=this.productions_[Et[1]][1],Ct.$=et[et.length-Ht],Ct._$={first_line:st[st.length-(Ht||1)].first_line,last_line:st[st.length-1].last_line,first_column:st[st.length-(Ht||1)].first_column,last_column:st[st.length-1].last_column},nt&&(Ct._$.range=[st[st.length-(Ht||1)].range[0],st[st.length-1].range[1]]),Z=this.performAction.apply(Ct,[bt,yt,mt,pt.yy,Et[1],et,st].concat(vt)),typeof Z<"u")return Z;Ht&&(z=z.slice(0,-1*Ht*2),et=et.slice(0,-1*Ht),st=st.slice(0,-1*Ht)),z.push(this.productions_[Et[1]][0]),et.push(Ct.$),st.push(Ct._$),Le=at[z[z.length-2]][z[z.length-1]],z.push(Le);break;case 3:return!0}}return!0}},A=function(){var B={EOF:1,parseError:function(R,z){if(this.yy.parser)this.yy.parser.parseError(R,z);else throw new Error(R)},setInput:function(N,R){return this.yy=R||this.yy||{},this._input=N,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var N=this._input[0];this.yytext+=N,this.yyleng++,this.offset++,this.match+=N,this.matched+=N;var R=N.match(/(?:\r\n?|\n).*/g);return R?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),N},unput:function(N){var R=N.length,z=N.split(/(?:\r\n?|\n)/g);this._input=N+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-R),this.offset-=R;var W=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),z.length-1&&(this.yylineno-=z.length-1);var et=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:z?(z.length===W.length?this.yylloc.first_column:0)+W[W.length-z.length].length-z[0].length:this.yylloc.first_column-R},this.options.ranges&&(this.yylloc.range=[et[0],et[0]+this.yyleng-R]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(N){this.unput(this.match.slice(N))},pastInput:function(){var N=this.matched.substr(0,this.matched.length-this.match.length);return(N.length>20?"...":"")+N.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var N=this.match;return N.length<20&&(N+=this._input.substr(0,20-N.length)),(N.substr(0,20)+(N.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var N=this.pastInput(),R=new Array(N.length+1).join("-");return N+this.upcomingInput()+` +`+R+"^"},test_match:function(N,R){var z,W,et;if(this.options.backtrack_lexer&&(et={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(et.yylloc.range=this.yylloc.range.slice(0))),W=N[0].match(/(?:\r\n?|\n).*/g),W&&(this.yylineno+=W.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:W?W[W.length-1].length-W[W.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+N[0].length},this.yytext+=N[0],this.match+=N[0],this.matches=N,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(N[0].length),this.matched+=N[0],z=this.performAction.call(this,this.yy,this,R,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),z)return z;if(this._backtrack){for(var st in et)this[st]=et[st];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var N,R,z,W;this._more||(this.yytext="",this.match="");for(var et=this._currentRules(),st=0;stR[0].length)){if(R=z,W=st,this.options.backtrack_lexer){if(N=this.test_match(z,et[st]),N!==!1)return N;if(this._backtrack){R=!1;continue}else return!1}else if(!this.options.flex)break}return R?(N=this.test_match(R,et[W]),N!==!1?N:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var R=this.next();return R||this.lex()},begin:function(R){this.conditionStack.push(R)},popState:function(){var R=this.conditionStack.length-1;return R>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(R){return R=this.conditionStack.length-1-Math.abs(R||0),R>=0?this.conditionStack[R]:"INITIAL"},pushState:function(R){this.begin(R)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(R,z,W,et){switch(W){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),14;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return B}();_.lexer=A;function I(){this.yy={}}return I.prototype=_,_.Parser=I,new I}();Vgt.parser=Vgt;const zUe=Vgt;let mL="";const Ggt=[],tN=[],eN=[],qUe=function(){Ggt.length=0,tN.length=0,mL="",eN.length=0,hg()},HUe=function(i){mL=i,Ggt.push(i)},VUe=function(){return Ggt},GUe=function(){let i=Ljt();const a=100;let f=0;for(;!i&&f{f.people&&i.push(...f.people)}),[...new Set(i)].sort()},WUe=function(i,a){const f=a.substr(1).split(":");let p=0,w=[];f.length===1?(p=Number(f[0]),w=[]):(p=Number(f[0]),w=f[1].split(","));const m=w.map(E=>E.trim()),b={section:mL,type:mL,people:m,task:i,score:p};eN.push(b)},YUe=function(i){const a={section:mL,type:mL,description:i,task:i,classes:[]};tN.push(a)},Ljt=function(){const i=function(f){return eN[f].processed};let a=!0;for(const[f,p]of eN.entries())i(f),a=a&&p.processed;return a},Mjt={getConfig:()=>Oe().journey,clear:qUe,setDiagramTitle:Nb,getDiagramTitle:pg,setAccTitle:E0,getAccTitle:fg,setAccDescription:dg,getAccDescription:gg,addSection:HUe,getSections:VUe,getTasks:GUe,addTask:WUe,addTaskOrg:YUe,getActors:function(){return UUe()}},KUe=i=>`.label { + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + color: ${i.textColor}; + } + .mouth { + stroke: #666; + } + + line { + stroke: ${i.textColor} + } + + .legend { + fill: ${i.textColor}; + } + + .label text { + fill: #333; + } + .label { + color: ${i.textColor} + } + + .face { + ${i.faceColor?`fill: ${i.faceColor}`:"fill: #FFF8DC"}; + stroke: #999; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${i.mainBkg}; + stroke: ${i.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${i.arrowheadColor}; + } + + .edgePath .path { + stroke: ${i.lineColor}; + stroke-width: 1.5px; + } + + .flowchart-link { + stroke: ${i.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${i.edgeLabelBackground}; + rect { + opacity: 0.5; + } + text-align: center; + } + + .cluster rect { + } + + .cluster text { + fill: ${i.titleColor}; + } + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: 'trebuchet ms', verdana, arial, sans-serif; + font-family: var(--mermaid-font-family); + font-size: 12px; + background: ${i.tertiaryColor}; + border: 1px solid ${i.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .task-type-0, .section-type-0 { + ${i.fillType0?`fill: ${i.fillType0}`:""}; + } + .task-type-1, .section-type-1 { + ${i.fillType0?`fill: ${i.fillType1}`:""}; + } + .task-type-2, .section-type-2 { + ${i.fillType0?`fill: ${i.fillType2}`:""}; + } + .task-type-3, .section-type-3 { + ${i.fillType0?`fill: ${i.fillType3}`:""}; + } + .task-type-4, .section-type-4 { + ${i.fillType0?`fill: ${i.fillType4}`:""}; + } + .task-type-5, .section-type-5 { + ${i.fillType0?`fill: ${i.fillType5}`:""}; + } + .task-type-6, .section-type-6 { + ${i.fillType0?`fill: ${i.fillType6}`:""}; + } + .task-type-7, .section-type-7 { + ${i.fillType0?`fill: ${i.fillType7}`:""}; + } + + .actor-0 { + ${i.actor0?`fill: ${i.actor0}`:""}; + } + .actor-1 { + ${i.actor1?`fill: ${i.actor1}`:""}; + } + .actor-2 { + ${i.actor2?`fill: ${i.actor2}`:""}; + } + .actor-3 { + ${i.actor3?`fill: ${i.actor3}`:""}; + } + .actor-4 { + ${i.actor4?`fill: ${i.actor4}`:""}; + } + .actor-5 { + ${i.actor5?`fill: ${i.actor5}`:""}; + } +`,Ugt=function(i,a){return JW(i,a)},XUe=function(i,a){const p=i.append("circle").attr("cx",a.cx).attr("cy",a.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),w=i.append("g");w.append("circle").attr("cx",a.cx-15/3).attr("cy",a.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),w.append("circle").attr("cx",a.cx+15/3).attr("cy",a.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function m(_){const A=OA().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);_.append("path").attr("class","mouth").attr("d",A).attr("transform","translate("+a.cx+","+(a.cy+2)+")")}function b(_){const A=OA().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);_.append("path").attr("class","mouth").attr("d",A).attr("transform","translate("+a.cx+","+(a.cy+7)+")")}function E(_){_.append("line").attr("class","mouth").attr("stroke",2).attr("x1",a.cx-5).attr("y1",a.cy+7).attr("x2",a.cx+5).attr("y2",a.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return a.score>3?m(w):a.score<3?b(w):E(w),p},Djt=function(i,a){const f=i.append("circle");return f.attr("cx",a.cx),f.attr("cy",a.cy),f.attr("class","actor-"+a.pos),f.attr("fill",a.fill),f.attr("stroke",a.stroke),f.attr("r",a.r),f.class!==void 0&&f.attr("class",f.class),a.title!==void 0&&f.append("title").text(a.title),f},Ijt=function(i,a){return RDe(i,a)},QUe=function(i,a){function f(w,m,b,E,_){return w+","+m+" "+(w+b)+","+m+" "+(w+b)+","+(m+E-_)+" "+(w+b-_*1.2)+","+(m+E)+" "+w+","+(m+E)}const p=i.append("polygon");p.attr("points",f(a.x,a.y,50,20,7)),p.attr("class","labelBox"),a.y=a.y+a.labelMargin,a.x=a.x+.5*a.labelMargin,Ijt(i,a)},ZUe=function(i,a,f){const p=i.append("g"),w=bT();w.x=a.x,w.y=a.y,w.fill=a.fill,w.width=f.width*a.taskCount+f.diagramMarginX*(a.taskCount-1),w.height=f.height,w.class="journey-section section-type-"+a.num,w.rx=3,w.ry=3,Ugt(p,w),Pjt(f)(a.text,p,w.x,w.y,w.width,w.height,{class:"journey-section section-type-"+a.num},f,a.colour)};let Ojt=-1;const JUe=function(i,a,f){const p=a.x+f.width/2,w=i.append("g");Ojt++;const m=300+5*30;w.append("line").attr("id","task"+Ojt).attr("x1",p).attr("y1",a.y).attr("x2",p).attr("y2",m).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),XUe(w,{cx:p,cy:300+(5-a.score)*30,score:a.score});const b=bT();b.x=a.x,b.y=a.y,b.fill=a.fill,b.width=f.width,b.height=f.height,b.class="task task-type-"+a.num,b.rx=3,b.ry=3,Ugt(w,b);let E=a.x+14;a.people.forEach(_=>{const A=a.actors[_].color,I={cx:E,cy:a.y,r:7,fill:A,stroke:"#000",title:_,pos:a.actors[_].position};Djt(w,I),E+=10}),Pjt(f)(a.task,w,b.x,b.y,b.width,b.height,{class:"task"},f,a.colour)},tWe=function(i,a){mPt(i,a)},Pjt=function(){function i(w,m,b,E,_,A,I,B){const N=m.append("text").attr("x",b+_/2).attr("y",E+A/2+5).style("font-color",B).style("text-anchor","middle").text(w);p(N,I)}function a(w,m,b,E,_,A,I,B,N){const{taskFontSize:R,taskFontFamily:z}=B,W=w.split(//gi);for(let et=0;et{const w=z5[p].color,m={cx:20,cy:f,r:7,fill:w,stroke:"#000",pos:z5[p].position};nN.drawCircle(i,m);const b={x:40,y:f+7,fill:"#666",text:p,textMargin:a.boxTextMargin|5};nN.drawText(i,b),f+=20})}const JY=Oe().journey,MT=JY.leftMargin,rWe=function(i,a,f,p){const w=Oe().journey,m=Oe().securityLevel;let b;m==="sandbox"&&(b=yr("#i"+a));const E=yr(m==="sandbox"?b.nodes()[0].contentDocument.body:"body");aw.init();const _=E.select("#"+a);nN.initGraphics(_);const A=p.db.getTasks(),I=p.db.getDiagramTitle(),B=p.db.getActors();for(const st in z5)delete z5[st];let N=0;B.forEach(st=>{z5[st]={color:w.actorColours[N%w.actorColours.length],position:N},N++}),nWe(_),aw.insert(0,0,MT,Object.keys(z5).length*50),iWe(_,A,0);const R=aw.getBounds();I&&_.append("text").text(I).attr("x",MT).attr("font-size","4ex").attr("font-weight","bold").attr("y",25);const z=R.stopy-R.starty+2*w.diagramMarginY,W=MT+R.stopx+2*w.diagramMarginX;k0(_,z,W,w.useMaxWidth),_.append("line").attr("x1",MT).attr("y1",w.height*4).attr("x2",W-MT-4).attr("y2",w.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");const et=I?70:0;_.attr("viewBox",`${R.startx} -25 ${W} ${z+et}`),_.attr("preserveAspectRatio","xMinYMin meet"),_.attr("height",z+et+25)},aw={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},updateVal:function(i,a,f,p){i[a]===void 0?i[a]=f:i[a]=p(f,i[a])},updateBounds:function(i,a,f,p){const w=Oe().journey,m=this;let b=0;function E(_){return function(I){b++;const B=m.sequenceItems.length-b+1;m.updateVal(I,"starty",a-B*w.boxMargin,Math.min),m.updateVal(I,"stopy",p+B*w.boxMargin,Math.max),m.updateVal(aw.data,"startx",i-B*w.boxMargin,Math.min),m.updateVal(aw.data,"stopx",f+B*w.boxMargin,Math.max),_!=="activation"&&(m.updateVal(I,"startx",i-B*w.boxMargin,Math.min),m.updateVal(I,"stopx",f+B*w.boxMargin,Math.max),m.updateVal(aw.data,"starty",a-B*w.boxMargin,Math.min),m.updateVal(aw.data,"stopy",p+B*w.boxMargin,Math.max))}}this.sequenceItems.forEach(E())},insert:function(i,a,f,p){const w=Math.min(i,f),m=Math.max(i,f),b=Math.min(a,p),E=Math.max(a,p);this.updateVal(aw.data,"startx",w,Math.min),this.updateVal(aw.data,"starty",b,Math.min),this.updateVal(aw.data,"stopx",m,Math.max),this.updateVal(aw.data,"stopy",E,Math.max),this.updateBounds(w,b,m,E)},bumpVerticalPos:function(i){this.verticalPos=this.verticalPos+i,this.data.stopy=this.verticalPos},getVerticalPos:function(){return this.verticalPos},getBounds:function(){return this.data}},Wgt=JY.sectionFills,Fjt=JY.sectionColours,iWe=function(i,a,f){const p=Oe().journey;let w="";const m=p.height*2+p.diagramMarginY,b=f+m;let E=0,_="#CCC",A="black",I=0;for(const[B,N]of a.entries()){if(w!==N.section){_=Wgt[E%Wgt.length],I=E%Wgt.length,A=Fjt[E%Fjt.length];let z=0;const W=N.section;for(let st=B;st(z5[W]&&(z[W]=z5[W]),z),{});N.x=B*p.taskMargin+B*p.width+MT,N.y=b,N.width=p.diagramMarginX,N.height=p.diagramMarginY,N.colour=A,N.fill=_,N.num=I,N.actors=R,nN.drawTask(i,N,p),aw.insert(N.x,N.y,N.x+N.width+p.taskMargin,300+5*30)}},Njt={setConf:eWe,draw:rWe},sWe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:zUe,db:Mjt,renderer:Njt,styles:KUe,init:i=>{Njt.setConf(i.journey),Mjt.clear()}}},Symbol.toStringTag,{value:"Module"})),aWe=(i,a,f)=>{const{parentById:p}=f,w=new Set;let m=i;for(;m;){if(w.add(m),m===a)return m;m=p[m]}for(m=a;m;){if(w.has(m))return m;m=p[m]}return"root"};function tK(i){throw new Error('Could not dynamically require "'+i+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Bjt={exports:{}};(function(i,a){(function(f){i.exports=f()})(function(){return function(){function f(p,w,m){function b(A,I){if(!w[A]){if(!p[A]){var B=typeof tK=="function"&&tK;if(!I&&B)return B(A,!0);if(E)return E(A,!0);var N=new Error("Cannot find module '"+A+"'");throw N.code="MODULE_NOT_FOUND",N}var R=w[A]={exports:{}};p[A][0].call(R.exports,function(z){var W=p[A][1][z];return b(W||z)},R,R.exports,f,p,w,m)}return w[A].exports}for(var E=typeof tK=="function"&&tK,_=0;_0&&arguments[0]!==void 0?arguments[0]:{},N=B.defaultLayoutOptions,R=N===void 0?{}:N,z=B.algorithms,W=z===void 0?["layered","stress","mrtree","radial","force","disco","sporeOverlap","sporeCompaction","rectpacking"]:z,et=B.workerFactory,st=B.workerUrl;if(b(this,A),this.defaultLayoutOptions=R,this.initialized=!1,typeof st>"u"&&typeof et>"u")throw new Error("Cannot construct an ELK without both 'workerUrl' and 'workerFactory'.");var at=et;typeof st<"u"&&typeof et>"u"&&(at=function(yt){return new Worker(yt)});var bt=at(st);if(typeof bt.postMessage!="function")throw new TypeError("Created worker does not provide the required 'postMessage' function.");this.worker=new _(bt),this.worker.postMessage({cmd:"register",algorithms:W}).then(function(mt){return I.initialized=!0}).catch(console.err)}return m(A,[{key:"layout",value:function(B){var N=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},R=N.layoutOptions,z=R===void 0?this.defaultLayoutOptions:R,W=N.logging,et=W===void 0?!1:W,st=N.measureExecutionTime,at=st===void 0?!1:st;return B?this.worker.postMessage({cmd:"layout",graph:B,layoutOptions:z,options:{logging:et,measureExecutionTime:at}}):Promise.reject(new Error("Missing mandatory parameter 'graph'."))}},{key:"knownLayoutAlgorithms",value:function(){return this.worker.postMessage({cmd:"algorithms"})}},{key:"knownLayoutOptions",value:function(){return this.worker.postMessage({cmd:"options"})}},{key:"knownLayoutCategories",value:function(){return this.worker.postMessage({cmd:"categories"})}},{key:"terminateWorker",value:function(){this.worker.terminate()}}]),A}();w.default=E;var _=function(){function A(I){var B=this;if(b(this,A),I===void 0)throw new Error("Missing mandatory parameter 'worker'.");this.resolvers={},this.worker=I,this.worker.onmessage=function(N){setTimeout(function(){B.receive(B,N)},0)}}return m(A,[{key:"postMessage",value:function(B){var N=this.id||0;this.id=N+1,B.id=N;var R=this;return new Promise(function(z,W){R.resolvers[N]=function(et,st){et?(R.convertGwtStyleError(et),W(et)):z(st)},R.worker.postMessage(B)})}},{key:"receive",value:function(B,N){var R=N.data,z=B.resolvers[R.id];z&&(delete B.resolvers[R.id],R.error?z(R.error):z(null,R.data))}},{key:"terminate",value:function(){this.worker.terminate&&this.worker.terminate()}},{key:"convertGwtStyleError",value:function(B){if(B){var N=B.__java$exception;N&&(N.cause&&N.cause.backingJsObject&&(B.cause=N.cause.backingJsObject,this.convertGwtStyleError(B.cause)),delete B.__java$exception)}}}]),A}()},{}],2:[function(f,p,w){(function(m){(function(){var b;typeof window<"u"?b=window:typeof m<"u"?b=m:typeof self<"u"&&(b=self);var E;function _(){}function A(){}function I(){}function B(){}function N(){}function R(){}function z(){}function W(){}function et(){}function st(){}function at(){}function bt(){}function mt(){}function yt(){}function ft(){}function ut(){}function vt(){}function X(){}function pt(){}function U(){}function Tt(){}function nt(){}function It(){}function Ot(){}function Bt(){}function Et(){}function Z(){}function Ct(){}function xt(){}function Ht(){}function Le(){}function Ft(){}function gn(){}function Se(){}function me(){}function Ve(){}function Ye(){}function ce(){}function ke(){}function zt(){}function re(){}function se(){}function Pe(){}function te(){}function Me(){}function de(){}function on(){}function ni(){}function Ks(){}function ws(){}function fo(){}function Xi(){}function Er(){}function Xn(){}function di(){}function Ee(){}function Kn(){}function He(){}function Ti(){}function pn(){}function Es(){}function qa(){}function Ma(){}function Gs(){}function Po(){}function vs(){}function ru(){}function zs(){}function Du(){}function pm(){}function uw(){}function Wu(){}function th(){}function Fa(){}function Ml(){}function ha(){}function bc(){}function Cc(){}function pa(){}function Da(){}function Ha(){}function Dl(){}function _c(){}function lw(){}function eh(){}function ed(){}function jd(){}function nd(){}function $d(){}function A0(){}function Bi(){}function cn(){}function kr(){}function Ei(){}function Jo(){}function wc(){}function rf(){}function Oc(){}function sf(){}function af(){}function Qi(){}function Ts(){}function ka(){}function xi(){}function Yc(){}function Ce(){}function vp(){}function Be(){}function Bf(){}function yg(){}function bm(){}function Ek(){}function E3(){}function Il(){}function L0(){}function hw(){}function H5(){}function Hb(){}function V5(){}function f1(){}function rd(){}function id(){}function G5(){}function fw(){}function U5(){}function mp(){}function W5(){}function T3(){}function wm(){}function xg(){}function EL(){}function vl(){}function iN(){}function Sc(){}function cK(){}function Vb(){}function uK(){}function PT(){}function lK(){}function sN(){}function Rf(){}function vm(){}function TL(){}function aN(){}function yp(){}function mm(){}function hK(){}function Gb(){}function fK(){}function dK(){}function Y5(){}function FT(){}function oN(){}function Tk(){}function gK(){}function Ck(){}function pK(){}function bK(){}function wK(){}function vK(){}function mK(){}function yK(){}function xK(){}function kK(){}function EK(){}function TK(){}function CK(){}function CL(){}function _K(){}function SK(){}function NT(){}function cN(){}function K5(){}function AK(){}function LK(){}function MK(){}function DK(){}function IK(){}function BT(){}function _L(){}function uN(){}function C3(){}function _3(){}function OK(){}function of(){}function X5(){}function PK(){}function _k(){}function zd(){}function FK(){}function NK(){}function BK(){}function RK(){}function RT(){}function SL(){}function lN(){}function AL(){}function Q5(){}function jK(){}function hN(){}function fN(){}function $K(){}function zK(){}function qK(){}function HK(){}function VK(){}function GK(){}function qd(){}function dw(){}function UK(){}function dN(){}function gN(){}function WK(){}function S3(){}function Sk(){}function LL(){}function ym(){}function Ak(){}function YK(){}function jT(){}function sd(){}function pN(){}function ML(){}function Lk(){}function DL(){}function bN(){}function KK(){}function IL(){}function XK(){}function QK(){}function wN(){}function Z5(){}function vN(){}function J5(){}function ZK(){}function OL(){}function JK(){}function tX(){}function eX(){}function nX(){}function mN(){}function rX(){}function iX(){}function sX(){}function yN(){}function aX(){}function oX(){}function cX(){}function xN(){}function uX(){}function lX(){}function kN(){}function EN(){}function TN(){}function hX(){}function fX(){}function Mk(){}function tx(){}function $T(){}function dX(){}function PL(){}function zT(){}function FL(){}function CN(){}function _N(){}function gX(){}function pX(){}function bX(){}function SN(){}function AN(){}function wX(){}function vX(){}function mX(){}function yX(){}function xX(){}function LN(){}function kX(){}function EX(){}function TX(){}function CX(){}function MN(){}function qT(){}function _X(){}function SX(){}function DN(){}function AX(){}function LX(){}function MX(){}function DX(){}function IX(){}function OX(){}function IN(){}function PX(){}function ON(){}function FX(){}function NX(){}function BX(){}function HT(){}function RX(){}function VT(){}function jX(){}function PN(){}function FN(){}function NN(){}function BN(){}function gw(){}function RN(){}function jN(){}function $N(){}function zN(){}function $X(){}function ex(){}function GT(){}function A3(){}function zX(){}function qX(){}function UT(){}function HX(){}function VX(){}function GX(){}function UX(){}function WX(){}function YX(){}function KX(){}function XX(){}function QX(){}function ZX(){}function JX(){}function NL(){}function qN(){}function tQ(){}function eQ(){}function nQ(){}function HN(){}function rQ(){}function iQ(){}function sQ(){}function aQ(){}function oQ(){}function cQ(){}function VN(){}function GN(){}function uQ(){}function UN(){}function WN(){}function lQ(){}function hQ(){}function fQ(){}function BL(){}function dQ(){}function Dk(){}function gQ(){}function pQ(){}function bQ(){}function YN(){}function wQ(){}function vQ(){}function mQ(){}function yQ(){}function xQ(){}function kQ(){}function EQ(){}function TQ(){}function CQ(){}function _Q(){}function SQ(){}function AQ(){}function nx(){}function KN(){}function LQ(){}function MQ(){}function DQ(){}function XN(){}function IQ(){}function WT(){}function OQ(){}function PQ(){}function FQ(){}function NQ(){}function BQ(){}function RQ(){}function jQ(){}function $Q(){}function zQ(){}function qQ(){}function rx(){}function HQ(){}function VQ(){}function GQ(){}function UQ(){}function WQ(){}function YQ(){}function KQ(){}function XQ(){}function YT(){}function QQ(){}function ZQ(){}function JQ(){}function tZ(){}function eZ(){}function nZ(){}function rZ(){}function iZ(){}function ix(){}function QN(){}function sZ(){}function RL(){}function aZ(){}function oZ(){}function cZ(){}function uZ(){}function lZ(){}function hZ(){}function fZ(){}function ZN(){}function dZ(){}function JN(){}function gZ(){}function tB(){}function eB(){}function nB(){}function pZ(){}function bZ(){}function KT(){}function jL(){}function XT(){}function wZ(){}function vZ(){}function $L(){}function mZ(){}function yZ(){}function rB(){}function xZ(){}function kZ(){}function EZ(){}function TZ(){}function CZ(){}function _Z(){}function SZ(){}function AZ(){}function LZ(){}function MZ(){}function kg(){}function DZ(){}function xm(){}function iB(){}function IZ(){}function OZ(){}function PZ(){}function FZ(){}function NZ(){}function BZ(){}function RZ(){}function jZ(){}function $Z(){}function Ac(){}function zZ(){}function QT(){}function tc(){}function Kc(){}function zi(){}function zL(){}function qZ(){}function HZ(){}function VZ(){}function sx(){}function km(){}function Ue(){}function GZ(){}function UZ(){}function WZ(){}function YZ(){}function KZ(){}function sB(){}function XZ(){}function QZ(){}function qL(){}function ZZ(){}function Yu(){}function Iu(){}function JZ(){}function tJ(){}function eJ(){}function Em(){}function pw(){}function xp(){}function ad(){}function ax(){}function ZT(){}function Ik(){}function aB(){}function nJ(){}function Ok(){}function oB(){}function rJ(){}function JT(){}function ox(){}function cx(){}function kp(){}function cB(){}function Pk(){}function uB(){}function lB(){}function ux(){}function Ub(){}function M0(){}function Ep(){}function L3(){}function Fk(){}function tC(){}function hB(){}function iJ(){}function fB(){}function dB(){}function gB(){}function Nk(){}function pB(){}function bB(){}function sJ(){}function Bk(){}function Rk(){}function Tm(){}function HL(){}function aJ(){}function oJ(){}function cJ(){}function uJ(){}function lJ(){}function hJ(){}function fJ(){}function dJ(){}function wB(){}function gJ(){}function pJ(){}function bJ(){}function vB(){}function jk(){}function eC(){}function mB(){}function wJ(){}function yB(){}function xB(){}function vJ(){}function nC(){}function Cm(){}function kB(){}function EB(){}function mJ(){}function yJ(){}function rC(){}function TB(){}function CB(){}function uc(){}function xJ(){}function _B(){}function iC(){}function kJ(){}function EJ(){}function sC(){}function SB(){}function aC(){}function oC(){}function jf(){}function VL(){}function GL(){}function lx(){}function TJ(){}function CJ(){}function _J(){}function SJ(){}function _m(){}function AB(){}function hx(){}function d1(){}function LB(){}function MB(){}function DB(){}function IB(){}function OB(){}function PB(){}function $f(){}function du(){}function AJ(){}function LJ(){}function MJ(){}function gu(){}function cC(){}function FB(){}function NB(){}function fx(){}function DJ(){}function $k(){}function IJ(){}function BB(){}function OJ(){}function PJ(){}function uC(){}function RB(){}function UL(){}function lC(){}function FJ(){}function NJ(){}function WL(){}function hC(){}function g1(){}function zk(){}function BJ(){}function qk(){}function YL(){}function Wb(){}function fC(){}function KL(){}function zf(){}function dC(){}function p1(){}function b1(){}function RJ(){}function jJ(){}function M3(){}function Hk(){}function Vk(){}function gC(){}function $J(){}function dx(){}function XL(){}function jB(){}function zJ(){}function pC(){PC()}function qJ(){Rit()}function $B(){o_()}function QL(){sq()}function HJ(){q4t()}function bC(){Jf()}function VJ(){J3t()}function GJ(){iI()}function UJ(){EM()}function WJ(){kM()}function YJ(){KM()}function zB(){BVt()}function KJ(){r6()}function XJ(){$R()}function QJ(){YJt()}function qB(){one()}function ZJ(){_te()}function JJ(){HQt()}function wC(){oE()}function ttt(){nb()}function ett(){cne()}function ntt(){NZt()}function rtt(){Fxt()}function itt(){Kse()}function stt(){VQt()}function HB(){Te()}function att(){qQt()}function VB(){une()}function ott(){fre()}function ZL(){UQt()}function ctt(){Dte()}function GB(){RVt()}function utt(){E5t()}function UB(){uy()}function ltt(){Nne()}function WB(){cI()}function YB(){dat()}function KB(){yst()}function JL(){gv()}function D3(){myt()}function vC(){GQt()}function od(){rle()}function XB(){y5t()}function Gk(){sat()}function tM(){V$()}function htt(){fq()}function Tp(){ui()}function QB(){Sz()}function ZB(){S3t()}function JB(){Dq()}function nh(){IYt()}function eM(){kit()}function tR(){oxt()}function Uk(t){On(t)}function mC(t){this.a=t}function Wk(t){this.a=t}function eR(t){this.a=t}function gx(t){this.a=t}function bw(t){this.a=t}function Yk(t){this.a=t}function nR(t){this.a=t}function ftt(t){this.a=t}function nM(t){this.a=t}function I3(t){this.a=t}function rM(t){this.a=t}function yC(t){this.a=t}function dtt(t){this.a=t}function xC(t){this.a=t}function kC(t){this.a=t}function px(t){this.a=t}function iM(t){this.a=t}function sM(t){this.a=t}function gtt(t){this.a=t}function ptt(t){this.a=t}function btt(t){this.a=t}function rR(t){this.b=t}function wtt(t){this.c=t}function vtt(t){this.a=t}function mtt(t){this.a=t}function ytt(t){this.a=t}function xtt(t){this.a=t}function ktt(t){this.a=t}function Ett(t){this.a=t}function Ttt(t){this.a=t}function Ctt(t){this.a=t}function bx(t){this.a=t}function _tt(t){this.a=t}function Kk(t){this.a=t}function Th(t){this.a=t}function Stt(t){this.a=t}function wx(t){this.a=t}function Xk(t){this.a=t}function EC(t){this.a=t}function Qk(t){this.a=t}function Eg(){this.a=[]}function Att(t,e){t.a=e}function cpt(t,e){t.a=e}function upt(t,e){t.b=e}function lpt(t,e){t.b=e}function hpt(t,e){t.b=e}function aM(t,e){t.j=e}function fpt(t,e){t.g=e}function dpt(t,e){t.i=e}function Ltt(t,e){t.c=e}function w1(t,e){t.d=e}function Mtt(t,e){t.d=e}function gpt(t,e){t.c=e}function D0(t,e){t.k=e}function Dtt(t,e){t.c=e}function iR(t,e){t.c=e}function sR(t,e){t.a=e}function Itt(t,e){t.a=e}function ppt(t,e){t.f=e}function bpt(t,e){t.a=e}function ww(t,e){t.b=e}function oM(t,e){t.d=e}function TC(t,e){t.i=e}function aR(t,e){t.o=e}function wpt(t,e){t.r=e}function vpt(t,e){t.a=e}function oR(t,e){t.b=e}function vw(t,e){t.e=e}function Ott(t,e){t.f=e}function CC(t,e){t.g=e}function vx(t,e){t.e=e}function mpt(t,e){t.f=e}function Zk(t,e){t.f=e}function Ptt(t,e){t.n=e}function Tg(t,e){t.a=e}function ypt(t,e){t.a=e}function O3(t,e){t.c=e}function Ftt(t,e){t.c=e}function Ntt(t,e){t.d=e}function cR(t,e){t.e=e}function uR(t,e){t.g=e}function Btt(t,e){t.a=e}function Jk(t,e){t.c=e}function _C(t,e){t.d=e}function xpt(t,e){t.e=e}function Rtt(t,e){t.f=e}function jtt(t,e){t.j=e}function $tt(t,e){t.a=e}function kpt(t,e){t.b=e}function vc(t,e){t.a=e}function lR(t){t.b=t.a}function ztt(t){t.c=t.d.d}function mx(t){this.d=t}function Cg(t){this.a=t}function Sm(t){this.a=t}function cM(t){this.a=t}function v1(t){this.a=t}function yx(t){this.a=t}function qtt(t){this.a=t}function hR(t){this.a=t}function P3(t){this.a=t}function uM(t){this.a=t}function Am(t){this.a=t}function fR(t){this.a=t}function m1(t){this.a=t}function y(t){this.a=t}function g(t){this.a=t}function x(t){this.b=t}function T(t){this.b=t}function L(t){this.b=t}function O(t){this.a=t}function P(t){this.a=t}function $(t){this.a=t}function q(t){this.c=t}function S(t){this.c=t}function V(t){this.c=t}function Y(t){this.a=t}function rt(t){this.a=t}function ot(t){this.a=t}function ht(t){this.a=t}function dt(t){this.a=t}function Lt(t){this.a=t}function kt(t){this.a=t}function Dt(t){this.a=t}function Pt(t){this.a=t}function $t(t){this.a=t}function Zt(t){this.a=t}function Yt(t){this.a=t}function qt(t){this.a=t}function ne(t){this.a=t}function Gt(t){this.a=t}function ge(t){this.a=t}function be(t){this.a=t}function ie(t){this.a=t}function Fe(t){this.a=t}function we(t){this.a=t}function bn(t){this.a=t}function ze(t){this.a=t}function Ge(t){this.a=t}function En(t){this.a=t}function In(t){this.a=t}function Yn(t){this.a=t}function Sn(t){this.a=t}function Wn(t){this.a=t}function rr(t){this.a=t}function wr(t){this.a=t}function ur(t){this.a=t}function er(t){this.a=t}function vn(t){this.a=t}function gr(t){this.a=t}function fr(t){this.a=t}function Jr(t){this.a=t}function vi(t){this.a=t}function Xs(t){this.a=t}function Ea(t){this.a=t}function Ci(t){this.a=t}function hi(t){this.a=t}function gs(t){this.a=t}function qi(t){this.a=t}function Si(t){this.a=t}function Ui(t){this.a=t}function Va(t){this.e=t}function Qs(t){this.a=t}function qs(t){this.a=t}function Tr(t){this.a=t}function Qt(t){this.a=t}function jn(t){this.a=t}function Sr(t){this.a=t}function ir(t){this.a=t}function sr(t){this.a=t}function Ia(t){this.a=t}function $r(t){this.a=t}function Yi(t){this.a=t}function Fo(t){this.a=t}function Pc(t){this.a=t}function Za(t){this.a=t}function mc(t){this.a=t}function Ta(t){this.a=t}function Ja(t){this.a=t}function ml(t){this.a=t}function qf(t){this.a=t}function Cp(t){this.a=t}function _p(t){this.a=t}function Hf(t){this.a=t}function _g(t){this.a=t}function cd(t){this.a=t}function mw(t){this.a=t}function Lm(t){this.a=t}function xx(t){this.a=t}function F3(t){this.a=t}function kx(t){this.a=t}function SC(t){this.a=t}function N3(t){this.a=t}function Hd(t){this.a=t}function y1(t){this.a=t}function Vd(t){this.a=t}function AC(t){this.a=t}function Yb(t){this.a=t}function dR(t){this.a=t}function Htt(t){this.a=t}function Vtt(t){this.a=t}function Gtt(t){this.a=t}function Utt(t){this.a=t}function Wtt(t){this.a=t}function Ytt(t){this.a=t}function Ktt(t){this.a=t}function t8(t){this.a=t}function lM(t){this.a=t}function LC(t){this.a=t}function gR(t){this.a=t}function pR(t){this.a=t}function Xtt(t){this.a=t}function Sp(t){this.a=t}function hM(t){this.a=t}function bR(t){this.a=t}function e8(t){this.c=t}function Ap(t){this.b=t}function Qtt(t){this.a=t}function S$t(t){this.a=t}function A$t(t){this.a=t}function L$t(t){this.a=t}function M$t(t){this.a=t}function D$t(t){this.a=t}function I$t(t){this.a=t}function O$t(t){this.a=t}function P$t(t){this.a=t}function F$t(t){this.a=t}function N$t(t){this.a=t}function B$t(t){this.a=t}function R$t(t){this.a=t}function j$t(t){this.a=t}function $$t(t){this.a=t}function z$t(t){this.a=t}function q$t(t){this.a=t}function H$t(t){this.a=t}function V$t(t){this.a=t}function G$t(t){this.a=t}function U$t(t){this.a=t}function W$t(t){this.a=t}function Y$t(t){this.a=t}function K$t(t){this.a=t}function Lp(t){this.a=t}function Ex(t){this.a=t}function X$t(t){this.a=t}function Q$t(t){this.a=t}function Z$t(t){this.a=t}function J$t(t){this.a=t}function tzt(t){this.a=t}function ezt(t){this.a=t}function nzt(t){this.a=t}function rzt(t){this.a=t}function izt(t){this.a=t}function szt(t){this.a=t}function azt(t){this.a=t}function ozt(t){this.a=t}function czt(t){this.a=t}function uzt(t){this.a=t}function lzt(t){this.a=t}function hzt(t){this.a=t}function wR(t){this.a=t}function fzt(t){this.a=t}function dzt(t){this.a=t}function gzt(t){this.a=t}function pzt(t){this.a=t}function bzt(t){this.a=t}function wzt(t){this.a=t}function vzt(t){this.a=t}function mzt(t){this.a=t}function yzt(t){this.a=t}function xzt(t){this.a=t}function kzt(t){this.a=t}function Ezt(t){this.a=t}function Tzt(t){this.a=t}function Czt(t){this.a=t}function _zt(t){this.a=t}function Szt(t){this.a=t}function Azt(t){this.a=t}function Lzt(t){this.a=t}function Mzt(t){this.a=t}function Dzt(t){this.a=t}function Izt(t){this.a=t}function Ozt(t){this.a=t}function Pzt(t){this.a=t}function Fzt(t){this.a=t}function Nzt(t){this.a=t}function Bzt(t){this.a=t}function Rzt(t){this.a=t}function jzt(t){this.a=t}function Ept(t){this.a=t}function Vi(t){this.b=t}function $zt(t){this.f=t}function Tpt(t){this.a=t}function zzt(t){this.a=t}function qzt(t){this.a=t}function Hzt(t){this.a=t}function Vzt(t){this.a=t}function Gzt(t){this.a=t}function Uzt(t){this.a=t}function Wzt(t){this.a=t}function Yzt(t){this.a=t}function fM(t){this.a=t}function Kzt(t){this.a=t}function Xzt(t){this.b=t}function Cpt(t){this.c=t}function vR(t){this.e=t}function Qzt(t){this.a=t}function mR(t){this.a=t}function yR(t){this.a=t}function Ztt(t){this.a=t}function Zzt(t){this.a=t}function Jzt(t){this.d=t}function _pt(t){this.a=t}function Spt(t){this.a=t}function yw(t){this.e=t}function WYe(){this.a=0}function B3(){IUt(this)}function he(){ant(this)}function _r(){Xu(this)}function Jtt(){NXt(this)}function tqt(){}function xw(){this.c=oLt}function YYe(t,e){e.Wb(t)}function eqt(t,e){t.b+=e}function nqt(t){t.b=new wet}function it(t){return t.e}function KYe(t){return t.a}function XYe(t){return t.a}function QYe(t){return t.a}function ZYe(t){return t.a}function JYe(t){return t.a}function tKe(){return null}function eKe(){return null}function nKe(){dbt(),dxn()}function rKe(t){t.b.tf(t.e)}function MC(t,e){t.b=e-t.b}function DC(t,e){t.a=e-t.a}function rqt(t,e){e.ad(t.a)}function iKe(t,e){Bs(e,t)}function sKe(t,e,n){t.Od(n,e)}function dM(t,e){t.e=e,e.b=t}function Apt(t){gd(),this.a=t}function iqt(t){gd(),this.a=t}function sqt(t){gd(),this.a=t}function Lpt(t){Wm(),this.a=t}function aqt(t){I8(),Out.be(t)}function Kb(){pWt.call(this)}function Mpt(){pWt.call(this)}function Dpt(){Kb.call(this)}function tet(){Kb.call(this)}function oqt(){Kb.call(this)}function gM(){Kb.call(this)}function Ou(){Kb.call(this)}function IC(){Kb.call(this)}function Or(){Kb.call(this)}function rh(){Kb.call(this)}function cqt(){Kb.call(this)}function lc(){Kb.call(this)}function uqt(){Kb.call(this)}function lqt(){this.a=this}function xR(){this.Bb|=256}function hqt(){this.b=new dUt}function Ipt(){Ipt=Z,new _r}function Opt(){Dpt.call(this)}function fqt(t,e){t.length=e}function kR(t,e){le(t.a,e)}function aKe(t,e){V4t(t.c,e)}function oKe(t,e){Fs(t.b,e)}function cKe(t,e){Jz(t.a,e)}function uKe(t,e){Wit(t.a,e)}function n8(t,e){mi(t.e,e)}function Tx(t){pq(t.c,t.b)}function lKe(t,e){t.kc().Nb(e)}function Ppt(t){this.a=chn(t)}function Hs(){this.a=new _r}function dqt(){this.a=new _r}function ER(){this.a=new he}function eet(){this.a=new he}function Fpt(){this.a=new he}function Ch(){this.a=new uw}function Xb(){this.a=new VJt}function Npt(){this.a=new H5}function Bpt(){this.a=new LVt}function gqt(){this.a=new wZt}function Rpt(){this.a=new OQt}function jpt(){this.a=new rYt}function pqt(){this.a=new he}function $pt(){this.a=new he}function bqt(){this.a=new he}function wqt(){this.a=new he}function vqt(){this.d=new he}function mqt(){this.a=new Hs}function yqt(){this.a=new _r}function xqt(){this.b=new _r}function kqt(){this.b=new he}function zpt(){this.e=new he}function Eqt(){this.d=new he}function Tqt(){this.a=new ttt}function Cqt(){he.call(this)}function qpt(){ER.call(this)}function _qt(){Ij.call(this)}function Sqt(){$pt.call(this)}function net(){OC.call(this)}function OC(){tqt.call(this)}function Cx(){tqt.call(this)}function Hpt(){Cx.call(this)}function Aqt(){lQt.call(this)}function Lqt(){lQt.call(this)}function Mqt(){Xpt.call(this)}function Dqt(){Xpt.call(this)}function Iqt(){Xpt.call(this)}function Oqt(){Qpt.call(this)}function Pu(){Zi.call(this)}function Vpt(){Em.call(this)}function Gpt(){Em.call(this)}function Pqt(){Xqt.call(this)}function Fqt(){Xqt.call(this)}function Nqt(){_r.call(this)}function Bqt(){_r.call(this)}function Rqt(){_r.call(this)}function jqt(){Hs.call(this)}function ret(){ine.call(this)}function $qt(){xR.call(this)}function iet(){x2t.call(this)}function set(){x2t.call(this)}function Upt(){_r.call(this)}function aet(){_r.call(this)}function zqt(){_r.call(this)}function Wpt(){Pk.call(this)}function qqt(){Pk.call(this)}function Hqt(){Wpt.call(this)}function Vqt(){XL.call(this)}function Gqt(t){Lee.call(this,t)}function Uqt(t){Lee.call(this,t)}function Ypt(t){nM.call(this,t)}function Kpt(t){mVt.call(this,t)}function hKe(t){Kpt.call(this,t)}function fKe(t){mVt.call(this,t)}function r8(){this.a=new Zi}function Xpt(){this.a=new Hs}function Qpt(){this.a=new _r}function Wqt(){this.a=new he}function Yqt(){this.j=new he}function Zpt(){this.a=new nB}function Kqt(){this.a=new VHt}function Xqt(){this.a=new cB}function oet(){oet=Z,Sut=new gHt}function cet(){cet=Z,_ut=new dHt}function PC(){PC=Z,Cut=new A}function TR(){TR=Z,Mut=new dWt}function dKe(t){Kpt.call(this,t)}function gKe(t){Kpt.call(this,t)}function Qqt(t){$rt.call(this,t)}function Zqt(t){$rt.call(this,t)}function Jqt(t){CYt.call(this,t)}function uet(t){Pgn.call(this,t)}function kw(t){Om.call(this,t)}function FC(t){NR.call(this,t)}function Jpt(t){NR.call(this,t)}function tHt(t){NR.call(this,t)}function Vo(t){jKt.call(this,t)}function eHt(t){Vo.call(this,t)}function _x(){Qk.call(this,{})}function CR(t){w8(),this.a=t}function NC(t){t.b=null,t.c=0}function pKe(t,e){t.e=e,nue(t,e)}function bKe(t,e){t.a=e,ypn(t)}function het(t,e,n){t.a[e.g]=n}function wKe(t,e,n){Ndn(n,t,e)}function vKe(t,e){HZe(e.i,t.n)}function nHt(t,e){Vun(t).td(e)}function mKe(t,e){return t*t/e}function rHt(t,e){return t.g-e.g}function yKe(t){return new EC(t)}function xKe(t){return new Um(t)}function _R(t){Vo.call(this,t)}function yo(t){Vo.call(this,t)}function iHt(t){Vo.call(this,t)}function fet(t){jKt.call(this,t)}function det(t){wyt(),this.a=t}function sHt(t){DYt(),this.a=t}function Mm(t){Vnt(),this.f=t}function get(t){Vnt(),this.f=t}function i8(t){Vo.call(this,t)}function Fn(t){Vo.call(this,t)}function No(t){Vo.call(this,t)}function aHt(t){Vo.call(this,t)}function Sx(t){Vo.call(this,t)}function je(t){return On(t),t}function Xt(t){return On(t),t}function pM(t){return On(t),t}function tbt(t){return On(t),t}function kKe(t){return On(t),t}function BC(t){return t.b==t.c}function Dm(t){return!!t&&t.b}function EKe(t){return!!t&&t.k}function TKe(t){return!!t&&t.j}function yl(t){On(t),this.a=t}function ebt(t){return g2(t),t}function RC(t){dvt(t,t.length)}function Sg(t){Vo.call(this,t)}function ud(t){Vo.call(this,t)}function pet(t){Vo.call(this,t)}function R3(t){Vo.call(this,t)}function jC(t){Vo.call(this,t)}function Nr(t){Vo.call(this,t)}function bet(t){j2t.call(this,t,0)}function wet(){Wvt.call(this,12,3)}function nbt(){nbt=Z,rEt=new pt}function oHt(){oHt=Z,nEt=new _}function SR(){SR=Z,cS=new mt}function cHt(){cHt=Z,Bge=new ft}function uHt(){throw it(new Or)}function rbt(){throw it(new Or)}function lHt(){throw it(new Or)}function CKe(){throw it(new Or)}function _Ke(){throw it(new Or)}function SKe(){throw it(new Or)}function vet(){this.a=Br(Lr(Ya))}function Ax(t){gd(),this.a=Lr(t)}function hHt(t,e){t.Td(e),e.Sd(t)}function AKe(t,e){t.a.ec().Mc(e)}function LKe(t,e,n){t.c.lf(e,n)}function ibt(t){yo.call(this,t)}function ld(t){Fn.call(this,t)}function Ag(){yx.call(this,"")}function $C(){yx.call(this,"")}function Mp(){yx.call(this,"")}function Im(){yx.call(this,"")}function sbt(t){yo.call(this,t)}function s8(t){T.call(this,t)}function met(t){Ej.call(this,t)}function fHt(t){s8.call(this,t)}function dHt(){xC.call(this,null)}function gHt(){xC.call(this,null)}function AR(){AR=Z,I8()}function pHt(){pHt=Z,Wge=u0n()}function bHt(t){return t.a?t.b:0}function MKe(t){return t.a?t.b:0}function DKe(t,e){return t.a-e.a}function IKe(t,e){return t.a-e.a}function OKe(t,e){return t.a-e.a}function LR(t,e){return Bmt(t,e)}function ct(t,e){return NQt(t,e)}function PKe(t,e){return e in t.a}function wHt(t,e){return t.f=e,t}function FKe(t,e){return t.b=e,t}function vHt(t,e){return t.c=e,t}function NKe(t,e){return t.g=e,t}function abt(t,e){return t.a=e,t}function obt(t,e){return t.f=e,t}function BKe(t,e){return t.k=e,t}function cbt(t,e){return t.a=e,t}function RKe(t,e){return t.e=e,t}function ubt(t,e){return t.e=e,t}function jKe(t,e){return t.f=e,t}function $Ke(t,e){t.b=!0,t.d=e}function zKe(t,e){t.b=new xo(e)}function qKe(t,e,n){e.td(t.a[n])}function HKe(t,e,n){e.we(t.a[n])}function VKe(t,e){return t.b-e.b}function GKe(t,e){return t.g-e.g}function UKe(t,e){return t.s-e.s}function WKe(t,e){return t?0:e-1}function mHt(t,e){return t?0:e-1}function YKe(t,e){return t?e-1:0}function KKe(t,e){return e.Yf(t)}function Ew(t,e){return t.b=e,t}function MR(t,e){return t.a=e,t}function Tw(t,e){return t.c=e,t}function Cw(t,e){return t.d=e,t}function _w(t,e){return t.e=e,t}function lbt(t,e){return t.f=e,t}function zC(t,e){return t.a=e,t}function a8(t,e){return t.b=e,t}function o8(t,e){return t.c=e,t}function Ze(t,e){return t.c=e,t}function kn(t,e){return t.b=e,t}function Je(t,e){return t.d=e,t}function tn(t,e){return t.e=e,t}function XKe(t,e){return t.f=e,t}function en(t,e){return t.g=e,t}function nn(t,e){return t.a=e,t}function rn(t,e){return t.i=e,t}function sn(t,e){return t.j=e,t}function yHt(t,e){return t.k=e,t}function QKe(t,e){return t.j=e,t}function ZKe(t,e){nb(),Uo(e,t)}function JKe(t,e,n){Wen(t.a,e,n)}function xHt(t){RXt.call(this,t)}function hbt(t){RXt.call(this,t)}function DR(t){Snt.call(this,t)}function kHt(t){bhn.call(this,t)}function Dp(t){Qw.call(this,t)}function EHt(t){prt.call(this,t)}function THt(t){prt.call(this,t)}function CHt(){b2t.call(this,"")}function Ca(){this.a=0,this.b=0}function _Ht(){this.b=0,this.a=0}function SHt(t,e){t.b=0,ry(t,e)}function tXe(t,e){t.c=e,t.b=!0}function AHt(t,e){return t.c._b(e)}function Vf(t){return t.e&&t.e()}function yet(t){return t?t.d:null}function LHt(t,e){return eie(t.b,e)}function eXe(t){return t?t.g:null}function nXe(t){return t?t.i:null}function Ip(t){return P0(t),t.o}function Sw(){Sw=Z,G4e=ydn()}function MHt(){MHt=Z,na=I0n()}function c8(){c8=Z,aLt=kdn()}function DHt(){DHt=Z,L5e=xdn()}function fbt(){fbt=Z,pc=wpn()}function dbt(){dbt=Z,Ab=K8()}function IHt(){throw it(new Or)}function OHt(){throw it(new Or)}function PHt(){throw it(new Or)}function FHt(){throw it(new Or)}function NHt(){throw it(new Or)}function BHt(){throw it(new Or)}function IR(t){this.a=new Lx(t)}function gbt(t){Ihe(),_xn(this,t)}function Op(t){this.a=new Ynt(t)}function j3(t,e){for(;t.ye(e););}function pbt(t,e){for(;t.sd(e););}function $3(t,e){return t.a+=e,t}function xet(t,e){return t.a+=e,t}function Lg(t,e){return t.a+=e,t}function Aw(t,e){return t.a+=e,t}function qC(t){return Vp(t),t.a}function OR(t){return t.b!=t.d.c}function RHt(t){return t.l|t.m<<22}function bbt(t,e){return t.d[e.p]}function jHt(t,e){return avn(t,e)}function wbt(t,e,n){t.splice(e,n)}function $Ht(t){t.c?Eue(t):Tue(t)}function PR(t){this.a=0,this.b=t}function zHt(){this.a=new vI(m_t)}function qHt(){this.b=new vI(s_t)}function HHt(){this.b=new vI(Zht)}function VHt(){this.b=new vI(Zht)}function GHt(){throw it(new Or)}function UHt(){throw it(new Or)}function WHt(){throw it(new Or)}function YHt(){throw it(new Or)}function KHt(){throw it(new Or)}function XHt(){throw it(new Or)}function QHt(){throw it(new Or)}function ZHt(){throw it(new Or)}function JHt(){throw it(new Or)}function tVt(){throw it(new Or)}function rXe(){throw it(new lc)}function iXe(){throw it(new lc)}function bM(t){this.a=new eVt(t)}function eVt(t){pcn(this,t,p0n())}function wM(t){return!t||kXt(t)}function vM(t){return Y1[t]!=-1}function sXe(){ZH!=0&&(ZH=0),JH=-1}function nVt(){Tut==null&&(Tut=[])}function aXe(t,e){tat(Wt(t.a),e)}function oXe(t,e){tat(Wt(t.a),e)}function mM(t,e){K3.call(this,t,e)}function u8(t,e){mM.call(this,t,e)}function vbt(t,e){this.b=t,this.c=e}function rVt(t,e){this.b=t,this.a=e}function iVt(t,e){this.a=t,this.b=e}function sVt(t,e){this.a=t,this.b=e}function aVt(t,e){this.a=t,this.b=e}function oVt(t,e){this.a=t,this.b=e}function cVt(t,e){this.a=t,this.b=e}function uVt(t,e){this.a=t,this.b=e}function lVt(t,e){this.a=t,this.b=e}function hVt(t,e){this.a=t,this.b=e}function fVt(t,e){this.b=t,this.a=e}function dVt(t,e){this.b=t,this.a=e}function gVt(t,e){this.b=t,this.a=e}function pVt(t,e){this.b=t,this.a=e}function Vr(t,e){this.f=t,this.g=e}function l8(t,e){this.e=t,this.d=e}function Lw(t,e){this.g=t,this.i=e}function ket(t,e){this.a=t,this.b=e}function bVt(t,e){this.a=t,this.f=e}function wVt(t,e){this.b=t,this.c=e}function cXe(t,e){this.a=t,this.b=e}function vVt(t,e){this.a=t,this.b=e}function Eet(t,e){this.a=t,this.b=e}function mVt(t){A2t(t.dc()),this.c=t}function FR(t){this.b=u(Lr(t),83)}function yVt(t){this.a=u(Lr(t),83)}function Om(t){this.a=u(Lr(t),15)}function xVt(t){this.a=u(Lr(t),15)}function NR(t){this.b=u(Lr(t),47)}function BR(){this.q=new b.Date}function Gd(){Gd=Z,vEt=new Ct}function h8(){h8=Z,a7=new Ot}function HC(t){return t.f.c+t.g.c}function yM(t,e){return t.b.Hc(e)}function kVt(t,e){return t.b.Ic(e)}function EVt(t,e){return t.b.Qc(e)}function TVt(t,e){return t.b.Hc(e)}function CVt(t,e){return t.c.uc(e)}function I0(t,e){return t.a._b(e)}function _Vt(t,e){return yi(t.c,e)}function SVt(t,e){return Tl(t.b,e)}function AVt(t,e){return t>e&&e0}function Cet(t,e){return yc(t,e)<0}function KC(t,e){return t.a.get(e)}function xXe(t,e){return e.split(t)}function WVt(t,e){return Tl(t.e,e)}function _bt(t){return On(t),!1}function WR(t){_n.call(this,t,21)}function kXe(t,e){TQt.call(this,t,e)}function YR(t,e){Vr.call(this,t,e)}function _et(t,e){Vr.call(this,t,e)}function Sbt(t){ort(),CYt.call(this,t)}function Abt(t,e){AKt(t,t.length,e)}function CM(t,e){rXt(t,t.length,e)}function EXe(t,e,n){e.ud(t.a.Ge(n))}function TXe(t,e,n){e.we(t.a.Fe(n))}function CXe(t,e,n){e.td(t.a.Kb(n))}function _Xe(t,e,n){t.Mb(n)&&e.td(n)}function XC(t,e,n){t.splice(e,0,n)}function SXe(t,e){return Nu(t.e,e)}function KR(t,e){this.d=t,this.e=e}function YVt(t,e){this.b=t,this.a=e}function KVt(t,e){this.b=t,this.a=e}function Lbt(t,e){this.b=t,this.a=e}function XVt(t,e){this.a=t,this.b=e}function QVt(t,e){this.a=t,this.b=e}function ZVt(t,e){this.a=t,this.b=e}function JVt(t,e){this.a=t,this.b=e}function Dx(t,e){this.a=t,this.b=e}function Mbt(t,e){this.b=t,this.a=e}function Dbt(t,e){this.b=t,this.a=e}function XR(t,e){Vr.call(this,t,e)}function QR(t,e){Vr.call(this,t,e)}function Ibt(t,e){Vr.call(this,t,e)}function Obt(t,e){Vr.call(this,t,e)}function z3(t,e){Vr.call(this,t,e)}function Aet(t,e){Vr.call(this,t,e)}function Let(t,e){Vr.call(this,t,e)}function Met(t,e){Vr.call(this,t,e)}function ZR(t,e){Vr.call(this,t,e)}function Pbt(t,e){Vr.call(this,t,e)}function Det(t,e){Vr.call(this,t,e)}function _M(t,e){Vr.call(this,t,e)}function JR(t,e){Vr.call(this,t,e)}function Iet(t,e){Vr.call(this,t,e)}function QC(t,e){Vr.call(this,t,e)}function Fbt(t,e){Vr.call(this,t,e)}function ms(t,e){Vr.call(this,t,e)}function tj(t,e){Vr.call(this,t,e)}function tGt(t,e){this.a=t,this.b=e}function eGt(t,e){this.a=t,this.b=e}function nGt(t,e){this.a=t,this.b=e}function rGt(t,e){this.a=t,this.b=e}function iGt(t,e){this.a=t,this.b=e}function sGt(t,e){this.a=t,this.b=e}function aGt(t,e){this.a=t,this.b=e}function oGt(t,e){this.a=t,this.b=e}function cGt(t,e){this.a=t,this.b=e}function Nbt(t,e){this.b=t,this.a=e}function uGt(t,e){this.b=t,this.a=e}function lGt(t,e){this.b=t,this.a=e}function hGt(t,e){this.b=t,this.a=e}function g8(t,e){this.c=t,this.d=e}function fGt(t,e){this.e=t,this.d=e}function dGt(t,e){this.a=t,this.b=e}function gGt(t,e){this.b=e,this.c=t}function ej(t,e){Vr.call(this,t,e)}function SM(t,e){Vr.call(this,t,e)}function Oet(t,e){Vr.call(this,t,e)}function ZC(t,e){Vr.call(this,t,e)}function Bbt(t,e){Vr.call(this,t,e)}function Pet(t,e){Vr.call(this,t,e)}function Fet(t,e){Vr.call(this,t,e)}function AM(t,e){Vr.call(this,t,e)}function Rbt(t,e){Vr.call(this,t,e)}function Net(t,e){Vr.call(this,t,e)}function JC(t,e){Vr.call(this,t,e)}function jbt(t,e){Vr.call(this,t,e)}function t9(t,e){Vr.call(this,t,e)}function e9(t,e){Vr.call(this,t,e)}function Fm(t,e){Vr.call(this,t,e)}function Bet(t,e){Vr.call(this,t,e)}function Ret(t,e){Vr.call(this,t,e)}function $bt(t,e){Vr.call(this,t,e)}function n9(t,e){Vr.call(this,t,e)}function jet(t,e){Vr.call(this,t,e)}function nj(t,e){Vr.call(this,t,e)}function LM(t,e){Vr.call(this,t,e)}function MM(t,e){Vr.call(this,t,e)}function Ix(t,e){Vr.call(this,t,e)}function $et(t,e){Vr.call(this,t,e)}function zbt(t,e){Vr.call(this,t,e)}function zet(t,e){Vr.call(this,t,e)}function qet(t,e){Vr.call(this,t,e)}function qbt(t,e){Vr.call(this,t,e)}function Het(t,e){Vr.call(this,t,e)}function Vet(t,e){Vr.call(this,t,e)}function Get(t,e){Vr.call(this,t,e)}function Uet(t,e){Vr.call(this,t,e)}function Hbt(t,e){Vr.call(this,t,e)}function pGt(t,e){this.b=t,this.a=e}function bGt(t,e){this.a=t,this.b=e}function wGt(t,e){this.a=t,this.b=e}function vGt(t,e){this.a=t,this.b=e}function mGt(t,e){this.a=t,this.b=e}function Vbt(t,e){Vr.call(this,t,e)}function Gbt(t,e){Vr.call(this,t,e)}function yGt(t,e){this.b=t,this.d=e}function Ubt(t,e){Vr.call(this,t,e)}function Wbt(t,e){Vr.call(this,t,e)}function xGt(t,e){this.a=t,this.b=e}function kGt(t,e){this.a=t,this.b=e}function rj(t,e){Vr.call(this,t,e)}function r9(t,e){Vr.call(this,t,e)}function Ybt(t,e){Vr.call(this,t,e)}function Kbt(t,e){Vr.call(this,t,e)}function Xbt(t,e){Vr.call(this,t,e)}function Wet(t,e){Vr.call(this,t,e)}function Qbt(t,e){Vr.call(this,t,e)}function Yet(t,e){Vr.call(this,t,e)}function ij(t,e){Vr.call(this,t,e)}function Ket(t,e){Vr.call(this,t,e)}function Xet(t,e){Vr.call(this,t,e)}function DM(t,e){Vr.call(this,t,e)}function Qet(t,e){Vr.call(this,t,e)}function Zbt(t,e){Vr.call(this,t,e)}function IM(t,e){Vr.call(this,t,e)}function Jbt(t,e){Vr.call(this,t,e)}function AXe(t,e){return Nu(t.c,e)}function LXe(t,e){return Nu(e.b,t)}function MXe(t,e){return-t.b.Je(e)}function t2t(t,e){return Nu(t.g,e)}function OM(t,e){Vr.call(this,t,e)}function Ox(t,e){Vr.call(this,t,e)}function EGt(t,e){this.a=t,this.b=e}function TGt(t,e){this.a=t,this.b=e}function $e(t,e){this.a=t,this.b=e}function i9(t,e){Vr.call(this,t,e)}function s9(t,e){Vr.call(this,t,e)}function PM(t,e){Vr.call(this,t,e)}function Zet(t,e){Vr.call(this,t,e)}function sj(t,e){Vr.call(this,t,e)}function a9(t,e){Vr.call(this,t,e)}function Jet(t,e){Vr.call(this,t,e)}function aj(t,e){Vr.call(this,t,e)}function q3(t,e){Vr.call(this,t,e)}function FM(t,e){Vr.call(this,t,e)}function o9(t,e){Vr.call(this,t,e)}function c9(t,e){Vr.call(this,t,e)}function NM(t,e){Vr.call(this,t,e)}function oj(t,e){Vr.call(this,t,e)}function H3(t,e){Vr.call(this,t,e)}function cj(t,e){Vr.call(this,t,e)}function CGt(t,e){this.a=t,this.b=e}function _Gt(t,e){this.a=t,this.b=e}function SGt(t,e){this.a=t,this.b=e}function AGt(t,e){this.a=t,this.b=e}function LGt(t,e){this.a=t,this.b=e}function MGt(t,e){this.a=t,this.b=e}function fa(t,e){this.a=t,this.b=e}function uj(t,e){Vr.call(this,t,e)}function DGt(t,e){this.a=t,this.b=e}function IGt(t,e){this.a=t,this.b=e}function OGt(t,e){this.a=t,this.b=e}function PGt(t,e){this.a=t,this.b=e}function FGt(t,e){this.a=t,this.b=e}function NGt(t,e){this.a=t,this.b=e}function BGt(t,e){this.b=t,this.a=e}function RGt(t,e){this.b=t,this.a=e}function jGt(t,e){this.b=t,this.a=e}function $Gt(t,e){this.b=t,this.a=e}function zGt(t,e){this.a=t,this.b=e}function qGt(t,e){this.a=t,this.b=e}function DXe(t,e){own(t.a,u(e,56))}function HGt(t,e){mon(t.a,u(e,11))}function IXe(t,e){return k8(),e!=t}function VGt(){return pHt(),new Wge}function GGt(){_rt(),this.b=new Hs}function UGt(){kq(),this.a=new Hs}function WGt(){Uvt(),evt.call(this)}function Px(t,e){Vr.call(this,t,e)}function YGt(t,e){this.a=t,this.b=e}function KGt(t,e){this.a=t,this.b=e}function lj(t,e){this.a=t,this.b=e}function XGt(t,e){this.a=t,this.b=e}function QGt(t,e){this.a=t,this.b=e}function ZGt(t,e){this.a=t,this.b=e}function JGt(t,e){this.d=t,this.b=e}function e2t(t,e){this.d=t,this.e=e}function tUt(t,e){this.f=t,this.c=e}function BM(t,e){this.b=t,this.c=e}function n2t(t,e){this.i=t,this.g=e}function eUt(t,e){this.e=t,this.a=e}function nUt(t,e){this.a=t,this.b=e}function r2t(t,e){t.i=null,fz(t,e)}function OXe(t,e){t&&ki(dP,t,e)}function rUt(t,e){return ist(t.a,e)}function hj(t){return XD(t.c,t.b)}function ec(t){return t?t.dd():null}function Vt(t){return t??null}function Nm(t){return typeof t===b6}function Bm(t){return typeof t===Nxt}function ra(t){return typeof t===Vat}function Np(t,e){return t.Hd().Xb(e)}function fj(t,e){return Kcn(t.Kc(),e)}function Dw(t,e){return yc(t,e)==0}function PXe(t,e){return yc(t,e)>=0}function u9(t,e){return yc(t,e)!=0}function FXe(t){return""+(On(t),t)}function RM(t,e){return t.substr(e)}function iUt(t){return cl(t),t.d.gc()}function tnt(t){return Dbn(t,t.c),t}function dj(t){return k9(t==null),t}function l9(t,e){return t.a+=""+e,t}function go(t,e){return t.a+=""+e,t}function h9(t,e){return t.a+=""+e,t}function hc(t,e){return t.a+=""+e,t}function Gr(t,e){return t.a+=""+e,t}function i2t(t,e){return t.a+=""+e,t}function sUt(t,e){fs(t,e,t.a,t.a.a)}function Zb(t,e){fs(t,e,t.c.b,t.c)}function NXe(t,e,n){gae(e,Wst(t,n))}function BXe(t,e,n){gae(e,Wst(t,n))}function RXe(t,e){Mon(new nr(t),e)}function aUt(t,e){t.q.setTime(Yw(e))}function oUt(t,e){lvt.call(this,t,e)}function cUt(t,e){lvt.call(this,t,e)}function ent(t,e){lvt.call(this,t,e)}function uUt(t){Xu(this),Y9(this,t)}function s2t(t){return An(t,0),null}function Gf(t){return t.a=0,t.b=0,t}function lUt(t,e){return t.a=e.g+1,t}function jXe(t,e){return t.j[e.p]==2}function a2t(t){return xnn(u(t,79))}function hUt(){hUt=Z,zpe=Wr(lst())}function fUt(){fUt=Z,i2e=Wr(Yce())}function dUt(){this.b=new Lx(ty(12))}function gUt(){this.b=0,this.a=!1}function pUt(){this.b=0,this.a=!1}function f9(t){this.a=t,pC.call(this)}function bUt(t){this.a=t,pC.call(this)}function mn(t,e){Ps.call(this,t,e)}function nnt(t,e){qm.call(this,t,e)}function V3(t,e){n2t.call(this,t,e)}function rnt(t,e){tE.call(this,t,e)}function wUt(t,e){jM.call(this,t,e)}function ii(t,e){GR(),ki(dU,t,e)}function int(t,e){return Pl(t.a,0,e)}function vUt(t,e){return t.a.a.a.cc(e)}function mUt(t,e){return Vt(t)===Vt(e)}function $Xe(t,e){return Ms(t.a,e.a)}function zXe(t,e){return pu(t.a,e.a)}function qXe(t,e){return tXt(t.a,e.a)}function hd(t,e){return t.indexOf(e)}function Iw(t,e){return t==e?0:t?1:-1}function gj(t){return t<10?"0"+t:""+t}function HXe(t){return Lr(t),new f9(t)}function yUt(t){return iu(t.l,t.m,t.h)}function p8(t){return ps((On(t),t))}function VXe(t){return ps((On(t),t))}function xUt(t,e){return pu(t.g,e.g)}function Bo(t){return typeof t===Nxt}function GXe(t){return t==Lv||t==Fy}function UXe(t){return t==Lv||t==Py}function o2t(t){return Ro(t.b.b,t,0)}function kUt(t){this.a=VGt(),this.b=t}function EUt(t){this.a=VGt(),this.b=t}function WXe(t,e){return le(t.a,e),e}function YXe(t,e){return le(t.c,e),t}function TUt(t,e){return $l(t.a,e),t}function KXe(t,e){return df(),e.a+=t}function XXe(t,e){return df(),e.a+=t}function QXe(t,e){return df(),e.c+=t}function c2t(t,e){$8(t,0,t.length,e)}function O0(){kt.call(this,new a2)}function CUt(){Wj.call(this,0,0,0,0)}function Fx(){ah.call(this,0,0,0,0)}function xo(t){this.a=t.a,this.b=t.b}function Bp(t){return t==zh||t==Cf}function b8(t){return t==rg||t==ng}function _Ut(t){return t==n5||t==e5}function G3(t){return t!=G1&&t!=Tb}function xl(t){return t.Lg()&&t.Mg()}function SUt(t){return u$(u(t,118))}function pj(t){return $l(new Vs,t)}function AUt(t,e){return new tE(e,t)}function ZXe(t,e){return new tE(e,t)}function u2t(t,e,n){iz(t,e),sz(t,n)}function bj(t,e,n){tv(t,e),Jw(t,n)}function x1(t,e,n){ku(t,e),Eu(t,n)}function wj(t,e,n){V8(t,e),U8(t,n)}function vj(t,e,n){G8(t,e),W8(t,n)}function snt(t,e){aE(t,e),Y8(t,t.D)}function l2t(t){tUt.call(this,t,!0)}function LUt(t,e,n){J2t.call(this,t,e,n)}function Rp(t){rb(),Jcn.call(this,t)}function MUt(){YR.call(this,"Head",1)}function DUt(){YR.call(this,"Tail",3)}function ant(t){t.c=Nt(Qn,De,1,0,5,1)}function IUt(t){t.a=Nt(Qn,De,1,8,5,1)}function OUt(t){xu(t.xf(),new ur(t))}function U3(t){return t!=null?Hi(t):0}function JXe(t,e){return ey(e,T1(t))}function tQe(t,e){return ey(e,T1(t))}function eQe(t,e){return t[t.length]=e}function nQe(t,e){return t[t.length]=e}function h2t(t){return een(t.b.Kc(),t.a)}function rQe(t,e){return hz(srt(t.d),e)}function iQe(t,e){return hz(srt(t.g),e)}function sQe(t,e){return hz(srt(t.j),e)}function eo(t,e){Ps.call(this,t.b,e)}function Ow(t){Wj.call(this,t,t,t,t)}function f2t(t){return t.b&&Sat(t),t.a}function d2t(t){return t.b&&Sat(t),t.c}function aQe(t,e){$1||(t.b=e)}function ont(t,e,n){return ts(t,e,n),n}function PUt(t,e,n){ts(t.c[e.g],e.g,n)}function oQe(t,e,n){u(t.c,69).Xh(e,n)}function cQe(t,e,n){x1(n,n.i+t,n.j+e)}function uQe(t,e){Dr(Lc(t.a),YQt(e))}function lQe(t,e){Dr(al(t.a),KQt(e))}function d9(t){gi(),yw.call(this,t)}function hQe(t){return t==null?0:Hi(t)}function FUt(){FUt=Z,Dht=new i_(_ft)}function Pr(){Pr=Z,new NUt,new he}function NUt(){new _r,new _r,new _r}function g2t(){g2t=Z,Ipt(),iEt=new _r}function k1(){k1=Z,b.Math.log(2)}function ih(){ih=Z,p0=(qVt(),Q4e)}function fQe(){throw it(new Sg(kge))}function dQe(){throw it(new Sg(kge))}function gQe(){throw it(new Sg(Ege))}function pQe(){throw it(new Sg(Ege))}function BUt(t){this.a=t,Iwt.call(this,t)}function cnt(t){this.a=t,FR.call(this,t)}function unt(t){this.a=t,FR.call(this,t)}function Zs(t,e){$nt(t.c,t.c.length,e)}function Go(t){return t.ae?1:0}function jUt(t,e){return yc(t,e)>0?t:e}function iu(t,e,n){return{l:t,m:e,h:n}}function bQe(t,e){t.a!=null&&HGt(e,t.a)}function $Ut(t){t.a=new xt,t.c=new xt}function mj(t){this.b=t,this.a=new he}function zUt(t){this.b=new Ce,this.a=t}function b2t(t){cwt.call(this),this.a=t}function qUt(){YR.call(this,"Range",2)}function HUt(){l4t(),this.a=new vI(I7t)}function wQe(t,e){Lr(e),Q3(t).Jc(new st)}function vQe(t,e){return Fl(),e.n.b+=t}function mQe(t,e,n){return ki(t.g,n,e)}function yQe(t,e,n){return ki(t.k,n,e)}function xQe(t,e){return ki(t.a,e.a,e)}function W3(t,e,n){return M3t(e,n,t.c)}function w2t(t){return new $e(t.c,t.d)}function kQe(t){return new $e(t.c,t.d)}function nc(t){return new $e(t.a,t.b)}function VUt(t,e){return G4n(t.a,e,null)}function EQe(t){Oa(t,null),oa(t,null)}function GUt(t){Art(t,null),Lrt(t,null)}function UUt(){jM.call(this,null,null)}function WUt(){Sj.call(this,null,null)}function v2t(t){this.a=t,_r.call(this)}function TQe(t){this.b=(wn(),new q(t))}function yj(t){t.j=Nt(wEt,ee,310,0,0,1)}function CQe(t,e,n){t.c.Vc(e,u(n,133))}function _Qe(t,e,n){t.c.ji(e,u(n,133))}function YUt(t,e){xr(t),t.Gc(u(e,15))}function g9(t,e){return o4n(t.c,t.b,e)}function SQe(t,e){return new bWt(t.Kc(),e)}function lnt(t,e){return _un(t.Kc(),e)!=-1}function m2t(t,e){return t.a.Bc(e)!=null}function xj(t){return t.Ob()?t.Pb():null}function KUt(t){return Mh(t,0,t.length)}function _t(t,e){return t!=null&&gst(t,e)}function AQe(t,e){t.q.setHours(e),E_(t,e)}function XUt(t,e){t.c&&(Hwt(e),kQt(e))}function LQe(t,e,n){u(t.Kb(n),164).Nb(e)}function MQe(t,e,n){return R4n(t,e,n),n}function QUt(t,e,n){t.a=e^1502,t.b=n^Eot}function hnt(t,e,n){return t.a[e.g][n.g]}function E1(t,e){return t.a[e.c.p][e.p]}function DQe(t,e){return t.e[e.c.p][e.p]}function IQe(t,e){return t.c[e.c.p][e.p]}function OQe(t,e){return t.j[e.p]=q2n(e)}function PQe(t,e){return kmt(t.f,e.tg())}function FQe(t,e){return kmt(t.b,e.tg())}function NQe(t,e){return t.a0?e*e/t:e*e*100}function oZe(t,e){return t>0?e/(t*t):e*100}function cZe(t,e,n){return le(e,yie(t,n))}function uZe(t,e,n){V$(),t.Xe(e)&&n.td(t)}function m8(t,e,n){var r;r=t.Zc(e),r.Rb(n)}function jm(t,e,n){return t.a+=e,t.b+=n,t}function lZe(t,e,n){return t.a*=e,t.b*=n,t}function qM(t,e,n){return t.a-=e,t.b-=n,t}function H2t(t,e){return t.a=e.a,t.b=e.b,t}function Mj(t){return t.a=-t.a,t.b=-t.b,t}function AWt(t){this.c=t,this.a=1,this.b=1}function LWt(t){this.c=t,ku(t,0),Eu(t,0)}function MWt(t){Zi.call(this),V9(this,t)}function DWt(t){qat(),nqt(this),this.mf(t)}function IWt(t,e){YC(),jM.call(this,t,e)}function V2t(t,e){Mg(),Sj.call(this,t,e)}function OWt(t,e){Mg(),Sj.call(this,t,e)}function PWt(t,e){Mg(),V2t.call(this,t,e)}function kl(t,e,n){_l.call(this,t,e,n,2)}function vnt(t,e){ih(),Uj.call(this,t,e)}function FWt(t,e){ih(),vnt.call(this,t,e)}function G2t(t,e){ih(),vnt.call(this,t,e)}function NWt(t,e){ih(),G2t.call(this,t,e)}function U2t(t,e){ih(),Uj.call(this,t,e)}function BWt(t,e){ih(),U2t.call(this,t,e)}function RWt(t,e){ih(),Uj.call(this,t,e)}function hZe(t,e){return t.c.Fc(u(e,133))}function W2t(t,e,n){return Pq(TD(t,e),n)}function fZe(t,e,n){return e.Qk(t.e,t.c,n)}function dZe(t,e,n){return e.Rk(t.e,t.c,n)}function mnt(t,e){return Zp(t.e,u(e,49))}function gZe(t,e,n){n_(al(t.a),e,KQt(n))}function pZe(t,e,n){n_(Lc(t.a),e,YQt(n))}function Y2t(t,e){e.$modCount=t.$modCount}function m9(){m9=Z,HS=new Vi("root")}function y8(){y8=Z,pP=new Pqt,new Fqt}function jWt(){this.a=new Uw,this.b=new Uw}function K2t(){ine.call(this),this.Bb|=Ka}function $Wt(){Vr.call(this,"GROW_TREE",0)}function bZe(t){return t==null?null:P5n(t)}function wZe(t){return t==null?null:qgn(t)}function vZe(t){return t==null?null:$o(t)}function mZe(t){return t==null?null:$o(t)}function P0(t){t.o==null&&b2n(t)}function Re(t){return k9(t==null||Nm(t)),t}function ye(t){return k9(t==null||Bm(t)),t}function Br(t){return k9(t==null||ra(t)),t}function X2t(t){this.q=new b.Date(Yw(t))}function HM(t,e){this.c=t,l8.call(this,t,e)}function Dj(t,e){this.a=t,HM.call(this,t,e)}function yZe(t,e){this.d=t,ztt(this),this.b=e}function Q2t(t,e){Xrt.call(this,t),this.a=e}function Z2t(t,e){Xrt.call(this,t),this.a=e}function xZe(t){C3t.call(this,0,0),this.f=t}function J2t(t,e,n){q$.call(this,t,e,n,null)}function zWt(t,e,n){q$.call(this,t,e,n,null)}function kZe(t,e,n){return t.ue(e,n)<=0?n:e}function EZe(t,e,n){return t.ue(e,n)<=0?e:n}function TZe(t,e){return u(Xw(t.b,e),149)}function CZe(t,e){return u(Xw(t.c,e),229)}function ynt(t){return u(Ne(t.a,t.b),287)}function qWt(t){return new $e(t.c,t.d+t.a)}function HWt(t){return Fl(),_Ut(u(t,197))}function $m(){$m=Z,o7t=un((Al(),K2))}function _Ze(t,e){e.a?hvn(t,e):fnt(t.a,e.b)}function VWt(t,e){$1||le(t.a,e)}function SZe(t,e){return kM(),J8(e.d.i,t)}function AZe(t,e){return r6(),new Uue(e,t)}function dd(t,e){return sD(e,n6t),t.f=e,t}function twt(t,e,n){return n=Hl(t,e,3,n),n}function ewt(t,e,n){return n=Hl(t,e,6,n),n}function nwt(t,e,n){return n=Hl(t,e,9,n),n}function VM(t,e,n){++t.j,t.Ki(),Yrt(t,e,n)}function GWt(t,e,n){++t.j,t.Hi(e,t.oi(e,n))}function UWt(t,e,n){var r;r=t.Zc(e),r.Rb(n)}function WWt(t,e,n){return bxt(t.c,t.b,e,n)}function rwt(t,e){return(e&wi)%t.d.length}function Ps(t,e){Vi.call(this,t),this.a=e}function iwt(t,e){Cpt.call(this,t),this.a=e}function xnt(t,e){Cpt.call(this,t),this.a=e}function YWt(t,e){this.c=t,Qw.call(this,e)}function KWt(t,e){this.a=t,Xzt.call(this,e)}function GM(t,e){this.a=t,Xzt.call(this,e)}function XWt(t){this.a=(jl(t,ky),new Xc(t))}function QWt(t){this.a=(jl(t,ky),new Xc(t))}function UM(t){return!t.a&&(t.a=new at),t.a}function ZWt(t){return t>8?0:t+1}function LZe(t,e){return Nn(),t==e?0:t?1:-1}function swt(t,e,n){return zx(t,u(e,22),n)}function MZe(t,e,n){return t.apply(e,n)}function JWt(t,e,n){return t.a+=Mh(e,0,n),t}function awt(t,e){var n;return n=t.e,t.e=e,n}function DZe(t,e){var n;n=t[kot],n.call(t,e)}function IZe(t,e){var n;n=t[kot],n.call(t,e)}function zm(t,e){t.a.Vc(t.b,e),++t.b,t.c=-1}function tYt(t){Xu(t.e),t.d.b=t.d,t.d.a=t.d}function WM(t){t.b?WM(t.b):t.f.c.zc(t.e,t.d)}function OZe(t,e,n){Qb(),Att(t,e.Ce(t.a,n))}function PZe(t,e){return yet(Nie(t.a,e,!0))}function FZe(t,e){return yet(Bie(t.a,e,!0))}function ff(t,e){return LR(new Array(e),t)}function knt(t){return String.fromCharCode(t)}function NZe(t){return t==null?null:t.message}function eYt(){this.a=new he,this.b=new he}function nYt(){this.a=new H5,this.b=new hqt}function rYt(){this.b=new Ca,this.c=new he}function owt(){this.d=new Ca,this.e=new Ca}function cwt(){this.n=new Ca,this.o=new Ca}function Ij(){this.n=new Cx,this.i=new Fx}function iYt(){this.a=new XJ,this.b=new ZX}function sYt(){this.a=new he,this.d=new he}function aYt(){this.b=new Hs,this.a=new Hs}function oYt(){this.b=new _r,this.a=new _r}function cYt(){this.b=new qHt,this.a=new GQ}function uYt(){Ij.call(this),this.a=new Ca}function y9(t){oun.call(this,t,(U$(),jut))}function uwt(t,e,n,r){Wj.call(this,t,e,n,r)}function BZe(t,e,n){n!=null&&uz(e,Cst(t,n))}function RZe(t,e,n){n!=null&&lz(e,Cst(t,n))}function lwt(t,e,n){return n=Hl(t,e,11,n),n}function Li(t,e){return t.a+=e.a,t.b+=e.b,t}function ia(t,e){return t.a-=e.a,t.b-=e.b,t}function jZe(t,e){return t.n.a=(On(e),e+10)}function $Ze(t,e){return t.n.a=(On(e),e+10)}function zZe(t,e){return e==t||yE(mq(e),t)}function lYt(t,e){return ki(t.a,e,"")==null}function qZe(t,e){return kM(),!J8(e.d.i,t)}function HZe(t,e){Bp(t.f)?a2n(t,e):V0n(t,e)}function VZe(t,e){var n;return n=e.Hh(t.a),n}function qm(t,e){yo.call(this,J_+t+D2+e)}function Rx(t,e,n,r){fe.call(this,t,e,n,r)}function hwt(t,e,n,r){fe.call(this,t,e,n,r)}function hYt(t,e,n,r){hwt.call(this,t,e,n,r)}function fYt(t,e,n,r){r$.call(this,t,e,n,r)}function Ent(t,e,n,r){r$.call(this,t,e,n,r)}function fwt(t,e,n,r){r$.call(this,t,e,n,r)}function dYt(t,e,n,r){Ent.call(this,t,e,n,r)}function dwt(t,e,n,r){Ent.call(this,t,e,n,r)}function Cn(t,e,n,r){fwt.call(this,t,e,n,r)}function gYt(t,e,n,r){dwt.call(this,t,e,n,r)}function pYt(t,e,n,r){hvt.call(this,t,e,n,r)}function bYt(t,e,n){this.a=t,j2t.call(this,e,n)}function wYt(t,e,n){this.c=e,this.b=n,this.a=t}function GZe(t,e,n){return t.d=u(e.Kb(n),164)}function gwt(t,e){return t.Aj().Nh().Kh(t,e)}function pwt(t,e){return t.Aj().Nh().Ih(t,e)}function vYt(t,e){return On(t),Vt(t)===Vt(e)}function hn(t,e){return On(t),Vt(t)===Vt(e)}function Tnt(t,e){return yet(Nie(t.a,e,!1))}function Cnt(t,e){return yet(Bie(t.a,e,!1))}function UZe(t,e){return t.b.sd(new QVt(t,e))}function WZe(t,e){return t.b.sd(new ZVt(t,e))}function mYt(t,e){return t.b.sd(new JVt(t,e))}function bwt(t,e,n){return t.lastIndexOf(e,n)}function YZe(t,e,n){return Ms(t[e.b],t[n.b])}function KZe(t,e){return Jt(e,(Te(),DO),t)}function XZe(t,e){return pu(e.a.d.p,t.a.d.p)}function QZe(t,e){return pu(t.a.d.p,e.a.d.p)}function ZZe(t,e){return Ms(t.c-t.s,e.c-e.s)}function yYt(t){return t.c?Ro(t.c.a,t,0):-1}function JZe(t){return t<100?null:new Dp(t)}function jx(t){return t==Y2||t==g0||t==Gc}function xYt(t,e){return _t(e,15)&&Sue(t.c,e)}function tJe(t,e){$1||e&&(t.d=e)}function _nt(t,e){var n;return n=e,!!jyt(t,n)}function wwt(t,e){this.c=t,Jnt.call(this,t,e)}function kYt(t){this.c=t,ent.call(this,qq,0)}function EYt(t,e){sen.call(this,t,t.length,e)}function eJe(t,e,n){return u(t.c,69).lk(e,n)}function Oj(t,e,n){return u(t.c,69).mk(e,n)}function nJe(t,e,n){return fZe(t,u(e,332),n)}function vwt(t,e,n){return dZe(t,u(e,332),n)}function rJe(t,e,n){return xae(t,u(e,332),n)}function TYt(t,e,n){return egn(t,u(e,332),n)}function x9(t,e){return e==null?null:sy(t.b,e)}function mwt(t){return Bm(t)?(On(t),t):t.ke()}function Pj(t){return!isNaN(t)&&!isFinite(t)}function CYt(t){gd(),this.a=(wn(),new s8(t))}function YM(t){k8(),this.d=t,this.a=new B3}function sh(t,e,n){this.a=t,this.b=e,this.c=n}function _Yt(t,e,n){this.a=t,this.b=e,this.c=n}function SYt(t,e,n){this.d=t,this.b=n,this.a=e}function Snt(t){$Ut(this),Ah(this),Ua(this,t)}function Bu(t){ant(this),Pwt(this.c,0,t.Pc())}function AYt(t){Cl(t.a),Cte(t.c,t.b),t.b=null}function LYt(t){this.a=t,Gd(),Tu(Date.now())}function MYt(){MYt=Z,REt=new _,aV=new _}function Ant(){Ant=Z,LEt=new Ht,Yge=new Le}function DYt(){DYt=Z,n5e=Nt(Qn,De,1,0,5,1)}function IYt(){IYt=Z,y5e=Nt(Qn,De,1,0,5,1)}function ywt(){ywt=Z,x5e=Nt(Qn,De,1,0,5,1)}function gd(){gd=Z,new Apt((wn(),wn(),io))}function iJe(t){return U$(),Ur((Nte(),Qge),t)}function sJe(t){return O1(),Ur((ete(),rpe),t)}function aJe(t){return Gz(),Ur((cJt(),upe),t)}function oJe(t){return Q$(),Ur((uJt(),lpe),t)}function cJe(t){return Cq(),Ur((Kne(),hpe),t)}function uJe(t){return Kf(),Ur((ZJt(),gpe),t)}function lJe(t){return Qu(),Ur((JJt(),bpe),t)}function hJe(t){return yu(),Ur((tte(),vpe),t)}function fJe(t){return $q(),Ur((hUt(),zpe),t)}function dJe(t){return rv(),Ur((Rte(),Hpe),t)}function gJe(t){return u6(),Ur((jte(),Gpe),t)}function pJe(t){return c_(),Ur(($te(),Ype),t)}function bJe(t){return jR(),Ur(($Zt(),Kpe),t)}function wJe(t){return Z$(),Ur((lJt(),fbe),t)}function vJe(t){return q9(),Ur((nte(),Obe),t)}function mJe(t){return Wa(),Ur((bee(),Bbe),t)}function yJe(t){return nE(),Ur((Bte(),qbe),t)}function xJe(t){return iv(),Ur((rte(),Ybe),t)}function xwt(t,e){if(!t)throw it(new Fn(e))}function kJe(t){return Vn(),Ur((Bee(),Zbe),t)}function kwt(t){Wj.call(this,t.d,t.c,t.a,t.b)}function Lnt(t){Wj.call(this,t.d,t.c,t.a,t.b)}function Ewt(t,e,n){this.b=t,this.c=e,this.a=n}function Fj(t,e,n){this.b=t,this.a=e,this.c=n}function OYt(t,e,n){this.a=t,this.b=e,this.c=n}function Twt(t,e,n){this.a=t,this.b=e,this.c=n}function PYt(t,e,n){this.a=t,this.b=e,this.c=n}function Cwt(t,e,n){this.a=t,this.b=e,this.c=n}function FYt(t,e,n){this.b=t,this.a=e,this.c=n}function Nj(t,e,n){this.e=e,this.b=t,this.d=n}function EJe(t,e,n){return Qb(),t.a.Od(e,n),e}function Mnt(t){var e;return e=new Wu,e.e=t,e}function _wt(t){var e;return e=new vqt,e.b=t,e}function KM(){KM=Z,mV=new BK,yV=new RK}function df(){df=Z,f2e=new SX,d2e=new DN}function TJe(t){return Tz(),Ur((qte(),o2e),t)}function CJe(t){return I1(),Ur((Vte(),b2e),t)}function _Je(t){return Eq(),Ur((Rne(),T2e),t)}function SJe(t){return h6(),Ur(($ee(),C2e),t)}function AJe(t){return H$(),Ur((bJt(),_2e),t)}function LJe(t){return n6(),Ur((ite(),S2e),t)}function MJe(t){return b4(),Ur((hee(),v2e),t)}function DJe(t){return nv(),Ur((ote(),E2e),t)}function IJe(t){return oz(),Ur((ste(),A2e),t)}function OJe(t){return x2(),Ur((uee(),L2e),t)}function PJe(t){return LD(),Ur((fJt(),M2e),t)}function FJe(t){return d2(),Ur((ate(),I2e),t)}function NJe(t){return dq(),Ur((Vee(),O2e),t)}function BJe(t){return xD(),Ur((dJt(),P2e),t)}function RJe(t){return oI(),Ur((qee(),F2e),t)}function jJe(t){return kE(),Ur((zee(),N2e),t)}function $Je(t){return oo(),Ur((lre(),B2e),t)}function zJe(t){return eE(),Ur((ute(),R2e),t)}function qJe(t){return q0(),Ur((cte(),$2e),t)}function HJe(t){return I$(),Ur((wJt(),z2e),t)}function VJe(t){return dh(),Ur((fee(),q2e),t)}function GJe(t){return uq(),Ur((Hee(),rme),t)}function UJe(t){return Z9(),Ur((lte(),ime),t)}function WJe(t){return cy(),Ur((Gte(),sme),t)}function YJe(t){return so(),Ur((dte(),hme),t)}function KJe(t){return y4(),Ur((Bne(),ome),t)}function XJe(t){return V0(),Ur((fte(),cme),t)}function QJe(t){return CD(),Ur((pJt(),ume),t)}function ZJe(t){return yz(),Ur((hte(),fme),t)}function JJe(t){return u_(),Ur((lee(),ame),t)}function ttn(t){return pD(),Ur((gJt(),dme),t)}function etn(t){return cE(),Ur((pte(),gme),t)}function ntn(t){return vz(),Ur((bte(),pme),t)}function rtn(t){return Cz(),Ur((gte(),bme),t)}function itn(t){return ev(),Ur((wte(),Lme),t)}function stn(t){return $9(),Ur((mJt(),Pme),t)}function atn(t){return bd(),Ur((yJt(),zme),t)}function otn(t){return C1(),Ur((xJt(),Hme),t)}function ctn(t){return Uf(),Ur((vJt(),iye),t)}function utn(t){return Gw(),Ur((kJt(),hye),t)}function ltn(t){return wE(),Ur((zte(),fye),t)}function htn(t){return p_(),Ur((Gee(),gye),t)}function ftn(t){return T$(),Ur((CJt(),Aye),t)}function dtn(t){return pz(),Ur((TJt(),Pye),t)}function gtn(t){return A$(),Ur((EJt(),Lye),t)}function ptn(t){return Nz(),Ur((vte(),Nye),t)}function btn(t){return G$(),Ur((_Jt(),Bye),t)}function wtn(t){return HD(),Ur((mte(),Rye),t)}function vtn(t){return eq(),Ur((Hte(),Jye),t)}function mtn(t){return mz(),Ur((xte(),t3e),t)}function ytn(t){return Fz(),Ur((yte(),e3e),t)}function xtn(t){return AE(),Ur((pee(),x3e),t)}function ktn(t){return KD(),Ur((kte(),k3e),t)}function Etn(t){return zR(),Ur((RZt(),E3e),t)}function Ttn(t){return qR(),Ur((BZt(),C3e),t)}function Ctn(t){return bD(),Ur((AJt(),_3e),t)}function _tn(t){return uI(),Ur((dee(),S3e),t)}function Stn(t){return UC(),Ur((jZt(),H3e),t)}function Atn(t){return jD(),Ur((SJt(),V3e),t)}function Ltn(t){return Qf(),Ur((gee(),X3e),t)}function Mtn(t){return Ug(),Ur((jne(),Z3e),t)}function Dtn(t){return t0(),Ur((jee(),J3e),t)}function Itn(t){return hy(),Ur((Ree(),s4e),t)}function Otn(t){return ro(),Ur((fUt(),i2e),t)}function Ptn(t){return X8(),Ur((hJt(),r2e),t)}function Ftn(t){return ao(),Ur((wee(),y4e),t)}function Ntn(t){return M1(),Ur((Tte(),x4e),t)}function Btn(t){return W0(),Ur((Yte(),k4e),t)}function Rtn(t){return hq(),Ur((Wee(),E4e),t)}function jtn(t){return G0(),Ur((Ete(),C4e),t)}function $tn(t){return zl(),Ur((Wte(),S4e),t)}function ztn(t){return py(),Ur((Yne(),A4e),t)}function qtn(t){return l4(),Ur((vee(),L4e),t)}function Htn(t){return ua(),Ur((Oee(),M4e),t)}function Vtn(t){return Zu(),Ur((Uee(),D4e),t)}function Gtn(t){return Al(),Ur((Xte(),B4e),t)}function Utn(t){return ll(),Ur((hre(),R4e),t)}function Wtn(t){return ve(),Ur((mee(),I4e),t)}function Ytn(t){return jz(),Ur((Kte(),j4e),t)}function Ktn(t){return Sl(),Ur((Ute(),q4e),t)}function Xtn(t){return CE(),Ur(($ne(),e5e),t)}function Qtn(t,e){return On(t),t+(On(e),e)}function Ztn(t,e){return Gd(),Dr(Wt(t.a),e)}function Jtn(t,e){return Gd(),Dr(Wt(t.a),e)}function Dnt(t,e){this.c=t,this.a=e,this.b=e-t}function NYt(t,e,n){this.a=t,this.b=e,this.c=n}function Swt(t,e,n){this.a=t,this.b=e,this.c=n}function Awt(t,e,n){this.a=t,this.b=e,this.c=n}function BYt(t,e,n){this.a=t,this.b=e,this.c=n}function RYt(t,e,n){this.a=t,this.b=e,this.c=n}function Ig(t,e,n){this.e=t,this.a=e,this.c=n}function jYt(t,e,n){ih(),$vt.call(this,t,e,n)}function Int(t,e,n){ih(),Tvt.call(this,t,e,n)}function Lwt(t,e,n){ih(),Tvt.call(this,t,e,n)}function Mwt(t,e,n){ih(),Tvt.call(this,t,e,n)}function $Yt(t,e,n){ih(),Int.call(this,t,e,n)}function Dwt(t,e,n){ih(),Int.call(this,t,e,n)}function zYt(t,e,n){ih(),Dwt.call(this,t,e,n)}function qYt(t,e,n){ih(),Lwt.call(this,t,e,n)}function HYt(t,e,n){ih(),Mwt.call(this,t,e,n)}function XM(t,e){return Lr(t),Lr(e),new lVt(t,e)}function $x(t,e){return Lr(t),Lr(e),new nKt(t,e)}function ten(t,e){return Lr(t),Lr(e),new rKt(t,e)}function een(t,e){return Lr(t),Lr(e),new fVt(t,e)}function u(t,e){return k9(t==null||gst(t,e)),t}function x8(t){var e;return e=new he,oit(e,t),e}function nen(t){var e;return e=new Hs,oit(e,t),e}function VYt(t){var e;return e=new Bpt,xit(e,t),e}function QM(t){var e;return e=new Zi,xit(e,t),e}function ren(t){return!t.e&&(t.e=new he),t.e}function ien(t){return!t.c&&(t.c=new Tm),t.c}function le(t,e){return t.c[t.c.length]=e,!0}function GYt(t,e){this.c=t,this.b=e,this.a=!1}function Iwt(t){this.d=t,ztt(this),this.b=Xen(t.d)}function UYt(){this.a=";,;",this.b="",this.c=""}function sen(t,e,n){WKt.call(this,e,n),this.a=t}function WYt(t,e,n){this.b=t,oUt.call(this,e,n)}function Owt(t,e,n){this.c=t,KR.call(this,e,n)}function Pwt(t,e,n){n5t(n,0,t,e,n.length,!1)}function Wd(t,e,n,r,s){t.b=e,t.c=n,t.d=r,t.a=s}function aen(t,e){e&&(t.b=e,t.a=(Vp(e),e.a))}function Fwt(t,e,n,r,s){t.d=e,t.c=n,t.a=r,t.b=s}function Nwt(t){var e,n;e=t.b,n=t.c,t.b=n,t.c=e}function Bwt(t){var e,n;n=t.d,e=t.a,t.d=e,t.a=n}function Rwt(t){return Kp(fnn(Bo(t)?Lh(t):t))}function oen(t,e){return pu(uKt(t.d),uKt(e.d))}function cen(t,e){return e==(ve(),Bn)?t.c:t.d}function k8(){k8=Z,r_t=(ve(),Bn),CG=Hn}function YYt(){this.b=Xt(ye(Ie((Jf(),nlt))))}function KYt(t){return Qb(),Nt(Qn,De,1,t,5,1)}function uen(t){return new $e(t.c+t.b,t.d+t.a)}function len(t,e){return $R(),pu(t.d.p,e.d.p)}function Ont(t){return Zn(t.b!=0),lh(t,t.a.a)}function hen(t){return Zn(t.b!=0),lh(t,t.c.b)}function jwt(t,e){if(!t)throw it(new iHt(e))}function Bj(t,e){if(!t)throw it(new Fn(e))}function $wt(t,e,n){g8.call(this,t,e),this.b=n}function ZM(t,e,n){e2t.call(this,t,e),this.c=n}function XYt(t,e,n){See.call(this,e,n),this.d=t}function zwt(t){ywt(),Pk.call(this),this.th(t)}function QYt(t,e,n){this.a=t,V3.call(this,e,n)}function ZYt(t,e,n){this.a=t,V3.call(this,e,n)}function Rj(t,e,n){e2t.call(this,t,e),this.c=n}function JYt(){B8(),Mnn.call(this,(Pp(),Yh))}function tKt(t){return t!=null&&!tst(t,oA,cA)}function fen(t,e){return(uie(t)<<4|uie(e))&ys}function den(t,e){return c$(),kst(t,e),new SXt(t,e)}function Jb(t,e){var n;t.n&&(n=e,le(t.f,n))}function E8(t,e,n){var r;r=new Um(n),Yf(t,e,r)}function gen(t,e){var n;return n=t.c,syt(t,e),n}function qwt(t,e){return e<0?t.g=-1:t.g=e,t}function jj(t,e){return Zon(t),t.a*=e,t.b*=e,t}function eKt(t,e,n,r,s){t.c=e,t.d=n,t.b=r,t.a=s}function ri(t,e){return fs(t,e,t.c.b,t.c),!0}function Hwt(t){t.a.b=t.b,t.b.a=t.a,t.a=t.b=null}function Pnt(t){this.b=t,this.a=Rw(this.b.a).Ed()}function nKt(t,e){this.b=t,this.a=e,pC.call(this)}function rKt(t,e){this.a=t,this.b=e,pC.call(this)}function iKt(t,e){WKt.call(this,e,1040),this.a=t}function JM(t){return t==0||isNaN(t)?t:t<0?-1:1}function pen(t){return Ux(),e0(t)==es(tb(t))}function ben(t){return Ux(),tb(t)==es(e0(t))}function Bw(t,e){return d_(t,new g8(e.a,e.b))}function wen(t){return!Ga(t)&&t.c.i.c==t.d.i.c}function $j(t){var e;return e=t.n,t.a.b+e.d+e.a}function sKt(t){var e;return e=t.n,t.e.b+e.d+e.a}function Vwt(t){var e;return e=t.n,t.e.a+e.b+e.c}function aKt(t){return gi(),new Yd(0,t)}function ven(t){return t.a?t.a:grt(t)}function k9(t){if(!t)throw it(new i8(null))}function oKt(){oKt=Z,$ft=(wn(),new O(put))}function zj(){zj=Z,new z3t((oet(),Sut),(cet(),_ut))}function cKt(){cKt=Z,fEt=Nt(ja,ee,19,256,0,1)}function Fnt(t,e,n,r){b3t.call(this,t,e,n,r,0,0)}function men(t,e,n){return ki(t.b,u(n.b,17),e)}function yen(t,e,n){return ki(t.b,u(n.b,17),e)}function xen(t,e){return le(t,new $e(e.a,e.b))}function ken(t,e){return t.c=e)throw it(new Opt)}function inn(t,e,n){return ts(e,0,Ywt(e[0],n[0])),e}function snn(t,e,n){e.Ye(n,Xt(ye(tr(t.b,n)))*t.a)}function UKt(t,e,n){return k4(),Q8(t,e)&&Q8(t,n)}function S9(t){return Zu(),!t.Hc(sg)&&!t.Hc(Cb)}function e$(t){return new $e(t.c+t.b/2,t.d+t.a/2)}function Wnt(t,e){return e.kh()?Zp(t.b,u(e,49)):e}function lvt(t,e){this.e=t,this.d=e&64?e|md:e}function WKt(t,e){this.c=0,this.d=t,this.b=e|64|md}function n$(t){this.b=new Xc(11),this.a=(Z3(),t)}function Ynt(t){this.b=null,this.a=(Z3(),t||_Et)}function YKt(t){this.a=wse(t.a),this.b=new Bu(t.b)}function KKt(t){this.b=t,Nx.call(this,t),ZUt(this)}function XKt(t){this.b=t,$M.call(this,t),JUt(this)}function Gm(t,e,n){this.a=t,Rx.call(this,e,n,5,6)}function hvt(t,e,n,r){this.b=t,As.call(this,e,n,r)}function Js(t,e,n,r,s){Jrt.call(this,t,e,n,r,s,-1)}function A9(t,e,n,r,s){mD.call(this,t,e,n,r,s,-1)}function fe(t,e,n,r){As.call(this,t,e,n),this.b=r}function r$(t,e,n,r){ZM.call(this,t,e,n),this.b=r}function QKt(t){tUt.call(this,t,!1),this.a=!1}function ZKt(t,e){this.b=t,wtt.call(this,t.b),this.a=e}function JKt(t,e){Wm(),cXe.call(this,t,Dz(new yl(e)))}function i$(t,e){return gi(),new Cvt(t,e,0)}function Knt(t,e){return gi(),new Cvt(6,t,e)}function ann(t,e){return hn(t.substr(0,e.length),e)}function Tl(t,e){return ra(e)?wrt(t,e):!!Lo(t.f,e)}function ba(t,e){for(On(e);t.Ob();)e.td(t.Pb())}function X3(t,e,n){rb(),this.e=t,this.d=e,this.a=n}function Og(t,e,n,r){var s;s=t.i,s.i=e,s.a=n,s.b=r}function fvt(t){var e;for(e=t;e.f;)e=e.f;return e}function Hx(t){var e;return e=Q9(t),Zn(e!=null),e}function onn(t){var e;return e=Uln(t),Zn(e!=null),e}function C8(t,e){var n;return n=t.a.gc(),Emt(e,n),n-e}function dvt(t,e){var n;for(n=0;n0?b.Math.log(t/e):-100}function tXt(t,e){return yc(t,e)<0?-1:yc(t,e)>0?1:0}function vvt(t,e,n){return Gle(t,u(e,46),u(n,167))}function eXt(t,e){return u(cvt(Rw(t.a)).Xb(e),42).cd()}function bnn(t,e){return jon(e,t.length),new iKt(t,e)}function Jnt(t,e){this.d=t,nr.call(this,t),this.e=e}function jw(t){this.d=(On(t),t),this.a=0,this.c=qq}function mvt(t,e){yw.call(this,1),this.a=t,this.b=e}function nXt(t,e){return t.c?nXt(t.c,e):le(t.b,e),t}function wnn(t,e,n){var r;return r=Jm(t,e),Brt(t,e,n),r}function yvt(t,e){var n;return n=t.slice(0,e),Bmt(n,t)}function rXt(t,e,n){var r;for(r=0;r=t.g}function crt(t,e,n){var r;return r=mit(t,e,n),Y5t(t,r)}function Vx(t,e){var n;n=t.a.length,Jm(t,n),Brt(t,n,e)}function vXt(t,e){var n;n=console[t],n.call(console,e)}function mXt(t,e){var n;++t.j,n=t.Vi(),t.Ii(t.oi(n,e))}function Lnn(t,e,n){u(e.b,65),xu(e.a,new Swt(t,n,e))}function Tvt(t,e,n){vR.call(this,e),this.a=t,this.b=n}function Cvt(t,e,n){yw.call(this,t),this.a=e,this.b=n}function _vt(t,e,n){this.a=t,Cpt.call(this,e),this.b=n}function yXt(t,e,n){this.a=t,nmt.call(this,8,e,null,n)}function Mnn(t){this.a=(On(Yr),Yr),this.b=t,new Upt}function xXt(t){this.c=t,this.b=this.c.a,this.a=this.c.e}function Svt(t){this.c=t,this.b=t.a.d.a,Y2t(t.a.e,this)}function Cl(t){Rm(t.c!=-1),t.d.$c(t.c),t.b=t.c,t.c=-1}function D9(t){return b.Math.sqrt(t.a*t.a+t.b*t.b)}function zw(t,e){return T8(e,t.a.c.length),Ne(t.a,e)}function pd(t,e){return Vt(t)===Vt(e)||t!=null&&yi(t,e)}function Dnn(t){return 0>=t?new mbt:wcn(t-1)}function Inn(t){return s3?wrt(s3,t):!1}function kXt(t){return t?t.dc():!t.Kc().Ob()}function Na(t){return!t.a&&t.c?t.c.b:t.a}function Onn(t){return!t.a&&(t.a=new As(_b,t,4)),t.a}function qw(t){return!t.d&&(t.d=new As(ho,t,1)),t.d}function On(t){if(t==null)throw it(new IC);return t}function I9(t){t.c?t.c.He():(t.d=!0,Rwn(t))}function Vp(t){t.c?Vp(t.c):(w2(t),t.d=!0)}function EXt(t){Dvt(t.a),t.b=Nt(Qn,De,1,t.b.length,5,1)}function Pnn(t,e){return pu(e.j.c.length,t.j.c.length)}function Fnn(t,e){t.c<0||t.b.b=0?t.Bh(n):i5t(t,e)}function TXt(t){var e,n;return e=t.c.i.c,n=t.d.i.c,e==n}function Bnn(t){if(t.p!=4)throw it(new Ou);return t.e}function Rnn(t){if(t.p!=3)throw it(new Ou);return t.e}function jnn(t){if(t.p!=6)throw it(new Ou);return t.f}function $nn(t){if(t.p!=6)throw it(new Ou);return t.k}function znn(t){if(t.p!=3)throw it(new Ou);return t.j}function qnn(t){if(t.p!=4)throw it(new Ou);return t.j}function Avt(t){return!t.b&&(t.b=new mR(new aet)),t.b}function Hw(t){return t.c==-2&&Jk(t,agn(t.g,t.b)),t.c}function A8(t,e){var n;return n=rrt("",t),n.n=e,n.i=1,n}function Hnn(t,e){qnt(u(e.b,65),t),xu(e.a,new Jr(t))}function Vnn(t,e){Dr((!t.a&&(t.a=new GM(t,t)),t.a),e)}function CXt(t,e){this.b=t,Jnt.call(this,t,e),ZUt(this)}function _Xt(t,e){this.b=t,wwt.call(this,t,e),JUt(this)}function Lvt(t,e,n,r){Lw.call(this,t,e),this.d=n,this.a=r}function o$(t,e,n,r){Lw.call(this,t,n),this.a=e,this.f=r}function SXt(t,e){TQe.call(this,vcn(Lr(t),Lr(e))),this.a=e}function AXt(){N4t.call(this,O2,(DHt(),L5e)),f4n(this)}function LXt(){N4t.call(this,Bh,(c8(),aLt)),x3n(this)}function MXt(){Vr.call(this,"DELAUNAY_TRIANGULATION",0)}function Gnn(t){return String.fromCharCode.apply(null,t)}function ki(t,e,n){return ra(e)?ko(t,e,n):au(t.f,e,n)}function Mvt(t){return wn(),t?t.ve():(Z3(),Z3(),AEt)}function Unn(t,e,n){return i6(),n.pg(t,u(e.cd(),146))}function DXt(t,e){return zj(),new z3t(new fWt(t),new hWt(e))}function Wnn(t){return jl(t,Yat),J$(Pa(Pa(5,t),t/10|0))}function c$(){c$=Z,Age=new uet(lt(ct(P2,1),Hq,42,0,[]))}function IXt(t){return!t.d&&(t.d=new T(t.c.Cc())),t.d}function L8(t){return!t.a&&(t.a=new fHt(t.c.vc())),t.a}function OXt(t){return!t.b&&(t.b=new s8(t.c.ec())),t.b}function Xd(t,e){for(;e-- >0;)t=t<<1|(t<0?1:0);return t}function Fc(t,e){return Vt(t)===Vt(e)||t!=null&&yi(t,e)}function Ynn(t,e){return Nn(),u(e.b,19).ar&&++r,r}function N0(t){var e,n;return n=(e=new xw,e),H8(n,t),n}function drt(t){var e,n;return n=(e=new xw,e),j4t(n,t),n}function urn(t,e){var n;return n=tr(t.f,e),byt(e,n),null}function grt(t){var e;return e=ycn(t),e||null}function HXt(t){return!t.b&&(t.b=new fe(Ys,t,12,3)),t.b}function lrn(t){return t!=null&&yM(gU,t.toLowerCase())}function hrn(t,e){return Ms(Ru(t)*El(t),Ru(e)*El(e))}function frn(t,e){return Ms(Ru(t)*El(t),Ru(e)*El(e))}function drn(t,e){return Ms(t.d.c+t.d.b/2,e.d.c+e.d.b/2)}function grn(t,e){return Ms(t.g.c+t.g.b/2,e.g.c+e.g.b/2)}function VXt(t,e,n){n.a?Eu(t,e.b-t.f/2):ku(t,e.a-t.g/2)}function GXt(t,e,n,r){this.a=t,this.b=e,this.c=n,this.d=r}function UXt(t,e,n,r){this.a=t,this.b=e,this.c=n,this.d=r}function n2(t,e,n,r){this.e=t,this.a=e,this.c=n,this.d=r}function WXt(t,e,n,r){this.a=t,this.c=e,this.d=n,this.b=r}function YXt(t,e,n,r){ih(),$Jt.call(this,e,n,r),this.a=t}function KXt(t,e,n,r){ih(),$Jt.call(this,e,n,r),this.a=t}function XXt(t,e){this.a=t,yZe.call(this,t,u(t.d,15).Zc(e))}function prt(t){this.f=t,this.c=this.f.e,t.f>0&&cae(this)}function QXt(t,e,n,r){this.b=t,this.c=r,ent.call(this,e,n)}function ZXt(t){return Zn(t.b=0&&hn(t.substr(n,e.length),e)}function Gp(t,e,n,r,s,o,h){return new jrt(t.e,e,n,r,s,o,h)}function pQt(t,e,n,r,s,o){this.a=t,fit.call(this,e,n,r,s,o)}function bQt(t,e,n,r,s,o){this.a=t,fit.call(this,e,n,r,s,o)}function wQt(t,e){this.g=t,this.d=lt(ct(l0,1),Yg,10,0,[e])}function Pg(t,e){this.e=t,this.a=Qn,this.b=$ue(e),this.c=e}function vQt(t,e){Ij.call(this),Gmt(this),this.a=t,this.c=e}function aD(t,e,n,r){ts(t.c[e.g],n.g,r),ts(t.c[n.g],e.g,r)}function yrt(t,e,n,r){ts(t.c[e.g],e.g,n),ts(t.b[e.g],e.g,r)}function Nrn(){return pD(),lt(ct(Y9t,1),oe,376,0,[Sht,BO])}function Brn(){return xD(),lt(ct($Tt,1),oe,479,0,[jTt,WV])}function Rrn(){return LD(),lt(ct(BTt,1),oe,419,0,[GV,NTt])}function jrn(){return H$(),lt(ct(LTt,1),oe,422,0,[ATt,Alt])}function $rn(){return I$(),lt(ct(JTt,1),oe,420,0,[Hlt,ZTt])}function zrn(){return CD(),lt(ct(V9t,1),oe,421,0,[Tht,Cht])}function qrn(){return $9(),lt(ct(Ome,1),oe,523,0,[BS,NS])}function Hrn(){return Uf(),lt(ct(rye,1),oe,520,0,[Ky,mb])}function Vrn(){return bd(),lt(ct($me,1),oe,516,0,[zv,ep])}function Grn(){return C1(),lt(ct(qme,1),oe,515,0,[H2,H1])}function Urn(){return Gw(),lt(ct(lye,1),oe,455,0,[yb,r5])}function Wrn(){return A$(),lt(ct(v_t,1),oe,425,0,[qht,w_t])}function Yrn(){return T$(),lt(ct(b_t,1),oe,480,0,[zht,p_t])}function Krn(){return pz(),lt(ct(m_t,1),oe,495,0,[FG,D7])}function Xrn(){return G$(),lt(ct(x_t,1),oe,426,0,[y_t,Uht])}function Qrn(){return jD(),lt(ct(TSt,1),oe,429,0,[VG,ESt])}function Zrn(){return bD(),lt(ct(nSt,1),oe,430,0,[eft,qG])}function Jrn(){return Gz(),lt(ct(zEt,1),oe,428,0,[qut,$Et])}function tin(){return Q$(),lt(ct(HEt,1),oe,427,0,[qEt,Hut])}function ein(){return Z$(),lt(ct(w7t,1),oe,424,0,[tlt,gV])}function nin(){return X8(),lt(ct(n2e,1),oe,511,0,[yO,dlt])}function m$(t,e,n,r){return n>=0?t.jh(e,n,r):t.Sg(null,n,r)}function xrt(t){return t.b.b==0?t.a.$e():Ont(t.b)}function rin(t){if(t.p!=5)throw it(new Ou);return Ar(t.f)}function iin(t){if(t.p!=5)throw it(new Ou);return Ar(t.k)}function jvt(t){return Vt(t.a)===Vt((kit(),Bft))&&s4n(t),t.a}function mQt(t){this.a=u(Lr(t),271),this.b=(wn(),new I2t(t))}function yQt(t,e){vpt(this,new $e(t.a,t.b)),oR(this,QM(e))}function Gw(){Gw=Z,yb=new Wbt(y6,0),r5=new Wbt(x6,1)}function bd(){bd=Z,zv=new Gbt(x6,0),ep=new Gbt(y6,1)}function Uw(){gKe.call(this,new Lx(ty(12))),A2t(!0),this.a=2}function krt(t,e,n){gi(),yw.call(this,t),this.b=e,this.a=n}function $vt(t,e,n){ih(),vR.call(this,e),this.a=t,this.b=n}function xQt(t){Ij.call(this),Gmt(this),this.a=t,this.c=!0}function kQt(t){var e;e=t.c.d.b,t.b=e,t.a=t.c.d,e.a=t.c.d.b=t}function y$(t){var e;hcn(t.a),OUt(t.a),e=new er(t.a),p3t(e)}function sin(t,e){Due(t,!0),xu(t.e.wf(),new Ewt(t,!0,e))}function x$(t,e){return eJt(e),ccn(t,Nt(Cr,Xr,25,e,15,1),e)}function ain(t,e){return Ux(),t==es(e0(e))||t==es(tb(e))}function Nc(t,e){return e==null?ec(Lo(t.f,null)):KC(t.g,e)}function oin(t){return t.b==0?null:(Zn(t.b!=0),lh(t,t.a.a))}function ps(t){return Math.max(Math.min(t,wi),-2147483648)|0}function cin(t,e){var n=Iut[t.charCodeAt(0)];return n??t}function k$(t,e){return g$(t,"set1"),g$(e,"set2"),new vVt(t,e)}function uin(t,e){var n;return n=rcn(t.f,e),Li(Mj(n),t.f.d)}function P9(t,e){var n,r;return n=e,r=new zt,mhe(t,n,r),r.d}function Ert(t,e,n,r){var s;s=new uYt,e.a[n.g]=s,zx(t.b,r,s)}function zvt(t,e,n){var r;r=t.Yg(e),r>=0?t.sh(r,n):M5t(t,e,n)}function J3(t,e,n){C$(),t&&ki(Pft,t,e),t&&ki(dP,t,n)}function EQt(t,e,n){this.i=new he,this.b=t,this.g=e,this.a=n}function E$(t,e,n){this.c=new he,this.e=t,this.f=e,this.b=n}function qvt(t,e,n){this.a=new he,this.e=t,this.f=e,this.c=n}function TQt(t,e){yj(this),this.f=e,this.g=t,d$(this),this._d()}function oD(t,e){var n;n=t.q.getHours(),t.q.setDate(e),E_(t,n)}function CQt(t,e){var n;for(Lr(e),n=t.a;n;n=n.c)e.Od(n.g,n.i)}function _Qt(t){var e;return e=new IR(ty(t.length)),Oyt(e,t),e}function lin(t){function e(){}return e.prototype=t||{},new e}function hin(t,e){return ere(t,e)?(Jee(t),!0):!1}function B0(t,e){if(e==null)throw it(new IC);return cfn(t,e)}function fin(t){if(t.qe())return null;var e=t.n;return QH[e]}function cD(t){return t.Db>>16!=3?null:u(t.Cb,33)}function T1(t){return t.Db>>16!=9?null:u(t.Cb,33)}function SQt(t){return t.Db>>16!=6?null:u(t.Cb,79)}function AQt(t){return t.Db>>16!=7?null:u(t.Cb,235)}function LQt(t){return t.Db>>16!=7?null:u(t.Cb,160)}function es(t){return t.Db>>16!=11?null:u(t.Cb,33)}function MQt(t,e){var n;return n=t.Yg(e),n>=0?t.lh(n):Zst(t,e)}function DQt(t,e){var n;return n=new Wwt(e),Iae(n,t),new Bu(n)}function Hvt(t){var e;return e=t.d,e=t.si(t.f),Dr(t,e),e.Ob()}function IQt(t,e){return t.b+=e.b,t.c+=e.c,t.d+=e.d,t.a+=e.a,t}function Trt(t,e){return b.Math.abs(t)0}function OQt(){this.a=new O0,this.e=new Hs,this.g=0,this.i=0}function PQt(t){this.a=t,this.b=Nt(Mme,ee,1944,t.e.length,0,2)}function Crt(t,e,n){var r;r=xre(t,e,n),t.b=new gz(r.c.length)}function C1(){C1=Z,H2=new Vbt(Dot,0),H1=new Vbt("UP",1)}function T$(){T$=Z,zht=new Ybt(Y1e,0),p_t=new Ybt("FAN",1)}function C$(){C$=Z,Pft=new _r,dP=new _r,OXe(Uge,new JT)}function gin(t){if(t.p!=0)throw it(new Ou);return u9(t.f,0)}function pin(t){if(t.p!=0)throw it(new Ou);return u9(t.k,0)}function FQt(t){return t.Db>>16!=3?null:u(t.Cb,147)}function O8(t){return t.Db>>16!=6?null:u(t.Cb,235)}function Ym(t){return t.Db>>16!=17?null:u(t.Cb,26)}function NQt(t,e){var n=t.a=t.a||[];return n[e]||(n[e]=t.le(e))}function bin(t,e){var n;return n=t.a.get(e),n??new Array}function win(t,e){var n;n=t.q.getHours(),t.q.setMonth(e),E_(t,n)}function ko(t,e,n){return e==null?au(t.f,null,n):sv(t.g,e,n)}function F9(t,e,n,r,s,o){return new z0(t.e,e,t.aj(),n,r,s,o)}function uD(t,e,n){return t.a=Pl(t.a,0,e)+(""+n)+RM(t.a,e),t}function vin(t,e,n){return le(t.a,(c$(),kst(e,n),new Lw(e,n))),t}function Vvt(t){return M2t(t.c),t.e=t.a=t.c,t.c=t.c.c,++t.d,t.a.f}function BQt(t){return M2t(t.e),t.c=t.a=t.e,t.e=t.e.e,--t.d,t.a.f}function oa(t,e){t.d&&mu(t.d.e,t),t.d=e,t.d&&le(t.d.e,t)}function Oa(t,e){t.c&&mu(t.c.g,t),t.c=e,t.c&&le(t.c.g,t)}function Eo(t,e){t.c&&mu(t.c.a,t),t.c=e,t.c&&le(t.c.a,t)}function Uo(t,e){t.i&&mu(t.i.j,t),t.i=e,t.i&&le(t.i.j,t)}function RQt(t,e,n){this.a=e,this.c=t,this.b=(Lr(n),new Bu(n))}function jQt(t,e,n){this.a=e,this.c=t,this.b=(Lr(n),new Bu(n))}function $Qt(t,e){this.a=t,this.c=nc(this.a),this.b=new v$(e)}function min(t){var e;return w2(t),e=new Hs,Ri(t,new Ge(e))}function Km(t,e){if(t<0||t>e)throw it(new yo(Kxt+t+Xxt+e))}function Gvt(t,e){return MKt(t.a,e)?pvt(t,u(e,22).g,null):null}function yin(t){return qit(),Nn(),u(t.a,81).d.e!=0}function zQt(){zQt=Z,Dge=Wr((TR(),lt(ct(Mge,1),oe,538,0,[Mut])))}function qQt(){qQt=Z,wme=Ku(new Vs,(Wa(),Io),(ro(),xO))}function Uvt(){Uvt=Z,vme=Ku(new Vs,(Wa(),Io),(ro(),xO))}function HQt(){HQt=Z,yme=Ku(new Vs,(Wa(),Io),(ro(),xO))}function VQt(){VQt=Z,Fme=bi(new Vs,(Wa(),Io),(ro(),pS))}function Fl(){Fl=Z,Rme=bi(new Vs,(Wa(),Io),(ro(),pS))}function GQt(){GQt=Z,jme=bi(new Vs,(Wa(),Io),(ro(),pS))}function _rt(){_rt=Z,Vme=bi(new Vs,(Wa(),Io),(ro(),pS))}function UQt(){UQt=Z,Mye=Ku(new Vs,(wE(),jS),(p_(),Iht))}function i2(t,e,n,r){this.c=t,this.d=r,Art(this,e),Lrt(this,n)}function Yx(t){this.c=new Zi,this.b=t.b,this.d=t.c,this.a=t.a}function Srt(t){this.a=b.Math.cos(t),this.b=b.Math.sin(t)}function Art(t,e){t.a&&mu(t.a.k,t),t.a=e,t.a&&le(t.a.k,t)}function Lrt(t,e){t.b&&mu(t.b.f,t),t.b=e,t.b&&le(t.b.f,t)}function WQt(t,e){Lnn(t,t.b,t.c),u(t.b.b,65),e&&u(e.b,65).b}function xin(t,e){c3t(t,e),_t(t.Cb,88)&&gy(sl(u(t.Cb,88)),2)}function Mrt(t,e){_t(t.Cb,88)&&gy(sl(u(t.Cb,88)),4),Qc(t,e)}function _$(t,e){_t(t.Cb,179)&&(u(t.Cb,179).tb=null),Qc(t,e)}function Bc(t,e){return to(),ait(e)?new qj(e,t):new BM(e,t)}function kin(t,e){var n,r;n=e.c,r=n!=null,r&&Vx(t,new Um(e.c))}function YQt(t){var e,n;return n=(c8(),e=new xw,e),H8(n,t),n}function KQt(t){var e,n;return n=(c8(),e=new xw,e),H8(n,t),n}function XQt(t,e){var n;return n=new Sh(t),e.c[e.c.length]=n,n}function QQt(t,e){var n;return n=u(sy(Wx(t.a),e),14),n?n.gc():0}function ZQt(t){var e;return w2(t),e=(Z3(),Z3(),SEt),ez(t,e)}function JQt(t){for(var e;;)if(e=t.Pb(),!t.Ob())return e}function Wvt(t,e){fKe.call(this,new Lx(ty(t))),jl(e,ffe),this.a=e}function Qd(t,e,n){aie(e,n,t.gc()),this.c=t,this.a=e,this.b=n-e}function tZt(t,e,n){var r;aie(e,n,t.c.length),r=n-e,wbt(t.c,e,r)}function Ein(t,e){QUt(t,Ar(Ns($p(e,24),Uq)),Ar(Ns(e,Uq)))}function An(t,e){if(t<0||t>=e)throw it(new yo(Kxt+t+Xxt+e))}function Rr(t,e){if(t<0||t>=e)throw it(new sbt(Kxt+t+Xxt+e))}function _n(t,e){this.b=(On(t),t),this.a=e&Ey?e:e|64|md}function eZt(t){IUt(this),fqt(this.a,Dyt(b.Math.max(8,t))<<1)}function _1(t){return Yo(lt(ct(Ws,1),ee,8,0,[t.i.n,t.n,t.a]))}function Tin(){return O1(),lt(ct(fl,1),oe,132,0,[BEt,Ul,Iy])}function Cin(){return Kf(),lt(ct(Oy,1),oe,232,0,[sc,eu,ac])}function _in(){return Qu(),lt(ct(ppe,1),oe,461,0,[Md,fb,kf])}function Sin(){return yu(),lt(ct(wpe,1),oe,462,0,[n1,db,Ef])}function Ain(){return iv(),lt(ct(F7t,1),oe,423,0,[q4,P7t,llt])}function Lin(){return q9(),lt(ct(D7t,1),oe,379,0,[ilt,rlt,slt])}function Min(){return Z9(),lt(ct(P9t,1),oe,378,0,[vht,O9t,yG])}function Din(){return n6(),lt(ct(DTt,1),oe,314,0,[P6,EO,MTt])}function Iin(){return oz(),lt(ct(OTt,1),oe,337,0,[ITt,VV,Llt])}function Oin(){return d2(),lt(ct(D2e,1),oe,450,0,[Ilt,w7,U4])}function Pin(){return nv(),lt(ct(mlt,1),oe,361,0,[Dv,pb,Mv])}function Fin(){return q0(),lt(ct(j2e,1),oe,303,0,[CO,Y4,F6])}function Nin(){return eE(),lt(ct(qlt,1),oe,292,0,[$lt,zlt,TO])}function Bin(){return so(),lt(ct(lme,1),oe,452,0,[OS,tl,nu])}function Rin(){return V0(),lt(ct(H9t,1),oe,339,0,[vb,q9t,Eht])}function jin(){return yz(),lt(ct(W9t,1),oe,375,0,[G9t,_ht,U9t])}function $in(){return Cz(),lt(ct(t_t,1),oe,377,0,[Mht,L7,Yy])}function zin(){return cE(),lt(ct(X9t,1),oe,336,0,[Aht,K9t,PS])}function qin(){return vz(),lt(ct(J9t,1),oe,338,0,[Z9t,Lht,Q9t])}function Hin(){return ev(),lt(ct(Ame,1),oe,454,0,[RO,FS,TG])}function Vin(){return Nz(),lt(ct(Fye,1),oe,442,0,[Ght,Hht,Vht])}function Gin(){return HD(),lt(ct(T_t,1),oe,380,0,[NG,k_t,E_t])}function Uin(){return Fz(),lt(ct(q_t,1),oe,381,0,[z_t,Qht,$_t])}function Win(){return mz(),lt(ct(R_t,1),oe,293,0,[Xht,B_t,N_t])}function Yin(){return KD(),lt(ct(Zht,1),oe,437,0,[jG,$G,zG])}function Kin(){return G0(),lt(ct(DAt,1),oe,334,0,[tU,sp,ZS])}function Xin(){return M1(),lt(ct(mAt,1),oe,272,0,[P7,Zy,F7])}function Qin(t,e){return v2n(t,e,_t(e,99)&&(u(e,18).Bb&Ka)!=0)}function Zin(t,e,n){var r;return r=__(t,e,!1),r.b<=e&&r.a<=n}function nZt(t,e,n){var r;r=new NQ,r.b=e,r.a=n,++e.b,le(t.d,r)}function Jin(t,e){var n;return n=(On(t),t).g,q2t(!!n),On(e),n(e)}function Yvt(t,e){var n,r;return r=C8(t,e),n=t.a.Zc(r),new wVt(t,n)}function tsn(t){return t.Db>>16!=6?null:u(eat(t),235)}function esn(t){if(t.p!=2)throw it(new Ou);return Ar(t.f)&ys}function nsn(t){if(t.p!=2)throw it(new Ou);return Ar(t.k)&ys}function rsn(t){return t.a==(B8(),vU)&&Btt(t,P2n(t.g,t.b)),t.a}function Kx(t){return t.d==(B8(),vU)&&_C(t,Smn(t.g,t.b)),t.d}function J(t){return Zn(t.ar?1:0}function rZt(t,e){var n,r;return n=eit(e),r=n,u(tr(t.c,r),19).a}function iZt(t,e){var n;for(n=t+"";n.length0&&t.a[--t.d]==0;);t.a[t.d++]==0&&(t.e=0)}function EZt(t){return t.a?t.e.length==0?t.a.a:t.a.a+(""+t.e):t.c}function gsn(t){return!!t.a&&al(t.a.a).i!=0&&!(t.b&&mst(t.b))}function psn(t){return!!t.u&&Lc(t.u.a).i!=0&&!(t.n&&vst(t.n))}function TZt(t){return Bnt(t.e.Hd().gc()*t.c.Hd().gc(),16,new gx(t))}function bsn(t,e){return tXt(Tu(t.q.getTime()),Tu(e.q.getTime()))}function wd(t){return u(P1(t,Nt(hlt,Wot,17,t.c.length,0,1)),474)}function lD(t){return u(P1(t,Nt(l0,Yg,10,t.c.length,0,1)),193)}function wsn(t){return Fl(),!Ga(t)&&!(!Ga(t)&&t.c.i.c==t.d.i.c)}function CZt(t,e,n){var r;r=(Lr(t),new Bu(t)),W1n(new RQt(r,e,n))}function hD(t,e,n){var r;r=(Lr(t),new Bu(t)),Y1n(new jQt(r,e,n))}function _Zt(t,e){var n;return n=1-e,t.a[n]=dz(t.a[n],n),dz(t,e)}function SZt(t,e){var n;t.e=new Zpt,n=wy(e),Zs(n,t.c),yue(t,n,0)}function ca(t,e,n,r){var s;s=new iB,s.a=e,s.b=n,s.c=r,ri(t.a,s)}function xe(t,e,n,r){var s;s=new iB,s.a=e,s.b=n,s.c=r,ri(t.b,s)}function pf(t){var e,n,r;return e=new oXt,n=yat(e,t),n5n(e),r=n,r}function tmt(){var t,e,n;return e=(n=(t=new xw,t),n),le(bLt,e),e}function L$(t){return t.j.c=Nt(Qn,De,1,0,5,1),Dvt(t.c),Qnn(t.a),t}function t4(t){return GC(),_t(t.g,10)?u(t.g,10):null}function vsn(t){return Q3(t).dc()?!1:(wQe(t,new ut),!0)}function msn(t){if(!("stack"in t))try{throw t}catch{}return t}function fD(t,e){if(t<0||t>=e)throw it(new yo(Ipn(t,e)));return t}function AZt(t,e,n){if(t<0||en)throw it(new yo(rpn(t,e,n)))}function Prt(t,e){if(Fs(t.a,e),e.d)throw it(new Vo(Pfe));e.d=t}function Frt(t,e){if(e.$modCount!=t.$modCount)throw it(new rh)}function LZt(t,e){return _t(e,42)?Tst(t.a,u(e,42)):!1}function MZt(t,e){return _t(e,42)?Tst(t.a,u(e,42)):!1}function DZt(t,e){return _t(e,42)?Tst(t.a,u(e,42)):!1}function ysn(t,e){return t.a<=t.b?(e.ud(t.a++),!0):!1}function Yw(t){var e;return Bo(t)?(e=t,e==-0?0:e):Lon(t)}function M$(t){var e;return Vp(t),e=new Ye,j3(t.a,new bn(e)),e}function IZt(t){var e;return Vp(t),e=new Ve,j3(t.a,new we(e)),e}function da(t,e){this.a=t,mx.call(this,t),Km(e,t.gc()),this.b=e}function emt(t){this.e=t,this.b=this.e.a.entries(),this.a=new Array}function xsn(t){return Bnt(t.e.Hd().gc()*t.c.Hd().gc(),273,new eR(t))}function D$(t){return new Xc((jl(t,Yat),J$(Pa(Pa(5,t),t/10|0))))}function OZt(t){return u(P1(t,Nt(Jbe,h1e,11,t.c.length,0,1)),1943)}function ksn(t,e,n){return n.f.c.length>0?vvt(t.a,e,n):vvt(t.b,e,n)}function Esn(t,e,n){t.d&&mu(t.d.e,t),t.d=e,t.d&&Hm(t.d.e,n,t)}function Nrt(t,e){bxn(e,t),Bwt(t.d),Bwt(u(Q(t,(Te(),dG)),207))}function B9(t,e){pxn(e,t),Nwt(t.d),Nwt(u(Q(t,(Te(),dG)),207))}function Kw(t,e){var n,r;return n=B0(t,e),r=null,n&&(r=n.fe()),r}function P8(t,e){var n,r;return n=Jm(t,e),r=null,n&&(r=n.ie()),r}function R9(t,e){var n,r;return n=B0(t,e),r=null,n&&(r=n.ie()),r}function R0(t,e){var n,r;return n=B0(t,e),r=null,n&&(r=U4t(n)),r}function Tsn(t,e,n){var r;return r=pE(n),Aq(t.g,r,e),Aq(t.i,e,n),e}function Csn(t,e,n){var r;r=Jhn();try{return MZe(t,e,n)}finally{Nsn(r)}}function PZt(t){var e;e=t.Wg(),this.a=_t(e,69)?u(e,69).Zh():e.Kc()}function Vs(){Yqt.call(this),this.j.c=Nt(Qn,De,1,0,5,1),this.a=-1}function nmt(t,e,n,r){this.d=t,this.n=e,this.g=n,this.o=r,this.p=-1}function FZt(t,e,n,r){this.e=r,this.d=null,this.c=t,this.a=e,this.b=n}function rmt(t,e,n){this.d=new bR(this),this.e=t,this.i=e,this.f=n}function I$(){I$=Z,Hlt=new $bt(qE,0),ZTt=new $bt("TOP_LEFT",1)}function NZt(){NZt=Z,n_t=DXt(pe(1),pe(4)),e_t=DXt(pe(1),pe(2))}function BZt(){BZt=Z,C3e=Wr((qR(),lt(ct(T3e,1),oe,551,0,[tft])))}function RZt(){RZt=Z,E3e=Wr((zR(),lt(ct(eSt,1),oe,482,0,[Jht])))}function jZt(){jZt=Z,H3e=Wr((UC(),lt(ct(kSt,1),oe,530,0,[VO])))}function $Zt(){$Zt=Z,Kpe=Wr((jR(),lt(ct(l7t,1),oe,481,0,[Kut])))}function _sn(){return rv(),lt(ct(qpe,1),oe,406,0,[hO,lO,Wut,Yut])}function Ssn(){return U$(),lt(ct(sV,1),oe,297,0,[jut,OEt,PEt,FEt])}function Asn(){return c_(),lt(ct(Wpe,1),oe,394,0,[bO,lV,hV,wO])}function Lsn(){return u6(),lt(ct(Vpe,1),oe,323,0,[dO,fO,gO,pO])}function Msn(){return nE(),lt(ct(zbe,1),oe,405,0,[Lv,Fy,Py,z4])}function Dsn(){return Tz(),lt(ct(a2e,1),oe,360,0,[wlt,BV,RV,kO])}function zZt(t,e,n,r){return _t(n,54)?new SWt(t,e,n,r):new ovt(t,e,n,r)}function Isn(){return I1(),lt(ct(p2e,1),oe,411,0,[O6,f7,d7,vlt])}function Osn(t){var e;return t.j==(ve(),mr)&&(e=uce(t),Nu(e,Hn))}function Psn(t,e){var n;n=e.a,Oa(n,e.c.d),oa(n,e.d.d),ny(n.a,t.n)}function qZt(t,e){return u(Nw(Jj(u(Ai(t.k,e),15).Oc(),H4)),113)}function HZt(t,e){return u(Nw(t$(u(Ai(t.k,e),15).Oc(),H4)),113)}function Fsn(t){return new _n(Icn(u(t.a.dd(),14).gc(),t.a.cd()),16)}function F8(t){return _t(t,14)?u(t,14).dc():!t.Kc().Ob()}function Xx(t){return GC(),_t(t.g,145)?u(t.g,145):null}function VZt(t){if(t.e.g!=t.b)throw it(new rh);return!!t.c&&t.d>0}function ti(t){return Zn(t.b!=t.d.c),t.c=t.b,t.b=t.b.a,++t.a,t.c.c}function imt(t,e){On(e),ts(t.a,t.c,e),t.c=t.c+1&t.a.length-1,Gse(t)}function Up(t,e){On(e),t.b=t.b-1&t.a.length-1,ts(t.a,t.b,e),Gse(t)}function GZt(t,e){var n;for(n=t.j.c.length;n0&&Dc(t.g,0,e,0,t.i),e}function KZt(t,e){GR();var n;return n=u(tr(dU,t),55),!n||n.wj(e)}function Ysn(t){if(t.p!=1)throw it(new Ou);return Ar(t.f)<<24>>24}function Ksn(t){if(t.p!=1)throw it(new Ou);return Ar(t.k)<<24>>24}function Xsn(t){if(t.p!=7)throw it(new Ou);return Ar(t.k)<<16>>16}function Qsn(t){if(t.p!=7)throw it(new Ou);return Ar(t.f)<<16>>16}function j0(t){var e;for(e=0;t.Ob();)t.Pb(),e=Pa(e,1);return J$(e)}function XZt(t,e){var n;return n=new Im,t.xd(n),n.a+="..",e.yd(n),n.a}function Zsn(t,e,n){var r;r=u(tr(t.g,n),57),le(t.a.c,new fa(e,r))}function Jsn(t,e,n){return Unt(ye(ec(Lo(t.f,e))),ye(ec(Lo(t.f,n))))}function O$(t,e,n){return Mq(t,e,n,_t(e,99)&&(u(e,18).Bb&Ka)!=0)}function tan(t,e,n){return DE(t,e,n,_t(e,99)&&(u(e,18).Bb&Ka)!=0)}function ean(t,e,n){return T2n(t,e,n,_t(e,99)&&(u(e,18).Bb&Ka)!=0)}function omt(t,e){return t==(Vn(),Os)&&e==Os?4:t==Os||e==Os?8:32}function QZt(t,e){return Vt(e)===Vt(t)?"(this Map)":e==null?_u:$o(e)}function nan(t,e){return u(e==null?ec(Lo(t.f,null)):KC(t.g,e),281)}function ZZt(t,e,n){var r;return r=pE(n),ki(t.b,r,e),ki(t.c,e,n),e}function JZt(t,e){var n;for(n=e;n;)jm(t,n.i,n.j),n=es(n);return t}function cmt(t,e){var n;return n=iD(x8(new nit(t,e))),Vj(new nit(t,e)),n}function Zd(t,e){to();var n;return n=u(t,66).Mj(),Ngn(n,e),n.Ok(e)}function ran(t,e,n,r,s){var o;o=L2n(s,n,r),le(e,Spn(s,o)),vgn(t,s,e)}function tJt(t,e,n){t.i=0,t.e=0,e!=n&&(Cre(t,e,n),Tre(t,e,n))}function umt(t,e){var n;n=t.q.getHours(),t.q.setFullYear(e+ab),E_(t,n)}function ian(t,e,n){if(n){var r=n.ee();t.a[e]=r(n)}else delete t.a[e]}function Brt(t,e,n){if(n){var r=n.ee();n=r(n)}else n=void 0;t.a[e]=n}function eJt(t){if(t<0)throw it(new aHt("Negative array size: "+t))}function Lc(t){return t.n||(sl(t),t.n=new PKt(t,ho,t),Ao(t)),t.n}function j9(t){return Zn(t.a=0&&t.a[n]===e[n];n--);return n<0}function aJt(t,e){oE();var n;return n=t.j.g-e.j.g,n!=0?n:0}function oJt(t,e){return On(e),t.a!=null?Hen(e.Kb(t.a)):iV}function P$(t){var e;return t?new Wwt(t):(e=new O0,xit(e,t),e)}function Bl(t,e){var n;return e.b.Kb(Jte(t,e.c.Ee(),(n=new In(e),n)))}function F$(t){M4t(),QUt(this,Ar(Ns($p(t,24),Uq)),Ar(Ns(t,Uq)))}function cJt(){cJt=Z,upe=Wr((Gz(),lt(ct(zEt,1),oe,428,0,[qut,$Et])))}function uJt(){uJt=Z,lpe=Wr((Q$(),lt(ct(HEt,1),oe,427,0,[qEt,Hut])))}function lJt(){lJt=Z,fbe=Wr((Z$(),lt(ct(w7t,1),oe,424,0,[tlt,gV])))}function hJt(){hJt=Z,r2e=Wr((X8(),lt(ct(n2e,1),oe,511,0,[yO,dlt])))}function fJt(){fJt=Z,M2e=Wr((LD(),lt(ct(BTt,1),oe,419,0,[GV,NTt])))}function dJt(){dJt=Z,P2e=Wr((xD(),lt(ct($Tt,1),oe,479,0,[jTt,WV])))}function gJt(){gJt=Z,dme=Wr((pD(),lt(ct(Y9t,1),oe,376,0,[Sht,BO])))}function pJt(){pJt=Z,ume=Wr((CD(),lt(ct(V9t,1),oe,421,0,[Tht,Cht])))}function bJt(){bJt=Z,_2e=Wr((H$(),lt(ct(LTt,1),oe,422,0,[ATt,Alt])))}function wJt(){wJt=Z,z2e=Wr((I$(),lt(ct(JTt,1),oe,420,0,[Hlt,ZTt])))}function vJt(){vJt=Z,iye=Wr((Uf(),lt(ct(rye,1),oe,520,0,[Ky,mb])))}function mJt(){mJt=Z,Pme=Wr(($9(),lt(ct(Ome,1),oe,523,0,[BS,NS])))}function yJt(){yJt=Z,zme=Wr((bd(),lt(ct($me,1),oe,516,0,[zv,ep])))}function xJt(){xJt=Z,Hme=Wr((C1(),lt(ct(qme,1),oe,515,0,[H2,H1])))}function kJt(){kJt=Z,hye=Wr((Gw(),lt(ct(lye,1),oe,455,0,[yb,r5])))}function EJt(){EJt=Z,Lye=Wr((A$(),lt(ct(v_t,1),oe,425,0,[qht,w_t])))}function TJt(){TJt=Z,Pye=Wr((pz(),lt(ct(m_t,1),oe,495,0,[FG,D7])))}function CJt(){CJt=Z,Aye=Wr((T$(),lt(ct(b_t,1),oe,480,0,[zht,p_t])))}function _Jt(){_Jt=Z,Bye=Wr((G$(),lt(ct(x_t,1),oe,426,0,[y_t,Uht])))}function SJt(){SJt=Z,V3e=Wr((jD(),lt(ct(TSt,1),oe,429,0,[VG,ESt])))}function AJt(){AJt=Z,_3e=Wr((bD(),lt(ct(nSt,1),oe,430,0,[eft,qG])))}function $9(){$9=Z,BS=new Hbt("UPPER",0),NS=new Hbt("LOWER",1)}function can(t,e){var n;n=new _x,r2(n,"x",e.a),r2(n,"y",e.b),Vx(t,n)}function uan(t,e){var n;n=new _x,r2(n,"x",e.a),r2(n,"y",e.b),Vx(t,n)}function lan(t,e){var n,r;r=!1;do n=bre(t,e),r=r|n;while(n);return r}function fmt(t,e){var n,r;for(n=e,r=0;n>0;)r+=t.a[n],n-=n&-n;return r}function LJt(t,e){var n;for(n=e;n;)jm(t,-n.i,-n.j),n=es(n);return t}function va(t,e){var n,r;for(On(e),r=t.Kc();r.Ob();)n=r.Pb(),e.td(n)}function MJt(t,e){var n;return n=e.cd(),new Lw(n,t.e.pc(n,u(e.dd(),14)))}function fs(t,e,n,r){var s;s=new xt,s.c=e,s.b=n,s.a=r,r.b=n.a=s,++t.b}function ch(t,e,n){var r;return r=(An(e,t.c.length),t.c[e]),t.c[e]=n,r}function han(t,e,n){return u(e==null?au(t.f,null,n):sv(t.g,e,n),281)}function zrt(t){return t.c&&t.d?Kvt(t.c)+"->"+Kvt(t.d):"e_"+Pw(t)}function N8(t,e){return(w2(t),qC(new Tn(t,new Nmt(e,t.a)))).sd(o7)}function fan(){return Wa(),lt(ct(I7t,1),oe,356,0,[Dd,gb,cu,qc,Io])}function dan(){return ve(),lt(ct(Xa,1),xc,61,0,[Zo,Pn,Hn,mr,Bn])}function gan(t){return AR(),function(){return Csn(t,this,arguments)}}function pan(){return Date.now?Date.now():new Date().getTime()}function Ga(t){return!t.c||!t.d?!1:!!t.c.i&&t.c.i==t.d.i}function DJt(t){if(!t.c.Sb())throw it(new lc);return t.a=!0,t.c.Ub()}function dD(t){t.i=0,CM(t.b,null),CM(t.c,null),t.a=null,t.e=null,++t.g}function dmt(t){kXe.call(this,t==null?_u:$o(t),_t(t,78)?u(t,78):null)}function IJt(t){rfe(),nqt(this),this.a=new Zi,$yt(this,t),ri(this.a,t)}function OJt(){ant(this),this.b=new $e(as,as),this.a=new $e(Cs,Cs)}function PJt(t,e){this.c=0,this.b=e,cUt.call(this,t,17493),this.a=this.c}function qrt(t){N$(),!$1&&(this.c=t,this.e=!0,this.a=new he)}function N$(){N$=Z,$1=!0,Jge=!1,tpe=!1,npe=!1,epe=!1}function gmt(t,e){return _t(e,149)?hn(t.c,u(e,149).c):!1}function pmt(t,e){var n;return n=0,t&&(n+=t.f.a/2),e&&(n+=e.f.a/2),n}function Hrt(t,e){var n;return n=u(Xw(t.d,e),23),n||u(Xw(t.e,e),23)}function FJt(t){this.b=t,nr.call(this,t),this.a=u(Dn(this.b.a,4),126)}function NJt(t){this.b=t,Bx.call(this,t),this.a=u(Dn(this.b.a,4),126)}function sl(t){return t.t||(t.t=new Uzt(t),n_(new sHt(t),0,t.t)),t.t}function ban(){return ao(),lt(ct(XS,1),oe,103,0,[h0,Cf,zh,ng,rg])}function wan(){return l4(),lt(ct(tA,1),oe,249,0,[Eb,iP,IAt,JS,OAt])}function van(){return Qf(),lt(ct(ip,1),oe,175,0,[qn,ea,Pd,V2,rp])}function man(){return uI(),lt(ct(aSt,1),oe,316,0,[rSt,nft,sSt,rft,iSt])}function yan(){return u_(),lt(ct(N9t,1),oe,315,0,[F9t,xht,kht,DS,IS])}function xan(){return x2(),lt(ct(FTt,1),oe,335,0,[Mlt,PTt,Dlt,vS,wS])}function kan(){return AE(),lt(ct(y3e,1),oe,355,0,[i5,G6,GS,VS,US])}function Ean(){return b4(),lt(ct(w2e,1),oe,363,0,[$V,qV,HV,zV,jV])}function Tan(){return dh(),lt(ct(fCt,1),oe,163,0,[MO,ES,bb,TS,jy])}function B8(){B8=Z;var t,e;wU=(c8(),e=new xR,e),vU=(t=new ret,t)}function BJt(t){var e;return t.c||(e=t.r,_t(e,88)&&(t.c=u(e,26))),t.c}function Can(t){return t.e=3,t.d=t.Yb(),t.e!=2?(t.e=0,!0):!1}function Vrt(t){var e,n,r;return e=t&hl,n=t>>22&hl,r=t<0?Z0:0,iu(e,n,r)}function _an(t){var e,n,r,s;for(n=t,r=0,s=n.length;r0?Fie(t,e):rue(t,-e)}function bmt(t,e){return e==0||t.e==0?t:e>0?rue(t,e):Fie(t,-e)}function Mr(t){if(zr(t))return t.c=t.a,t.a.Pb();throw it(new lc)}function jJt(t){var e,n;return e=t.c.i,n=t.d.i,e.k==(Vn(),ks)&&n.k==ks}function Grt(t){var e;return e=new Vw,Mo(e,t),Jt(e,(Te(),So),null),e}function Urt(t,e,n){var r;return r=t.Yg(e),r>=0?t._g(r,n,!0):dv(t,e,n)}function wmt(t,e,n,r){var s;for(s=0;se)throw it(new yo(J4t(t,e,"index")));return t}function Wrt(t,e,n,r){var s;return s=Nt(Cr,Xr,25,e,15,1),j0n(s,t,e,n,r),s}function Aan(t,e){var n;n=t.q.getHours()+(e/60|0),t.q.setMinutes(e),E_(t,n)}function Lan(t,e){return b.Math.min(Wp(e.a,t.d.d.c),Wp(e.b,t.d.d.c))}function Jx(t,e){return ra(e)?e==null?b5t(t.f,null):Zne(t.g,e):b5t(t.f,e)}function L1(t){this.c=t,this.a=new S(this.c.a),this.b=new S(this.c.b)}function B$(){this.e=new he,this.c=new he,this.d=new he,this.b=new he}function VJt(){this.g=new Fpt,this.b=new Fpt,this.a=new he,this.k=new he}function GJt(t,e,n){this.a=t,this.c=e,this.d=n,le(e.e,this),le(n.b,this)}function UJt(t,e){oUt.call(this,e.rd(),e.qd()&-6),On(t),this.a=t,this.b=e}function WJt(t,e){cUt.call(this,e.rd(),e.qd()&-6),On(t),this.a=t,this.b=e}function Tmt(t,e){ent.call(this,e.rd(),e.qd()&-6),On(t),this.a=t,this.b=e}function R$(t,e,n){this.a=t,this.b=e,this.c=n,le(t.t,this),le(e.i,this)}function j$(){this.b=new Zi,this.a=new Zi,this.b=new Zi,this.a=new Zi}function $$(){$$=Z,WS=new Vi("org.eclipse.elk.labels.labelManager")}function YJt(){YJt=Z,ETt=new Ps("separateLayerConnections",(Tz(),wlt))}function Uf(){Uf=Z,Ky=new Ubt("REGULAR",0),mb=new Ubt("CRITICAL",1)}function pD(){pD=Z,Sht=new qbt("STACKED",0),BO=new qbt("SEQUENCED",1)}function bD(){bD=Z,eft=new Zbt("FIXED",0),qG=new Zbt("CENTER_NODE",1)}function Man(t,e){var n;return n=P4n(t,e),t.b=new gz(n.c.length),U3n(t,n)}function Dan(t,e,n){var r;return++t.e,--t.f,r=u(t.d[e].$c(n),133),r.dd()}function KJt(t){var e;return t.a||(e=t.r,_t(e,148)&&(t.a=u(e,148))),t.a}function Cmt(t){if(t.a){if(t.e)return Cmt(t.e)}else return t;return null}function Ian(t,e){return t.pe.p?-1:0}function z$(t,e){return On(e),t.c=0,"Initial capacity must not be negative")}function ZJt(){ZJt=Z,gpe=Wr((Kf(),lt(ct(Oy,1),oe,232,0,[sc,eu,ac])))}function JJt(){JJt=Z,bpe=Wr((Qu(),lt(ct(ppe,1),oe,461,0,[Md,fb,kf])))}function tte(){tte=Z,vpe=Wr((yu(),lt(ct(wpe,1),oe,462,0,[n1,db,Ef])))}function ete(){ete=Z,rpe=Wr((O1(),lt(ct(fl,1),oe,132,0,[BEt,Ul,Iy])))}function nte(){nte=Z,Obe=Wr((q9(),lt(ct(D7t,1),oe,379,0,[ilt,rlt,slt])))}function rte(){rte=Z,Ybe=Wr((iv(),lt(ct(F7t,1),oe,423,0,[q4,P7t,llt])))}function ite(){ite=Z,S2e=Wr((n6(),lt(ct(DTt,1),oe,314,0,[P6,EO,MTt])))}function ste(){ste=Z,A2e=Wr((oz(),lt(ct(OTt,1),oe,337,0,[ITt,VV,Llt])))}function ate(){ate=Z,I2e=Wr((d2(),lt(ct(D2e,1),oe,450,0,[Ilt,w7,U4])))}function ote(){ote=Z,E2e=Wr((nv(),lt(ct(mlt,1),oe,361,0,[Dv,pb,Mv])))}function cte(){cte=Z,$2e=Wr((q0(),lt(ct(j2e,1),oe,303,0,[CO,Y4,F6])))}function ute(){ute=Z,R2e=Wr((eE(),lt(ct(qlt,1),oe,292,0,[$lt,zlt,TO])))}function lte(){lte=Z,ime=Wr((Z9(),lt(ct(P9t,1),oe,378,0,[vht,O9t,yG])))}function hte(){hte=Z,fme=Wr((yz(),lt(ct(W9t,1),oe,375,0,[G9t,_ht,U9t])))}function fte(){fte=Z,cme=Wr((V0(),lt(ct(H9t,1),oe,339,0,[vb,q9t,Eht])))}function dte(){dte=Z,hme=Wr((so(),lt(ct(lme,1),oe,452,0,[OS,tl,nu])))}function gte(){gte=Z,bme=Wr((Cz(),lt(ct(t_t,1),oe,377,0,[Mht,L7,Yy])))}function pte(){pte=Z,gme=Wr((cE(),lt(ct(X9t,1),oe,336,0,[Aht,K9t,PS])))}function bte(){bte=Z,pme=Wr((vz(),lt(ct(J9t,1),oe,338,0,[Z9t,Lht,Q9t])))}function wte(){wte=Z,Lme=Wr((ev(),lt(ct(Ame,1),oe,454,0,[RO,FS,TG])))}function vte(){vte=Z,Nye=Wr((Nz(),lt(ct(Fye,1),oe,442,0,[Ght,Hht,Vht])))}function mte(){mte=Z,Rye=Wr((HD(),lt(ct(T_t,1),oe,380,0,[NG,k_t,E_t])))}function yte(){yte=Z,e3e=Wr((Fz(),lt(ct(q_t,1),oe,381,0,[z_t,Qht,$_t])))}function xte(){xte=Z,t3e=Wr((mz(),lt(ct(R_t,1),oe,293,0,[Xht,B_t,N_t])))}function kte(){kte=Z,k3e=Wr((KD(),lt(ct(Zht,1),oe,437,0,[jG,$G,zG])))}function Ete(){Ete=Z,C4e=Wr((G0(),lt(ct(DAt,1),oe,334,0,[tU,sp,ZS])))}function Tte(){Tte=Z,x4e=Wr((M1(),lt(ct(mAt,1),oe,272,0,[P7,Zy,F7])))}function jan(){return ua(),lt(ct(PAt,1),oe,98,0,[Tb,G1,B7,Y2,g0,Gc])}function o2(t,e){return!t.o&&(t.o=new _l((Jc(),Sb),Hv,t,0)),ist(t.o,e)}function $an(t){return!t.g&&(t.g=new Ik),!t.g.d&&(t.g.d=new Hzt(t)),t.g.d}function zan(t){return!t.g&&(t.g=new Ik),!t.g.a&&(t.g.a=new Vzt(t)),t.g.a}function qan(t){return!t.g&&(t.g=new Ik),!t.g.b&&(t.g.b=new qzt(t)),t.g.b}function wD(t){return!t.g&&(t.g=new Ik),!t.g.c&&(t.g.c=new Gzt(t)),t.g.c}function Han(t,e,n){var r,s;for(s=new tE(e,t),r=0;rn||e=0?t._g(n,!0,!0):dv(t,e,!0)}function aon(t,e){return Ms(Xt(ye(Q(t,(ae(),Fv)))),Xt(ye(Q(e,Fv))))}function Dte(){Dte=Z,Dye=uv(uv(VR(new Vs,(wE(),RS)),(p_(),LG)),Oht)}function oon(t,e,n){var r;return r=xre(t,e,n),t.b=new gz(r.c.length),z5t(t,r)}function con(t){if(t.b<=0)throw it(new lc);return--t.b,t.a-=t.c.c,pe(t.a)}function uon(t){var e;if(!t.a)throw it(new FXt);return e=t.a,t.a=es(t.a),e}function lon(t){for(;!t.a;)if(!mYt(t.c,new ze(t)))return!1;return!0}function e6(t){var e;return Lr(t),_t(t,198)?(e=u(t,198),e):new btt(t)}function hon(t){V$(),u(t.We((ui(),Qy)),174).Fc((Zu(),sP)),t.Ye(kft,null)}function V$(){V$=Z,W3e=new LZ,K3e=new MZ,Y3e=Kun((ui(),kft),W3e,xb,K3e)}function G$(){G$=Z,y_t=new Qbt("LEAF_NUMBER",0),Uht=new Qbt("NODE_SIZE",1)}function fon(t,e,n){t.a=e,t.c=n,t.b.a.$b(),Ah(t.d),t.e.a.c=Nt(Qn,De,1,0,5,1)}function tit(t){t.a=Nt(Cr,Xr,25,t.b+1,15,1),t.c=Nt(Cr,Xr,25,t.b,15,1),t.d=0}function don(t,e){t.a.ue(e.d,t.b)>0&&(le(t.c,new $wt(e.c,e.d,t.d)),t.b=e.d)}function Fmt(t,e){if(t.g==null||e>=t.i)throw it(new nnt(e,t.i));return t.g[e]}function Ite(t,e,n){if(sE(t,n),n!=null&&!t.wj(n))throw it(new tet);return n}function Ote(t){var e;if(t.Ek())for(e=t.i-1;e>=0;--e)At(t,e);return amt(t)}function gon(t){var e,n;if(!t.b)return null;for(n=t.b;e=n.a[0];)n=e;return n}function pon(t,e){var n,r;return eJt(e),n=(r=t.slice(0,e),Bmt(r,t)),n.length=e,n}function $8(t,e,n,r){var s;r=(Z3(),r||_Et),s=t.slice(e,n),t5t(s,t,e,n,-e,r)}function uh(t,e,n,r,s){return e<0?dv(t,n,r):u(n,66).Nj().Pj(t,t.yh(),e,r,s)}function bon(t){return _t(t,172)?""+u(t,172).a:t==null?null:$o(t)}function won(t){return _t(t,172)?""+u(t,172).a:t==null?null:$o(t)}function Pte(t,e){if(e.a)throw it(new Vo(Pfe));Fs(t.a,e),e.a=t,!t.j&&(t.j=e)}function Nmt(t,e){ent.call(this,e.rd(),e.qd()&-16449),On(t),this.a=t,this.c=e}function Fte(t,e){var n,r;return r=e/t.c.Hd().gc()|0,n=e%t.c.Hd().gc(),t6(t,r,n)}function Qu(){Qu=Z,Md=new Let(y6,0),fb=new Let(qE,1),kf=new Let(x6,2)}function U$(){U$=Z,jut=new YR("All",0),OEt=new MUt,PEt=new qUt,FEt=new DUt}function Nte(){Nte=Z,Qge=Wr((U$(),lt(ct(sV,1),oe,297,0,[jut,OEt,PEt,FEt])))}function Bte(){Bte=Z,qbe=Wr((nE(),lt(ct(zbe,1),oe,405,0,[Lv,Fy,Py,z4])))}function Rte(){Rte=Z,Hpe=Wr((rv(),lt(ct(qpe,1),oe,406,0,[hO,lO,Wut,Yut])))}function jte(){jte=Z,Gpe=Wr((u6(),lt(ct(Vpe,1),oe,323,0,[dO,fO,gO,pO])))}function $te(){$te=Z,Ype=Wr((c_(),lt(ct(Wpe,1),oe,394,0,[bO,lV,hV,wO])))}function zte(){zte=Z,fye=Wr((wE(),lt(ct(s_t,1),oe,393,0,[AG,RS,$O,jS])))}function qte(){qte=Z,o2e=Wr((Tz(),lt(ct(a2e,1),oe,360,0,[wlt,BV,RV,kO])))}function Hte(){Hte=Z,Jye=Wr((eq(),lt(ct(F_t,1),oe,340,0,[Kht,O_t,P_t,I_t])))}function Vte(){Vte=Z,b2e=Wr((I1(),lt(ct(p2e,1),oe,411,0,[O6,f7,d7,vlt])))}function Gte(){Gte=Z,sme=Wr((cy(),lt(ct(yht,1),oe,197,0,[xG,mht,n5,e5])))}function Ute(){Ute=Z,q4e=Wr((Sl(),lt(ct(z4e,1),oe,396,0,[Ql,qAt,zAt,HAt])))}function Wte(){Wte=Z,S4e=Wr((zl(),lt(ct(_4e,1),oe,285,0,[rP,f0,kb,nP])))}function Yte(){Yte=Z,k4e=Wr((W0(),lt(ct(_ft,1),oe,218,0,[Cft,eP,N7,X6])))}function Kte(){Kte=Z,j4e=Wr((jz(),lt(ct($At,1),oe,311,0,[Lft,BAt,jAt,RAt])))}function Xte(){Xte=Z,B4e=Wr((Al(),lt(ct(rA,1),oe,374,0,[oP,K2,aP,Jy])))}function Qte(){Qte=Z,Dq(),TLt=as,V5e=Cs,CLt=new P3(as),G5e=new P3(Cs)}function xD(){xD=Z,jTt=new jbt(J0,0),WV=new jbt("IMPROVE_STRAIGHTNESS",1)}function von(t,e){return k8(),le(t,new fa(e,pe(e.e.c.length+e.g.c.length)))}function mon(t,e){return k8(),le(t,new fa(e,pe(e.e.c.length+e.g.c.length)))}function Bmt(t,e){return _D(e)!=10&<(ol(e),e.hm,e.__elementTypeId$,_D(e),t),t}function mu(t,e){var n;return n=Ro(t,e,0),n==-1?!1:(Fg(t,n),!0)}function Zte(t,e){var n;return n=u(Jx(t.e,e),387),n?(Hwt(n),n.e):null}function z8(t){var e;return Bo(t)&&(e=0-t,!isNaN(e))?e:Kp(rE(t))}function Ro(t,e,n){for(;n=0?Xz(t,n,!0,!0):dv(t,e,!0)}function qmt(t,e){GC();var n,r;return n=Xx(t),r=Xx(e),!!n&&!!r&&!gse(n.k,r.k)}function kon(t,e){ku(t,e==null||Pj((On(e),e))||isNaN((On(e),e))?0:(On(e),e))}function Eon(t,e){Eu(t,e==null||Pj((On(e),e))||isNaN((On(e),e))?0:(On(e),e))}function Ton(t,e){tv(t,e==null||Pj((On(e),e))||isNaN((On(e),e))?0:(On(e),e))}function Con(t,e){Jw(t,e==null||Pj((On(e),e))||isNaN((On(e),e))?0:(On(e),e))}function ree(t){(this.q?this.q:(wn(),wn(),u0)).Ac(t.q?t.q:(wn(),wn(),u0))}function _on(t,e){return _t(e,99)&&u(e,18).Bb&Ka?new rnt(e,t):new tE(e,t)}function Son(t,e){return _t(e,99)&&u(e,18).Bb&Ka?new rnt(e,t):new tE(e,t)}function iee(t,e){c7t=new vp,Upe=e,hS=t,u(hS.b,65),Amt(hS,c7t,null),Qle(hS)}function sit(t,e,n){var r;return r=t.g[e],p9(t,e,t.oi(e,n)),t.gi(e,n,r),t.ci(),r}function X$(t,e){var n;return n=t.Xc(e),n>=0?(t.$c(n),!0):!1}function ait(t){var e;return t.d!=t.r&&(e=Dh(t),t.e=!!e&&e.Cj()==j0e,t.d=e),t.e}function oit(t,e){var n;for(Lr(t),Lr(e),n=!1;e.Ob();)n=n|t.Fc(e.Pb());return n}function Xw(t,e){var n;return n=u(tr(t.e,e),387),n?(XUt(t,n),n.e):null}function see(t){var e,n;return e=t/60|0,n=t%60,n==0?""+e:""+e+":"+(""+n)}function Wo(t,e){var n,r;return w2(t),r=new Tmt(e,t.a),n=new kYt(r),new Tn(t,n)}function Jm(t,e){var n=t.a[e],r=(_it(),Put)[typeof n];return r?r(n):Uyt(typeof n)}function Aon(t){switch(t.g){case 0:return wi;case 1:return-1;default:return 0}}function Lon(t){return u4t(t,(q8(),oEt))<0?-GQe(rE(t)):t.l+t.m*m6+t.h*C2}function _D(t){return t.__elementTypeCategory$==null?10:t.__elementTypeCategory$}function cit(t){var e;return e=t.b.c.length==0?null:Ne(t.b,0),e!=null&&vit(t,0),e}function aee(t,e){for(;e[0]=0;)++e[0]}function SD(t,e){this.e=e,this.a=Jne(t),this.a<54?this.f=Yw(t):this.c=JD(t)}function oee(t,e,n,r){gi(),yw.call(this,26),this.c=t,this.a=e,this.d=n,this.b=r}function Jd(t,e,n){var r,s;for(r=10,s=0;st.a[r]&&(r=n);return r}function Fon(t,e){var n;return n=av(t.e.c,e.e.c),n==0?Ms(t.e.d,e.e.d):n}function e4(t,e){return e.e==0||t.e==0?s7:(TE(),uat(t,e))}function Non(t,e){if(!t)throw it(new Fn(jwn("Enum constant undefined: %s",e)))}function H9(){H9=Z,Gbe=new xg,Ube=new T3,Hbe=new cK,Vbe=new Vb,Wbe=new uK}function Q$(){Q$=Z,qEt=new Obt("BY_SIZE",0),Hut=new Obt("BY_SIZE_AND_SHAPE",1)}function Z$(){Z$=Z,tlt=new Pbt("EADES",0),gV=new Pbt("FRUCHTERMAN_REINGOLD",1)}function LD(){LD=Z,GV=new Rbt("READING_DIRECTION",0),NTt=new Rbt("ROTATION",1)}function uee(){uee=Z,L2e=Wr((x2(),lt(ct(FTt,1),oe,335,0,[Mlt,PTt,Dlt,vS,wS])))}function lee(){lee=Z,ame=Wr((u_(),lt(ct(N9t,1),oe,315,0,[F9t,xht,kht,DS,IS])))}function hee(){hee=Z,v2e=Wr((b4(),lt(ct(w2e,1),oe,363,0,[$V,qV,HV,zV,jV])))}function fee(){fee=Z,q2e=Wr((dh(),lt(ct(fCt,1),oe,163,0,[MO,ES,bb,TS,jy])))}function dee(){dee=Z,S3e=Wr((uI(),lt(ct(aSt,1),oe,316,0,[rSt,nft,sSt,rft,iSt])))}function gee(){gee=Z,X3e=Wr((Qf(),lt(ct(ip,1),oe,175,0,[qn,ea,Pd,V2,rp])))}function pee(){pee=Z,x3e=Wr((AE(),lt(ct(y3e,1),oe,355,0,[i5,G6,GS,VS,US])))}function bee(){bee=Z,Bbe=Wr((Wa(),lt(ct(I7t,1),oe,356,0,[Dd,gb,cu,qc,Io])))}function wee(){wee=Z,y4e=Wr((ao(),lt(ct(XS,1),oe,103,0,[h0,Cf,zh,ng,rg])))}function vee(){vee=Z,L4e=Wr((l4(),lt(ct(tA,1),oe,249,0,[Eb,iP,IAt,JS,OAt])))}function mee(){mee=Z,I4e=Wr((ve(),lt(ct(Xa,1),xc,61,0,[Zo,Pn,Hn,mr,Bn])))}function uit(t,e){var n;return n=u(tr(t.a,e),134),n||(n=new ka,ki(t.a,e,n)),n}function yee(t){var e;return e=u(Q(t,(ae(),Iv)),305),e?e.a==t:!1}function xee(t){var e;return e=u(Q(t,(ae(),Iv)),305),e?e.i==t:!1}function kee(t,e){return On(e),uvt(t),t.d.Ob()?(e.td(t.d.Pb()),!0):!1}function J$(t){return yc(t,wi)>0?wi:yc(t,Sa)<0?Sa:Ar(t)}function ty(t){return t<3?(jl(t,bfe),t+1):t=0&&e=-.01&&t.a<=B1&&(t.a=0),t.b>=-.01&&t.b<=B1&&(t.b=0),t}function Tee(t,e){return e==(Ant(),Ant(),Yge)?t.toLocaleLowerCase():t.toLowerCase()}function Vmt(t){return(t.i&2?"interface ":t.i&1?"":"class ")+(P0(t),t.o)}function Co(t){var e,n;n=(e=new iet,e),Dr((!t.q&&(t.q=new fe(Wh,t,11,10)),t.q),n)}function Bon(t,e){var n;return n=e>0?e-1:e,yHt(QKe(Kee(qwt(new r8,n),t.n),t.j),t.k)}function Ron(t,e,n,r){var s;t.j=-1,d5t(t,W4t(t,e,n),(to(),s=u(e,66).Mj(),s.Ok(r)))}function Cee(t){this.g=t,this.f=new he,this.a=b.Math.min(this.g.c.c,this.g.d.c)}function _ee(t){this.b=new he,this.a=new he,this.c=new he,this.d=new he,this.e=t}function See(t,e){this.a=new _r,this.e=new _r,this.b=(Z9(),yG),this.c=t,this.b=e}function Aee(t,e,n){Ij.call(this),Gmt(this),this.a=t,this.c=n,this.b=e.d,this.f=e.e}function Lee(t){this.d=t,this.c=t.c.vc().Kc(),this.b=null,this.a=null,this.e=(TR(),Mut)}function Qw(t){if(t<0)throw it(new Fn("Illegal Capacity: "+t));this.g=this.ri(t)}function jon(t,e){if(0>t||t>e)throw it(new ibt("fromIndex: 0, toIndex: "+t+Uxt+e))}function $on(t){var e;if(t.a==t.b.a)throw it(new lc);return e=t.a,t.c=e,t.a=t.a.e,e}function tz(t){var e;Rm(!!t.c),e=t.c.a,lh(t.d,t.c),t.b==t.c?t.b=e:--t.a,t.c=null}function ez(t,e){var n;return w2(t),n=new QXt(t,t.a.rd(),t.a.qd()|4,e),new Tn(t,n)}function zon(t,e){var n,r;return n=u(sy(t.d,e),14),n?(r=e,t.e.pc(r,n)):null}function nz(t,e){var n,r;for(r=t.Kc();r.Ob();)n=u(r.Pb(),70),Jt(n,(ae(),j6),e)}function qon(t){var e;return e=Xt(ye(Q(t,(Te(),Jg)))),e<0&&(e=0,Jt(t,Jg,e)),e}function Hon(t,e,n){var r;r=b.Math.max(0,t.b/2-.5),h_(n,r,1),le(e,new eGt(n,r))}function Von(t,e,n){var r;return r=t.a.e[u(e.a,10).p]-t.a.e[u(n.a,10).p],ps(JM(r))}function Mee(t,e,n,r,s,o){var h;h=Grt(r),Oa(h,s),oa(h,o),ln(t.a,r,new Fj(h,e,n.f))}function Dee(t,e){var n;if(n=mI(t.Tg(),e),!n)throw it(new Fn(lb+e+Wct));return n}function ey(t,e){var n;for(n=t;es(n);)if(n=es(n),n==e)return!0;return!1}function Gon(t,e){var n,r,s;for(r=e.a.cd(),n=u(e.a.dd(),14).gc(),s=0;s0&&(t.a/=e,t.b/=e),t}function Rl(t){var e;return t.w?t.w:(e=tsn(t),e&&!e.kh()&&(t.w=e),e)}function Jon(t){var e;return t==null?null:(e=u(t,190),tgn(e,e.length))}function At(t,e){if(t.g==null||e>=t.i)throw it(new nnt(e,t.i));return t.li(e,t.g[e])}function tcn(t){var e,n;for(e=t.a.d.j,n=t.c.d.j;e!=n;)vf(t.b,e),e=Oz(e);vf(t.b,e)}function ecn(t){var e;for(e=0;e=14&&e<=16))),t}function Fee(t,e,n){var r=function(){return t.apply(r,arguments)};return e.apply(r,n),r}function Nee(t,e,n){var r,s;r=e;do s=Xt(t.p[r.p])+n,t.p[r.p]=s,r=t.a[r.p];while(r!=e)}function H8(t,e){var n,r;r=t.a,n=Fln(t,e,null),r!=e&&!t.e&&(n=PE(t,e,n)),n&&n.Fi()}function Umt(t,e){return k1(),wf(sb),b.Math.abs(t-e)<=sb||t==e||isNaN(t)&&isNaN(e)}function Wmt(t,e){return k1(),wf(sb),b.Math.abs(t-e)<=sb||t==e||isNaN(t)&&isNaN(e)}function icn(t,e){return nb(),pu(t.b.c.length-t.e.c.length,e.b.c.length-e.e.c.length)}function n4(t,e){return nXe(U9(t,e,Ar(_a(i0,Xd(Ar(_a(e==null?0:Hi(e),s0)),15)))))}function Bee(){Bee=Z,Zbe=Wr((Vn(),lt(ct(flt,1),oe,267,0,[Os,ta,ks,Hc,Ll,z1])))}function Ree(){Ree=Z,s4e=Wr((hy(),lt(ct(dft,1),oe,291,0,[fft,XO,KO,hft,WO,YO])))}function jee(){jee=Z,J3e=Wr((t0(),lt(ct(LSt,1),oe,248,0,[uft,GO,UO,WG,GG,UG])))}function $ee(){$ee=Z,C2e=Wr((h6(),lt(ct(b7,1),oe,227,0,[p7,bS,g7,Ny,G4,V4])))}function zee(){zee=Z,N2e=Wr((kE(),lt(ct(QTt,1),oe,275,0,[mS,WTt,XTt,KTt,YTt,UTt])))}function qee(){qee=Z,F2e=Wr((oI(),lt(ct(GTt,1),oe,274,0,[YV,qTt,VTt,zTt,HTt,Rlt])))}function Hee(){Hee=Z,rme=Wr((uq(),lt(ct(I9t,1),oe,313,0,[wht,M9t,bht,L9t,D9t,mG])))}function Vee(){Vee=Z,O2e=Wr((dq(),lt(ct(RTt,1),oe,276,0,[Plt,Olt,Nlt,Flt,Blt,UV])))}function Gee(){Gee=Z,gye=Wr((p_(),lt(ct(dye,1),oe,327,0,[LG,Oht,Fht,Pht,Nht,Iht])))}function Uee(){Uee=Z,D4e=Wr((Zu(),lt(ct(eU,1),oe,273,0,[Cb,sg,sP,nA,eA,Q6])))}function Wee(){Wee=Z,E4e=Wr((hq(),lt(ct(CAt,1),oe,312,0,[Sft,kAt,TAt,yAt,EAt,xAt])))}function scn(){return py(),lt(ct(lo,1),oe,93,0,[_f,ig,Sf,Lf,d0,Hh,Yl,Af,qh])}function iz(t,e){var n;n=t.a,t.a=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,0,n,t.a))}function sz(t,e){var n;n=t.b,t.b=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,1,n,t.b))}function V8(t,e){var n;n=t.b,t.b=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,3,n,t.b))}function Jw(t,e){var n;n=t.f,t.f=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,3,n,t.f))}function tv(t,e){var n;n=t.g,t.g=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,4,n,t.g))}function ku(t,e){var n;n=t.i,t.i=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,5,n,t.i))}function Eu(t,e){var n;n=t.j,t.j=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,6,n,t.j))}function G8(t,e){var n;n=t.j,t.j=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,1,n,t.j))}function U8(t,e){var n;n=t.c,t.c=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,4,n,t.c))}function W8(t,e){var n;n=t.k,t.k=e,t.Db&4&&!(t.Db&1)&&mi(t,new Qm(t,2,n,t.k))}function hit(t,e){var n;n=t.d,t.d=e,t.Db&4&&!(t.Db&1)&&mi(t,new Rrt(t,2,n,t.d))}function Rg(t,e){var n;n=t.s,t.s=e,t.Db&4&&!(t.Db&1)&&mi(t,new Rrt(t,4,n,t.s))}function ry(t,e){var n;n=t.t,t.t=e,t.Db&4&&!(t.Db&1)&&mi(t,new Rrt(t,5,n,t.t))}function Y8(t,e){var n;n=t.F,t.F=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,5,n,e))}function MD(t,e){var n;return n=u(tr((GR(),dU),t),55),n?n.xj(e):Nt(Qn,De,1,e,5,1)}function H0(t,e){var n,r;return n=e in t.a,n&&(r=B0(t,e).he(),r)?r.a:null}function acn(t,e){var n,r,s;return n=(r=(Sw(),s=new ZT,s),e&&F5t(r,e),r),nyt(n,t),n}function Yee(t,e,n){if(sE(t,n),!t.Bk()&&n!=null&&!t.wj(n))throw it(new tet);return n}function Kee(t,e){return t.n=e,t.n?(t.f=new he,t.e=new he):(t.f=null,t.e=null),t}function jr(t,e,n,r,s,o){var h;return h=rrt(t,e),Qee(n,h),h.i=s?8:0,h.f=r,h.e=s,h.g=o,h}function Ymt(t,e,n,r,s){this.d=e,this.k=r,this.f=s,this.o=-1,this.p=1,this.c=t,this.a=n}function Kmt(t,e,n,r,s){this.d=e,this.k=r,this.f=s,this.o=-1,this.p=2,this.c=t,this.a=n}function Xmt(t,e,n,r,s){this.d=e,this.k=r,this.f=s,this.o=-1,this.p=6,this.c=t,this.a=n}function Qmt(t,e,n,r,s){this.d=e,this.k=r,this.f=s,this.o=-1,this.p=7,this.c=t,this.a=n}function Zmt(t,e,n,r,s){this.d=e,this.j=r,this.e=s,this.o=-1,this.p=4,this.c=t,this.a=n}function Xee(t,e){var n,r,s,o;for(r=e,s=0,o=r.length;s=0),afn(t.d,t.c)<0&&(t.a=t.a-1&t.d.a.length-1,t.b=t.d.c),t.c=-1}function Jmt(t){return t.a<54?t.f<0?-1:t.f>0?1:0:(!t.c&&(t.c=VD(t.f)),t.c).e}function wf(t){if(!(t>=0))throw it(new Fn("tolerance ("+t+") must be >= 0"));return t}function K8(){return oft||(oft=new jue,o4(oft,lt(ct($4,1),De,130,0,[new Tp]))),oft}function so(){so=Z,OS=new zet(N_,0),tl=new zet("INPUT",1),nu=new zet("OUTPUT",2)}function oz(){oz=Z,ITt=new Fet("ARD",0),VV=new Fet("MSD",1),Llt=new Fet("MANUAL",2)}function ev(){ev=Z,RO=new Uet("BARYCENTER",0),FS=new Uet(E1e,1),TG=new Uet(T1e,2)}function DD(t,e){var n;if(n=t.gc(),e<0||e>n)throw it(new qm(e,n));return new wwt(t,e)}function tne(t,e){var n;return _t(e,42)?t.c.Mc(e):(n=ist(t,e),qz(t,e),n)}function bo(t,e,n){return b2(t,e),Qc(t,n),Rg(t,0),ry(t,1),qg(t,!0),zg(t,!0),t}function jl(t,e){if(t<0)throw it(new Fn(e+" cannot be negative but was: "+t));return t}function ene(t,e){var n,r;for(n=0,r=t.gc();n0?u(Ne(n.a,r-1),10):null}function G9(t,e){var n;n=t.k,t.k=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,2,n,t.k))}function uz(t,e){var n;n=t.f,t.f=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,8,n,t.f))}function lz(t,e){var n;n=t.i,t.i=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,7,n,t.i))}function nyt(t,e){var n;n=t.a,t.a=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,8,n,t.a))}function ryt(t,e){var n;n=t.b,t.b=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,0,n,t.b))}function iyt(t,e){var n;n=t.b,t.b=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,0,n,t.b))}function syt(t,e){var n;n=t.c,t.c=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,1,n,t.c))}function ayt(t,e){var n;n=t.c,t.c=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,1,n,t.c))}function dit(t,e){var n;n=t.c,t.c=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,4,n,t.c))}function oyt(t,e){var n;n=t.d,t.d=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,1,n,t.d))}function git(t,e){var n;n=t.D,t.D=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,2,n,t.D))}function pit(t,e){t.r>0&&t.c0&&t.g!=0&&pit(t.i,e/t.r*t.i.d))}function pcn(t,e,n){var r;t.b=e,t.a=n,r=(t.a&512)==512?new Vqt:new XL,t.c=Dvn(r,t.b,t.a)}function lne(t,e){return X0(t.e,e)?(to(),ait(e)?new qj(e,t):new BM(e,t)):new nUt(e,t)}function hz(t,e){return eXe(W9(t.a,e,Ar(_a(i0,Xd(Ar(_a(e==null?0:Hi(e),s0)),15)))))}function bcn(t,e,n){return Zm(t,new ge(e),new Kn,new be(n),lt(ct(fl,1),oe,132,0,[]))}function wcn(t){var e,n;return 0>t?new mbt:(e=t+1,n=new PJt(e,t),new Z2t(null,n))}function vcn(t,e){wn();var n;return n=new Lx(1),ra(t)?ko(n,t,e):au(n.f,t,e),new q(n)}function mcn(t,e){var n,r;return n=t.o+t.p,r=e.o+e.p,ne?(e<<=1,e>0?e:D_):e}function bit(t){switch(L2t(t.e!=3),t.e){case 2:return!1;case 0:return!0}return Can(t)}function fne(t,e){var n;return _t(e,8)?(n=u(e,8),t.a==n.a&&t.b==n.b):!1}function wit(t,e,n){var r,s,o;return o=e>>5,s=e&31,r=Ns(Vm(t.n[n][o],Ar(F0(s,1))),3),r}function xcn(t,e){var n,r;for(r=e.vc().Kc();r.Ob();)n=u(r.Pb(),42),aq(t,n.cd(),n.dd())}function kcn(t,e){var n;n=new vp,u(e.b,65),u(e.b,65),u(e.b,65),xu(e.a,new Awt(t,n,e))}function cyt(t,e){var n;n=t.b,t.b=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,21,n,t.b))}function uyt(t,e){var n;n=t.d,t.d=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,11,n,t.d))}function fz(t,e){var n;n=t.j,t.j=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,13,n,t.j))}function dne(t,e,n){var r,s,o;for(o=t.a.length-1,s=t.b,r=0;r>>31;r!=0&&(t[n]=r)}function Icn(t,e){wn();var n,r;for(r=new he,n=0;n0&&(this.g=this.ri(this.i+(this.i/8|0)+1),t.Qc(this.g))}function ss(t,e){Rj.call(this,E5e,t,e),this.b=this,this.a=ou(t.Tg(),yn(this.e.Tg(),this.c))}function Y9(t,e){var n,r;for(On(e),r=e.vc().Kc();r.Ob();)n=u(r.Pb(),42),t.zc(n.cd(),n.dd())}function qcn(t,e,n){var r;for(r=n.Kc();r.Ob();)if(!O$(t,e,r.Pb()))return!1;return!0}function Hcn(t,e,n,r,s){var o;return n&&(o=Gi(e.Tg(),t.c),s=n.gh(e,-1-(o==-1?r:o),null,s)),s}function Vcn(t,e,n,r,s){var o;return n&&(o=Gi(e.Tg(),t.c),s=n.ih(e,-1-(o==-1?r:o),null,s)),s}function Ine(t){var e;if(t.b==-2){if(t.e==0)e=-1;else for(e=0;t.a[e]==0;e++);t.b=e}return t.b}function One(t){switch(t.g){case 2:return ve(),Bn;case 4:return ve(),Hn;default:return t}}function Pne(t){switch(t.g){case 1:return ve(),mr;case 3:return ve(),Pn;default:return t}}function Gcn(t){var e,n,r;return t.j==(ve(),Pn)&&(e=uce(t),n=Nu(e,Hn),r=Nu(e,Bn),r||r&&n)}function Ucn(t){var e,n;return e=u(t.e&&t.e(),9),n=u(yvt(e,e.length),9),new sh(e,n,e.length)}function Wcn(t,e){vr(e,k1e,1),p3t(dXe(new er((VC(),new hrt(t,!1,!1,new aN))))),or(e)}function ID(t,e){return Nn(),ra(t)?kmt(t,Br(e)):Bm(t)?Unt(t,ye(e)):Nm(t)?Qen(t,Re(e)):t.wd(e)}function pyt(t,e){e.q=t,t.d=b.Math.max(t.d,e.r),t.b+=e.d+(t.a.c.length==0?0:t.c),le(t.a,e)}function Q8(t,e){var n,r,s,o;return s=t.c,n=t.c+t.b,o=t.d,r=t.d+t.a,e.a>s&&e.ao&&e.b1||t.Ob())return++t.a,t.g=0,e=t.i,t.Ob(),e;throw it(new lc)}function sun(t){FUt();var e;return GVt(Dht,t)||(e=new RQ,e.a=t,swt(Dht,t,e)),u(po(Dht,t),635)}function Lh(t){var e,n,r,s;return s=t,r=0,s<0&&(s+=C2,r=Z0),n=ps(s/m6),e=ps(s-n*m6),iu(e,n,r)}function OD(t){var e,n,r;for(r=0,n=new Mx(t.a);n.a>22),s=t.h+e.h+(r>>22),iu(n&hl,r&hl,s&Z0)}function tre(t,e){var n,r,s;return n=t.l-e.l,r=t.m-e.m+(n>>22),s=t.h-e.h+(r>>22),iu(n&hl,r&hl,s&Z0)}function BD(t){var e;return t<128?(e=(pKt(),hEt)[t],!e&&(e=hEt[t]=new hR(t)),e):new hR(t)}function Wi(t){var e;return _t(t,78)?t:(e=t&&t.__java$exception,e||(e=new Hre(t),aqt(e)),e)}function RD(t){if(_t(t,186))return u(t,118);if(t)return null;throw it(new Sx(Kde))}function ere(t,e){if(e==null)return!1;for(;t.a!=t.b;)if(yi(e,Mz(t)))return!0;return!1}function xyt(t){return t.a.Ob()?!0:t.a!=t.d?!1:(t.a=new emt(t.e.f),t.a.Ob())}function Ls(t,e){var n,r;return n=e.Pc(),r=n.length,r==0?!1:(Pwt(t.c,t.c.length,n),!0)}function yun(t,e,n){var r,s;for(s=e.vc().Kc();s.Ob();)r=u(s.Pb(),42),t.yc(r.cd(),r.dd(),n);return t}function nre(t,e){var n,r;for(r=new S(t.b);r.a=0,"Negative initial capacity"),Bj(e>=0,"Non-positive load factor"),Xu(this)}function Sit(t,e,n){return t>=128?!1:t<64?u9(Ns(F0(1,t),n),0):u9(Ns(F0(1,t-64),e),0)}function Lun(t,e){return!t||!e||t==e?!1:av(t.b.c,e.b.c+e.b.b)<0&&av(e.b.c,t.b.c+t.b.b)<0}function gre(t){var e,n,r;return n=t.n,r=t.o,e=t.d,new ah(n.a-e.b,n.b-e.d,r.a+(e.b+e.c),r.b+(e.d+e.a))}function Mun(t){var e,n,r,s;for(n=t.a,r=0,s=n.length;rr)throw it(new qm(e,r));return t.hi()&&(n=DQt(t,n)),t.Vh(e,n)}function zD(t,e,n){return n==null?(!t.q&&(t.q=new _r),Jx(t.q,e)):(!t.q&&(t.q=new _r),ki(t.q,e,n)),t}function Jt(t,e,n){return n==null?(!t.q&&(t.q=new _r),Jx(t.q,e)):(!t.q&&(t.q=new _r),ki(t.q,e,n)),t}function pre(t){var e,n;return n=new B$,Mo(n,t),Jt(n,(Yp(),I6),t),e=new _r,Pyn(t,n,e),a5n(t,n,e),n}function Oun(t){k4();var e,n,r;for(n=Nt(Ws,ee,8,2,0,1),r=0,e=0;e<2;e++)r+=.5,n[e]=g1n(r,t);return n}function bre(t,e){var n,r,s,o;for(n=!1,r=t.a[e].length,o=0;o>=1);return e}function vre(t){var e,n;return n=pI(t.h),n==32?(e=pI(t.m),e==32?pI(t.l)+32:e+20-10):n-12}function Q9(t){var e;return e=t.a[t.b],e==null?null:(ts(t.a,t.b,null),t.b=t.b+1&t.a.length-1,e)}function mre(t){var e,n;return e=t.t-t.k[t.o.p]*t.d+t.j[t.o.p]>t.f,n=t.u+t.e[t.o.p]*t.d>t.f*t.s*t.d,e||n}function _z(t,e,n){var r,s;return r=new Qrt(e,n),s=new zt,t.b=lue(t,t.b,r,s),s.b||++t.c,t.b.b=!1,s.d}function yre(t,e,n){var r,s,o,h;for(h=t_(e,n),o=0,s=h.Kc();s.Ob();)r=u(s.Pb(),11),ki(t.c,r,pe(o++))}function Xp(t){var e,n;for(n=new S(t.a.b);n.an&&(n=t[e]);return n}function xre(t,e,n){var r;return r=new he,R5t(t,e,r,(ve(),Hn),!0,!1),R5t(t,n,r,Bn,!1,!1),r}function Lit(t,e,n){var r,s,o,h;return o=null,h=e,s=Kw(h,"labels"),r=new zGt(t,n),o=(Zbn(r.a,r.b,s),s),o}function Fun(t,e,n,r){var s;return s=C5t(t,e,n,r),!s&&(s=Nln(t,n,r),s&&!C4(t,e,s))?null:s}function Nun(t,e,n,r){var s;return s=_5t(t,e,n,r),!s&&(s=Uit(t,n,r),s&&!C4(t,e,s))?null:s}function kre(t,e){var n;for(n=0;n1||e>=0&&t.b<3)}function qD(t){var e,n,r;for(e=new Pu,r=ei(t,0);r.b!=r.d.c;)n=u(ti(r),8),m8(e,0,new xo(n));return e}function g2(t){var e,n;for(n=new S(t.a.b);n.ar?1:0}function $yt(t,e){return Uce(t,e)?(ln(t.b,u(Q(e,(ae(),By)),21),e),ri(t.a,e),!0):!1}function Yun(t){var e,n;e=u(Q(t,(ae(),Ju)),10),e&&(n=e.c,mu(n.a,e),n.a.c.length==0&&mu(Na(e).b,n))}function Are(t){return $1?Nt(Zge,Mfe,572,0,0,1):u(P1(t.a,Nt(Zge,Mfe,572,t.a.c.length,0,1)),842)}function Kun(t,e,n,r){return c$(),new uet(lt(ct(P2,1),Hq,42,0,[(kst(t,e),new Lw(t,e)),(kst(n,r),new Lw(n,r))]))}function a4(t,e,n){var r,s;return s=(r=new iet,r),bo(s,e,n),Dr((!t.q&&(t.q=new fe(Wh,t,11,10)),t.q),s),s}function Oit(t){var e,n,r,s;for(s=xXe(Z4e,t),n=s.length,r=Nt(Ae,ee,2,n,6,1),e=0;e=t.b.c.length||(zyt(t,2*e+1),n=2*e+2,n=0&&t[r]===e[r];r--);return r<0?0:Cet(Ns(t[r],co),Ns(e[r],co))?-1:1}function Xun(t,e){var n,r;for(r=ei(t,0);r.b!=r.d.c;)n=u(ti(r),214),n.e.length>0&&(e.td(n),n.i&&Vln(n))}function Fit(t,e){var n,r;return r=u(Dn(t.a,4),126),n=Nt(Fft,lut,415,e,0,1),r!=null&&Dc(r,0,n,0,r.length),n}function Mre(t,e){var n;return n=new fat((t.f&256)!=0,t.i,t.a,t.d,(t.f&16)!=0,t.j,t.g,e),t.e!=null||(n.c=t),n}function Qun(t,e){var n,r;for(r=t.Zb().Cc().Kc();r.Ob();)if(n=u(r.Pb(),14),n.Hc(e))return!0;return!1}function Nit(t,e,n,r,s){var o,h;for(h=n;h<=s;h++)for(o=e;o<=r;o++)if(f4(t,o,h))return!0;return!1}function Dre(t,e,n){var r,s,o,h;for(On(n),h=!1,o=t.Zc(e),s=n.Kc();s.Ob();)r=s.Pb(),o.Rb(r),h=!0;return h}function Zun(t,e){var n;return t===e?!0:_t(e,83)?(n=u(e,83),H4t(Rw(t),n.vc())):!1}function Ire(t,e,n){var r,s;for(s=n.Kc();s.Ob();)if(r=u(s.Pb(),42),t.re(e,r.dd()))return!0;return!1}function Ore(t,e,n){return t.d[e.p][n.p]||(Yfn(t,e,n),t.d[e.p][n.p]=!0,t.d[n.p][e.p]=!0),t.a[e.p][n.p]}function sE(t,e){if(!t.ai()&&e==null)throw it(new Fn("The 'no null' constraint is violated"));return e}function aE(t,e){t.D==null&&t.B!=null&&(t.D=t.B,t.B=null),git(t,e==null?null:(On(e),e)),t.C&&t.yk(null)}function Jun(t,e){var n;return!t||t==e||!Us(e,(ae(),Pv))?!1:(n=u(Q(e,(ae(),Pv)),10),n!=t)}function Bit(t){switch(t.i){case 2:return!0;case 1:return!1;case-1:++t.c;default:return t.pl()}}function Pre(t){switch(t.i){case-2:return!0;case-1:return!1;case 1:--t.c;default:return t.ql()}}function Fre(t){TQt.call(this,"The given string does not match the expected format for individual spacings.",t)}function Sl(){Sl=Z,Ql=new uj("ELK",0),qAt=new uj("JSON",1),zAt=new uj("DOT",2),HAt=new uj("SVG",3)}function HD(){HD=Z,NG=new Yet(J0,0),k_t=new Yet("RADIAL_COMPACTION",1),E_t=new Yet("WEDGE_COMPACTION",2)}function O1(){O1=Z,BEt=new _et("CONCURRENT",0),Ul=new _et("IDENTITY_FINISH",1),Iy=new _et("UNORDERED",2)}function Rit(){Rit=Z,f7t=(jR(),Kut),h7t=new mn(o6t,f7t),Xpe=new Vi(c6t),Qpe=new Vi(u6t),Zpe=new Vi(l6t)}function oE(){oE=Z,CTt=new J5,_Tt=new ZK,l2e=new OL,u2e=new JK,c2e=new tX,TTt=(On(c2e),new gn)}function cE(){cE=Z,Aht=new Het("CONSERVATIVE",0),K9t=new Het("CONSERVATIVE_SOFT",1),PS=new Het("SLOPPY",2)}function Sz(){Sz=Z,MAt=new Ow(15),T4e=new eo((ui(),U2),MAt),QS=Y6,_At=o4e,SAt=G2,LAt=c5,AAt=XG}function jit(t,e,n){var r,s,o;for(r=new Zi,o=ei(n,0);o.b!=o.d.c;)s=u(ti(o),8),ri(r,new xo(s));Dre(t,e,r)}function tln(t){var e,n,r;for(e=0,r=Nt(Ws,ee,8,t.b,0,1),n=ei(t,0);n.b!=n.d.c;)r[e++]=u(ti(n),8);return r}function Hyt(t){var e;return e=(!t.a&&(t.a=new fe(ag,t,9,5)),t.a),e.i!=0?vXe(u(At(e,0),678)):null}function eln(t,e){var n;return n=Pa(t,e),Cet(Drt(t,e),0)|PXe(Drt(t,n),0)?n:Pa(qq,Drt(Vm(n,63),1))}function nln(t,e){var n;n=Ie((nst(),vG))!=null&&e.wg()!=null?Xt(ye(e.wg()))/Xt(ye(Ie(vG))):1,ki(t.b,e,n)}function rln(t,e){var n,r;return n=u(t.d.Bc(e),14),n?(r=t.e.hc(),r.Gc(n),t.e.d-=n.gc(),n.$b(),r):null}function Vyt(t,e){var n,r;if(r=t.c[e],r!=0)for(t.c[e]=0,t.d-=r,n=e+1;n0)return T8(e-1,t.a.c.length),Fg(t.a,e-1);throw it(new cqt)}function iln(t,e,n){if(e<0)throw it(new yo(sde+e));ee)throw it(new Fn(Wq+t+Dfe+e));if(t<0||e>n)throw it(new ibt(Wq+t+Yxt+e+Uxt+n))}function Rre(t){if(!t.a||!(t.a.i&8))throw it(new No("Enumeration class expected for layout option "+t.f))}function iy(t){var e;++t.j,t.i==0?t.g=null:t.ikH?t-n>kH:n-t>kH}function zit(t,e){return!t||e&&!t.j||_t(t,124)&&u(t,124).a.b==0?0:t.Re()}function Lz(t,e){return!t||e&&!t.k||_t(t,124)&&u(t,124).a.a==0?0:t.Se()}function VD(t){return rb(),t<0?t!=-1?new j3t(-1,-t):But:t<=10?CEt[ps(t)]:new j3t(1,t)}function Uyt(t){throw _it(),it(new eHt("Unexpected typeof result '"+t+"'; please report this bug to the GWT team"))}function Hre(t){oHt(),yj(this),d$(this),this.e=t,nue(this,t),this.g=t==null?_u:$o(t),this.a="",this.b=t,this.a=""}function Wyt(){this.a=new vZ,this.f=new X$t(this),this.b=new Q$t(this),this.i=new Z$t(this),this.e=new J$t(this)}function Vre(){dKe.call(this,new Mmt(ty(16))),jl(2,ffe),this.b=2,this.a=new Lvt(null,null,0,null),dM(this.a,this.a)}function Z9(){Z9=Z,vht=new jet("DUMMY_NODE_OVER",0),O9t=new jet("DUMMY_NODE_UNDER",1),yG=new jet("EQUAL",2)}function qit(){qit=Z,olt=_Qt(lt(ct(XS,1),oe,103,0,[(ao(),zh),Cf])),clt=_Qt(lt(ct(XS,1),oe,103,0,[rg,ng]))}function Hit(t){return(ve(),Au).Hc(t.j)?Xt(ye(Q(t,(ae(),k7)))):Yo(lt(ct(Ws,1),ee,8,0,[t.i.n,t.n,t.a])).b}function uln(t){var e,n,r,s;for(r=t.b.a,n=r.a.ec().Kc();n.Ob();)e=u(n.Pb(),561),s=new Nce(e,t.e,t.f),le(t.g,s)}function b2(t,e){var n,r,s;r=t.nk(e,null),s=null,e&&(s=(c8(),n=new xw,n),H8(s,t.r)),r=F1(t,s,r),r&&r.Fi()}function lln(t,e){var n,r;for(r=ul(t.d,1)!=0,n=!0;n;)n=!1,n=e.c.Tf(e.e,r),n=n|yI(t,e,r,!1),r=!r;hyt(t)}function Yyt(t,e){var n,r,s;return r=!1,n=e.q.d,e.ds&&(bae(e.q,s),r=n!=e.q.d)),r}function Gre(t,e){var n,r,s,o,h,d,v,k;return v=e.i,k=e.j,r=t.f,s=r.i,o=r.j,h=v-s,d=k-o,n=b.Math.sqrt(h*h+d*d),n}function Kyt(t,e){var n,r;return r=Hz(t),r||(n=(Fat(),woe(e)),r=new Jzt(n),Dr(r.Vk(),t)),r}function GD(t,e){var n,r;return n=u(t.c.Bc(e),14),n?(r=t.hc(),r.Gc(n),t.d-=n.gc(),n.$b(),t.mc(r)):t.jc()}function Ure(t,e){var n;for(n=0;n=t.c.b:t.a<=t.c.b))throw it(new lc);return e=t.a,t.a+=t.c.c,++t.b,pe(e)}function dln(t){var e;return e=new Cee(t),hD(t.a,Wbe,new yl(lt(ct(mO,1),De,369,0,[e]))),e.d&&le(e.f,e.d),e.f}function Vit(t){var e;return e=new b2t(t.a),Mo(e,t),Jt(e,(ae(),_i),t),e.o.a=t.g,e.o.b=t.f,e.n.a=t.i,e.n.b=t.j,e}function gln(t,e,n,r){var s,o;for(o=t.Kc();o.Ob();)s=u(o.Pb(),70),s.n.a=e.a+(r.a-s.o.a)/2,s.n.b=e.b,e.b+=s.o.b+n}function pln(t,e,n){var r,s;for(s=e.a.a.ec().Kc();s.Ob();)if(r=u(s.Pb(),57),sQt(t,r,n))return!0;return!1}function bln(t){var e,n;for(n=new S(t.r);n.a=0?e:-e;r>0;)r%2==0?(n*=n,r=r/2|0):(s*=n,r-=1);return e<0?1/s:s}function yln(t,e){var n,r,s;for(s=1,n=t,r=e>=0?e:-e;r>0;)r%2==0?(n*=n,r=r/2|0):(s*=n,r-=1);return e<0?1/s:s}function Jre(t){var e,n;if(t!=null)for(n=0;n0&&(n=u(Ne(t.a,t.a.c.length-1),570),$yt(n,e))||le(t.a,new IJt(e))}function Cln(t){df();var e,n;e=t.d.c-t.e.c,n=u(t.g,145),xu(n.b,new AC(e)),xu(n.c,new Yb(e)),va(n.i,new dR(e))}function rie(t){var e;return e=new Mp,e.a+="VerticalSegment ",hc(e,t.e),e.a+=" ",Gr(e,_2t(new vet,new S(t.k))),e.a}function _ln(t){var e;return e=u(Xw(t.c.c,""),229),e||(e=new Yx(o8(a8(new xm,""),"Other")),m2(t.c.c,"",e)),e}function J9(t){var e;return t.Db&64?mf(t):(e=new _h(mf(t)),e.a+=" (name: ",go(e,t.zb),e.a+=")",e.a)}function t3t(t,e,n){var r,s;return s=t.sb,t.sb=e,t.Db&4&&!(t.Db&1)&&(r=new Js(t,1,4,s,e),n?n.Ei(r):n=r),n}function Git(t,e){var n,r,s;for(n=0,s=Ko(t,e).Kc();s.Ob();)r=u(s.Pb(),11),n+=Q(r,(ae(),Ju))!=null?1:0;return n}function c4(t,e,n){var r,s,o;for(r=0,o=ei(t,0);o.b!=o.d.c&&(s=Xt(ye(ti(o))),!(s>n));)s>=e&&++r;return r}function Sln(t,e,n){var r,s;return r=new z0(t.e,3,13,null,(s=e.c,s||(dn(),W1)),Hg(t,e),!1),n?n.Ei(r):n=r,n}function Aln(t,e,n){var r,s;return r=new z0(t.e,4,13,(s=e.c,s||(dn(),W1)),null,Hg(t,e),!1),n?n.Ei(r):n=r,n}function e3t(t,e,n){var r,s;return s=t.r,t.r=e,t.Db&4&&!(t.Db&1)&&(r=new Js(t,1,8,s,t.r),n?n.Ei(r):n=r),n}function $g(t,e){var n,r;return n=u(e,676),r=n.vk(),!r&&n.wk(r=_t(e,88)?new JGt(t,u(e,26)):new yZt(t,u(e,148))),r}function UD(t,e,n){var r;t.qi(t.i+1),r=t.oi(e,n),e!=t.i&&Dc(t.g,e,t.g,e+1,t.i-e),ts(t.g,e,r),++t.i,t.bi(e,n),t.ci()}function Lln(t,e){var n;return e.a&&(n=e.a.a.length,t.a?Gr(t.a,t.b):t.a=new Ol(t.d),kZt(t.a,e.a,e.d.length,n)),t}function Mln(t,e){var n,r,s,o;if(e.vi(t.a),o=u(Dn(t.a,8),1936),o!=null)for(n=o,r=0,s=n.length;rn)throw it(new yo(Wq+t+Yxt+e+", size: "+n));if(t>e)throw it(new Fn(Wq+t+Dfe+e))}function fh(t,e,n){if(e<0)i5t(t,n);else{if(!n.Ij())throw it(new Fn(lb+n.ne()+X_));u(n,66).Nj().Vj(t,t.yh(),e)}}function Oln(t,e,n,r,s,o,h,d){var v;for(v=n;o=r||e=65&&t<=70?t-65+10:t>=97&&t<=102?t-97+10:t>=48&&t<=57?t-48:0}function lie(t){var e;return t.Db&64?mf(t):(e=new _h(mf(t)),e.a+=" (source: ",go(e,t.d),e.a+=")",e.a)}function Fln(t,e,n){var r,s;return s=t.a,t.a=e,t.Db&4&&!(t.Db&1)&&(r=new Js(t,1,5,s,t.a),n?T4t(n,r):n=r),n}function zg(t,e){var n;n=(t.Bb&256)!=0,e?t.Bb|=256:t.Bb&=-257,t.Db&4&&!(t.Db&1)&&mi(t,new bf(t,1,2,n,e))}function r3t(t,e){var n;n=(t.Bb&256)!=0,e?t.Bb|=256:t.Bb&=-257,t.Db&4&&!(t.Db&1)&&mi(t,new bf(t,1,8,n,e))}function Iz(t,e){var n;n=(t.Bb&256)!=0,e?t.Bb|=256:t.Bb&=-257,t.Db&4&&!(t.Db&1)&&mi(t,new bf(t,1,8,n,e))}function qg(t,e){var n;n=(t.Bb&512)!=0,e?t.Bb|=512:t.Bb&=-513,t.Db&4&&!(t.Db&1)&&mi(t,new bf(t,1,3,n,e))}function i3t(t,e){var n;n=(t.Bb&512)!=0,e?t.Bb|=512:t.Bb&=-513,t.Db&4&&!(t.Db&1)&&mi(t,new bf(t,1,9,n,e))}function e_(t,e){var n;return t.b==-1&&t.a&&(n=t.a.Gj(),t.b=n?t.c.Xg(t.a.aj(),n):Gi(t.c.Tg(),t.a)),t.c.Og(t.b,e)}function pe(t){var e,n;return t>-129&&t<128?(e=t+128,n=(cKt(),fEt)[e],!n&&(n=fEt[e]=new uM(t)),n):new uM(t)}function uE(t){var e,n;return t>-129&&t<128?(e=t+128,n=(gKt(),bEt)[e],!n&&(n=bEt[e]=new fR(t)),n):new fR(t)}function s3t(t){var e,n;return e=t.k,e==(Vn(),ks)?(n=u(Q(t,(ae(),oc)),61),n==(ve(),Pn)||n==mr):!1}function Nln(t,e,n){var r,s,o;return o=(s=_E(t.b,e),s),o&&(r=u(Pq(TD(t,o),""),26),r)?C5t(t,r,e,n):null}function Uit(t,e,n){var r,s,o;return o=(s=_E(t.b,e),s),o&&(r=u(Pq(TD(t,o),""),26),r)?_5t(t,r,e,n):null}function hie(t,e){var n,r;for(r=new nr(t);r.e!=r.i.gc();)if(n=u(dr(r),138),Vt(e)===Vt(n))return!0;return!1}function n_(t,e,n){var r;if(r=t.gc(),e>r)throw it(new qm(e,r));if(t.hi()&&t.Hc(n))throw it(new Fn(eO));t.Xh(e,n)}function Bln(t,e){var n;if(n=n4(t.i,e),n==null)throw it(new ud("Node did not exist in input."));return byt(e,n),null}function Rln(t,e){var n;if(n=mI(t,e),_t(n,322))return u(n,34);throw it(new Fn(lb+e+"' is not a valid attribute"))}function jln(t,e,n){var r,s;for(s=_t(e,99)&&u(e,18).Bb&Ka?new rnt(e,t):new tE(e,t),r=0;re?1:t==e?t==0?Ms(1/t,1/e):0:isNaN(t)?isNaN(e)?0:1:-1}function Yln(t,e){vr(e,"Sort end labels",1),ls(Ri(Wo(new Tn(null,new _n(t.b,16)),new cN),new K5),new AK),or(e)}function r_(t,e,n){var r,s;return t.ej()?(s=t.fj(),r=Jst(t,e,n),t.$i(t.Zi(7,pe(n),r,e,s)),r):Jst(t,e,n)}function Wit(t,e){var n,r,s;t.d==null?(++t.e,--t.f):(s=e.cd(),n=e.Sh(),r=(n&wi)%t.d.length,Dan(t,r,Lce(t,r,n,s)))}function lE(t,e){var n;n=(t.Bb&xf)!=0,e?t.Bb|=xf:t.Bb&=-1025,t.Db&4&&!(t.Db&1)&&mi(t,new bf(t,1,10,n,e))}function hE(t,e){var n;n=(t.Bb&Ey)!=0,e?t.Bb|=Ey:t.Bb&=-4097,t.Db&4&&!(t.Db&1)&&mi(t,new bf(t,1,12,n,e))}function fE(t,e){var n;n=(t.Bb&Hu)!=0,e?t.Bb|=Hu:t.Bb&=-8193,t.Db&4&&!(t.Db&1)&&mi(t,new bf(t,1,15,n,e))}function dE(t,e){var n;n=(t.Bb&Dy)!=0,e?t.Bb|=Dy:t.Bb&=-2049,t.Db&4&&!(t.Db&1)&&mi(t,new bf(t,1,11,n,e))}function Kln(t,e){var n;return n=Ms(t.b.c,e.b.c),n!=0||(n=Ms(t.a.a,e.a.a),n!=0)?n:Ms(t.a.b,e.a.b)}function Xln(t,e){var n;if(n=tr(t.k,e),n==null)throw it(new ud("Port did not exist in input."));return byt(e,n),null}function Qln(t){var e,n;for(n=Pce(Rl(t)).Kc();n.Ob();)if(e=Br(n.Pb()),k_(t,e))return san((HVt(),l5e),e);return null}function Zln(t,e){var n,r,s,o,h;for(h=ou(t.e.Tg(),e),o=0,n=u(t.g,119),s=0;s>10)+RI&ys,e[1]=(t&1023)+56320&ys,Mh(e,0,e.length)}function Pz(t){var e,n;return n=u(Q(t,(Te(),Wl)),103),n==(ao(),h0)?(e=Xt(ye(Q(t,rG))),e>=1?Cf:ng):n}function ehn(t){switch(u(Q(t,(Te(),eg)),218).g){case 1:return new YX;case 3:return new JX;default:return new WX}}function w2(t){if(t.c)w2(t.c);else if(t.d)throw it(new No("Stream already terminated, can't be modified or used"))}function Xit(t){var e;return t.Db&64?mf(t):(e=new _h(mf(t)),e.a+=" (identifier: ",go(e,t.k),e.a+=")",e.a)}function pie(t,e,n){var r,s;return r=(Sw(),s=new xp,s),iz(r,e),sz(r,n),t&&Dr((!t.a&&(t.a=new As(Gh,t,5)),t.a),r),r}function Qit(t,e,n,r){var s,o;return On(r),On(n),s=t.xc(e),o=s==null?n:MVt(u(s,15),u(n,14)),o==null?t.Bc(e):t.zc(e,o),o}function un(t){var e,n,r,s;return n=(e=u(Vf((r=t.gm,s=r.f,s==Hr?r:s)),9),new sh(e,u(ff(e,e.length),9),0)),vf(n,t),n}function nhn(t,e,n){var r,s;for(s=t.a.ec().Kc();s.Ob();)if(r=u(s.Pb(),10),ND(n,u(Ne(e,r.p),14)))return r;return null}function rhn(t,e,n){var r;try{Bun(t,e,n)}catch(s){throw s=Wi(s),_t(s,597)?(r=s,it(new dmt(r))):it(s)}return e}function Jp(t,e){var n;return Bo(t)&&Bo(e)&&(n=t-e,BI>1,t.k=n-1>>1}function Zit(){M4t();var t,e,n;n=Jxn+++Date.now(),t=ps(b.Math.floor(n*$I))&Uq,e=ps(n-t*Gxt),this.a=t^1502,this.b=e^Eot}function U0(t){var e,n,r;for(e=new he,r=new S(t.j);r.a34028234663852886e22?as:e<-34028234663852886e22?Cs:e}function bie(t){return t-=t>>1&1431655765,t=(t>>2&858993459)+(t&858993459),t=(t>>4)+t&252645135,t+=t>>8,t+=t>>16,t&63}function wie(t){var e,n,r,s;for(e=new QWt(t.Hd().gc()),s=0,r=e6(t.Hd().Kc());r.Ob();)n=r.Pb(),vin(e,n,pe(s++));return Hgn(e.a)}function uhn(t,e){var n,r,s;for(s=new _r,r=e.vc().Kc();r.Ob();)n=u(r.Pb(),42),ki(s,n.cd(),tun(t,u(n.dd(),15)));return s}function h3t(t,e){t.n.c.length==0&&le(t.n,new E$(t.s,t.t,t.i)),le(t.b,e),W3t(u(Ne(t.n,t.n.c.length-1),211),e),Sle(t,e)}function u4(t){return(t.c!=t.b.b||t.i!=t.g.b)&&(t.a.c=Nt(Qn,De,1,0,5,1),Ls(t.a,t.b),Ls(t.a,t.g),t.c=t.b.b,t.i=t.g.b),t.a}function Jit(t,e){var n,r,s;for(s=0,r=u(e.Kb(t),20).Kc();r.Ob();)n=u(r.Pb(),17),je(Re(Q(n,(ae(),q1))))||++s;return s}function lhn(t,e){var n,r,s;r=t4(e),s=Xt(ye(oy(r,(Te(),Tf)))),n=b.Math.max(0,s/2-.5),h_(e,n,1),le(t,new uGt(e,n))}function dh(){dh=Z,MO=new MM(J0,0),ES=new MM("FIRST",1),bb=new MM(C1e,2),TS=new MM("LAST",3),jy=new MM(_1e,4)}function W0(){W0=Z,Cft=new sj(N_,0),eP=new sj("POLYLINE",1),N7=new sj("ORTHOGONAL",2),X6=new sj("SPLINES",3)}function Fz(){Fz=Z,z_t=new Xet("ASPECT_RATIO_DRIVEN",0),Qht=new Xet("MAX_SCALE_DRIVEN",1),$_t=new Xet("AREA_DRIVEN",2)}function KD(){KD=Z,jG=new Qet("P1_STRUCTURE",0),$G=new Qet("P2_PROCESSING_ORDER",1),zG=new Qet("P3_EXECUTION",2)}function Nz(){Nz=Z,Ght=new Wet("OVERLAP_REMOVAL",0),Hht=new Wet("COMPACTION",1),Vht=new Wet("GRAPH_SIZE_CALCULATION",2)}function av(t,e){return k1(),wf(sb),b.Math.abs(t-e)<=sb||t==e||isNaN(t)&&isNaN(e)?0:te?1:Iw(isNaN(t),isNaN(e))}function vie(t,e){var n,r;for(n=ei(t,0);n.b!=n.d.c;){if(r=pM(ye(ti(n))),r==e)return;if(r>e){Ort(n);break}}eD(n,e)}function an(t,e){var n,r,s,o,h;if(n=e.f,m2(t.c.d,n,e),e.g!=null)for(s=e.g,o=0,h=s.length;oe&&r.ue(t[o-1],t[o])>0;--o)h=t[o],ts(t,o,t[o-1]),ts(t,o-1,h)}function gh(t,e,n,r){if(e<0)M5t(t,n,r);else{if(!n.Ij())throw it(new Fn(lb+n.ne()+X_));u(n,66).Nj().Tj(t,t.yh(),e,r)}}function Bz(t,e){if(e==t.d)return t.e;if(e==t.e)return t.d;throw it(new Fn("Node "+e+" not part of edge "+t))}function fhn(t,e){switch(e.g){case 2:return t.b;case 1:return t.c;case 4:return t.d;case 3:return t.a;default:return!1}}function mie(t,e){switch(e.g){case 2:return t.b;case 1:return t.c;case 4:return t.d;case 3:return t.a;default:return!1}}function f3t(t,e,n,r){switch(e){case 3:return t.f;case 4:return t.g;case 5:return t.i;case 6:return t.j}return n3t(t,e,n,r)}function dhn(t){return t.k!=(Vn(),Os)?!1:N8(new Tn(null,new jw(new ar(lr(Ds(t).a.Kc(),new z)))),new $N)}function ghn(t){return t.e==null?t:(!t.c&&(t.c=new fat((t.f&256)!=0,t.i,t.a,t.d,(t.f&16)!=0,t.j,t.g,null)),t.c)}function phn(t,e){return t.h==NI&&t.m==0&&t.l==0?(e&&(hb=iu(0,0,0)),yUt((q8(),aEt))):(e&&(hb=iu(t.l,t.m,t.h)),iu(0,0,0))}function $o(t){var e;return Array.isArray(t)&&t.im===Et?Ip(ol(t))+"@"+(e=Hi(t)>>>0,e.toString(16)):t.toString()}function i_(t){var e;this.a=(e=u(t.e&&t.e(),9),new sh(e,u(ff(e,e.length),9),0)),this.b=Nt(Qn,De,1,this.a.a.length,5,1)}function bhn(t){var e,n,r;for(this.a=new O0,r=new S(t);r.a0&&(Rr(e-1,t.length),t.charCodeAt(e-1)==58)&&!tst(t,oA,cA))}function tst(t,e,n){var r,s;for(r=0,s=t.length;r=s)return e.c+n;return e.c+e.b.gc()}function xhn(t,e){y8();var n,r,s,o;for(r=Ote(t),s=e,$8(r,0,r.length,s),n=0;n0&&(r+=s,++n);return n>1&&(r+=t.d*(n-1)),r}function g3t(t){var e,n,r;for(r=new Ag,r.a+="[",e=0,n=t.gc();e0&&this.b>0&&Kwt(this.c,this.b,this.a)}function w3t(t){nst(),this.c=A1(lt(ct(w6n,1),De,831,0,[eme])),this.b=new _r,this.a=t,ki(this.b,vG,1),xu(nme,new czt(this))}function yie(t,e){var n;return t.d?Tl(t.b,e)?u(tr(t.b,e),51):(n=e.Kf(),ki(t.b,e,n),n):e.Kf()}function v3t(t,e){var n;return Vt(t)===Vt(e)?!0:_t(e,91)?(n=u(e,91),t.e==n.e&&t.d==n.d&&oan(t,n.a)):!1}function a6(t){switch(ve(),t.g){case 4:return Pn;case 1:return Hn;case 3:return mr;case 2:return Bn;default:return Zo}}function m3t(t,e){switch(e){case 3:return t.f!=0;case 4:return t.g!=0;case 5:return t.i!=0;case 6:return t.j!=0}return vyt(t,e)}function Shn(t){switch(t.g){case 0:return new gZ;case 1:return new tB;default:throw it(new Fn(Ict+(t.f!=null?t.f:""+t.g)))}}function xie(t){switch(t.g){case 0:return new JN;case 1:return new eB;default:throw it(new Fn(Yot+(t.f!=null?t.f:""+t.g)))}}function kie(t){switch(t.g){case 0:return new Qpt;case 1:return new Oqt;default:throw it(new Fn(_H+(t.f!=null?t.f:""+t.g)))}}function Ahn(t){switch(t.g){case 1:return new uZ;case 2:return new jWt;default:throw it(new Fn(Ict+(t.f!=null?t.f:""+t.g)))}}function Lhn(t){var e,n;if(t.b)return t.b;for(n=$1?null:t.d;n;){if(e=$1?null:n.b,e)return e;n=$1?null:n.d}return d8(),NEt}function Mhn(t){var e,n,r;return t.e==0?0:(e=t.d<<5,n=t.a[t.d-1],t.e<0&&(r=Ine(t),r==t.d-1&&(--n,n=n|0)),e-=pI(n),e)}function Dhn(t){var e,n,r;return t>5,e=t&31,r=Nt(Cr,Xr,25,n+1,15,1),r[n]=1<3;)s*=10,--o;t=(t+(s>>1))/s|0}return r.i=t,!0}function Ohn(t){return qit(),Nn(),!!(mie(u(t.a,81).j,u(t.b,103))||u(t.a,81).d.e!=0&&mie(u(t.a,81).j,u(t.b,103)))}function Phn(t){V$(),u(t.We((ui(),xb)),174).Hc((ll(),iU))&&(u(t.We(Qy),174).Fc((Zu(),Q6)),u(t.We(xb),174).Mc(iU))}function Tie(t,e){var n,r;if(e){for(n=0;n=0;--r)for(e=n[r],s=0;s>1,this.k=e-1>>1}function $hn(t,e){vr(e,"End label post-processing",1),ls(Ri(Wo(new Tn(null,new _n(t.b,16)),new kK),new EK),new TK),or(e)}function zhn(t,e,n){var r,s;return r=Xt(t.p[e.i.p])+Xt(t.d[e.i.p])+e.n.b+e.a.b,s=Xt(t.p[n.i.p])+Xt(t.d[n.i.p])+n.n.b+n.a.b,s-r}function qhn(t,e,n){var r,s;for(r=Ns(n,co),s=0;yc(r,0)!=0&&s0&&(Rr(0,e.length),e.charCodeAt(0)==43)?e.substr(1):e))}function Vhn(t){var e;return t==null?null:new Rp((e=$c(t,!0),e.length>0&&(Rr(0,e.length),e.charCodeAt(0)==43)?e.substr(1):e))}function _3t(t,e){var n;return t.i>0&&(e.lengtht.i&&ts(e,t.i,null),e}function Zc(t,e,n){var r,s,o;return t.ej()?(r=t.i,o=t.fj(),UD(t,r,e),s=t.Zi(3,null,e,r,o),n?n.Ei(s):n=s):UD(t,t.i,e),n}function Ghn(t,e,n){var r,s;return r=new z0(t.e,4,10,(s=e.c,_t(s,88)?u(s,26):(dn(),Kh)),null,Hg(t,e),!1),n?n.Ei(r):n=r,n}function Uhn(t,e,n){var r,s;return r=new z0(t.e,3,10,null,(s=e.c,_t(s,88)?u(s,26):(dn(),Kh)),Hg(t,e),!1),n?n.Ei(r):n=r,n}function Sie(t){$m();var e;return e=new xo(u(t.e.We((ui(),c5)),8)),t.B.Hc((ll(),R7))&&(e.a<=0&&(e.a=20),e.b<=0&&(e.b=20)),e}function Aie(t){cy();var e;return(t.q?t.q:(wn(),wn(),u0))._b((Te(),Bv))?e=u(Q(t,Bv),197):e=u(Q(Na(t),AS),197),e}function oy(t,e){var n,r;return r=null,Us(t,(Te(),bG))&&(n=u(Q(t,bG),94),n.Xe(e)&&(r=n.We(e))),r==null&&(r=Q(Na(t),e)),r}function Lie(t,e){var n,r,s;return _t(e,42)?(n=u(e,42),r=n.cd(),s=sy(t.Rc(),r),pd(s,n.dd())&&(s!=null||t.Rc()._b(r))):!1}function ist(t,e){var n,r,s;return t.f>0?(t.qj(),r=e==null?0:Hi(e),s=(r&wi)%t.d.length,n=Lce(t,s,r,e),n!=-1):!1}function Xf(t,e){var n,r,s;return t.f>0&&(t.qj(),r=e==null?0:Hi(e),s=(r&wi)%t.d.length,n=l5t(t,s,r,e),n)?n.dd():null}function XD(t,e){var n,r,s,o;for(o=ou(t.e.Tg(),e),n=u(t.g,119),s=0;s1?S1(F0(e.a[1],32),Ns(e.a[0],co)):Ns(e.a[0],co),Yw(_a(e.e,n))))}function QD(t,e){var n;return Bo(t)&&Bo(e)&&(n=t%e,BI>5,e&=31,s=t.d+n+(e==0?0:1),r=Nt(Cr,Xr,25,s,15,1),W0n(r,t.a,n,e),o=new X3(t.e,s,r),N9(o),o}function A3t(t,e,n){var r,s;r=u(Nc(z7,e),117),s=u(Nc(gA,e),117),n?(ko(z7,t,r),ko(gA,t,s)):(ko(gA,t,r),ko(z7,t,s))}function Nie(t,e,n){var r,s,o;for(s=null,o=t.b;o;){if(r=t.a.ue(e,o.d),n&&r==0)return o;r>=0?o=o.a[1]:(s=o,o=o.a[0])}return s}function Bie(t,e,n){var r,s,o;for(s=null,o=t.b;o;){if(r=t.a.ue(e,o.d),n&&r==0)return o;r<=0?o=o.a[0]:(s=o,o=o.a[1])}return s}function Qhn(t,e,n,r){var s,o,h;return s=!1,I4n(t.f,n,r)&&(kfn(t.f,t.a[e][n],t.a[e][r]),o=t.a[e],h=o[r],o[r]=o[n],o[n]=h,s=!0),s}function L3t(t,e,n,r,s){var o,h,d;for(h=s;e.b!=e.c;)o=u(Hx(e),10),d=u(Ko(o,r).Xb(0),11),t.d[d.p]=h++,n.c[n.c.length]=d;return h}function M3t(t,e,n){var r,s,o,h,d;return h=t.k,d=e.k,r=n[h.g][d.g],s=ye(oy(t,r)),o=ye(oy(e,r)),b.Math.max((On(s),s),(On(o),o))}function Zhn(t,e,n){var r,s,o,h;for(r=n/t.c.length,s=0,h=new S(t);h.a2e3&&(Pge=t,JH=b.setTimeout(sXe,10))),ZH++==0?(Oon((nbt(),rEt)),!0):!1}function tfn(t,e){var n,r,s;for(r=new ar(lr(Ds(t).a.Kc(),new z));zr(r);)if(n=u(Mr(r),17),s=n.d.i,s.c==e)return!1;return!0}function D3t(t,e){var n,r;if(_t(e,245)){r=u(e,245);try{return n=t.vd(r),n==0}catch(s){if(s=Wi(s),!_t(s,205))throw it(s)}}return!1}function efn(){return Error.stackTraceLimit>0?(b.Error.stackTraceLimit=Error.stackTraceLimit=64,!0):"stack"in new Error}function nfn(t,e){return k1(),k1(),wf(sb),(b.Math.abs(t-e)<=sb||t==e||isNaN(t)&&isNaN(e)?0:te?1:Iw(isNaN(t),isNaN(e)))>0}function I3t(t,e){return k1(),k1(),wf(sb),(b.Math.abs(t-e)<=sb||t==e||isNaN(t)&&isNaN(e)?0:te?1:Iw(isNaN(t),isNaN(e)))<0}function $ie(t,e){return k1(),k1(),wf(sb),(b.Math.abs(t-e)<=sb||t==e||isNaN(t)&&isNaN(e)?0:te?1:Iw(isNaN(t),isNaN(e)))<=0}function ast(t,e){for(var n=0;!e[n]||e[n]=="";)n++;for(var r=e[n++];nvot)return n.fh();if(r=n.Zg(),r||n==t)break}return r}function O3t(t){return C$(),_t(t,156)?u(tr(dP,Uge),288).vg(t):Tl(dP,ol(t))?u(tr(dP,ol(t)),288).vg(t):null}function ifn(t){if(Vz(XE,t))return Nn(),r7;if(Vz(Vct,t))return Nn(),F2;throw it(new Fn("Expecting true or false"))}function sfn(t,e){if(e.c==t)return e.d;if(e.d==t)return e.c;throw it(new Fn("Input edge is not connected to the input port."))}function Uie(t,e){return t.e>e.e?1:t.ee.d?t.e:t.d=48&&t<48+b.Math.min(10,10)?t-48:t>=97&&t<97?t-97+10:t>=65&&t<65?t-65+10:-1}function Yie(t,e){var n;return Vt(e)===Vt(t)?!0:!_t(e,21)||(n=u(e,21),n.gc()!=t.gc())?!1:t.Ic(n)}function afn(t,e){var n,r,s,o;return r=t.a.length-1,n=e-t.b&r,o=t.c-e&r,s=t.c-t.b&r,TWt(n=o?(sln(t,e),-1):(aln(t,e),1)}function ofn(t,e){var n,r;for(n=(Rr(e,t.length),t.charCodeAt(e)),r=e+1;re.e?1:t.fe.f?1:Hi(t)-Hi(e)}function Vz(t,e){return On(t),e==null?!1:hn(t,e)?!0:t.length==e.length&&hn(t.toLowerCase(),e.toLowerCase())}function bfn(t,e){var n,r,s,o;for(r=0,s=e.gc();r0&&yc(t,128)<0?(e=Ar(t)+128,n=(dKt(),dEt)[e],!n&&(n=dEt[e]=new Am(t)),n):new Am(t)}function Xie(t,e){var n,r;return n=e.Hh(t.a),n&&(r=Br(Xf((!n.b&&(n.b=new kl((dn(),Qa),cc,n)),n.b),ci)),r!=null)?r:e.ne()}function wfn(t,e){var n,r;return n=e.Hh(t.a),n&&(r=Br(Xf((!n.b&&(n.b=new kl((dn(),Qa),cc,n)),n.b),ci)),r!=null)?r:e.ne()}function vfn(t,e){_rt();var n,r;for(r=new ar(lr(U0(t).a.Kc(),new z));zr(r);)if(n=u(Mr(r),17),n.d.i==e||n.c.i==e)return n;return null}function N3t(t,e,n){this.c=t,this.f=new he,this.e=new Ca,this.j=new Gwt,this.n=new Gwt,this.b=e,this.g=new ah(e.c,e.d,e.b,e.a),this.a=n}function ost(t){var e,n,r,s;for(this.a=new O0,this.d=new Hs,this.e=0,n=t,r=0,s=n.length;r0):!1}function Jie(t){var e;Vt(qe(t,(ui(),s5)))===Vt((G0(),tU))&&(es(t)?(e=u(qe(es(t),s5),334),wo(t,s5,e)):wo(t,s5,ZS))}function kfn(t,e,n){var r,s;qst(t.e,e,n,(ve(),Bn)),qst(t.i,e,n,Hn),t.a&&(s=u(Q(e,(ae(),_i)),11),r=u(Q(n,_i),11),Irt(t.g,s,r))}function tse(t,e,n){var r,s,o;r=e.c.p,o=e.p,t.b[r][o]=new wQt(t,e),n&&(t.a[r][o]=new e8(e),s=u(Q(e,(ae(),Pv)),10),s&&ln(t.d,s,e))}function ese(t,e){var n,r,s;if(le(dV,t),e.Fc(t),n=u(tr(Jut,t),21),n)for(s=n.Kc();s.Ob();)r=u(s.Pb(),33),Ro(dV,r,0)!=-1||ese(r,e)}function Efn(t,e,n){var r;(Jge?(Lhn(t),!0):tpe||npe?(d8(),!0):epe&&(d8(),!1))&&(r=new LYt(e),r.b=n,_gn(t,r))}function cst(t,e){var n;n=!t.A.Hc((Al(),K2))||t.q==(ua(),Gc),t.u.Hc((Zu(),sg))?n?G5n(t,e):Dhe(t,e):t.u.Hc(Cb)&&(n?l5n(t,e):Ghe(t,e))}function bE(t,e){var n,r;if(++t.j,e!=null&&(n=(r=t.a.Cb,_t(r,97)?u(r,97).Jg():null),vbn(e,n))){o6(t.a,4,n);return}o6(t.a,4,u(e,126))}function nse(t,e,n){return new ah(b.Math.min(t.a,e.a)-n/2,b.Math.min(t.b,e.b)-n/2,b.Math.abs(t.a-e.a)+n,b.Math.abs(t.b-e.b)+n)}function Tfn(t,e){var n,r;return n=pu(t.a.c.p,e.a.c.p),n!=0?n:(r=pu(t.a.d.i.p,e.a.d.i.p),r!=0?r:pu(e.a.d.p,t.a.d.p))}function Cfn(t,e,n){var r,s,o,h;return o=e.j,h=n.j,o!=h?o.g-h.g:(r=t.f[e.p],s=t.f[n.p],r==0&&s==0?0:r==0?-1:s==0?1:Ms(r,s))}function rse(t,e,n){var r,s,o;if(!n[e.d])for(n[e.d]=!0,s=new S(u4(e));s.a=s)return s;for(e=e>0?e:0;er&&ts(e,r,null),e}function sse(t,e){var n,r;for(r=t.a.length,e.lengthr&&ts(e,r,null),e}function m2(t,e,n){var r,s,o;return s=u(tr(t.e,e),387),s?(o=awt(s,n),XUt(t,s),o):(r=new Owt(t,e,n),ki(t.e,e,r),kQt(r),null)}function Afn(t){var e;if(t==null)return null;if(e=k2n($c(t,!0)),e==null)throw it(new pet("Invalid hexBinary value: '"+t+"'"));return e}function JD(t){return rb(),yc(t,0)<0?yc(t,-1)!=0?new x4t(-1,z8(t)):But:yc(t,10)<=0?CEt[Ar(t)]:new x4t(1,t)}function lst(){return $q(),lt(ct($pe,1),oe,159,0,[Rpe,Bpe,jpe,Lpe,Ape,Mpe,Ope,Ipe,Dpe,Npe,Fpe,Ppe,_pe,Cpe,Spe,Epe,kpe,Tpe,ype,mpe,xpe,Uut])}function ase(t){var e;this.d=new he,this.j=new Ca,this.g=new Ca,e=t.g.b,this.f=u(Q(Na(e),(Te(),Wl)),103),this.e=Xt(ye(Wz(e,Wy)))}function ose(t){this.b=new he,this.e=new he,this.d=t,this.a=!qC(Ri(new Tn(null,new jw(new L1(t.b))),new Zt(new zN))).sd((Qb(),o7))}function Qf(){Qf=Z,qn=new OM("PARENTS",0),ea=new OM("NODES",1),Pd=new OM("EDGES",2),V2=new OM("PORTS",3),rp=new OM("LABELS",4)}function l4(){l4=Z,Eb=new FM("DISTRIBUTED",0),iP=new FM("JUSTIFIED",1),IAt=new FM("BEGIN",2),JS=new FM(qE,3),OAt=new FM("END",4)}function Lfn(t){var e;switch(e=t.yi(null),e){case 10:return 0;case 15:return 1;case 14:return 2;case 11:return 3;case 21:return 4}return-1}function hst(t){switch(t.g){case 1:return ao(),rg;case 4:return ao(),zh;case 2:return ao(),Cf;case 3:return ao(),ng}return ao(),h0}function Mfn(t,e,n){var r;switch(r=n.q.getFullYear()-ab+ab,r<0&&(r=-r),e){case 1:t.a+=r;break;case 2:Jd(t,r%100,2);break;default:Jd(t,r,e)}}function ei(t,e){var n,r;if(Km(e,t.b),e>=t.b>>1)for(r=t.c,n=t.b;n>e;--n)r=r.b;else for(r=t.a.a,n=0;n=64&&e<128&&(s=S1(s,F0(1,e-64)));return s}function Wz(t,e){var n,r;return r=null,Us(t,(ui(),K6))&&(n=u(Q(t,K6),94),n.Xe(e)&&(r=n.We(e))),r==null&&Na(t)&&(r=Q(Na(t),e)),r}function lse(t,e){var n,r,s;s=e.d.i,r=s.k,!(r==(Vn(),Os)||r==z1)&&(n=new ar(lr(Ds(s).a.Kc(),new z)),zr(n)&&ki(t.k,e,u(Mr(n),17)))}function fst(t,e){var n,r,s;return r=yn(t.Tg(),e),n=e-t.Ah(),n<0?(s=t.Yg(r),s>=0?t.lh(s):Zst(t,r)):n<0?Zst(t,r):u(r,66).Nj().Sj(t,t.yh(),n)}function Ie(t){var e;if(_t(t.a,4)){if(e=O3t(t.a),e==null)throw it(new No(ode+t.b+"'. "+ade+(P0(gP),gP.k)+d8t));return e}else return t.a}function Ofn(t){var e;if(t==null)return null;if(e=J5n($c(t,!0)),e==null)throw it(new pet("Invalid base64Binary value: '"+t+"'"));return e}function dr(t){var e;try{return e=t.i.Xb(t.e),t.mj(),t.g=t.e++,e}catch(n){throw n=Wi(n),_t(n,73)?(t.mj(),it(new lc)):it(n)}}function dst(t){var e;try{return e=t.c.ki(t.e),t.mj(),t.g=t.e++,e}catch(n){throw n=Wi(n),_t(n,73)?(t.mj(),it(new lc)):it(n)}}function o_(){o_=Z,p7t=(ui(),hAt),Qut=HSt,Jpe=W6,g7t=U2,rbe=(sq(),WEt),nbe=GEt,ibe=KEt,ebe=VEt,tbe=(Rit(),h7t),Xut=Xpe,d7t=Qpe,fV=Zpe}function Yz(t){switch(kbt(),this.c=new he,this.d=t,t.g){case 0:case 2:this.a=Mvt(O7t),this.b=as;break;case 3:case 1:this.a=O7t,this.b=Cs}}function hse(t,e,n){var r,s;if(t.c)ku(t.c,t.c.i+e),Eu(t.c,t.c.j+n);else for(s=new S(t.b);s.a0&&(le(t.b,new GYt(e.a,n)),r=e.a.length,0r&&(e.a+=KUt(Nt(xh,yd,25,-r,15,1))))}function fse(t,e){var n,r,s;for(n=t.o,s=u(u(Ai(t.r,e),21),84).Kc();s.Ob();)r=u(s.Pb(),111),r.e.a=N1n(r,n.a),r.e.b=n.b*Xt(ye(r.b.We(uV)))}function Ffn(t,e){var n,r,s,o;return s=t.k,n=Xt(ye(Q(t,(ae(),Fv)))),o=e.k,r=Xt(ye(Q(e,Fv))),o!=(Vn(),ks)?-1:s!=ks?1:n==r?0:n=0?t.hh(e,n,r):(t.eh()&&(r=(s=t.Vg(),s>=0?t.Qg(r):t.eh().ih(t,-1-s,null,r))),t.Sg(e,n,r))}function R3t(t,e){switch(e){case 7:!t.e&&(t.e=new Cn(Ys,t,7,4)),xr(t.e);return;case 8:!t.d&&(t.d=new Cn(Ys,t,8,5)),xr(t.d);return}T3t(t,e)}function Zf(t,e){var n;n=t.Zc(e);try{return n.Pb()}catch(r){throw r=Wi(r),_t(r,109)?it(new yo("Can't get element "+e)):it(r)}}function j3t(t,e){this.e=t,e=0&&(n.d=t.t);break;case 3:t.t>=0&&(n.a=t.t)}t.C&&(n.b=t.C.b,n.c=t.C.c)}function u6(){u6=Z,dO=new QR(Kq,0),fO=new QR(Iot,1),gO=new QR(Oot,2),pO=new QR(Pot,3),dO.a=!1,fO.a=!0,gO.a=!1,pO.a=!0}function c_(){c_=Z,bO=new XR(Kq,0),lV=new XR(Iot,1),hV=new XR(Oot,2),wO=new XR(Pot,3),bO.a=!1,lV.a=!0,hV.a=!1,wO.a=!0}function $fn(t){var e;e=t.a;do e=u(Mr(new ar(lr(jo(e).a.Kc(),new z))),17).c.i,e.k==(Vn(),ta)&&t.b.Fc(e);while(e.k==(Vn(),ta));t.b=l2(t.b)}function zfn(t){var e,n,r;for(r=t.c.a,t.p=(Lr(r),new Bu(r)),n=new S(r);n.an.b)return!0}return!1}function gst(t,e){return ra(t)?!!Sge[e]:t.hm?!!t.hm[e]:Bm(t)?!!_ge[e]:Nm(t)?!!Cge[e]:!1}function wo(t,e,n){return n==null?(!t.o&&(t.o=new _l((Jc(),Sb),Hv,t,0)),qz(t.o,e)):(!t.o&&(t.o=new _l((Jc(),Sb),Hv,t,0)),aq(t.o,e,n)),t}function Gfn(t,e,n,r){var s,o;o=e.Xe((ui(),o5))?u(e.We(o5),21):t.j,s=Pln(o),s!=($q(),Uut)&&(n&&!P3t(s)||V4t(E2n(t,s,r),e))}function Xz(t,e,n,r){var s,o,h;return o=yn(t.Tg(),e),s=e-t.Ah(),s<0?(h=t.Yg(o),h>=0?t._g(h,n,!0):dv(t,o,n)):u(o,66).Nj().Pj(t,t.yh(),s,n,r)}function Ufn(t,e,n,r){var s,o,h;n.mh(e)&&(to(),ait(e)?(s=u(n.ah(e),153),bfn(t,s)):(o=(h=e,h?u(r,49).xh(h):null),o&&YYe(n.ah(e),o)))}function Wfn(t){switch(t.g){case 1:return rv(),hO;case 3:return rv(),lO;case 2:return rv(),Yut;case 4:return rv(),Wut;default:return null}}function $3t(t){switch(typeof t){case Vat:return Vg(t);case Nxt:return ps(t);case b6:return Nn(),t?1231:1237;default:return t==null?0:Pw(t)}}function Yfn(t,e,n){if(t.e)switch(t.b){case 1:Ern(t.c,e,n);break;case 0:Trn(t.c,e,n)}else tJt(t.c,e,n);t.a[e.p][n.p]=t.c.i,t.a[n.p][e.p]=t.c.e}function wse(t){var e,n;if(t==null)return null;for(n=Nt(l0,ee,193,t.length,0,2),e=0;e=0)return s;if(t.Fk()){for(r=0;r=s)throw it(new qm(e,s));if(t.hi()&&(r=t.Xc(n),r>=0&&r!=e))throw it(new Fn(eO));return t.mi(e,n)}function z3t(t,e){if(this.a=u(Lr(t),245),this.b=u(Lr(e),245),t.vd(e)>0||t==(cet(),_ut)||e==(oet(),Sut))throw it(new Fn("Invalid range: "+XZt(t,e)))}function vse(t){var e,n;for(this.b=new he,this.c=t,this.a=!1,n=new S(t.a);n.a0),(e&-e)==e)return ps(e*ul(t,31)*4656612873077393e-25);do n=ul(t,31),r=n%e;while(n-r+(e-1)<0);return ps(r)}function Vg(t){MYt();var e,n,r;return n=":"+t,r=aV[n],r!=null?ps((On(r),r)):(r=REt[n],e=r==null?$wn(t):ps((On(r),r)),prn(),aV[n]=e,e)}function yse(t,e,n){vr(n,"Compound graph preprocessor",1),t.a=new Uw,_he(t,e,null),S3n(t,e),uwn(t),Jt(e,(ae(),rCt),t.a),t.a=null,Xu(t.b),or(n)}function Qfn(t,e,n){switch(n.g){case 1:t.a=e.a/2,t.b=0;break;case 2:t.a=e.a,t.b=e.b/2;break;case 3:t.a=e.a/2,t.b=e.b;break;case 4:t.a=0,t.b=e.b/2}}function Zfn(t){var e,n,r;for(r=u(Ai(t.a,(b4(),qV)),15).Kc();r.Ob();)n=u(r.Pb(),101),e=t4t(n),_8(t,n,e[0],(nv(),Mv),0),_8(t,n,e[1],Dv,1)}function Jfn(t){var e,n,r;for(r=u(Ai(t.a,(b4(),HV)),15).Kc();r.Ob();)n=u(r.Pb(),101),e=t4t(n),_8(t,n,e[0],(nv(),Mv),0),_8(t,n,e[1],Dv,1)}function pst(t){switch(t.g){case 0:return null;case 1:return new yne;case 2:return new Zpt;default:throw it(new Fn(Ict+(t.f!=null?t.f:""+t.g)))}}function tI(t,e,n){var r,s;for(xun(t,e-t.s,n-t.t),s=new S(t.n);s.a1&&(o=Xfn(t,e)),o}function bst(t){var e;return t.f&&t.f.kh()&&(e=u(t.f,49),t.f=u(Zp(t,e),82),t.f!=e&&t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,9,8,e,t.f))),t.f}function wst(t){var e;return t.i&&t.i.kh()&&(e=u(t.i,49),t.i=u(Zp(t,e),82),t.i!=e&&t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,9,7,e,t.i))),t.i}function no(t){var e;return t.b&&t.b.Db&64&&(e=t.b,t.b=u(Zp(t,e),18),t.b!=e&&t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,9,21,e,t.b))),t.b}function Jz(t,e){var n,r,s;t.d==null?(++t.e,++t.f):(r=e.Sh(),bwn(t,t.f+1),s=(r&wi)%t.d.length,n=t.d[s],!n&&(n=t.d[s]=t.uj()),n.Fc(e),++t.f)}function V3t(t,e,n){var r;return e.Kj()?!1:e.Zj()!=-2?(r=e.zj(),r==null?n==null:yi(r,n)):e.Hj()==t.e.Tg()&&n==null}function tq(){var t;jl(16,bfe),t=hne(16),this.b=Nt(Lut,PI,317,t,0,1),this.c=Nt(Lut,PI,317,t,0,1),this.a=null,this.e=null,this.i=0,this.f=t-1,this.g=0}function Y0(t){cwt.call(this),this.k=(Vn(),Os),this.j=(jl(6,ky),new Xc(6)),this.b=(jl(2,ky),new Xc(2)),this.d=new net,this.f=new Hpt,this.a=t}function e1n(t){var e,n;t.c.length<=1||(e=vue(t,(ve(),mr)),aoe(t,u(e.a,19).a,u(e.b,19).a),n=vue(t,Bn),aoe(t,u(n.a,19).a,u(n.b,19).a))}function u_(){u_=Z,F9t=new LM("SIMPLE",0),xht=new LM(Xot,1),kht=new LM("LINEAR_SEGMENTS",2),DS=new LM("BRANDES_KOEPF",3),IS=new LM(q1e,4)}function G3t(t,e,n){jx(u(Q(e,(Te(),cs)),98))||(jmt(t,e,Gg(e,n)),jmt(t,e,Gg(e,(ve(),mr))),jmt(t,e,Gg(e,Pn)),wn(),Zs(e.j,new hM(t)))}function xse(t,e,n,r){var s,o,h;for(s=u(Ai(r?t.a:t.b,e),21),h=s.Kc();h.Ob();)if(o=u(h.Pb(),33),Tq(t,n,o))return!0;return!1}function vst(t){var e,n;for(n=new nr(t);n.e!=n.i.gc();)if(e=u(dr(n),87),e.e||(!e.d&&(e.d=new As(ho,e,1)),e.d).i!=0)return!0;return!1}function mst(t){var e,n;for(n=new nr(t);n.e!=n.i.gc();)if(e=u(dr(n),87),e.e||(!e.d&&(e.d=new As(ho,e,1)),e.d).i!=0)return!0;return!1}function n1n(t){var e,n,r;for(e=0,r=new S(t.c.a);r.a102?-1:t<=57?t-48:t<65?-1:t<=70?t-65+10:t<97?-1:t-97+10}function kst(t,e){if(t==null)throw it(new Sx("null key in entry: null="+e));if(e==null)throw it(new Sx("null value in entry: "+t+"=null"))}function r1n(t,e){for(var n,r;t.Ob();)if(!e.Ob()||(n=t.Pb(),r=e.Pb(),!(Vt(n)===Vt(r)||n!=null&&yi(n,r))))return!1;return!e.Ob()}function Ese(t,e){var n;return n=lt(ct(aa,1),vo,25,15,[zit(t.a[0],e),zit(t.a[1],e),zit(t.a[2],e)]),t.d&&(n[0]=b.Math.max(n[0],n[2]),n[2]=n[0]),n}function Tse(t,e){var n;return n=lt(ct(aa,1),vo,25,15,[Lz(t.a[0],e),Lz(t.a[1],e),Lz(t.a[2],e)]),t.d&&(n[0]=b.Math.max(n[0],n[2]),n[2]=n[0]),n}function x2(){x2=Z,Mlt=new AM("GREEDY",0),PTt=new AM(A1e,1),Dlt=new AM(Xot,2),vS=new AM("MODEL_ORDER",3),wS=new AM("GREEDY_MODEL_ORDER",4)}function Cse(t,e){var n,r,s;for(t.b[e.g]=1,r=ei(e.d,0);r.b!=r.d.c;)n=u(ti(r),188),s=n.c,t.b[s.g]==1?ri(t.a,n):t.b[s.g]==2?t.b[s.g]=1:Cse(t,s)}function i1n(t,e){var n,r,s;for(s=new Xc(e.gc()),r=e.Kc();r.Ob();)n=u(r.Pb(),286),n.c==n.f?EE(t,n,n.c):npn(t,n)||(s.c[s.c.length]=n);return s}function s1n(t,e,n){var r,s,o,h,d;for(d=t.r+e,t.r+=e,t.d+=n,r=n/t.n.c.length,s=0,h=new S(t.n);h.ao&&ts(e,o,null),e}function m1n(t,e){var n,r;if(r=t.gc(),e==null){for(n=0;n0&&(v+=s),k[C]=h,h+=d*(v+r)}function Ose(t){var e,n,r;for(r=t.f,t.n=Nt(aa,vo,25,r,15,1),t.d=Nt(aa,vo,25,r,15,1),e=0;e0?t.c:0),++s;t.b=r,t.d=o}function _1n(t,e){var n,r,s,o,h;for(r=0,s=0,n=0,h=new S(e);h.a0?t.g:0),++n;t.c=s,t.d=r}function Rse(t,e){var n;return n=lt(ct(aa,1),vo,25,15,[H3t(t,(Kf(),sc),e),H3t(t,eu,e),H3t(t,ac,e)]),t.f&&(n[0]=b.Math.max(n[0],n[2]),n[2]=n[0]),n}function S1n(t,e,n){var r;try{Sq(t,e+t.j,n+t.k,!1,!0)}catch(s){throw s=Wi(s),_t(s,73)?(r=s,it(new yo(r.g+Qq+e+Ya+n+")."))):it(s)}}function A1n(t,e,n){var r;try{Sq(t,e+t.j,n+t.k,!0,!1)}catch(s){throw s=Wi(s),_t(s,73)?(r=s,it(new yo(r.g+Qq+e+Ya+n+")."))):it(s)}}function jse(t){var e;Us(t,(Te(),Nv))&&(e=u(Q(t,Nv),21),e.Hc((py(),_f))?(e.Mc(_f),e.Fc(Sf)):e.Hc(Sf)&&(e.Mc(Sf),e.Fc(_f)))}function $se(t){var e;Us(t,(Te(),Nv))&&(e=u(Q(t,Nv),21),e.Hc((py(),Lf))?(e.Mc(Lf),e.Fc(Hh)):e.Hc(Hh)&&(e.Mc(Hh),e.Fc(Lf)))}function L1n(t,e,n){vr(n,"Self-Loop ordering",1),ls(wu(Ri(Ri(Wo(new Tn(null,new _n(e.b,16)),new mN),new rX),new iX),new sX),new Lm(t)),or(n)}function nI(t,e,n,r){var s,o;for(s=e;s0&&(s.b+=e),s}function rq(t,e){var n,r,s;for(s=new Ca,r=t.Kc();r.Ob();)n=u(r.Pb(),37),x_(n,0,s.b),s.b+=n.f.b+e,s.a=b.Math.max(s.a,n.f.a);return s.a>0&&(s.a+=e),s}function qse(t){var e,n,r;for(r=wi,n=new S(t.a);n.a>16==6?t.Cb.ih(t,5,i1,e):(r=no(u(yn((n=u(Dn(t,16),26),n||t.zh()),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function P1n(t){I8();var e=t.e;if(e&&e.stack){var n=e.stack,r=e+` +`;return n.substring(0,r.length)==r&&(n=n.substring(r.length)),n.split(` +`)}return[]}function F1n(t){var e;return e=(sne(),jge),e[t>>>28]|e[t>>24&15]<<4|e[t>>20&15]<<8|e[t>>16&15]<<12|e[t>>12&15]<<16|e[t>>8&15]<<20|e[t>>4&15]<<24|e[t&15]<<28}function Gse(t){var e,n,r;t.b==t.c&&(r=t.a.length,n=Dyt(b.Math.max(8,r))<<1,t.b!=0?(e=ff(t.a,n),dne(t,e,r),t.a=e,t.b=0):fqt(t.a,n),t.c=r)}function N1n(t,e){var n;return n=t.b,n.Xe((ui(),dl))?n.Hf()==(ve(),Bn)?-n.rf().a-Xt(ye(n.We(dl))):e+Xt(ye(n.We(dl))):n.Hf()==(ve(),Bn)?-n.rf().a:e}function rI(t){var e;return t.b.c.length!=0&&u(Ne(t.b,0),70).a?u(Ne(t.b,0),70).a:(e=grt(t),e??""+(t.c?Ro(t.c.a,t,0):-1))}function iq(t){var e;return t.f.c.length!=0&&u(Ne(t.f,0),70).a?u(Ne(t.f,0),70).a:(e=grt(t),e??""+(t.i?Ro(t.i.j,t,0):-1))}function B1n(t,e){var n,r;if(e<0||e>=t.gc())return null;for(n=e;n0?t.c:0),s=b.Math.max(s,e.d),++r;t.e=o,t.b=s}function j1n(t){var e,n;if(!t.b)for(t.b=D$(u(t.f,118).Ag().i),n=new nr(u(t.f,118).Ag());n.e!=n.i.gc();)e=u(dr(n),137),le(t.b,new get(e));return t.b}function $1n(t,e){var n,r,s;if(e.dc())return y8(),y8(),pP;for(n=new YWt(t,e.gc()),s=new nr(t);s.e!=s.i.gc();)r=dr(s),e.Hc(r)&&Dr(n,r);return n}function Z3t(t,e,n,r){return e==0?r?(!t.o&&(t.o=new _l((Jc(),Sb),Hv,t,0)),t.o):(!t.o&&(t.o=new _l((Jc(),Sb),Hv,t,0)),wD(t.o)):Xz(t,e,n,r)}function Mst(t){var e,n;if(t.rb)for(e=0,n=t.rb.i;e>22),s+=r>>22,s<0)?!1:(t.l=n&hl,t.m=r&hl,t.h=s&Z0,!0)}function V1n(t,e,n,r,s,o,h){var d,v;return!(e.Ae()&&(v=t.a.ue(n,r),v<0||!s&&v==0)||e.Be()&&(d=t.a.ue(n,o),d>0||!h&&d==0))}function G1n(t,e){oE();var n;if(n=t.j.g-e.j.g,n!=0)return 0;switch(t.j.g){case 2:return Jit(e,_Tt)-Jit(t,_Tt);case 4:return Jit(t,CTt)-Jit(e,CTt)}return 0}function U1n(t){switch(t.g){case 0:return Olt;case 1:return Plt;case 2:return Flt;case 3:return Nlt;case 4:return UV;case 5:return Blt;default:return null}}function _o(t,e,n){var r,s;return r=(s=new set,b2(s,e),Qc(s,n),Dr((!t.c&&(t.c=new fe(Vv,t,12,10)),t.c),s),s),Rg(r,0),ry(r,1),qg(r,!0),zg(r,!0),r}function l6(t,e){var n,r;if(e>=t.i)throw it(new nnt(e,t.i));return++t.j,n=t.g[e],r=t.i-e-1,r>0&&Dc(t.g,e+1,t.g,e,r),ts(t.g,--t.i,null),t.fi(e,n),t.ci(),n}function Use(t,e){var n,r;return t.Db>>16==17?t.Cb.ih(t,21,Uh,e):(r=no(u(yn((n=u(Dn(t,16),26),n||t.zh()),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function W1n(t){var e,n,r,s;for(wn(),Zs(t.c,t.a),s=new S(t.c);s.an.a.c.length))throw it(new Fn("index must be >= 0 and <= layer node count"));t.c&&mu(t.c.a,t),t.c=n,n&&Hm(n.a,e,t)}function Qse(t,e){var n,r,s;for(r=new ar(lr(U0(t).a.Kc(),new z));zr(r);)return n=u(Mr(r),17),s=u(e.Kb(n),10),new Wk(Lr(s.n.b+s.o.b/2));return PC(),PC(),Cut}function Zse(t,e){this.c=new _r,this.a=t,this.b=e,this.d=u(Q(t,(ae(),Q4)),304),Vt(Q(t,(Te(),h9t)))===Vt((xD(),WV))?this.e=new Lqt:this.e=new Aqt}function J1n(t,e){var n,r,s,o;for(o=0,r=new S(t);r.a>16==6?t.Cb.ih(t,6,Ys,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(Jc(),aU)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function i4t(t,e){var n,r;return t.Db>>16==7?t.Cb.ih(t,1,lP,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(Jc(),GAt)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function s4t(t,e){var n,r;return t.Db>>16==9?t.Cb.ih(t,9,rs,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(Jc(),WAt)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function tae(t,e){var n,r;return t.Db>>16==5?t.Cb.ih(t,9,pU,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(dn(),op)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function a4t(t,e){var n,r;return t.Db>>16==3?t.Cb.ih(t,0,fP,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(dn(),ap)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function eae(t,e){var n,r;return t.Db>>16==7?t.Cb.ih(t,6,i1,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(dn(),up)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function nae(){this.a=new oB,this.g=new tq,this.j=new tq,this.b=new _r,this.d=new tq,this.i=new tq,this.k=new _r,this.c=new _r,this.e=new _r,this.f=new _r}function rdn(t,e,n){var r,s,o;for(n<0&&(n=0),o=t.i,s=n;svot)return vE(t,r);if(r==t)return!0}}return!1}function sdn(t){switch(Cj(),t.q.g){case 5:$oe(t,(ve(),Pn)),$oe(t,mr);break;case 4:Fce(t,(ve(),Pn)),Fce(t,mr);break;default:Fhe(t,(ve(),Pn)),Fhe(t,mr)}}function adn(t){switch(Cj(),t.q.g){case 5:ece(t,(ve(),Hn)),ece(t,Bn);break;case 4:fse(t,(ve(),Hn)),fse(t,Bn);break;default:Nhe(t,(ve(),Hn)),Nhe(t,Bn)}}function odn(t){var e,n;e=u(Q(t,(Jf(),ybe)),19),e?(n=e.a,n==0?Jt(t,(Yp(),wV),new Zit):Jt(t,(Yp(),wV),new F$(n))):Jt(t,(Yp(),wV),new F$(1))}function cdn(t,e){var n;switch(n=t.i,e.g){case 1:return-(t.n.b+t.o.b);case 2:return t.n.a-n.o.a;case 3:return t.n.b-n.o.b;case 4:return-(t.n.a+t.o.a)}return 0}function udn(t,e){switch(t.g){case 0:return e==(dh(),bb)?BV:RV;case 1:return e==(dh(),bb)?BV:kO;case 2:return e==(dh(),bb)?kO:RV;default:return kO}}function sI(t,e){var n,r,s;for(mu(t.a,e),t.e-=e.r+(t.a.c.length==0?0:t.c),s=Ukt,r=new S(t.a);r.a>16==3?t.Cb.ih(t,12,rs,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(Jc(),VAt)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function c4t(t,e){var n,r;return t.Db>>16==11?t.Cb.ih(t,10,rs,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(Jc(),UAt)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function rae(t,e){var n,r;return t.Db>>16==10?t.Cb.ih(t,11,Uh,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(dn(),cp)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function iae(t,e){var n,r;return t.Db>>16==10?t.Cb.ih(t,12,Wh,e):(r=no(u(yn((n=u(Dn(t,16),26),n||(dn(),i3)),t.Db>>16),18)),t.Cb.ih(t,r.n,r.f,e))}function Dh(t){var e;return!(t.Bb&1)&&t.r&&t.r.kh()&&(e=u(t.r,49),t.r=u(Zp(t,e),138),t.r!=e&&t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,9,8,e,t.r))),t.r}function Ist(t,e,n){var r;return r=lt(ct(aa,1),vo,25,15,[O4t(t,(Kf(),sc),e,n),O4t(t,eu,e,n),O4t(t,ac,e,n)]),t.f&&(r[0]=b.Math.max(r[0],r[2]),r[2]=r[0]),r}function ldn(t,e){var n,r,s;if(s=i1n(t,e),s.c.length!=0)for(Zs(s,new WK),n=s.c.length,r=0;r>19,k=e.h>>19,v!=k?k-v:(s=t.h,d=e.h,s!=d?s-d:(r=t.m,h=e.m,r!=h?r-h:(n=t.l,o=e.l,n-o)))}function sq(){sq=Z,XEt=(Cq(),Vut),KEt=new mn(Qxt,XEt),YEt=(Q$(),Hut),WEt=new mn(Zxt,YEt),UEt=(Gz(),qut),GEt=new mn(Jxt,UEt),VEt=new mn(t6t,(Nn(),!0))}function h_(t,e,n){var r,s;r=e*n,_t(t.g,145)?(s=Xx(t),s.f.d?s.f.a||(t.d.a+=r+B1):(t.d.d-=r+B1,t.d.a+=r+B1)):_t(t.g,10)&&(t.d.d-=r,t.d.a+=2*r)}function sae(t,e,n){var r,s,o,h,d;for(s=t[n.g],d=new S(e.d);d.a0?t.g:0),++n;e.b=r,e.e=s}function aae(t){var e,n,r;if(r=t.b,AVt(t.i,r.length)){for(n=r.length*2,t.b=Nt(Lut,PI,317,n,0,1),t.c=Nt(Lut,PI,317,n,0,1),t.f=n-1,t.i=0,e=t.a;e;e=e.c)fI(t,e,e);++t.g}}function vdn(t,e,n,r){var s,o,h,d;for(s=0;sh&&(d=h/r),s>o&&(v=o/s),fd(t,b.Math.min(d,v)),t}function ydn(){Dq();var t,e;try{if(e=u(m4t((Pp(),Yh),ZE),2014),e)return e}catch(n){if(n=Wi(n),_t(n,102))t=n,avt((Pr(),t));else throw it(n)}return new ax}function xdn(){Qte();var t,e;try{if(e=u(m4t((Pp(),Yh),O2),2024),e)return e}catch(n){if(n=Wi(n),_t(n,102))t=n,avt((Pr(),t));else throw it(n)}return new _m}function kdn(){Dq();var t,e;try{if(e=u(m4t((Pp(),Yh),Bh),1941),e)return e}catch(n){if(n=Wi(n),_t(n,102))t=n,avt((Pr(),t));else throw it(n)}return new aJ}function Edn(t,e,n){var r,s;return s=t.e,t.e=e,t.Db&4&&!(t.Db&1)&&(r=new Js(t,1,4,s,e),n?n.Ei(r):n=r),s!=e&&(e?n=PE(t,vq(t,e),n):n=PE(t,t.a,n)),n}function oae(){BR.call(this),this.e=-1,this.a=!1,this.p=Sa,this.k=-1,this.c=-1,this.b=-1,this.g=!1,this.f=-1,this.j=-1,this.n=-1,this.i=-1,this.d=-1,this.o=Sa}function Tdn(t,e){var n,r,s;if(r=t.b.d.d,t.a||(r+=t.b.d.a),s=e.b.d.d,e.a||(s+=e.b.d.a),n=Ms(r,s),n==0){if(!t.a&&e.a)return-1;if(!e.a&&t.a)return 1}return n}function Cdn(t,e){var n,r,s;if(r=t.b.b.d,t.a||(r+=t.b.b.a),s=e.b.b.d,e.a||(s+=e.b.b.a),n=Ms(r,s),n==0){if(!t.a&&e.a)return-1;if(!e.a&&t.a)return 1}return n}function _dn(t,e){var n,r,s;if(r=t.b.g.d,t.a||(r+=t.b.g.a),s=e.b.g.d,e.a||(s+=e.b.g.a),n=Ms(r,s),n==0){if(!t.a&&e.a)return-1;if(!e.a&&t.a)return 1}return n}function l4t(){l4t=Z,Pbe=Ku(bi(bi(bi(new Vs,(Wa(),qc),(ro(),hTt)),qc,fTt),Io,dTt),Io,tTt),Nbe=bi(bi(new Vs,qc,W7t),qc,eTt),Fbe=Ku(new Vs,Io,rTt)}function Sdn(t){var e,n,r,s,o;for(e=u(Q(t,(ae(),kS)),83),o=t.n,r=e.Cc().Kc();r.Ob();)n=u(r.Pb(),306),s=n.i,s.c+=o.a,s.d+=o.b,n.c?Eue(n):Tue(n);Jt(t,kS,null)}function Adn(t,e,n){var r,s;switch(s=t.b,r=s.d,e.g){case 1:return-r.d-n;case 2:return s.o.a+r.c+n;case 3:return s.o.b+r.a+n;case 4:return-r.b-n;default:return-1}}function Ldn(t){var e,n,r,s,o;if(r=0,s=VE,t.b)for(e=0;e<360;e++)n=e*.017453292519943295,txt(t,t.d,0,0,O4,n),o=t.b.ig(t.d),o0&&(h=(o&wi)%t.d.length,s=l5t(t,h,o,e),s)?(d=s.ed(n),d):(r=t.tj(o,e,n),t.c.Fc(r),null)}function d4t(t,e){var n,r,s,o;switch($g(t,e)._k()){case 3:case 2:{for(n=T4(e),s=0,o=n.i;s=0;r--)if(hn(t[r].d,e)||hn(t[r].d,n)){t.length>=r+1&&t.splice(0,r+1);break}return t}function aI(t,e){var n;return Bo(t)&&Bo(e)&&(n=t/e,BI0&&(t.b+=2,t.a+=r):(t.b+=1,t.a+=b.Math.min(r,s))}function gae(t,e){var n,r;if(r=!1,ra(e)&&(r=!0,Vx(t,new Um(Br(e)))),r||_t(e,236)&&(r=!0,Vx(t,(n=mwt(u(e,236)),new EC(n)))),!r)throw it(new fet(A8t))}function Wdn(t,e,n,r){var s,o,h;return s=new z0(t.e,1,10,(h=e.c,_t(h,88)?u(h,26):(dn(),Kh)),(o=n.c,_t(o,88)?u(o,26):(dn(),Kh)),Hg(t,e),!1),r?r.Ei(s):r=s,r}function b4t(t){var e,n;switch(u(Q(Na(t),(Te(),r9t)),420).g){case 0:return e=t.n,n=t.o,new $e(e.a+n.a/2,e.b+n.b/2);case 1:return new xo(t.n);default:return null}}function oI(){oI=Z,YV=new t9(J0,0),qTt=new t9("LEFTUP",1),VTt=new t9("RIGHTUP",2),zTt=new t9("LEFTDOWN",3),HTt=new t9("RIGHTDOWN",4),Rlt=new t9("BALANCED",5)}function Ydn(t,e,n){var r,s,o;if(r=Ms(t.a[e.p],t.a[n.p]),r==0){if(s=u(Q(e,(ae(),R6)),15),o=u(Q(n,R6),15),s.Hc(n))return-1;if(o.Hc(e))return 1}return r}function Kdn(t){switch(t.g){case 1:return new hZ;case 2:return new fZ;case 3:return new lZ;case 0:return null;default:throw it(new Fn(Ict+(t.f!=null?t.f:""+t.g)))}}function w4t(t,e,n){switch(e){case 1:!t.n&&(t.n=new fe(qo,t,1,7)),xr(t.n),!t.n&&(t.n=new fe(qo,t,1,7)),is(t.n,u(n,14));return;case 2:G9(t,Br(n));return}Byt(t,e,n)}function v4t(t,e,n){switch(e){case 3:Jw(t,Xt(ye(n)));return;case 4:tv(t,Xt(ye(n)));return;case 5:ku(t,Xt(ye(n)));return;case 6:Eu(t,Xt(ye(n)));return}w4t(t,e,n)}function oq(t,e,n){var r,s,o;o=(r=new set,r),s=F1(o,e,null),s&&s.Fi(),Qc(o,n),Dr((!t.c&&(t.c=new fe(Vv,t,12,10)),t.c),o),Rg(o,0),ry(o,1),qg(o,!0),zg(o,!0)}function m4t(t,e){var n,r,s;return n=KC(t.g,e),_t(n,235)?(s=u(n,235),s.Qh()==null,s.Nh()):_t(n,498)?(r=u(n,1938),s=r.b,s):null}function Xdn(t,e,n,r){var s,o;return Lr(e),Lr(n),o=u(x9(t.d,e),19),nee(!!o,"Row %s not in %s",e,t.e),s=u(x9(t.b,n),19),nee(!!s,"Column %s not in %s",n,t.c),ore(t,o.a,s.a,r)}function pae(t,e,n,r,s,o,h){var d,v,k,C,M;if(C=s[o],k=o==h-1,d=k?r:0,M=Nse(d,C),r!=10&<(ct(t,h-o),e[o],n[o],d,M),!k)for(++o,v=0;v1||d==-1?(o=u(v,15),s.Wb(rfn(t,o))):s.Wb(yat(t,u(v,56)))))}function r0n(t,e,n,r){nVt();var s=Tut;function o(){for(var h=0;hLct)return n;s>-1e-6&&++n}return n}function k4t(t,e){var n;e!=t.b?(n=null,t.b&&(n=m$(t.b,t,-4,n)),e&&(n=c6(e,t,-4,n)),n=Qre(t,e,n),n&&n.Fi()):t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,3,e,e))}function vae(t,e){var n;e!=t.f?(n=null,t.f&&(n=m$(t.f,t,-1,n)),e&&(n=c6(e,t,-1,n)),n=Zre(t,e,n),n&&n.Fi()):t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,0,e,e))}function mae(t){var e,n,r;if(t==null)return null;if(n=u(t,15),n.dc())return"";for(r=new Ag,e=n.Kc();e.Ob();)go(r,(Ii(),Br(e.Pb()))),r.a+=" ";return int(r,r.a.length-1)}function yae(t){var e,n,r;if(t==null)return null;if(n=u(t,15),n.dc())return"";for(r=new Ag,e=n.Kc();e.Ob();)go(r,(Ii(),Br(e.Pb()))),r.a+=" ";return int(r,r.a.length-1)}function h0n(t,e,n){var r,s;return r=t.c[e.c.p][e.p],s=t.c[n.c.p][n.p],r.a!=null&&s.a!=null?Unt(r.a,s.a):r.a!=null?-1:s.a!=null?1:0}function f0n(t,e){var n,r,s,o,h,d;if(e)for(o=e.a.length,n=new e2(o),d=(n.b-n.a)*n.c<0?(Fp(),Ib):new jp(n);d.Ob();)h=u(d.Pb(),19),s=P8(e,h.a),r=new xzt(t),ern(r.a,s)}function d0n(t,e){var n,r,s,o,h,d;if(e)for(o=e.a.length,n=new e2(o),d=(n.b-n.a)*n.c<0?(Fp(),Ib):new jp(n);d.Ob();)h=u(d.Pb(),19),s=P8(e,h.a),r=new fzt(t),trn(r.a,s)}function g0n(t){var e;if(t!=null&&t.length>0&&wa(t,t.length-1)==33)try{return e=woe(Pl(t,0,t.length-1)),e.e==null}catch(n){if(n=Wi(n),!_t(n,32))throw it(n)}return!1}function xae(t,e,n){var r,s,o;return r=e.ak(),o=e.dd(),s=r.$j()?Gp(t,3,r,null,o,DE(t,r,o,_t(r,99)&&(u(r,18).Bb&Ka)!=0),!0):Gp(t,1,r,r.zj(),o,-1,!0),n?n.Ei(s):n=s,n}function p0n(){var t,e,n;for(e=0,t=0;t<1;t++){if(n=g5t((Rr(t,1),"X".charCodeAt(t))),n==0)throw it(new Nr("Unknown Option: "+"X".substr(t)));e|=n}return e}function b0n(t,e,n){var r,s,o;switch(r=Na(e),s=Pz(r),o=new Mc,Uo(o,e),n.g){case 1:Bs(o,YD(a6(s)));break;case 2:Bs(o,a6(s))}return Jt(o,(Te(),Vy),ye(Q(t,Vy))),o}function E4t(t){var e,n;return e=u(Mr(new ar(lr(jo(t.a).a.Kc(),new z))),17),n=u(Mr(new ar(lr(Ds(t.a).a.Kc(),new z))),17),je(Re(Q(e,(ae(),q1))))||je(Re(Q(n,q1)))}function b4(){b4=Z,$V=new SM("ONE_SIDE",0),qV=new SM("TWO_SIDES_CORNER",1),HV=new SM("TWO_SIDES_OPPOSING",2),zV=new SM("THREE_SIDES",3),jV=new SM("FOUR_SIDES",4)}function Nst(t,e,n,r,s){var o,h;o=u(Bl(Ri(e.Oc(),new VX),c2(new ke,new ce,new Xn,lt(ct(fl,1),oe,132,0,[(O1(),Ul)]))),15),h=u(h2(t.b,n,r),15),s==0?h.Wc(0,o):h.Gc(o)}function w0n(t,e){var n,r,s,o,h;for(o=new S(e.a);o.a0&&Wse(this,this.c-1,(ve(),Hn)),this.c0&&t[0].length>0&&(this.c=je(Re(Q(Na(t[0][0]),(ae(),sCt))))),this.a=Nt(Tme,ee,2018,t.length,0,2),this.b=Nt(Cme,ee,2019,t.length,0,2),this.d=new Vre}function k0n(t){return t.c.length==0?!1:(An(0,t.c.length),u(t.c[0],17)).c.i.k==(Vn(),ta)?!0:N8(wu(new Tn(null,new _n(t,16)),new mQ),new yQ)}function E0n(t,e,n){return vr(n,"Tree layout",1),L$(t.b),Kd(t.b,(wE(),AG),AG),Kd(t.b,RS,RS),Kd(t.b,$O,$O),Kd(t.b,jS,jS),t.a=Fq(t.b,e),Zwn(t,e,Rc(n,1)),or(n),e}function Eae(t,e){var n,r,s,o,h,d,v;for(d=wy(e),o=e.f,v=e.g,h=b.Math.sqrt(o*o+v*v),s=0,r=new S(d);r.a=0?(n=aI(t,Gq),r=QD(t,Gq)):(e=Vm(t,1),n=aI(e,5e8),r=QD(e,5e8),r=Pa(F0(r,1),Ns(t,1))),S1(F0(r,32),Ns(n,co))}function _ae(t,e,n){var r,s;switch(r=(Zn(e.b!=0),u(lh(e,e.a.a),8)),n.g){case 0:r.b=0;break;case 2:r.b=t.f;break;case 3:r.a=0;break;default:r.a=t.g}return s=ei(e,0),eD(s,r),e}function Sae(t,e,n,r){var s,o,h,d,v;switch(v=t.b,o=e.d,h=o.j,d=B3t(h,v.d[h.g],n),s=Li(nc(o.n),o.a),o.j.g){case 1:case 3:d.a+=s.a;break;case 2:case 4:d.b+=s.b}fs(r,d,r.c.b,r.c)}function F0n(t,e,n){var r,s,o,h;for(h=Ro(t.e,e,0),o=new zpt,o.b=n,r=new da(t.e,h);r.b1;e>>=1)e&1&&(r=e4(r,n)),n.d==1?n=e4(n,n):n=new Qie(ale(n.a,n.d,Nt(Cr,Xr,25,n.d<<1,15,1)));return r=e4(r,n),r}function M4t(){M4t=Z;var t,e,n,r;for(DEt=Nt(aa,vo,25,25,15,1),IEt=Nt(aa,vo,25,33,15,1),r=152587890625e-16,e=32;e>=0;e--)IEt[e]=r,r*=.5;for(n=1,t=24;t>=0;t--)DEt[t]=n,n*=.5}function z0n(t){var e,n;if(je(Re(qe(t,(Te(),Hy))))){for(n=new ar(lr(K0(t).a.Kc(),new z));zr(n);)if(e=u(Mr(n),79),fv(e)&&je(Re(qe(e,j2))))return!0}return!1}function Aae(t,e){var n,r,s;Fs(t.f,e)&&(e.b=t,r=e.c,Ro(t.j,r,0)!=-1||le(t.j,r),s=e.d,Ro(t.j,s,0)!=-1||le(t.j,s),n=e.a.b,n.c.length!=0&&(!t.i&&(t.i=new ase(t)),run(t.i,n)))}function q0n(t){var e,n,r,s,o;return n=t.c.d,r=n.j,s=t.d.d,o=s.j,r==o?n.p=0&&hn(t.substr(e,3),"GMT")||e>=0&&hn(t.substr(e,3),"UTC"))&&(n[0]=e+3),rxt(t,n,r)}function V0n(t,e){var n,r,s,o,h;for(o=t.g.a,h=t.g.b,r=new S(t.d);r.an;o--)t[o]|=e[o-n-1]>>>h,t[o-1]=e[o-n-1]<=t.f)break;o.c[o.c.length]=n}return o}function I4t(t){var e,n,r,s;for(e=null,s=new S(t.wf());s.a0&&Dc(t.g,e,t.g,e+r,d),h=n.Kc(),t.i+=r,s=0;so&&ann(k,Tee(n[d],LEt))&&(s=d,o=v);return s>=0&&(r[0]=e+o),s}function Q0n(t,e){var n;if(n=xUt(t.b.Hf(),e.b.Hf()),n!=0)return n;switch(t.b.Hf().g){case 1:case 2:return pu(t.b.sf(),e.b.sf());case 3:case 4:return pu(e.b.sf(),t.b.sf())}return 0}function Z0n(t){var e,n,r;for(r=t.e.c.length,t.a=t2(Cr,[ee,Xr],[48,25],15,[r,r],2),n=new S(t.c);n.a>4&15,o=t[r]&15,h[s++]=YAt[n],h[s++]=YAt[o];return Mh(h,0,h.length)}function egn(t,e,n){var r,s,o;return r=e.ak(),o=e.dd(),s=r.$j()?Gp(t,4,r,o,null,DE(t,r,o,_t(r,99)&&(u(r,18).Bb&Ka)!=0),!0):Gp(t,r.Kj()?2:1,r,o,r.zj(),-1,!0),n?n.Ei(s):n=s,n}function Cu(t){var e,n;return t>=Ka?(e=RI+(t-Ka>>10&1023)&ys,n=56320+(t-Ka&1023)&ys,String.fromCharCode(e)+(""+String.fromCharCode(n))):String.fromCharCode(t&ys)}function ngn(t,e){$m();var n,r,s,o;return s=u(u(Ai(t.r,e),21),84),s.gc()>=2?(r=u(s.Kc().Pb(),111),n=t.u.Hc((Zu(),nA)),o=t.u.Hc(Q6),!r.a&&!n&&(s.gc()==2||o)):!1}function Dae(t,e,n,r,s){var o,h,d;for(o=gue(t,e,n,r,s),d=!1;!o;)bq(t,s,!0),d=!0,o=gue(t,e,n,r,s);d&&bq(t,s,!1),h=Cit(s),h.c.length!=0&&(t.d&&t.d.lg(h),Dae(t,s,n,r,h))}function hq(){hq=Z,Sft=new a9(J0,0),kAt=new a9("DIRECTED",1),TAt=new a9("UNDIRECTED",2),yAt=new a9("ASSOCIATION",3),EAt=new a9("GENERALIZATION",4),xAt=new a9("DEPENDENCY",5)}function rgn(t,e){var n;if(!T1(t))throw it(new No(_de));switch(n=T1(t),e.g){case 1:return-(t.j+t.f);case 2:return t.i-n.g;case 3:return t.j-n.f;case 4:return-(t.i+t.g)}return 0}function xE(t,e){var n,r;for(On(e),r=t.b.c.length,le(t.b,e);r>0;){if(n=r,r=(r-1)/2|0,t.a.ue(Ne(t.b,r),e)<=0)return ch(t.b,n,e),!0;ch(t.b,n,Ne(t.b,r))}return ch(t.b,r,e),!0}function O4t(t,e,n,r){var s,o;if(s=0,n)s=Lz(t.a[n.g][e.g],r);else for(o=0;o=d)}function P4t(t,e,n,r){var s;if(s=!1,ra(r)&&(s=!0,E8(e,n,Br(r))),s||Nm(r)&&(s=!0,P4t(t,e,n,r)),s||_t(r,236)&&(s=!0,r2(e,n,u(r,236))),!s)throw it(new fet(A8t))}function sgn(t,e){var n,r,s;if(n=e.Hh(t.a),n&&(s=Xf((!n.b&&(n.b=new kl((dn(),Qa),cc,n)),n.b),Nh),s!=null)){for(r=1;r<($u(),vLt).length;++r)if(hn(vLt[r],s))return r}return 0}function agn(t,e){var n,r,s;if(n=e.Hh(t.a),n&&(s=Xf((!n.b&&(n.b=new kl((dn(),Qa),cc,n)),n.b),Nh),s!=null)){for(r=1;r<($u(),mLt).length;++r)if(hn(mLt[r],s))return r}return 0}function Iae(t,e){var n,r,s,o;if(On(e),o=t.a.gc(),o0?1:0;o.a[s]!=n;)o=o.a[s],s=t.a.ue(n.d,o.d)>0?1:0;o.a[s]=r,r.b=n.b,r.a[0]=n.a[0],r.a[1]=n.a[1],n.a[0]=null,n.a[1]=null}function ugn(t){Zu();var e,n;return e=ji(sg,lt(ct(eU,1),oe,273,0,[Cb])),!(OD(k$(e,t))>1||(n=ji(nA,lt(ct(eU,1),oe,273,0,[eA,Q6])),OD(k$(n,t))>1))}function N4t(t,e){var n;n=Nc((Pp(),Yh),t),_t(n,498)?ko(Yh,t,new QGt(this,e)):ko(Yh,t,this),Hst(this,e),e==(c8(),aLt)?(this.wb=u(this,1939),u(e,1941)):this.wb=(Hp(),Ln)}function lgn(t){var e,n,r;if(t==null)return null;for(e=null,n=0;n=Wg?"error":r>=900?"warn":r>=800?"info":"log"),vXt(n,t.a),t.b&&N5t(e,n,t.b,"Exception: ",!0))}function Q(t,e){var n,r;return r=(!t.q&&(t.q=new _r),tr(t.q,e)),r??(n=e.wg(),_t(n,4)&&(n==null?(!t.q&&(t.q=new _r),Jx(t.q,e)):(!t.q&&(t.q=new _r),ki(t.q,e,n))),n)}function Wa(){Wa=Z,Dd=new _M("P1_CYCLE_BREAKING",0),gb=new _M("P2_LAYERING",1),cu=new _M("P3_NODE_ORDERING",2),qc=new _M("P4_NODE_PLACEMENT",3),Io=new _M("P5_EDGE_ROUTING",4)}function Nae(t,e){var n,r,s,o,h;for(s=e==1?clt:olt,r=s.a.ec().Kc();r.Ob();)for(n=u(r.Pb(),103),h=u(Ai(t.f.c,n),21).Kc();h.Ob();)o=u(h.Pb(),46),mu(t.b.b,o.b),mu(t.b.a,u(o.b,81).d)}function hgn(t,e){H9();var n;if(t.c==e.c){if(t.b==e.b||Ncn(t.b,e.b)){if(n=GXe(t.b)?1:-1,t.a&&!e.a)return n;if(!t.a&&e.a)return-n}return pu(t.b.g,e.b.g)}else return Ms(t.c,e.c)}function fgn(t,e){var n;vr(e,"Hierarchical port position processing",1),n=t.b,n.c.length>0&&ele((An(0,n.c.length),u(n.c[0],29)),t),n.c.length>1&&ele(u(Ne(n,n.c.length-1),29),t),or(e)}function Bae(t,e){var n,r,s;if(R4t(t,e))return!0;for(r=new S(e);r.a=s||e<0)throw it(new yo(iut+e+D2+s));if(n>=s||n<0)throw it(new yo(sut+n+D2+s));return e!=n?r=(o=t.Ti(n),t.Hi(e,o),o):r=t.Oi(n),r}function $ae(t){var e,n,r;if(r=t,t)for(e=0,n=t.Ug();n;n=n.Ug()){if(++e>vot)return $ae(n);if(r=n,n==t)throw it(new No("There is a cycle in the containment hierarchy of "+t))}return r}function eb(t){var e,n,r;for(r=new f2(Ya,"[","]"),n=t.Kc();n.Ob();)e=n.Pb(),$0(r,Vt(e)===Vt(t)?"(this Collection)":e==null?_u:$o(e));return r.a?r.e.length==0?r.a.a:r.a.a+(""+r.e):r.c}function R4t(t,e){var n,r;if(r=!1,e.gc()<2)return!1;for(n=0;nr&&(Rr(e-1,t.length),t.charCodeAt(e-1)<=32);)--e;return r>0||e1&&(t.j.b+=t.e)):(t.j.a+=n.a,t.j.b=b.Math.max(t.j.b,n.b),t.d.c.length>1&&(t.j.a+=t.e))}function nb(){nb=Z,y2e=lt(ct(Xa,1),xc,61,0,[(ve(),Pn),Hn,mr]),m2e=lt(ct(Xa,1),xc,61,0,[Hn,mr,Bn]),x2e=lt(ct(Xa,1),xc,61,0,[mr,Bn,Pn]),k2e=lt(ct(Xa,1),xc,61,0,[Bn,Pn,Hn])}function ggn(t,e,n,r){var s,o,h,d,v,k,C;if(h=t.c.d,d=t.d.d,h.j!=d.j)for(C=t.b,s=h.j,v=null;s!=d.j;)v=e==0?Oz(s):o3t(s),o=B3t(s,C.d[s.g],n),k=B3t(v,C.d[v.g],n),ri(r,Li(o,k)),s=v}function pgn(t,e,n,r){var s,o,h,d,v;return h=Yse(t.a,e,n),d=u(h.a,19).a,o=u(h.b,19).a,r&&(v=u(Q(e,(ae(),Ju)),10),s=u(Q(n,Ju),10),v&&s&&(tJt(t.b,v,s),d+=t.b.i,o+=t.b.e)),d>o}function qae(t){var e,n,r,s,o,h,d,v,k;for(this.a=wse(t),this.b=new he,n=t,r=0,s=n.length;rynt(t.d).c?(t.i+=t.g.c,sst(t.d)):ynt(t.d).c>ynt(t.g).c?(t.e+=t.d.c,sst(t.g)):(t.i+=mKt(t.g),t.e+=mKt(t.d),sst(t.g),sst(t.d))}function vgn(t,e,n){var r,s,o,h;for(o=e.q,h=e.r,new i2((Uf(),mb),e,o,1),new i2(mb,o,h,1),s=new S(n);s.ad&&(v=d/r),s>o&&(k=o/s),h=b.Math.min(v,k),t.a+=h*(e.a-t.a),t.b+=h*(e.b-t.b)}function kgn(t,e,n,r,s){var o,h;for(h=!1,o=u(Ne(n.b,0),33);Byn(t,e,o,r,s)&&(h=!0,e0n(n,o),n.b.c.length!=0);)o=u(Ne(n.b,0),33);return n.b.c.length==0&&sI(n.j,n),h&&nq(e.q),h}function Egn(t,e){k4();var n,r,s,o;if(e.b<2)return!1;for(o=ei(e,0),n=u(ti(o),8),r=n;o.b!=o.d.c;){if(s=u(ti(o),8),cat(t,r,s))return!0;r=s}return!!cat(t,r,n)}function $4t(t,e,n,r){var s,o;return n==0?(!t.o&&(t.o=new _l((Jc(),Sb),Hv,t,0)),Oj(t.o,e,r)):(o=u(yn((s=u(Dn(t,16),26),s||t.zh()),n),66),o.Nj().Rj(t,su(t),n-Jn(t.zh()),e,r))}function Hst(t,e){var n;e!=t.sb?(n=null,t.sb&&(n=u(t.sb,49).ih(t,1,sA,n)),e&&(n=u(e,49).gh(t,1,sA,n)),n=t3t(t,e,n),n&&n.Fi()):t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,4,e,e))}function Tgn(t,e){var n,r,s,o;if(e)s=H0(e,"x"),n=new vzt(t),V8(n.a,(On(s),s)),o=H0(e,"y"),r=new mzt(t),U8(r.a,(On(o),o));else throw it(new ud("All edge sections need an end point."))}function Cgn(t,e){var n,r,s,o;if(e)s=H0(e,"x"),n=new pzt(t),G8(n.a,(On(s),s)),o=H0(e,"y"),r=new bzt(t),W8(r.a,(On(o),o));else throw it(new ud("All edge sections need a start point."))}function _gn(t,e){var n,r,s,o,h,d,v;for(r=Are(t),o=0,d=r.length;o>22-e,s=t.h<>22-e):e<44?(n=0,r=t.l<>44-e):(n=0,r=0,s=t.l<t)throw it(new Fn("k must be smaller than n"));return e==0||e==t?1:t==0?0:g4t(t)/(g4t(e)*g4t(t-e))}function z4t(t,e){var n,r,s,o;for(n=new l2t(t);n.g==null&&!n.c?Hvt(n):n.g==null||n.i!=0&&u(n.g[n.i-1],47).Ob();)if(o=u(wq(n),56),_t(o,160))for(r=u(o,160),s=0;s>4],e[n*2+1]=yU[o&15];return Mh(e,0,e.length)}function Hgn(t){c$();var e,n,r;switch(r=t.c.length,r){case 0:return Age;case 1:return e=u(Ioe(new S(t)),42),den(e.cd(),e.dd());default:return n=u(P1(t,Nt(P2,Hq,42,t.c.length,0,1)),165),new uet(n)}}function Vgn(t){var e,n,r,s,o,h;for(e=new B3,n=new B3,Up(e,t),Up(n,t);n.b!=n.c;)for(s=u(Hx(n),37),h=new S(s.a);h.a0&&kI(t,n,e),s):_bn(t,e,n)}function Xae(t,e,n){var r,s,o,h;if(e.b!=0){for(r=new Zi,h=ei(e,0);h.b!=h.d.c;)o=u(ti(h),86),Ua(r,Eyt(o)),s=o.e,s.a=u(Q(o,(fc(),$ht)),19).a,s.b=u(Q(o,o_t),19).a;Xae(t,r,Rc(n,r.b/t.a|0))}}function Qae(t,e){var n,r,s,o,h;if(t.e<=e||Zin(t,t.g,e))return t.g;for(o=t.r,r=t.g,h=t.r,s=(o-r)/2+r;r+11&&(t.e.b+=t.a)):(t.e.a+=n.a,t.e.b=b.Math.max(t.e.b,n.b),t.d.c.length>1&&(t.e.a+=t.a))}function Kgn(t){var e,n,r,s;switch(s=t.i,e=s.b,r=s.j,n=s.g,s.a.g){case 0:n.a=(t.g.b.o.a-r.a)/2;break;case 1:n.a=e.d.n.a+e.d.a.a;break;case 2:n.a=e.d.n.a+e.d.a.a-r.a;break;case 3:n.b=e.d.n.b+e.d.a.b}}function Zae(t,e,n,r,s){if(rr&&(t.a=r),t.bs&&(t.b=s),t}function Xgn(t){if(_t(t,149))return Cwn(u(t,149));if(_t(t,229))return khn(u(t,229));if(_t(t,23))return Lgn(u(t,23));throw it(new Fn(L8t+eb(new yl(lt(ct(Qn,1),De,1,5,[t])))))}function Qgn(t,e,n,r,s){var o,h,d;for(o=!0,h=0;h>>s|n[h+r+1]<>>s,++h}return o}function G4t(t,e,n,r){var s,o,h;if(e.k==(Vn(),ta)){for(o=new ar(lr(jo(e).a.Kc(),new z));zr(o);)if(s=u(Mr(o),17),h=s.c.i.k,h==ta&&t.c.a[s.c.i.c.p]==r&&t.c.a[e.c.p]==n)return!0}return!1}function Zgn(t,e){var n,r,s,o;return e&=63,n=t.h&Z0,e<22?(o=n>>>e,s=t.m>>e|n<<22-e,r=t.l>>e|t.m<<22-e):e<44?(o=0,s=n>>>e-22,r=t.m>>e-22|t.h<<44-e):(o=0,s=0,r=n>>>e-44),iu(r&hl,s&hl,o&Z0)}function Jae(t,e,n,r){var s;this.b=r,this.e=t==(ev(),FS),s=e[n],this.d=t2(pl,[ee,o0],[177,25],16,[s.length,s.length],2),this.a=t2(Cr,[ee,Xr],[48,25],15,[s.length,s.length],2),this.c=new S4t(e,n)}function Jgn(t){var e,n,r;for(t.k=new Wvt((ve(),lt(ct(Xa,1),xc,61,0,[Zo,Pn,Hn,mr,Bn])).length,t.j.c.length),r=new S(t.j);r.a=n)return EE(t,e,r.p),!0;return!1}function eoe(t){var e;return t.Db&64?Vst(t):(e=new Ol(v8t),!t.a||Gr(Gr((e.a+=' "',e),t.a),'"'),Gr(Aw(Gr(Aw(Gr(Aw(Gr(Aw((e.a+=" (",e),t.i),","),t.j)," | "),t.g),","),t.f),")"),e.a)}function noe(t,e,n){var r,s,o,h,d;for(d=ou(t.e.Tg(),e),s=u(t.g,119),r=0,h=0;hn?J4t(t,n,"start index"):e<0||e>n?J4t(e,n,"end index"):y_("end index (%s) must not be less than start index (%s)",lt(ct(Qn,1),De,1,5,[pe(e),pe(t)]))}function ioe(t,e){var n,r,s,o;for(r=0,s=t.length;r0&&soe(t,o,n));e.p=0}function Xe(t){var e;this.c=new Zi,this.f=t.e,this.e=t.d,this.i=t.g,this.d=t.c,this.b=t.b,this.k=t.j,this.a=t.a,t.i?this.j=t.i:this.j=(e=u(Vf(ip),9),new sh(e,u(ff(e,e.length),9),0)),this.g=t.f}function spn(t){var e,n,r,s;for(e=qp(Gr(new Ol("Predicates."),"and"),40),n=!0,s=new mx(t);s.b0?d[h-1]:Nt(l0,Yg,10,0,0,1),s=d[h],k=h=0?t.Bh(s):i5t(t,r);else throw it(new Fn(lb+r.ne()+X_));else throw it(new Fn(Bde+e+Rde));else fh(t,n,r)}function U4t(t){var e,n;if(n=null,e=!1,_t(t,204)&&(e=!0,n=u(t,204).a),e||_t(t,258)&&(e=!0,n=""+u(t,258).a),e||_t(t,483)&&(e=!0,n=""+u(t,483).a),!e)throw it(new fet(A8t));return n}function uoe(t,e){var n,r;if(t.f){for(;e.Ob();)if(n=u(e.Pb(),72),r=n.ak(),_t(r,99)&&u(r,18).Bb&dc&&(!t.e||r.Gj()!=j7||r.aj()!=0)&&n.dd()!=null)return e.Ub(),!0;return!1}else return e.Ob()}function loe(t,e){var n,r;if(t.f){for(;e.Sb();)if(n=u(e.Ub(),72),r=n.ak(),_t(r,99)&&u(r,18).Bb&dc&&(!t.e||r.Gj()!=j7||r.aj()!=0)&&n.dd()!=null)return e.Pb(),!0;return!1}else return e.Sb()}function W4t(t,e,n){var r,s,o,h,d,v;for(v=ou(t.e.Tg(),e),r=0,d=t.i,s=u(t.g,119),h=0;h1&&(e.c[e.c.length]=o))}function upn(t){var e,n,r,s;for(n=new Zi,Ua(n,t.o),r=new qpt;n.b!=0;)e=u(n.b==0?null:(Zn(n.b!=0),lh(n,n.a.a)),508),s=Hhe(t,e,!0),s&&le(r.a,e);for(;r.a.c.length!=0;)e=u(Nre(r),508),Hhe(t,e,!1)}function Ug(){Ug=Z,_St=new Ox(N_,0),La=new Ox("BOOLEAN",1),gc=new Ox("INT",2),I7=new Ox("STRING",3),Oo=new Ox("DOUBLE",4),us=new Ox("ENUM",5),U6=new Ox("ENUMSET",6),V1=new Ox("OBJECT",7)}function g_(t,e){var n,r,s,o,h;r=b.Math.min(t.c,e.c),o=b.Math.min(t.d,e.d),s=b.Math.max(t.c+t.b,e.c+e.b),h=b.Math.max(t.d+t.a,e.d+e.a),s=(s/2|0))for(this.e=r?r.c:null,this.d=s;n++0;)Vvt(this);this.b=e,this.a=null}function fpn(t,e){var n,r;e.a?Fwn(t,e):(n=u(Cnt(t.b,e.b),57),n&&n==t.a[e.b.f]&&n.a&&n.a!=e.b.a&&n.c.Fc(e.b),r=u(Tnt(t.b,e.b),57),r&&t.a[r.f]==e.b&&r.a&&r.a!=e.b.a&&e.b.c.Fc(r),fnt(t.b,e.b))}function foe(t,e){var n,r;if(n=u(po(t.b,e),124),u(u(Ai(t.r,e),21),84).dc()){n.n.b=0,n.n.c=0;return}n.n.b=t.C.b,n.n.c=t.C.c,t.A.Hc((Al(),K2))&&Nue(t,e),r=qfn(t,e),lat(t,e)==(l4(),Eb)&&(r+=2*t.w),n.a.a=r}function doe(t,e){var n,r;if(n=u(po(t.b,e),124),u(u(Ai(t.r,e),21),84).dc()){n.n.d=0,n.n.a=0;return}n.n.d=t.C.d,n.n.a=t.C.a,t.A.Hc((Al(),K2))&&Bue(t,e),r=Hfn(t,e),lat(t,e)==(l4(),Eb)&&(r+=2*t.w),n.a.b=r}function dpn(t,e){var n,r,s,o;for(o=new he,r=new S(e);r.an.a&&(r.Hc((hy(),WO))?s=(e.a-n.a)/2:r.Hc(YO)&&(s=e.a-n.a)),e.b>n.b&&(r.Hc((hy(),XO))?o=(e.b-n.b)/2:r.Hc(KO)&&(o=e.b-n.b)),F4t(t,s,o)}function xoe(t,e,n,r,s,o,h,d,v,k,C,M,j){_t(t.Cb,88)&&gy(sl(u(t.Cb,88)),4),Qc(t,n),t.f=h,hE(t,d),dE(t,v),lE(t,k),fE(t,C),qg(t,M),gE(t,j),zg(t,!0),Rg(t,s),t.ok(o),b2(t,e),r!=null&&(t.i=null,fz(t,r))}function koe(t){var e,n;if(t.f){for(;t.n>0;){if(e=u(t.k.Xb(t.n-1),72),n=e.ak(),_t(n,99)&&u(n,18).Bb&dc&&(!t.e||n.Gj()!=j7||n.aj()!=0)&&e.dd()!=null)return!0;--t.n}return!1}else return t.n>0}function J4t(t,e,n){if(t<0)return y_(afe,lt(ct(Qn,1),De,1,5,[n,pe(t)]));if(e<0)throw it(new Fn(ofe+e));return y_("%s (%s) must not be greater than size (%s)",lt(ct(Qn,1),De,1,5,[n,pe(t),pe(e)]))}function t5t(t,e,n,r,s,o){var h,d,v,k;if(h=r-n,h<7){hhn(e,n,r,o);return}if(v=n+s,d=r+s,k=v+(d-v>>1),t5t(e,t,v,k,-s,o),t5t(e,t,k,d,-s,o),o.ue(t[k-1],t[k])<=0){for(;n=0?t.sh(o,n):M5t(t,s,n);else throw it(new Fn(lb+s.ne()+X_));else throw it(new Fn(Bde+e+Rde));else gh(t,r,s,n)}function Eoe(t){var e,n,r,s;if(n=u(t,49).qh(),n)try{if(r=null,e=_E((Pp(),Yh),sle(ghn(n))),e&&(s=e.rh(),s&&(r=s.Wk(kKe(n.e)))),r&&r!=t)return Eoe(r)}catch(o){if(o=Wi(o),!_t(o,60))throw it(o)}return t}function au(t,e,n){var r,s,o,h;if(h=e==null?0:t.b.se(e),s=(r=t.a.get(h),r??new Array),s.length==0)t.a.set(h,s);else if(o=jre(t,e,s),o)return o.ed(n);return ts(s,s.length,new KR(e,n)),++t.c,w$(t.b),null}function Toe(t,e){var n,r;return L$(t.a),Kd(t.a,(pz(),FG),FG),Kd(t.a,D7,D7),r=new Vs,bi(r,D7,(Nz(),Ght)),Vt(qe(e,(uy(),Yht)))!==Vt((HD(),NG))&&bi(r,D7,Hht),bi(r,D7,Vht),TUt(t.a,r),n=Fq(t.a,e),n}function Coe(t){if(!t)return cHt(),Bge;var e=t.valueOf?t.valueOf():t;if(e!==t){var n=Put[typeof e];return n?n(e):Uyt(typeof e)}else return t instanceof Array||t instanceof b.Array?new wx(t):new Qk(t)}function _oe(t,e,n){var r,s,o;switch(o=t.o,r=u(po(t.p,n),244),s=r.i,s.b=gI(r),s.a=dI(r),s.b=b.Math.max(s.b,o.a),s.b>o.a&&!e&&(s.b=o.a),s.c=-(s.b-o.a)/2,n.g){case 1:s.d=-s.a;break;case 3:s.d=o.b}Eat(r),Tat(r)}function Soe(t,e,n){var r,s,o;switch(o=t.o,r=u(po(t.p,n),244),s=r.i,s.b=gI(r),s.a=dI(r),s.a=b.Math.max(s.a,o.b),s.a>o.b&&!e&&(s.a=o.b),s.d=-(s.a-o.b)/2,n.g){case 4:s.c=-s.b;break;case 2:s.c=o.a}Eat(r),Tat(r)}function Apn(t,e){var n,r,s,o,h;if(!e.dc()){if(s=u(e.Xb(0),128),e.gc()==1){tue(t,s,s,1,0,e);return}for(n=1;n0)try{s=ql(e,Sa,wi)}catch(o){throw o=Wi(o),_t(o,127)?(r=o,it(new W$(r))):it(o)}return n=(!t.a&&(t.a=new Ztt(t)),t.a),s=0?u(At(n,s),56):null}function Ipn(t,e){if(t<0)return y_(afe,lt(ct(Qn,1),De,1,5,["index",pe(t)]));if(e<0)throw it(new Fn(ofe+e));return y_("%s (%s) must be less than size (%s)",lt(ct(Qn,1),De,1,5,["index",pe(t),pe(e)]))}function Opn(t){var e,n,r,s,o;if(t==null)return _u;for(o=new f2(Ya,"[","]"),n=t,r=0,s=n.length;r0)for(h=t.c.d,d=t.d.d,s=fd(ia(new $e(d.a,d.b),h),1/(r+1)),o=new $e(h.a,h.b),n=new S(t.a);n.a=0?t._g(n,!0,!0):dv(t,s,!0),153)),u(r,215).ol(e);else throw it(new Fn(lb+e.ne()+X_))}function s5t(t){var e,n;return t>-0x800000000000&&t<0x800000000000?t==0?0:(e=t<0,e&&(t=-t),n=ps(b.Math.floor(b.Math.log(t)/.6931471805599453)),(!e||t!=b.Math.pow(2,n))&&++n,n):Jne(Tu(t))}function Upn(t){var e,n,r,s,o,h,d;for(o=new O0,n=new S(t);n.a2&&d.e.b+d.j.b<=2&&(s=d,r=h),o.a.zc(s,o),s.q=r);return o}function Foe(t,e){var n,r,s;return r=new Y0(t),Mo(r,e),Jt(r,(ae(),eG),e),Jt(r,(Te(),cs),(ua(),Gc)),Jt(r,Id,(t0(),UG)),D0(r,(Vn(),ks)),n=new Mc,Uo(n,r),Bs(n,(ve(),Bn)),s=new Mc,Uo(s,r),Bs(s,Hn),r}function Noe(t){switch(t.g){case 0:return new det((ev(),RO));case 1:return new VB;case 2:return new ltt;default:throw it(new Fn("No implementation is available for the crossing minimizer "+(t.f!=null?t.f:""+t.g)))}}function Boe(t,e){var n,r,s,o,h;for(t.c[e.p]=!0,le(t.a,e),h=new S(e.j);h.a=o)h.$b();else for(s=h.Kc(),r=0;r0?rbt():h<0&&zoe(t,e,-h),!0):!1}function dI(t){var e,n,r,s,o,h,d;if(d=0,t.b==0){for(h=Ese(t,!0),e=0,r=h,s=0,o=r.length;s0&&(d+=n,++e);e>1&&(d+=t.c*(e-1))}else d=bHt(Sne(l$(Ri(Qnt(t.a),new Ml),new ha)));return d>0?d+t.n.d+t.n.a:0}function gI(t){var e,n,r,s,o,h,d;if(d=0,t.b==0)d=bHt(Sne(l$(Ri(Qnt(t.a),new th),new Fa)));else{for(h=Tse(t,!0),e=0,r=h,s=0,o=r.length;s0&&(d+=n,++e);e>1&&(d+=t.c*(e-1))}return d>0?d+t.n.b+t.n.c:0}function tbn(t,e){var n,r,s,o;for(o=u(po(t.b,e),124),n=o.a,s=u(u(Ai(t.r,e),21),84).Kc();s.Ob();)r=u(s.Pb(),111),r.c&&(n.a=b.Math.max(n.a,Vwt(r.c)));if(n.a>0)switch(e.g){case 2:o.n.c=t.s;break;case 4:o.n.b=t.s}}function ebn(t,e){var n,r,s;return n=u(Q(e,(Jf(),c7)),19).a-u(Q(t,c7),19).a,n==0?(r=ia(nc(u(Q(t,(Yp(),vO)),8)),u(Q(t,dS),8)),s=ia(nc(u(Q(e,vO),8)),u(Q(e,dS),8)),Ms(r.a*r.b,s.a*s.b)):n}function nbn(t,e){var n,r,s;return n=u(Q(e,(gv(),PG)),19).a-u(Q(t,PG),19).a,n==0?(r=ia(nc(u(Q(t,(fc(),zO)),8)),u(Q(t,$S),8)),s=ia(nc(u(Q(e,zO),8)),u(Q(e,$S),8)),Ms(r.a*r.b,s.a*s.b)):n}function qoe(t){var e,n;return n=new Mp,n.a+="e_",e=hun(t),e!=null&&(n.a+=""+e),t.c&&t.d&&(Gr((n.a+=" ",n),iq(t.c)),Gr(hc((n.a+="[",n),t.c.i),"]"),Gr((n.a+=Uot,n),iq(t.d)),Gr(hc((n.a+="[",n),t.d.i),"]")),n.a}function Hoe(t){switch(t.g){case 0:return new ZL;case 1:return new ctt;case 2:return new ott;case 3:return new GB;default:throw it(new Fn("No implementation is available for the layout phase "+(t.f!=null?t.f:""+t.g)))}}function o5t(t,e,n,r,s){var o;switch(o=0,s.g){case 1:o=b.Math.max(0,e.b+t.b-(n.b+r));break;case 3:o=b.Math.max(0,-t.b-r);break;case 2:o=b.Math.max(0,-t.a-r);break;case 4:o=b.Math.max(0,e.a+t.a-(n.a+r))}return o}function rbn(t,e,n){var r,s,o,h,d;if(n)for(s=n.a.length,r=new e2(s),d=(r.b-r.a)*r.c<0?(Fp(),Ib):new jp(r);d.Ob();)h=u(d.Pb(),19),o=P8(n,h.a),k8t in o.a||nut in o.a?gmn(t,o,e):yxn(t,o,e),zQe(u(tr(t.b,pE(o)),79))}function c5t(t){var e,n;switch(t.b){case-1:return!0;case 0:return n=t.t,n>1||n==-1?(t.b=-1,!0):(e=Dh(t),e&&(to(),e.Cj()==j0e)?(t.b=-1,!0):(t.b=1,!1));default:case 1:return!1}}function ibn(t,e){var n,r,s,o,h;for(r=(!e.s&&(e.s=new fe(Mu,e,21,17)),e.s),o=null,s=0,h=r.i;s=0&&r=0?t._g(n,!0,!0):dv(t,s,!0),153)),u(r,215).ll(e);throw it(new Fn(lb+e.ne()+Wct))}function ubn(){Tbt();var t;return T5e?u(_E((Pp(),Yh),Bh),1939):(ii(P2,new jf),V4n(),t=u(_t(Nc((Pp(),Yh),Bh),547)?Nc(Yh,Bh):new LXt,547),T5e=!0,$xn(t),Gxn(t),ki((Ebt(),sLt),t,new oJ),ko(Yh,Bh,t),t)}function lbn(t,e){var n,r,s,o;t.j=-1,xl(t.e)?(n=t.i,o=t.i!=0,gD(t,e),r=new z0(t.e,3,t.c,null,e,n,o),s=e.Qk(t.e,t.c,null),s=xae(t,e,s),s?(s.Ei(r),s.Fi()):mi(t.e,r)):(gD(t,e),s=e.Qk(t.e,t.c,null),s&&s.Fi())}function gq(t,e){var n,r,s;if(s=0,r=e[0],r>=t.length)return-1;for(n=(Rr(r,t.length),t.charCodeAt(r));n>=48&&n<=57&&(s=s*10+(n-48),++r,!(r>=t.length));)n=(Rr(r,t.length),t.charCodeAt(r));return r>e[0]?e[0]=r:s=-1,s}function hbn(t){var e,n,r,s,o;return s=u(t.a,19).a,o=u(t.b,19).a,n=s,r=o,e=b.Math.max(b.Math.abs(s),b.Math.abs(o)),s<=0&&s==o?(n=0,r=o-1):s==-e&&o!=e?(n=o,r=s,o>=0&&++n):(n=-o,r=s),new fa(pe(n),pe(r))}function fbn(t,e,n,r){var s,o,h,d,v,k;for(s=0;s=0&&k>=0&&v=t.i)throw it(new yo(iut+e+D2+t.i));if(n>=t.i)throw it(new yo(sut+n+D2+t.i));return r=t.g[n],e!=n&&(e>16),e=r>>16&16,n=16-e,t=t>>e,r=t-256,e=r>>16&8,n+=e,t<<=e,r=t-Ey,e=r>>16&4,n+=e,t<<=e,r=t-md,e=r>>16&2,n+=e,t<<=e,r=t>>14,e=r&~(r>>1),n+2-e)}function gbn(t){Ux();var e,n,r,s;for(dV=new he,Jut=new _r,Zut=new he,e=(!t.a&&(t.a=new fe(rs,t,10,11)),t.a),U5n(e),s=new nr(e);s.e!=s.i.gc();)r=u(dr(s),33),Ro(dV,r,0)==-1&&(n=new he,le(Zut,n),ese(r,n));return Zut}function pbn(t,e,n){var r,s,o,h;t.a=n.b.d,_t(e,352)?(s=x4(u(e,79),!1,!1),o=lI(s),r=new Ea(t),va(o,r),CI(o,s),e.We((ui(),a5))!=null&&va(u(e.We(a5),74),r)):(h=u(e,470),h.Hg(h.Dg()+t.a.a),h.Ig(h.Eg()+t.a.b))}function Goe(t,e){var n,r,s,o,h,d,v,k;for(k=Xt(ye(Q(e,(Te(),LS)))),v=t[0].n.a+t[0].o.a+t[0].d.c+k,d=1;d=0?n:(d=D9(ia(new $e(h.c+h.b/2,h.d+h.a/2),new $e(o.c+o.b/2,o.d+o.a/2))),-(dle(o,h)-1)*d)}function wbn(t,e,n){var r;ls(new Tn(null,(!n.a&&(n.a=new fe(Ji,n,6,6)),new _n(n.a,16))),new LGt(t,e)),ls(new Tn(null,(!n.n&&(n.n=new fe(qo,n,1,7)),new _n(n.n,16))),new MGt(t,e)),r=u(qe(n,(ui(),a5)),74),r&&dyt(r,t,e)}function dv(t,e,n){var r,s,o;if(o=C4(($u(),ya),t.Tg(),e),o)return to(),u(o,66).Oj()||(o=Kx(To(ya,o))),s=(r=t.Yg(o),u(r>=0?t._g(r,!0,!0):dv(t,o,!0),153)),u(s,215).hl(e,n);throw it(new Fn(lb+e.ne()+Wct))}function l5t(t,e,n,r){var s,o,h,d,v;if(s=t.d[e],s){if(o=s.g,v=s.i,r!=null){for(d=0;d=n&&(r=e,k=(v.c+v.a)/2,h=k-n,v.c<=k-n&&(s=new Dnt(v.c,h),Hm(t,r++,s)),d=k+n,d<=v.a&&(o=new Dnt(d,v.a),Km(r,t.c.length),XC(t.c,r,o)))}function h5t(t){var e;if(!t.c&&t.g==null)t.d=t.si(t.f),Dr(t,t.d),e=t.d;else{if(t.g==null)return!0;if(t.i==0)return!1;e=u(t.g[t.i-1],47)}return e==t.b&&null.km>=null.jm()?(wq(t),h5t(t)):e.Ob()}function xbn(t,e,n){var r,s,o,h,d;if(d=n,!d&&(d=qwt(new r8,0)),vr(d,c1e,1),dhe(t.c,e),h=F4n(t.a,e),h.gc()==1)Kle(u(h.Xb(0),37),d);else for(o=1/h.gc(),s=h.Kc();s.Ob();)r=u(s.Pb(),37),Kle(r,Rc(d,o));LKe(t.a,h,e),Fvn(e),or(d)}function Yoe(t){if(this.a=t,t.c.i.k==(Vn(),ks))this.c=t.c,this.d=u(Q(t.c.i,(ae(),oc)),61);else if(t.d.i.k==ks)this.c=t.d,this.d=u(Q(t.d.i,(ae(),oc)),61);else throw it(new Fn("Edge "+t+" is not an external edge."))}function Koe(t,e){var n,r,s;s=t.b,t.b=e,t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,3,s,t.b)),e?e!=t&&(Qc(t,e.zb),hit(t,e.d),n=(r=e.c,r??e.zb),dit(t,n==null||hn(n,e.zb)?null:n)):(Qc(t,null),hit(t,0),dit(t,null))}function Xoe(t){var e,n;if(t.f){for(;t.n=h)throw it(new qm(e,h));return s=n[e],h==1?r=null:(r=Nt(Fft,lut,415,h-1,0,1),Dc(n,0,r,0,e),o=h-e-1,o>0&&Dc(n,e+1,r,e,o)),bE(t,r),moe(t,e,s),s}function d6(){d6=Z,tk=u(At(Wt((fbt(),pc).qb),6),34),J6=u(At(Wt(pc.qb),3),34),zft=u(At(Wt(pc.qb),4),34),qft=u(At(Wt(pc.qb),5),18),cq(tk),cq(J6),cq(zft),cq(qft),A5e=new yl(lt(ct(Mu,1),B4,170,0,[tk,J6]))}function tce(t,e){var n;this.d=new OC,this.b=e,this.e=new xo(e.qf()),n=t.u.Hc((Zu(),sP)),t.u.Hc(sg)?t.D?this.a=n&&!e.If():this.a=!0:t.u.Hc(Cb)?n?this.a=!(e.zf().Kc().Ob()||e.Bf().Kc().Ob()):this.a=!1:this.a=!1}function ece(t,e){var n,r,s,o;for(n=t.o.a,o=u(u(Ai(t.r,e),21),84).Kc();o.Ob();)s=u(o.Pb(),111),s.e.a=(r=s.b,r.Xe((ui(),dl))?r.Hf()==(ve(),Bn)?-r.rf().a-Xt(ye(r.We(dl))):n+Xt(ye(r.We(dl))):r.Hf()==(ve(),Bn)?-r.rf().a:n)}function nce(t,e){var n,r,s,o;n=u(Q(t,(Te(),Wl)),103),o=u(qe(e,C7),61),s=u(Q(t,cs),98),s!=(ua(),G1)&&s!=Tb?o==(ve(),Zo)&&(o=uxt(e,n),o==Zo&&(o=a6(n))):(r=Yle(e),r>0?o=a6(n):o=YD(a6(n))),wo(e,C7,o)}function Cbn(t,e){var n,r,s,o,h;for(h=t.j,e.a!=e.b&&Zs(h,new ex),s=h.c.length/2|0,r=0;r0&&kI(t,n,e),o):r.a!=null?(kI(t,e,n),-1):s.a!=null?(kI(t,n,e),1):0}function rce(t,e){var n,r,s,o;t.ej()?(n=t.Vi(),o=t.fj(),++t.j,t.Hi(n,t.oi(n,e)),r=t.Zi(3,null,e,n,o),t.bj()?(s=t.cj(e,null),s?(s.Ei(r),s.Fi()):t.$i(r)):t.$i(r)):(mXt(t,e),t.bj()&&(s=t.cj(e,null),s&&s.Fi()))}function pq(t,e){var n,r,s,o,h;for(h=ou(t.e.Tg(),e),s=new ox,n=u(t.g,119),o=t.i;--o>=0;)r=n[o],h.rl(r.ak())&&Dr(s,r);!Uhe(t,s)&&xl(t.e)&&n8(t,e.$j()?Gp(t,6,e,(wn(),io),null,-1,!1):Gp(t,e.Kj()?2:1,e,null,null,-1,!1))}function TE(){TE=Z;var t,e;for(D6=Nt(j4,ee,91,32,0,1),lS=Nt(j4,ee,91,32,0,1),t=1,e=0;e<=18;e++)D6[e]=JD(t),lS[e]=JD(F0(t,e)),t=_a(t,5);for(;eh)||e.q&&(r=e.C,h=r.c.c.a-r.o.a/2,s=r.n.a-n,s>h)))}function Abn(t,e){var n;vr(e,"Partition preprocessing",1),n=u(Bl(Ri(Wo(Ri(new Tn(null,new _n(t.a,16)),new QK),new wN),new Z5),c2(new ke,new ce,new Xn,lt(ct(fl,1),oe,132,0,[(O1(),Ul)]))),15),ls(n.Oc(),new vN),or(e)}function ice(t){_rt();var e,n,r,s,o,h,d;for(n=new a2,s=new S(t.e.b);s.a1?t.e*=Xt(t.a):t.f/=Xt(t.a),uln(t),gfn(t),Xvn(t),Jt(t.b,(o_(),fV),t.g)}function cce(t,e,n){var r,s,o,h,d,v;for(r=0,v=n,e||(r=n*(t.c.length-1),v*=-1),o=new S(t);o.a=0?(e||(e=new $C,r>0&&go(e,t.substr(0,r))),e.a+="\\",S8(e,n&ys)):e&&S8(e,n&ys);return e?e.a:t}function Bbn(t){var e;if(!t.a)throw it(new No("IDataType class expected for layout option "+t.f));if(e=Gsn(t.a),e==null)throw it(new No("Couldn't create new instance of property '"+t.f+"'. "+ade+(P0(gP),gP.k)+d8t));return u(e,414)}function eat(t){var e,n,r,s,o;return o=t.eh(),o&&o.kh()&&(s=Zp(t,o),s!=o)?(n=t.Vg(),r=(e=t.Vg(),e>=0?t.Qg(null):t.eh().ih(t,-1-e,null,null)),t.Rg(u(s,49),n),r&&r.Fi(),t.Lg()&&t.Mg()&&n>-1&&mi(t,new Js(t,9,n,o,s)),s):o}function dce(t){var e,n,r,s,o,h,d,v;for(h=0,o=t.f.e,r=0;r>5,s>=t.d)return t.e<0;if(n=t.a[s],e=1<<(e&31),t.e<0){if(r=Ine(t),s>16)),15).Xc(o),d0&&(!(Bp(t.a.c)&&e.n.d)&&!(b8(t.a.c)&&e.n.b)&&(e.g.d+=b.Math.max(0,r/2-.5)),!(Bp(t.a.c)&&e.n.a)&&!(b8(t.a.c)&&e.n.c)&&(e.g.a-=r-1))}function bce(t){var e,n,r,s,o;if(s=new he,o=ule(t,s),e=u(Q(t,(ae(),Ju)),10),e)for(r=new S(e.j);r.a>e,o=t.m>>e|n<<22-e,s=t.l>>e|t.m<<22-e):e<44?(h=r?Z0:0,o=n>>e-22,s=t.m>>e-22|n<<44-e):(h=r?Z0:0,o=r?hl:0,s=n>>e-44),iu(s&hl,o&hl,h&Z0)}function nat(t){var e,n,r,s,o,h;for(this.c=new he,this.d=t,r=as,s=as,e=Cs,n=Cs,h=ei(t,0);h.b!=h.d.c;)o=u(ti(h),8),r=b.Math.min(r,o.a),s=b.Math.min(s,o.b),e=b.Math.max(e,o.a),n=b.Math.max(n,o.b);this.a=new ah(r,s,e-r,n-s)}function mce(t,e){var n,r,s,o,h,d;for(o=new S(t.b);o.a0&&_t(e,42)&&(t.a.qj(),k=u(e,42),v=k.cd(),o=v==null?0:Hi(v),h=rwt(t.a,o),n=t.a.d[h],n)){for(r=u(n.g,367),C=n.i,d=0;d=2)for(n=s.Kc(),e=ye(n.Pb());n.Ob();)o=e,e=ye(n.Pb()),r=b.Math.min(r,(On(e),e-(On(o),o)));return r}function Ybn(t,e){var n,r,s,o,h;r=new Zi,fs(r,e,r.c.b,r.c);do for(n=(Zn(r.b!=0),u(lh(r,r.a.a),86)),t.b[n.g]=1,o=ei(n.d,0);o.b!=o.d.c;)s=u(ti(o),188),h=s.c,t.b[h.g]==1?ri(t.a,s):t.b[h.g]==2?t.b[h.g]=1:fs(r,h,r.c.b,r.c);while(r.b!=0)}function Kbn(t,e){var n,r,s;if(Vt(e)===Vt(Lr(t)))return!0;if(!_t(e,15)||(r=u(e,15),s=t.gc(),s!=r.gc()))return!1;if(_t(r,54)){for(n=0;n0&&(s=n),h=new S(t.f.e);h.a0?(e-=1,n-=1):r>=0&&s<0?(e+=1,n+=1):r>0&&s>=0?(e-=1,n+=1):(e+=1,n-=1),new fa(pe(e),pe(n))}function d2n(t,e){return t.ce.c?1:t.be.b?1:t.a!=e.a?Hi(t.a)-Hi(e.a):t.d==($9(),BS)&&e.d==NS?-1:t.d==NS&&e.d==BS?1:0}function _ce(t,e){var n,r,s,o,h;return o=e.a,o.c.i==e.b?h=o.d:h=o.c,o.c.i==e.b?r=o.c:r=o.d,s=zhn(t.a,h,r),s>0&&s0):s<0&&-s0):!1}function g2n(t,e,n,r){var s,o,h,d,v,k,C,M;for(s=(e-t.d)/t.c.c.length,o=0,t.a+=n,t.d=e,M=new S(t.c);M.a>24;return h}function b2n(t){if(t.pe()){var e=t.c;e.qe()?t.o="["+e.n:e.pe()?t.o="["+e.ne():t.o="[L"+e.ne()+";",t.b=e.me()+"[]",t.k=e.oe()+"[]";return}var n=t.j,r=t.d;r=r.split("/"),t.o=ast(".",[n,ast("$",r)]),t.b=ast(".",[n,ast(".",r)]),t.k=r[r.length-1]}function w2n(t,e){var n,r,s,o,h;for(h=null,o=new S(t.e.a);o.a=0;e-=2)for(n=0;n<=e;n+=2)(t.b[n]>t.b[n+2]||t.b[n]===t.b[n+2]&&t.b[n+1]>t.b[n+3])&&(r=t.b[n+2],t.b[n+2]=t.b[n],t.b[n]=r,r=t.b[n+3],t.b[n+3]=t.b[n+1],t.b[n+1]=r);t.c=!0}}function Sce(t,e){var n,r,s,o,h,d,v,k;for(h=e==1?clt:olt,o=h.a.ec().Kc();o.Ob();)for(s=u(o.Pb(),103),v=u(Ai(t.f.c,s),21).Kc();v.Ob();)switch(d=u(v.Pb(),46),r=u(d.b,81),k=u(d.a,189),n=k.c,s.g){case 2:case 1:r.g.d+=n;break;case 4:case 3:r.g.c+=n}}function y2n(t,e){var n,r,s,o,h,d,v,k,C;for(k=-1,C=0,h=t,d=0,v=h.length;d0&&++C;++k}return C}function mf(t){var e,n;return n=new Ol(Ip(t.gm)),n.a+="@",Gr(n,(e=Hi(t)>>>0,e.toString(16))),t.kh()?(n.a+=" (eProxyURI: ",hc(n,t.qh()),t.$g()&&(n.a+=" eClass: ",hc(n,t.$g())),n.a+=")"):t.$g()&&(n.a+=" (eClass: ",hc(n,t.$g()),n.a+=")"),n.a}function v_(t){var e,n,r,s;if(t.e)throw it(new No((P0(zut),Sot+zut.k+Aot)));for(t.d==(ao(),h0)&&Bq(t,zh),n=new S(t.a.a);n.a>24}return n}function E2n(t,e,n){var r,s,o;if(s=u(po(t.i,e),306),!s)if(s=new Aee(t.d,e,n),zx(t.i,e,s),P3t(e))jQe(t.a,e.c,e.b,s);else switch(o=lpn(e),r=u(po(t.p,o),244),o.g){case 1:case 3:s.j=!0,het(r,e.b,s);break;case 4:case 2:s.k=!0,het(r,e.c,s)}return s}function T2n(t,e,n,r){var s,o,h,d,v,k;if(d=new ox,v=ou(t.e.Tg(),e),s=u(t.g,119),to(),u(e,66).Oj())for(h=0;h=0)return s;for(o=1,d=new S(e.j);d.a0&&e.ue((An(s-1,t.c.length),u(t.c[s-1],10)),o)>0;)ch(t,s,(An(s-1,t.c.length),u(t.c[s-1],10))),--s;An(s,t.c.length),t.c[s]=o}n.a=new _r,n.b=new _r}function C2n(t,e,n){var r,s,o,h,d,v,k,C;for(C=(r=u(e.e&&e.e(),9),new sh(r,u(ff(r,r.length),9),0)),v=vy(n,"[\\[\\]\\s,]+"),o=v,h=0,d=o.length;h0&&(!(Bp(t.a.c)&&e.n.d)&&!(b8(t.a.c)&&e.n.b)&&(e.g.d-=b.Math.max(0,r/2-.5)),!(Bp(t.a.c)&&e.n.a)&&!(b8(t.a.c)&&e.n.c)&&(e.g.a+=b.Math.max(0,r-1)))}function Ice(t,e,n){var r,s;if((t.c-t.b&t.a.length-1)==2)e==(ve(),Pn)||e==Hn?(nz(u(Q9(t),15),(zl(),f0)),nz(u(Q9(t),15),kb)):(nz(u(Q9(t),15),(zl(),kb)),nz(u(Q9(t),15),f0));else for(s=new O9(t);s.a!=s.b;)r=u(Mz(s),15),nz(r,n)}function S2n(t,e){var n,r,s,o,h,d,v;for(s=x8(new Tpt(t)),d=new da(s,s.c.length),o=x8(new Tpt(e)),v=new da(o,o.c.length),h=null;d.b>0&&v.b>0&&(n=(Zn(d.b>0),u(d.a.Xb(d.c=--d.b),33)),r=(Zn(v.b>0),u(v.a.Xb(v.c=--v.b),33)),n==r);)h=n;return h}function ul(t,e){var n,r,s,o,h,d;return o=t.a*Eot+t.b*1502,d=t.b*Eot+11,n=b.Math.floor(d*$I),o+=n,d-=n*Gxt,o%=Gxt,t.a=o,t.b=d,e<=24?b.Math.floor(t.a*DEt[e]):(s=t.a*(1<=2147483648&&(r-=mot),r)}function Oce(t,e,n){var r,s,o,h;rZt(t,e)>rZt(t,n)?(r=Ko(n,(ve(),Hn)),t.d=r.dc()?0:Nnt(u(r.Xb(0),11)),h=Ko(e,Bn),t.b=h.dc()?0:Nnt(u(h.Xb(0),11))):(s=Ko(n,(ve(),Bn)),t.d=s.dc()?0:Nnt(u(s.Xb(0),11)),o=Ko(e,Hn),t.b=o.dc()?0:Nnt(u(o.Xb(0),11)))}function Pce(t){var e,n,r,s,o,h,d;if(t&&(e=t.Hh(Bh),e&&(h=Br(Xf((!e.b&&(e.b=new kl((dn(),Qa),cc,e)),e.b),"conversionDelegates")),h!=null))){for(d=new he,r=vy(h,"\\w+"),s=0,o=r.length;st.c));h++)s.a>=t.s&&(o<0&&(o=h),d=h);return v=(t.s+t.c)/2,o>=0&&(r=lmn(t,e,o,d),v=mXe((An(r,e.c.length),u(e.c[r],329))),ybn(e,r,n)),v}function sat(){sat=Z,l3e=new eo((ui(),W6),1.3),G_t=GSt,Z_t=new Ow(15),w3e=new eo(U2,Z_t),m3e=new eo(W2,15),h3e=YG,g3e=G2,p3e=c5,b3e=xb,d3e=o5,K_t=tP,v3e=Qy,Q_t=(y5t(),o3e),Y_t=s3e,X_t=a3e,J_t=c3e,U_t=i3e,W_t=KG,f3e=WSt,HO=r3e,V_t=n3e,tSt=u3e}function Ir(t,e,n){var r,s,o,h,d,v,k;for(h=(o=new lB,o),oyt(h,(On(e),e)),k=(!h.b&&(h.b=new kl((dn(),Qa),cc,h)),h.b),v=1;v0&&r4n(this,s)}function S5t(t,e,n,r,s,o){var h,d,v;if(!s[e.b]){for(s[e.b]=!0,h=r,!h&&(h=new B$),le(h.e,e),v=o[e.b].Kc();v.Ob();)d=u(v.Pb(),282),!(d.d==n||d.c==n)&&(d.c!=e&&S5t(t,d.c,e,h,s,o),d.d!=e&&S5t(t,d.d,e,h,s,o),le(h.c,d),Ls(h.d,d.b));return h}return null}function M2n(t){var e,n,r,s,o,h,d;for(e=0,s=new S(t.e);s.a=2}function D2n(t,e){var n,r,s,o;for(vr(e,"Self-Loop pre-processing",1),r=new S(t.a);r.a1||(e=ji(_f,lt(ct(lo,1),oe,93,0,[ig,Sf])),OD(k$(e,t))>1)||(r=ji(Lf,lt(ct(lo,1),oe,93,0,[d0,Hh])),OD(k$(r,t))>1))}function P2n(t,e){var n,r,s;return n=e.Hh(t.a),n&&(s=Br(Xf((!n.b&&(n.b=new kl((dn(),Qa),cc,n)),n.b),"affiliation")),s!=null)?(r=Tj(s,Cu(35)),r==-1?Uit(t,C9(t,Rl(e.Hj())),s):r==0?Uit(t,null,s.substr(1)):Uit(t,s.substr(0,r),s.substr(r+1))):null}function F2n(t){var e,n,r;try{return t==null?_u:$o(t)}catch(s){if(s=Wi(s),_t(s,102))return e=s,r=Ip(ol(t))+"@"+(n=(Gd(),$3t(t)>>>0),n.toString(16)),Efn(kun(),(d8(),"Exception during lenientFormat for "+r),e),"<"+r+" threw "+Ip(e.gm)+">";throw it(s)}}function Bce(t){switch(t.g){case 0:return new ett;case 1:return new qB;case 2:return new jVt;case 3:return new BL;case 4:return new aYt;case 5:return new ntt;default:throw it(new Fn("No implementation is available for the layerer "+(t.f!=null?t.f:""+t.g)))}}function A5t(t,e,n){var r,s,o;for(o=new S(t.t);o.a0&&(r.b.n-=r.c,r.b.n<=0&&r.b.u>0&&ri(e,r.b));for(s=new S(t.i);s.a0&&(r.a.u-=r.c,r.a.u<=0&&r.a.n>0&&ri(n,r.a))}function wq(t){var e,n,r,s,o;if(t.g==null&&(t.d=t.si(t.f),Dr(t,t.d),t.c))return o=t.f,o;if(e=u(t.g[t.i-1],47),s=e.Pb(),t.e=e,n=t.si(s),n.Ob())t.d=n,Dr(t,n);else for(t.d=null;!e.Ob()&&(ts(t.g,--t.i,null),t.i!=0);)r=u(t.g[t.i-1],47),e=r;return s}function N2n(t,e){var n,r,s,o,h,d;if(r=e,s=r.ak(),X0(t.e,s)){if(s.hi()&&O$(t,s,r.dd()))return!1}else for(d=ou(t.e.Tg(),s),n=u(t.g,119),o=0;o1||n>1)return 2;return e+n==1?2:0}function jce(t,e,n){var r,s,o,h,d;for(vr(n,"ELK Force",1),je(Re(qe(e,(Jf(),y7t))))||y$((r=new rr((Pm(),new Mm(e))),r)),d=pre(e),odn(d),$un(t,u(Q(d,m7t),424)),h=Ale(t.a,d),o=h.Kc();o.Ob();)s=u(o.Pb(),231),kmn(t.b,s,Rc(n,1/h.gc()));d=zhe(h),Rhe(d),or(n)}function H2n(t,e){var n,r,s,o,h;if(vr(e,"Breaking Point Processor",1),u5n(t),je(Re(Q(t,(Te(),S9t))))){for(s=new S(t.b);s.a=0?t._g(r,!0,!0):dv(t,o,!0),153)),u(s,215).ml(e,n)}else throw it(new Fn(lb+e.ne()+X_))}function W2n(t,e){var n,r,s,o,h;for(n=new he,s=Wo(new Tn(null,new _n(t,16)),new ZQ),o=Wo(new Tn(null,new _n(t,16)),new JQ),h=yon(Fan(l$(_wn(lt(ct(n6n,1),De,833,0,[s,o])),new tZ))),r=1;r=2*e&&le(n,new Dnt(h[r-1]+e,h[r]-e));return n}function Y2n(t,e,n){vr(n,"Eades radial",1),n.n&&e&&gf(n,pf(e),(Sl(),Ql)),t.d=u(qe(e,(m9(),HS)),33),t.c=Xt(ye(qe(e,(uy(),RG)))),t.e=pst(u(qe(e,qO),293)),t.a=Shn(u(qe(e,D_t),426)),t.b=Kdn(u(qe(e,M_t),340)),Ldn(t),n.n&&e&&gf(n,pf(e),(Sl(),Ql))}function K2n(t,e,n){var r,s,o,h,d,v,k,C;if(n)for(o=n.a.length,r=new e2(o),d=(r.b-r.a)*r.c<0?(Fp(),Ib):new jp(r);d.Ob();)h=u(d.Pb(),19),s=P8(n,h.a),s&&(v=Wsn(t,(k=(Sw(),C=new Gpt,C),e&&D5t(k,e),k),s),G9(v,R0(s,Ad)),lq(s,v),e5t(s,v),Lit(t,s,v))}function mq(t){var e,n,r,s,o,h;if(!t.j){if(h=new tC,e=uA,o=e.a.zc(t,e),o==null){for(r=new nr(Ao(t));r.e!=r.i.gc();)n=u(dr(r),26),s=mq(n),is(h,s),Dr(h,n);e.a.Bc(t)!=null}iy(h),t.j=new V3((u(At(Wt((Hp(),Ln).o),11),18),h.i),h.g),sl(t).b&=-33}return t.j}function X2n(t){var e,n,r,s;if(t==null)return null;if(r=$c(t,!0),s=oO.length,hn(r.substr(r.length-s,s),oO)){if(n=r.length,n==4){if(e=(Rr(0,r.length),r.charCodeAt(0)),e==43)return CLt;if(e==45)return G5e}else if(n==3)return CLt}return new Ppt(r)}function Q2n(t){var e,n,r;return n=t.l,n&n-1||(r=t.m,r&r-1)||(e=t.h,e&e-1)||e==0&&r==0&&n==0?-1:e==0&&r==0&&n!=0?tyt(n):e==0&&r!=0&&n==0?tyt(r)+22:e!=0&&r==0&&n==0?tyt(e)+44:-1}function Z2n(t,e){var n,r,s,o,h;for(vr(e,"Edge joining",1),n=je(Re(Q(t,(Te(),dht)))),s=new S(t.b);s.a1)for(s=new S(t.a);s.a0),o.a.Xb(o.c=--o.b),zm(o,s),Zn(o.b3&&Jd(t,0,e-3))}function nwn(t){var e,n,r,s;return Vt(Q(t,(Te(),qy)))===Vt((G0(),sp))?!t.e&&Vt(Q(t,DO))!==Vt((eE(),TO)):(r=u(Q(t,eht),292),s=je(Re(Q(t,nht)))||Vt(Q(t,_S))===Vt((n6(),EO)),e=u(Q(t,VCt),19).a,n=t.a.c.length,!s&&r!=(eE(),TO)&&(e==0||e>n))}function rwn(t){var e,n;for(n=0;n0);n++);if(n>0&&n0);e++);return e>0&&n>16!=6&&e){if(vE(t,e))throw it(new Fn(Q_+sce(t)));r=null,t.Cb&&(r=(n=t.Db>>16,n>=0?r4t(t,r):t.Cb.ih(t,-1-n,null,r))),e&&(r=c6(e,t,6,r)),r=ewt(t,e,r),r&&r.Fi()}else t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,6,e,e))}function D5t(t,e){var n,r;if(e!=t.Cb||t.Db>>16!=9&&e){if(vE(t,e))throw it(new Fn(Q_+zue(t)));r=null,t.Cb&&(r=(n=t.Db>>16,n>=0?s4t(t,r):t.Cb.ih(t,-1-n,null,r))),e&&(r=c6(e,t,9,r)),r=nwt(t,e,r),r&&r.Fi()}else t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,9,e,e))}function oat(t,e){var n,r;if(e!=t.Cb||t.Db>>16!=3&&e){if(vE(t,e))throw it(new Fn(Q_+$le(t)));r=null,t.Cb&&(r=(n=t.Db>>16,n>=0?o4t(t,r):t.Cb.ih(t,-1-n,null,r))),e&&(r=c6(e,t,12,r)),r=twt(t,e,r),r&&r.Fi()}else t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,3,e,e))}function SE(t){var e,n,r,s,o;if(r=Dh(t),o=t.j,o==null&&r)return t.$j()?null:r.zj();if(_t(r,148)){if(n=r.Aj(),n&&(s=n.Nh(),s!=t.i)){if(e=u(r,148),e.Ej())try{t.g=s.Kh(e,o)}catch(h){if(h=Wi(h),_t(h,78))t.g=null;else throw it(h)}t.i=s}return t.g}return null}function qce(t){var e;return e=new he,le(e,new Dx(new $e(t.c,t.d),new $e(t.c+t.b,t.d))),le(e,new Dx(new $e(t.c,t.d),new $e(t.c,t.d+t.a))),le(e,new Dx(new $e(t.c+t.b,t.d+t.a),new $e(t.c+t.b,t.d))),le(e,new Dx(new $e(t.c+t.b,t.d+t.a),new $e(t.c,t.d+t.a))),e}function Hce(t,e,n,r){var s,o,h;if(h=p4t(e,n),r.c[r.c.length]=e,t.j[h.p]==-1||t.j[h.p]==2||t.a[e.p])return r;for(t.j[h.p]=-1,o=new ar(lr(U0(h).a.Kc(),new z));zr(o);)if(s=u(Mr(o),17),!(!(!Ga(s)&&!(!Ga(s)&&s.c.i.c==s.d.i.c))||s==e))return Hce(t,s,h,r);return r}function iwn(t,e,n){var r,s,o;for(o=e.a.ec().Kc();o.Ob();)s=u(o.Pb(),79),r=u(tr(t.b,s),266),!r&&(es(e0(s))==es(tb(s))?mvn(t,s,n):e0(s)==es(tb(s))?tr(t.c,s)==null&&tr(t.b,tb(s))!=null&&khe(t,s,n,!1):tr(t.d,s)==null&&tr(t.b,e0(s))!=null&&khe(t,s,n,!0))}function swn(t,e){var n,r,s,o,h,d,v;for(s=t.Kc();s.Ob();)for(r=u(s.Pb(),10),d=new Mc,Uo(d,r),Bs(d,(ve(),Hn)),Jt(d,(ae(),nG),(Nn(),!0)),h=e.Kc();h.Ob();)o=u(h.Pb(),10),v=new Mc,Uo(v,o),Bs(v,Bn),Jt(v,nG,!0),n=new Vw,Jt(n,nG,!0),Oa(n,d),oa(n,v)}function awn(t,e,n,r){var s,o,h,d;s=Rie(t,e,n),o=Rie(t,n,e),h=u(tr(t.c,e),112),d=u(tr(t.c,n),112),sr.b.g&&(o.c[o.c.length]=r);return o}function AE(){AE=Z,i5=new DM("CANDIDATE_POSITION_LAST_PLACED_RIGHT",0),G6=new DM("CANDIDATE_POSITION_LAST_PLACED_BELOW",1),GS=new DM("CANDIDATE_POSITION_WHOLE_DRAWING_RIGHT",2),VS=new DM("CANDIDATE_POSITION_WHOLE_DRAWING_BELOW",3),US=new DM("WHOLE_DRAWING",4)}function own(t,e){if(_t(e,239))return Bln(t,u(e,33));if(_t(e,186))return Xln(t,u(e,118));if(_t(e,354))return urn(t,u(e,137));if(_t(e,352))return Oyn(t,u(e,79));if(e)return null;throw it(new Fn(L8t+eb(new yl(lt(ct(Qn,1),De,1,5,[e])))))}function cwn(t){var e,n,r,s,o,h,d;for(o=new Zi,s=new S(t.d.a);s.a1)for(e=Fw((n=new Xb,++t.b,n),t.d),d=ei(o,0);d.b!=d.d.c;)h=u(ti(d),121),yf(lf(uf(hf(cf(new Ch,1),0),e),h))}function I5t(t,e){var n,r;if(e!=t.Cb||t.Db>>16!=11&&e){if(vE(t,e))throw it(new Fn(Q_+X5t(t)));r=null,t.Cb&&(r=(n=t.Db>>16,n>=0?c4t(t,r):t.Cb.ih(t,-1-n,null,r))),e&&(r=c6(e,t,10,r)),r=lwt(t,e,r),r&&r.Fi()}else t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,11,e,e))}function uwn(t){var e,n,r,s;for(r=new p2(new Cg(t.b).a);r.b;)n=Zw(r),s=u(n.cd(),11),e=u(n.dd(),10),Jt(e,(ae(),_i),s),Jt(s,Ju,e),Jt(s,SO,(Nn(),!0)),Bs(s,u(Q(e,oc),61)),Q(e,oc),Jt(s.i,(Te(),cs),(ua(),B7)),u(Q(Na(s.i),Vc),21).Fc((oo(),y7))}function lwn(t,e,n){var r,s,o,h,d,v;if(o=0,h=0,t.c)for(v=new S(t.d.i.j);v.ao.a?-1:s.av){for(C=t.d,t.d=Nt(XAt,R8t,63,2*v+4,0,1),o=0;o=9223372036854776e3?(q8(),sEt):(s=!1,t<0&&(s=!0,t=-t),r=0,t>=C2&&(r=ps(t/C2),t-=r*C2),n=0,t>=m6&&(n=ps(t/m6),t-=n*m6),e=ps(t),o=iu(e,n,r),s&&Ait(o),o)}function ywn(t,e){var n,r,s,o;for(n=!e||!t.u.Hc((Zu(),sg)),o=0,s=new S(t.e.Cf());s.a=-e&&r==e?new fa(pe(n-1),pe(r)):new fa(pe(n),pe(r-1))}function Yce(){return ro(),lt(ct(l6n,1),oe,77,0,[J7t,X7t,gS,glt,vTt,CV,FV,h7,bTt,oTt,gTt,l7,wTt,iTt,mTt,V7t,LV,plt,EV,IV,xTt,DV,G7t,pTt,kTt,OV,yTt,TV,eTt,fTt,hTt,NV,Y7t,kV,SV,W7t,u7,uTt,sTt,dTt,pS,Q7t,K7t,lTt,aTt,AV,PV,U7t,MV,cTt,_V,nTt,tTt,xO,xV,rTt,Z7t])}function Twn(t,e,n){t.d=0,t.b=0,e.k==(Vn(),Hc)&&n.k==Hc&&u(Q(e,(ae(),_i)),10)==u(Q(n,_i),10)&&(eit(e).j==(ve(),Pn)?Oce(t,e,n):Oce(t,n,e)),e.k==Hc&&n.k==ta?eit(e).j==(ve(),Pn)?t.d=1:t.b=1:n.k==Hc&&e.k==ta&&(eit(n).j==(ve(),Pn)?t.b=1:t.d=1),h1n(t,e,n)}function Cwn(t){var e,n,r,s,o,h,d,v,k,C,M;return M=D4t(t),e=t.a,v=e!=null,v&&E8(M,"category",t.a),s=wM(new Sm(t.d)),h=!s,h&&(k=new Eg,Yf(M,"knownOptions",k),n=new Nzt(k),va(new Sm(t.d),n)),o=wM(t.g),d=!o,d&&(C=new Eg,Yf(M,"supportedFeatures",C),r=new Bzt(C),va(t.g,r)),M}function _wn(t){var e,n,r,s,o,h,d,v,k;for(r=!1,e=336,n=0,o=new XWt(t.length),d=t,v=0,k=d.length;v>16!=7&&e){if(vE(t,e))throw it(new Fn(Q_+eoe(t)));r=null,t.Cb&&(r=(n=t.Db>>16,n>=0?i4t(t,r):t.Cb.ih(t,-1-n,null,r))),e&&(r=u(e,49).gh(t,1,lP,r)),r=nvt(t,e,r),r&&r.Fi()}else t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,7,e,e))}function Kce(t,e){var n,r;if(e!=t.Cb||t.Db>>16!=3&&e){if(vE(t,e))throw it(new Fn(Q_+lie(t)));r=null,t.Cb&&(r=(n=t.Db>>16,n>=0?a4t(t,r):t.Cb.ih(t,-1-n,null,r))),e&&(r=u(e,49).gh(t,0,fP,r)),r=rvt(t,e,r),r&&r.Fi()}else t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,3,e,e))}function uat(t,e){TE();var n,r,s,o,h,d,v,k,C;return e.d>t.d&&(d=t,t=e,e=d),e.d<63?bvn(t,e):(h=(t.d&-2)<<4,k=bmt(t,h),C=bmt(e,h),r=Cat(t,Qx(k,h)),s=Cat(e,Qx(C,h)),v=uat(k,C),n=uat(r,s),o=uat(Cat(k,r),Cat(s,C)),o=Oat(Oat(o,v),n),o=Qx(o,h),v=Qx(v,h<<1),Oat(Oat(v,o),n))}function Awn(t,e,n){var r,s,o,h,d;for(h=t_(t,n),d=Nt(l0,Yg,10,e.length,0,1),r=0,o=h.Kc();o.Ob();)s=u(o.Pb(),11),je(Re(Q(s,(ae(),SO))))&&(d[r++]=u(Q(s,Ju),10));if(r=0;o+=n?1:-1)h=h|e.c.Sf(v,o,n,r&&!je(Re(Q(e.j,(ae(),Ov))))&&!je(Re(Q(e.j,(ae(),X4))))),h=h|e.q._f(v,o,n),h=h|Pue(t,v[o],n,r);return Fs(t.c,e),h}function xq(t,e,n){var r,s,o,h,d,v,k,C,M,j;for(C=OZt(t.j),M=0,j=C.length;M1&&(t.a=!0),Ven(u(n.b,65),Li(nc(u(e.b,65).c),fd(ia(nc(u(n.b,65).a),u(e.b,65).a),s))),WQt(t,e),Xce(t,n)}function Qce(t){var e,n,r,s,o,h,d;for(o=new S(t.a.a);o.a0&&o>0?h.p=e++:r>0?h.p=n++:o>0?h.p=s++:h.p=n++}wn(),Zs(t.j,new DL)}function Own(t){var e,n;n=null,e=u(Ne(t.g,0),17);do{if(n=e.d.i,Us(n,(ae(),$h)))return u(Q(n,$h),11).i;if(n.k!=(Vn(),Os)&&zr(new ar(lr(Ds(n).a.Kc(),new z))))e=u(Mr(new ar(lr(Ds(n).a.Kc(),new z))),17);else if(n.k!=Os)return null}while(n&&n.k!=(Vn(),Os));return n}function Pwn(t,e){var n,r,s,o,h,d,v,k,C;for(d=e.j,h=e.g,v=u(Ne(d,d.c.length-1),113),C=(An(0,d.c.length),u(d.c[0],113)),k=Ast(t,h,v,C),o=1;ok&&(v=n,C=s,k=r);e.a=C,e.c=v}function Fwn(t,e){var n,r;if(r=tD(t.b,e.b),!r)throw it(new No("Invalid hitboxes for scanline constraint calculation."));(ire(e.b,u(FZe(t.b,e.b),57))||ire(e.b,u(PZe(t.b,e.b),57)))&&(Gd(),e.b+""),t.a[e.b.f]=u(Cnt(t.b,e.b),57),n=u(Tnt(t.b,e.b),57),n&&(t.a[n.f]=e.b)}function yf(t){if(!t.a.d||!t.a.e)throw it(new No((P0(fpe),fpe.k+" must have a source and target "+(P0(a7t),a7t.k)+" specified.")));if(t.a.d==t.a.e)throw it(new No("Network simplex does not support self-loops: "+t.a+" "+t.a.d+" "+t.a.e));return _j(t.a.d.g,t.a),_j(t.a.e.b,t.a),t.a}function Nwn(t,e,n){var r,s,o,h,d,v,k;for(k=new Op(new F$t(t)),h=lt(ct(Jbe,1),h1e,11,0,[e,n]),d=0,v=h.length;dv-t.b&&dv-t.a&&d0&&++H;++j}return H}function Uwn(t,e){var n,r,s,o,h;for(h=u(Q(e,(gv(),d_t)),425),o=ei(e.b,0);o.b!=o.d.c;)if(s=u(ti(o),86),t.b[s.g]==0){switch(h.g){case 0:Cse(t,s);break;case 1:Ybn(t,s)}t.b[s.g]=2}for(r=ei(t.a,0);r.b!=r.d.c;)n=u(ti(r),188),ay(n.b.d,n,!0),ay(n.c.b,n,!0);Jt(e,(fc(),a_t),t.a)}function ou(t,e){to();var n,r,s,o;return e?e==(Ii(),H5e)||(e==D5e||e==X2||e==M5e)&&t!=ELt?new Axt(t,e):(r=u(e,677),n=r.pk(),n||(M8(To(($u(),ya),e)),n=r.pk()),o=(!n.i&&(n.i=new _r),n.i),s=u(ec(Lo(o.f,t)),1942),!s&&ki(o,t,s=new Axt(t,e)),s):S5e}function Wwn(t,e){var n,r,s,o,h,d,v,k,C;for(v=u(Q(t,(ae(),_i)),11),k=Yo(lt(ct(Ws,1),ee,8,0,[v.i.n,v.n,v.a])).a,C=t.i.n.b,n=wd(t.e),s=n,o=0,h=s.length;o0?o.a?(d=o.b.rf().a,n>d&&(s=(n-d)/2,o.d.b=s,o.d.c=s)):o.d.c=t.s+n:S9(t.u)&&(r=I4t(o.b),r.c<0&&(o.d.b=-r.c),r.c+r.b>o.b.rf().a&&(o.d.c=r.c+r.b-o.b.rf().a))}function Qwn(t,e){var n,r,s,o;for(vr(e,"Semi-Interactive Crossing Minimization Processor",1),n=!1,s=new S(t.b);s.a=0){if(e==n)return new fa(pe(-e-1),pe(-e-1));if(e==-n)return new fa(pe(-e),pe(n+1))}return b.Math.abs(e)>b.Math.abs(n)?e<0?new fa(pe(-e),pe(n)):new fa(pe(-e),pe(n+1)):new fa(pe(e+1),pe(n))}function tvn(t){var e,n;n=u(Q(t,(Te(),uu)),163),e=u(Q(t,(ae(),B2)),303),n==(dh(),bb)?(Jt(t,uu,MO),Jt(t,B2,(q0(),Y4))):n==jy?(Jt(t,uu,MO),Jt(t,B2,(q0(),F6))):e==(q0(),Y4)?(Jt(t,uu,bb),Jt(t,B2,CO)):e==F6&&(Jt(t,uu,jy),Jt(t,B2,CO))}function kq(){kq=Z,jO=new jQ,Zme=bi(new Vs,(Wa(),cu),(ro(),EV)),eye=Ku(bi(new Vs,cu,DV),Io,MV),nye=uv(uv(VR(Ku(bi(new Vs,Dd,FV),Io,PV),qc),OV),NV),Jme=Ku(bi(bi(bi(new Vs,gb,CV),qc,SV),qc,u7),Io,_V),tye=Ku(bi(bi(new Vs,qc,u7),qc,kV),Io,xV)}function m_(){m_=Z,sye=bi(Ku(new Vs,(Wa(),Io),(ro(),nTt)),cu,EV),uye=uv(uv(VR(Ku(bi(new Vs,Dd,FV),Io,PV),qc),OV),NV),aye=Ku(bi(bi(bi(new Vs,gb,CV),qc,SV),qc,u7),Io,_V),cye=bi(bi(new Vs,cu,DV),Io,MV),oye=Ku(bi(bi(new Vs,qc,u7),qc,kV),Io,xV)}function evn(t,e,n,r,s){var o,h;(!Ga(e)&&e.c.i.c==e.d.i.c||!fne(Yo(lt(ct(Ws,1),ee,8,0,[s.i.n,s.n,s.a])),n))&&!Ga(e)&&(e.c==s?m8(e.a,0,new xo(n)):ri(e.a,new xo(n)),r&&!I0(t.a,n)&&(h=u(Q(e,(Te(),So)),74),h||(h=new Pu,Jt(e,So,h)),o=new xo(n),fs(h,o,h.c.b,h.c),Fs(t.a,o)))}function nvn(t){var e,n;for(n=new ar(lr(jo(t).a.Kc(),new z));zr(n);)if(e=u(Mr(n),17),e.c.i.k!=(Vn(),Ll))throw it(new R3(Kot+rI(t)+"' has its layer constraint set to FIRST, but has at least one incoming edge that does not come from a FIRST_SEPARATE node. That must not happen."))}function rvn(t,e,n){var r,s,o,h,d,v,k;if(s=bie(t.Db&254),s==0)t.Eb=n;else{if(s==1)d=Nt(Qn,De,1,2,5,1),o=Sst(t,e),o==0?(d[0]=n,d[1]=t.Eb):(d[0]=t.Eb,d[1]=n);else for(d=Nt(Qn,De,1,s+1,5,1),h=u2(t.Eb),r=2,v=0,k=0;r<=128;r<<=1)r==e?d[k++]=n:t.Db&r&&(d[k++]=h[v++]);t.Eb=d}t.Db|=e}function Jce(t,e,n){var r,s,o,h;for(this.b=new he,s=0,r=0,h=new S(t);h.a0&&(o=u(Ne(this.b,0),167),s+=o.o,r+=o.p),s*=2,r*=2,e>1?s=ps(b.Math.ceil(s*e)):r=ps(b.Math.ceil(r/e)),this.a=new C3t(s,r)}function tue(t,e,n,r,s,o){var h,d,v,k,C,M,j,H,G,K,tt,gt;for(C=r,e.j&&e.o?(H=u(tr(t.f,e.A),57),K=H.d.c+H.d.b,--C):K=e.a.c+e.a.b,M=s,n.q&&n.o?(H=u(tr(t.f,n.C),57),k=H.d.c,++M):k=n.a.c,tt=k-K,v=b.Math.max(2,M-C),d=tt/v,G=K+d,j=C;j=0;h+=s?1:-1){for(d=e[h],v=r==(ve(),Hn)?s?Ko(d,r):l2(Ko(d,r)):s?l2(Ko(d,r)):Ko(d,r),o&&(t.c[d.p]=v.gc()),M=v.Kc();M.Ob();)C=u(M.Pb(),11),t.d[C.p]=k++;Ls(n,v)}}function eue(t,e,n){var r,s,o,h,d,v,k,C;for(o=Xt(ye(t.b.Kc().Pb())),k=Xt(ye(fun(e.b))),r=fd(nc(t.a),k-n),s=fd(nc(e.a),n-o),C=Li(r,s),fd(C,1/(k-o)),this.a=C,this.b=new he,d=!0,h=t.b.Kc(),h.Pb();h.Ob();)v=Xt(ye(h.Pb())),d&&v-n>Lct&&(this.b.Fc(n),d=!1),this.b.Fc(v);d&&this.b.Fc(n)}function ivn(t){var e,n,r,s;if(pmn(t,t.n),t.d.c.length>0){for(RC(t.c);w5t(t,u(J(new S(t.e.a)),121))>5,e&=31,r>=t.d)return t.e<0?(rb(),But):(rb(),s7);if(o=t.d-r,s=Nt(Cr,Xr,25,o+1,15,1),Qgn(s,o,t.a,r,e),t.e<0){for(n=0;n0&&t.a[n]<<32-e){for(n=0;n=0?!1:(n=C4(($u(),ya),s,e),n?(r=n.Zj(),(r>1||r==-1)&&Hw(To(ya,n))!=3):!0)):!1}function cvn(t,e,n,r){var s,o,h,d,v;return d=Do(u(At((!e.b&&(e.b=new Cn(br,e,4,7)),e.b),0),82)),v=Do(u(At((!e.c&&(e.c=new Cn(br,e,5,8)),e.c),0),82)),es(d)==es(v)||ey(v,d)?null:(h=cD(e),h==n?r:(o=u(tr(t.a,h),10),o&&(s=o.e,s)?s:null))}function uvn(t,e){var n;switch(n=u(Q(t,(Te(),uG)),276),vr(e,"Label side selection ("+n+")",1),n.g){case 0:mce(t,(zl(),f0));break;case 1:mce(t,(zl(),kb));break;case 2:Ple(t,(zl(),f0));break;case 3:Ple(t,(zl(),kb));break;case 4:pue(t,(zl(),f0));break;case 5:pue(t,(zl(),kb))}or(e)}function j5t(t,e,n){var r,s,o,h,d,v;if(r=YKe(n,t.length),h=t[r],h[0].k==(Vn(),ks))for(o=mHt(n,h.length),v=e.j,s=0;s0&&(n[0]+=t.d,h-=n[0]),n[2]>0&&(n[2]+=t.d,h-=n[2]),o=b.Math.max(0,h),n[1]=b.Math.max(n[1],h),vmt(t,eu,s.c+r.b+n[0]-(n[1]-h)/2,n),e==eu&&(t.c.b=o,t.c.c=s.c+r.b+(o-h)/2)}function fue(){this.c=Nt(aa,vo,25,(ve(),lt(ct(Xa,1),xc,61,0,[Zo,Pn,Hn,mr,Bn])).length,15,1),this.b=Nt(aa,vo,25,lt(ct(Xa,1),xc,61,0,[Zo,Pn,Hn,mr,Bn]).length,15,1),this.a=Nt(aa,vo,25,lt(ct(Xa,1),xc,61,0,[Zo,Pn,Hn,mr,Bn]).length,15,1),Abt(this.c,as),Abt(this.b,Cs),Abt(this.a,Cs)}function jc(t,e,n){var r,s,o,h;if(e<=n?(s=e,o=n):(s=n,o=e),r=0,t.b==null)t.b=Nt(Cr,Xr,25,2,15,1),t.b[0]=s,t.b[1]=o,t.c=!0;else{if(r=t.b.length,t.b[r-1]+1==s){t.b[r-1]=o;return}h=Nt(Cr,Xr,25,r+2,15,1),Dc(t.b,0,h,0,r),t.b=h,t.b[r-1]>=s&&(t.c=!1,t.a=!1),t.b[r++]=s,t.b[r]=o,t.c||v4(t)}}function wvn(t,e,n){var r,s,o,h,d,v,k;for(k=e.d,t.a=new Xc(k.c.length),t.c=new _r,d=new S(k);d.a=0?t._g(k,!1,!0):dv(t,n,!1),58));t:for(o=M.Kc();o.Ob();){for(s=u(o.Pb(),56),C=0;C1;)by(s,s.i-1);return r}function kvn(t,e){var n,r,s,o,h,d,v;for(vr(e,"Comment post-processing",1),o=new S(t.b);o.at.d[h.p]&&(n+=fmt(t.b,o),Up(t.a,pe(o)));for(;!BC(t.a);)Hmt(t.b,u(Hx(t.a),19).a)}return n}function bue(t,e,n){var r,s,o,h;for(o=(!e.a&&(e.a=new fe(rs,e,10,11)),e.a).i,s=new nr((!e.a&&(e.a=new fe(rs,e,10,11)),e.a));s.e!=s.i.gc();)r=u(dr(s),33),(!r.a&&(r.a=new fe(rs,r,10,11)),r.a).i==0||(o+=bue(t,r,!1));if(n)for(h=es(e);h;)o+=(!h.a&&(h.a=new fe(rs,h,10,11)),h.a).i,h=es(h);return o}function by(t,e){var n,r,s,o;return t.ej()?(r=null,s=t.fj(),t.ij()&&(r=t.kj(t.pi(e),null)),n=t.Zi(4,o=l6(t,e),null,e,s),t.bj()&&o!=null&&(r=t.dj(o,r)),r?(r.Ei(n),r.Fi()):t.$i(n),o):(o=l6(t,e),t.bj()&&o!=null&&(r=t.dj(o,null),r&&r.Fi()),o)}function Tvn(t){var e,n,r,s,o,h,d,v,k,C;for(k=t.a,e=new Hs,v=0,r=new S(t.d);r.ad.d&&(C=d.d+d.a+k));n.c.d=C,e.a.zc(n,e),v=b.Math.max(v,n.c.d+n.c.a)}return v}function oo(){oo=Z,KV=new Fm("COMMENTS",0),vh=new Fm("EXTERNAL_PORTS",1),yS=new Fm("HYPEREDGES",2),XV=new Fm("HYPERNODES",3),y7=new Fm("NON_FREE_PORTS",4),W4=new Fm("NORTH_SOUTH_PORTS",5),xS=new Fm(M1e,6),v7=new Fm("CENTER_LABELS",7),m7=new Fm("END_LABELS",8),QV=new Fm("PARTITIONS",9)}function wy(t){var e,n,r,s,o;for(s=new he,e=new E9((!t.a&&(t.a=new fe(rs,t,10,11)),t.a)),r=new ar(lr(K0(t).a.Kc(),new z));zr(r);)n=u(Mr(r),79),_t(At((!n.b&&(n.b=new Cn(br,n,4,7)),n.b),0),186)||(o=Do(u(At((!n.c&&(n.c=new Cn(br,n,5,8)),n.c),0),82)),e.a._b(o)||(s.c[s.c.length]=o));return s}function Cvn(t){var e,n,r,s,o,h;for(o=new Hs,e=new E9((!t.a&&(t.a=new fe(rs,t,10,11)),t.a)),s=new ar(lr(K0(t).a.Kc(),new z));zr(s);)r=u(Mr(s),79),_t(At((!r.b&&(r.b=new Cn(br,r,4,7)),r.b),0),186)||(h=Do(u(At((!r.c&&(r.c=new Cn(br,r,5,8)),r.c),0),82)),e.a._b(h)||(n=o.a.zc(h,o),n==null));return o}function _vn(t,e,n,r,s){return r<0?(r=w4(t,s,lt(ct(Ae,1),ee,2,6,[Qat,Zat,Jat,tot,w6,eot,not,rot,iot,sot,aot,oot]),e),r<0&&(r=w4(t,s,lt(ct(Ae,1),ee,2,6,["Jan","Feb","Mar","Apr",w6,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),e)),r<0?!1:(n.k=r,!0)):r>0?(n.k=r-1,!0):!1}function Svn(t,e,n,r,s){return r<0?(r=w4(t,s,lt(ct(Ae,1),ee,2,6,[Qat,Zat,Jat,tot,w6,eot,not,rot,iot,sot,aot,oot]),e),r<0&&(r=w4(t,s,lt(ct(Ae,1),ee,2,6,["Jan","Feb","Mar","Apr",w6,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"]),e)),r<0?!1:(n.k=r,!0)):r>0?(n.k=r-1,!0):!1}function Avn(t,e,n,r,s,o){var h,d,v,k;if(d=32,r<0){if(e[0]>=t.length||(d=wa(t,e[0]),d!=43&&d!=45)||(++e[0],r=gq(t,e),r<0))return!1;d==45&&(r=-r)}return d==32&&e[0]-n==2&&s.b==2&&(v=new BR,k=v.q.getFullYear()-ab+ab-80,h=k%100,o.a=r==h,r+=(k/100|0)*100+(r=k&&(v=r);v&&(C=b.Math.max(C,v.a.o.a)),C>j&&(M=k,j=C)}return M}function Dvn(t,e,n){var r,s,o;if(t.e=n,t.d=0,t.b=0,t.f=1,t.i=e,(t.e&16)==16&&(t.i=wmn(t.i)),t.j=t.i.length,fi(t),o=cv(t),t.d!=t.j)throw it(new Nr(qr((Pr(),Zde))));if(t.g){for(r=0;rJ1e?Zs(v,t.b):r<=J1e&&r>tde?Zs(v,t.d):r<=tde&&r>ede?Zs(v,t.c):r<=ede&&Zs(v,t.a),o=yue(t,v,o);return s}function rb(){rb=Z;var t;for(eV=new Ng(1,1),Rut=new Ng(1,10),s7=new Ng(0,0),But=new Ng(-1,1),CEt=lt(ct(j4,1),ee,91,0,[s7,eV,new Ng(1,2),new Ng(1,3),new Ng(1,4),new Ng(1,5),new Ng(1,6),new Ng(1,7),new Ng(1,8),new Ng(1,9),Rut]),nV=Nt(j4,ee,91,32,0,1),t=0;t1,d&&(r=new $e(s,n.b),ri(e.a,r)),V9(e.a,lt(ct(Ws,1),ee,8,0,[j,M]))}function Cue(t){Mw(t,new k2(_w(Ew(Cw(Tw(new kg,AH),"ELK Randomizer"),'Distributes the nodes randomly on the plane, leading to very obfuscating layouts. Can be useful to demonstrate the power of "real" layout algorithms.'),new ZZ))),xe(t,AH,xv,FAt),xe(t,AH,Cy,15),xe(t,AH,tH,pe(0)),xe(t,AH,E6,GE)}function q5t(){q5t=Z;var t,e,n,r,s,o;for(dA=Nt(Gu,N4,25,255,15,1),yU=Nt(xh,yd,25,16,15,1),e=0;e<255;e++)dA[e]=-1;for(n=57;n>=48;n--)dA[n]=n-48<<24>>24;for(r=70;r>=65;r--)dA[r]=r-65+10<<24>>24;for(s=102;s>=97;s--)dA[s]=s-97+10<<24>>24;for(o=0;o<10;o++)yU[o]=48+o&ys;for(t=10;t<=15;t++)yU[t]=65+t-10&ys}function Tq(t,e,n){var r,s,o,h,d,v,k,C;return d=e.i-t.g/2,v=n.i-t.g/2,k=e.j-t.g/2,C=n.j-t.g/2,o=e.g+t.g/2,h=n.g+t.g/2,r=e.f+t.g/2,s=n.f+t.g/2,d>19)return"-"+_ue(rE(t));for(n=t,r="";!(n.l==0&&n.m==0&&n.h==0);){if(s=Vrt(Gq),n=yxt(n,s,!0),e=""+RHt(hb),!(n.l==0&&n.m==0&&n.h==0))for(o=9-e.length;o>0;o--)e="0"+e;r=e+r}return r}function Bvn(){if(!Object.create||!Object.getOwnPropertyNames)return!1;var t="__proto__",e=Object.create(null);if(e[t]!==void 0)return!1;var n=Object.getOwnPropertyNames(e);return!(n.length!=0||(e[t]=42,e[t]!==42)||Object.getOwnPropertyNames(e).length==0)}function Rvn(t){var e,n,r,s,o,h,d;for(e=!1,n=0,s=new S(t.d.b);s.a=t.a||!L4t(e,n))return-1;if(F8(u(r.Kb(e),20)))return 1;for(s=0,h=u(r.Kb(e),20).Kc();h.Ob();)if(o=u(h.Pb(),17),v=o.c.i==e?o.d.i:o.c.i,d=V5t(t,v,n,r),d==-1||(s=b.Math.max(s,d),s>t.c-1))return-1;return s+1}function Sue(t,e){var n,r,s,o,h,d;if(Vt(e)===Vt(t))return!0;if(!_t(e,15)||(r=u(e,15),d=t.gc(),r.gc()!=d))return!1;if(h=r.Kc(),t.ni()){for(n=0;n0){if(t.qj(),e!=null){for(o=0;o>24;case 97:case 98:case 99:case 100:case 101:case 102:return t-97+10<<24>>24;case 65:case 66:case 67:case 68:case 69:case 70:return t-65+10<<24>>24;default:throw it(new ld("Invalid hexadecimal"))}}function qvn(t,e,n){var r,s,o,h;for(vr(n,"Processor order nodes",2),t.a=Xt(ye(Q(e,(gv(),g_t)))),s=new Zi,h=ei(e.b,0);h.b!=h.d.c;)o=u(ti(h),86),je(Re(Q(o,(fc(),Xy))))&&fs(s,o,s.c.b,s.c);r=(Zn(s.b!=0),u(s.a.a.c,86)),Wle(t,r),!n.b&&pit(n,1),K5t(t,r,0-Xt(ye(Q(r,(fc(),IG))))/2,0),!n.b&&pit(n,1),or(n)}function Cq(){Cq=Z,i7t=new z3("SPIRAL",0),t7t=new z3("LINE_BY_LINE",1),e7t=new z3("MANHATTAN",2),JEt=new z3("JITTER",3),Vut=new z3("QUADRANTS_LINE_BY_LINE",4),r7t=new z3("QUADRANTS_MANHATTAN",5),n7t=new z3("QUADRANTS_JITTER",6),ZEt=new z3("COMBINE_LINE_BY_LINE_MANHATTAN",7),QEt=new z3("COMBINE_JITTER_MANHATTAN",8)}function Lue(t,e,n,r){var s,o,h,d,v,k;for(v=Ost(t,n),k=Ost(e,n),s=!1;v&&k&&(r||R1n(v,k,n));)h=Ost(v,n),d=Ost(k,n),kD(e),kD(t),o=v.c,Bat(v,!1),Bat(k,!1),n?(ly(e,k.p,o),e.p=k.p,ly(t,v.p+1,o),t.p=v.p):(ly(t,v.p,o),t.p=v.p,ly(e,k.p+1,o),e.p=k.p),Eo(v,null),Eo(k,null),v=h,k=d,s=!0;return s}function Hvn(t,e,n,r){var s,o,h,d,v;for(s=!1,o=!1,d=new S(r.j);d.a=e.length)throw it(new yo("Greedy SwitchDecider: Free layer not in graph."));this.c=e[t],this.e=new YM(r),mit(this.e,this.c,(ve(),Bn)),this.i=new YM(r),mit(this.i,this.c,Hn),this.f=new SKt(this.c),this.a=!o&&s.i&&!s.s&&this.c[0].k==(Vn(),ks),this.a&&apn(this,t,e.length)}function Due(t,e){var n,r,s,o,h,d;o=!t.B.Hc((ll(),cP)),h=t.B.Hc(Aft),t.a=new _ie(h,o,t.c),t.n&&Pvt(t.a.n,t.n),het(t.g,(Kf(),eu),t.a),e||(r=new a_(1,o,t.c),r.n.a=t.k,zx(t.p,(ve(),Pn),r),s=new a_(1,o,t.c),s.n.d=t.k,zx(t.p,mr,s),d=new a_(0,o,t.c),d.n.c=t.k,zx(t.p,Bn,d),n=new a_(0,o,t.c),n.n.b=t.k,zx(t.p,Hn,n))}function Gvn(t){var e,n,r;switch(e=u(Q(t.d,(Te(),eg)),218),e.g){case 2:n=xxn(t);break;case 3:n=(r=new he,ls(Ri(wu(Wo(Wo(new Tn(null,new _n(t.d.b,16)),new NX),new BX),new HT),new _X),new Utt(r)),r);break;default:throw it(new No("Compaction not supported for "+e+" edges."))}H3n(t,n),va(new Sm(t.g),new Vtt(t))}function Uvn(t,e){var n;return n=new ka,e&&Mo(n,u(tr(t.a,lP),94)),_t(e,470)&&Mo(n,u(tr(t.a,hP),94)),_t(e,354)?(Mo(n,u(tr(t.a,qo),94)),n):(_t(e,82)&&Mo(n,u(tr(t.a,br),94)),_t(e,239)?(Mo(n,u(tr(t.a,rs),94)),n):_t(e,186)?(Mo(n,u(tr(t.a,gl),94)),n):(_t(e,352)&&Mo(n,u(tr(t.a,Ys),94)),n))}function Jf(){Jf=Z,c7=new eo((ui(),ZG),pe(1)),bV=new eo(W2,80),kbe=new eo(fAt,5),dbe=new eo(W6,GE),ybe=new eo(Eft,pe(1)),xbe=new eo(Tft,(Nn(),!0)),x7t=new Ow(50),vbe=new eo(U2,x7t),v7t=KG,k7t=KS,gbe=new eo(gft,!1),y7t=tP,wbe=xb,bbe=G2,pbe=o5,mbe=Qy,m7t=(q4t(),abe),nlt=lbe,pV=sbe,elt=obe,E7t=ube}function Wvn(t){var e,n,r,s,o,h,d,v;for(v=new OJt,d=new S(t.a);d.a0&&e=0)return!1;if(e.p=n.b,le(n.e,e),s==(Vn(),ta)||s==Hc){for(h=new S(e.j);h.a1||h==-1)&&(o|=16),s.Bb&dc&&(o|=64)),n.Bb&Ka&&(o|=Dy),o|=xf):_t(e,457)?o|=512:(r=e.Bj(),r&&r.i&1&&(o|=256)),t.Bb&512&&(o|=128),o}function y_(t,e){var n,r,s,o,h;for(t=t==null?_u:(On(t),t),s=0;st.d[d.p]&&(n+=fmt(t.b,o),Up(t.a,pe(o)))):++h;for(n+=t.b.d*h;!BC(t.a);)Hmt(t.b,u(Hx(t.a),19).a)}return n}function nmn(t,e){var n;return t.f==$ft?(n=Hw(To(($u(),ya),e)),t.e?n==4&&e!=(d6(),tk)&&e!=(d6(),J6)&&e!=(d6(),zft)&&e!=(d6(),qft):n==2):t.d&&(t.d.Hc(e)||t.d.Hc(Kx(To(($u(),ya),e)))||t.d.Hc(C4(($u(),ya),t.b,e)))?!0:t.f&&O5t(($u(),t.f),rD(To(ya,e)))?(n=Hw(To(ya,e)),t.e?n==4:n==2):!1}function rmn(t,e,n,r){var s,o,h,d,v,k,C,M;return h=u(qe(n,(ui(),Y6)),8),v=h.a,C=h.b+t,s=b.Math.atan2(C,v),s<0&&(s+=O4),s+=e,s>O4&&(s-=O4),d=u(qe(r,Y6),8),k=d.a,M=d.b+t,o=b.Math.atan2(M,k),o<0&&(o+=O4),o+=e,o>O4&&(o-=O4),k1(),wf(1e-10),b.Math.abs(s-o)<=1e-10||s==o||isNaN(s)&&isNaN(o)?0:so?1:Iw(isNaN(s),isNaN(o))}function gat(t){var e,n,r,s,o,h,d;for(d=new _r,r=new S(t.a.b);r.a=t.o)throw it(new Opt);d=e>>5,h=e&31,o=F0(1,Ar(F0(h,1))),s?t.n[n][d]=S1(t.n[n][d],o):t.n[n][d]=Ns(t.n[n][d],Rwt(o)),o=F0(o,1),r?t.n[n][d]=S1(t.n[n][d],o):t.n[n][d]=Ns(t.n[n][d],Rwt(o))}catch(v){throw v=Wi(v),_t(v,320)?it(new yo(Fot+t.o+"*"+t.p+Not+e+Ya+n+Bot)):it(v)}}function K5t(t,e,n,r){var s,o,h;e&&(o=Xt(ye(Q(e,(fc(),np))))+r,h=n+Xt(ye(Q(e,IG)))/2,Jt(e,$ht,pe(Ar(Tu(b.Math.round(o))))),Jt(e,o_t,pe(Ar(Tu(b.Math.round(h))))),e.d.b==0||K5t(t,u(xj((s=ei(new Lp(e).a.d,0),new Ex(s))),86),n+Xt(ye(Q(e,IG)))+t.a,r+Xt(ye(Q(e,M7)))),Q(e,jht)!=null&&K5t(t,u(Q(e,jht),86),n,r))}function smn(t,e){var n,r,s,o,h,d,v,k,C,M,j;for(v=Na(e.a),s=Xt(ye(Q(v,(Te(),q2))))*2,C=Xt(ye(Q(v,t5))),k=b.Math.max(s,C),o=Nt(aa,vo,25,e.f-e.c+1,15,1),r=-k,n=0,d=e.b.Kc();d.Ob();)h=u(d.Pb(),10),r+=t.a[h.c.p]+k,o[n++]=r;for(r+=t.a[e.a.c.p]+k,o[n++]=r,j=new S(e.e);j.a0&&(r=(!t.n&&(t.n=new fe(qo,t,1,7)),u(At(t.n,0),137)).a,!r||Gr(Gr((e.a+=' "',e),r),'"'))),Gr(Aw(Gr(Aw(Gr(Aw(Gr(Aw((e.a+=" (",e),t.i),","),t.j)," | "),t.g),","),t.f),")"),e.a)}function zue(t){var e,n,r;return t.Db&64?Vst(t):(e=new Ol(y8t),n=t.k,n?Gr(Gr((e.a+=' "',e),n),'"'):(!t.n&&(t.n=new fe(qo,t,1,7)),t.n.i>0&&(r=(!t.n&&(t.n=new fe(qo,t,1,7)),u(At(t.n,0),137)).a,!r||Gr(Gr((e.a+=' "',e),r),'"'))),Gr(Aw(Gr(Aw(Gr(Aw(Gr(Aw((e.a+=" (",e),t.i),","),t.j)," | "),t.g),","),t.f),")"),e.a)}function bat(t,e){var n,r,s,o,h,d,v;if(e==null||e.length==0)return null;if(s=u(Nc(t.a,e),149),!s){for(r=(d=new v1(t.b).a.vc().Kc(),new m1(d));r.a.Ob();)if(n=(o=u(r.a.Pb(),42),u(o.dd(),149)),h=n.c,v=e.length,hn(h.substr(h.length-v,v),e)&&(e.length==h.length||wa(h,h.length-e.length-1)==46)){if(s)return null;s=n}s&&ko(t.a,e,s)}return s}function cmn(t,e){var n,r,s,o;return n=new eh,r=u(Bl(wu(new Tn(null,new _n(t.f,16)),n),Zm(new on,new ni,new di,new Ee,lt(ct(fl,1),oe,132,0,[(O1(),Iy),Ul]))),21),s=r.gc(),r=u(Bl(wu(new Tn(null,new _n(e.f,16)),n),Zm(new on,new ni,new di,new Ee,lt(ct(fl,1),oe,132,0,[Iy,Ul]))),21),o=r.gc(),ss.p?(Bs(o,mr),o.d&&(d=o.o.b,e=o.a.b,o.a.b=d-e)):o.j==mr&&s.p>t.p&&(Bs(o,Pn),o.d&&(d=o.o.b,e=o.a.b,o.a.b=-(d-e)));break}return s}function lmn(t,e,n,r){var s,o,h,d,v,k,C,M,j,H,G;if(o=n,n1,d&&(r=new $e(s,n.b),ri(e.a,r)),V9(e.a,lt(ct(Ws,1),ee,8,0,[j,M]))}function wat(t,e,n){var r,s,o,h,d,v;if(e)if(n<=-1){if(r=yn(e.Tg(),-1-n),_t(r,99))return u(r,18);for(h=u(e.ah(r),153),d=0,v=h.gc();d0){for(s=v.length;s>0&&v[s-1]=="";)--s;s=40,h&&xyn(t),C3n(t),ivn(t),n=fie(t),r=0;n&&r0&&ri(t.f,o)):(t.c[h]-=k+1,t.c[h]<=0&&t.a[h]>0&&ri(t.e,o))))}function Nmn(t){var e,n,r,s,o,h,d,v,k;for(d=new Op(u(Lr(new jd),62)),k=Cs,n=new S(t.d);n.a=0&&vn?e:n;k<=M;++k)k==n?d=r++:(o=s[k],C=G.rl(o.ak()),k==e&&(v=k==M&&!C?r-1:r),C&&++r);return j=u(r_(t,e,n),72),d!=v&&n8(t,new mD(t.e,7,h,pe(d),H.dd(),v)),j}}else return u(Jst(t,e,n),72);return u(r_(t,e,n),72)}function $mn(t,e){var n,r,s,o,h,d,v;for(vr(e,"Port order processing",1),v=u(Q(t,(Te(),v9t)),421),r=new S(t.b);r.a=0&&(d=H1n(t,h),!(d&&(k<22?v.l|=1<>>1,h.m=C>>>1|(M&1)<<21,h.l=j>>>1|(C&1)<<21,--k;return n&&Ait(v),o&&(r?(hb=rE(t),s&&(hb=tre(hb,(q8(),aEt)))):hb=iu(t.l,t.m,t.h)),v}function Hmn(t,e){var n,r,s,o,h,d,v,k,C,M;for(k=t.e[e.c.p][e.p]+1,v=e.c.a.c.length+1,d=new S(t.a);d.a0&&(Rr(0,t.length),t.charCodeAt(0)==45||(Rr(0,t.length),t.charCodeAt(0)==43))?1:0,r=h;rn)throw it(new ld(yv+t+'"'));return d}function Vmn(t){var e,n,r,s,o,h,d;for(h=new Zi,o=new S(t.a);o.a1)&&e==1&&u(t.a[t.b],10).k==(Vn(),Ll)?p6(u(t.a[t.b],10),(zl(),f0)):r&&(!n||(t.c-t.b&t.a.length-1)>1)&&e==1&&u(t.a[t.c-1&t.a.length-1],10).k==(Vn(),Ll)?p6(u(t.a[t.c-1&t.a.length-1],10),(zl(),kb)):(t.c-t.b&t.a.length-1)==2?(p6(u(Q9(t),10),(zl(),f0)),p6(u(Q9(t),10),kb)):R2n(t,s),lmt(t)}function Wmn(t,e,n){var r,s,o,h,d;for(o=0,s=new nr((!t.a&&(t.a=new fe(rs,t,10,11)),t.a));s.e!=s.i.gc();)r=u(dr(s),33),h="",(!r.n&&(r.n=new fe(qo,r,1,7)),r.n).i==0||(h=u(At((!r.n&&(r.n=new fe(qo,r,1,7)),r.n),0),137).a),d=new Dit(o++,e,h),Mo(d,r),Jt(d,(fc(),qS),r),d.e.b=r.j+r.f/2,d.f.a=b.Math.max(r.g,1),d.e.a=r.i+r.g/2,d.f.b=b.Math.max(r.f,1),ri(e.b,d),au(n.f,r,d)}function Ymn(t){var e,n,r,s,o;r=u(Q(t,(ae(),_i)),33),o=u(qe(r,(Te(),$2)),174).Hc((Al(),K2)),t.e||(s=u(Q(t,Vc),21),e=new $e(t.f.a+t.d.b+t.d.c,t.f.b+t.d.d+t.d.a),s.Hc((oo(),vh))?(wo(r,cs,(ua(),Gc)),wv(r,e.a,e.b,!1,!0)):je(Re(qe(r,uht)))||wv(r,e.a,e.b,!0,!0)),o?wo(r,$2,un(K2)):wo(r,$2,(n=u(Vf(rA),9),new sh(n,u(ff(n,n.length),9),0)))}function rxt(t,e,n){var r,s,o,h;if(e[0]>=t.length)return n.o=0,!0;switch(wa(t,e[0])){case 43:s=1;break;case 45:s=-1;break;default:return n.o=0,!0}if(++e[0],o=e[0],h=gq(t,e),h==0&&e[0]==o)return!1;if(e[0]=0&&d!=n&&(o=new Js(t,1,d,h,null),r?r.Ei(o):r=o),n>=0&&(o=new Js(t,1,n,d==n?h:null,e),r?r.Ei(o):r=o)),r}function sle(t){var e,n,r;if(t.b==null){if(r=new Ag,t.i!=null&&(go(r,t.i),r.a+=":"),t.f&256){for(t.f&256&&t.a!=null&&(lrn(t.i)||(r.a+="//"),go(r,t.a)),t.d!=null&&(r.a+="/",go(r,t.d)),t.f&16&&(r.a+="/"),e=0,n=t.j.length;ej?!1:(M=(v=__(r,j,!1),v.a),C+d+M<=e.b&&(vD(n,o-n.s),n.c=!0,vD(r,o-n.s),tI(r,n.s,n.t+n.d+d),r.k=!0,pyt(n.q,r),H=!0,s&&(az(e,r),r.j=e,t.c.length>h&&(sI((An(h,t.c.length),u(t.c[h],200)),r),(An(h,t.c.length),u(t.c[h],200)).a.c.length==0&&Fg(t,h)))),H)}function nyn(t,e){var n,r,s,o,h,d;if(vr(e,"Partition midprocessing",1),s=new Uw,ls(Ri(new Tn(null,new _n(t.a,16)),new KK),new mw(s)),s.d!=0){for(d=u(Bl(ZQt((o=s.i,new Tn(null,(o||(s.i=new K3(s,s.c))).Nc()))),c2(new ke,new ce,new Xn,lt(ct(fl,1),oe,132,0,[(O1(),Ul)]))),15),r=d.Kc(),n=u(r.Pb(),19);r.Ob();)h=u(r.Pb(),19),swn(u(Ai(s,n),21),u(Ai(s,h),21)),n=h;or(e)}}function cle(t,e,n){var r,s,o,h,d,v,k,C;if(e.p==0){for(e.p=1,h=n,h||(s=new he,o=(r=u(Vf(Xa),9),new sh(r,u(ff(r,r.length),9),0)),h=new fa(s,o)),u(h.a,15).Fc(e),e.k==(Vn(),ks)&&u(h.b,21).Fc(u(Q(e,(ae(),oc)),61)),v=new S(e.j);v.a0){if(s=u(t.Ab.g,1934),e==null){for(o=0;o1)for(r=new S(s);r.an.s&&dd&&(d=s,C.c=Nt(Qn,De,1,0,5,1)),s==d&&le(C,new fa(n.c.i,n)));wn(),Zs(C,t.c),Hm(t.b,v.p,C)}}function cyn(t,e){var n,r,s,o,h,d,v,k,C;for(h=new S(e.b);h.ad&&(d=s,C.c=Nt(Qn,De,1,0,5,1)),s==d&&le(C,new fa(n.d.i,n)));wn(),Zs(C,t.c),Hm(t.f,v.p,C)}}function lle(t){Mw(t,new k2(_w(Ew(Cw(Tw(new kg,Tv),"ELK Box"),"Algorithm for packing of unconnected boxes, i.e. graphs without edges."),new qZ))),xe(t,Tv,xv,PSt),xe(t,Tv,Cy,15),xe(t,Tv,VI,pe(0)),xe(t,Tv,CH,Ie(DSt)),xe(t,Tv,D4,Ie(e4e)),xe(t,Tv,T6,Ie(n4e)),xe(t,Tv,E6,cde),xe(t,Tv,GI,Ie(ISt)),xe(t,Tv,C6,Ie(OSt)),xe(t,Tv,g8t,Ie(lft)),xe(t,Tv,mH,Ie(t4e))}function hle(t,e){var n,r,s,o,h,d,v,k,C;if(s=t.i,h=s.o.a,o=s.o.b,h<=0&&o<=0)return ve(),Zo;switch(k=t.n.a,C=t.n.b,d=t.o.a,n=t.o.b,e.g){case 2:case 1:if(k<0)return ve(),Bn;if(k+d>h)return ve(),Hn;break;case 4:case 3:if(C<0)return ve(),Pn;if(C+n>o)return ve(),mr}return v=(k+d/2)/h,r=(C+n/2)/o,v+r<=1&&v-r<=0?(ve(),Bn):v+r>=1&&v-r>=0?(ve(),Hn):r<.5?(ve(),Pn):(ve(),mr)}function uyn(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K;for(n=!1,C=Xt(ye(Q(e,(Te(),$v)))),G=sb*C,s=new S(e.b);s.av+G&&(K=M.g+j.g,j.a=(j.g*j.a+M.g*M.a)/K,j.g=K,M.f=j,n=!0)),o=d,M=j;return n}function fle(t,e,n,r,s,o,h){var d,v,k,C,M,j;for(j=new Fx,k=e.Kc();k.Ob();)for(d=u(k.Pb(),839),M=new S(d.wf());M.a0?d.a?(k=d.b.rf().b,s>k&&(t.v||d.c.d.c.length==1?(h=(s-k)/2,d.d.d=h,d.d.a=h):(n=u(Ne(d.c.d,0),181).rf().b,r=(n-k)/2,d.d.d=b.Math.max(0,r),d.d.a=s-r-k))):d.d.a=t.t+s:S9(t.u)&&(o=I4t(d.b),o.d<0&&(d.d.d=-o.d),o.d+o.a>d.b.rf().b&&(d.d.a=o.d+o.a-d.b.rf().b))}function fyn(t,e){var n;switch(_D(t)){case 6:return ra(e);case 7:return Bm(e);case 8:return Nm(e);case 3:return Array.isArray(e)&&(n=_D(e),!(n>=14&&n<=16));case 11:return e!=null&&typeof e===Gat;case 12:return e!=null&&(typeof e===MI||typeof e==Gat);case 0:return gst(e,t.__elementTypeId$);case 2:return Znt(e)&&e.im!==Et;case 1:return Znt(e)&&e.im!==Et||gst(e,t.__elementTypeId$);default:return!0}}function dle(t,e){var n,r,s,o;return r=b.Math.min(b.Math.abs(t.c-(e.c+e.b)),b.Math.abs(t.c+t.b-e.c)),o=b.Math.min(b.Math.abs(t.d-(e.d+e.a)),b.Math.abs(t.d+t.a-e.d)),n=b.Math.abs(t.c+t.b/2-(e.c+e.b/2)),n>t.b/2+e.b/2||(s=b.Math.abs(t.d+t.a/2-(e.d+e.a/2)),s>t.a/2+e.a/2)?1:n==0&&s==0?0:n==0?o/s+1:s==0?r/n+1:b.Math.min(r/n,o/s)+1}function gle(t,e){var n,r,s,o,h,d;return s=Jmt(t),d=Jmt(e),s==d?t.e==e.e&&t.a<54&&e.a<54?t.fe.f?1:0:(r=t.e-e.e,n=(t.d>0?t.d:b.Math.floor((t.a-1)*Cfe)+1)-(e.d>0?e.d:b.Math.floor((e.a-1)*Cfe)+1),n>r+1?s:n0&&(h=e4(h,Nle(r))),Uie(o,h))):s0&&t.d!=(q9(),slt)&&(d+=h*(r.d.a+t.a[e.b][r.b]*(e.d.a-r.d.a)/n)),n>0&&t.d!=(q9(),rlt)&&(v+=h*(r.d.b+t.a[e.b][r.b]*(e.d.b-r.d.b)/n)));switch(t.d.g){case 1:return new $e(d/o,e.d.b);case 2:return new $e(e.d.a,v/o);default:return new $e(d/o,v/o)}}function ple(t,e){oE();var n,r,s,o,h;if(h=u(Q(t.i,(Te(),cs)),98),o=t.j.g-e.j.g,o!=0||!(h==(ua(),Y2)||h==g0||h==Gc))return 0;if(h==(ua(),Y2)&&(n=u(Q(t,tp),19),r=u(Q(e,tp),19),n&&r&&(s=n.a-r.a,s!=0)))return s;switch(t.j.g){case 1:return Ms(t.n.a,e.n.a);case 2:return Ms(t.n.b,e.n.b);case 3:return Ms(e.n.a,t.n.a);case 4:return Ms(e.n.b,t.n.b);default:throw it(new No(E6t))}}function ble(t){var e,n,r,s,o,h;for(n=(!t.a&&(t.a=new As(Gh,t,5)),t.a).i+2,h=new Xc(n),le(h,new $e(t.j,t.k)),ls(new Tn(null,(!t.a&&(t.a=new As(Gh,t,5)),new _n(t.a,16))),new lzt(h)),le(h,new $e(t.b,t.c)),e=1;e0&&($D(v,!1,(ao(),zh)),$D(v,!0,Cf)),xu(e.g,new oGt(t,n)),ki(t.g,e,n)}function vle(){vle=Z;var t;for(gEt=lt(ct(Cr,1),Xr,25,15,[-1,-1,30,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5]),Fut=Nt(Cr,Xr,25,37,15,1),$ge=lt(ct(Cr,1),Xr,25,15,[-1,-1,63,40,32,28,25,23,21,20,19,19,18,18,17,17,16,16,16,15,15,15,15,14,14,14,14,14,14,13,13,13,13,13,13,13,13]),pEt=Nt(Ob,wot,25,37,14,1),t=2;t<=36;t++)Fut[t]=ps(b.Math.pow(t,gEt[t])),pEt[t]=aI(qq,Fut[t])}function gyn(t){var e;if((!t.a&&(t.a=new fe(Ji,t,6,6)),t.a).i!=1)throw it(new Fn(Sde+(!t.a&&(t.a=new fe(Ji,t,6,6)),t.a).i));return e=new Pu,RD(u(At((!t.b&&(t.b=new Cn(br,t,4,7)),t.b),0),82))&&Ua(e,tfe(t,RD(u(At((!t.b&&(t.b=new Cn(br,t,4,7)),t.b),0),82)),!1)),RD(u(At((!t.c&&(t.c=new Cn(br,t,5,8)),t.c),0),82))&&Ua(e,tfe(t,RD(u(At((!t.c&&(t.c=new Cn(br,t,5,8)),t.c),0),82)),!0)),e}function mle(t,e){var n,r,s,o,h;for(e.d?s=t.a.c==(bd(),zv)?jo(e.b):Ds(e.b):s=t.a.c==(bd(),ep)?jo(e.b):Ds(e.b),o=!1,r=new ar(lr(s.a.Kc(),new z));zr(r);)if(n=u(Mr(r),17),h=je(t.a.f[t.a.g[e.b.p].p]),!(!h&&!Ga(n)&&n.c.i.c==n.d.i.c)&&!(je(t.a.n[t.a.g[e.b.p].p])||je(t.a.n[t.a.g[e.b.p].p]))&&(o=!0,I0(t.b,t.a.g[T1n(n,e.b).p])))return e.c=!0,e.a=n,e;return e.c=o,e.a=null,e}function pyn(t,e,n,r,s){var o,h,d,v,k,C,M;for(wn(),Zs(t,new XZ),d=new da(t,0),M=new he,o=0;d.bo*2?(C=new rz(M),k=Ru(h)/El(h),v=zat(C,e,new Cx,n,r,s,k),Li(Gf(C.e),v),M.c=Nt(Qn,De,1,0,5,1),o=0,M.c[M.c.length]=C,M.c[M.c.length]=h,o=Ru(C)*El(C)+Ru(h)*El(h)):(M.c[M.c.length]=h,o+=Ru(h)*El(h));return M}function sxt(t,e,n){var r,s,o,h,d,v,k;if(r=n.gc(),r==0)return!1;if(t.ej())if(v=t.fj(),y3t(t,e,n),h=r==1?t.Zi(3,null,n.Kc().Pb(),e,v):t.Zi(5,null,n,e,v),t.bj()){for(d=r<100?null:new Dp(r),o=e+r,s=e;s0){for(h=0;h>16==-15&&t.Cb.nh()&&rit(new Jrt(t.Cb,9,13,n,t.c,Hg(al(u(t.Cb,59)),t))):_t(t.Cb,88)&&t.Db>>16==-23&&t.Cb.nh()&&(e=t.c,_t(e,88)||(e=(dn(),Kh)),_t(n,88)||(n=(dn(),Kh)),rit(new Jrt(t.Cb,9,10,n,e,Hg(Lc(u(t.Cb,26)),t)))))),t.c}function byn(t,e){var n,r,s,o,h,d,v,k,C,M;for(vr(e,"Hypernodes processing",1),s=new S(t.b);s.an);return s}function xle(t,e){var n,r,s;r=ul(t.d,1)!=0,!je(Re(Q(e.j,(ae(),Ov))))&&!je(Re(Q(e.j,X4)))||Vt(Q(e.j,(Te(),wb)))===Vt((V0(),vb))?e.c.Tf(e.e,r):r=je(Re(Q(e.j,Ov))),yI(t,e,r,!0),je(Re(Q(e.j,X4)))&&Jt(e.j,X4,(Nn(),!1)),je(Re(Q(e.j,Ov)))&&(Jt(e.j,Ov,(Nn(),!1)),Jt(e.j,X4,!0)),n=Kst(t,e);do{if(hyt(t),n==0)return 0;r=!r,s=n,yI(t,e,r,!1),n=Kst(t,e)}while(s>n);return s}function kle(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G;if(e==n)return!0;if(e=p5t(t,e),n=p5t(t,n),r=xst(e),r){if(C=xst(n),C!=r)return C?(v=r.Dj(),G=C.Dj(),v==G&&v!=null):!1;if(h=(!e.d&&(e.d=new As(ho,e,1)),e.d),o=h.i,j=(!n.d&&(n.d=new As(ho,n,1)),n.d),o==j.i){for(k=0;k0,d=Bz(e,o),N2t(n?d.b:d.g,e),u4(d).c.length==1&&fs(r,d,r.c.b,r.c),s=new fa(o,e),Up(t.o,s),mu(t.e.a,o))}function _le(t,e){var n,r,s,o,h,d,v;return r=b.Math.abs(e$(t.b).a-e$(e.b).a),d=b.Math.abs(e$(t.b).b-e$(e.b).b),s=0,v=0,n=1,h=1,r>t.b.b/2+e.b.b/2&&(s=b.Math.min(b.Math.abs(t.b.c-(e.b.c+e.b.b)),b.Math.abs(t.b.c+t.b.b-e.b.c)),n=1-s/r),d>t.b.a/2+e.b.a/2&&(v=b.Math.min(b.Math.abs(t.b.d-(e.b.d+e.b.a)),b.Math.abs(t.b.d+t.b.a-e.b.d)),h=1-v/d),o=b.Math.min(n,h),(1-o)*b.Math.sqrt(r*r+d*d)}function kyn(t){var e,n,r,s;for($at(t,t.e,t.f,(Gw(),yb),!0,t.c,t.i),$at(t,t.e,t.f,yb,!1,t.c,t.i),$at(t,t.e,t.f,r5,!0,t.c,t.i),$at(t,t.e,t.f,r5,!1,t.c,t.i),Tyn(t,t.c,t.e,t.f,t.i),r=new da(t.i,0);r.b=65;n--)Y1[n]=n-65<<24>>24;for(r=122;r>=97;r--)Y1[r]=r-97+26<<24>>24;for(s=57;s>=48;s--)Y1[s]=s-48+52<<24>>24;for(Y1[43]=62,Y1[47]=63,o=0;o<=25;o++)lp[o]=65+o&ys;for(h=26,v=0;h<=51;++h,v++)lp[h]=97+v&ys;for(t=52,d=0;t<=61;++t,d++)lp[t]=48+d&ys;lp[62]=43,lp[63]=47}function Eyn(t,e){var n,r,s,o,h,d,v,k,C,M,j,H;if(t.dc())return new Ca;for(k=0,M=0,s=t.Kc();s.Ob();)r=u(s.Pb(),37),o=r.f,k=b.Math.max(k,o.a),M+=o.a*o.b;for(k=b.Math.max(k,b.Math.sqrt(M)*Xt(ye(Q(u(t.Kc().Pb(),37),(Te(),rG))))),j=0,H=0,v=0,n=e,d=t.Kc();d.Ob();)h=u(d.Pb(),37),C=h.f,j+C.a>k&&(j=0,H+=v+e,v=0),x_(h,j,H),n=b.Math.max(n,j+C.a),v=b.Math.max(v,C.b),j+=C.a+e;return new $e(n+e,H+v+e)}function Tyn(t,e,n,r,s){var o,h,d,v,k,C,M;for(h=new S(e);h.ao)return ve(),Hn;break;case 4:case 3:if(v<0)return ve(),Pn;if(v+t.f>s)return ve(),mr}return h=(d+t.g/2)/o,n=(v+t.f/2)/s,h+n<=1&&h-n<=0?(ve(),Bn):h+n>=1&&h-n>=0?(ve(),Hn):n<.5?(ve(),Pn):(ve(),mr)}function Cyn(t,e,n,r,s){var o,h;if(o=Pa(Ns(e[0],co),Ns(r[0],co)),t[0]=Ar(o),o=$p(o,32),n>=s){for(h=1;h0&&(s.b[h++]=0,s.b[h++]=o.b[0]-1),e=1;e0&&(oM(v,v.d-s.d),s.c==(Uf(),mb)&&bpt(v,v.a-s.d),v.d<=0&&v.i>0&&fs(e,v,e.c.b,e.c)));for(o=new S(t.f);o.a0&&(TC(d,d.i-s.d),s.c==(Uf(),mb)&&ww(d,d.b-s.d),d.i<=0&&d.d>0&&fs(n,d,n.c.b,n.c)))}function _yn(t,e,n){var r,s,o,h,d,v,k,C;for(vr(n,"Processor compute fanout",1),Xu(t.b),Xu(t.a),d=null,o=ei(e.b,0);!d&&o.b!=o.d.c;)k=u(ti(o),86),je(Re(Q(k,(fc(),Xy))))&&(d=k);for(v=new Zi,fs(v,d,v.c.b,v.c),Bhe(t,v),C=ei(e.b,0);C.b!=C.d.c;)k=u(ti(C),86),h=Br(Q(k,(fc(),zS))),s=Nc(t.b,h)!=null?u(Nc(t.b,h),19).a:0,Jt(k,MG,pe(s)),r=1+(Nc(t.a,h)!=null?u(Nc(t.a,h),19).a:0),Jt(k,pye,pe(r));or(n)}function Syn(t,e,n,r,s){var o,h,d,v,k,C,M,j,H,G;for(j=l0n(t,n),v=0;v0),r.a.Xb(r.c=--r.b),M>j+v&&Cl(r);for(h=new S(H);h.a0),r.a.Xb(r.c=--r.b)}}function Ayn(){gi();var t,e,n,r,s,o;if(Vft)return Vft;for(t=new Nl(4),yy(t,ib(kut,!0)),L_(t,ib("M",!0)),L_(t,ib("C",!0)),o=new Nl(4),r=0;r<11;r++)jc(o,r,r);return e=new Nl(4),yy(e,ib("M",!0)),jc(e,4448,4607),jc(e,65438,65439),s=new d9(2),E2(s,t),E2(s,pA),n=new d9(2),n.$l(Yj(o,ib("L",!0))),n.$l(e),n=new Xm(3,n),n=new mvt(s,n),Vft=n,Vft}function Lyn(t){var e,n;if(e=Br(qe(t,(ui(),YS))),!qne(e,t)&&!o2(t,O7)&&((!t.a&&(t.a=new fe(rs,t,10,11)),t.a).i!=0||je(Re(qe(t,ZO)))))if(e==null||fy(e).length==0){if(!qne(Gn,t))throw n=Gr(Gr(new Ol("Unable to load default layout algorithm "),Gn)," for unconfigured node "),Nq(t,n),it(new R3(n.a))}else throw n=Gr(Gr(new Ol("Layout algorithm '"),e),"' not found for "),Nq(t,n),it(new R3(n.a))}function Eat(t){var e,n,r,s,o,h,d,v,k,C,M,j,H;if(n=t.i,e=t.n,t.b==0)for(H=n.c+e.b,j=n.b-e.b-e.c,h=t.a,v=0,C=h.length;v0&&(M-=r[0]+t.c,r[0]+=t.c),r[2]>0&&(M-=r[2]+t.c),r[1]=b.Math.max(r[1],M),Xj(t.a[1],n.c+e.b+r[0]-(r[1]-M)/2,r[1]);for(o=t.a,d=0,k=o.length;d0?(t.n.c.length-1)*t.i:0,r=new S(t.n);r.a1)for(r=ei(s,0);r.b!=r.d.c;)for(n=u(ti(r),231),o=0,v=new S(n.e);v.a0&&(e[0]+=t.c,M-=e[0]),e[2]>0&&(M-=e[2]+t.c),e[1]=b.Math.max(e[1],M),Qj(t.a[1],r.d+n.d+e[0]-(e[1]-M)/2,e[1]);else for(G=r.d+n.d,H=r.a-n.d-n.a,h=t.a,v=0,C=h.length;v=0&&o!=n))throw it(new Fn(eO));for(s=0,v=0;v0||av(s.b.d,t.b.d+t.b.a)==0&&r.b<0||av(s.b.d+s.b.a,t.b.d)==0&&r.b>0){d=0;break}}else d=b.Math.min(d,Moe(t,s,r));d=b.Math.min(d,Mle(t,o,d,r))}return d}function CI(t,e){var n,r,s,o,h,d,v;if(t.b<2)throw it(new Fn("The vector chain must contain at least a source and a target point."));for(s=(Zn(t.b!=0),u(t.a.a.c,8)),vj(e,s.a,s.b),v=new Nx((!e.a&&(e.a=new As(Gh,e,5)),e.a)),h=ei(t,1);h.aXt(E1(h.g,h.d[0]).a)?(Zn(v.b>0),v.a.Xb(v.c=--v.b),zm(v,h),s=!0):d.e&&d.e.gc()>0&&(o=(!d.e&&(d.e=new he),d.e).Mc(e),k=(!d.e&&(d.e=new he),d.e).Mc(n),(o||k)&&((!d.e&&(d.e=new he),d.e).Fc(h),++h.c));s||(r.c[r.c.length]=h)}function Ole(t){var e,n,r;if(G3(u(Q(t,(Te(),cs)),98)))for(n=new S(t.j);n.a>>0,"0"+e.toString(16)),r="\\x"+Pl(n,n.length-2,n.length)):t>=Ka?(n=(e=t>>>0,"0"+e.toString(16)),r="\\v"+Pl(n,n.length-6,n.length)):r=""+String.fromCharCode(t&ys)}return r}function Cat(t,e){var n,r,s,o,h,d,v,k,C,M;if(h=t.e,v=e.e,v==0)return t;if(h==0)return e.e==0?e:new X3(-e.e,e.d,e.a);if(o=t.d,d=e.d,o+d==2)return n=Ns(t.a[0],co),r=Ns(e.a[0],co),h<0&&(n=z8(n)),v<0&&(r=z8(r)),JD(Jp(n,r));if(s=o!=d?o>d?1:-1:qyt(t.a,e.a,o),s==-1)M=-v,C=h==v?Wrt(e.a,d,t.a,o):Krt(e.a,d,t.a,o);else if(M=h,h==v){if(s==0)return rb(),s7;C=Wrt(t.a,o,e.a,d)}else C=Krt(t.a,o,e.a,d);return k=new X3(M,C.length,C),N9(k),k}function fxt(t){var e,n,r,s,o,h;for(this.e=new he,this.a=new he,n=t.b-1;n<3;n++)m8(t,0,u(Zf(t,0),8));if(t.b<4)throw it(new Fn("At (least dimension + 1) control points are necessary!"));for(this.b=3,this.d=!0,this.c=!1,x2n(this,t.b+this.b-1),h=new he,o=new S(this.e),e=0;e=e.o&&n.f<=e.f||e.a*.5<=n.f&&e.a*1.5>=n.f){if(h=u(Ne(e.n,e.n.c.length-1),211),h.e+h.d+n.g+s<=r&&(o=u(Ne(e.n,e.n.c.length-1),211),o.f-t.f+n.f<=t.b||t.a.c.length==1))return h3t(e,n),!0;if(e.s+n.g<=r&&(e.t+e.d+n.f+s<=t.b||t.a.c.length==1))return le(e.b,n),d=u(Ne(e.n,e.n.c.length-1),211),le(e.n,new E$(e.s,d.f+d.a+e.i,e.i)),W3t(u(Ne(e.n,e.n.c.length-1),211),n),Sle(e,n),!0}return!1}function Fle(t,e,n){var r,s,o,h;return t.ej()?(s=null,o=t.fj(),r=t.Zi(1,h=sit(t,e,n),n,e,o),t.bj()&&!(t.ni()&&h!=null?yi(h,n):Vt(h)===Vt(n))?(h!=null&&(s=t.dj(h,s)),s=t.cj(n,s),t.ij()&&(s=t.lj(h,n,s)),s?(s.Ei(r),s.Fi()):t.$i(r)):(t.ij()&&(s=t.lj(h,n,s)),s?(s.Ei(r),s.Fi()):t.$i(r)),h):(h=sit(t,e,n),t.bj()&&!(t.ni()&&h!=null?yi(h,n):Vt(h)===Vt(n))&&(s=null,h!=null&&(s=t.dj(h,null)),s=t.cj(n,s),s&&s.Fi()),h)}function E_(t,e){var n,r,s,o,h,d,v,k;e%=24,t.q.getHours()!=e&&(r=new b.Date(t.q.getTime()),r.setDate(r.getDate()+1),d=t.q.getTimezoneOffset()-r.getTimezoneOffset(),d>0&&(v=d/60|0,k=d%60,s=t.q.getDate(),n=t.q.getHours(),n+v>=24&&++s,o=new b.Date(t.q.getFullYear(),t.q.getMonth(),s,e+v,t.q.getMinutes()+k,t.q.getSeconds(),t.q.getMilliseconds()),t.q.setTime(o.getTime()))),h=t.q.getTime(),t.q.setTime(h+36e5),t.q.getHours()!=e&&t.q.setTime(h)}function Ryn(t,e){var n,r,s,o,h;if(vr(e,"Path-Like Graph Wrapping",1),t.b.c.length==0){or(e);return}if(s=new m5t(t),h=(s.i==null&&(s.i=fyt(s,new VN)),Xt(s.i)*s.f),n=h/(s.i==null&&(s.i=fyt(s,new VN)),Xt(s.i)),s.b>n){or(e);return}switch(u(Q(t,(Te(),ght)),337).g){case 2:o=new UN;break;case 0:o=new HN;break;default:o=new WN}if(r=o.Vf(t,s),!o.Wf())switch(u(Q(t,wG),338).g){case 2:r=Doe(s,r);break;case 1:r=Mae(s,r)}F3n(t,s,r),or(e)}function jyn(t,e){var n,r,s,o;if(Ein(t.d,t.e),t.c.a.$b(),Xt(ye(Q(e.j,(Te(),aG))))!=0||Xt(ye(Q(e.j,aG)))!=0)for(n=VE,Vt(Q(e.j,wb))!==Vt((V0(),vb))&&Jt(e.j,(ae(),Ov),(Nn(),!0)),o=u(Q(e.j,MS),19).a,s=0;ss&&++k,le(h,(An(d+k,e.c.length),u(e.c[d+k],19))),v+=(An(d+k,e.c.length),u(e.c[d+k],19)).a-r,++n;n1&&(v>Ru(d)*El(d)/2||h.b==0)&&(M=new rz(j),C=Ru(d)/El(d),k=zat(M,e,new Cx,n,r,s,C),Li(Gf(M.e),k),d=M,H.c[H.c.length]=M,v=0,j.c=Nt(Qn,De,1,0,5,1)));return Ls(H,j),H}function qyn(t,e,n,r){var s,o,h,d,v,k,C,M,j,H,G,K;if(n.mh(e)&&(C=(H=e,H?u(r,49).xh(H):null),C))if(K=n.bh(e,t.a),G=e.t,G>1||G==-1)if(M=u(K,69),j=u(C,69),M.dc())j.$b();else for(h=!!no(e),o=0,d=t.a?M.Kc():M.Zh();d.Ob();)k=u(d.Pb(),56),s=u(Xw(t,k),56),s?(h?(v=j.Xc(s),v==-1?j.Xh(o,s):o!=v&&j.ji(o,s)):j.Xh(o,s),++o):t.b&&!h&&(j.Xh(o,k),++o);else K==null?C.Wb(null):(s=Xw(t,K),s==null?t.b&&!no(e)&&C.Wb(K):C.Wb(s))}function Hyn(t,e){var n,r,s,o,h,d,v,k;for(n=new NK,s=new ar(lr(jo(e).a.Kc(),new z));zr(s);)if(r=u(Mr(s),17),!Ga(r)&&(d=r.c.i,L4t(d,yV))){if(k=V5t(t,d,yV,mV),k==-1)continue;n.b=b.Math.max(n.b,k),!n.a&&(n.a=new he),le(n.a,d)}for(h=new ar(lr(Ds(e).a.Kc(),new z));zr(h);)if(o=u(Mr(h),17),!Ga(o)&&(v=o.d.i,L4t(v,mV))){if(k=V5t(t,v,mV,yV),k==-1)continue;n.d=b.Math.max(n.d,k),!n.c&&(n.c=new he),le(n.c,v)}return n}function Nle(t){TE();var e,n,r,s;if(e=ps(t),t1e6)throw it(new _R("power of ten too big"));if(t<=wi)return Qx(bI(D6[1],e),e);for(r=bI(D6[1],wi),s=r,n=Tu(t-wi),e=ps(t%wi);yc(n,wi)>0;)s=e4(s,r),n=Jp(n,wi);for(s=e4(s,bI(D6[1],e)),s=Qx(s,wi),n=Tu(t-wi);yc(n,wi)>0;)s=Qx(s,wi),n=Jp(n,wi);return s=Qx(s,e),s}function Vyn(t,e){var n,r,s,o,h,d,v,k,C;for(vr(e,"Hierarchical port dummy size processing",1),v=new he,C=new he,r=Xt(ye(Q(t,(Te(),J4)))),n=r*2,o=new S(t.b);o.ak&&r>k)C=d,k=Xt(e.p[d.p])+Xt(e.d[d.p])+d.o.b+d.d.a;else{s=!1,n.n&&Jb(n,"bk node placement breaks on "+d+" which should have been after "+C);break}if(!s)break}return n.n&&Jb(n,e+" is feasible: "+s),s}function Kyn(t,e,n,r){var s,o,h,d,v,k,C;for(d=-1,C=new S(t);C.a=tt&&t.e[v.p]>G*t.b||St>=n*tt)&&(j.c[j.c.length]=d,d=new he,Ua(h,o),o.a.$b(),k-=C,H=b.Math.max(H,k*t.b+K),k+=St,Mt=St,St=0,C=0,K=0);return new fa(H,j)}function Jyn(t){var e,n,r,s,o,h,d,v,k,C,M,j,H;for(n=(k=new v1(t.c.b).a.vc().Kc(),new m1(k));n.a.Ob();)e=(d=u(n.a.Pb(),42),u(d.dd(),149)),s=e.a,s==null&&(s=""),r=CZe(t.c,s),!r&&s.length==0&&(r=_ln(t)),r&&!ay(r.c,e,!1)&&ri(r.c,e);for(h=ei(t.a,0);h.b!=h.d.c;)o=u(ti(h),478),C=Hrt(t.c,o.a),H=Hrt(t.c,o.b),C&&H&&ri(C.c,new fa(H,o.c));for(Ah(t.a),j=ei(t.b,0);j.b!=j.d.c;)M=u(ti(j),478),e=TZe(t.c,M.a),v=Hrt(t.c,M.b),e&&v&&gXe(e,v,M.c);Ah(t.b)}function t3n(t,e,n){var r,s,o,h,d,v,k,C,M,j,H;o=new Qk(t),h=new nae,s=(dD(h.g),dD(h.j),Xu(h.b),dD(h.d),dD(h.i),Xu(h.k),Xu(h.c),Xu(h.e),H=joe(h,o,null),Ace(h,o),H),e&&(k=new Qk(e),d=l3n(k),z4t(s,lt(ct(CSt,1),De,527,0,[d]))),j=!1,M=!1,n&&(k=new Qk(n),IH in k.a&&(j=B0(k,IH).ge().a),Qde in k.a&&(M=B0(k,Qde).ge().a)),C=yHt(Kee(new r8,j),M),Wgn(new CZ,s,C),IH in o.a&&Yf(o,IH,null),(j||M)&&(v=new _x,Ile(C,v,j,M),Yf(o,IH,v)),r=new Szt(h),zun(new l2t(s),r)}function e3n(t,e,n){var r,s,o,h,d,v,k,C,M;for(h=new oae,k=lt(ct(Cr,1),Xr,25,15,[0]),s=-1,o=0,r=0,v=0;v0){if(s<0&&C.a&&(s=v,o=k[0],r=0),s>=0){if(d=C.b,v==s&&(d-=r++,d==0))return 0;if(!jhe(e,k,C,d,h)){v=s-1,k[0]=o;continue}}else if(s=-1,!jhe(e,k,C,0,h))return 0}else{if(s=-1,wa(C.c,0)==32){if(M=k[0],aee(e,k),k[0]>M)continue}else if(Frn(e,C.c,k[0])){k[0]+=C.c.length;continue}return 0}return F5n(h,n)?k[0]:0}function C_(t){var e,n,r,s,o,h,d,v;if(!t.f){if(v=new M0,d=new M0,e=uA,h=e.a.zc(t,e),h==null){for(o=new nr(Ao(t));o.e!=o.i.gc();)s=u(dr(o),26),is(v,C_(s));e.a.Bc(t)!=null,e.a.gc()==0}for(r=(!t.s&&(t.s=new fe(Mu,t,21,17)),new nr(t.s));r.e!=r.i.gc();)n=u(dr(r),170),_t(n,99)&&Dr(d,u(n,18));iy(d),t.r=new ZYt(t,(u(At(Wt((Hp(),Ln).o),6),18),d.i),d.g),is(v,t.r),iy(v),t.f=new V3((u(At(Wt(Ln.o),5),18),v.i),v.g),sl(t).b&=-3}return t.f}function n3n(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G;for(h=t.o,r=Nt(Cr,Xr,25,h,15,1),s=Nt(Cr,Xr,25,h,15,1),n=t.p,e=Nt(Cr,Xr,25,n,15,1),o=Nt(Cr,Xr,25,n,15,1),k=0;k=0&&!f4(t,C,M);)--M;s[C]=M}for(H=0;H=0&&!f4(t,d,G);)--d;o[G]=d}for(v=0;ve[j]&&jr[v]&&Sq(t,v,j,!1,!0)}function dxt(t){var e,n,r,s,o,h,d,v;n=je(Re(Q(t,(Jf(),gbe)))),o=t.a.c.d,d=t.a.d.d,n?(h=fd(ia(new $e(d.a,d.b),o),.5),v=fd(nc(t.e),.5),e=ia(Li(new $e(o.a,o.b),h),v),H2t(t.d,e)):(s=Xt(ye(Q(t.a,kbe))),r=t.d,o.a>=d.a?o.b>=d.b?(r.a=d.a+(o.a-d.a)/2+s,r.b=d.b+(o.b-d.b)/2-s-t.e.b):(r.a=d.a+(o.a-d.a)/2+s,r.b=o.b+(d.b-o.b)/2+s):o.b>=d.b?(r.a=o.a+(d.a-o.a)/2+s,r.b=d.b+(o.b-d.b)/2+s):(r.a=o.a+(d.a-o.a)/2+s,r.b=o.b+(d.b-o.b)/2-s-t.e.b))}function $c(t,e){var n,r,s,o,h,d,v;if(t==null)return null;if(o=t.length,o==0)return"";for(v=Nt(xh,yd,25,o,15,1),Lmt(0,o,t.length),Lmt(0,o,v.length),iXt(t,0,o,v,0),n=null,d=e,s=0,h=0;s0?Pl(n.a,0,o-1):""):t.substr(0,o-1):n?n.a:t}function jle(t){Mw(t,new k2(_w(Ew(Cw(Tw(new kg,A2),"ELK DisCo"),"Layouter for arranging unconnected subgraphs. The subgraphs themselves are, by default, not laid out."),new yg))),xe(t,A2,jot,Ie(p7t)),xe(t,A2,$ot,Ie(Qut)),xe(t,A2,E6,Ie(Jpe)),xe(t,A2,xv,Ie(g7t)),xe(t,A2,Zxt,Ie(rbe)),xe(t,A2,Jxt,Ie(nbe)),xe(t,A2,Qxt,Ie(ibe)),xe(t,A2,t6t,Ie(ebe)),xe(t,A2,o6t,Ie(tbe)),xe(t,A2,c6t,Ie(Xut)),xe(t,A2,u6t,Ie(d7t)),xe(t,A2,l6t,Ie(fV))}function gxt(t,e,n,r){var s,o,h,d,v,k,C,M,j;if(o=new Y0(t),D0(o,(Vn(),Hc)),Jt(o,(Te(),cs),(ua(),Gc)),s=0,e){for(h=new Mc,Jt(h,(ae(),_i),e),Jt(o,_i,e.i),Bs(h,(ve(),Bn)),Uo(h,o),j=wd(e.e),k=j,C=0,M=k.length;C0)if(n-=r.length-e,n>=0){for(s.a+="0.";n>N2.length;n-=N2.length)wKt(s,N2);JWt(s,N2,ps(n)),Gr(s,r.substr(e))}else n=e-n,Gr(s,Pl(r,e,ps(n))),s.a+=".",Gr(s,RM(r,ps(n)));else{for(Gr(s,r.substr(e));n<-N2.length;n+=N2.length)wKt(s,N2);JWt(s,N2,ps(-n))}return s.a}function pxt(t,e,n,r){var s,o,h,d,v,k,C,M,j;return v=ia(new $e(n.a,n.b),t),k=v.a*e.b-v.b*e.a,C=e.a*r.b-e.b*r.a,M=(v.a*r.b-v.b*r.a)/C,j=k/C,C==0?k==0?(s=Li(new $e(n.a,n.b),fd(new $e(r.a,r.b),.5)),o=Wp(t,s),h=Wp(Li(new $e(t.a,t.b),e),s),d=b.Math.sqrt(r.a*r.a+r.b*r.b)*.5,o=0&&M<=1&&j>=0&&j<=1?Li(new $e(t.a,t.b),fd(new $e(e.a,e.b),M)):null}function i3n(t,e,n){var r,s,o,h,d;if(r=u(Q(t,(Te(),tht)),21),n.a>e.a&&(r.Hc((hy(),WO))?t.c.a+=(n.a-e.a)/2:r.Hc(YO)&&(t.c.a+=n.a-e.a)),n.b>e.b&&(r.Hc((hy(),XO))?t.c.b+=(n.b-e.b)/2:r.Hc(KO)&&(t.c.b+=n.b-e.b)),u(Q(t,(ae(),Vc)),21).Hc((oo(),vh))&&(n.a>e.a||n.b>e.b))for(d=new S(t.a);d.ae.a&&(r.Hc((hy(),WO))?t.c.a+=(n.a-e.a)/2:r.Hc(YO)&&(t.c.a+=n.a-e.a)),n.b>e.b&&(r.Hc((hy(),XO))?t.c.b+=(n.b-e.b)/2:r.Hc(KO)&&(t.c.b+=n.b-e.b)),u(Q(t,(ae(),Vc)),21).Hc((oo(),vh))&&(n.a>e.a||n.b>e.b))for(h=new S(t.a);h.ae&&(s=0,o+=C.b+n,M.c[M.c.length]=C,C=new Zvt(o,n),r=new Iit(0,C.f,C,n),az(C,r),s=0),r.b.c.length==0||v.f>=r.o&&v.f<=r.f||r.a*.5<=v.f&&r.a*1.5>=v.f?h3t(r,v):(h=new Iit(r.s+r.r+n,C.f,C,n),az(C,h),h3t(h,v)),s=v.i+v.g;return M.c[M.c.length]=C,M}function T4(t){var e,n,r,s,o,h,d,v;if(!t.a){if(t.o=null,v=new Wzt(t),e=new Ep,n=uA,d=n.a.zc(t,n),d==null){for(h=new nr(Ao(t));h.e!=h.i.gc();)o=u(dr(h),26),is(v,T4(o));n.a.Bc(t)!=null,n.a.gc()==0}for(s=(!t.s&&(t.s=new fe(Mu,t,21,17)),new nr(t.s));s.e!=s.i.gc();)r=u(dr(s),170),_t(r,322)&&Dr(e,u(r,34));iy(e),t.k=new QYt(t,(u(At(Wt((Hp(),Ln).o),7),18),e.i),e.g),is(v,t.k),iy(v),t.a=new V3((u(At(Wt(Ln.o),4),18),v.i),v.g),sl(t).b&=-2}return t.a}function c3n(t,e,n,r,s,o,h){var d,v,k,C,M,j;return M=!1,v=Wce(n.q,e.f+e.b-n.q.f),j=s-(n.q.e+v-h),j=(An(o,t.c.length),u(t.c[o],200)).e,C=(d=__(r,j,!1),d.a),C>e.b&&!k)?!1:((k||C<=e.b)&&(k&&C>e.b?(n.d=C,vD(n,Qae(n,C))):(bae(n.q,v),n.c=!0),vD(r,s-(n.s+n.r)),tI(r,n.q.e+n.q.d,e.f),az(e,r),t.c.length>o&&(sI((An(o,t.c.length),u(t.c[o],200)),r),(An(o,t.c.length),u(t.c[o],200)).a.c.length==0&&Fg(t,o)),M=!0),M)}function bxt(t,e,n,r){var s,o,h,d,v,k,C;if(C=ou(t.e.Tg(),e),s=0,o=u(t.g,119),v=null,to(),u(e,66).Oj()){for(d=0;dt.o.a&&(C=(v-t.o.a)/2,d.b=b.Math.max(d.b,C),d.c=b.Math.max(d.c,C))}}function l3n(t){var e,n,r,s,o,h,d,v;for(o=new vZt,YXe(o,(i6(),G3e)),r=(s=yit(t,Nt(Ae,ee,2,0,6,1)),new mx(new yl(new Eet(t,s).b)));r.b0?t.i:0)>e&&v>0&&(o=0,h+=v+t.i,s=b.Math.max(s,j),r+=v+t.i,v=0,j=0,n&&(++M,le(t.n,new E$(t.s,h,t.i))),d=0),j+=k.g+(d>0?t.i:0),v=b.Math.max(v,k.f),n&&W3t(u(Ne(t.n,M),211),k),o+=k.g+(d>0?t.i:0),++d;return s=b.Math.max(s,j),r+=v,n&&(t.r=s,t.d=r,Q3t(t.j)),new ah(t.s,t.t,s,r)}function Dc(t,e,n,r,s){Gd();var o,h,d,v,k,C,M,j,H;if(bvt(t,"src"),bvt(n,"dest"),j=ol(t),v=ol(n),jwt((j.i&4)!=0,"srcType is not an array"),jwt((v.i&4)!=0,"destType is not an array"),M=j.c,h=v.c,jwt(M.i&1?M==h:(h.i&1)==0,"Array types don't match"),H=t.length,k=n.length,e<0||r<0||s<0||e+s>H||r+s>k)throw it(new Dpt);if(!(M.i&1)&&j!=v)if(C=u2(t),o=u2(n),Vt(t)===Vt(n)&&er;)ts(o,d,C[--e]);else for(d=r+s;r0&&n5t(t,e,n,r,s,!0)}function Lat(){Lat=Z,qge=lt(ct(Cr,1),Xr,25,15,[Sa,1162261467,D_,1220703125,362797056,1977326743,D_,387420489,Gq,214358881,429981696,815730721,1475789056,170859375,268435456,410338673,612220032,893871739,128e7,1801088541,113379904,148035889,191102976,244140625,308915776,387420489,481890304,594823321,729e6,887503681,D_,1291467969,1544804416,1838265625,60466176]),Hge=lt(ct(Cr,1),Xr,25,15,[-1,-1,31,19,15,13,11,11,10,9,9,8,8,8,8,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5])}function h3n(t){var e,n,r,s,o,h,d,v;for(s=new S(t.b);s.a=t.b.length?(o[s++]=h.b[r++],o[s++]=h.b[r++]):r>=h.b.length?(o[s++]=t.b[n++],o[s++]=t.b[n++]):h.b[r]0?t.i:0)),++e;for(Ehn(t.n,v),t.d=n,t.r=r,t.g=0,t.f=0,t.e=0,t.o=as,t.p=as,o=new S(t.b);o.a0&&(s=(!t.n&&(t.n=new fe(qo,t,1,7)),u(At(t.n,0),137)).a,!s||Gr(Gr((e.a+=' "',e),s),'"'))),n=(!t.b&&(t.b=new Cn(br,t,4,7)),!(t.b.i<=1&&(!t.c&&(t.c=new Cn(br,t,5,8)),t.c.i<=1))),n?e.a+=" [":e.a+=" ",Gr(e,_2t(new vet,new nr(t.b))),n&&(e.a+="]"),e.a+=Uot,n&&(e.a+="["),Gr(e,_2t(new vet,new nr(t.c))),n&&(e.a+="]"),e.a)}function Mat(t,e){var n,r,s,o,h,d,v;if(t.a){if(d=t.a.ne(),v=null,d!=null?e.a+=""+d:(h=t.a.Dj(),h!=null&&(o=hd(h,Cu(91)),o!=-1?(v=h.substr(o),e.a+=""+Pl(h==null?_u:(On(h),h),0,o)):e.a+=""+h)),t.d&&t.d.i!=0){for(s=!0,e.a+="<",r=new nr(t.d);r.e!=r.i.gc();)n=u(dr(r),87),s?s=!1:e.a+=Ya,Mat(n,e);e.a+=">"}v!=null&&(e.a+=""+v)}else t.e?(d=t.e.zb,d!=null&&(e.a+=""+d)):(e.a+="?",t.b?(e.a+=" super ",Mat(t.b,e)):t.f&&(e.a+=" extends ",Mat(t.f,e)))}function g3n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn;for(Kt=t.c,ue=e.c,n=Ro(Kt.a,t,0),r=Ro(ue.a,e,0),St=u(ov(t,(so(),tl)).Kc().Pb(),11),Qe=u(ov(t,nu).Kc().Pb(),11),Rt=u(ov(e,tl).Kc().Pb(),11),Rn=u(ov(e,nu).Kc().Pb(),11),gt=wd(St.e),_e=wd(Qe.g),Mt=wd(Rt.e),We=wd(Rn.g),ly(t,r,ue),h=Mt,C=0,G=h.length;CC?new i2((Uf(),Ky),n,e,k-C):k>0&&C>0&&(new i2((Uf(),Ky),e,n,0),new i2(Ky,n,e,0))),h)}function qle(t,e){var n,r,s,o,h,d;for(h=new p2(new Cg(t.f.b).a);h.b;){if(o=Zw(h),s=u(o.cd(),594),e==1){if(s.gf()!=(ao(),rg)&&s.gf()!=ng)continue}else if(s.gf()!=(ao(),zh)&&s.gf()!=Cf)continue;switch(r=u(u(o.dd(),46).b,81),d=u(u(o.dd(),46).a,189),n=d.c,s.gf().g){case 2:r.g.c=t.e.a,r.g.b=b.Math.max(1,r.g.b+n);break;case 1:r.g.c=r.g.c+n,r.g.b=b.Math.max(1,r.g.b-n);break;case 4:r.g.d=t.e.b,r.g.a=b.Math.max(1,r.g.a+n);break;case 3:r.g.d=r.g.d+n,r.g.a=b.Math.max(1,r.g.a-n)}}}function p3n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K;for(d=Nt(Cr,Xr,25,e.b.c.length,15,1),k=Nt(flt,oe,267,e.b.c.length,0,1),v=Nt(l0,Yg,10,e.b.c.length,0,1),M=t.a,j=0,H=M.length;j0&&v[r]&&(G=W3(t.b,v[r],s)),K=b.Math.max(K,s.c.c.b+G);for(o=new S(C.e);o.a1)throw it(new Fn(aO));v||(o=Zd(e,r.Kc().Pb()),h.Fc(o))}return Syt(t,W4t(t,e,n),h)}function v3n(t,e){var n,r,s,o;for(ecn(e.b.j),ls(wu(new Tn(null,new _n(e.d,16)),new XX),new QX),o=new S(e.d);o.at.o.b||(n=Ko(t,Hn),d=e.d+e.a+(n.gc()-1)*h,d>t.o.b)))}function Oat(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G;if(h=t.e,v=e.e,h==0)return e;if(v==0)return t;if(o=t.d,d=e.d,o+d==2)return n=Ns(t.a[0],co),r=Ns(e.a[0],co),h==v?(C=Pa(n,r),G=Ar(C),H=Ar(Vm(C,32)),H==0?new Ng(h,G):new X3(h,2,lt(ct(Cr,1),Xr,25,15,[G,H]))):JD(h<0?Jp(r,n):Jp(n,r));if(h==v)j=h,M=o>=d?Krt(t.a,o,e.a,d):Krt(e.a,d,t.a,o);else{if(s=o!=d?o>d?1:-1:qyt(t.a,e.a,o),s==0)return rb(),s7;s==1?(j=h,M=Wrt(t.a,o,e.a,d)):(j=v,M=Wrt(e.a,d,t.a,o))}return k=new X3(j,M.length,M),N9(k),k}function Pat(t,e,n,r,s,o,h){var d,v,k,C,M,j,H;return M=je(Re(Q(e,(Te(),l9t)))),j=null,o==(so(),tl)&&r.c.i==n?j=r.c:o==nu&&r.d.i==n&&(j=r.d),k=h,!k||!M||j?(C=(ve(),Zo),j?C=j.j:G3(u(Q(n,cs),98))&&(C=o==tl?Bn:Hn),v=k3n(t,e,n,o,C,r),d=Grt((Na(n),r)),o==tl?(Oa(d,u(Ne(v.j,0),11)),oa(d,s)):(Oa(d,s),oa(d,u(Ne(v.j,0),11))),k=new oie(r,d,v,u(Q(v,(ae(),_i)),11),o,!j)):(le(k.e,r),H=b.Math.max(Xt(ye(Q(k.d,Jg))),Xt(ye(Q(r,Jg)))),Jt(k.d,Jg,H)),ln(t.a,r,new Fj(k.d,e,o)),k}function Pq(t,e){var n,r,s,o,h,d,v,k,C,M;if(C=null,t.d&&(C=u(Nc(t.d,e),138)),!C){if(o=t.a.Mh(),M=o.i,!t.d||HC(t.d)!=M){for(v=new _r,t.d&&Y9(v,t.d),k=v.f.c+v.g.c,d=k;d0?(H=(G-1)*n,d&&(H+=r),C&&(H+=r),H=t.b[s+1])s+=2;else if(n0)for(r=new Bu(u(Ai(t.a,o),21)),wn(),Zs(r,new Si(e)),s=new da(o.b,0);s.bKt)?(v=2,h=wi):v==0?(v=1,h=_e):(v=0,h=_e)):(H=_e>=h||h-_e0?1:Iw(isNaN(r),isNaN(0)))>=0^(wf(_d),(b.Math.abs(d)<=_d||d==0||isNaN(d)&&isNaN(0)?0:d<0?-1:d>0?1:Iw(isNaN(d),isNaN(0)))>=0)?b.Math.max(d,r):(wf(_d),(b.Math.abs(r)<=_d||r==0||isNaN(r)&&isNaN(0)?0:r<0?-1:r>0?1:Iw(isNaN(r),isNaN(0)))>0?b.Math.sqrt(d*d+r*r):-b.Math.sqrt(d*d+r*r))}function E2(t,e){var n,r,s,o,h,d;if(e){if(!t.a&&(t.a=new ER),t.e==2){kR(t.a,e);return}if(e.e==1){for(s=0;s=Ka?go(n,l3t(r)):S8(n,r&ys),h=new krt(10,null,0),unn(t.a,h,d-1)):(n=(h.bm().length+o,new $C),go(n,h.bm())),e.e==0?(r=e._l(),r>=Ka?go(n,l3t(r)):S8(n,r&ys)):go(n,e.bm()),u(h,521).b=n.a}}function Xle(t){var e,n,r,s,o;return t.g!=null?t.g:t.a<32?(t.g=W5n(Tu(t.f),ps(t.e)),t.g):(s=Hat((!t.c&&(t.c=VD(t.f)),t.c),0),t.e==0?s:(e=(!t.c&&(t.c=VD(t.f)),t.c).e<0?2:1,n=s.length,r=-t.e+n-e,o=new Mp,o.a+=""+s,t.e>0&&r>=-6?r>=0?uD(o,n-ps(t.e),String.fromCharCode(46)):(o.a=Pl(o.a,0,e-1)+"0."+RM(o.a,e-1),uD(o,e+1,Mh(N2,0,-ps(r)-1))):(n-e>=1&&(uD(o,e,String.fromCharCode(46)),++n),uD(o,n,String.fromCharCode(69)),r>0&&uD(o,++n,String.fromCharCode(43)),uD(o,++n,""+_9(Tu(r)))),t.g=o.a,t.g))}function F3n(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt;if(!n.dc()){for(d=0,j=0,r=n.Kc(),G=u(r.Pb(),19).a;d1&&(v=k.mg(v,t.a,d));return v.c.length==1?u(Ne(v,v.c.length-1),220):v.c.length==2?T3n((An(0,v.c.length),u(v.c[0],220)),(An(1,v.c.length),u(v.c[1],220)),h,o):null}function Qle(t){var e,n,r,s,o,h;for(xu(t.a,new xi),n=new S(t.a);n.a=b.Math.abs(r.b)?(r.b=0,o.d+o.a>h.d&&o.dh.c&&o.c0){if(e=new n2t(t.i,t.g),n=t.i,o=n<100?null:new Dp(n),t.ij())for(r=0;r0){for(d=t.g,k=t.i,z9(t),o=k<100?null:new Dp(k),r=0;r>13|(t.m&15)<<9,s=t.m>>4&8191,o=t.m>>17|(t.h&255)<<5,h=(t.h&1048320)>>8,d=e.l&8191,v=e.l>>13|(e.m&15)<<9,k=e.m>>4&8191,C=e.m>>17|(e.h&255)<<5,M=(e.h&1048320)>>8,We=n*d,Qe=r*d,Rn=s*d,zn=o*d,hr=h*d,v!=0&&(Qe+=n*v,Rn+=r*v,zn+=s*v,hr+=o*v),k!=0&&(Rn+=n*k,zn+=r*k,hr+=s*k),C!=0&&(zn+=n*C,hr+=r*C),M!=0&&(hr+=n*M),H=We&hl,G=(Qe&511)<<13,j=H+G,tt=We>>22,gt=Qe>>9,Mt=(Rn&262143)<<4,St=(zn&31)<<17,K=tt+gt+Mt+St,Kt=Rn>>18,ue=zn>>5,_e=(hr&4095)<<8,Rt=Kt+ue+_e,K+=j>>22,j&=hl,Rt+=K>>22,K&=hl,Rt&=Z0,iu(j,K,Rt)}function Zle(t){var e,n,r,s,o,h,d;if(d=u(Ne(t.j,0),11),d.g.c.length!=0&&d.e.c.length!=0)throw it(new No("Interactive layout does not support NORTH/SOUTH ports with incoming _and_ outgoing edges."));if(d.g.c.length!=0){for(o=as,n=new S(d.g);n.a4)if(t.wj(e)){if(t.rk()){if(s=u(e,49),r=s.Ug(),v=r==t.e&&(t.Dk()?s.Og(s.Vg(),t.zk())==t.Ak():-1-s.Vg()==t.aj()),t.Ek()&&!v&&!r&&s.Zg()){for(o=0;o0&&(k=t.n.a/o);break;case 2:case 4:s=t.i.o.b,s>0&&(k=t.n.b/s)}Jt(t,(ae(),Fv),k)}if(v=t.o,h=t.a,r)h.a=r.a,h.b=r.b,t.d=!0;else if(e!=G1&&e!=Tb&&d!=Zo)switch(d.g){case 1:h.a=v.a/2;break;case 2:h.a=v.a,h.b=v.b/2;break;case 3:h.a=v.a/2,h.b=v.b;break;case 4:h.b=v.b/2}else h.a=v.a/2,h.b=v.b/2}function A_(t){var e,n,r,s,o,h,d,v,k,C;if(t.ej())if(C=t.Vi(),v=t.fj(),C>0)if(e=new gyt(t.Gi()),n=C,o=n<100?null:new Dp(n),VM(t,n,e.g),s=n==1?t.Zi(4,At(e,0),null,0,v):t.Zi(6,e,null,-1,v),t.bj()){for(r=new nr(e);r.e!=r.i.gc();)o=t.dj(dr(r),o);o?(o.Ei(s),o.Fi()):t.$i(s)}else o?(o.Ei(s),o.Fi()):t.$i(s);else VM(t,t.Vi(),t.Wi()),t.$i(t.Zi(6,(wn(),io),null,-1,v));else if(t.bj())if(C=t.Vi(),C>0){for(d=t.Wi(),k=C,VM(t,C,d),o=k<100?null:new Dp(k),r=0;rt.d[h.p]&&(n+=fmt(t.b,o)*u(v.b,19).a,Up(t.a,pe(o)));for(;!BC(t.a);)Hmt(t.b,u(Hx(t.a),19).a)}return n}function W3n(t,e,n,r){var s,o,h,d,v,k,C,M,j,H,G,K,tt;for(M=new xo(u(qe(t,(fq(),OSt)),8)),M.a=b.Math.max(M.a-n.b-n.c,0),M.b=b.Math.max(M.b-n.d-n.a,0),s=ye(qe(t,MSt)),(s==null||(On(s),s<=0))&&(s=1.3),d=new he,G=new nr((!t.a&&(t.a=new fe(rs,t,10,11)),t.a));G.e!=G.i.gc();)H=u(dr(G),33),h=new LWt(H),d.c[d.c.length]=h;switch(j=u(qe(t,lft),311),j.g){case 3:tt=pyn(d,e,M.a,M.b,(k=r,On(s),k));break;case 1:tt=zyn(d,e,M.a,M.b,(C=r,On(s),C));break;default:tt=X3n(d,e,M.a,M.b,(v=r,On(s),v))}o=new rz(tt),K=zat(o,e,n,M.a,M.b,r,(On(s),s)),wv(t,K.a,K.b,!1,!0)}function Y3n(t,e){var n,r,s,o;n=e.b,o=new Bu(n.j),s=0,r=n.j,r.c=Nt(Qn,De,1,0,5,1),$w(u(h2(t.b,(ve(),Pn),(nv(),Dv)),15),n),s=nI(o,s,new jX,r),$w(u(h2(t.b,Pn,pb),15),n),s=nI(o,s,new VT,r),$w(u(h2(t.b,Pn,Mv),15),n),$w(u(h2(t.b,Hn,Dv),15),n),$w(u(h2(t.b,Hn,pb),15),n),s=nI(o,s,new PN,r),$w(u(h2(t.b,Hn,Mv),15),n),$w(u(h2(t.b,mr,Dv),15),n),s=nI(o,s,new FN,r),$w(u(h2(t.b,mr,pb),15),n),s=nI(o,s,new NN,r),$w(u(h2(t.b,mr,Mv),15),n),$w(u(h2(t.b,Bn,Dv),15),n),s=nI(o,s,new qX,r),$w(u(h2(t.b,Bn,pb),15),n),$w(u(h2(t.b,Bn,Mv),15),n)}function K3n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K;for(vr(e,"Layer size calculation",1),C=as,k=Cs,s=!1,d=new S(t.b);d.a.5?gt-=h*2*(G-.5):G<.5&&(gt+=o*2*(.5-G)),s=d.d.b,gttt.a-K-C&&(gt=tt.a-K-C),d.n.a=e+gt}}function X3n(t,e,n,r,s){var o,h,d,v,k,C,M,j,H,G,K,tt;for(d=Nt(aa,vo,25,t.c.length,15,1),j=new n$(new sB),e4t(j,t),k=0,K=new he;j.b.c.length!=0;)if(h=u(j.b.c.length==0?null:Ne(j.b,0),157),k>1&&Ru(h)*El(h)/2>d[0]){for(o=0;od[o];)++o;G=new Qd(K,0,o+1),M=new rz(G),C=Ru(h)/El(h),v=zat(M,e,new Cx,n,r,s,C),Li(Gf(M.e),v),R8(xE(j,M)),H=new Qd(K,o+1,K.c.length),e4t(j,H),K.c=Nt(Qn,De,1,0,5,1),k=0,AKt(d,d.length,0)}else tt=j.b.c.length==0?null:Ne(j.b,0),tt!=null&&vit(j,0),k>0&&(d[k]=d[k-1]),d[k]+=Ru(h)*El(h),++k,K.c[K.c.length]=h;return K}function Q3n(t){var e,n,r,s,o;if(r=u(Q(t,(Te(),uu)),163),r==(dh(),bb)){for(n=new ar(lr(jo(t).a.Kc(),new z));zr(n);)if(e=u(Mr(n),17),!jJt(e))throw it(new R3(Kot+rI(t)+"' has its layer constraint set to FIRST_SEPARATE, but has at least one incoming edge. FIRST_SEPARATE nodes must not have incoming edges."))}else if(r==jy){for(o=new ar(lr(Ds(t).a.Kc(),new z));zr(o);)if(s=u(Mr(o),17),!jJt(s))throw it(new R3(Kot+rI(t)+"' has its layer constraint set to LAST_SEPARATE, but has at least one outgoing edge. LAST_SEPARATE nodes must not have outgoing edges."))}}function Z3n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G;for(vr(e,"Label dummy removal",1),r=Xt(ye(Q(t,(Te(),V6)))),s=Xt(ye(Q(t,Wy))),k=u(Q(t,Wl),103),v=new S(t.b);v.a0&&soe(t,d,M);for(s=new S(M);s.a>19&&(e=rE(e),v=!v),h=Q2n(e),o=!1,s=!1,r=!1,t.h==NI&&t.m==0&&t.l==0)if(s=!0,o=!0,h==-1)t=yUt((q8(),sEt)),r=!0,v=!v;else return d=v5t(t,h),v&&Ait(d),n&&(hb=iu(0,0,0)),d;else t.h>>19&&(o=!0,t=rE(t),r=!0,v=!v);return h!=-1?Run(t,h,v,o,n):u4t(t,e)<0?(n&&(o?hb=rE(t):hb=iu(t.l,t.m,t.h)),iu(0,0,0)):qmn(r?t:iu(t.l,t.m,t.h),e,v,o,s,n)}function Fq(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G;if(t.e&&t.c.ce.f||e.g>t.f)){for(n=0,r=0,h=t.w.a.ec().Kc();h.Ob();)s=u(h.Pb(),11),$it(Yo(lt(ct(Ws,1),ee,8,0,[s.i.n,s.n,s.a])).b,e.g,e.f)&&++n;for(d=t.r.a.ec().Kc();d.Ob();)s=u(d.Pb(),11),$it(Yo(lt(ct(Ws,1),ee,8,0,[s.i.n,s.n,s.a])).b,e.g,e.f)&&--n;for(v=e.w.a.ec().Kc();v.Ob();)s=u(v.Pb(),11),$it(Yo(lt(ct(Ws,1),ee,8,0,[s.i.n,s.n,s.a])).b,t.g,t.f)&&++r;for(o=e.r.a.ec().Kc();o.Ob();)s=u(o.Pb(),11),$it(Yo(lt(ct(Ws,1),ee,8,0,[s.i.n,s.n,s.a])).b,t.g,t.f)&&--r;n=0)return s=ohn(t,e.substr(1,h-1)),C=e.substr(h+1,v-(h+1)),nxn(t,C,s)}else{if(n=-1,lEt==null&&(lEt=new RegExp("\\d")),lEt.test(String.fromCharCode(d))&&(n=bwt(e,Cu(46),v-1),n>=0)){r=u(Urt(t,Dee(t,e.substr(1,n-1)),!1),58),k=0;try{k=ql(e.substr(n+1),Sa,wi)}catch(j){throw j=Wi(j),_t(j,127)?(o=j,it(new W$(o))):it(j)}if(k=0)return n;switch(Hw(To(t,n))){case 2:{if(hn("",$g(t,n.Hj()).ne())){if(v=rD(To(t,n)),d=M8(To(t,n)),C=C5t(t,e,v,d),C)return C;for(s=Z5t(t,e),h=0,M=s.gc();h1)throw it(new Fn(aO));for(C=ou(t.e.Tg(),e),r=u(t.g,119),h=0;h1,k=new L1(j.b);Go(k.a)||Go(k.b);)v=u(Go(k.a)?J(k.a):J(k.b),17),M=v.c==j?v.d:v.c,b.Math.abs(Yo(lt(ct(Ws,1),ee,8,0,[M.i.n,M.n,M.a])).b-h.b)>1&&evn(t,v,h,o,j)}}function l4n(t){var e,n,r,s,o,h;if(s=new da(t.e,0),r=new da(t.a,0),t.d)for(n=0;nLct;){for(o=e,h=0;b.Math.abs(e-o)0),s.a.Xb(s.c=--s.b),Syn(t,t.b-h,o,r,s),Zn(s.b0),r.a.Xb(r.c=--r.b)}if(!t.d)for(n=0;n0?(t.f[C.p]=H/(C.e.c.length+C.g.c.length),t.c=b.Math.min(t.c,t.f[C.p]),t.b=b.Math.max(t.b,t.f[C.p])):d&&(t.f[C.p]=H)}}function f4n(t){t.b=null,t.bb=null,t.fb=null,t.qb=null,t.a=null,t.c=null,t.d=null,t.e=null,t.f=null,t.n=null,t.M=null,t.L=null,t.Q=null,t.R=null,t.K=null,t.db=null,t.eb=null,t.g=null,t.i=null,t.j=null,t.k=null,t.gb=null,t.o=null,t.p=null,t.q=null,t.r=null,t.$=null,t.ib=null,t.S=null,t.T=null,t.t=null,t.s=null,t.u=null,t.v=null,t.w=null,t.B=null,t.A=null,t.C=null,t.D=null,t.F=null,t.G=null,t.H=null,t.I=null,t.J=null,t.P=null,t.Z=null,t.U=null,t.V=null,t.W=null,t.X=null,t.Y=null,t._=null,t.ab=null,t.cb=null,t.hb=null,t.nb=null,t.lb=null,t.mb=null,t.ob=null,t.pb=null,t.jb=null,t.kb=null,t.N=!1,t.O=!1}function d4n(t,e,n){var r,s,o,h;for(vr(n,"Graph transformation ("+t.a+")",1),h=Ww(e.a),o=new S(e.b);o.a0&&(t.a=v+(H-1)*o,e.c.b+=t.a,e.f.b+=t.a)),G.a.gc()!=0&&(j=new ert(1,o),H=Txt(j,e,G,K,e.f.b+v-e.c.b),H>0&&(e.f.b+=v+(H-1)*o))}function OE(t,e){var n,r,s,o;o=t.F,e==null?(t.F=null,aE(t,null)):(t.F=(On(e),e),r=hd(e,Cu(60)),r!=-1?(s=e.substr(0,r),hd(e,Cu(46))==-1&&!hn(s,b6)&&!hn(s,tS)&&!hn(s,FH)&&!hn(s,eS)&&!hn(s,nS)&&!hn(s,rS)&&!hn(s,iS)&&!hn(s,sS)&&(s=$0e),n=Tj(e,Cu(62)),n!=-1&&(s+=""+e.substr(n+1)),aE(t,s)):(s=e,hd(e,Cu(46))==-1&&(r=hd(e,Cu(91)),r!=-1&&(s=e.substr(0,r)),!hn(s,b6)&&!hn(s,tS)&&!hn(s,FH)&&!hn(s,eS)&&!hn(s,nS)&&!hn(s,rS)&&!hn(s,iS)&&!hn(s,sS)?(s=$0e,r!=-1&&(s+=""+e.substr(r))):s=e),aE(t,s),s==e&&(t.F=t.D))),t.Db&4&&!(t.Db&1)&&mi(t,new Js(t,1,5,o,e))}function p4n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St;if(K=e.b.c.length,!(K<3)){for(H=Nt(Cr,Xr,25,K,15,1),M=0,C=new S(e.b);C.ah)&&Fs(t.b,u(tt.b,17));++d}o=h}}}function xxt(t,e){var n;if(e==null||hn(e,_u)||e.length==0&&t.k!=(Ug(),U6))return null;switch(t.k.g){case 1:return Vz(e,XE)?(Nn(),r7):Vz(e,Vct)?(Nn(),F2):null;case 2:try{return pe(ql(e,Sa,wi))}catch(r){if(r=Wi(r),_t(r,127))return null;throw it(r)}case 4:try{return dy(e)}catch(r){if(r=Wi(r),_t(r,127))return null;throw it(r)}case 3:return e;case 5:return Rre(t),Voe(t,e);case 6:return Rre(t),C2n(t,t.a,e);case 7:try{return n=Bbn(t),n.Jf(e),n}catch(r){if(r=Wi(r),_t(r,32))return null;throw it(r)}default:throw it(new No("Invalid type set for this layout option."))}}function b4n(t){H9();var e,n,r,s,o,h,d;for(d=new pqt,n=new S(t);n.a=d.b.c)&&(d.b=e),(!d.c||e.c<=d.c.c)&&(d.d=d.c,d.c=e),(!d.e||e.d>=d.e.d)&&(d.e=e),(!d.f||e.d<=d.f.d)&&(d.f=e);return r=new Yz((nE(),Lv)),hD(t,Ube,new yl(lt(ct(mO,1),De,369,0,[r]))),h=new Yz(Fy),hD(t,Gbe,new yl(lt(ct(mO,1),De,369,0,[h]))),s=new Yz(Py),hD(t,Vbe,new yl(lt(ct(mO,1),De,369,0,[s]))),o=new Yz(z4),hD(t,Hbe,new yl(lt(ct(mO,1),De,369,0,[o]))),aat(r.c,Lv),aat(s.c,Py),aat(o.c,z4),aat(h.c,Fy),d.a.c=Nt(Qn,De,1,0,5,1),Ls(d.a,r.c),Ls(d.a,l2(s.c)),Ls(d.a,o.c),Ls(d.a,l2(h.c)),d}function kxt(t){var e;switch(t.d){case 1:{if(t.hj())return t.o!=-2;break}case 2:{if(t.hj())return t.o==-2;break}case 3:case 5:case 4:case 6:case 7:return t.o>-2;default:return!1}switch(e=t.gj(),t.p){case 0:return e!=null&&je(Re(e))!=u9(t.k,0);case 1:return e!=null&&u(e,217).a!=Ar(t.k)<<24>>24;case 2:return e!=null&&u(e,172).a!=(Ar(t.k)&ys);case 6:return e!=null&&u9(u(e,162).a,t.k);case 5:return e!=null&&u(e,19).a!=Ar(t.k);case 7:return e!=null&&u(e,184).a!=Ar(t.k)<<16>>16;case 3:return e!=null&&Xt(ye(e))!=t.j;case 4:return e!=null&&u(e,155).a!=t.j;default:return e==null?t.n!=null:!yi(e,t.n)}}function AI(t,e,n){var r,s,o,h;return t.Fk()&&t.Ek()&&(h=Wnt(t,u(n,56)),Vt(h)!==Vt(n))?(t.Oi(e),t.Ui(e,Ite(t,e,h)),t.rk()&&(o=(s=u(n,49),t.Dk()?t.Bk()?s.ih(t.b,no(u(yn(vu(t.b),t.aj()),18)).n,u(yn(vu(t.b),t.aj()).Yj(),26).Bj(),null):s.ih(t.b,Gi(s.Tg(),no(u(yn(vu(t.b),t.aj()),18))),null,null):s.ih(t.b,-1-t.aj(),null,null)),!u(h,49).eh()&&(o=(r=u(h,49),t.Dk()?t.Bk()?r.gh(t.b,no(u(yn(vu(t.b),t.aj()),18)).n,u(yn(vu(t.b),t.aj()).Yj(),26).Bj(),o):r.gh(t.b,Gi(r.Tg(),no(u(yn(vu(t.b),t.aj()),18))),null,o):r.gh(t.b,-1-t.aj(),null,o))),o&&o.Fi()),xl(t.b)&&t.$i(t.Zi(9,n,h,e,!1)),h):n}function nhe(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt;for(C=Xt(ye(Q(t,(Te(),jv)))),r=Xt(ye(Q(t,x9t))),j=new Yu,Jt(j,jv,C+r),k=e,gt=k.d,K=k.c.i,Mt=k.d.i,tt=o2t(K.c),St=o2t(Mt.c),s=new he,M=tt;M<=St;M++)d=new Y0(t),D0(d,(Vn(),ta)),Jt(d,(ae(),_i),k),Jt(d,cs,(ua(),Gc)),Jt(d,bG,j),H=u(Ne(t.b,M),29),M==tt?ly(d,H.a.c.length-n,H):Eo(d,H),Rt=Xt(ye(Q(k,Jg))),Rt<0&&(Rt=0,Jt(k,Jg,Rt)),d.o.b=Rt,G=b.Math.floor(Rt/2),h=new Mc,Bs(h,(ve(),Bn)),Uo(h,d),h.n.b=G,v=new Mc,Bs(v,Hn),Uo(v,d),v.n.b=G,oa(k,h),o=new Vw,Mo(o,k),Jt(o,So,null),Oa(o,v),oa(o,gt),mdn(d,k,o),s.c[s.c.length]=o,k=o;return s}function Bat(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St;for(v=u(Gg(t,(ve(),Bn)).Kc().Pb(),11).e,H=u(Gg(t,Hn).Kc().Pb(),11).g,d=v.c.length,St=_1(u(Ne(t.j,0),11));d-- >0;){for(K=(An(0,v.c.length),u(v.c[0],17)),s=(An(0,H.c.length),u(H.c[0],17)),Mt=s.d.e,o=Ro(Mt,s,0),Esn(K,s.d,o),Oa(s,null),oa(s,null),G=K.a,e&&ri(G,new xo(St)),r=ei(s.a,0);r.b!=r.d.c;)n=u(ti(r),8),ri(G,new xo(n));for(gt=K.b,j=new S(s.b);j.a0&&(h=b.Math.max(h,Mne(t.C.b+r.d.b,s))),C=r,M=s,j=o;t.C&&t.C.c>0&&(H=j+t.C.c,k&&(H+=C.d.c),h=b.Math.max(h,(k1(),wf(B1),b.Math.abs(M-1)<=B1||M==1||isNaN(M)&&isNaN(1)?0:H/(1-M)))),n.n.b=0,n.a.a=h}function ihe(t,e){var n,r,s,o,h,d,v,k,C,M,j,H;if(n=u(po(t.b,e),124),v=u(u(Ai(t.r,e),21),84),v.dc()){n.n.d=0,n.n.a=0;return}for(k=t.u.Hc((Zu(),sg)),h=0,t.A.Hc((Al(),K2))&&Bue(t,e),d=v.Kc(),C=null,j=0,M=0;d.Ob();)r=u(d.Pb(),111),o=Xt(ye(r.b.We((Cj(),uV)))),s=r.b.rf().b,C?(H=M+C.d.a+t.w+r.d.d,h=b.Math.max(h,(k1(),wf(B1),b.Math.abs(j-o)<=B1||j==o||isNaN(j)&&isNaN(o)?0:H/(o-j)))):t.C&&t.C.d>0&&(h=b.Math.max(h,Mne(t.C.d+r.d.d,o))),C=r,j=o,M=s;t.C&&t.C.a>0&&(H=M+t.C.a,k&&(H+=C.d.a),h=b.Math.max(h,(k1(),wf(B1),b.Math.abs(j-1)<=B1||j==1||isNaN(j)&&isNaN(1)?0:H/(1-j)))),n.n.d=0,n.a.b=h}function she(t,e,n){var r,s,o,h,d,v;for(this.g=t,d=e.d.length,v=n.d.length,this.d=Nt(l0,Yg,10,d+v,0,1),h=0;h0?lit(this,this.f/this.a):E1(e.g,e.d[0]).a!=null&&E1(n.g,n.d[0]).a!=null?lit(this,(Xt(E1(e.g,e.d[0]).a)+Xt(E1(n.g,n.d[0]).a))/2):E1(e.g,e.d[0]).a!=null?lit(this,E1(e.g,e.d[0]).a):E1(n.g,n.d[0]).a!=null&&lit(this,E1(n.g,n.d[0]).a)}function w4n(t,e){var n,r,s,o,h,d,v,k,C,M;for(t.a=new dXt(Ucn(XS)),r=new S(e.a);r.a=1&&(tt-h>0&&M>=0?(v.n.a+=K,v.n.b+=o*h):tt-h<0&&C>=0&&(v.n.a+=K*tt,v.n.b+=o));t.o.a=e.a,t.o.b=e.b,Jt(t,(Te(),$2),(Al(),r=u(Vf(rA),9),new sh(r,u(ff(r,r.length),9),0)))}function x4n(t,e,n,r,s,o){var h;if(!(e==null||!tst(e,nLt,rLt)))throw it(new Fn("invalid scheme: "+e));if(!t&&!(n!=null&&hd(n,Cu(35))==-1&&n.length>0&&(Rr(0,n.length),n.charCodeAt(0)!=47)))throw it(new Fn("invalid opaquePart: "+n));if(t&&!(e!=null&&yM(gU,e.toLowerCase()))&&!(n==null||!tst(n,oA,cA)))throw it(new Fn(S0e+n));if(t&&e!=null&&yM(gU,e.toLowerCase())&&!g0n(n))throw it(new Fn(S0e+n));if(!vhn(r))throw it(new Fn("invalid device: "+r));if(!hln(s))throw h=s==null?"invalid segments: null":"invalid segment: "+oln(s),it(new Fn(h));if(!(o==null||hd(o,Cu(35))==-1))throw it(new Fn("invalid query: "+o))}function k4n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt;for(vr(e,"Calculate Graph Size",1),e.n&&t&&gf(e,pf(t),(Sl(),Ql)),d=VE,v=VE,o=Ukt,h=Ukt,M=new nr((!t.a&&(t.a=new fe(rs,t,10,11)),t.a));M.e!=M.i.gc();)k=u(dr(M),33),G=k.i,K=k.j,gt=k.g,r=k.f,s=u(qe(k,(ui(),JO)),142),d=b.Math.min(d,G-s.b),v=b.Math.min(v,K-s.d),o=b.Math.max(o,G+gt+s.c),h=b.Math.max(h,K+r+s.a);for(H=u(qe(t,(ui(),U2)),116),j=new $e(d-H.b,v-H.d),C=new nr((!t.a&&(t.a=new fe(rs,t,10,11)),t.a));C.e!=C.i.gc();)k=u(dr(C),33),ku(k,k.i-j.a),Eu(k,k.j-j.b);tt=o-d+(H.b+H.c),n=h-v+(H.d+H.a),tv(t,tt),Jw(t,n),e.n&&t&&gf(e,pf(t),(Sl(),Ql))}function che(t){var e,n,r,s,o,h,d,v,k,C;for(r=new he,h=new S(t.e.a);h.a0){Kz(t,n,0),n.a+=String.fromCharCode(r),s=ofn(e,o),Kz(t,n,s),o+=s-1;continue}r==39?o+11)for(K=Nt(Cr,Xr,25,t.b.b.c.length,15,1),M=0,k=new S(t.b.b);k.a=d&&s<=v)d<=s&&o<=v?(n[C++]=s,n[C++]=o,r+=2):d<=s?(n[C++]=s,n[C++]=v,t.b[r]=v+1,h+=2):o<=v?(n[C++]=d,n[C++]=o,r+=2):(n[C++]=d,n[C++]=v,t.b[r]=v+1);else if(vsb)&&d<10);ubt(t.c,new W5),uhe(t),hnn(t.c),m4n(t.f)}function _4n(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt;if(je(Re(Q(n,(Te(),Hy)))))for(d=new S(n.j);d.a=2){for(v=ei(n,0),h=u(ti(v),8),d=u(ti(v),8);d.a0&&$D(k,!0,(ao(),Cf)),d.k==(Vn(),ks)&&NXt(k),ki(t.f,d,e)}}function M4n(t,e,n){var r,s,o,h,d,v,k,C,M,j;switch(vr(n,"Node promotion heuristic",1),t.g=e,N5n(t),t.q=u(Q(e,(Te(),oht)),260),C=u(Q(t.g,o9t),19).a,o=new pN,t.q.g){case 2:case 1:IE(t,o);break;case 3:for(t.q=(y4(),EG),IE(t,o),v=0,d=new S(t.a);d.at.j&&(t.q=FO,IE(t,o));break;case 4:for(t.q=(y4(),EG),IE(t,o),k=0,s=new S(t.b);s.at.k&&(t.q=NO,IE(t,o));break;case 6:j=ps(b.Math.ceil(t.f.length*C/100)),IE(t,new _p(j));break;case 5:M=ps(b.Math.ceil(t.d*C/100)),IE(t,new Hf(M));break;default:IE(t,o)}Evn(t,e),or(n)}function hhe(t,e,n){var r,s,o,h;this.j=t,this.e=_4t(t),this.o=this.j.e,this.i=!!this.o,this.p=this.i?u(Ne(n,Na(this.o).p),214):null,s=u(Q(t,(ae(),Vc)),21),this.g=s.Hc((oo(),vh)),this.b=new he,this.d=new Oie(this.e),h=u(Q(this.j,$6),230),this.q=cun(e,h,this.e),this.k=new PQt(this),o=A1(lt(ct(g2e,1),De,225,0,[this,this.d,this.k,this.q])),e==(ev(),RO)&&!je(Re(Q(t,(Te(),$y))))?(r=new A4t(this.e),o.c[o.c.length]=r,this.c=new rmt(r,h,u(this.q,402))):e==RO&&je(Re(Q(t,(Te(),$y))))?(r=new A4t(this.e),o.c[o.c.length]=r,this.c=new bne(r,h,u(this.q,402))):this.c=new gGt(e,this),le(o,this.c),Ule(o,this.e),this.s=fxn(this.k)}function D4n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt;for(M=u(xj((h=ei(new Lp(e).a.d,0),new Ex(h))),86),G=M?u(Q(M,(fc(),Rht)),86):null,s=1;M&&G;){for(v=0,Rt=0,n=M,r=G,d=0;d=t.i?(++t.i,le(t.a,pe(1)),le(t.b,C)):(r=t.c[e.p][1],ch(t.a,k,pe(u(Ne(t.a,k),19).a+1-r)),ch(t.b,k,Xt(ye(Ne(t.b,k)))+C-r*t.e)),(t.q==(y4(),FO)&&(u(Ne(t.a,k),19).a>t.j||u(Ne(t.a,k-1),19).a>t.j)||t.q==NO&&(Xt(ye(Ne(t.b,k)))>t.k||Xt(ye(Ne(t.b,k-1)))>t.k))&&(v=!1),h=new ar(lr(jo(e).a.Kc(),new z));zr(h);)o=u(Mr(h),17),d=o.c.i,t.f[d.p]==k&&(M=fhe(t,d),s=s+u(M.a,19).a,v=v&&je(Re(M.b)));return t.f[e.p]=k,s=s+t.c[e.p][0],new fa(pe(s),(Nn(),!!v))}function Txt(t,e,n,r,s){var o,h,d,v,k,C,M,j,H,G,K,tt,gt;for(M=new _r,h=new he,Poe(t,n,t.d.fg(),h,M),Poe(t,r,t.d.gg(),h,M),t.b=.2*(K=Ece(Wo(new Tn(null,new _n(h,16)),new eZ)),tt=Ece(Wo(new Tn(null,new _n(h,16)),new nZ)),b.Math.min(K,tt)),o=0,d=0;d=2&&(gt=Gce(h,!0,j),!t.e&&(t.e=new K$t(t)),ufn(t.e,gt,h,t.b)),Cae(h,j),W4n(h),H=-1,C=new S(h);C.ad)}function O4n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K;for(n=u(Q(t,(Te(),cs)),98),h=t.f,o=t.d,d=h.a+o.b+o.c,v=0-o.d-t.c.b,C=h.b+o.d+o.a-t.c.b,k=new he,M=new he,s=new S(e);s.a0),u(C.a.Xb(C.c=--C.b),17));o!=r&&C.b>0;)t.a[o.p]=!0,t.a[r.p]=!0,o=(Zn(C.b>0),u(C.a.Xb(C.c=--C.b),17));C.b>0&&Cl(C)}}function bhe(t,e,n){var r,s,o,h,d,v,k,C,M;if(t.a!=e.Aj())throw it(new Fn(QE+e.ne()+Cv));if(r=$g(($u(),ya),e).$k(),r)return r.Aj().Nh().Ih(r,n);if(h=$g(ya,e).al(),h){if(n==null)return null;if(d=u(n,15),d.dc())return"";for(M=new Ag,o=d.Kc();o.Ob();)s=o.Pb(),go(M,h.Aj().Nh().Ih(h,s)),M.a+=" ";return int(M,M.a.length-1)}if(C=$g(ya,e).bl(),!C.dc()){for(k=C.Kc();k.Ob();)if(v=u(k.Pb(),148),v.wj(n))try{if(M=v.Aj().Nh().Ih(v,n),M!=null)return M}catch(j){if(j=Wi(j),!_t(j,102))throw it(j)}throw it(new Fn("Invalid value: '"+n+"' for datatype :"+e.ne()))}return u(e,834).Fj(),n==null?null:_t(n,172)?""+u(n,172).a:ol(n)==tV?VUt(aA[0],u(n,199)):$o(n)}function j4n(t){var e,n,r,s,o,h,d,v,k,C;for(k=new Zi,d=new Zi,o=new S(t);o.a-1){for(s=ei(d,0);s.b!=s.d.c;)r=u(ti(s),128),r.v=h;for(;d.b!=0;)for(r=u(Dst(d,0),128),n=new S(r.i);n.a0&&(n+=v.n.a+v.o.a/2,++M),G=new S(v.j);G.a0&&(n/=M),gt=Nt(aa,vo,25,r.a.c.length,15,1),d=0,k=new S(r.a);k.a=d&&s<=v)d<=s&&o<=v?r+=2:d<=s?(t.b[r]=v+1,h+=2):o<=v?(n[C++]=s,n[C++]=d-1,r+=2):(n[C++]=s,n[C++]=d-1,t.b[r]=v+1,h+=2);else if(v0?s-=864e5:s+=864e5,v=new X2t(Pa(Tu(e.q.getTime()),s))),C=new Im,k=t.a.length,o=0;o=97&&r<=122||r>=65&&r<=90){for(h=o+1;h=k)throw it(new Fn("Missing trailing '"));h+10&&n.c==0&&(!e&&(e=new he),e.c[e.c.length]=n);if(e)for(;e.c.length!=0;){if(n=u(Fg(e,0),233),n.b&&n.b.c.length>0){for(o=(!n.b&&(n.b=new he),new S(n.b));o.aRo(t,n,0))return new fa(s,n)}else if(Xt(E1(s.g,s.d[0]).a)>Xt(E1(n.g,n.d[0]).a))return new fa(s,n)}for(d=(!n.e&&(n.e=new he),n.e).Kc();d.Ob();)h=u(d.Pb(),233),v=(!h.b&&(h.b=new he),h.b),Km(0,v.c.length),XC(v.c,0,n),h.c==v.c.length&&(e.c[e.c.length]=h)}return null}function xhe(t,e){var n,r,s,o,h,d,v,k,C;if(t==null)return _u;if(v=e.a.zc(t,e),v!=null)return"[...]";for(n=new f2(Ya,"[","]"),s=t,o=0,h=s.length;o=14&&C<=16))?e.a._b(r)?(n.a?Gr(n.a,n.b):n.a=new Ol(n.d),h9(n.a,"[...]")):(d=u2(r),k=new E9(e),$0(n,xhe(d,k))):_t(r,177)?$0(n,Npn(u(r,177))):_t(r,190)?$0(n,C0n(u(r,190))):_t(r,195)?$0(n,Fgn(u(r,195))):_t(r,2012)?$0(n,_0n(u(r,2012))):_t(r,48)?$0(n,Fpn(u(r,48))):_t(r,364)?$0(n,Kpn(u(r,364))):_t(r,832)?$0(n,Ppn(u(r,832))):_t(r,104)&&$0(n,Opn(u(r,104))):$0(n,r==null?_u:$o(r));return n.a?n.e.length==0?n.a.a:n.a.a+(""+n.e):n.c}function khe(t,e,n,r){var s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St;for(d=x4(e,!1,!1),gt=lI(d),r&&(gt=qD(gt)),St=Xt(ye(qe(e,(o_(),Qut)))),tt=(Zn(gt.b!=0),u(gt.a.a.c,8)),M=u(Zf(gt,1),8),gt.b>2?(C=new he,Ls(C,new Qd(gt,1,gt.b)),o=efe(C,St+t.a),Mt=new nat(o),Mo(Mt,e),n.c[n.c.length]=Mt):r?Mt=u(tr(t.b,e0(e)),266):Mt=u(tr(t.b,tb(e)),266),v=e0(e),r&&(v=tb(e)),h=epn(tt,v),k=St+t.a,h.a?(k+=b.Math.abs(tt.b-M.b),K=new $e(M.a,(M.b+tt.b)/2)):(k+=b.Math.abs(tt.a-M.a),K=new $e((M.a+tt.a)/2,M.b)),r?ki(t.d,e,new K3t(Mt,h,K,k)):ki(t.c,e,new K3t(Mt,h,K,k)),ki(t.b,e,Mt),G=(!e.n&&(e.n=new fe(qo,e,1,7)),e.n),H=new nr(G);H.e!=H.i.gc();)j=u(dr(H),137),s=xI(t,j,!0,0,0),n.c[n.c.length]=s}function W4n(t){var e,n,r,s,o,h,d,v,k,C;for(k=new he,d=new he,h=new S(t);h.a-1){for(o=new S(d);o.a0)&&(aR(v,b.Math.min(v.o,s.o-1)),TC(v,v.i-1),v.i==0&&(d.c[d.c.length]=v))}}function PE(t,e,n){var r,s,o,h,d,v,k;if(k=t.c,!e&&(e=oLt),t.c=e,t.Db&4&&!(t.Db&1)&&(v=new Js(t,1,2,k,t.c),n?n.Ei(v):n=v),k!=e){if(_t(t.Cb,284))t.Db>>16==-10?n=u(t.Cb,284).nk(e,n):t.Db>>16==-15&&(!e&&(e=(dn(),W1)),!k&&(k=(dn(),W1)),t.Cb.nh()&&(v=new z0(t.Cb,1,13,k,e,Hg(al(u(t.Cb,59)),t),!1),n?n.Ei(v):n=v));else if(_t(t.Cb,88))t.Db>>16==-23&&(_t(e,88)||(e=(dn(),Kh)),_t(k,88)||(k=(dn(),Kh)),t.Cb.nh()&&(v=new z0(t.Cb,1,10,k,e,Hg(Lc(u(t.Cb,26)),t),!1),n?n.Ei(v):n=v));else if(_t(t.Cb,444))for(d=u(t.Cb,836),h=(!d.b&&(d.b=new mR(new aet)),d.b),o=(r=new p2(new Cg(h.a).a),new yR(r));o.a.b;)s=u(Zw(o.a).cd(),87),n=PE(s,vq(s,d),n)}return n}function Y4n(t,e){var n,r,s,o,h,d,v,k,C,M,j;for(h=je(Re(qe(t,(Te(),Hy)))),j=u(qe(t,Gy),21),v=!1,k=!1,M=new nr((!t.c&&(t.c=new fe(gl,t,9,9)),t.c));M.e!=M.i.gc()&&(!v||!k);){for(o=u(dr(M),118),d=0,s=zp(D1(lt(ct(j1,1),De,20,0,[(!o.d&&(o.d=new Cn(Ys,o,8,5)),o.d),(!o.e&&(o.e=new Cn(Ys,o,7,4)),o.e)])));zr(s)&&(r=u(Mr(s),79),C=h&&fv(r)&&je(Re(qe(r,j2))),n=Jle((!r.b&&(r.b=new Cn(br,r,4,7)),r.b),o)?t==es(Do(u(At((!r.c&&(r.c=new Cn(br,r,5,8)),r.c),0),82))):t==es(Do(u(At((!r.b&&(r.b=new Cn(br,r,4,7)),r.b),0),82))),!((C||n)&&(++d,d>1))););(d>0||j.Hc((Zu(),sg))&&(!o.n&&(o.n=new fe(qo,o,1,7)),o.n).i>0)&&(v=!0),d>1&&(k=!0)}v&&e.Fc((oo(),vh)),k&&e.Fc((oo(),yS))}function Ehe(t){var e,n,r,s,o,h,d,v,k,C,M,j;if(j=u(qe(t,(ui(),G2)),21),j.dc())return null;if(d=0,h=0,j.Hc((Al(),oP))){for(C=u(qe(t,KS),98),r=2,n=2,s=2,o=2,e=es(t)?u(qe(es(t),qv),103):u(qe(t,qv),103),k=new nr((!t.c&&(t.c=new fe(gl,t,9,9)),t.c));k.e!=k.i.gc();)if(v=u(dr(k),118),M=u(qe(v,u5),61),M==(ve(),Zo)&&(M=uxt(v,e),wo(v,u5,M)),C==(ua(),Gc))switch(M.g){case 1:r=b.Math.max(r,v.i+v.g);break;case 2:n=b.Math.max(n,v.j+v.f);break;case 3:s=b.Math.max(s,v.i+v.g);break;case 4:o=b.Math.max(o,v.j+v.f)}else switch(M.g){case 1:r+=v.g+2;break;case 2:n+=v.f+2;break;case 3:s+=v.g+2;break;case 4:o+=v.f+2}d=b.Math.max(r,s),h=b.Math.max(n,o)}return wv(t,d,h,!0,!0)}function Rat(t,e,n,r,s){var o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt;for(Mt=u(Bl(ez(Ri(new Tn(null,new _n(e.d,16)),new t8(n)),new lM(n)),c2(new ke,new ce,new Xn,lt(ct(fl,1),oe,132,0,[(O1(),Ul)]))),15),M=wi,C=Sa,v=new S(e.b.j);v.a0,k?k&&(j=gt.p,h?++j:--j,M=u(Ne(gt.c.a,j),10),r=gre(M),H=!(cat(r,ue,n[0])||UKt(r,ue,n[0]))):H=!0),G=!1,Kt=e.D.i,Kt&&Kt.c&&d.e&&(C=h&&Kt.p>0||!h&&Kt.p0&&(e.a+=Ya),Nq(u(dr(d),160),e);for(e.a+=Uot,v=new Nx((!r.c&&(r.c=new Cn(br,r,5,8)),r.c));v.e!=v.i.gc();)v.e>0&&(e.a+=Ya),Nq(u(dr(v),160),e);e.a+=")"}}function t5n(t,e,n){var r,s,o,h,d,v,k,C,M,j,H;if(o=u(Q(t,(ae(),_i)),79),!!o){for(r=t.a,s=new xo(n),Li(s,Vdn(t)),J8(t.d.i,t.c.i)?(j=t.c,M=Yo(lt(ct(Ws,1),ee,8,0,[j.n,j.a])),ia(M,n)):M=_1(t.c),fs(r,M,r.a,r.a.a),H=_1(t.d),Q(t,Qlt)!=null&&Li(H,u(Q(t,Qlt),8)),fs(r,H,r.c.b,r.c),ny(r,s),h=x4(o,!0,!0),uz(h,u(At((!o.b&&(o.b=new Cn(br,o,4,7)),o.b),0),82)),lz(h,u(At((!o.c&&(o.c=new Cn(br,o,5,8)),o.c),0),82)),CI(r,h),C=new S(t.b);C.a=0){for(v=null,d=new da(C.a,k+1);d.bh?1:Iw(isNaN(0),isNaN(h)))<0&&(wf(_d),(b.Math.abs(h-1)<=_d||h==1||isNaN(h)&&isNaN(1)?0:h<1?-1:h>1?1:Iw(isNaN(h),isNaN(1)))<0)&&(wf(_d),(b.Math.abs(0-d)<=_d||d==0||isNaN(0)&&isNaN(d)?0:0d?1:Iw(isNaN(0),isNaN(d)))<0)&&(wf(_d),(b.Math.abs(d-1)<=_d||d==1||isNaN(d)&&isNaN(1)?0:d<1?-1:d>1?1:Iw(isNaN(d),isNaN(1)))<0)),o)}function n5n(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue;for(M=new Svt(new Dt(t));M.b!=M.c.a.d;)for(C=Ate(M),d=u(C.d,56),e=u(C.e,56),h=d.Tg(),K=0,Rt=(h.i==null&&vd(h),h.i).length;K=0&&K=k.c.c.length?C=omt((Vn(),Os),ta):C=omt((Vn(),ta),ta),C*=2,o=n.a.g,n.a.g=b.Math.max(o,o+(C-o)),h=n.b.g,n.b.g=b.Math.max(h,h+(C-h)),s=e}}function s5n(t,e,n,r,s){var o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt;for(Kt=VYt(t),C=new he,d=t.c.length,M=d-1,j=d+1;Kt.a.c!=0;){for(;n.b!=0;)St=(Zn(n.b!=0),u(lh(n,n.a.a),112)),P9(Kt.a,St)!=null,St.g=M--,lxt(St,e,n,r);for(;e.b!=0;)Rt=(Zn(e.b!=0),u(lh(e,e.a.a),112)),P9(Kt.a,Rt)!=null,Rt.g=j++,lxt(Rt,e,n,r);for(k=Sa,gt=(h=new y9(new w9(new y(Kt.a).a).b),new g(h));TM(gt.a.a);){if(tt=(o=Lj(gt.a),u(o.cd(),112)),!r&&tt.b>0&&tt.a<=0){C.c=Nt(Qn,De,1,0,5,1),C.c[C.c.length]=tt;break}K=tt.i-tt.d,K>=k&&(K>k&&(C.c=Nt(Qn,De,1,0,5,1),k=K),C.c[C.c.length]=tt)}C.c.length!=0&&(v=u(Ne(C,Zz(s,C.c.length)),112),P9(Kt.a,v)!=null,v.g=j++,lxt(v,e,n,r),C.c=Nt(Qn,De,1,0,5,1))}for(Mt=t.c.length+1,G=new S(t);G.a0&&(j.d+=C.n.d,j.d+=C.d),j.a>0&&(j.a+=C.n.a,j.a+=C.d),j.b>0&&(j.b+=C.n.b,j.b+=C.d),j.c>0&&(j.c+=C.n.c,j.c+=C.d),j}function Che(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G;for(j=n.d,M=n.c,o=new $e(n.f.a+n.d.b+n.d.c,n.f.b+n.d.d+n.d.a),h=o.b,k=new S(t.a);k.a0&&(t.c[e.c.p][e.p].d+=ul(t.i,24)*$I*.07000000029802322-.03500000014901161,t.c[e.c.p][e.p].a=t.c[e.c.p][e.p].d/t.c[e.c.p][e.p].b)}}function d5n(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt;for(G=new S(t);G.ar.d,r.d=b.Math.max(r.d,e),d&&n&&(r.d=b.Math.max(r.d,r.a),r.a=r.d+s);break;case 3:n=e>r.a,r.a=b.Math.max(r.a,e),d&&n&&(r.a=b.Math.max(r.a,r.d),r.d=r.a+s);break;case 2:n=e>r.c,r.c=b.Math.max(r.c,e),d&&n&&(r.c=b.Math.max(r.b,r.c),r.b=r.c+s);break;case 4:n=e>r.b,r.b=b.Math.max(r.b,e),d&&n&&(r.b=b.Math.max(r.b,r.c),r.c=r.b+s)}}}function w5n(t){var e,n,r,s,o,h,d,v,k,C,M;for(k=new S(t);k.a0||C.j==Bn&&C.e.c.length-C.g.c.length<0)){e=!1;break}for(s=new S(C.g);s.a=k&&Kt>=tt&&(j+=G.n.b+K.n.b+K.a.b-Rt,++d));if(n)for(h=new S(Mt.e);h.a=k&&Kt>=tt&&(j+=G.n.b+K.n.b+K.a.b-Rt,++d))}d>0&&(ue+=j/d,++H)}H>0?(e.a=s*ue/H,e.g=H):(e.a=0,e.g=0)}function m5n(t,e){var n,r,s,o,h,d,v,k,C,M,j;for(s=new S(t.a.b);s.aCs||e.o==H2&&C0&&ku(gt,Rt*ue),Kt>0&&Eu(gt,Kt*_e);for(K9(t.b,new hw),e=new he,d=new p2(new Cg(t.c).a);d.b;)h=Zw(d),r=u(h.cd(),79),n=u(h.dd(),395).a,s=x4(r,!1,!1),M=_ae(e0(r),lI(s),n),CI(M,s),St=Rae(r),St&&Ro(e,St,0)==-1&&(e.c[e.c.length]=St,VXt(St,(Zn(M.b!=0),u(M.a.a.c,8)),n));for(tt=new p2(new Cg(t.d).a);tt.b;)K=Zw(tt),r=u(K.cd(),79),n=u(K.dd(),395).a,s=x4(r,!1,!1),M=_ae(tb(r),qD(lI(s)),n),M=qD(M),CI(M,s),St=jae(r),St&&Ro(e,St,0)==-1&&(e.c[e.c.length]=St,VXt(St,(Zn(M.b!=0),u(M.c.b.c,8)),n))}function Ahe(t,e,n,r){var s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e;if(n.c.length!=0){for(H=new he,j=new S(n);j.a1)for(H=new vxt(G,St,r),va(St,new xGt(t,H)),h.c[h.c.length]=H,M=St.a.ec().Kc();M.Ob();)C=u(M.Pb(),46),mu(o,C.b);if(d.a.gc()>1)for(H=new vxt(G,d,r),va(d,new kGt(t,H)),h.c[h.c.length]=H,M=d.a.ec().Kc();M.Ob();)C=u(M.Pb(),46),mu(o,C.b)}}function Mhe(t){Mw(t,new k2(MR(_w(Ew(Cw(Tw(new kg,Sd),"ELK Radial"),'A radial layout provider which is based on the algorithm of Peter Eades published in "Drawing free trees.", published by International Institute for Advanced Study of Social Information Science, Fujitsu Limited in 1991. The radial layouter takes a tree and places the nodes in radial order around the root. The nodes of the same tree level are placed on the same radius.'),new dZ),Sd))),xe(t,Sd,yH,Ie(Qye)),xe(t,Sd,Cy,Ie(Zye)),xe(t,Sd,D4,Ie(Wye)),xe(t,Sd,C6,Ie(Yye)),xe(t,Sd,T6,Ie(Kye)),xe(t,Sd,UE,Ie(Uye)),xe(t,Sd,j_,Ie(L_t)),xe(t,Sd,WE,Ie(Xye)),xe(t,Sd,Pct,Ie(Wht)),xe(t,Sd,Oct,Ie(Yht)),xe(t,Sd,Zkt,Ie(M_t)),xe(t,Sd,Ykt,Ie(BG)),xe(t,Sd,Kkt,Ie(RG)),xe(t,Sd,Xkt,Ie(qO)),xe(t,Sd,Qkt,Ie(D_t))}function Sxt(t){var e;if(this.r=nrn(new bc,new Cc),this.b=new i_(u(Lr(Xa),290)),this.p=new i_(u(Lr(Xa),290)),this.i=new i_(u(Lr($pe),290)),this.e=t,this.o=new xo(t.rf()),this.D=t.Df()||je(Re(t.We((ui(),ZO)))),this.A=u(t.We((ui(),G2)),21),this.B=u(t.We(xb),21),this.q=u(t.We(KS),98),this.u=u(t.We(Qy),21),!ugn(this.u))throw it(new R3("Invalid port label placement: "+this.u));if(this.v=je(Re(t.We(uAt))),this.j=u(t.We(o5),21),!O2n(this.j))throw it(new R3("Invalid node label placement: "+this.j));this.n=u(l_(t,XSt),116),this.k=Xt(ye(l_(t,JG))),this.d=Xt(ye(l_(t,dAt))),this.w=Xt(ye(l_(t,vAt))),this.s=Xt(ye(l_(t,gAt))),this.t=Xt(ye(l_(t,pAt))),this.C=u(l_(t,bAt),142),this.c=2*this.d,e=!this.B.Hc((ll(),cP)),this.f=new a_(0,e,0),this.g=new a_(1,e,0),het(this.f,(Kf(),eu),this.g)}function A5n(t,e,n,r,s){var o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn;for(St=0,G=0,H=0,j=1,Mt=new nr((!t.a&&(t.a=new fe(rs,t,10,11)),t.a));Mt.e!=Mt.i.gc();)tt=u(dr(Mt),33),j+=j0(new ar(lr(K0(tt).a.Kc(),new z))),We=tt.g,G=b.Math.max(G,We),M=tt.f,H=b.Math.max(H,M),St+=We*M;for(K=(!t.a&&(t.a=new fe(rs,t,10,11)),t.a).i,h=St+2*r*r*j*K,o=b.Math.sqrt(h),v=b.Math.max(o*n,G),d=b.Math.max(o/n,H),gt=new nr((!t.a&&(t.a=new fe(rs,t,10,11)),t.a));gt.e!=gt.i.gc();)tt=u(dr(gt),33),Qe=s.b+(ul(e,26)*I_+ul(e,27)*O_)*(v-tt.g),Rn=s.b+(ul(e,26)*I_+ul(e,27)*O_)*(d-tt.f),ku(tt,Qe),Eu(tt,Rn);for(_e=v+(s.b+s.c),ue=d+(s.d+s.a),Kt=new nr((!t.a&&(t.a=new fe(rs,t,10,11)),t.a));Kt.e!=Kt.i.gc();)for(Rt=u(dr(Kt),33),C=new ar(lr(K0(Rt).a.Kc(),new z));zr(C);)k=u(Mr(C),79),w_(k)||Lxn(k,e,_e,ue);_e+=s.b+s.c,ue+=s.d+s.a,wv(t,_e,ue,!1,!0)}function Rq(t){var e,n,r,s,o,h,d,v,k,C,M;if(t==null)throw it(new ld(_u));if(k=t,o=t.length,v=!1,o>0&&(e=(Rr(0,t.length),t.charCodeAt(0)),(e==45||e==43)&&(t=t.substr(1),--o,v=e==45)),o==0)throw it(new ld(yv+k+'"'));for(;t.length>0&&(Rr(0,t.length),t.charCodeAt(0)==48);)t=t.substr(1),--o;if(o>(vle(),$ge)[10])throw it(new ld(yv+k+'"'));for(s=0;s0&&(M=-parseInt(t.substr(0,r),10),t=t.substr(r),o-=r,n=!1);o>=h;){if(r=parseInt(t.substr(0,h),10),t=t.substr(h),o-=h,n)n=!1;else{if(yc(M,d)<0)throw it(new ld(yv+k+'"'));M=_a(M,C)}M=Jp(M,r)}if(yc(M,0)>0)throw it(new ld(yv+k+'"'));if(!v&&(M=z8(M),yc(M,0)<0))throw it(new ld(yv+k+'"'));return M}function Axt(t,e){oKt();var n,r,s,o,h,d,v;if(this.a=new v2t(this),this.b=t,this.c=e,this.f=Xnt(To(($u(),ya),e)),this.f.dc())if((d=d4t(ya,t))==e)for(this.e=!0,this.d=new he,this.f=new Ok,this.f.Fc(O2),u(Pq(TD(ya,Rl(t)),""),26)==t&&this.f.Fc(C9(ya,Rl(t))),s=vat(ya,t).Kc();s.Ob();)switch(r=u(s.Pb(),170),Hw(To(ya,r))){case 4:{this.d.Fc(r);break}case 5:{this.f.Gc(Xnt(To(ya,r)));break}}else if(to(),u(e,66).Oj())for(this.e=!0,this.f=null,this.d=new he,h=0,v=(t.i==null&&vd(t),t.i).length;h=0&&h0&&(u(po(t.b,e),124).a.b=n)}function L5n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt;for(vr(e,"Comment pre-processing",1),n=0,v=new S(t.a);v.a0&&(v=(Rr(0,e.length),e.charCodeAt(0)),v!=64)){if(v==37&&(M=e.lastIndexOf("%"),k=!1,M!=0&&(M==j-1||(k=(Rr(M+1,e.length),e.charCodeAt(M+1)==46))))){if(h=e.substr(1,M-1),St=hn("%",h)?null:Mxt(h),r=0,k)try{r=ql(e.substr(M+2),Sa,wi)}catch(Rt){throw Rt=Wi(Rt),_t(Rt,127)?(d=Rt,it(new W$(d))):it(Rt)}for(tt=lyt(t.Wg());tt.Ob();)if(G=kz(tt),_t(G,510)&&(s=u(G,590),Mt=s.d,(St==null?Mt==null:hn(St,Mt))&&r--==0))return s;return null}if(C=e.lastIndexOf("."),H=C==-1?e:e.substr(0,C),n=0,C!=-1)try{n=ql(e.substr(C+1),Sa,wi)}catch(Rt){if(Rt=Wi(Rt),_t(Rt,127))H=e;else throw it(Rt)}for(H=hn("%",H)?null:Mxt(H),K=lyt(t.Wg());K.Ob();)if(G=kz(K),_t(G,191)&&(o=u(G,191),gt=o.ne(),(H==null?gt==null:hn(H,gt))&&n--==0))return o;return null}return ehe(t,e)}function I5n(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn;for(ue=new he,G=new S(t.b);G.a=e.length)return{done:!0};var s=e[r++];return{value:[s,n.get(s)],done:!1}}}},Bvn()||(t.prototype.createObject=function(){return{}},t.prototype.get=function(e){return this.obj[":"+e]},t.prototype.set=function(e,n){this.obj[":"+e]=n},t.prototype[kot]=function(e){delete this.obj[":"+e]},t.prototype.keys=function(){var e=[];for(var n in this.obj)n.charCodeAt(0)==58&&e.push(n.substring(1));return e}),t}function P5n(t){cxt();var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt;if(t==null)return null;if(M=t.length*8,M==0)return"";for(d=M%24,H=M/24|0,j=d!=0?H+1:H,o=null,o=Nt(xh,yd,25,j*4,15,1),k=0,C=0,e=0,n=0,r=0,h=0,s=0,v=0;v>24,k=(e&3)<<24>>24,G=e&-128?(e>>2^192)<<24>>24:e>>2<<24>>24,K=n&-128?(n>>4^240)<<24>>24:n>>4<<24>>24,tt=r&-128?(r>>6^252)<<24>>24:r>>6<<24>>24,o[h++]=lp[G],o[h++]=lp[K|k<<4],o[h++]=lp[C<<2|tt],o[h++]=lp[r&63];return d==8?(e=t[s],k=(e&3)<<24>>24,G=e&-128?(e>>2^192)<<24>>24:e>>2<<24>>24,o[h++]=lp[G],o[h++]=lp[k<<4],o[h++]=61,o[h++]=61):d==16&&(e=t[s],n=t[s+1],C=(n&15)<<24>>24,k=(e&3)<<24>>24,G=e&-128?(e>>2^192)<<24>>24:e>>2<<24>>24,K=n&-128?(n>>4^240)<<24>>24:n>>4<<24>>24,o[h++]=lp[G],o[h++]=lp[K|k<<4],o[h++]=lp[C<<2],o[h++]=61),Mh(o,0,o.length)}function F5n(t,e){var n,r,s,o,h,d,v;if(t.e==0&&t.p>0&&(t.p=-(t.p-1)),t.p>Sa&&umt(e,t.p-ab),h=e.q.getDate(),oD(e,1),t.k>=0&&win(e,t.k),t.c>=0?oD(e,t.c):t.k>=0?(v=new Myt(e.q.getFullYear()-ab,e.q.getMonth(),35),r=35-v.q.getDate(),oD(e,b.Math.min(r,h))):oD(e,h),t.f<0&&(t.f=e.q.getHours()),t.b>0&&t.f<12&&(t.f+=12),AQe(e,t.f==24&&t.g?0:t.f),t.j>=0&&Aan(e,t.j),t.n>=0&&Uan(e,t.n),t.i>=0&&aUt(e,Pa(_a(aI(Tu(e.q.getTime()),Wg),Wg),t.i)),t.a&&(s=new BR,umt(s,s.q.getFullYear()-ab-80),Cet(Tu(e.q.getTime()),Tu(s.q.getTime()))&&umt(e,s.q.getFullYear()-ab+100)),t.d>=0){if(t.c==-1)n=(7+t.d-e.q.getDay())%7,n>3&&(n-=7),d=e.q.getMonth(),oD(e,e.q.getDate()+n),e.q.getMonth()!=d&&oD(e,e.q.getDate()+(n>0?-7:7));else if(e.q.getDay()!=t.d)return!1}return t.o>Sa&&(o=e.q.getTimezoneOffset(),aUt(e,Pa(Tu(e.q.getTime()),(t.o-o)*60*Wg))),!0}function Ohe(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt;if(s=Q(e,(ae(),_i)),!!_t(s,239)){for(G=u(s,33),K=e.e,j=new xo(e.c),o=e.d,j.a+=o.b,j.b+=o.d,Rt=u(qe(G,(Te(),pG)),174),Nu(Rt,(ll(),nU))&&(H=u(qe(G,d9t),116),cpt(H,o.a),Mtt(H,o.d),upt(H,o.b),gpt(H,o.c)),n=new he,C=new S(e.a);C.a0&&le(t.p,C),le(t.o,C);e-=r,H=v+e,k+=e*t.e,ch(t.a,d,pe(H)),ch(t.b,d,k),t.j=b.Math.max(t.j,H),t.k=b.Math.max(t.k,k),t.d+=e,e+=K}}function ve(){ve=Z;var t;Zo=new NM(N_,0),Pn=new NM(Kq,1),Hn=new NM(Iot,2),mr=new NM(Oot,3),Bn=new NM(Pot,4),U1=(wn(),new s8((t=u(Vf(Xa),9),new sh(t,u(ff(t,t.length),9),0)))),Mf=jg(ji(Pn,lt(ct(Xa,1),xc,61,0,[]))),mh=jg(ji(Hn,lt(ct(Xa,1),xc,61,0,[]))),Kl=jg(ji(mr,lt(ct(Xa,1),xc,61,0,[]))),Vh=jg(ji(Bn,lt(ct(Xa,1),xc,61,0,[]))),Au=jg(ji(Pn,lt(ct(Xa,1),xc,61,0,[mr]))),lu=jg(ji(Hn,lt(ct(Xa,1),xc,61,0,[Bn]))),Df=jg(ji(Pn,lt(ct(Xa,1),xc,61,0,[Bn]))),el=jg(ji(Pn,lt(ct(Xa,1),xc,61,0,[Hn]))),Xl=jg(ji(mr,lt(ct(Xa,1),xc,61,0,[Bn]))),yh=jg(ji(Hn,lt(ct(Xa,1),xc,61,0,[mr]))),nl=jg(ji(Pn,lt(ct(Xa,1),xc,61,0,[Hn,Bn]))),Su=jg(ji(Hn,lt(ct(Xa,1),xc,61,0,[mr,Bn]))),Lu=jg(ji(Pn,lt(ct(Xa,1),xc,61,0,[mr,Bn]))),Vu=jg(ji(Pn,lt(ct(Xa,1),xc,61,0,[Hn,mr]))),Uc=jg(ji(Pn,lt(ct(Xa,1),xc,61,0,[Hn,mr,Bn])))}function Bhe(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St;if(e.b!=0){for(H=new Zi,d=null,G=null,r=ps(b.Math.floor(b.Math.log(e.b)*b.Math.LOG10E)+1),v=0,St=ei(e,0);St.b!=St.d.c;)for(gt=u(ti(St),86),Vt(G)!==Vt(Q(gt,(fc(),zS)))&&(G=Br(Q(gt,zS)),v=0),G!=null?d=G+iZt(v++,r):d=iZt(v++,r),Jt(gt,zS,d),tt=(s=ei(new Lp(gt).a.d,0),new Ex(s));OR(tt.a);)K=u(ti(tt.a),188).c,fs(H,K,H.c.b,H.c),Jt(K,zS,d);for(j=new _r,h=0;h=v){Zn(gt.b>0),gt.a.Xb(gt.c=--gt.b);break}else K.a>k&&(s?(Ls(s.b,K.b),s.a=b.Math.max(s.a,K.a),Cl(gt)):(le(K.b,M),K.c=b.Math.min(K.c,k),K.a=b.Math.max(K.a,v),s=K));s||(s=new kqt,s.c=k,s.a=v,zm(gt,s),le(s.b,M))}for(d=e.b,C=0,tt=new S(r);tt.ad?1:0:(t.b&&(t.b._b(o)&&(s=u(t.b.xc(o),19).a),t.b._b(v)&&(d=u(t.b.xc(v),19).a)),sd?1:0)):e.e.c.length!=0&&n.g.c.length!=0?1:-1}function j5n(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e;for(vr(e,S1e,1),K=new he,ue=new he,k=new S(t.b);k.a0&&(St-=H),mxt(h,St),C=0,j=new S(h.a);j.a0),d.a.Xb(d.c=--d.b)),v=.4*r*C,!o&&d.be.d.c){if(H=t.c[e.a.d],tt=t.c[M.a.d],H==tt)continue;yf(lf(uf(hf(cf(new Ch,1),100),H),tt))}}}}}function Mxt(t){Fat();var e,n,r,s,o,h,d,v;if(t==null)return null;if(s=hd(t,Cu(37)),s<0)return t;for(v=new Ol(t.substr(0,s)),e=Nt(Gu,N4,25,4,15,1),d=0,r=0,h=t.length;ss+2&&Sit((Rr(s+1,t.length),t.charCodeAt(s+1)),tLt,eLt)&&Sit((Rr(s+2,t.length),t.charCodeAt(s+2)),tLt,eLt))if(n=fen((Rr(s+1,t.length),t.charCodeAt(s+1)),(Rr(s+2,t.length),t.charCodeAt(s+2))),s+=2,r>0?(n&192)==128?e[d++]=n<<24>>24:r=0:n>=128&&((n&224)==192?(e[d++]=n<<24>>24,r=2):(n&240)==224?(e[d++]=n<<24>>24,r=3):(n&248)==240&&(e[d++]=n<<24>>24,r=4)),r>0){if(d==r){switch(d){case 2:{qp(v,((e[0]&31)<<6|e[1]&63)&ys);break}case 3:{qp(v,((e[0]&15)<<12|(e[1]&63)<<6|e[2]&63)&ys);break}}d=0,r=0}}else{for(o=0;o0){if(h+r>t.length)return!1;d=gq(t.substr(0,h+r),e)}else d=gq(t,e);switch(o){case 71:return d=w4(t,h,lt(ct(Ae,1),ee,2,6,[mfe,yfe]),e),s.e=d,!0;case 77:return _vn(t,e,s,d,h);case 76:return Svn(t,e,s,d,h);case 69:return vpn(t,e,h,s);case 99:return mpn(t,e,h,s);case 97:return d=w4(t,h,lt(ct(Ae,1),ee,2,6,["AM","PM"]),e),s.b=d,!0;case 121:return Avn(t,e,h,d,n,s);case 100:return d<=0?!1:(s.c=d,!0);case 83:return d<0?!1:Ihn(d,h,e[0],s);case 104:d==12&&(d=0);case 75:case 72:return d<0?!1:(s.f=d,s.g=!1,!0);case 107:return d<0?!1:(s.f=d,s.g=!0,!0);case 109:return d<0?!1:(s.j=d,!0);case 115:return d<0?!1:(s.n=d,!0);case 90:if(hue&&(G.c=ue-G.b),le(h.d,new Hnt(G,a3t(h,G))),Mt=e==Pn?b.Math.max(Mt,K.b+k.b.rf().b):b.Math.min(Mt,K.b));for(Mt+=e==Pn?t.t:-t.t,St=k3t((h.e=Mt,h)),St>0&&(u(po(t.b,e),124).a.b=St),C=j.Kc();C.Ob();)k=u(C.Pb(),111),!(!k.c||k.c.d.c.length<=0)&&(G=k.c.i,G.c-=k.e.a,G.d-=k.e.b)}function U5n(t){var e,n,r,s,o,h,d,v,k,C,M,j,H;for(e=new _r,v=new nr(t);v.e!=v.i.gc();){for(d=u(dr(v),33),n=new Hs,ki(Jut,d,n),H=new bm,s=u(Bl(new Tn(null,new jw(new ar(lr(wI(d).a.Kc(),new z)))),LKt(H,c2(new ke,new ce,new Xn,lt(ct(fl,1),oe,132,0,[(O1(),Ul)])))),83),Zee(n,u(s.xc((Nn(),!0)),14),new Ek),r=u(Bl(Ri(u(s.xc(!1),15).Lc(),new E3),c2(new ke,new ce,new Xn,lt(ct(fl,1),oe,132,0,[Ul]))),15),h=r.Kc();h.Ob();)o=u(h.Pb(),79),j=Rae(o),j&&(k=u(ec(Lo(e.f,j)),21),k||(k=iue(j),au(e.f,j,k)),Ua(n,k));for(s=u(Bl(new Tn(null,new jw(new ar(lr(K0(d).a.Kc(),new z)))),LKt(H,c2(new ke,new ce,new Xn,lt(ct(fl,1),oe,132,0,[Ul])))),83),Zee(n,u(s.xc(!0),14),new Il),r=u(Bl(Ri(u(s.xc(!1),15).Lc(),new L0),c2(new ke,new ce,new Xn,lt(ct(fl,1),oe,132,0,[Ul]))),15),M=r.Kc();M.Ob();)C=u(M.Pb(),79),j=jae(C),j&&(k=u(ec(Lo(e.f,j)),21),k||(k=iue(j),au(e.f,j,k)),Ua(n,k))}}function W5n(t,e){Lat();var n,r,s,o,h,d,v,k,C,M,j,H,G,K;if(v=yc(t,0)<0,v&&(t=z8(t)),yc(t,0)==0)switch(e){case 0:return"0";case 1:return $E;case 2:return"0.00";case 3:return"0.000";case 4:return"0.0000";case 5:return"0.00000";case 6:return"0.000000";default:return H=new Mp,e<0?H.a+="0E+":H.a+="0E",H.a+=e==Sa?"2147483648":""+-e,H.a}C=18,M=Nt(xh,yd,25,C+1,15,1),n=C,K=t;do k=K,K=aI(K,10),M[--n]=Ar(Pa(48,Jp(k,_a(K,10))))&ys;while(yc(K,0)!=0);if(s=Jp(Jp(Jp(C,n),e),1),e==0)return v&&(M[--n]=45),Mh(M,n,C-n);if(e>0&&yc(s,-6)>=0){if(yc(s,0)>=0){for(o=n+Ar(s),d=C-1;d>=o;d--)M[d+1]=M[d];return M[++o]=46,v&&(M[--n]=45),Mh(M,n,C-n+1)}for(h=2;Cet(h,Pa(z8(s),1));h++)M[--n]=48;return M[--n]=46,M[--n]=48,v&&(M[--n]=45),Mh(M,n,C-n)}return G=n+1,r=C,j=new Im,v&&(j.a+="-"),r-G>=1?(qp(j,M[n]),j.a+=".",j.a+=Mh(M,n+1,C-n-1)):j.a+=Mh(M,n,C-n),j.a+="E",yc(s,0)>0&&(j.a+="+"),j.a+=""+_9(s),j.a}function Y5n(t,e,n){var r,s,o,h,d,v,k,C,M,j,H;if(t.e.a.$b(),t.f.a.$b(),t.c.c=Nt(Qn,De,1,0,5,1),t.i.c=Nt(Qn,De,1,0,5,1),t.g.a.$b(),e)for(h=new S(e.a);h.a=1&&(Kt-k>0&&G>=0?(ku(M,M.i+Rt),Eu(M,M.j+v*k)):Kt-k<0&&H>=0&&(ku(M,M.i+Rt*Kt),Eu(M,M.j+v)));return wo(t,(ui(),G2),(Al(),o=u(Vf(rA),9),new sh(o,u(ff(o,o.length),9),0))),new $e(ue,C)}function $he(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G;if(H=es(Do(u(At((!t.b&&(t.b=new Cn(br,t,4,7)),t.b),0),82))),G=es(Do(u(At((!t.c&&(t.c=new Cn(br,t,5,8)),t.c),0),82))),M=H==G,d=new Ca,e=u(qe(t,(Sz(),_At)),74),e&&e.b>=2){if((!t.a&&(t.a=new fe(Ji,t,6,6)),t.a).i==0)n=(Sw(),s=new ad,s),Dr((!t.a&&(t.a=new fe(Ji,t,6,6)),t.a),n);else if((!t.a&&(t.a=new fe(Ji,t,6,6)),t.a).i>1)for(j=new Nx((!t.a&&(t.a=new fe(Ji,t,6,6)),t.a));j.e!=j.i.gc();)f_(j);CI(e,u(At((!t.a&&(t.a=new fe(Ji,t,6,6)),t.a),0),202))}if(M)for(r=new nr((!t.a&&(t.a=new fe(Ji,t,6,6)),t.a));r.e!=r.i.gc();)for(n=u(dr(r),202),k=new nr((!n.a&&(n.a=new As(Gh,n,5)),n.a));k.e!=k.i.gc();)v=u(dr(k),469),d.a=b.Math.max(d.a,v.a),d.b=b.Math.max(d.b,v.b);for(h=new nr((!t.n&&(t.n=new fe(qo,t,1,7)),t.n));h.e!=h.i.gc();)o=u(dr(h),137),C=u(qe(o,QS),8),C&&x1(o,C.a,C.b),M&&(d.a=b.Math.max(d.a,o.i+o.g),d.b=b.Math.max(d.b,o.j+o.f));return d}function K5n(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We;for(St=e.c.length,s=new E4(t.a,n,null,null),We=Nt(aa,vo,25,St,15,1),K=Nt(aa,vo,25,St,15,1),G=Nt(aa,vo,25,St,15,1),tt=0,d=0;dWe[v]&&(tt=v),M=new S(t.a.b);M.aH&&(o&&(Zb(ue,j),Zb(We,pe(k.b-1))),pi=n.b,js+=j+e,j=0,C=b.Math.max(C,n.b+n.c+hr)),ku(d,pi),Eu(d,js),C=b.Math.max(C,pi+hr+n.c),j=b.Math.max(j,M),pi+=hr+e;if(C=b.Math.max(C,r),zn=js+j+n.a,znEd,Qe=b.Math.abs(j.b-G.b)>Ed,(!n&&We&&Qe||n&&(We||Qe))&&ri(tt.a,Rt)),Ua(tt.a,r),r.b==0?j=Rt:j=(Zn(r.b!=0),u(r.c.b.c,8)),dun(H,M,K),Lne(s)==_e&&(Na(_e.i)!=s.a&&(K=new Ca,Y4t(K,Na(_e.i),Mt)),Jt(tt,Qlt,K)),Bgn(H,tt,Mt),C.a.zc(H,C);Oa(tt,Kt),oa(tt,_e)}for(k=C.a.ec().Kc();k.Ob();)v=u(k.Pb(),17),Oa(v,null),oa(v,null);or(e)}function zhe(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt;if(t.gc()==1)return u(t.Xb(0),231);if(t.gc()<=0)return new B$;for(s=t.Kc();s.Ob();){for(n=u(s.Pb(),231),G=0,C=wi,M=wi,v=Sa,k=Sa,H=new S(n.e);H.ad&&(St=0,Rt+=h+gt,h=0),Fmn(K,n,St,Rt),e=b.Math.max(e,St+tt.a),h=b.Math.max(h,tt.b),St+=tt.a+gt;return K}function qhe(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G;switch(C=new Pu,t.a.g){case 3:j=u(Q(e.e,(ae(),R2)),15),H=u(Q(e.j,R2),15),G=u(Q(e.f,R2),15),n=u(Q(e.e,Z4),15),r=u(Q(e.j,Z4),15),s=u(Q(e.f,Z4),15),h=new he,Ls(h,j),H.Jc(new cQ),Ls(h,_t(H,152)?Zx(u(H,152)):_t(H,131)?u(H,131).a:_t(H,54)?new kw(H):new Om(H)),Ls(h,G),o=new he,Ls(o,n),Ls(o,_t(r,152)?Zx(u(r,152)):_t(r,131)?u(r,131).a:_t(r,54)?new kw(r):new Om(r)),Ls(o,s),Jt(e.f,R2,h),Jt(e.f,Z4,o),Jt(e.f,hCt,e.f),Jt(e.e,R2,null),Jt(e.e,Z4,null),Jt(e.j,R2,null),Jt(e.j,Z4,null);break;case 1:Ua(C,e.e.a),ri(C,e.i.n),Ua(C,l2(e.j.a)),ri(C,e.a.n),Ua(C,e.f.a);break;default:Ua(C,e.e.a),Ua(C,l2(e.j.a)),Ua(C,e.f.a)}Ah(e.f.a),Ua(e.f.a,C),Oa(e.f,e.e.c),d=u(Q(e.e,(Te(),So)),74),k=u(Q(e.j,So),74),v=u(Q(e.f,So),74),(d||k||v)&&(M=new Pu,wvt(M,v),wvt(M,k),wvt(M,d),Jt(e.f,So,M)),Oa(e.j,null),oa(e.j,null),Oa(e.e,null),oa(e.e,null),Eo(e.a,null),Eo(e.i,null),e.g&&qhe(t,e.g)}function J5n(t){cxt();var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt;if(t==null||(o=K$(t),G=$ln(o),G%4!=0))return null;if(K=G/4|0,K==0)return Nt(Gu,N4,25,0,15,1);for(M=null,e=0,n=0,r=0,s=0,h=0,d=0,v=0,k=0,H=0,j=0,C=0,M=Nt(Gu,N4,25,K*3,15,1);H>4)<<24>>24,M[j++]=((n&15)<<4|r>>2&15)<<24>>24,M[j++]=(r<<6|s)<<24>>24}return!vM(h=o[C++])||!vM(d=o[C++])?null:(e=Y1[h],n=Y1[d],v=o[C++],k=o[C++],Y1[v]==-1||Y1[k]==-1?v==61&&k==61?n&15?null:(tt=Nt(Gu,N4,25,H*3+1,15,1),Dc(M,0,tt,0,H*3),tt[j]=(e<<2|n>>4)<<24>>24,tt):v!=61&&k==61?(r=Y1[v],r&3?null:(tt=Nt(Gu,N4,25,H*3+2,15,1),Dc(M,0,tt,0,H*3),tt[j++]=(e<<2|n>>4)<<24>>24,tt[j]=((n&15)<<4|r>>2&15)<<24>>24,tt)):null:(r=Y1[v],s=Y1[k],M[j++]=(e<<2|n>>4)<<24>>24,M[j++]=((n&15)<<4|r>>2&15)<<24>>24,M[j++]=(r<<6|s)<<24>>24,M))}function txn(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt;for(vr(e,S1e,1),G=u(Q(t,(Te(),eg)),218),s=new S(t.b);s.a=2){for(K=!0,j=new S(o.j),n=u(J(j),11),H=null;j.a0&&(s=u(Ne(tt.c.a,ue-1),10),h=t.i[s.p],We=b.Math.ceil(W3(t.n,s,tt)),o=Kt.a.e-tt.d.d-(h.a.e+s.o.b+s.d.a)-We),k=as,ue0&&_e.a.e.e-_e.a.a-(_e.b.e.e-_e.b.a)<0,G=St.a.e.e-St.a.a-(St.b.e.e-St.b.a)<0&&_e.a.e.e-_e.a.a-(_e.b.e.e-_e.b.a)>0,H=St.a.e.e+St.b.a<_e.b.e.e+_e.a.a,j=St.a.e.e+St.b.a>_e.b.e.e+_e.a.a,Rt=0,!K&&!G&&(j?o+M>0?Rt=M:k-r>0&&(Rt=r):H&&(o+d>0?Rt=d:k-Mt>0&&(Rt=Mt))),Kt.a.e+=Rt,Kt.b&&(Kt.d.e+=Rt),!1))}function Vhe(t,e,n){var r,s,o,h,d,v,k,C,M,j;if(r=new ah(e.qf().a,e.qf().b,e.rf().a,e.rf().b),s=new Fx,t.c)for(h=new S(e.wf());h.ak&&(r.a+=KUt(Nt(xh,yd,25,-k,15,1))),r.a+="Is",hd(v,Cu(32))>=0)for(s=0;s=r.o.b/2}else Mt=!M;Mt?(gt=u(Q(r,(ae(),z6)),15),gt?j?o=gt:(s=u(Q(r,N6),15),s?gt.gc()<=s.gc()?o=gt:o=s:(o=new he,Jt(r,N6,o))):(o=new he,Jt(r,z6,o))):(s=u(Q(r,(ae(),N6)),15),s?M?o=s:(gt=u(Q(r,z6),15),gt?s.gc()<=gt.gc()?o=s:o=gt:(o=new he,Jt(r,z6,o))):(o=new he,Jt(r,N6,o))),o.Fc(t),Jt(t,(ae(),ZV),n),e.d==n?(oa(e,null),n.e.c.length+n.g.c.length==0&&Uo(n,null),Yun(n)):(Oa(e,null),n.e.c.length+n.g.c.length==0&&Uo(n,null)),Ah(e.a)}function ixn(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn,hr,pi;for(Mt=new da(t.b,0),C=e.Kc(),G=0,k=u(C.Pb(),19).a,Kt=0,n=new Hs,_e=new O0;Mt.b=t.a&&(r=Hyn(t,Mt),C=b.Math.max(C,r.b),Rt=b.Math.max(Rt,r.d),le(d,new fa(Mt,r)));for(We=new he,k=0;k0),tt.a.Xb(tt.c=--tt.b),Qe=new Sh(t.b),zm(tt,Qe),Zn(tt.b0?(k=0,tt&&(k+=d),k+=(Qe-1)*h,St&&(k+=d),We&&St&&(k=b.Math.max(k,qwn(St,h,Mt,_e))),k0){for(j=C<100?null:new Dp(C),k=new gyt(e),G=k.g,gt=Nt(Cr,Xr,25,C,15,1),r=0,Rt=new Qw(C),s=0;s=0;)if(H!=null?yi(H,G[v]):Vt(H)===Vt(G[v])){gt.length<=r&&(tt=gt,gt=Nt(Cr,Xr,25,2*gt.length,15,1),Dc(tt,0,gt,0,r)),gt[r++]=s,Dr(Rt,G[v]);break t}if(H=H,Vt(H)===Vt(d))break}}if(k=Rt,G=Rt.g,C=r,r>gt.length&&(tt=gt,gt=Nt(Cr,Xr,25,r,15,1),Dc(tt,0,gt,0,r)),r>0){for(St=!0,o=0;o=0;)l6(t,gt[h]);if(r!=C){for(s=C;--s>=r;)l6(k,s);tt=gt,gt=Nt(Cr,Xr,25,r,15,1),Dc(tt,0,gt,0,r)}e=k}}}else for(e=$1n(t,e),s=t.i;--s>=0;)e.Hc(t.g[s])&&(l6(t,s),St=!0);if(St){if(gt!=null){for(n=e.gc(),M=n==1?F9(t,4,e.Kc().Pb(),null,gt[0],K):F9(t,6,e,gt,gt[0],K),j=n<100?null:new Dp(n),s=e.Kc();s.Ob();)H=s.Pb(),j=vwt(t,u(H,72),j);j?(j.Ei(M),j.Fi()):mi(t.e,M)}else{for(j=JZe(e.gc()),s=e.Kc();s.Ob();)H=s.Pb(),j=vwt(t,u(H,72),j);j&&j.Fi()}return!0}else return!1}function uxn(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St;for(n=new vse(e),n.a||Umn(e),k=Wvn(e),v=new Uw,tt=new fue,K=new S(e.a);K.a0||n.o==H1&&s0?(M=u(Ne(j.c.a,h-1),10),We=W3(t.b,j,M),tt=j.n.b-j.d.d-(M.n.b+M.o.b+M.d.a+We)):tt=j.n.b-j.d.d,k=b.Math.min(tt,k),hh?LE(t,e,n):LE(t,n,e),sh?1:0}return r=u(Q(e,(ae(),Tc)),19).a,o=u(Q(n,Tc),19).a,r>o?LE(t,e,n):LE(t,n,e),ro?1:0}function Dxt(t,e,n,r){var s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt;if(je(Re(qe(e,(ui(),QG)))))return wn(),wn(),io;if(k=(!e.a&&(e.a=new fe(rs,e,10,11)),e.a).i!=0,M=Qpn(e),C=!M.dc(),k||C){if(s=u(qe(e,O7),149),!s)throw it(new R3("Resolved algorithm is not set; apply a LayoutAlgorithmResolver before computing layout."));if(Mt=t2t(s,(CE(),lU)),Jie(e),!k&&C&&!Mt)return wn(),wn(),io;if(v=new he,Vt(qe(e,s5))===Vt((G0(),sp))&&(t2t(s,cU)||t2t(s,oU)))for(H=Fue(t,e),G=new Zi,Ua(G,(!e.a&&(e.a=new fe(rs,e,10,11)),e.a));G.b!=0;)j=u(G.b==0?null:(Zn(G.b!=0),lh(G,G.a.a)),33),Jie(j),gt=Vt(qe(j,s5))===Vt(ZS),gt||o2(j,YS)&&!gmt(s,qe(j,O7))?(d=Dxt(t,j,n,r),Ls(v,d),wo(j,s5,ZS),Zue(j)):Ua(G,(!j.a&&(j.a=new fe(rs,j,10,11)),j.a));else for(H=(!e.a&&(e.a=new fe(rs,e,10,11)),e.a).i,h=new nr((!e.a&&(e.a=new fe(rs,e,10,11)),e.a));h.e!=h.i.gc();)o=u(dr(h),33),d=Dxt(t,o,n,r),Ls(v,d),Zue(o);for(tt=new S(v);tt.a=0?H=a6(d):H=YD(a6(d)),t.Ye(C7,H)),k=new Ca,j=!1,t.Xe(Rv)?(H2t(k,u(t.We(Rv),8)),j=!0):RQe(k,h.a/2,h.b/2),H.g){case 4:Jt(C,uu,(dh(),bb)),Jt(C,tG,(d2(),U4)),C.o.b=h.b,K<0&&(C.o.a=-K),Bs(M,(ve(),Hn)),j||(k.a=h.a),k.a-=h.a;break;case 2:Jt(C,uu,(dh(),jy)),Jt(C,tG,(d2(),w7)),C.o.b=h.b,K<0&&(C.o.a=-K),Bs(M,(ve(),Bn)),j||(k.a=0);break;case 1:Jt(C,B2,(q0(),Y4)),C.o.a=h.a,K<0&&(C.o.b=-K),Bs(M,(ve(),mr)),j||(k.b=h.b),k.b-=h.b;break;case 3:Jt(C,B2,(q0(),F6)),C.o.a=h.a,K<0&&(C.o.b=-K),Bs(M,(ve(),Pn)),j||(k.b=0)}if(H2t(M.n,k),Jt(C,Rv,k),e==Y2||e==g0||e==Gc){if(G=0,e==Y2&&t.Xe(tp))switch(H.g){case 1:case 2:G=u(t.We(tp),19).a;break;case 3:case 4:G=-u(t.We(tp),19).a}else switch(H.g){case 4:case 2:G=o.b,e==g0&&(G/=s.b);break;case 1:case 3:G=o.a,e==g0&&(G/=s.a)}Jt(C,Fv,G)}return Jt(C,oc,H),C}function fxn(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe;if(n=Xt(ye(Q(t.a.j,(Te(),GCt)))),n<-1||!t.a.i||jx(u(Q(t.a.o,cs),98))||Ko(t.a.o,(ve(),Hn)).gc()<2&&Ko(t.a.o,Bn).gc()<2)return!0;if(t.a.c.Rf())return!1;for(Kt=0,Rt=0,St=new he,v=t.a.e,k=0,C=v.length;k=n}function dxn(){dbt();function t(r){var s=this;this.dispatch=function(o){var h=o.data;switch(h.cmd){case"algorithms":var d=x3t((wn(),new T(new v1(Ab.b))));r.postMessage({id:h.id,data:d});break;case"categories":var v=x3t((wn(),new T(new v1(Ab.c))));r.postMessage({id:h.id,data:v});break;case"options":var k=x3t((wn(),new T(new v1(Ab.d))));r.postMessage({id:h.id,data:k});break;case"register":y4n(h.algorithms),r.postMessage({id:h.id});break;case"layout":t3n(h.graph,h.layoutOptions||{},h.options||{}),r.postMessage({id:h.id,data:h.graph});break}},this.saveDispatch=function(o){try{s.dispatch(o)}catch(h){r.postMessage({id:o.data.id,error:h})}}}function e(r){var s=this;this.dispatcher=new t({postMessage:function(o){s.onmessage({data:o})}}),this.postMessage=function(o){setTimeout(function(){s.dispatcher.saveDispatch({data:o})},0)}}if(typeof document===_ot&&typeof self!==_ot){var n=new t(self);self.onmessage=n.saveDispatch}else typeof p!==_ot&&p.exports&&(Object.defineProperty(w,"__esModule",{value:!0}),p.exports={default:e,Worker:e})}function gxn(t){t.N||(t.N=!0,t.b=ic(t,0),ns(t.b,0),ns(t.b,1),ns(t.b,2),t.bb=ic(t,1),ns(t.bb,0),ns(t.bb,1),t.fb=ic(t,2),ns(t.fb,3),ns(t.fb,4),Fi(t.fb,5),t.qb=ic(t,3),ns(t.qb,0),Fi(t.qb,1),Fi(t.qb,2),ns(t.qb,3),ns(t.qb,4),Fi(t.qb,5),ns(t.qb,6),t.a=oi(t,4),t.c=oi(t,5),t.d=oi(t,6),t.e=oi(t,7),t.f=oi(t,8),t.g=oi(t,9),t.i=oi(t,10),t.j=oi(t,11),t.k=oi(t,12),t.n=oi(t,13),t.o=oi(t,14),t.p=oi(t,15),t.q=oi(t,16),t.s=oi(t,17),t.r=oi(t,18),t.t=oi(t,19),t.u=oi(t,20),t.v=oi(t,21),t.w=oi(t,22),t.B=oi(t,23),t.A=oi(t,24),t.C=oi(t,25),t.D=oi(t,26),t.F=oi(t,27),t.G=oi(t,28),t.H=oi(t,29),t.J=oi(t,30),t.I=oi(t,31),t.K=oi(t,32),t.M=oi(t,33),t.L=oi(t,34),t.P=oi(t,35),t.Q=oi(t,36),t.R=oi(t,37),t.S=oi(t,38),t.T=oi(t,39),t.U=oi(t,40),t.V=oi(t,41),t.X=oi(t,42),t.W=oi(t,43),t.Y=oi(t,44),t.Z=oi(t,45),t.$=oi(t,46),t._=oi(t,47),t.ab=oi(t,48),t.cb=oi(t,49),t.db=oi(t,50),t.eb=oi(t,51),t.gb=oi(t,52),t.hb=oi(t,53),t.ib=oi(t,54),t.jb=oi(t,55),t.kb=oi(t,56),t.lb=oi(t,57),t.mb=oi(t,58),t.nb=oi(t,59),t.ob=oi(t,60),t.pb=oi(t,61))}function pxn(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt;if(Mt=0,e.f.a==0)for(tt=new S(t);tt.ak&&(An(k,e.c.length),u(e.c[k],200)).a.c.length==0;)mu(e,(An(k,e.c.length),e.c[k]));if(!v){--o;continue}if(eyn(e,C,s,v,j,n,k,r)){M=!0;continue}if(j){if(c3n(e,C,s,v,n,k,r)){M=!0;continue}else if(Yyt(C,s)){s.c=!0,M=!0;continue}}else if(Yyt(C,s)){s.c=!0,M=!0;continue}if(M)continue}if(Yyt(C,s)){s.c=!0,M=!0,v&&(v.k=!1);continue}else nq(s.q)}return M}function zat(t,e,n,r,s,o,h){var d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn,hr,pi,js;for(K=0,Rn=0,k=new S(t.b);k.aK&&(o&&(Zb(ue,H),Zb(We,pe(C.b-1)),le(t.d,G),d.c=Nt(Qn,De,1,0,5,1)),pi=n.b,js+=H+e,H=0,M=b.Math.max(M,n.b+n.c+hr)),d.c[d.c.length]=v,hse(v,pi,js),M=b.Math.max(M,pi+hr+n.c),H=b.Math.max(H,j),pi+=hr+e,G=v;if(Ls(t.a,d),le(t.d,u(Ne(d,d.c.length-1),157)),M=b.Math.max(M,r),zn=js+H+n.a,zn1&&(h=b.Math.min(h,b.Math.abs(u(Zf(d.a,1),8).b-C.b)))));else for(K=new S(e.j);K.as&&(o=j.a-s,h=wi,r.c=Nt(Qn,De,1,0,5,1),s=j.a),j.a>=s&&(r.c[r.c.length]=d,d.a.b>1&&(h=b.Math.min(h,b.Math.abs(u(Zf(d.a,d.a.b-2),8).b-j.b)))));if(r.c.length!=0&&o>e.o.a/2&&h>e.o.b/2){for(H=new Mc,Uo(H,e),Bs(H,(ve(),Pn)),H.n.a=e.o.a/2,gt=new Mc,Uo(gt,e),Bs(gt,mr),gt.n.a=e.o.a/2,gt.n.b=e.o.b,v=new S(r);v.a=k.b?Oa(d,gt):Oa(d,H)):(k=u(hen(d.a),8),tt=d.a.b==0?_1(d.c):u(Aj(d.a),8),tt.b>=k.b?oa(d,gt):oa(d,H)),M=u(Q(d,(Te(),So)),74),M&&ay(M,k,!0);e.n.a=s-e.o.a/2}}function yxn(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn,hr,pi,js,Zl,Xh;if(Rn=null,hr=e,zn=ZZt(t,YZt(n),hr),G9(zn,R0(hr,Ad)),pi=u(n4(t.g,f6(B0(hr,Xct))),33),j=B0(hr,"sourcePort"),r=null,j&&(r=f6(j)),js=u(n4(t.j,r),118),!pi)throw d=pE(hr),G="An edge must have a source node (edge id: '"+d,K=G+JE,it(new ud(K));if(js&&!pd(T1(js),pi))throw v=R0(hr,Ad),tt="The source port of an edge must be a port of the edge's source node (edge id: '"+v,gt=tt+JE,it(new ud(gt));if(We=(!zn.b&&(zn.b=new Cn(br,zn,4,7)),zn.b),o=null,js?o=js:o=pi,Dr(We,o),Zl=u(n4(t.g,f6(B0(hr,M8t))),33),H=B0(hr,"targetPort"),s=null,H&&(s=f6(H)),Xh=u(n4(t.j,s),118),!Zl)throw M=pE(hr),Mt="An edge must have a target node (edge id: '"+M,St=Mt+JE,it(new ud(St));if(Xh&&!pd(T1(Xh),Zl))throw k=R0(hr,Ad),Rt="The target port of an edge must be a port of the edge's target node (edge id: '"+k,Kt=Rt+JE,it(new ud(Kt));if(Qe=(!zn.c&&(zn.c=new Cn(br,zn,5,8)),zn.c),h=null,Xh?h=Xh:h=Zl,Dr(Qe,h),(!zn.b&&(zn.b=new Cn(br,zn,4,7)),zn.b).i==0||(!zn.c&&(zn.c=new Cn(br,zn,5,8)),zn.c).i==0)throw C=R0(hr,Ad),ue=Vde+C,_e=ue+JE,it(new ud(_e));return lq(hr,zn),l2n(hr,zn),Rn=Lit(t,hr,zn),Rn}function Khe(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn;return M=Eyn(bu(t,(ve(),U1)),e),G=d4(bu(t,Mf),e),Rt=d4(bu(t,Kl),e),We=rq(bu(t,Vh),e),j=rq(bu(t,mh),e),Mt=d4(bu(t,Df),e),K=d4(bu(t,el),e),ue=d4(bu(t,Xl),e),Kt=d4(bu(t,yh),e),Qe=rq(bu(t,lu),e),gt=d4(bu(t,Au),e),St=d4(bu(t,nl),e),_e=d4(bu(t,Su),e),Rn=rq(bu(t,Lu),e),H=rq(bu(t,Vu),e),tt=d4(bu(t,Uc),e),n=s4(lt(ct(aa,1),vo,25,15,[Mt.a,We.a,ue.a,Rn.a])),r=s4(lt(ct(aa,1),vo,25,15,[G.a,M.a,Rt.a,tt.a])),s=gt.a,o=s4(lt(ct(aa,1),vo,25,15,[K.a,j.a,Kt.a,H.a])),k=s4(lt(ct(aa,1),vo,25,15,[Mt.b,G.b,K.b,St.b])),v=s4(lt(ct(aa,1),vo,25,15,[We.b,M.b,j.b,tt.b])),C=Qe.b,d=s4(lt(ct(aa,1),vo,25,15,[ue.b,Rt.b,Kt.b,_e.b])),Bg(bu(t,U1),n+s,k+C),Bg(bu(t,Uc),n+s,k+C),Bg(bu(t,Mf),n+s,0),Bg(bu(t,Kl),n+s,k+C+v),Bg(bu(t,Vh),0,k+C),Bg(bu(t,mh),n+s+r,k+C),Bg(bu(t,el),n+s+r,0),Bg(bu(t,Xl),0,k+C+v),Bg(bu(t,yh),n+s+r,k+C+v),Bg(bu(t,lu),0,k),Bg(bu(t,Au),n,0),Bg(bu(t,Su),0,k+C+v),Bg(bu(t,Vu),n+s+r,0),h=new Ca,h.a=s4(lt(ct(aa,1),vo,25,15,[n+r+s+o,Qe.a,St.a,_e.a])),h.b=s4(lt(ct(aa,1),vo,25,15,[k+v+C+d,gt.b,Rn.b,H.b])),h}function xxn(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt;for(K=new he,j=new S(t.d.b);j.as.d.d+s.d.a?C.f.d=!0:(C.f.d=!0,C.f.a=!0))),r.b!=r.d.c&&(e=n);C&&(o=u(tr(t.f,h.d.i),57),e.bo.d.d+o.d.a?C.f.d=!0:(C.f.d=!0,C.f.a=!0))}for(d=new ar(lr(jo(H).a.Kc(),new z));zr(d);)h=u(Mr(d),17),h.a.b!=0&&(e=u(Aj(h.a),8),h.d.j==(ve(),Pn)&&(tt=new T_(e,new $e(e.a,s.d.d),s,h),tt.f.a=!0,tt.a=h.d,K.c[K.c.length]=tt),h.d.j==mr&&(tt=new T_(e,new $e(e.a,s.d.d+s.d.a),s,h),tt.f.d=!0,tt.a=h.d,K.c[K.c.length]=tt))}return K}function kxn(t,e,n){var r,s,o,h,d,v,k,C,M;if(vr(n,"Network simplex node placement",1),t.e=e,t.n=u(Q(e,(ae(),Q4)),304),j3n(t),m0n(t),ls(Wo(new Tn(null,new _n(t.e.b,16)),new EQ),new q$t(t)),ls(Ri(Wo(Ri(Wo(new Tn(null,new _n(t.e.b,16)),new WT),new OQ),new PQ),new FQ),new z$t(t)),je(Re(Q(t.e,(Te(),SS))))&&(h=Rc(n,1),vr(h,"Straight Edges Pre-Processing",1),i5n(t),or(h)),t1n(t.f),o=u(Q(e,MS),19).a*t.f.a.c.length,mat(abt(obt(Mnt(t.f),o),!1),Rc(n,1)),t.d.a.gc()!=0){for(h=Rc(n,1),vr(h,"Flexible Where Space Processing",1),d=u(Nw(t$(wu(new Tn(null,new _n(t.f.a,16)),new TQ),new wQ)),19).a,v=u(Nw(Jj(wu(new Tn(null,new _n(t.f.a,16)),new CQ),new vQ)),19).a,k=v-d,C=Fw(new Xb,t.f),M=Fw(new Xb,t.f),yf(lf(uf(cf(hf(new Ch,2e4),k),C),M)),ls(Ri(Ri(Qnt(t.i),new _Q),new SQ),new jXt(d,C,k,M)),s=t.d.a.ec().Kc();s.Ob();)r=u(s.Pb(),213),r.g=1;mat(abt(obt(Mnt(t.f),o),!1),Rc(h,1)),or(h)}je(Re(Q(e,SS)))&&(h=Rc(n,1),vr(h,"Straight Edges Post-Processing",1),upn(t),or(h)),q4n(t),t.e=null,t.f=null,t.i=null,t.c=null,Xu(t.k),t.j=null,t.a=null,t.o=null,t.d.a.$b(),or(n)}function Exn(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt;for(d=new S(t.a.b);d.a0)if(r=M.gc(),k=ps(b.Math.floor((r+1)/2))-1,s=ps(b.Math.ceil((r+1)/2))-1,e.o==H1)for(C=s;C>=k;C--)e.a[Rt.p]==Rt&&(K=u(M.Xb(C),46),G=u(K.a,10),!I0(n,K.b)&&H>t.b.e[G.p]&&(e.a[G.p]=Rt,e.g[Rt.p]=e.g[G.p],e.a[Rt.p]=e.g[Rt.p],e.f[e.g[Rt.p].p]=(Nn(),!!(je(e.f[e.g[Rt.p].p])&Rt.k==(Vn(),ta))),H=t.b.e[G.p]));else for(C=k;C<=s;C++)e.a[Rt.p]==Rt&&(gt=u(M.Xb(C),46),tt=u(gt.a,10),!I0(n,gt.b)&&H=G&&(Mt>G&&(H.c=Nt(Qn,De,1,0,5,1),G=Mt),H.c[H.c.length]=h);H.c.length!=0&&(j=u(Ne(H,Zz(e,H.c.length)),128),zn.a.Bc(j)!=null,j.s=K++,A5t(j,Qe,ue),H.c=Nt(Qn,De,1,0,5,1))}for(Rt=t.c.length+1,d=new S(t);d.aRn.s&&(Cl(n),mu(Rn.i,r),r.c>0&&(r.a=Rn,le(Rn.t,r),r.b=_e,le(_e.i,r)))}function Ixt(t){var e,n,r,s,o;switch(e=t.c,e){case 11:return t.Ml();case 12:return t.Ol();case 14:return t.Ql();case 15:return t.Tl();case 16:return t.Rl();case 17:return t.Ul();case 21:return fi(t),gi(),gi(),pA;case 10:switch(t.a){case 65:return t.yl();case 90:return t.Dl();case 122:return t.Kl();case 98:return t.El();case 66:return t.zl();case 60:return t.Jl();case 62:return t.Hl()}}switch(o=vxn(t),e=t.c,e){case 3:return t.Zl(o);case 4:return t.Xl(o);case 5:return t.Yl(o);case 0:if(t.a==123&&t.d=48&&e<=57){for(r=e-48;s=48&&e<=57;)if(r=r*10+e-48,r<0)throw it(new Nr(qr((Pr(),N8t))))}else throw it(new Nr(qr((Pr(),v0e))));if(n=r,e==44){if(s>=t.j)throw it(new Nr(qr((Pr(),y0e))));if((e=wa(t.i,s++))>=48&&e<=57){for(n=e-48;s=48&&e<=57;)if(n=n*10+e-48,n<0)throw it(new Nr(qr((Pr(),N8t))));if(r>n)throw it(new Nr(qr((Pr(),x0e))))}else n=-1}if(e!=125)throw it(new Nr(qr((Pr(),m0e))));t.sl(s)?(o=(gi(),gi(),new Xm(9,o)),t.d=s+1):(o=(gi(),gi(),new Xm(3,o)),t.d=s),o.dm(r),o.cm(n),fi(t)}}return o}function Xhe(t,e,n,r,s){var o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn;for(K=new Xc(e.b),Rt=new Xc(e.b),j=new Xc(e.b),We=new Xc(e.b),tt=new Xc(e.b),_e=ei(e,0);_e.b!=_e.d.c;)for(Kt=u(ti(_e),11),d=new S(Kt.g);d.a0,gt=Kt.g.c.length>0,k&>?j.c[j.c.length]=Kt:k?K.c[K.c.length]=Kt:gt&&(Rt.c[Rt.c.length]=Kt);for(G=new S(K);G.a1)for(G=new Nx((!t.a&&(t.a=new fe(Ji,t,6,6)),t.a));G.e!=G.i.gc();)f_(G);for(h=u(At((!t.a&&(t.a=new fe(Ji,t,6,6)),t.a),0),202),tt=pi,pi>Kt+Rt?tt=Kt+Rt:piue+K?gt=ue+K:jsKt-Rt&&ttue-K&>pi+hr?We=pi+hr:Ktjs+_e?Qe=js+_e:uepi-hr&&Wejs-_e&&Qen&&(j=n-1),H=xP+ul(e,24)*$I*M-M/2,H<0?H=1:H>r&&(H=r-1),s=(Sw(),v=new xp,v),iz(s,j),sz(s,H),Dr((!h.a&&(h.a=new As(Gh,h,5)),h.a),s)}function Te(){Te=Z,lht=(ui(),p4e),y9t=b4e,OO=hAt,Tf=w4e,V6=fAt,jv=v4e,Wy=dAt,S7=gAt,A7=pAt,hht=JG,$v=W2,fht=m4e,LS=vAt,bG=K6,IO=(Fxt(),fve),J4=dve,q2=gve,t5=pve,Zve=new eo(ZG,pe(0)),_7=uve,m9t=lve,H6=hve,A9t=Bve,x9t=vve,k9t=xve,ght=Ave,E9t=Tve,T9t=_ve,wG=zve,pht=Rve,_9t=Ove,C9t=Dve,S9t=Fve,Bv=rve,AS=ive,sht=xwe,QCt=Ewe,g9t=new Ow(12),d9t=new eo(U2,g9t),YCt=(W0(),N7),eg=new eo(zSt,YCt),Vy=new eo(dl,0),Jve=new eo(Eft,pe(1)),rG=new eo(W6,GE),z2=QG,cs=KS,C7=u5,Gve=QO,Id=a4e,qy=s5,tme=new eo(Tft,(Nn(),!0)),Hy=ZO,j2=bft,$2=G2,pG=xb,uht=XG,WCt=(ao(),h0),Wl=new eo(qv,WCt),Nv=o5,dG=XSt,Gy=Qy,Qve=kft,w9t=uAt,b9t=(l4(),iP),new eo(iAt,b9t),Yve=vft,Kve=mft,Xve=yft,Wve=wft,dht=wve,c9t=Gwe,oht=Vwe,MS=bve,uu=Bwe,zy=dwe,_S=fwe,$y=J2e,VCt=twe,eht=iwe,DO=ewe,nht=lwe,u9t=Uwe,l9t=Wwe,r9t=Dwe,gG=ove,cht=Xwe,aht=_we,f9t=eve,XCt=mwe,iht=ywe,tht=YG,h9t=Ywe,sG=U2e,zCt=G2e,iG=V2e,t9t=Lwe,JCt=Awe,e9t=Mwe,E7=c5,So=a5,Jg=HSt,Od=pft,rht=gft,GCt=awe,tp=xft,CS=u4e,lG=l4e,Rv=aAt,p9t=h4e,T7=f4e,s9t=jwe,a9t=zwe,Uy=Y6,Zlt=H2e,o9t=Hwe,uG=bwe,cG=pwe,fG=JO,i9t=Pwe,SS=Zwe,PO=bAt,UCt=gwe,v9t=cve,KCt=wwe,Uve=Nwe,Vve=cwe,n9t=WSt,hG=Rwe,oG=uwe,wb=Z2e,HCt=X2e,aG=Y2e,qCt=K2e,Jlt=Q2e,q6=W2e,ZCt=Swe}function Hat(t,e){Lat();var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn,hr,pi;if(We=t.e,G=t.d,s=t.a,We==0)switch(e){case 0:return"0";case 1:return $E;case 2:return"0.00";case 3:return"0.000";case 4:return"0.0000";case 5:return"0.00000";case 6:return"0.000000";default:return ue=new Mp,e<0?ue.a+="0E+":ue.a+="0E",ue.a+=-e,ue.a}if(St=G*10+1+7,Rt=Nt(xh,yd,25,St+1,15,1),n=St,G==1)if(d=s[0],d<0){pi=Ns(d,co);do K=pi,pi=aI(pi,10),Rt[--n]=48+Ar(Jp(K,_a(pi,10)))&ys;while(yc(pi,0)!=0)}else{pi=d;do K=pi,pi=pi/10|0,Rt[--n]=48+(K-pi*10)&ys;while(pi!=0)}else{Rn=Nt(Cr,Xr,25,G,15,1),hr=G,Dc(s,0,Rn,0,hr);t:for(;;){for(_e=0,k=hr-1;k>=0;k--)zn=Pa(F0(_e,32),Ns(Rn[k],co)),gt=P0n(zn),Rn[k]=Ar(gt),_e=Ar($p(gt,32));Mt=Ar(_e),tt=n;do Rt[--n]=48+Mt%10&ys;while((Mt=Mt/10|0)!=0&&n!=0);for(r=9-tt+n,v=0;v0;v++)Rt[--n]=48;for(M=hr-1;Rn[M]==0;M--)if(M==0)break t;hr=M+1}for(;Rt[n]==48;)++n}if(H=We<0,h=St-n-e-1,e==0)return H&&(Rt[--n]=45),Mh(Rt,n,St-n);if(e>0&&h>=-6){if(h>=0){for(C=n+h,j=St-1;j>=C;j--)Rt[j+1]=Rt[j];return Rt[++C]=46,H&&(Rt[--n]=45),Mh(Rt,n,St-n+1)}for(M=2;M<-h+1;M++)Rt[--n]=48;return Rt[--n]=46,Rt[--n]=48,H&&(Rt[--n]=45),Mh(Rt,n,St-n)}return Qe=n+1,o=St,Kt=new Im,H&&(Kt.a+="-"),o-Qe>=1?(qp(Kt,Rt[n]),Kt.a+=".",Kt.a+=Mh(Rt,n+1,St-n-1)):Kt.a+=Mh(Rt,n,St-n),Kt.a+="E",h>0&&(Kt.a+="+"),Kt.a+=""+h,Kt.a}function Jhe(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue;switch(t.c=e,t.g=new _r,n=(Pm(),new Mm(t.c)),r=new er(n),p3t(r),St=Br(qe(t.c,(cI(),lSt))),v=u(qe(t.c,sft),316),Kt=u(qe(t.c,aft),429),h=u(qe(t.c,oSt),482),Rt=u(qe(t.c,ift),430),t.j=Xt(ye(qe(t.c,M3e))),d=t.a,v.g){case 0:d=t.a;break;case 1:d=t.b;break;case 2:d=t.i;break;case 3:d=t.e;break;case 4:d=t.f;break;default:throw it(new Fn(_H+(v.f!=null?v.f:""+v.g)))}if(t.d=new EQt(d,Kt,h),Jt(t.d,(Z8(),fS),Re(qe(t.c,A3e))),t.d.c=je(Re(qe(t.c,cSt))),p$(t.c).i==0)return t.d;for(M=new nr(p$(t.c));M.e!=M.i.gc();){for(C=u(dr(M),33),H=C.g/2,j=C.f/2,ue=new $e(C.i+H,C.j+j);Tl(t.g,ue);)jm(ue,(b.Math.random()-.5)*Ed,(b.Math.random()-.5)*Ed);K=u(qe(C,(ui(),JO)),142),tt=new $Qt(ue,new ah(ue.a-H-t.j/2-K.b,ue.b-j-t.j/2-K.d,C.g+t.j+(K.b+K.c),C.f+t.j+(K.d+K.a))),le(t.d.i,tt),ki(t.g,ue,new fa(tt,C))}switch(Rt.g){case 0:if(St==null)t.d.d=u(Ne(t.d.i,0),65);else for(Mt=new S(t.d.i);Mt.a1&&fs(C,gt,C.c.b,C.c),tz(s)));gt=Mt}return C}function Mxn(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn,hr,pi,js,Zl,Xh,K1;for(vr(n,"Greedy cycle removal",1),St=e.a,K1=St.c.length,t.a=Nt(Cr,Xr,25,K1,15,1),t.c=Nt(Cr,Xr,25,K1,15,1),t.b=Nt(Cr,Xr,25,K1,15,1),k=0,gt=new S(St);gt.a0?hr+1:1);for(h=new S(ue.g);h.a0?hr+1:1)}t.c[k]==0?ri(t.e,K):t.a[k]==0&&ri(t.f,K),++k}for(G=-1,H=1,M=new he,t.d=u(Q(e,(ae(),$6)),230);K1>0;){for(;t.e.b!=0;)js=u(Ont(t.e),10),t.b[js.p]=G--,ext(t,js),--K1;for(;t.f.b!=0;)Zl=u(Ont(t.f),10),t.b[Zl.p]=H++,ext(t,Zl),--K1;if(K1>0){for(j=Sa,Mt=new S(St);Mt.a=j&&(Rt>j&&(M.c=Nt(Qn,De,1,0,5,1),j=Rt),M.c[M.c.length]=K));C=t.Zf(M),t.b[C.p]=H++,ext(t,C),--K1}}for(pi=St.c.length+1,k=0;kt.b[Xh]&&(bv(r,!0),Jt(e,_O,(Nn(),!0)));t.a=null,t.c=null,t.b=null,Ah(t.f),Ah(t.e),or(n)}function efe(t,e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt;for(r=new he,d=new he,tt=e/2,H=t.gc(),s=u(t.Xb(0),8),gt=u(t.Xb(1),8),G=rat(s.a,s.b,gt.a,gt.b,tt),le(r,(An(0,G.c.length),u(G.c[0],8))),le(d,(An(1,G.c.length),u(G.c[1],8))),k=2;k=0;v--)ri(n,(An(v,h.c.length),u(h.c[v],8)));return n}function Dxn(t){var e,n,r,s,o,h,d,v,k,C,M,j,H;if(h=!0,M=null,r=null,s=null,e=!1,H=o5e,k=null,o=null,d=0,v=ust(t,d,nLt,rLt),v=0&&hn(t.substr(d,2),"//")?(d+=2,v=ust(t,d,oA,cA),r=t.substr(d,v-d),d=v):M!=null&&(d==t.length||(Rr(d,t.length),t.charCodeAt(d)!=47))&&(h=!1,v=O2t(t,Cu(35),d),v==-1&&(v=t.length),r=t.substr(d,v-d),d=v);if(!n&&d0&&wa(C,C.length-1)==58&&(s=C,d=v)),d=t.j){t.a=-1,t.c=1;return}if(e=wa(t.i,t.d++),t.a=e,t.b==1){switch(e){case 92:if(r=10,t.d>=t.j)throw it(new Nr(qr((Pr(),OH))));t.a=wa(t.i,t.d++);break;case 45:(t.e&512)==512&&t.d=t.j||wa(t.i,t.d)!=63)break;if(++t.d>=t.j)throw it(new Nr(qr((Pr(),out))));switch(e=wa(t.i,t.d++),e){case 58:r=13;break;case 61:r=14;break;case 33:r=15;break;case 91:r=19;break;case 62:r=18;break;case 60:if(t.d>=t.j)throw it(new Nr(qr((Pr(),out))));if(e=wa(t.i,t.d++),e==61)r=16;else if(e==33)r=17;else throw it(new Nr(qr((Pr(),t0e))));break;case 35:for(;t.d=t.j)throw it(new Nr(qr((Pr(),OH))));t.a=wa(t.i,t.d++);break;default:r=0}t.c=r}function Oxn(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn,hr;if(_e=u(Q(t,(Te(),cs)),98),_e!=(ua(),G1)&&_e!=Tb){for(G=t.b,H=G.c.length,C=new Xc((jl(H+2,Yat),J$(Pa(Pa(5,H+2),(H+2)/10|0)))),K=new Xc((jl(H+2,Yat),J$(Pa(Pa(5,H+2),(H+2)/10|0)))),le(C,new _r),le(C,new _r),le(K,new he),le(K,new he),ue=new he,e=0;e=Kt||!tfn(gt,r))&&(r=XQt(e,C)),Eo(gt,r),o=new ar(lr(jo(gt).a.Kc(),new z));zr(o);)s=u(Mr(o),17),!t.a[s.p]&&(K=s.c.i,--t.e[K.p],t.e[K.p]==0&&R8(xE(H,K)));for(k=C.c.length-1;k>=0;--k)le(e.b,(An(k,C.c.length),u(C.c[k],29)));e.a.c=Nt(Qn,De,1,0,5,1),or(n)}function nfe(t){var e,n,r,s,o,h,d,v,k;for(t.b=1,fi(t),e=null,t.c==0&&t.a==94?(fi(t),e=(gi(),gi(),new Nl(4)),jc(e,0,e7),d=new Nl(4)):d=(gi(),gi(),new Nl(4)),s=!0;(k=t.c)!=1;){if(k==0&&t.a==93&&!s){e&&(L_(e,d),d=e);break}if(n=t.a,r=!1,k==10)switch(n){case 100:case 68:case 119:case 87:case 115:case 83:yy(d,ME(n)),r=!0;break;case 105:case 73:case 99:case 67:n=(yy(d,ME(n)),-1),n<0&&(r=!0);break;case 112:case 80:if(v=u5t(t,n),!v)throw it(new Nr(qr((Pr(),cut))));yy(d,v),r=!0;break;default:n=H5t(t)}else if(k==24&&!s){if(e&&(L_(e,d),d=e),o=nfe(t),L_(d,o),t.c!=0||t.a!=93)throw it(new Nr(qr((Pr(),l0e))));break}if(fi(t),!r){if(k==0){if(n==91)throw it(new Nr(qr((Pr(),P8t))));if(n==93)throw it(new Nr(qr((Pr(),F8t))));if(n==45&&!s&&t.a!=93)throw it(new Nr(qr((Pr(),uut))))}if(t.c!=0||t.a!=45||n==45&&s)jc(d,n,n);else{if(fi(t),(k=t.c)==1)throw it(new Nr(qr((Pr(),PH))));if(k==0&&t.a==93)jc(d,n,n),jc(d,45,45);else{if(k==0&&t.a==93||k==24)throw it(new Nr(qr((Pr(),uut))));if(h=t.a,k==0){if(h==91)throw it(new Nr(qr((Pr(),P8t))));if(h==93)throw it(new Nr(qr((Pr(),F8t))));if(h==45)throw it(new Nr(qr((Pr(),uut))))}else k==10&&(h=H5t(t));if(fi(t),n>h)throw it(new Nr(qr((Pr(),d0e))));jc(d,n,h)}}}s=!1}if(t.c==1)throw it(new Nr(qr((Pr(),PH))));return v4(d),S_(d),t.b=0,fi(t),d}function Fxn(t){Ir(t.c,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#decimal"])),Ir(t.d,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#integer"])),Ir(t.e,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#boolean"])),Ir(t.f,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"EBoolean",ci,"EBoolean:Object"])),Ir(t.i,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#byte"])),Ir(t.g,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#hexBinary"])),Ir(t.j,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"EByte",ci,"EByte:Object"])),Ir(t.n,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"EChar",ci,"EChar:Object"])),Ir(t.t,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#double"])),Ir(t.u,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"EDouble",ci,"EDouble:Object"])),Ir(t.F,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#float"])),Ir(t.G,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"EFloat",ci,"EFloat:Object"])),Ir(t.I,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#int"])),Ir(t.J,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"EInt",ci,"EInt:Object"])),Ir(t.N,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#long"])),Ir(t.O,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"ELong",ci,"ELong:Object"])),Ir(t.Z,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#short"])),Ir(t.$,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"EShort",ci,"EShort:Object"])),Ir(t._,Yr,lt(ct(Ae,1),ee,2,6,[Aa,"http://www.w3.org/2001/XMLSchema#string"]))}function Nxn(t){var e,n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn,hr;if(t.c.length==1)return An(0,t.c.length),u(t.c[0],135);if(t.c.length<=0)return new j$;for(v=new S(t);v.aM&&(zn=0,hr+=C+_e,C=0),U2n(Kt,h,zn,hr),e=b.Math.max(e,zn+ue.a),C=b.Math.max(C,ue.b),zn+=ue.a+_e;for(Rt=new _r,n=new _r,Qe=new S(t);Qe.aiat(o))&&(M=o);for(!M&&(M=(An(0,tt.c.length),u(tt.c[0],180))),K=new S(e.b);K.a=-1900?1:0,n>=4?Gr(t,lt(ct(Ae,1),ee,2,6,[mfe,yfe])[d]):Gr(t,lt(ct(Ae,1),ee,2,6,["BC","AD"])[d]);break;case 121:Mfn(t,n,r);break;case 77:Pmn(t,n,r);break;case 107:v=s.q.getHours(),v==0?Jd(t,24,n):Jd(t,v,n);break;case 83:ewn(t,n,s);break;case 69:C=r.q.getDay(),n==5?Gr(t,lt(ct(Ae,1),ee,2,6,["S","M","T","W","T","F","S"])[C]):n==4?Gr(t,lt(ct(Ae,1),ee,2,6,[cot,uot,lot,hot,fot,dot,got])[C]):Gr(t,lt(ct(Ae,1),ee,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"])[C]);break;case 97:s.q.getHours()>=12&&s.q.getHours()<24?Gr(t,lt(ct(Ae,1),ee,2,6,["AM","PM"])[1]):Gr(t,lt(ct(Ae,1),ee,2,6,["AM","PM"])[0]);break;case 104:M=s.q.getHours()%12,M==0?Jd(t,12,n):Jd(t,M,n);break;case 75:j=s.q.getHours()%12,Jd(t,j,n);break;case 72:H=s.q.getHours(),Jd(t,H,n);break;case 99:G=r.q.getDay(),n==5?Gr(t,lt(ct(Ae,1),ee,2,6,["S","M","T","W","T","F","S"])[G]):n==4?Gr(t,lt(ct(Ae,1),ee,2,6,[cot,uot,lot,hot,fot,dot,got])[G]):n==3?Gr(t,lt(ct(Ae,1),ee,2,6,["Sun","Mon","Tue","Wed","Thu","Fri","Sat"])[G]):Jd(t,G,1);break;case 76:K=r.q.getMonth(),n==5?Gr(t,lt(ct(Ae,1),ee,2,6,["J","F","M","A","M","J","J","A","S","O","N","D"])[K]):n==4?Gr(t,lt(ct(Ae,1),ee,2,6,[Qat,Zat,Jat,tot,w6,eot,not,rot,iot,sot,aot,oot])[K]):n==3?Gr(t,lt(ct(Ae,1),ee,2,6,["Jan","Feb","Mar","Apr",w6,"Jun","Jul","Aug","Sep","Oct","Nov","Dec"])[K]):Jd(t,K+1,n);break;case 81:tt=r.q.getMonth()/3|0,n<4?Gr(t,lt(ct(Ae,1),ee,2,6,["Q1","Q2","Q3","Q4"])[tt]):Gr(t,lt(ct(Ae,1),ee,2,6,["1st quarter","2nd quarter","3rd quarter","4th quarter"])[tt]);break;case 100:gt=r.q.getDate(),Jd(t,gt,n);break;case 109:k=s.q.getMinutes(),Jd(t,k,n);break;case 115:h=s.q.getSeconds(),Jd(t,h,n);break;case 122:n<4?Gr(t,o.c[0]):Gr(t,o.c[1]);break;case 118:Gr(t,o.b);break;case 90:n<3?Gr(t,Vpn(o)):n==3?Gr(t,Wpn(o)):Gr(t,Ypn(o.a));break;default:return!1}return!0}function Pxt(t,e,n,r){var s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn,hr,pi;if(Hue(e),v=u(At((!e.b&&(e.b=new Cn(br,e,4,7)),e.b),0),82),C=u(At((!e.c&&(e.c=new Cn(br,e,5,8)),e.c),0),82),d=Do(v),k=Do(C),h=(!e.a&&(e.a=new fe(Ji,e,6,6)),e.a).i==0?null:u(At((!e.a&&(e.a=new fe(Ji,e,6,6)),e.a),0),202),_e=u(tr(t.a,d),10),zn=u(tr(t.a,k),10),We=null,hr=null,_t(v,186)&&(ue=u(tr(t.a,v),299),_t(ue,11)?We=u(ue,11):_t(ue,10)&&(_e=u(ue,10),We=u(Ne(_e.j,0),11))),_t(C,186)&&(Rn=u(tr(t.a,C),299),_t(Rn,11)?hr=u(Rn,11):_t(Rn,10)&&(zn=u(Rn,10),hr=u(Ne(zn.j,0),11))),!_e||!zn)throw it(new jC("The source or the target of edge "+e+" could not be found. This usually happens when an edge connects a node laid out by ELK Layered to a node in another level of hierarchy laid out by either another instance of ELK Layered or another layout algorithm alltogether. The former can be solved by setting the hierarchyHandling option to INCLUDE_CHILDREN."));for(K=new Vw,Mo(K,e),Jt(K,(ae(),_i),e),Jt(K,(Te(),So),null),H=u(Q(r,Vc),21),_e==zn&&H.Fc((oo(),xS)),We||(Kt=(so(),nu),Qe=null,h&&G3(u(Q(_e,cs),98))&&(Qe=new $e(h.j,h.k),JZt(Qe,cD(e)),LJt(Qe,n),ey(k,d)&&(Kt=tl,Li(Qe,_e.n))),We=zle(_e,Qe,Kt,r)),hr||(Kt=(so(),tl),pi=null,h&&G3(u(Q(zn,cs),98))&&(pi=new $e(h.b,h.c),JZt(pi,cD(e)),LJt(pi,n)),hr=zle(zn,pi,Kt,Na(zn))),Oa(K,We),oa(K,hr),(We.e.c.length>1||We.g.c.length>1||hr.e.c.length>1||hr.g.c.length>1)&&H.Fc((oo(),yS)),j=new nr((!e.n&&(e.n=new fe(qo,e,1,7)),e.n));j.e!=j.i.gc();)if(M=u(dr(j),137),!je(Re(qe(M,z2)))&&M.a)switch(tt=Vit(M),le(K.b,tt),u(Q(tt,Od),272).g){case 1:case 2:H.Fc((oo(),m7));break;case 0:H.Fc((oo(),v7)),Jt(tt,Od,(M1(),P7))}if(o=u(Q(r,_S),314),gt=u(Q(r,gG),315),s=o==(n6(),EO)||gt==(u_(),xht),h&&(!h.a&&(h.a=new As(Gh,h,5)),h.a).i!=0&&s){for(Mt=lI(h),G=new Pu,Rt=ei(Mt,0);Rt.b!=Rt.d.c;)St=u(ti(Rt),8),ri(G,new xo(St));Jt(K,aCt,G)}return K}function $xn(t){t.gb||(t.gb=!0,t.b=ic(t,0),ns(t.b,18),Fi(t.b,19),t.a=ic(t,1),ns(t.a,1),Fi(t.a,2),Fi(t.a,3),Fi(t.a,4),Fi(t.a,5),t.o=ic(t,2),ns(t.o,8),ns(t.o,9),Fi(t.o,10),Fi(t.o,11),Fi(t.o,12),Fi(t.o,13),Fi(t.o,14),Fi(t.o,15),Fi(t.o,16),Fi(t.o,17),Fi(t.o,18),Fi(t.o,19),Fi(t.o,20),Fi(t.o,21),Fi(t.o,22),Fi(t.o,23),Co(t.o),Co(t.o),Co(t.o),Co(t.o),Co(t.o),Co(t.o),Co(t.o),Co(t.o),Co(t.o),Co(t.o),t.p=ic(t,3),ns(t.p,2),ns(t.p,3),ns(t.p,4),ns(t.p,5),Fi(t.p,6),Fi(t.p,7),Co(t.p),Co(t.p),t.q=ic(t,4),ns(t.q,8),t.v=ic(t,5),Fi(t.v,9),Co(t.v),Co(t.v),Co(t.v),t.w=ic(t,6),ns(t.w,2),ns(t.w,3),ns(t.w,4),Fi(t.w,5),t.B=ic(t,7),Fi(t.B,1),Co(t.B),Co(t.B),Co(t.B),t.Q=ic(t,8),Fi(t.Q,0),Co(t.Q),t.R=ic(t,9),ns(t.R,1),t.S=ic(t,10),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),Co(t.S),t.T=ic(t,11),Fi(t.T,10),Fi(t.T,11),Fi(t.T,12),Fi(t.T,13),Fi(t.T,14),Co(t.T),Co(t.T),t.U=ic(t,12),ns(t.U,2),ns(t.U,3),Fi(t.U,4),Fi(t.U,5),Fi(t.U,6),Fi(t.U,7),Co(t.U),t.V=ic(t,13),Fi(t.V,10),t.W=ic(t,14),ns(t.W,18),ns(t.W,19),ns(t.W,20),Fi(t.W,21),Fi(t.W,22),Fi(t.W,23),t.bb=ic(t,15),ns(t.bb,10),ns(t.bb,11),ns(t.bb,12),ns(t.bb,13),ns(t.bb,14),ns(t.bb,15),ns(t.bb,16),Fi(t.bb,17),Co(t.bb),Co(t.bb),t.eb=ic(t,16),ns(t.eb,2),ns(t.eb,3),ns(t.eb,4),ns(t.eb,5),ns(t.eb,6),ns(t.eb,7),Fi(t.eb,8),Fi(t.eb,9),t.ab=ic(t,17),ns(t.ab,0),ns(t.ab,1),t.H=ic(t,18),Fi(t.H,0),Fi(t.H,1),Fi(t.H,2),Fi(t.H,3),Fi(t.H,4),Fi(t.H,5),Co(t.H),t.db=ic(t,19),Fi(t.db,2),t.c=oi(t,20),t.d=oi(t,21),t.e=oi(t,22),t.f=oi(t,23),t.i=oi(t,24),t.g=oi(t,25),t.j=oi(t,26),t.k=oi(t,27),t.n=oi(t,28),t.r=oi(t,29),t.s=oi(t,30),t.t=oi(t,31),t.u=oi(t,32),t.fb=oi(t,33),t.A=oi(t,34),t.C=oi(t,35),t.D=oi(t,36),t.F=oi(t,37),t.G=oi(t,38),t.I=oi(t,39),t.J=oi(t,40),t.L=oi(t,41),t.M=oi(t,42),t.N=oi(t,43),t.O=oi(t,44),t.P=oi(t,45),t.X=oi(t,46),t.Y=oi(t,47),t.Z=oi(t,48),t.$=oi(t,49),t._=oi(t,50),t.cb=oi(t,51),t.K=oi(t,52))}function ui(){ui=Z;var t,e;YS=new Vi(ude),O7=new Vi(lde),NSt=(t0(),uft),a4e=new mn(xkt,NSt),W6=new mn(E6,null),o4e=new Vi(p8t),RSt=(hy(),ji(fft,lt(ct(dft,1),oe,291,0,[hft]))),YG=new mn(mH,RSt),QO=new mn(JI,(Nn(),!1)),jSt=(ao(),h0),qv=new mn(Tkt,jSt),qSt=(W0(),Cft),zSt=new mn(QI,qSt),GSt=new mn(CH,!1),USt=(G0(),tU),s5=new mn(vH,USt),nAt=new Ow(12),U2=new mn(xv,nAt),KG=new mn(GI,!1),WSt=new mn(_ct,!1),tP=new mn(j_,!1),oAt=(ua(),Tb),KS=new mn(Got,oAt),Y6=new Vi(yH),ZG=new Vi(VI),Eft=new Vi(tH),Tft=new Vi(R_),YSt=new Pu,a5=new mn(Okt,YSt),u4e=new mn(Nkt,!1),l4e=new mn(Bkt,!1),KSt=new OC,JO=new mn(jkt,KSt),QG=new mn(mkt,!1),g4e=new mn(hde,1),new mn(fde,!0),pe(0),new mn(dde,pe(100)),new mn(gde,!1),pe(0),new mn(pde,pe(4e3)),pe(0),new mn(bde,pe(400)),new mn(wde,!1),new mn(vde,!1),new mn(mde,!0),new mn(yde,!1),BSt=(jz(),Lft),c4e=new mn(g8t,BSt),p4e=new mn(okt,10),b4e=new mn(ckt,10),hAt=new mn(jot,20),w4e=new mn(ukt,10),fAt=new mn(Vot,2),v4e=new mn(lkt,10),dAt=new mn(hkt,0),JG=new mn(gkt,5),gAt=new mn(fkt,1),pAt=new mn(dkt,1),W2=new mn(Cy,20),m4e=new mn(pkt,10),vAt=new mn(bkt,10),K6=new Vi(wkt),wAt=new CUt,bAt=new mn($kt,wAt),f4e=new Vi(Cct),rAt=!1,h4e=new mn(Tct,rAt),QSt=new Ow(5),XSt=new mn(Ckt,QSt),ZSt=(py(),e=u(Vf(lo),9),new sh(e,u(ff(e,e.length),9),0)),o5=new mn(UE,ZSt),sAt=(l4(),Eb),iAt=new mn(Akt,sAt),vft=new Vi(Lkt),mft=new Vi(Mkt),yft=new Vi(Dkt),wft=new Vi(Ikt),JSt=(t=u(Vf(rA),9),new sh(t,u(ff(t,t.length),9),0)),G2=new mn(D4,JSt),eAt=un((ll(),R7)),xb=new mn(T6,eAt),tAt=new $e(0,0),c5=new mn(C6,tAt),XG=new mn(Ect,!1),$St=(M1(),P7),pft=new mn(Pkt,$St),gft=new mn(eH,!1),pe(1),new mn(xde,null),aAt=new Vi(Rkt),xft=new Vi(Fkt),lAt=(ve(),Zo),u5=new mn(ykt,lAt),dl=new Vi(vkt),cAt=(Zu(),un(Cb)),Qy=new mn(WE,cAt),kft=new mn(_kt,!1),uAt=new mn(Skt,!0),ZO=new mn(kkt,!1),bft=new mn(Ekt,!1),HSt=new mn($ot,1),VSt=(hq(),Sft),new mn(kde,VSt),d4e=!0}function ae(){ae=Z;var t,e;_i=new Vi(w6t),nCt=new Vi("coordinateOrigin"),Klt=new Vi("processors"),eCt=new Ps("compoundNode",(Nn(),!1)),SO=new Ps("insideConnections",!1),aCt=new Vi("originalBendpoints"),oCt=new Vi("originalDummyNodePosition"),cCt=new Vi("originalLabelEdge"),LO=new Vi("representedLabels"),kS=new Vi("endLabels"),B6=new Vi("endLabel.origin"),j6=new Ps("labelSide",(zl(),rP)),K4=new Ps("maxEdgeThickness",0),q1=new Ps("reversed",!1),$6=new Vi(i1e),r1=new Ps("longEdgeSource",null),$h=new Ps("longEdgeTarget",null),Ry=new Ps("longEdgeHasLabelDummies",!1),AO=new Ps("longEdgeBeforeLabelDummy",!1),tG=new Ps("edgeConstraint",(d2(),Ilt)),Pv=new Vi("inLayerLayoutUnit"),B2=new Ps("inLayerConstraint",(q0(),CO)),R6=new Ps("inLayerSuccessorConstraint",new he),sCt=new Ps("inLayerSuccessorConstraintBetweenNonDummies",!1),Ju=new Vi("portDummy"),JV=new Ps("crossingHint",pe(0)),Vc=new Ps("graphProperties",(e=u(Vf(jlt),9),new sh(e,u(ff(e,e.length),9),0))),oc=new Ps("externalPortSide",(ve(),Zo)),iCt=new Ps("externalPortSize",new Ca),Vlt=new Vi("externalPortReplacedDummies"),eG=new Vi("externalPortReplacedDummy"),By=new Ps("externalPortConnections",(t=u(Vf(Xa),9),new sh(t,u(ff(t,t.length),9),0))),Fv=new Ps(Xfe,0),tCt=new Vi("barycenterAssociates"),z6=new Vi("TopSideComments"),N6=new Vi("BottomSideComments"),ZV=new Vi("CommentConnectionPort"),Ult=new Ps("inputCollect",!1),Ylt=new Ps("outputCollect",!1),_O=new Ps("cyclic",!1),rCt=new Vi("crossHierarchyMap"),Qlt=new Vi("targetOffset"),new Ps("splineLabelSize",new Ca),Q4=new Vi("spacings"),nG=new Ps("partitionConstraint",!1),Iv=new Vi("breakingPoint.info"),hCt=new Vi("splines.survivingEdge"),R2=new Vi("splines.route.start"),Z4=new Vi("splines.edgeChain"),lCt=new Vi("originalPortConstraints"),x7=new Vi("selfLoopHolder"),k7=new Vi("splines.nsPortY"),Tc=new Vi("modelOrder"),Wlt=new Vi("longEdgeTargetNode"),Ov=new Ps(D1e,!1),X4=new Ps(D1e,!1),Glt=new Vi("layerConstraints.hiddenNodes"),uCt=new Vi("layerConstraints.opposidePort"),Xlt=new Vi("targetNode.modelOrder")}function Fxt(){Fxt=Z,kCt=(LD(),GV),gwe=new mn(C6t,kCt),_we=new mn(_6t,(Nn(),!1)),ACt=(I$(),Hlt),Dwe=new mn(sH,ACt),Uwe=new mn(S6t,!1),Wwe=new mn(A6t,!0),H2e=new mn(L6t,!1),NCt=(CD(),Tht),cve=new mn(M6t,NCt),pe(1),bve=new mn(D6t,pe(7)),wve=new mn(I6t,!1),Swe=new mn(O6t,!1),xCt=(x2(),Mlt),dwe=new mn(Qot,xCt),DCt=(uq(),wht),Gwe=new mn(KI,DCt),LCt=(dh(),MO),Bwe=new mn(P6t,LCt),pe(-1),Nwe=new mn(F6t,pe(-1)),pe(-1),Rwe=new mn(N6t,pe(-1)),pe(-1),jwe=new mn(Zot,pe(4)),pe(-1),zwe=new mn(Jot,pe(2)),MCt=(y4(),kG),Vwe=new mn(tct,MCt),pe(0),Hwe=new mn(ect,pe(0)),Pwe=new mn(nct,pe(wi)),yCt=(n6(),P6),fwe=new mn(H_,yCt),J2e=new mn(B6t,!1),awe=new mn(rct,.1),lwe=new mn(ict,!1),pe(-1),cwe=new mn(R6t,pe(-1)),pe(-1),uwe=new mn(j6t,pe(-1)),pe(0),twe=new mn($6t,pe(40)),mCt=(eE(),zlt),iwe=new mn(sct,mCt),vCt=TO,ewe=new mn(aH,vCt),FCt=(u_(),DS),ove=new mn(I4,FCt),Zwe=new Vi(oH),ICt=(xD(),WV),Ywe=new mn(act,ICt),OCt=(oI(),YV),Xwe=new mn(oct,OCt),eve=new mn(cct,.3),rve=new Vi(uct),PCt=(cy(),xG),ive=new mn(lct,PCt),CCt=(yz(),_ht),mwe=new mn(z6t,CCt),_Ct=(pD(),Sht),ywe=new mn(q6t,_Ct),SCt=(cE(),PS),xwe=new mn(cH,SCt),Ewe=new mn(uH,.2),wwe=new mn(hct,2),fve=new mn(H6t,null),gve=new mn(V6t,10),dve=new mn(G6t,10),pve=new mn(U6t,20),pe(0),uve=new mn(W6t,pe(0)),pe(0),lve=new mn(Y6t,pe(0)),pe(0),hve=new mn(K6t,pe(0)),V2e=new mn(fct,!1),gCt=(kE(),mS),U2e=new mn(X6t,gCt),dCt=(H$(),Alt),G2e=new mn(Q6t,dCt),Lwe=new mn(lH,!1),pe(0),Awe=new mn(dct,pe(16)),pe(0),Mwe=new mn(gct,pe(5)),jCt=(Cz(),Mht),Bve=new mn(tg,jCt),vve=new mn(hH,10),xve=new mn(fH,1),RCt=(oz(),VV),Ave=new mn(V_,RCt),Tve=new Vi(pct),BCt=pe(1),pe(0),_ve=new mn(bct,BCt),$Ct=(vz(),Lht),zve=new mn(dH,$Ct),Rve=new Vi(gH),Ove=new mn(pH,!0),Dve=new mn(bH,2),Fve=new mn(wct,!0),TCt=(dq(),UV),bwe=new mn(Z6t,TCt),ECt=(h6(),p7),pwe=new mn(J6t,ECt),wCt=(V0(),vb),Z2e=new mn(wH,wCt),Q2e=new mn(tkt,!1),pCt=(iv(),q4),W2e=new mn(vct,pCt),bCt=(Z9(),vht),X2e=new mn(ekt,bCt),Y2e=new mn(mct,0),K2e=new mn(yct,0),Owe=Dlt,Iwe=EO,$we=mG,qwe=mG,Fwe=bht,owe=(G0(),sp),hwe=P6,swe=P6,nwe=P6,rwe=sp,Jwe=IS,tve=DS,Kwe=DS,Qwe=DS,nve=kht,ave=IS,sve=IS,kwe=(W0(),X6),Twe=X6,Cwe=PS,vwe=eP,mve=L7,yve=Yy,kve=L7,Eve=Yy,Lve=L7,Mve=Yy,Cve=Llt,Sve=VV,qve=L7,Hve=Yy,jve=L7,$ve=Yy,Pve=Yy,Ive=Yy,Nve=Yy}function ro(){ro=Z,J7t=new ms("DIRECTION_PREPROCESSOR",0),X7t=new ms("COMMENT_PREPROCESSOR",1),gS=new ms("EDGE_AND_LAYER_CONSTRAINT_EDGE_REVERSER",2),glt=new ms("INTERACTIVE_EXTERNAL_PORT_POSITIONER",3),vTt=new ms("PARTITION_PREPROCESSOR",4),CV=new ms("LABEL_DUMMY_INSERTER",5),FV=new ms("SELF_LOOP_PREPROCESSOR",6),h7=new ms("LAYER_CONSTRAINT_PREPROCESSOR",7),bTt=new ms("PARTITION_MIDPROCESSOR",8),oTt=new ms("HIGH_DEGREE_NODE_LAYER_PROCESSOR",9),gTt=new ms("NODE_PROMOTION",10),l7=new ms("LAYER_CONSTRAINT_POSTPROCESSOR",11),wTt=new ms("PARTITION_POSTPROCESSOR",12),iTt=new ms("HIERARCHICAL_PORT_CONSTRAINT_PROCESSOR",13),mTt=new ms("SEMI_INTERACTIVE_CROSSMIN_PROCESSOR",14),V7t=new ms("BREAKING_POINT_INSERTER",15),LV=new ms("LONG_EDGE_SPLITTER",16),plt=new ms("PORT_SIDE_PROCESSOR",17),EV=new ms("INVERTED_PORT_PROCESSOR",18),IV=new ms("PORT_LIST_SORTER",19),xTt=new ms("SORT_BY_INPUT_ORDER_OF_MODEL",20),DV=new ms("NORTH_SOUTH_PORT_PREPROCESSOR",21),G7t=new ms("BREAKING_POINT_PROCESSOR",22),pTt=new ms(E1e,23),kTt=new ms(T1e,24),OV=new ms("SELF_LOOP_PORT_RESTORER",25),yTt=new ms("SINGLE_EDGE_GRAPH_WRAPPER",26),TV=new ms("IN_LAYER_CONSTRAINT_PROCESSOR",27),eTt=new ms("END_NODE_PORT_LABEL_MANAGEMENT_PROCESSOR",28),fTt=new ms("LABEL_AND_NODE_SIZE_PROCESSOR",29),hTt=new ms("INNERMOST_NODE_MARGIN_CALCULATOR",30),NV=new ms("SELF_LOOP_ROUTER",31),Y7t=new ms("COMMENT_NODE_MARGIN_CALCULATOR",32),kV=new ms("END_LABEL_PREPROCESSOR",33),SV=new ms("LABEL_DUMMY_SWITCHER",34),W7t=new ms("CENTER_LABEL_MANAGEMENT_PROCESSOR",35),u7=new ms("LABEL_SIDE_SELECTOR",36),uTt=new ms("HYPEREDGE_DUMMY_MERGER",37),sTt=new ms("HIERARCHICAL_PORT_DUMMY_SIZE_PROCESSOR",38),dTt=new ms("LAYER_SIZE_AND_GRAPH_HEIGHT_CALCULATOR",39),pS=new ms("HIERARCHICAL_PORT_POSITION_PROCESSOR",40),Q7t=new ms("CONSTRAINTS_POSTPROCESSOR",41),K7t=new ms("COMMENT_POSTPROCESSOR",42),lTt=new ms("HYPERNODE_PROCESSOR",43),aTt=new ms("HIERARCHICAL_PORT_ORTHOGONAL_EDGE_ROUTER",44),AV=new ms("LONG_EDGE_JOINER",45),PV=new ms("SELF_LOOP_POSTPROCESSOR",46),U7t=new ms("BREAKING_POINT_REMOVER",47),MV=new ms("NORTH_SOUTH_PORT_POSTPROCESSOR",48),cTt=new ms("HORIZONTAL_COMPACTOR",49),_V=new ms("LABEL_DUMMY_REMOVER",50),nTt=new ms("FINAL_SPLINE_BENDPOINTS_CALCULATOR",51),tTt=new ms("END_LABEL_SORTER",52),xO=new ms("REVERSED_EDGE_RESTORER",53),xV=new ms("END_LABEL_POSTPROCESSOR",54),rTt=new ms("HIERARCHICAL_NODE_RESIZER",55),Z7t=new ms("DIRECTION_POSTPROCESSOR",56)}function zxn(t,e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe,Rn,zn,hr,pi,js,Zl,Xh,K1,kU,xP,bA,kP,H7,Gft,ixe,Uft,hp,Yv,V7,EP,TP,nk,Wft,wA,sxe,BLt,Kv,vA,Yft,rk,mA,o3,yA,Kft,axe;for(BLt=0,pi=e,Xh=0,xP=pi.length;Xh0&&(t.a[hp.p]=BLt++)}for(mA=0,js=n,K1=0,bA=js.length;K10;){for(hp=(Zn(TP.b>0),u(TP.a.Xb(TP.c=--TP.b),11)),EP=0,d=new S(hp.e);d.a0&&(hp.j==(ve(),Pn)?(t.a[hp.p]=mA,++mA):(t.a[hp.p]=mA+kP+Gft,++Gft))}mA+=Gft}for(V7=new _r,G=new O0,hr=e,Zl=0,kU=hr.length;Zlk.b&&(k.b=nk)):hp.i.c==sxe&&(nkk.c&&(k.c=nk));for($8(K,0,K.length,null),rk=Nt(Cr,Xr,25,K.length,15,1),r=Nt(Cr,Xr,25,mA+1,15,1),gt=0;gt0;)_e%2>0&&(s+=Kft[_e+1]),_e=(_e-1)/2|0,++Kft[_e];for(Qe=Nt(Ime,De,362,K.length*2,0,1),Rt=0;Rt'?":hn(t0e,t)?"'(?<' or '(? toIndex: ",Yxt=", toIndex: ",Kxt="Index: ",Xxt=", Size: ",zE="org.eclipse.elk.alg.common",Oi={62:1},Ife="org.eclipse.elk.alg.common.compaction",Ofe="Scanline/EventHandler",a0="org.eclipse.elk.alg.common.compaction.oned",Pfe="CNode belongs to another CGroup.",Ffe="ISpacingsHandler/1",Sot="The ",Aot=" instance has been finished already.",Nfe="The direction ",Bfe=" is not supported by the CGraph instance.",Rfe="OneDimensionalCompactor",jfe="OneDimensionalCompactor/lambda$0$Type",$fe="Quadruplet",zfe="ScanlineConstraintCalculator",qfe="ScanlineConstraintCalculator/ConstraintsScanlineHandler",Hfe="ScanlineConstraintCalculator/ConstraintsScanlineHandler/lambda$0$Type",Vfe="ScanlineConstraintCalculator/Timestamp",Gfe="ScanlineConstraintCalculator/lambda$0$Type",xd={169:1,45:1},Lot="org.eclipse.elk.alg.common.compaction.options",Qo="org.eclipse.elk.core.data",Qxt="org.eclipse.elk.polyomino.traversalStrategy",Zxt="org.eclipse.elk.polyomino.lowLevelSort",Jxt="org.eclipse.elk.polyomino.highLevelSort",t6t="org.eclipse.elk.polyomino.fill",Oh={130:1},Mot="polyomino",F_="org.eclipse.elk.alg.common.networksimplex",o0={177:1,3:1,4:1},Ufe="org.eclipse.elk.alg.common.nodespacing",_2="org.eclipse.elk.alg.common.nodespacing.cellsystem",qE="CENTER",Wfe={212:1,326:1},e6t={3:1,4:1,5:1,595:1},y6="LEFT",x6="RIGHT",n6t="Vertical alignment cannot be null",r6t="BOTTOM",Yq="org.eclipse.elk.alg.common.nodespacing.internal",N_="UNDEFINED",B1=.01,zI="org.eclipse.elk.alg.common.nodespacing.internal.algorithm",Yfe="LabelPlacer/lambda$0$Type",Kfe="LabelPlacer/lambda$1$Type",Xfe="portRatioOrPosition",HE="org.eclipse.elk.alg.common.overlaps",Dot="DOWN",kd="org.eclipse.elk.alg.common.polyomino",Kq="NORTH",Iot="EAST",Oot="SOUTH",Pot="WEST",Xq="org.eclipse.elk.alg.common.polyomino.structures",i6t="Direction",Fot="Grid is only of size ",Not=". Requested point (",Bot=") is out of bounds.",Qq=" Given center based coordinates were (",qI="org.eclipse.elk.graph.properties",Qfe="IPropertyHolder",s6t={3:1,94:1,134:1},k6="org.eclipse.elk.alg.common.spore",Zfe="org.eclipse.elk.alg.common.utils",S2={209:1},L4="org.eclipse.elk.core",Jfe="Connected Components Compaction",t1e="org.eclipse.elk.alg.disco",Zq="org.eclipse.elk.alg.disco.graph",Rot="org.eclipse.elk.alg.disco.options",a6t="CompactionStrategy",o6t="org.eclipse.elk.disco.componentCompaction.strategy",c6t="org.eclipse.elk.disco.componentCompaction.componentLayoutAlgorithm",u6t="org.eclipse.elk.disco.debug.discoGraph",l6t="org.eclipse.elk.disco.debug.discoPolys",e1e="componentCompaction",A2="org.eclipse.elk.disco",jot="org.eclipse.elk.spacing.componentComponent",$ot="org.eclipse.elk.edge.thickness",E6="org.eclipse.elk.aspectRatio",xv="org.eclipse.elk.padding",M4="org.eclipse.elk.alg.disco.transform",zot=1.5707963267948966,VE=17976931348623157e292,Ty={3:1,4:1,5:1,192:1},h6t={3:1,6:1,4:1,5:1,106:1,120:1},f6t="org.eclipse.elk.alg.force",d6t="ComponentsProcessor",n1e="ComponentsProcessor/1",HI="org.eclipse.elk.alg.force.graph",r1e="Component Layout",g6t="org.eclipse.elk.alg.force.model",Jq="org.eclipse.elk.force.model",p6t="org.eclipse.elk.force.iterations",b6t="org.eclipse.elk.force.repulsivePower",qot="org.eclipse.elk.force.temperature",Ed=.001,Hot="org.eclipse.elk.force.repulsion",B_="org.eclipse.elk.alg.force.options",GE=1.600000023841858,Vl="org.eclipse.elk.force",VI="org.eclipse.elk.priority",Cy="org.eclipse.elk.spacing.nodeNode",Vot="org.eclipse.elk.spacing.edgeLabel",tH="org.eclipse.elk.randomSeed",R_="org.eclipse.elk.separateConnectedComponents",GI="org.eclipse.elk.interactive",Got="org.eclipse.elk.portConstraints",eH="org.eclipse.elk.edgeLabels.inline",j_="org.eclipse.elk.omitNodeMicroLayout",T6="org.eclipse.elk.nodeSize.options",D4="org.eclipse.elk.nodeSize.constraints",UE="org.eclipse.elk.nodeLabels.placement",WE="org.eclipse.elk.portLabels.placement",w6t="origin",i1e="random",s1e="boundingBox.upLeft",a1e="boundingBox.lowRight",v6t="org.eclipse.elk.stress.fixed",m6t="org.eclipse.elk.stress.desiredEdgeLength",y6t="org.eclipse.elk.stress.dimension",x6t="org.eclipse.elk.stress.epsilon",k6t="org.eclipse.elk.stress.iterationLimit",ob="org.eclipse.elk.stress",o1e="ELK Stress",C6="org.eclipse.elk.nodeSize.minimum",nH="org.eclipse.elk.alg.force.stress",c1e="Layered layout",_6="org.eclipse.elk.alg.layered",UI="org.eclipse.elk.alg.layered.compaction.components",$_="org.eclipse.elk.alg.layered.compaction.oned",rH="org.eclipse.elk.alg.layered.compaction.oned.algs",L2="org.eclipse.elk.alg.layered.compaction.recthull",Td="org.eclipse.elk.alg.layered.components",J0="NONE",xc={3:1,6:1,4:1,9:1,5:1,122:1},u1e={3:1,6:1,4:1,5:1,141:1,106:1,120:1},iH="org.eclipse.elk.alg.layered.compound",os={51:1},tu="org.eclipse.elk.alg.layered.graph",Uot=" -> ",l1e="Not supported by LGraph",E6t="Port side is undefined",Wot={3:1,6:1,4:1,5:1,474:1,141:1,106:1,120:1},Yg={3:1,6:1,4:1,5:1,141:1,193:1,203:1,106:1,120:1},h1e={3:1,6:1,4:1,5:1,141:1,1943:1,203:1,106:1,120:1},f1e=`([{"' \r +`,d1e=`)]}"' \r +`,g1e="The given string contains parts that cannot be parsed as numbers.",WI="org.eclipse.elk.core.math",p1e={3:1,4:1,142:1,207:1,414:1},b1e={3:1,4:1,116:1,207:1,414:1},Gn="org.eclipse.elk.layered",Kg="org.eclipse.elk.alg.layered.graph.transform",w1e="ElkGraphImporter",v1e="ElkGraphImporter/lambda$0$Type",m1e="ElkGraphImporter/lambda$1$Type",y1e="ElkGraphImporter/lambda$2$Type",x1e="ElkGraphImporter/lambda$4$Type",k1e="Node margin calculation",$n="org.eclipse.elk.alg.layered.intermediate",E1e="ONE_SIDED_GREEDY_SWITCH",T1e="TWO_SIDED_GREEDY_SWITCH",Yot="No implementation is available for the layout processor ",T6t="IntermediateProcessorStrategy",Kot="Node '",C1e="FIRST_SEPARATE",_1e="LAST_SEPARATE",S1e="Odd port side processing",_s="org.eclipse.elk.alg.layered.intermediate.compaction",z_="org.eclipse.elk.alg.layered.intermediate.greedyswitch",c0="org.eclipse.elk.alg.layered.p3order.counting",YI={225:1},S6="org.eclipse.elk.alg.layered.intermediate.loops",Gl="org.eclipse.elk.alg.layered.intermediate.loops.ordering",cb="org.eclipse.elk.alg.layered.intermediate.loops.routing",q_="org.eclipse.elk.alg.layered.intermediate.preserveorder",Cd="org.eclipse.elk.alg.layered.intermediate.wrapping",kc="org.eclipse.elk.alg.layered.options",Xot="INTERACTIVE",A1e="DEPTH_FIRST",L1e="EDGE_LENGTH",M1e="SELF_LOOPS",D1e="firstTryWithInitialOrder",C6t="org.eclipse.elk.layered.directionCongruency",_6t="org.eclipse.elk.layered.feedbackEdges",sH="org.eclipse.elk.layered.interactiveReferencePoint",S6t="org.eclipse.elk.layered.mergeEdges",A6t="org.eclipse.elk.layered.mergeHierarchyEdges",L6t="org.eclipse.elk.layered.allowNonFlowPortsToSwitchSides",M6t="org.eclipse.elk.layered.portSortingStrategy",D6t="org.eclipse.elk.layered.thoroughness",I6t="org.eclipse.elk.layered.unnecessaryBendpoints",O6t="org.eclipse.elk.layered.generatePositionAndLayerIds",Qot="org.eclipse.elk.layered.cycleBreaking.strategy",KI="org.eclipse.elk.layered.layering.strategy",P6t="org.eclipse.elk.layered.layering.layerConstraint",F6t="org.eclipse.elk.layered.layering.layerChoiceConstraint",N6t="org.eclipse.elk.layered.layering.layerId",Zot="org.eclipse.elk.layered.layering.minWidth.upperBoundOnWidth",Jot="org.eclipse.elk.layered.layering.minWidth.upperLayerEstimationScalingFactor",tct="org.eclipse.elk.layered.layering.nodePromotion.strategy",ect="org.eclipse.elk.layered.layering.nodePromotion.maxIterations",nct="org.eclipse.elk.layered.layering.coffmanGraham.layerBound",H_="org.eclipse.elk.layered.crossingMinimization.strategy",B6t="org.eclipse.elk.layered.crossingMinimization.forceNodeModelOrder",rct="org.eclipse.elk.layered.crossingMinimization.hierarchicalSweepiness",ict="org.eclipse.elk.layered.crossingMinimization.semiInteractive",R6t="org.eclipse.elk.layered.crossingMinimization.positionChoiceConstraint",j6t="org.eclipse.elk.layered.crossingMinimization.positionId",$6t="org.eclipse.elk.layered.crossingMinimization.greedySwitch.activationThreshold",sct="org.eclipse.elk.layered.crossingMinimization.greedySwitch.type",aH="org.eclipse.elk.layered.crossingMinimization.greedySwitchHierarchical.type",I4="org.eclipse.elk.layered.nodePlacement.strategy",oH="org.eclipse.elk.layered.nodePlacement.favorStraightEdges",act="org.eclipse.elk.layered.nodePlacement.bk.edgeStraightening",oct="org.eclipse.elk.layered.nodePlacement.bk.fixedAlignment",cct="org.eclipse.elk.layered.nodePlacement.linearSegments.deflectionDampening",uct="org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility",lct="org.eclipse.elk.layered.nodePlacement.networkSimplex.nodeFlexibility.default",z6t="org.eclipse.elk.layered.edgeRouting.selfLoopDistribution",q6t="org.eclipse.elk.layered.edgeRouting.selfLoopOrdering",cH="org.eclipse.elk.layered.edgeRouting.splines.mode",uH="org.eclipse.elk.layered.edgeRouting.splines.sloppy.layerSpacingFactor",hct="org.eclipse.elk.layered.edgeRouting.polyline.slopedEdgeZoneWidth",H6t="org.eclipse.elk.layered.spacing.baseValue",V6t="org.eclipse.elk.layered.spacing.edgeNodeBetweenLayers",G6t="org.eclipse.elk.layered.spacing.edgeEdgeBetweenLayers",U6t="org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers",W6t="org.eclipse.elk.layered.priority.direction",Y6t="org.eclipse.elk.layered.priority.shortness",K6t="org.eclipse.elk.layered.priority.straightness",fct="org.eclipse.elk.layered.compaction.connectedComponents",X6t="org.eclipse.elk.layered.compaction.postCompaction.strategy",Q6t="org.eclipse.elk.layered.compaction.postCompaction.constraints",lH="org.eclipse.elk.layered.highDegreeNodes.treatment",dct="org.eclipse.elk.layered.highDegreeNodes.threshold",gct="org.eclipse.elk.layered.highDegreeNodes.treeHeight",tg="org.eclipse.elk.layered.wrapping.strategy",hH="org.eclipse.elk.layered.wrapping.additionalEdgeSpacing",fH="org.eclipse.elk.layered.wrapping.correctionFactor",V_="org.eclipse.elk.layered.wrapping.cutting.strategy",pct="org.eclipse.elk.layered.wrapping.cutting.cuts",bct="org.eclipse.elk.layered.wrapping.cutting.msd.freedom",dH="org.eclipse.elk.layered.wrapping.validify.strategy",gH="org.eclipse.elk.layered.wrapping.validify.forbiddenIndices",pH="org.eclipse.elk.layered.wrapping.multiEdge.improveCuts",bH="org.eclipse.elk.layered.wrapping.multiEdge.distancePenalty",wct="org.eclipse.elk.layered.wrapping.multiEdge.improveWrappedEdges",Z6t="org.eclipse.elk.layered.edgeLabels.sideSelection",J6t="org.eclipse.elk.layered.edgeLabels.centerLabelPlacementStrategy",wH="org.eclipse.elk.layered.considerModelOrder.strategy",tkt="org.eclipse.elk.layered.considerModelOrder.noModelOrder",vct="org.eclipse.elk.layered.considerModelOrder.components",ekt="org.eclipse.elk.layered.considerModelOrder.longEdgeStrategy",mct="org.eclipse.elk.layered.considerModelOrder.crossingCounterNodeInfluence",yct="org.eclipse.elk.layered.considerModelOrder.crossingCounterPortInfluence",xct="layering",I1e="layering.minWidth",O1e="layering.nodePromotion",XI="crossingMinimization",vH="org.eclipse.elk.hierarchyHandling",P1e="crossingMinimization.greedySwitch",F1e="nodePlacement",N1e="nodePlacement.bk",B1e="edgeRouting",QI="org.eclipse.elk.edgeRouting",R1="spacing",nkt="priority",rkt="compaction",R1e="compaction.postCompaction",j1e="Specifies whether and how post-process compaction is applied.",ikt="highDegreeNodes",skt="wrapping",$1e="wrapping.cutting",z1e="wrapping.validify",akt="wrapping.multiEdge",kct="edgeLabels",ZI="considerModelOrder",okt="org.eclipse.elk.spacing.commentComment",ckt="org.eclipse.elk.spacing.commentNode",ukt="org.eclipse.elk.spacing.edgeEdge",lkt="org.eclipse.elk.spacing.edgeNode",hkt="org.eclipse.elk.spacing.labelLabel",fkt="org.eclipse.elk.spacing.labelPortHorizontal",dkt="org.eclipse.elk.spacing.labelPortVertical",gkt="org.eclipse.elk.spacing.labelNode",pkt="org.eclipse.elk.spacing.nodeSelfLoop",bkt="org.eclipse.elk.spacing.portPort",wkt="org.eclipse.elk.spacing.individual",vkt="org.eclipse.elk.port.borderOffset",mkt="org.eclipse.elk.noLayout",ykt="org.eclipse.elk.port.side",JI="org.eclipse.elk.debugMode",xkt="org.eclipse.elk.alignment",kkt="org.eclipse.elk.insideSelfLoops.activate",Ekt="org.eclipse.elk.insideSelfLoops.yo",Ect="org.eclipse.elk.nodeSize.fixedGraphSize",Tkt="org.eclipse.elk.direction",Ckt="org.eclipse.elk.nodeLabels.padding",_kt="org.eclipse.elk.portLabels.nextToPortIfPossible",Skt="org.eclipse.elk.portLabels.treatAsGroup",Akt="org.eclipse.elk.portAlignment.default",Lkt="org.eclipse.elk.portAlignment.north",Mkt="org.eclipse.elk.portAlignment.south",Dkt="org.eclipse.elk.portAlignment.west",Ikt="org.eclipse.elk.portAlignment.east",mH="org.eclipse.elk.contentAlignment",Okt="org.eclipse.elk.junctionPoints",Pkt="org.eclipse.elk.edgeLabels.placement",Fkt="org.eclipse.elk.port.index",Nkt="org.eclipse.elk.commentBox",Bkt="org.eclipse.elk.hypernode",Rkt="org.eclipse.elk.port.anchor",Tct="org.eclipse.elk.partitioning.activate",Cct="org.eclipse.elk.partitioning.partition",yH="org.eclipse.elk.position",jkt="org.eclipse.elk.margins",$kt="org.eclipse.elk.spacing.portsSurrounding",_ct="org.eclipse.elk.interactiveLayout",Ec="org.eclipse.elk.core.util",zkt={3:1,4:1,5:1,593:1},q1e="NETWORK_SIMPLEX",zc={123:1,51:1},xH="org.eclipse.elk.alg.layered.p1cycles",_y="org.eclipse.elk.alg.layered.p2layers",qkt={402:1,225:1},H1e={832:1,3:1,4:1},qu="org.eclipse.elk.alg.layered.p3order",uo="org.eclipse.elk.alg.layered.p4nodes",V1e={3:1,4:1,5:1,840:1},_d=1e-5,ub="org.eclipse.elk.alg.layered.p4nodes.bk",Sct="org.eclipse.elk.alg.layered.p5edges",t1="org.eclipse.elk.alg.layered.p5edges.orthogonal",Act="org.eclipse.elk.alg.layered.p5edges.orthogonal.direction",Lct=1e-6,Sy="org.eclipse.elk.alg.layered.p5edges.splines",Mct=.09999999999999998,kH=1e-8,G1e=4.71238898038469,U1e=3.141592653589793,G_="org.eclipse.elk.alg.mrtree",U_="org.eclipse.elk.alg.mrtree.graph",A6="org.eclipse.elk.alg.mrtree.intermediate",W1e="Set neighbors in level",Y1e="DESCENDANTS",Hkt="org.eclipse.elk.mrtree.weighting",Vkt="org.eclipse.elk.mrtree.searchOrder",EH="org.eclipse.elk.alg.mrtree.options",Xg="org.eclipse.elk.mrtree",K1e="org.eclipse.elk.tree",Gkt="org.eclipse.elk.alg.radial",O4=6.283185307179586,Ukt=5e-324,X1e="org.eclipse.elk.alg.radial.intermediate",Dct="org.eclipse.elk.alg.radial.intermediate.compaction",Q1e={3:1,4:1,5:1,106:1},Wkt="org.eclipse.elk.alg.radial.intermediate.optimization",Ict="No implementation is available for the layout option ",W_="org.eclipse.elk.alg.radial.options",Ykt="org.eclipse.elk.radial.orderId",Kkt="org.eclipse.elk.radial.radius",Oct="org.eclipse.elk.radial.compactor",Pct="org.eclipse.elk.radial.compactionStepSize",Xkt="org.eclipse.elk.radial.sorter",Qkt="org.eclipse.elk.radial.wedgeCriteria",Zkt="org.eclipse.elk.radial.optimizationCriteria",Sd="org.eclipse.elk.radial",Z1e="org.eclipse.elk.alg.radial.p1position.wedge",Jkt="org.eclipse.elk.alg.radial.sorting",J1e=5.497787143782138,tde=3.9269908169872414,ede=2.356194490192345,nde="org.eclipse.elk.alg.rectpacking",TH="org.eclipse.elk.alg.rectpacking.firstiteration",Fct="org.eclipse.elk.alg.rectpacking.options",t8t="org.eclipse.elk.rectpacking.optimizationGoal",e8t="org.eclipse.elk.rectpacking.lastPlaceShift",n8t="org.eclipse.elk.rectpacking.currentPosition",r8t="org.eclipse.elk.rectpacking.desiredPosition",i8t="org.eclipse.elk.rectpacking.onlyFirstIteration",s8t="org.eclipse.elk.rectpacking.rowCompaction",Nct="org.eclipse.elk.rectpacking.expandToAspectRatio",a8t="org.eclipse.elk.rectpacking.targetWidth",CH="org.eclipse.elk.expandNodes",Ph="org.eclipse.elk.rectpacking",tO="org.eclipse.elk.alg.rectpacking.util",_H="No implementation available for ",Ay="org.eclipse.elk.alg.spore",Ly="org.eclipse.elk.alg.spore.options",kv="org.eclipse.elk.sporeCompaction",Bct="org.eclipse.elk.underlyingLayoutAlgorithm",o8t="org.eclipse.elk.processingOrder.treeConstruction",c8t="org.eclipse.elk.processingOrder.spanningTreeCostFunction",Rct="org.eclipse.elk.processingOrder.preferredRoot",jct="org.eclipse.elk.processingOrder.rootSelection",$ct="org.eclipse.elk.structure.structureExtractionStrategy",u8t="org.eclipse.elk.compaction.compactionStrategy",l8t="org.eclipse.elk.compaction.orthogonal",h8t="org.eclipse.elk.overlapRemoval.maxIterations",f8t="org.eclipse.elk.overlapRemoval.runScanline",zct="processingOrder",rde="overlapRemoval",YE="org.eclipse.elk.sporeOverlap",ide="org.eclipse.elk.alg.spore.p1structure",qct="org.eclipse.elk.alg.spore.p2processingorder",Hct="org.eclipse.elk.alg.spore.p3execution",sde="Invalid index: ",KE="org.eclipse.elk.core.alg",P4={331:1},My={288:1},ade="Make sure its type is registered with the ",d8t=" utility class.",XE="true",Vct="false",ode="Couldn't clone property '",Ev=.05,Fh="org.eclipse.elk.core.options",cde=1.2999999523162842,Tv="org.eclipse.elk.box",g8t="org.eclipse.elk.box.packingMode",ude="org.eclipse.elk.algorithm",lde="org.eclipse.elk.resolvedAlgorithm",p8t="org.eclipse.elk.bendPoints",Uxn="org.eclipse.elk.labelManager",hde="org.eclipse.elk.scaleFactor",fde="org.eclipse.elk.animate",dde="org.eclipse.elk.animTimeFactor",gde="org.eclipse.elk.layoutAncestors",pde="org.eclipse.elk.maxAnimTime",bde="org.eclipse.elk.minAnimTime",wde="org.eclipse.elk.progressBar",vde="org.eclipse.elk.validateGraph",mde="org.eclipse.elk.validateOptions",yde="org.eclipse.elk.zoomToFit",Wxn="org.eclipse.elk.font.name",xde="org.eclipse.elk.font.size",kde="org.eclipse.elk.edge.type",Ede="partitioning",Tde="nodeLabels",SH="portAlignment",Gct="nodeSize",Uct="port",b8t="portLabels",Cde="insideSelfLoops",Y_="org.eclipse.elk.fixed",AH="org.eclipse.elk.random",_de="port must have a parent node to calculate the port side",Sde="The edge needs to have exactly one edge section. Found: ",K_="org.eclipse.elk.core.util.adapters",ph="org.eclipse.emf.ecore",F4="org.eclipse.elk.graph",Ade="EMapPropertyHolder",Lde="ElkBendPoint",Mde="ElkGraphElement",Dde="ElkConnectableShape",w8t="ElkEdge",Ide="ElkEdgeSection",Ode="EModelElement",Pde="ENamedElement",v8t="ElkLabel",m8t="ElkNode",y8t="ElkPort",Fde={92:1,90:1},L6="org.eclipse.emf.common.notify.impl",lb="The feature '",X_="' is not a valid changeable feature",Nde="Expecting null",Wct="' is not a valid feature",Bde="The feature ID",Rde=" is not a valid feature ID",dc=32768,jde={105:1,92:1,90:1,56:1,49:1,97:1},Mn="org.eclipse.emf.ecore.impl",M2="org.eclipse.elk.graph.impl",Q_="Recursive containment not allowed for ",QE="The datatype '",Cv="' is not a valid classifier",Yct="The value '",N4={190:1,3:1,4:1},Kct="The class '",ZE="http://www.eclipse.org/elk/ElkGraph",xf=1024,x8t="property",Z_="value",Xct="source",$de="properties",zde="identifier",Qct="height",Zct="width",Jct="parent",tut="text",eut="children",qde="hierarchical",k8t="sources",nut="targets",E8t="sections",LH="bendPoints",T8t="outgoingShape",C8t="incomingShape",_8t="outgoingSections",S8t="incomingSections",Ra="org.eclipse.emf.common.util",A8t="Severe implementation error in the Json to ElkGraph importer.",Ad="id",ma="org.eclipse.elk.graph.json",L8t="Unhandled parameter types: ",Hde="startPoint",Vde="An edge must have at least one source and one target (edge id: '",JE="').",Gde="Referenced edge section does not exist: ",Ude=" (edge id: '",M8t="target",Wde="sourcePoint",Yde="targetPoint",MH="group",ci="name",Kde="connectableShape cannot be null",Xde="edge cannot be null",rut="Passed edge is not 'simple'.",DH="org.eclipse.elk.graph.util",eO="The 'no duplicates' constraint is violated",iut="targetIndex=",D2=", size=",sut="sourceIndex=",Ld={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1},aut={3:1,4:1,20:1,28:1,52:1,14:1,47:1,15:1,54:1,67:1,63:1,58:1,588:1},IH="logging",Qde="measureExecutionTime",Zde="parser.parse.1",Jde="parser.parse.2",OH="parser.next.1",out="parser.next.2",t0e="parser.next.3",e0e="parser.next.4",I2="parser.factor.1",D8t="parser.factor.2",n0e="parser.factor.3",r0e="parser.factor.4",i0e="parser.factor.5",s0e="parser.factor.6",a0e="parser.atom.1",o0e="parser.atom.2",c0e="parser.atom.3",I8t="parser.atom.4",cut="parser.atom.5",O8t="parser.cc.1",PH="parser.cc.2",u0e="parser.cc.3",l0e="parser.cc.5",P8t="parser.cc.6",F8t="parser.cc.7",uut="parser.cc.8",h0e="parser.ope.1",f0e="parser.ope.2",d0e="parser.ope.3",Qg="parser.descape.1",g0e="parser.descape.2",p0e="parser.descape.3",b0e="parser.descape.4",w0e="parser.descape.5",bh="parser.process.1",v0e="parser.quantifier.1",m0e="parser.quantifier.2",y0e="parser.quantifier.3",x0e="parser.quantifier.4",N8t="parser.quantifier.5",k0e="org.eclipse.emf.common.notify",B8t={415:1,672:1},E0e={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1},nO={366:1,143:1},J_="index=",lut={3:1,4:1,5:1,126:1},T0e={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,58:1},R8t={3:1,6:1,4:1,5:1,192:1},C0e={3:1,4:1,5:1,165:1,367:1},_0e=";/?:@&=+$,",S0e="invalid authority: ",A0e="EAnnotation",L0e="ETypedElement",M0e="EStructuralFeature",D0e="EAttribute",I0e="EClassifier",O0e="EEnumLiteral",P0e="EGenericType",F0e="EOperation",N0e="EParameter",B0e="EReference",R0e="ETypeParameter",$i="org.eclipse.emf.ecore.util",hut={76:1},j8t={3:1,20:1,14:1,15:1,58:1,589:1,76:1,69:1,95:1},j0e="org.eclipse.emf.ecore.util.FeatureMap$Entry",Hu=8192,Dy=2048,tS="byte",FH="char",eS="double",nS="float",rS="int",iS="long",sS="short",$0e="java.lang.Object",B4={3:1,4:1,5:1,247:1},$8t={3:1,4:1,5:1,673:1},z0e={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,69:1},zo={3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,69:1,95:1},rO="mixed",Yr="http:///org/eclipse/emf/ecore/util/ExtendedMetaData",Nh="kind",q0e={3:1,4:1,5:1,674:1},z8t={3:1,4:1,20:1,28:1,52:1,14:1,15:1,67:1,58:1,76:1,69:1,95:1},NH={20:1,28:1,52:1,14:1,15:1,58:1,69:1},BH={47:1,125:1,279:1},RH={72:1,332:1},jH="The value of type '",$H="' must be of type '",R4=1316,Bh="http://www.eclipse.org/emf/2002/Ecore",zH=-32768,_v="constraints",Aa="baseType",H0e="getEStructuralFeature",V0e="getFeatureID",aS="feature",G0e="getOperationID",q8t="operation",U0e="defaultValue",W0e="eTypeParameters",Y0e="isInstance",K0e="getEEnumLiteral",X0e="eContainingClass",si={55:1},Q0e={3:1,4:1,5:1,119:1},Z0e="org.eclipse.emf.ecore.resource",J0e={92:1,90:1,591:1,1935:1},fut="org.eclipse.emf.ecore.resource.impl",H8t="unspecified",iO="simple",qH="attribute",tge="attributeWildcard",HH="element",dut="elementWildcard",e1="collapse",gut="itemType",VH="namespace",sO="##targetNamespace",Rh="whiteSpace",V8t="wildcards",O2="http://www.eclipse.org/emf/2003/XMLType",put="##any",t7="uninitialized",aO="The multiplicity constraint is violated",GH="org.eclipse.emf.ecore.xml.type",ege="ProcessingInstruction",nge="SimpleAnyType",rge="XMLTypeDocumentRoot",xs="org.eclipse.emf.ecore.xml.type.impl",oO="INF",ige="processing",sge="ENTITIES_._base",G8t="minLength",U8t="ENTITY",UH="NCName",age="IDREFS_._base",W8t="integer",but="token",wut="pattern",oge="[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*",Y8t="\\i\\c*",cge="[\\i-[:]][\\c-[:]]*",uge="nonPositiveInteger",cO="maxInclusive",K8t="NMTOKEN",lge="NMTOKENS_._base",X8t="nonNegativeInteger",uO="minInclusive",hge="normalizedString",fge="unsignedByte",dge="unsignedInt",gge="18446744073709551615",pge="unsignedShort",bge="processingInstruction",Zg="org.eclipse.emf.ecore.xml.type.internal",e7=1114111,wge="Internal Error: shorthands: \\u",oS="xml:isDigit",vut="xml:isWord",mut="xml:isSpace",yut="xml:isNameChar",xut="xml:isInitialNameChar",vge="09٠٩۰۹०९০৯੦੯૦૯୦୯௧௯౦౯೦೯൦൯๐๙໐໙༠༩",mge="AZazÀÖØöøıĴľŁňŊžƀǃǍǰǴǵǺȗɐʨʻˁΆΆΈΊΌΌΎΡΣώϐϖϚϚϜϜϞϞϠϠϢϳЁЌЎяёќўҁҐӄӇӈӋӌӐӫӮӵӸӹԱՖՙՙաֆאתװײءغفيٱڷںھۀێېۓەەۥۦअहऽऽक़ॡঅঌএঐওনপরললশহড়ঢ়য়ৡৰৱਅਊਏਐਓਨਪਰਲਲ਼ਵਸ਼ਸਹਖ਼ੜਫ਼ਫ਼ੲੴઅઋઍઍએઑઓનપરલળવહઽઽૠૠଅଌଏଐଓନପରଲଳଶହଽଽଡ଼ଢ଼ୟୡஅஊஎஐஒகஙசஜஜஞடணதநபமவஷஹఅఌఎఐఒనపళవహౠౡಅಌಎಐಒನಪಳವಹೞೞೠೡഅഌഎഐഒനപഹൠൡกฮะะาำเๅກຂຄຄງຈຊຊຍຍດທນຟມຣລລວວສຫອຮະະາຳຽຽເໄཀཇཉཀྵႠჅაჶᄀᄀᄂᄃᄅᄇᄉᄉᄋᄌᄎᄒᄼᄼᄾᄾᅀᅀᅌᅌᅎᅎᅐᅐᅔᅕᅙᅙᅟᅡᅣᅣᅥᅥᅧᅧᅩᅩᅭᅮᅲᅳᅵᅵᆞᆞᆨᆨᆫᆫᆮᆯᆷᆸᆺᆺᆼᇂᇫᇫᇰᇰᇹᇹḀẛẠỹἀἕἘἝἠὅὈὍὐὗὙὙὛὛὝὝὟώᾀᾴᾶᾼιιῂῄῆῌῐΐῖΊῠῬῲῴῶῼΩΩKÅ℮℮ↀↂ〇〇〡〩ぁゔァヺㄅㄬ一龥가힣",yge="Private Use",kut="ASSIGNED",Eut="\0€ÿĀſƀɏɐʯʰ˿̀ͯͰϿЀӿ԰֏֐׿؀ۿ܀ݏހ޿ऀॿঀ৿਀੿઀૿଀୿஀௿ఀ౿ಀ೿ഀൿ඀෿฀๿຀໿ༀ࿿က႟Ⴀჿᄀᇿሀ፿Ꭰ᏿᐀ᙿ ᚟ᚠ᛿ក៿᠀᢯Ḁỿἀ῿ ⁰₟₠⃏⃐⃿℀⅏⅐↏←⇿∀⋿⌀⏿␀␿⑀⑟①⓿─╿▀▟■◿☀⛿✀➿⠀⣿⺀⻿⼀⿟⿰⿿ 〿぀ゟ゠ヿ㄀ㄯ㄰㆏㆐㆟ㆠㆿ㈀㋿㌀㏿㐀䶵一鿿ꀀ꒏꒐꓏가힣豈﫿ffﭏﭐ﷿︠︯︰﹏﹐﹯ﹰ﻾\uFEFF\uFEFF＀￯",Q8t="UNASSIGNED",n7={3:1,117:1},xge="org.eclipse.emf.ecore.xml.type.util",WH={3:1,4:1,5:1,368:1},Z8t="org.eclipse.xtext.xbase.lib",kge="Cannot add elements to a Range",Ege="Cannot set elements in a Range",Tge="Cannot remove elements from a Range",YH="locale",KH="default",XH="user.agent",l,QH,Tut;b.goog=b.goog||{},b.goog.global=b.goog.global||b,mgn(),D(1,null,{},_),l.Fb=function(e){return mUt(this,e)},l.Gb=function(){return this.gm},l.Hb=function(){return Pw(this)},l.Ib=function(){var e;return Ip(ol(this))+"@"+(e=Hi(this)>>>0,e.toString(16))},l.equals=function(t){return this.Fb(t)},l.hashCode=function(){return this.Hb()},l.toString=function(){return this.Ib()};var Cge,_ge,Sge;D(290,1,{290:1,2026:1},Lyt),l.le=function(e){var n;return n=new Lyt,n.i=4,e>1?n.c=NQt(this,e-1):n.c=this,n},l.me=function(){return P0(this),this.b},l.ne=function(){return Ip(this)},l.oe=function(){return P0(this),this.k},l.pe=function(){return(this.i&4)!=0},l.qe=function(){return(this.i&1)!=0},l.Ib=function(){return Vmt(this)},l.i=0;var Qn=F(Xo,"Object",1),J8t=F(Xo,"Class",290);D(1998,1,DI),F(II,"Optional",1998),D(1170,1998,DI,A),l.Fb=function(e){return e===this},l.Hb=function(){return 2040732332},l.Ib=function(){return"Optional.absent()"},l.Jb=function(e){return Lr(e),PC(),Cut};var Cut;F(II,"Absent",1170),D(628,1,{},vet),F(II,"Joiner",628);var Yxn=Ki(II,"Predicate");D(582,1,{169:1,582:1,3:1,45:1},mC),l.Mb=function(e){return kre(this,e)},l.Lb=function(e){return kre(this,e)},l.Fb=function(e){var n;return _t(e,582)?(n=u(e,582),k5t(this.a,n.a)):!1},l.Hb=function(){return Pyt(this.a)+306654252},l.Ib=function(){return spn(this.a)},F(II,"Predicates/AndPredicate",582),D(408,1998,{408:1,3:1},Wk),l.Fb=function(e){var n;return _t(e,408)?(n=u(e,408),yi(this.a,n.a)):!1},l.Hb=function(){return 1502476572+Hi(this.a)},l.Ib=function(){return cfe+this.a+")"},l.Jb=function(e){return new Wk(g$(e.Kb(this.a),"the Function passed to Optional.transform() must not return null."))},F(II,"Present",408),D(198,1,FE),l.Nb=function(e){ba(this,e)},l.Qb=function(){uHt()},F(Ke,"UnmodifiableIterator",198),D(1978,198,NE),l.Qb=function(){uHt()},l.Rb=function(e){throw it(new Or)},l.Wb=function(e){throw it(new Or)},F(Ke,"UnmodifiableListIterator",1978),D(386,1978,NE),l.Ob=function(){return this.c0},l.Pb=function(){if(this.c>=this.d)throw it(new lc);return this.Xb(this.c++)},l.Tb=function(){return this.c},l.Ub=function(){if(this.c<=0)throw it(new lc);return this.Xb(--this.c)},l.Vb=function(){return this.c-1},l.c=0,l.d=0,F(Ke,"AbstractIndexedListIterator",386),D(699,198,FE),l.Ob=function(){return bit(this)},l.Pb=function(){return Rmt(this)},l.e=1,F(Ke,"AbstractIterator",699),D(1986,1,{224:1}),l.Zb=function(){var e;return e=this.f,e||(this.f=this.ac())},l.Fb=function(e){return Pit(this,e)},l.Hb=function(){return Hi(this.Zb())},l.dc=function(){return this.gc()==0},l.ec=function(){return qx(this)},l.Ib=function(){return $o(this.Zb())},F(Ke,"AbstractMultimap",1986),D(726,1986,T2),l.$b=function(){cz(this)},l._b=function(e){return AHt(this,e)},l.ac=function(){return new l8(this,this.c)},l.ic=function(e){return this.hc()},l.bc=function(){return new K3(this,this.c)},l.jc=function(){return this.mc(this.hc())},l.kc=function(){return new Uqt(this)},l.lc=function(){return zst(this.c.vc().Nc(),new B,64,this.d)},l.cc=function(e){return Ai(this,e)},l.fc=function(e){return GD(this,e)},l.gc=function(){return this.d},l.mc=function(e){return wn(),new T(e)},l.nc=function(){return new Gqt(this)},l.oc=function(){return zst(this.c.Cc().Nc(),new I,64,this.d)},l.pc=function(e,n){return new q$(this,e,n,null)},l.d=0,F(Ke,"AbstractMapBasedMultimap",726),D(1631,726,T2),l.hc=function(){return new Xc(this.a)},l.jc=function(){return wn(),wn(),io},l.cc=function(e){return u(Ai(this,e),15)},l.fc=function(e){return u(GD(this,e),15)},l.Zb=function(){return Wx(this)},l.Fb=function(e){return Pit(this,e)},l.qc=function(e){return u(Ai(this,e),15)},l.rc=function(e){return u(GD(this,e),15)},l.mc=function(e){return iD(u(e,15))},l.pc=function(e,n){return zZt(this,e,u(n,15),null)},F(Ke,"AbstractListMultimap",1631),D(732,1,sa),l.Nb=function(e){ba(this,e)},l.Ob=function(){return this.c.Ob()||this.e.Ob()},l.Pb=function(){var e;return this.e.Ob()||(e=u(this.c.Pb(),42),this.b=e.cd(),this.a=u(e.dd(),14),this.e=this.a.Kc()),this.sc(this.b,this.e.Pb())},l.Qb=function(){this.e.Qb(),this.a.dc()&&this.c.Qb(),--this.d.d},F(Ke,"AbstractMapBasedMultimap/Itr",732),D(1099,732,sa,Gqt),l.sc=function(e,n){return n},F(Ke,"AbstractMapBasedMultimap/1",1099),D(1100,1,{},I),l.Kb=function(e){return u(e,14).Nc()},F(Ke,"AbstractMapBasedMultimap/1methodref$spliterator$Type",1100),D(1101,732,sa,Uqt),l.sc=function(e,n){return new Lw(e,n)},F(Ke,"AbstractMapBasedMultimap/2",1101);var tEt=Ki(pr,"Map");D(1967,1,mv),l.wc=function(e){K9(this,e)},l.yc=function(e,n,r){return Qit(this,e,n,r)},l.$b=function(){this.vc().$b()},l.tc=function(e){return Tst(this,e)},l._b=function(e){return!!C4t(this,e,!1)},l.uc=function(e){var n,r,s;for(r=this.vc().Kc();r.Ob();)if(n=u(r.Pb(),42),s=n.dd(),Vt(e)===Vt(s)||e!=null&&yi(e,s))return!0;return!1},l.Fb=function(e){var n,r,s;if(e===this)return!0;if(!_t(e,83)||(s=u(e,83),this.gc()!=s.gc()))return!1;for(r=s.vc().Kc();r.Ob();)if(n=u(r.Pb(),42),!this.tc(n))return!1;return!0},l.xc=function(e){return ec(C4t(this,e,!1))},l.Hb=function(){return Tyt(this.vc())},l.dc=function(){return this.gc()==0},l.ec=function(){return new Sm(this)},l.zc=function(e,n){throw it(new Sg("Put not supported on this map"))},l.Ac=function(e){Y9(this,e)},l.Bc=function(e){return ec(C4t(this,e,!0))},l.gc=function(){return this.vc().gc()},l.Ib=function(){return Tae(this)},l.Cc=function(){return new v1(this)},F(pr,"AbstractMap",1967),D(1987,1967,mv),l.bc=function(){return new FR(this)},l.vc=function(){return $Kt(this)},l.ec=function(){var e;return e=this.g,e||(this.g=this.bc())},l.Cc=function(){var e;return e=this.i,e||(this.i=new yVt(this))},F(Ke,"Maps/ViewCachingAbstractMap",1987),D(389,1987,mv,l8),l.xc=function(e){return zon(this,e)},l.Bc=function(e){return rln(this,e)},l.$b=function(){this.d==this.e.c?this.e.$b():Vj(new Uwt(this))},l._b=function(e){return eie(this.d,e)},l.Ec=function(){return new Yk(this)},l.Dc=function(){return this.Ec()},l.Fb=function(e){return this===e||yi(this.d,e)},l.Hb=function(){return Hi(this.d)},l.ec=function(){return this.e.ec()},l.gc=function(){return this.d.gc()},l.Ib=function(){return $o(this.d)},F(Ke,"AbstractMapBasedMultimap/AsMap",389);var j1=Ki(Xo,"Iterable");D(28,1,xy),l.Jc=function(e){va(this,e)},l.Lc=function(){return this.Oc()},l.Nc=function(){return new _n(this,0)},l.Oc=function(){return new Tn(null,this.Nc())},l.Fc=function(e){throw it(new Sg("Add not supported on this collection"))},l.Gc=function(e){return Ua(this,e)},l.$b=function(){Dvt(this)},l.Hc=function(e){return ay(this,e,!1)},l.Ic=function(e){return ND(this,e)},l.dc=function(){return this.gc()==0},l.Mc=function(e){return ay(this,e,!0)},l.Pc=function(){return svt(this)},l.Qc=function(e){return eI(this,e)},l.Ib=function(){return eb(this)},F(pr,"AbstractCollection",28);var jh=Ki(pr,"Set");D(N1,28,zu),l.Nc=function(){return new _n(this,1)},l.Fb=function(e){return Yie(this,e)},l.Hb=function(){return Tyt(this)},F(pr,"AbstractSet",N1),D(1970,N1,zu),F(Ke,"Sets/ImprovedAbstractSet",1970),D(1971,1970,zu),l.$b=function(){this.Rc().$b()},l.Hc=function(e){return Lie(this,e)},l.dc=function(){return this.Rc().dc()},l.Mc=function(e){var n;return this.Hc(e)?(n=u(e,42),this.Rc().ec().Mc(n.cd())):!1},l.gc=function(){return this.Rc().gc()},F(Ke,"Maps/EntrySet",1971),D(1097,1971,zu,Yk),l.Hc=function(e){return Jyt(this.a.d.vc(),e)},l.Kc=function(){return new Uwt(this.a)},l.Rc=function(){return this.a},l.Mc=function(e){var n;return Jyt(this.a.d.vc(),e)?(n=u(e,42),San(this.a.e,n.cd()),!0):!1},l.Nc=function(){return XM(this.a.d.vc().Nc(),new nR(this.a))},F(Ke,"AbstractMapBasedMultimap/AsMap/AsMapEntries",1097),D(1098,1,{},nR),l.Kb=function(e){return MJt(this.a,u(e,42))},F(Ke,"AbstractMapBasedMultimap/AsMap/AsMapEntries/0methodref$wrapEntry$Type",1098),D(730,1,sa,Uwt),l.Nb=function(e){ba(this,e)},l.Pb=function(){var e;return e=u(this.b.Pb(),42),this.a=u(e.dd(),14),MJt(this.c,e)},l.Ob=function(){return this.b.Ob()},l.Qb=function(){i4(!!this.a),this.b.Qb(),this.c.e.d-=this.a.gc(),this.a.$b(),this.a=null},F(Ke,"AbstractMapBasedMultimap/AsMap/AsMapIterator",730),D(532,1970,zu,FR),l.$b=function(){this.b.$b()},l.Hc=function(e){return this.b._b(e)},l.Jc=function(e){Lr(e),this.b.wc(new Ctt(e))},l.dc=function(){return this.b.dc()},l.Kc=function(){return new FC(this.b.vc().Kc())},l.Mc=function(e){return this.b._b(e)?(this.b.Bc(e),!0):!1},l.gc=function(){return this.b.gc()},F(Ke,"Maps/KeySet",532),D(318,532,zu,K3),l.$b=function(){var e;Vj((e=this.b.vc().Kc(),new vbt(this,e)))},l.Ic=function(e){return this.b.ec().Ic(e)},l.Fb=function(e){return this===e||yi(this.b.ec(),e)},l.Hb=function(){return Hi(this.b.ec())},l.Kc=function(){var e;return e=this.b.vc().Kc(),new vbt(this,e)},l.Mc=function(e){var n,r;return r=0,n=u(this.b.Bc(e),14),n&&(r=n.gc(),n.$b(),this.a.d-=r),r>0},l.Nc=function(){return this.b.ec().Nc()},F(Ke,"AbstractMapBasedMultimap/KeySet",318),D(731,1,sa,vbt),l.Nb=function(e){ba(this,e)},l.Ob=function(){return this.c.Ob()},l.Pb=function(){return this.a=u(this.c.Pb(),42),this.a.cd()},l.Qb=function(){var e;i4(!!this.a),e=u(this.a.dd(),14),this.c.Qb(),this.b.a.d-=e.gc(),e.$b(),this.a=null},F(Ke,"AbstractMapBasedMultimap/KeySet/1",731),D(491,389,{83:1,161:1},HM),l.bc=function(){return this.Sc()},l.ec=function(){return this.Tc()},l.Sc=function(){return new mM(this.c,this.Uc())},l.Tc=function(){var e;return e=this.b,e||(this.b=this.Sc())},l.Uc=function(){return u(this.d,161)},F(Ke,"AbstractMapBasedMultimap/SortedAsMap",491),D(542,491,ufe,Dj),l.bc=function(){return new u8(this.a,u(u(this.d,161),171))},l.Sc=function(){return new u8(this.a,u(u(this.d,161),171))},l.ec=function(){var e;return e=this.b,u(e||(this.b=new u8(this.a,u(u(this.d,161),171))),271)},l.Tc=function(){var e;return e=this.b,u(e||(this.b=new u8(this.a,u(u(this.d,161),171))),271)},l.Uc=function(){return u(u(this.d,161),171)},F(Ke,"AbstractMapBasedMultimap/NavigableAsMap",542),D(490,318,lfe,mM),l.Nc=function(){return this.b.ec().Nc()},F(Ke,"AbstractMapBasedMultimap/SortedKeySet",490),D(388,490,Bxt,u8),F(Ke,"AbstractMapBasedMultimap/NavigableKeySet",388),D(541,28,xy,q$),l.Fc=function(e){var n,r;return cl(this),r=this.d.dc(),n=this.d.Fc(e),n&&(++this.f.d,r&&WM(this)),n},l.Gc=function(e){var n,r,s;return e.dc()?!1:(s=(cl(this),this.d.gc()),n=this.d.Gc(e),n&&(r=this.d.gc(),this.f.d+=r-s,s==0&&WM(this)),n)},l.$b=function(){var e;e=(cl(this),this.d.gc()),e!=0&&(this.d.$b(),this.f.d-=e,Kj(this))},l.Hc=function(e){return cl(this),this.d.Hc(e)},l.Ic=function(e){return cl(this),this.d.Ic(e)},l.Fb=function(e){return e===this?!0:(cl(this),yi(this.d,e))},l.Hb=function(){return cl(this),Hi(this.d)},l.Kc=function(){return cl(this),new Iwt(this)},l.Mc=function(e){var n;return cl(this),n=this.d.Mc(e),n&&(--this.f.d,Kj(this)),n},l.gc=function(){return iUt(this)},l.Nc=function(){return cl(this),this.d.Nc()},l.Ib=function(){return cl(this),$o(this.d)},F(Ke,"AbstractMapBasedMultimap/WrappedCollection",541);var wh=Ki(pr,"List");D(728,541,{20:1,28:1,14:1,15:1},ovt),l.ad=function(e){r4(this,e)},l.Nc=function(){return cl(this),this.d.Nc()},l.Vc=function(e,n){var r;cl(this),r=this.d.dc(),u(this.d,15).Vc(e,n),++this.a.d,r&&WM(this)},l.Wc=function(e,n){var r,s,o;return n.dc()?!1:(o=(cl(this),this.d.gc()),r=u(this.d,15).Wc(e,n),r&&(s=this.d.gc(),this.a.d+=s-o,o==0&&WM(this)),r)},l.Xb=function(e){return cl(this),u(this.d,15).Xb(e)},l.Xc=function(e){return cl(this),u(this.d,15).Xc(e)},l.Yc=function(){return cl(this),new BUt(this)},l.Zc=function(e){return cl(this),new XXt(this,e)},l.$c=function(e){var n;return cl(this),n=u(this.d,15).$c(e),--this.a.d,Kj(this),n},l._c=function(e,n){return cl(this),u(this.d,15)._c(e,n)},l.bd=function(e,n){return cl(this),zZt(this.a,this.e,u(this.d,15).bd(e,n),this.b?this.b:this)},F(Ke,"AbstractMapBasedMultimap/WrappedList",728),D(1096,728,{20:1,28:1,14:1,15:1,54:1},SWt),F(Ke,"AbstractMapBasedMultimap/RandomAccessWrappedList",1096),D(620,1,sa,Iwt),l.Nb=function(e){ba(this,e)},l.Ob=function(){return D8(this),this.b.Ob()},l.Pb=function(){return D8(this),this.b.Pb()},l.Qb=function(){lWt(this)},F(Ke,"AbstractMapBasedMultimap/WrappedCollection/WrappedIterator",620),D(729,620,n0,BUt,XXt),l.Qb=function(){lWt(this)},l.Rb=function(e){var n;n=iUt(this.a)==0,(D8(this),u(this.b,125)).Rb(e),++this.a.a.d,n&&WM(this.a)},l.Sb=function(){return(D8(this),u(this.b,125)).Sb()},l.Tb=function(){return(D8(this),u(this.b,125)).Tb()},l.Ub=function(){return(D8(this),u(this.b,125)).Ub()},l.Vb=function(){return(D8(this),u(this.b,125)).Vb()},l.Wb=function(e){(D8(this),u(this.b,125)).Wb(e)},F(Ke,"AbstractMapBasedMultimap/WrappedList/WrappedListIterator",729),D(727,541,lfe,J2t),l.Nc=function(){return cl(this),this.d.Nc()},F(Ke,"AbstractMapBasedMultimap/WrappedSortedSet",727),D(1095,727,Bxt,LUt),F(Ke,"AbstractMapBasedMultimap/WrappedNavigableSet",1095),D(1094,541,zu,zWt),l.Nc=function(){return cl(this),this.d.Nc()},F(Ke,"AbstractMapBasedMultimap/WrappedSet",1094),D(1103,1,{},B),l.Kb=function(e){return Oan(u(e,42))},F(Ke,"AbstractMapBasedMultimap/lambda$1$Type",1103),D(1102,1,{},ftt),l.Kb=function(e){return new Lw(this.a,e)},F(Ke,"AbstractMapBasedMultimap/lambda$2$Type",1102);var P2=Ki(pr,"Map/Entry");D(345,1,zq),l.Fb=function(e){var n;return _t(e,42)?(n=u(e,42),pd(this.cd(),n.cd())&&pd(this.dd(),n.dd())):!1},l.Hb=function(){var e,n;return e=this.cd(),n=this.dd(),(e==null?0:Hi(e))^(n==null?0:Hi(n))},l.ed=function(e){throw it(new Or)},l.Ib=function(){return this.cd()+"="+this.dd()},F(Ke,hfe,345),D(1988,28,xy),l.$b=function(){this.fd().$b()},l.Hc=function(e){var n;return _t(e,42)?(n=u(e,42),dsn(this.fd(),n.cd(),n.dd())):!1},l.Mc=function(e){var n;return _t(e,42)?(n=u(e,42),xZt(this.fd(),n.cd(),n.dd())):!1},l.gc=function(){return this.fd().d},F(Ke,"Multimaps/Entries",1988),D(733,1988,xy,nM),l.Kc=function(){return this.a.kc()},l.fd=function(){return this.a},l.Nc=function(){return this.a.lc()},F(Ke,"AbstractMultimap/Entries",733),D(734,733,zu,Ypt),l.Nc=function(){return this.a.lc()},l.Fb=function(e){return H4t(this,e)},l.Hb=function(){return kne(this)},F(Ke,"AbstractMultimap/EntrySet",734),D(735,28,xy,I3),l.$b=function(){this.a.$b()},l.Hc=function(e){return Qun(this.a,e)},l.Kc=function(){return this.a.nc()},l.gc=function(){return this.a.d},l.Nc=function(){return this.a.oc()},F(Ke,"AbstractMultimap/Values",735),D(1989,28,{835:1,20:1,28:1,14:1}),l.Jc=function(e){Lr(e),Q3(this).Jc(new Ttt(e))},l.Nc=function(){var e;return e=Q3(this).Nc(),zst(e,new vt,64|e.qd()&1296,this.a.d)},l.Fc=function(e){return rbt(),!0},l.Gc=function(e){return Lr(this),Lr(e),_t(e,543)?vsn(u(e,835)):!e.dc()&&oit(this,e.Kc())},l.Hc=function(e){var n;return n=u(sy(Wx(this.a),e),14),(n?n.gc():0)>0},l.Fb=function(e){return h2n(this,e)},l.Hb=function(){return Hi(Q3(this))},l.dc=function(){return Q3(this).dc()},l.Mc=function(e){return zoe(this,e,1)>0},l.Ib=function(){return $o(Q3(this))},F(Ke,"AbstractMultiset",1989),D(1991,1970,zu),l.$b=function(){cz(this.a.a)},l.Hc=function(e){var n,r;return _t(e,492)?(r=u(e,416),u(r.a.dd(),14).gc()<=0?!1:(n=QQt(this.a,r.a.cd()),n==u(r.a.dd(),14).gc())):!1},l.Mc=function(e){var n,r,s,o;return _t(e,492)&&(r=u(e,416),n=r.a.cd(),s=u(r.a.dd(),14).gc(),s!=0)?(o=this.a,Jpn(o,n,s)):!1},F(Ke,"Multisets/EntrySet",1991),D(1109,1991,zu,rM),l.Kc=function(){return new tHt($Kt(Wx(this.a.a)).Kc())},l.gc=function(){return Wx(this.a.a).gc()},F(Ke,"AbstractMultiset/EntrySet",1109),D(619,726,T2),l.hc=function(){return this.gd()},l.jc=function(){return this.hd()},l.cc=function(e){return this.jd(e)},l.fc=function(e){return this.kd(e)},l.Zb=function(){var e;return e=this.f,e||(this.f=this.ac())},l.hd=function(){return wn(),wn(),rV},l.Fb=function(e){return Pit(this,e)},l.jd=function(e){return u(Ai(this,e),21)},l.kd=function(e){return u(GD(this,e),21)},l.mc=function(e){return wn(),new s8(u(e,21))},l.pc=function(e,n){return new zWt(this,e,u(n,21))},F(Ke,"AbstractSetMultimap",619),D(1657,619,T2),l.hc=function(){return new Op(this.b)},l.gd=function(){return new Op(this.b)},l.jc=function(){return kvt(new Op(this.b))},l.hd=function(){return kvt(new Op(this.b))},l.cc=function(e){return u(u(Ai(this,e),21),84)},l.jd=function(e){return u(u(Ai(this,e),21),84)},l.fc=function(e){return u(u(GD(this,e),21),84)},l.kd=function(e){return u(u(GD(this,e),21),84)},l.mc=function(e){return _t(e,271)?kvt(u(e,271)):(wn(),new I2t(u(e,84)))},l.Zb=function(){var e;return e=this.f,e||(this.f=_t(this.c,171)?new Dj(this,u(this.c,171)):_t(this.c,161)?new HM(this,u(this.c,161)):new l8(this,this.c))},l.pc=function(e,n){return _t(n,271)?new LUt(this,e,u(n,271)):new J2t(this,e,u(n,84))},F(Ke,"AbstractSortedSetMultimap",1657),D(1658,1657,T2),l.Zb=function(){var e;return e=this.f,u(u(e||(this.f=_t(this.c,171)?new Dj(this,u(this.c,171)):_t(this.c,161)?new HM(this,u(this.c,161)):new l8(this,this.c)),161),171)},l.ec=function(){var e;return e=this.i,u(u(e||(this.i=_t(this.c,171)?new u8(this,u(this.c,171)):_t(this.c,161)?new mM(this,u(this.c,161)):new K3(this,this.c)),84),271)},l.bc=function(){return _t(this.c,171)?new u8(this,u(this.c,171)):_t(this.c,161)?new mM(this,u(this.c,161)):new K3(this,this.c)},F(Ke,"AbstractSortedKeySortedSetMultimap",1658),D(2010,1,{1947:1}),l.Fb=function(e){return qdn(this,e)},l.Hb=function(){var e;return Tyt((e=this.g,e||(this.g=new yC(this))))},l.Ib=function(){var e;return Tae((e=this.f,e||(this.f=new T2t(this))))},F(Ke,"AbstractTable",2010),D(665,N1,zu,yC),l.$b=function(){lHt()},l.Hc=function(e){var n,r;return _t(e,468)?(n=u(e,682),r=u(sy(uXt(this.a),Np(n.c.e,n.b)),83),!!r&&Jyt(r.vc(),new Lw(Np(n.c.c,n.a),t6(n.c,n.b,n.a)))):!1},l.Kc=function(){return _rn(this.a)},l.Mc=function(e){var n,r;return _t(e,468)?(n=u(e,682),r=u(sy(uXt(this.a),Np(n.c.e,n.b)),83),!!r&&Tln(r.vc(),new Lw(Np(n.c.c,n.a),t6(n.c,n.b,n.a)))):!1},l.gc=function(){return xKt(this.a)},l.Nc=function(){return xsn(this.a)},F(Ke,"AbstractTable/CellSet",665),D(1928,28,xy,dtt),l.$b=function(){lHt()},l.Hc=function(e){return O0n(this.a,e)},l.Kc=function(){return Srn(this.a)},l.gc=function(){return xKt(this.a)},l.Nc=function(){return TZt(this.a)},F(Ke,"AbstractTable/Values",1928),D(1632,1631,T2),F(Ke,"ArrayListMultimapGwtSerializationDependencies",1632),D(513,1632,T2,wet,Wvt),l.hc=function(){return new Xc(this.a)},l.a=0,F(Ke,"ArrayListMultimap",513),D(664,2010,{664:1,1947:1,3:1},Qoe),F(Ke,"ArrayTable",664),D(1924,386,NE,iWt),l.Xb=function(e){return new Ayt(this.a,e)},F(Ke,"ArrayTable/1",1924),D(1925,1,{},eR),l.ld=function(e){return new Ayt(this.a,e)},F(Ke,"ArrayTable/1methodref$getCell$Type",1925),D(2011,1,{682:1}),l.Fb=function(e){var n;return e===this?!0:_t(e,468)?(n=u(e,682),pd(Np(this.c.e,this.b),Np(n.c.e,n.b))&&pd(Np(this.c.c,this.a),Np(n.c.c,n.a))&&pd(t6(this.c,this.b,this.a),t6(n.c,n.b,n.a))):!1},l.Hb=function(){return Az(lt(ct(Qn,1),De,1,5,[Np(this.c.e,this.b),Np(this.c.c,this.a),t6(this.c,this.b,this.a)]))},l.Ib=function(){return"("+Np(this.c.e,this.b)+","+Np(this.c.c,this.a)+")="+t6(this.c,this.b,this.a)},F(Ke,"Tables/AbstractCell",2011),D(468,2011,{468:1,682:1},Ayt),l.a=0,l.b=0,l.d=0,F(Ke,"ArrayTable/2",468),D(1927,1,{},gx),l.ld=function(e){return Fte(this.a,e)},F(Ke,"ArrayTable/2methodref$getValue$Type",1927),D(1926,386,NE,sWt),l.Xb=function(e){return Fte(this.a,e)},F(Ke,"ArrayTable/3",1926),D(1979,1967,mv),l.$b=function(){Vj(this.kc())},l.vc=function(){return new bx(this)},l.lc=function(){return new BXt(this.kc(),this.gc())},F(Ke,"Maps/IteratorBasedAbstractMap",1979),D(828,1979,mv),l.$b=function(){throw it(new Or)},l._b=function(e){return LHt(this.c,e)},l.kc=function(){return new aWt(this,this.c.b.c.gc())},l.lc=function(){return Bnt(this.c.b.c.gc(),16,new bw(this))},l.xc=function(e){var n;return n=u(x9(this.c,e),19),n?this.nd(n.a):null},l.dc=function(){return this.c.b.c.dc()},l.ec=function(){return Gnt(this.c)},l.zc=function(e,n){var r;if(r=u(x9(this.c,e),19),!r)throw it(new Fn(this.md()+" "+e+" not in "+Gnt(this.c)));return this.od(r.a,n)},l.Bc=function(e){throw it(new Or)},l.gc=function(){return this.c.b.c.gc()},F(Ke,"ArrayTable/ArrayMap",828),D(1923,1,{},bw),l.ld=function(e){return hXt(this.a,e)},F(Ke,"ArrayTable/ArrayMap/0methodref$getEntry$Type",1923),D(1921,345,zq,uVt),l.cd=function(){return qQe(this.a,this.b)},l.dd=function(){return this.a.nd(this.b)},l.ed=function(e){return this.a.od(this.b,e)},l.b=0,F(Ke,"ArrayTable/ArrayMap/1",1921),D(1922,386,NE,aWt),l.Xb=function(e){return hXt(this.a,e)},F(Ke,"ArrayTable/ArrayMap/2",1922),D(1920,828,mv,ZKt),l.md=function(){return"Column"},l.nd=function(e){return t6(this.b,this.a,e)},l.od=function(e,n){return ore(this.b,this.a,e,n)},l.a=0,F(Ke,"ArrayTable/Row",1920),D(829,828,mv,T2t),l.nd=function(e){return new ZKt(this.a,e)},l.zc=function(e,n){return u(n,83),CKe()},l.od=function(e,n){return u(n,83),_Ke()},l.md=function(){return"Row"},F(Ke,"ArrayTable/RowMap",829),D(1120,1,Ih,lVt),l.qd=function(){return this.a.qd()&-262},l.rd=function(){return this.a.rd()},l.Nb=function(e){this.a.Nb(new sVt(e,this.b))},l.sd=function(e){return this.a.sd(new iVt(e,this.b))},F(Ke,"CollectSpliterators/1",1120),D(1121,1,Un,iVt),l.td=function(e){this.a.td(this.b.Kb(e))},F(Ke,"CollectSpliterators/1/lambda$0$Type",1121),D(1122,1,Un,sVt),l.td=function(e){this.a.td(this.b.Kb(e))},F(Ke,"CollectSpliterators/1/lambda$1$Type",1122),D(1123,1,Ih,FZt),l.qd=function(){return this.a},l.rd=function(){return this.d&&(this.b=jUt(this.b,this.d.rd())),jUt(this.b,0)},l.Nb=function(e){this.d&&(this.d.Nb(e),this.d=null),this.c.Nb(new rVt(this.e,e)),this.b=0},l.sd=function(e){for(;;){if(this.d&&this.d.sd(e))return u9(this.b,qq)&&(this.b=Jp(this.b,1)),!0;if(this.d=null,!this.c.sd(new aVt(this,this.e)))return!1}},l.a=0,l.b=0,F(Ke,"CollectSpliterators/1FlatMapSpliterator",1123),D(1124,1,Un,aVt),l.td=function(e){GZe(this.a,this.b,e)},F(Ke,"CollectSpliterators/1FlatMapSpliterator/lambda$0$Type",1124),D(1125,1,Un,rVt),l.td=function(e){LQe(this.b,this.a,e)},F(Ke,"CollectSpliterators/1FlatMapSpliterator/lambda$1$Type",1125),D(1117,1,Ih,wYt),l.qd=function(){return 16464|this.b},l.rd=function(){return this.a.rd()},l.Nb=function(e){this.a.xe(new cVt(e,this.c))},l.sd=function(e){return this.a.ye(new oVt(e,this.c))},l.b=0,F(Ke,"CollectSpliterators/1WithCharacteristics",1117),D(1118,1,OI,oVt),l.ud=function(e){this.a.td(this.b.ld(e))},F(Ke,"CollectSpliterators/1WithCharacteristics/lambda$0$Type",1118),D(1119,1,OI,cVt),l.ud=function(e){this.a.td(this.b.ld(e))},F(Ke,"CollectSpliterators/1WithCharacteristics/lambda$1$Type",1119),D(245,1,Uat),l.wd=function(e){return this.vd(u(e,245))},l.vd=function(e){var n;return e==(oet(),Sut)?1:e==(cet(),_ut)?-1:(n=(zj(),ID(this.a,e.a)),n!=0?n:_t(this,519)==_t(e,519)?0:_t(this,519)?1:-1)},l.zd=function(){return this.a},l.Fb=function(e){return D3t(this,e)},F(Ke,"Cut",245),D(1761,245,Uat,dHt),l.vd=function(e){return e==this?0:1},l.xd=function(e){throw it(new Mpt)},l.yd=function(e){e.a+="+∞)"},l.zd=function(){throw it(new No(dfe))},l.Hb=function(){return Gd(),$3t(this)},l.Ad=function(e){return!1},l.Ib=function(){return"+∞"};var _ut;F(Ke,"Cut/AboveAll",1761),D(519,245,{245:1,519:1,3:1,35:1},hWt),l.xd=function(e){hc((e.a+="(",e),this.a)},l.yd=function(e){qp(hc(e,this.a),93)},l.Hb=function(){return~Hi(this.a)},l.Ad=function(e){return zj(),ID(this.a,e)<0},l.Ib=function(){return"/"+this.a+"\\"},F(Ke,"Cut/AboveValue",519),D(1760,245,Uat,gHt),l.vd=function(e){return e==this?0:-1},l.xd=function(e){e.a+="(-∞"},l.yd=function(e){throw it(new Mpt)},l.zd=function(){throw it(new No(dfe))},l.Hb=function(){return Gd(),$3t(this)},l.Ad=function(e){return!0},l.Ib=function(){return"-∞"};var Sut;F(Ke,"Cut/BelowAll",1760),D(1762,245,Uat,fWt),l.xd=function(e){hc((e.a+="[",e),this.a)},l.yd=function(e){qp(hc(e,this.a),41)},l.Hb=function(){return Hi(this.a)},l.Ad=function(e){return zj(),ID(this.a,e)<=0},l.Ib=function(){return"\\"+this.a+"/"},F(Ke,"Cut/BelowValue",1762),D(537,1,r0),l.Jc=function(e){va(this,e)},l.Ib=function(){return thn(u(g$(this,"use Optional.orNull() instead of Optional.or(null)"),20).Kc())},F(Ke,"FluentIterable",537),D(433,537,r0,f9),l.Kc=function(){return new ar(lr(this.a.Kc(),new z))},F(Ke,"FluentIterable/2",433),D(1046,537,r0,bUt),l.Kc=function(){return zp(this)},F(Ke,"FluentIterable/3",1046),D(708,386,NE,C2t),l.Xb=function(e){return this.a[e].Kc()},F(Ke,"FluentIterable/3/1",708),D(1972,1,{}),l.Ib=function(){return $o(this.Bd().b)},F(Ke,"ForwardingObject",1972),D(1973,1972,gfe),l.Bd=function(){return this.Cd()},l.Jc=function(e){va(this,e)},l.Lc=function(){return this.Oc()},l.Nc=function(){return new _n(this,0)},l.Oc=function(){return new Tn(null,this.Nc())},l.Fc=function(e){return this.Cd(),OHt()},l.Gc=function(e){return this.Cd(),PHt()},l.$b=function(){this.Cd(),FHt()},l.Hc=function(e){return this.Cd().Hc(e)},l.Ic=function(e){return this.Cd().Ic(e)},l.dc=function(){return this.Cd().b.dc()},l.Kc=function(){return this.Cd().Kc()},l.Mc=function(e){return this.Cd(),NHt()},l.gc=function(){return this.Cd().b.gc()},l.Pc=function(){return this.Cd().Pc()},l.Qc=function(e){return this.Cd().Qc(e)},F(Ke,"ForwardingCollection",1973),D(1980,28,Rxt),l.Kc=function(){return this.Ed()},l.Fc=function(e){throw it(new Or)},l.Gc=function(e){throw it(new Or)},l.$b=function(){throw it(new Or)},l.Hc=function(e){return e!=null&&ay(this,e,!1)},l.Dd=function(){switch(this.gc()){case 0:return Wm(),Wm(),Aut;case 1:return Wm(),new Rnt(Lr(this.Ed().Pb()));default:return new JKt(this,this.Pc())}},l.Mc=function(e){throw it(new Or)},F(Ke,"ImmutableCollection",1980),D(712,1980,Rxt,Apt),l.Kc=function(){return e6(this.a.Kc())},l.Hc=function(e){return e!=null&&this.a.Hc(e)},l.Ic=function(e){return this.a.Ic(e)},l.dc=function(){return this.a.dc()},l.Ed=function(){return e6(this.a.Kc())},l.gc=function(){return this.a.gc()},l.Pc=function(){return this.a.Pc()},l.Qc=function(e){return this.a.Qc(e)},l.Ib=function(){return $o(this.a)},F(Ke,"ForwardingImmutableCollection",712),D(152,1980,M_),l.Kc=function(){return this.Ed()},l.Yc=function(){return this.Fd(0)},l.Zc=function(e){return this.Fd(e)},l.ad=function(e){r4(this,e)},l.Nc=function(){return new _n(this,16)},l.bd=function(e,n){return this.Gd(e,n)},l.Vc=function(e,n){throw it(new Or)},l.Wc=function(e,n){throw it(new Or)},l.Fb=function(e){return Kbn(this,e)},l.Hb=function(){return aun(this)},l.Xc=function(e){return e==null?-1:m1n(this,e)},l.Ed=function(){return this.Fd(0)},l.Fd=function(e){return $2t(this,e)},l.$c=function(e){throw it(new Or)},l._c=function(e,n){throw it(new Or)},l.Gd=function(e,n){var r;return Dz((r=new xVt(this),new Qd(r,e,n)))};var Aut;F(Ke,"ImmutableList",152),D(2006,152,M_),l.Kc=function(){return e6(this.Hd().Kc())},l.bd=function(e,n){return Dz(this.Hd().bd(e,n))},l.Hc=function(e){return e!=null&&this.Hd().Hc(e)},l.Ic=function(e){return this.Hd().Ic(e)},l.Fb=function(e){return yi(this.Hd(),e)},l.Xb=function(e){return Np(this,e)},l.Hb=function(){return Hi(this.Hd())},l.Xc=function(e){return this.Hd().Xc(e)},l.dc=function(){return this.Hd().dc()},l.Ed=function(){return e6(this.Hd().Kc())},l.gc=function(){return this.Hd().gc()},l.Gd=function(e,n){return Dz(this.Hd().bd(e,n))},l.Pc=function(){return this.Hd().Qc(Nt(Qn,De,1,this.Hd().gc(),5,1))},l.Qc=function(e){return this.Hd().Qc(e)},l.Ib=function(){return $o(this.Hd())},F(Ke,"ForwardingImmutableList",2006),D(714,1,BE),l.vc=function(){return Rw(this)},l.wc=function(e){K9(this,e)},l.ec=function(){return Gnt(this)},l.yc=function(e,n,r){return Qit(this,e,n,r)},l.Cc=function(){return this.Ld()},l.$b=function(){throw it(new Or)},l._b=function(e){return this.xc(e)!=null},l.uc=function(e){return this.Ld().Hc(e)},l.Jd=function(){return new iqt(this)},l.Kd=function(){return new sqt(this)},l.Fb=function(e){return Zun(this,e)},l.Hb=function(){return Rw(this).Hb()},l.dc=function(){return this.gc()==0},l.zc=function(e,n){return SKe()},l.Bc=function(e){throw it(new Or)},l.Ib=function(){return Mgn(this)},l.Ld=function(){return this.e?this.e:this.e=this.Kd()},l.c=null,l.d=null,l.e=null;var Age;F(Ke,"ImmutableMap",714),D(715,714,BE),l._b=function(e){return LHt(this,e)},l.uc=function(e){return CVt(this.b,e)},l.Id=function(){return tie(new kC(this))},l.Jd=function(){return tie(OXt(this.b))},l.Kd=function(){return gd(),new Apt(IXt(this.b))},l.Fb=function(e){return _Vt(this.b,e)},l.xc=function(e){return x9(this,e)},l.Hb=function(){return Hi(this.b.c)},l.dc=function(){return this.b.c.dc()},l.gc=function(){return this.b.c.gc()},l.Ib=function(){return $o(this.b.c)},F(Ke,"ForwardingImmutableMap",715),D(1974,1973,Wat),l.Bd=function(){return this.Md()},l.Cd=function(){return this.Md()},l.Nc=function(){return new _n(this,1)},l.Fb=function(e){return e===this||this.Md().Fb(e)},l.Hb=function(){return this.Md().Hb()},F(Ke,"ForwardingSet",1974),D(1069,1974,Wat,kC),l.Bd=function(){return L8(this.a.b)},l.Cd=function(){return L8(this.a.b)},l.Hc=function(e){if(_t(e,42)&&u(e,42).cd()==null)return!1;try{return TVt(L8(this.a.b),e)}catch(n){if(n=Wi(n),_t(n,205))return!1;throw it(n)}},l.Md=function(){return L8(this.a.b)},l.Qc=function(e){var n;return n=gQt(L8(this.a.b),e),L8(this.a.b).b.gc()=0?"+":"")+(r/60|0),n=gj(b.Math.abs(r)%60),(Pae(),Vge)[this.q.getDay()]+" "+Gge[this.q.getMonth()]+" "+gj(this.q.getDate())+" "+gj(this.q.getHours())+":"+gj(this.q.getMinutes())+":"+gj(this.q.getSeconds())+" GMT"+e+n+" "+this.q.getFullYear()};var tV=F(pr,"Date",199);D(1915,199,Efe,oae),l.a=!1,l.b=0,l.c=0,l.d=0,l.e=0,l.f=0,l.g=!1,l.i=0,l.j=0,l.k=0,l.n=0,l.o=0,l.p=0,F("com.google.gwt.i18n.shared.impl","DateRecord",1915),D(1966,1,{}),l.fe=function(){return null},l.ge=function(){return null},l.he=function(){return null},l.ie=function(){return null},l.je=function(){return null},F(v6,"JSONValue",1966),D(216,1966,{216:1},Eg,wx),l.Fb=function(e){return _t(e,216)?Xvt(this.a,u(e,216).a):!1},l.ee=function(){return KYe},l.Hb=function(){return Bvt(this.a)},l.fe=function(){return this},l.Ib=function(){var e,n,r;for(r=new Ol("["),n=0,e=this.a.length;n0&&(r.a+=","),hc(r,Jm(this,n));return r.a+="]",r.a},F(v6,"JSONArray",216),D(483,1966,{483:1},Xk),l.ee=function(){return XYe},l.ge=function(){return this},l.Ib=function(){return Nn(),""+this.a},l.a=!1;var Fge,Nge;F(v6,"JSONBoolean",483),D(985,60,Q0,eHt),F(v6,"JSONException",985),D(1023,1966,{},ft),l.ee=function(){return eKe},l.Ib=function(){return _u};var Bge;F(v6,"JSONNull",1023),D(258,1966,{258:1},EC),l.Fb=function(e){return _t(e,258)?this.a==u(e,258).a:!1},l.ee=function(){return QYe},l.Hb=function(){return p8(this.a)},l.he=function(){return this},l.Ib=function(){return this.a+""},l.a=0,F(v6,"JSONNumber",258),D(183,1966,{183:1},_x,Qk),l.Fb=function(e){return _t(e,183)?Xvt(this.a,u(e,183).a):!1},l.ee=function(){return ZYe},l.Hb=function(){return Bvt(this.a)},l.ie=function(){return this},l.Ib=function(){var e,n,r,s,o,h,d;for(d=new Ol("{"),e=!0,h=yit(this,Nt(Ae,ee,2,0,6,1)),r=h,s=0,o=r.length;s=0?":"+this.c:"")+")"},l.c=0;var wEt=F(Xo,"StackTraceElement",310);Sge={3:1,475:1,35:1,2:1};var Ae=F(Xo,jxt,2);D(107,418,{475:1},Ag,$C,_h),F(Xo,"StringBuffer",107),D(100,418,{475:1},Mp,Im,Ol),F(Xo,"StringBuilder",100),D(687,73,bot,sbt),F(Xo,"StringIndexOutOfBoundsException",687),D(2043,1,{});var vEt;D(844,1,{},Ft),l.Kb=function(e){return u(e,78).e},F(Xo,"Throwable/lambda$0$Type",844),D(41,60,{3:1,102:1,60:1,78:1,41:1},Or,Sg),F(Xo,"UnsupportedOperationException",41),D(240,236,{3:1,35:1,236:1,240:1},SD,gbt),l.wd=function(e){return gle(this,u(e,240))},l.ke=function(){return dy(Xle(this))},l.Fb=function(e){var n;return this===e?!0:_t(e,240)?(n=u(e,240),this.e==n.e&&gle(this,n)==0):!1},l.Hb=function(){var e;return this.b!=0?this.b:this.a<54?(e=Tu(this.f),this.b=Ar(Ns(e,-1)),this.b=33*this.b+Ar(Ns($p(e,32),-1)),this.b=17*this.b+ps(this.e),this.b):(this.b=17*Yre(this.c)+ps(this.e),this.b)},l.Ib=function(){return Xle(this)},l.a=0,l.b=0,l.d=0,l.e=0,l.f=0;var zge,N2,mEt,yEt,xEt,kEt,EEt,TEt,Nut=F("java.math","BigDecimal",240);D(91,236,{3:1,35:1,236:1,91:1},j3t,Ng,X3,x4t,Qie,Rp),l.wd=function(e){return Uie(this,u(e,91))},l.ke=function(){return dy(Hat(this,0))},l.Fb=function(e){return v3t(this,e)},l.Hb=function(){return Yre(this)},l.Ib=function(){return Hat(this,0)},l.b=-2,l.c=0,l.d=0,l.e=0;var But,eV,CEt,Rut,nV,s7,j4=F("java.math","BigInteger",91),qge,Hge,D6,lS;D(488,1967,mv),l.$b=function(){Xu(this)},l._b=function(e){return Tl(this,e)},l.uc=function(e){return Ire(this,e,this.g)||Ire(this,e,this.f)},l.vc=function(){return new Cg(this)},l.xc=function(e){return tr(this,e)},l.zc=function(e,n){return ki(this,e,n)},l.Bc=function(e){return Jx(this,e)},l.gc=function(){return HC(this)},F(pr,"AbstractHashMap",488),D(261,N1,zu,Cg),l.$b=function(){this.a.$b()},l.Hc=function(e){return MZt(this,e)},l.Kc=function(){return new p2(this.a)},l.Mc=function(e){var n;return MZt(this,e)?(n=u(e,42).cd(),this.a.Bc(n),!0):!1},l.gc=function(){return this.a.gc()},F(pr,"AbstractHashMap/EntrySet",261),D(262,1,sa,p2),l.Nb=function(e){ba(this,e)},l.Pb=function(){return Zw(this)},l.Ob=function(){return this.b},l.Qb=function(){Ste(this)},l.b=!1,F(pr,"AbstractHashMap/EntrySetIterator",262),D(417,1,sa,mx),l.Nb=function(e){ba(this,e)},l.Ob=function(){return TM(this)},l.Pb=function(){return ZXt(this)},l.Qb=function(){Cl(this)},l.b=0,l.c=-1,F(pr,"AbstractList/IteratorImpl",417),D(96,417,n0,da),l.Qb=function(){Cl(this)},l.Rb=function(e){zm(this,e)},l.Sb=function(){return this.b>0},l.Tb=function(){return this.b},l.Ub=function(){return Zn(this.b>0),this.a.Xb(this.c=--this.b)},l.Vb=function(){return this.b-1},l.Wb=function(e){Rm(this.c!=-1),this.a._c(this.c,e)},F(pr,"AbstractList/ListIteratorImpl",96),D(219,52,jE,Qd),l.Vc=function(e,n){Km(e,this.b),this.c.Vc(this.a+e,n),++this.b},l.Xb=function(e){return An(e,this.b),this.c.Xb(this.a+e)},l.$c=function(e){var n;return An(e,this.b),n=this.c.$c(this.a+e),--this.b,n},l._c=function(e,n){return An(e,this.b),this.c._c(this.a+e,n)},l.gc=function(){return this.b},l.a=0,l.b=0,F(pr,"AbstractList/SubList",219),D(384,N1,zu,Sm),l.$b=function(){this.a.$b()},l.Hc=function(e){return this.a._b(e)},l.Kc=function(){var e;return e=this.a.vc().Kc(),new cM(e)},l.Mc=function(e){return this.a._b(e)?(this.a.Bc(e),!0):!1},l.gc=function(){return this.a.gc()},F(pr,"AbstractMap/1",384),D(691,1,sa,cM),l.Nb=function(e){ba(this,e)},l.Ob=function(){return this.a.Ob()},l.Pb=function(){var e;return e=u(this.a.Pb(),42),e.cd()},l.Qb=function(){this.a.Qb()},F(pr,"AbstractMap/1/1",691),D(226,28,xy,v1),l.$b=function(){this.a.$b()},l.Hc=function(e){return this.a.uc(e)},l.Kc=function(){var e;return e=this.a.vc().Kc(),new m1(e)},l.gc=function(){return this.a.gc()},F(pr,"AbstractMap/2",226),D(294,1,sa,m1),l.Nb=function(e){ba(this,e)},l.Ob=function(){return this.a.Ob()},l.Pb=function(){var e;return e=u(this.a.Pb(),42),e.dd()},l.Qb=function(){this.a.Qb()},F(pr,"AbstractMap/2/1",294),D(484,1,{484:1,42:1}),l.Fb=function(e){var n;return _t(e,42)?(n=u(e,42),Fc(this.d,n.cd())&&Fc(this.e,n.dd())):!1},l.cd=function(){return this.d},l.dd=function(){return this.e},l.Hb=function(){return U3(this.d)^U3(this.e)},l.ed=function(e){return awt(this,e)},l.Ib=function(){return this.d+"="+this.e},F(pr,"AbstractMap/AbstractEntry",484),D(383,484,{484:1,383:1,42:1},KR),F(pr,"AbstractMap/SimpleEntry",383),D(1984,1,yot),l.Fb=function(e){var n;return _t(e,42)?(n=u(e,42),Fc(this.cd(),n.cd())&&Fc(this.dd(),n.dd())):!1},l.Hb=function(){return U3(this.cd())^U3(this.dd())},l.Ib=function(){return this.cd()+"="+this.dd()},F(pr,hfe,1984),D(1992,1967,ufe),l.tc=function(e){return RJt(this,e)},l._b=function(e){return _nt(this,e)},l.vc=function(){return new x(this)},l.xc=function(e){var n;return n=e,ec(jyt(this,n))},l.ec=function(){return new y(this)},F(pr,"AbstractNavigableMap",1992),D(739,N1,zu,x),l.Hc=function(e){return _t(e,42)&&RJt(this.b,u(e,42))},l.Kc=function(){return new y9(this.b)},l.Mc=function(e){var n;return _t(e,42)?(n=u(e,42),Cte(this.b,n)):!1},l.gc=function(){return this.b.c},F(pr,"AbstractNavigableMap/EntrySet",739),D(493,N1,Bxt,y),l.Nc=function(){return new WR(this)},l.$b=function(){NC(this.a)},l.Hc=function(e){return _nt(this.a,e)},l.Kc=function(){var e;return e=new y9(new w9(this.a).b),new g(e)},l.Mc=function(e){return _nt(this.a,e)?(P9(this.a,e),!0):!1},l.gc=function(){return this.a.c},F(pr,"AbstractNavigableMap/NavigableKeySet",493),D(494,1,sa,g),l.Nb=function(e){ba(this,e)},l.Ob=function(){return TM(this.a.a)},l.Pb=function(){var e;return e=Lj(this.a),e.cd()},l.Qb=function(){AYt(this.a)},F(pr,"AbstractNavigableMap/NavigableKeySet/1",494),D(2004,28,xy),l.Fc=function(e){return R8(xE(this,e)),!0},l.Gc=function(e){return On(e),Bj(e!=this,"Can't add a queue to itself"),Ua(this,e)},l.$b=function(){for(;cit(this)!=null;);},F(pr,"AbstractQueue",2004),D(302,28,{4:1,20:1,28:1,14:1},B3,eZt),l.Fc=function(e){return imt(this,e),!0},l.$b=function(){lmt(this)},l.Hc=function(e){return ere(new O9(this),e)},l.dc=function(){return BC(this)},l.Kc=function(){return new O9(this)},l.Mc=function(e){return hin(new O9(this),e)},l.gc=function(){return this.c-this.b&this.a.length-1},l.Nc=function(){return new _n(this,272)},l.Qc=function(e){var n;return n=this.c-this.b&this.a.length-1,e.lengthn&&ts(e,n,null),e},l.b=0,l.c=0,F(pr,"ArrayDeque",302),D(446,1,sa,O9),l.Nb=function(e){ba(this,e)},l.Ob=function(){return this.a!=this.b},l.Pb=function(){return Mz(this)},l.Qb=function(){Jee(this)},l.a=0,l.b=0,l.c=-1,F(pr,"ArrayDeque/IteratorImpl",446),D(12,52,_fe,he,Xc,Bu),l.Vc=function(e,n){Hm(this,e,n)},l.Fc=function(e){return le(this,e)},l.Wc=function(e,n){return Gyt(this,e,n)},l.Gc=function(e){return Ls(this,e)},l.$b=function(){this.c=Nt(Qn,De,1,0,5,1)},l.Hc=function(e){return Ro(this,e,0)!=-1},l.Jc=function(e){xu(this,e)},l.Xb=function(e){return Ne(this,e)},l.Xc=function(e){return Ro(this,e,0)},l.dc=function(){return this.c.length==0},l.Kc=function(){return new S(this)},l.$c=function(e){return Fg(this,e)},l.Mc=function(e){return mu(this,e)},l.Ud=function(e,n){tZt(this,e,n)},l._c=function(e,n){return ch(this,e,n)},l.gc=function(){return this.c.length},l.ad=function(e){Zs(this,e)},l.Pc=function(){return pnt(this)},l.Qc=function(e){return P1(this,e)};var Kxn=F(pr,"ArrayList",12);D(7,1,sa,S),l.Nb=function(e){ba(this,e)},l.Ob=function(){return Go(this)},l.Pb=function(){return J(this)},l.Qb=function(){L9(this)},l.a=0,l.b=-1,F(pr,"ArrayList/1",7),D(2013,b.Function,{},Tt),l.te=function(e,n){return Ms(e,n)},D(154,52,Sfe,yl),l.Hc=function(e){return ene(this,e)!=-1},l.Jc=function(e){var n,r,s,o;for(On(e),r=this.a,s=0,o=r.length;s>>0,e.toString(16)))},l.f=0,l.i=Cs;var oV=F(a0,"CNode",57);D(814,1,{},jpt),F(a0,"CNode/CNodeBuilder",814);var spe;D(1525,1,{},Po),l.Oe=function(e,n){return 0},l.Pe=function(e,n){return 0},F(a0,Ffe,1525),D(1790,1,{},vs),l.Le=function(e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt;for(C=as,s=new S(e.a.b);s.as.d.c||s.d.c==h.d.c&&s.d.b0?e+this.n.d+this.n.a:0},l.Se=function(){var e,n,r,s,o;if(o=0,this.e)this.b?o=this.b.a:this.a[1][1]&&(o=this.a[1][1].Se());else if(this.g)o=d3t(this,Ist(this,null,!0));else for(n=(Kf(),lt(ct(Oy,1),oe,232,0,[sc,eu,ac])),r=0,s=n.length;r0?o+this.n.b+this.n.c:0},l.Te=function(){var e,n,r,s,o;if(this.g)for(e=Ist(this,null,!1),r=(Kf(),lt(ct(Oy,1),oe,232,0,[sc,eu,ac])),s=0,o=r.length;s0&&(s[0]+=this.d,r-=s[0]),s[2]>0&&(s[2]+=this.d,r-=s[2]),this.c.a=b.Math.max(0,r),this.c.d=n.d+e.d+(this.c.a-r)/2,s[1]=b.Math.max(s[1],r),wmt(this,eu,n.d+e.d+s[0]-(s[1]-r)/2,s)},l.b=null,l.d=0,l.e=!1,l.f=!1,l.g=!1;var Gut=0,cV=0;F(_2,"GridContainerCell",1473),D(461,22,{3:1,35:1,22:1,461:1},Let);var fb,Md,kf,ppe=jr(_2,"HorizontalLabelAlignment",461,Hr,_in,lJe),bpe;D(306,212,{212:1,306:1},xQt,Aee,vQt),l.Re=function(){return sKt(this)},l.Se=function(){return Vwt(this)},l.a=0,l.c=!1;var s6n=F(_2,"LabelCell",306);D(244,326,{212:1,326:1,244:1},a_),l.Re=function(){return dI(this)},l.Se=function(){return gI(this)},l.Te=function(){Eat(this)},l.Ue=function(){Tat(this)},l.b=0,l.c=0,l.d=!1,F(_2,"StripContainerCell",244),D(1626,1,li,th),l.Mb=function(e){return EKe(u(e,212))},F(_2,"StripContainerCell/lambda$0$Type",1626),D(1627,1,{},Fa),l.Fe=function(e){return u(e,212).Se()},F(_2,"StripContainerCell/lambda$1$Type",1627),D(1628,1,li,Ml),l.Mb=function(e){return TKe(u(e,212))},F(_2,"StripContainerCell/lambda$2$Type",1628),D(1629,1,{},ha),l.Fe=function(e){return u(e,212).Re()},F(_2,"StripContainerCell/lambda$3$Type",1629),D(462,22,{3:1,35:1,22:1,462:1},Met);var Ef,db,n1,wpe=jr(_2,"VerticalLabelAlignment",462,Hr,Sin,hJe),vpe;D(789,1,{},Sxt),l.c=0,l.d=0,l.k=0,l.s=0,l.t=0,l.v=!1,l.w=0,l.D=!1,F(Yq,"NodeContext",789),D(1471,1,Oi,bc),l.ue=function(e,n){return xUt(u(e,61),u(n,61))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(Yq,"NodeContext/0methodref$comparePortSides$Type",1471),D(1472,1,Oi,Cc),l.ue=function(e,n){return Q0n(u(e,111),u(n,111))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(Yq,"NodeContext/1methodref$comparePortContexts$Type",1472),D(159,22,{3:1,35:1,22:1,159:1},hh);var mpe,ype,xpe,kpe,Epe,Tpe,Cpe,_pe,Spe,Ape,Lpe,Mpe,Dpe,Ipe,Ope,Ppe,Fpe,Npe,Bpe,Rpe,jpe,Uut,$pe=jr(Yq,"NodeLabelLocation",159,Hr,lst,fJe),zpe;D(111,1,{111:1},tce),l.a=!1,F(Yq,"PortContext",111),D(1476,1,Un,pa),l.td=function(e){$Ht(u(e,306))},F(zI,Yfe,1476),D(1477,1,li,Da),l.Mb=function(e){return!!u(e,111).c},F(zI,Kfe,1477),D(1478,1,Un,Ha),l.td=function(e){$Ht(u(e,111).c)},F(zI,"LabelPlacer/lambda$2$Type",1478);var o7t;D(1475,1,Un,_c),l.td=function(e){$m(),rKe(u(e,111))},F(zI,"NodeLabelAndSizeUtilities/lambda$0$Type",1475),D(790,1,Un,Ewt),l.td=function(e){pXe(this.b,this.c,this.a,u(e,181))},l.a=!1,l.c=!1,F(zI,"NodeLabelCellCreator/lambda$0$Type",790),D(1474,1,Un,vn),l.td=function(e){aKe(this.a,u(e,181))},F(zI,"PortContextCreator/lambda$0$Type",1474);var uV;D(1829,1,{},lw),F(HE,"GreedyRectangleStripOverlapRemover",1829),D(1830,1,Oi,Dl),l.ue=function(e,n){return WQe(u(e,222),u(n,222))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(HE,"GreedyRectangleStripOverlapRemover/0methodref$compareByYCoordinate$Type",1830),D(1786,1,{},vqt),l.a=5,l.e=0,F(HE,"RectangleStripOverlapRemover",1786),D(1787,1,Oi,ed),l.ue=function(e,n){return YQe(u(e,222),u(n,222))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(HE,"RectangleStripOverlapRemover/0methodref$compareLeftRectangleBorders$Type",1787),D(1789,1,Oi,jd),l.ue=function(e,n){return vnn(u(e,222),u(n,222))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(HE,"RectangleStripOverlapRemover/1methodref$compareRightRectangleBorders$Type",1789),D(406,22,{3:1,35:1,22:1,406:1},ZR);var lO,Wut,Yut,hO,qpe=jr(HE,"RectangleStripOverlapRemover/OverlapRemovalDirection",406,Hr,_sn,dJe),Hpe;D(222,1,{222:1},Hnt),F(HE,"RectangleStripOverlapRemover/RectangleNode",222),D(1788,1,Un,gr),l.td=function(e){k1n(this.a,u(e,222))},F(HE,"RectangleStripOverlapRemover/lambda$1$Type",1788),D(1304,1,Oi,nd),l.ue=function(e,n){return A3n(u(e,167),u(n,167))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(kd,"PolyominoCompactor/CornerCasesGreaterThanRestComparator",1304),D(1307,1,{},$d),l.Kb=function(e){return u(e,324).a},F(kd,"PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$0$Type",1307),D(1308,1,li,A0),l.Mb=function(e){return u(e,323).a},F(kd,"PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$1$Type",1308),D(1309,1,li,Bi),l.Mb=function(e){return u(e,323).a},F(kd,"PolyominoCompactor/CornerCasesGreaterThanRestComparator/lambda$2$Type",1309),D(1302,1,Oi,cn),l.ue=function(e,n){return cmn(u(e,167),u(n,167))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(kd,"PolyominoCompactor/MinNumOfExtensionDirectionsComparator",1302),D(1305,1,{},eh),l.Kb=function(e){return u(e,324).a},F(kd,"PolyominoCompactor/MinNumOfExtensionDirectionsComparator/lambda$0$Type",1305),D(767,1,Oi,kr),l.ue=function(e,n){return lun(u(e,167),u(n,167))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(kd,"PolyominoCompactor/MinNumOfExtensionsComparator",767),D(1300,1,Oi,Ei),l.ue=function(e,n){return mcn(u(e,321),u(n,321))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(kd,"PolyominoCompactor/MinPerimeterComparator",1300),D(1301,1,Oi,Jo),l.ue=function(e,n){return Kfn(u(e,321),u(n,321))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(kd,"PolyominoCompactor/MinPerimeterComparatorWithShape",1301),D(1303,1,Oi,wc),l.ue=function(e,n){return Dmn(u(e,167),u(n,167))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(kd,"PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator",1303),D(1306,1,{},rf),l.Kb=function(e){return u(e,324).a},F(kd,"PolyominoCompactor/SingleExtensionSideGreaterThanRestComparator/lambda$0$Type",1306),D(777,1,{},Mbt),l.Ce=function(e,n){return ksn(this,u(e,46),u(n,167))},F(kd,"SuccessorCombination",777),D(644,1,{},Oc),l.Ce=function(e,n){var r;return hbn((r=u(e,46),u(n,167),r))},F(kd,"SuccessorJitter",644),D(643,1,{},sf),l.Ce=function(e,n){var r;return Jwn((r=u(e,46),u(n,167),r))},F(kd,"SuccessorLineByLine",643),D(568,1,{},af),l.Ce=function(e,n){var r;return f2n((r=u(e,46),u(n,167),r))},F(kd,"SuccessorManhattan",568),D(1356,1,{},Qi),l.Ce=function(e,n){var r;return Ewn((r=u(e,46),u(n,167),r))},F(kd,"SuccessorMaxNormWindingInMathPosSense",1356),D(400,1,{},fr),l.Ce=function(e,n){return vvt(this,e,n)},l.c=!1,l.d=!1,l.e=!1,l.f=!1,F(kd,"SuccessorQuadrantsGeneric",400),D(1357,1,{},Ts),l.Kb=function(e){return u(e,324).a},F(kd,"SuccessorQuadrantsGeneric/lambda$0$Type",1357),D(323,22,{3:1,35:1,22:1,323:1},QR),l.a=!1;var fO,dO,gO,pO,Vpe=jr(Xq,i6t,323,Hr,Lsn,gJe),Gpe;D(1298,1,{}),l.Ib=function(){var e,n,r,s,o,h;for(r=" ",e=pe(0),o=0;o=0?"b"+e+"["+zrt(this.a)+"]":"b["+zrt(this.a)+"]"):"b_"+Pw(this)},F(HI,"FBendpoint",559),D(282,134,{3:1,282:1,94:1,134:1},eYt),l.Ib=function(){return zrt(this)},F(HI,"FEdge",282),D(231,134,{3:1,231:1,94:1,134:1},B$);var o6n=F(HI,"FGraph",231);D(447,357,{3:1,447:1,357:1,94:1,134:1},iJt),l.Ib=function(){return this.b==null||this.b.length==0?"l["+zrt(this.a)+"]":"l_"+this.b},F(HI,"FLabel",447),D(144,357,{3:1,144:1,357:1,94:1,134:1},gXt),l.Ib=function(){return Kvt(this)},l.b=0,F(HI,"FNode",144),D(2003,1,{}),l.bf=function(e){axt(this,e)},l.cf=function(){Bse(this)},l.d=0,F(g6t,"AbstractForceModel",2003),D(631,2003,{631:1},Wne),l.af=function(e,n){var r,s,o,h,d;return Ooe(this.f,e,n),o=ia(nc(n.d),e.d),d=b.Math.sqrt(o.a*o.a+o.b*o.b),s=b.Math.max(0,d-D9(e.e)/2-D9(n.e)/2),r=Ere(this.e,e,n),r>0?h=-pnn(s,this.c)*r:h=oZe(s,this.b)*u(Q(e,(Jf(),c7)),19).a,fd(o,h/d),o},l.bf=function(e){axt(this,e),this.a=u(Q(e,(Jf(),pV)),19).a,this.c=Xt(ye(Q(e,bV))),this.b=Xt(ye(Q(e,elt)))},l.df=function(e){return e0&&(h-=mKe(s,this.a)*r),fd(o,h*this.b/d),o},l.bf=function(e){var n,r,s,o,h,d,v;for(axt(this,e),this.b=Xt(ye(Q(e,(Jf(),nlt)))),this.c=this.b/u(Q(e,pV),19).a,s=e.e.c.length,h=0,o=0,v=new S(e.e);v.a0},l.a=0,l.b=0,l.c=0,F(g6t,"FruchtermanReingoldModel",632),D(849,1,Oh,HJ),l.Qe=function(e){an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Jq),""),"Force Model"),"Determines the model for force calculation."),b7t),(Ug(),us)),w7t),un((Qf(),qn))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,p6t),""),"Iterations"),"The number of iterations on the force model."),pe(300)),gc),ja),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,b6t),""),"Repulsive Power"),"Determines how many bend points are added to the edge; such bend points are regarded as repelling particles in the force model"),pe(0)),gc),ja),un(Pd)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,qot),""),"FR Temperature"),"The temperature is used as a scaling factor for particle displacements."),Ed),Oo),la),un(qn)))),ca(e,qot,Jq,hbe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Hot),""),"Eades Repulsion"),"Factor for repulsive forces in Eades' model."),5),Oo),la),un(qn)))),ca(e,Hot,Jq,cbe),Phe((new bC,e))};var sbe,abe,b7t,obe,cbe,ube,lbe,hbe;F(B_,"ForceMetaDataProvider",849),D(424,22,{3:1,35:1,22:1,424:1},Pbt);var tlt,gV,w7t=jr(B_,"ForceModelStrategy",424,Hr,ein,wJe),fbe;D(988,1,Oh,bC),l.Qe=function(e){Phe(e)};var dbe,gbe,v7t,pV,m7t,pbe,bbe,wbe,y7t,vbe,x7t,k7t,mbe,c7,ybe,elt,E7t,xbe,kbe,bV,nlt;F(B_,"ForceOptions",988),D(989,1,{},V5),l.$e=function(){var e;return e=new Npt,e},l._e=function(e){},F(B_,"ForceOptions/ForceFactory",989);var vO,dS,I6,wV;D(850,1,Oh,VJ),l.Qe=function(e){an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,v6t),""),"Fixed Position"),"Prevent that the node is moved by the layout algorithm."),(Nn(),!1)),(Ug(),La)),Rs),un((Qf(),ea))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,m6t),""),"Desired Edge Length"),"Either specified for parent nodes or for individual edges, where the latter takes higher precedence."),100),Oo),la),ji(qn,lt(ct(ip,1),oe,175,0,[Pd]))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,y6t),""),"Layout Dimension"),"Dimensions that are permitted to be altered during layout."),T7t),us),D7t),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,x6t),""),"Stress Epsilon"),"Termination criterion for the iterative process."),Ed),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,k6t),""),"Iteration Limit"),"Maximum number of performed iterations. Takes higher precedence than 'epsilon'."),pe(wi)),gc),ja),un(qn)))),vhe((new GJ,e))};var Ebe,Tbe,T7t,Cbe,_be,Sbe;F(B_,"StressMetaDataProvider",850),D(992,1,Oh,GJ),l.Qe=function(e){vhe(e)};var vV,C7t,_7t,S7t,A7t,L7t,Abe,Lbe,Mbe,Dbe,M7t,Ibe;F(B_,"StressOptions",992),D(993,1,{},f1),l.$e=function(){var e;return e=new nYt,e},l._e=function(e){},F(B_,"StressOptions/StressFactory",993),D(1128,209,S2,nYt),l.Ze=function(e,n){var r,s,o,h,d;for(vr(n,o1e,1),je(Re(qe(e,(iI(),A7t))))?je(Re(qe(e,M7t)))||y$((r=new rr((Pm(),new Mm(e))),r)):jce(new Npt,e,Rc(n,1)),o=pre(e),s=Ale(this.a,o),d=s.Kc();d.Ob();)h=u(d.Pb(),231),!(h.e.c.length<=1)&&(_3n(this.b,h),i2n(this.b),xu(h.d,new rd));o=zhe(s),Rhe(o),or(n)},F(nH,"StressLayoutProvider",1128),D(1129,1,Un,rd),l.td=function(e){dxt(u(e,447))},F(nH,"StressLayoutProvider/lambda$0$Type",1129),D(990,1,{},hqt),l.c=0,l.e=0,l.g=0,F(nH,"StressMajorization",990),D(379,22,{3:1,35:1,22:1,379:1},Det);var rlt,ilt,slt,D7t=jr(nH,"StressMajorization/Dimension",379,Hr,Lin,vJe),Obe;D(991,1,Oi,Ci),l.ue=function(e,n){return YZe(this.a,u(e,144),u(n,144))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(nH,"StressMajorization/lambda$0$Type",991),D(1229,1,{},wZt),F(_6,"ElkLayered",1229),D(1230,1,Un,id),l.td=function(e){sbn(u(e,37))},F(_6,"ElkLayered/lambda$0$Type",1230),D(1231,1,Un,hi),l.td=function(e){KZe(this.a,u(e,37))},F(_6,"ElkLayered/lambda$1$Type",1231),D(1263,1,{},HUt);var Pbe,Fbe,Nbe;F(_6,"GraphConfigurator",1263),D(759,1,Un,gs),l.td=function(e){Gae(this.a,u(e,10))},F(_6,"GraphConfigurator/lambda$0$Type",759),D(760,1,{},G5),l.Kb=function(e){return l4t(),new Tn(null,new _n(u(e,29).a,16))},F(_6,"GraphConfigurator/lambda$1$Type",760),D(761,1,Un,qi),l.td=function(e){Gae(this.a,u(e,10))},F(_6,"GraphConfigurator/lambda$2$Type",761),D(1127,209,S2,gqt),l.Ze=function(e,n){var r;r=Wyn(new yqt,e),Vt(qe(e,(Te(),qy)))===Vt((G0(),sp))?Chn(this.a,r,n):xbn(this.a,r,n),Ohe(new WJ,r)},F(_6,"LayeredLayoutProvider",1127),D(356,22,{3:1,35:1,22:1,356:1},_M);var Dd,gb,cu,qc,Io,I7t=jr(_6,"LayeredPhases",356,Hr,fan,mJe),Bbe;D(1651,1,{},nne),l.i=0;var Rbe;F(UI,"ComponentsToCGraphTransformer",1651);var jbe;D(1652,1,{},fw),l.ef=function(e,n){return b.Math.min(e.a!=null?Xt(e.a):e.c.i,n.a!=null?Xt(n.a):n.c.i)},l.ff=function(e,n){return b.Math.min(e.a!=null?Xt(e.a):e.c.i,n.a!=null?Xt(n.a):n.c.i)},F(UI,"ComponentsToCGraphTransformer/1",1652),D(81,1,{81:1}),l.i=0,l.k=!0,l.o=Cs;var alt=F($_,"CNode",81);D(460,81,{460:1,81:1},F2t,N3t),l.Ib=function(){return""},F(UI,"ComponentsToCGraphTransformer/CRectNode",460),D(1623,1,{},U5);var olt,clt;F(UI,"OneDimensionalComponentsCompaction",1623),D(1624,1,{},mp),l.Kb=function(e){return yin(u(e,46))},l.Fb=function(e){return this===e},F(UI,"OneDimensionalComponentsCompaction/lambda$0$Type",1624),D(1625,1,{},W5),l.Kb=function(e){return Ohn(u(e,46))},l.Fb=function(e){return this===e},F(UI,"OneDimensionalComponentsCompaction/lambda$1$Type",1625),D(1654,1,{},dXt),F($_,"CGraph",1654),D(189,1,{189:1},ost),l.b=0,l.c=0,l.e=0,l.g=!0,l.i=Cs,F($_,"CGroup",189),D(1653,1,{},EL),l.ef=function(e,n){return b.Math.max(e.a!=null?Xt(e.a):e.c.i,n.a!=null?Xt(n.a):n.c.i)},l.ff=function(e,n){return b.Math.max(e.a!=null?Xt(e.a):e.c.i,n.a!=null?Xt(n.a):n.c.i)},F($_,Ffe,1653),D(1655,1,{},Uoe),l.d=!1;var $be,ult=F($_,Rfe,1655);D(1656,1,{},vl),l.Kb=function(e){return xbt(),Nn(),u(u(e,46).a,81).d.e!=0},l.Fb=function(e){return this===e},F($_,jfe,1656),D(823,1,{},Gwt),l.a=!1,l.b=!1,l.c=!1,l.d=!1,F($_,$fe,823),D(1825,1,{},DKt),F(rH,zfe,1825);var mO=Ki(L2,Ofe);D(1826,1,{369:1},cQt),l.Ke=function(e){gvn(this,u(e,466))},F(rH,qfe,1826),D(1827,1,Oi,iN),l.ue=function(e,n){return grn(u(e,81),u(n,81))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(rH,Hfe,1827),D(466,1,{466:1},Nbt),l.a=!1,F(rH,Vfe,466),D(1828,1,Oi,Sc),l.ue=function(e,n){return _dn(u(e,466),u(n,466))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(rH,Gfe,1828),D(140,1,{140:1},g8,$wt),l.Fb=function(e){var n;return e==null||c6n!=ol(e)?!1:(n=u(e,140),Fc(this.c,n.c)&&Fc(this.d,n.d))},l.Hb=function(){return Az(lt(ct(Qn,1),De,1,5,[this.c,this.d]))},l.Ib=function(){return"("+this.c+Ya+this.d+(this.a?"cx":"")+this.b+")"},l.a=!0,l.c=0,l.d=0;var c6n=F(L2,"Point",140);D(405,22,{3:1,35:1,22:1,405:1},JR);var Lv,Py,z4,Fy,zbe=jr(L2,"Point/Quadrant",405,Hr,Msn,yJe),qbe;D(1642,1,{},pqt),l.b=null,l.c=null,l.d=null,l.e=null,l.f=null;var Hbe,Vbe,Gbe,Ube,Wbe;F(L2,"RectilinearConvexHull",1642),D(574,1,{369:1},Yz),l.Ke=function(e){don(this,u(e,140))},l.b=0;var O7t;F(L2,"RectilinearConvexHull/MaximalElementsEventHandler",574),D(1644,1,Oi,wm),l.ue=function(e,n){return rrn(ye(e),ye(n))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(L2,"RectilinearConvexHull/MaximalElementsEventHandler/lambda$0$Type",1644),D(1643,1,{369:1},Cee),l.Ke=function(e){Swn(this,u(e,140))},l.a=0,l.b=null,l.c=null,l.d=null,l.e=null,F(L2,"RectilinearConvexHull/RectangleEventHandler",1643),D(1645,1,Oi,xg),l.ue=function(e,n){return asn(u(e,140),u(n,140))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(L2,"RectilinearConvexHull/lambda$0$Type",1645),D(1646,1,Oi,T3),l.ue=function(e,n){return osn(u(e,140),u(n,140))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(L2,"RectilinearConvexHull/lambda$1$Type",1646),D(1647,1,Oi,cK),l.ue=function(e,n){return usn(u(e,140),u(n,140))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(L2,"RectilinearConvexHull/lambda$2$Type",1647),D(1648,1,Oi,Vb),l.ue=function(e,n){return csn(u(e,140),u(n,140))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(L2,"RectilinearConvexHull/lambda$3$Type",1648),D(1649,1,Oi,uK),l.ue=function(e,n){return hgn(u(e,140),u(n,140))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(L2,"RectilinearConvexHull/lambda$4$Type",1649),D(1650,1,{},jQt),F(L2,"Scanline",1650),D(2005,1,{}),F(Td,"AbstractGraphPlacer",2005),D(325,1,{325:1},DWt),l.mf=function(e){return this.nf(e)?(ln(this.b,u(Q(e,(ae(),By)),21),e),!0):!1},l.nf=function(e){var n,r,s,o;for(n=u(Q(e,(ae(),By)),21),o=u(Ai(Pi,n),21),s=o.Kc();s.Ob();)if(r=u(s.Pb(),21),!u(Ai(this.b,r),15).dc())return!1;return!0};var Pi;F(Td,"ComponentGroup",325),D(765,2005,{},$pt),l.of=function(e){var n,r;for(r=new S(this.a);r.aG&&(ue=0,_e+=H+o,H=0),gt=d.c,x_(d,ue+gt.a,_e+gt.b),Gf(gt),r=b.Math.max(r,ue+St.a),H=b.Math.max(H,St.b),ue+=St.a+o;if(n.f.a=r,n.f.b=_e+H,je(Re(Q(h,iG)))){for(s=new PT,Oxt(s,e,o),j=e.Kc();j.Ob();)M=u(j.Pb(),37),Li(Gf(M.c),s.e);Li(Gf(n.f),s.a)}Omt(n,e)},F(Td,"SimpleRowGraphPlacer",1291),D(1292,1,Oi,Rf),l.ue=function(e,n){return uun(u(e,37),u(n,37))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(Td,"SimpleRowGraphPlacer/1",1292);var Kbe;D(1262,1,xd,vm),l.Lb=function(e){var n;return n=u(Q(u(e,243).b,(Te(),So)),74),!!n&&n.b!=0},l.Fb=function(e){return this===e},l.Mb=function(e){var n;return n=u(Q(u(e,243).b,(Te(),So)),74),!!n&&n.b!=0},F(iH,"CompoundGraphPostprocessor/1",1262),D(1261,1,os,xqt),l.pf=function(e,n){yse(this,u(e,37),n)},F(iH,"CompoundGraphPreprocessor",1261),D(441,1,{441:1},oie),l.c=!1,F(iH,"CompoundGraphPreprocessor/ExternalPort",441),D(243,1,{243:1},Fj),l.Ib=function(){return bnt(this.c)+":"+qoe(this.b)},F(iH,"CrossHierarchyEdge",243),D(763,1,Oi,Si),l.ue=function(e,n){return Z1n(this,u(e,243),u(n,243))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(iH,"CrossHierarchyEdgeComparator",763),D(299,134,{3:1,299:1,94:1,134:1}),l.p=0,F(tu,"LGraphElement",299),D(17,299,{3:1,17:1,299:1,94:1,134:1},Vw),l.Ib=function(){return qoe(this)};var hlt=F(tu,"LEdge",17);D(37,299,{3:1,20:1,37:1,299:1,94:1,134:1},eyt),l.Jc=function(e){va(this,e)},l.Kc=function(){return new S(this.b)},l.Ib=function(){return this.b.c.length==0?"G-unlayered"+eb(this.a):this.a.c.length==0?"G-layered"+eb(this.b):"G[layerless"+eb(this.a)+", layers"+eb(this.b)+"]"};var Xbe=F(tu,"LGraph",37),Qbe;D(657,1,{}),l.qf=function(){return this.e.n},l.We=function(e){return Q(this.e,e)},l.rf=function(){return this.e.o},l.sf=function(){return this.e.p},l.Xe=function(e){return Us(this.e,e)},l.tf=function(e){this.e.n.a=e.a,this.e.n.b=e.b},l.uf=function(e){this.e.o.a=e.a,this.e.o.b=e.b},l.vf=function(e){this.e.p=e},F(tu,"LGraphAdapters/AbstractLShapeAdapter",657),D(577,1,{839:1},Ui),l.wf=function(){var e,n;if(!this.b)for(this.b=Ud(this.a.b.c.length),n=new S(this.a.b);n.a0&&Wre((Rr(n-1,e.length),e.charCodeAt(n-1)),d1e);)--n;if(h> ",e),iq(r)),Gr(hc((e.a+="[",e),r.i),"]")),e.a},l.c=!0,l.d=!1;var R7t,j7t,$7t,z7t,q7t,H7t,Jbe=F(tu,"LPort",11);D(397,1,r0,Qs),l.Jc=function(e){va(this,e)},l.Kc=function(){var e;return e=new S(this.a.e),new qs(e)},F(tu,"LPort/1",397),D(1290,1,sa,qs),l.Nb=function(e){ba(this,e)},l.Pb=function(){return u(J(this.a),17).c},l.Ob=function(){return Go(this.a)},l.Qb=function(){L9(this.a)},F(tu,"LPort/1/1",1290),D(359,1,r0,Tr),l.Jc=function(e){va(this,e)},l.Kc=function(){var e;return e=new S(this.a.g),new Qt(e)},F(tu,"LPort/2",359),D(762,1,sa,Qt),l.Nb=function(e){ba(this,e)},l.Pb=function(){return u(J(this.a),17).d},l.Ob=function(){return Go(this.a)},l.Qb=function(){L9(this.a)},F(tu,"LPort/2/1",762),D(1283,1,r0,cGt),l.Jc=function(e){va(this,e)},l.Kc=function(){return new L1(this)},F(tu,"LPort/CombineIter",1283),D(201,1,sa,L1),l.Nb=function(e){ba(this,e)},l.Qb=function(){IHt()},l.Ob=function(){return v9(this)},l.Pb=function(){return Go(this.a)?J(this.a):J(this.b)},F(tu,"LPort/CombineIter/1",201),D(1285,1,xd,yp),l.Lb=function(e){return HKt(e)},l.Fb=function(e){return this===e},l.Mb=function(e){return ju(),u(e,11).e.c.length!=0},F(tu,"LPort/lambda$0$Type",1285),D(1284,1,xd,mm),l.Lb=function(e){return VKt(e)},l.Fb=function(e){return this===e},l.Mb=function(e){return ju(),u(e,11).g.c.length!=0},F(tu,"LPort/lambda$1$Type",1284),D(1286,1,xd,hK),l.Lb=function(e){return ju(),u(e,11).j==(ve(),Pn)},l.Fb=function(e){return this===e},l.Mb=function(e){return ju(),u(e,11).j==(ve(),Pn)},F(tu,"LPort/lambda$2$Type",1286),D(1287,1,xd,Gb),l.Lb=function(e){return ju(),u(e,11).j==(ve(),Hn)},l.Fb=function(e){return this===e},l.Mb=function(e){return ju(),u(e,11).j==(ve(),Hn)},F(tu,"LPort/lambda$3$Type",1287),D(1288,1,xd,fK),l.Lb=function(e){return ju(),u(e,11).j==(ve(),mr)},l.Fb=function(e){return this===e},l.Mb=function(e){return ju(),u(e,11).j==(ve(),mr)},F(tu,"LPort/lambda$4$Type",1288),D(1289,1,xd,dK),l.Lb=function(e){return ju(),u(e,11).j==(ve(),Bn)},l.Fb=function(e){return this===e},l.Mb=function(e){return ju(),u(e,11).j==(ve(),Bn)},F(tu,"LPort/lambda$5$Type",1289),D(29,299,{3:1,20:1,299:1,29:1,94:1,134:1},Sh),l.Jc=function(e){va(this,e)},l.Kc=function(){return new S(this.a)},l.Ib=function(){return"L_"+Ro(this.b.b,this,0)+eb(this.a)},F(tu,"Layer",29),D(1342,1,{},yqt),F(Kg,w1e,1342),D(1346,1,{},Y5),l.Kb=function(e){return Do(u(e,82))},F(Kg,"ElkGraphImporter/0methodref$connectableShapeToNode$Type",1346),D(1349,1,{},FT),l.Kb=function(e){return Do(u(e,82))},F(Kg,"ElkGraphImporter/1methodref$connectableShapeToNode$Type",1349),D(1343,1,Un,jn),l.td=function(e){nce(this.a,u(e,118))},F(Kg,v1e,1343),D(1344,1,Un,Sr),l.td=function(e){nce(this.a,u(e,118))},F(Kg,m1e,1344),D(1345,1,{},oN),l.Kb=function(e){return new Tn(null,new _n(Znn(u(e,79)),16))},F(Kg,y1e,1345),D(1347,1,li,ir),l.Mb=function(e){return JXe(this.a,u(e,33))},F(Kg,x1e,1347),D(1348,1,{},Tk),l.Kb=function(e){return new Tn(null,new _n(Jnn(u(e,79)),16))},F(Kg,"ElkGraphImporter/lambda$5$Type",1348),D(1350,1,li,sr),l.Mb=function(e){return tQe(this.a,u(e,33))},F(Kg,"ElkGraphImporter/lambda$7$Type",1350),D(1351,1,li,gK),l.Mb=function(e){return brn(u(e,79))},F(Kg,"ElkGraphImporter/lambda$8$Type",1351),D(1278,1,{},WJ);var t2e;F(Kg,"ElkGraphLayoutTransferrer",1278),D(1279,1,li,Ia),l.Mb=function(e){return qZe(this.a,u(e,17))},F(Kg,"ElkGraphLayoutTransferrer/lambda$0$Type",1279),D(1280,1,Un,$r),l.td=function(e){kM(),le(this.a,u(e,17))},F(Kg,"ElkGraphLayoutTransferrer/lambda$1$Type",1280),D(1281,1,li,Yi),l.Mb=function(e){return SZe(this.a,u(e,17))},F(Kg,"ElkGraphLayoutTransferrer/lambda$2$Type",1281),D(1282,1,Un,Fo),l.td=function(e){kM(),le(this.a,u(e,17))},F(Kg,"ElkGraphLayoutTransferrer/lambda$3$Type",1282),D(1485,1,os,Ck),l.pf=function(e,n){Lcn(u(e,37),n)},F($n,"CommentNodeMarginCalculator",1485),D(1486,1,{},pK),l.Kb=function(e){return new Tn(null,new _n(u(e,29).a,16))},F($n,"CommentNodeMarginCalculator/lambda$0$Type",1486),D(1487,1,Un,bK),l.td=function(e){u3n(u(e,10))},F($n,"CommentNodeMarginCalculator/lambda$1$Type",1487),D(1488,1,os,wK),l.pf=function(e,n){kvn(u(e,37),n)},F($n,"CommentPostprocessor",1488),D(1489,1,os,vK),l.pf=function(e,n){L5n(u(e,37),n)},F($n,"CommentPreprocessor",1489),D(1490,1,os,mK),l.pf=function(e,n){G2n(u(e,37),n)},F($n,"ConstraintsPostprocessor",1490),D(1491,1,os,yK),l.pf=function(e,n){Zcn(u(e,37),n)},F($n,"EdgeAndLayerConstraintEdgeReverser",1491),D(1492,1,os,xK),l.pf=function(e,n){$hn(u(e,37),n)},F($n,"EndLabelPostprocessor",1492),D(1493,1,{},kK),l.Kb=function(e){return new Tn(null,new _n(u(e,29).a,16))},F($n,"EndLabelPostprocessor/lambda$0$Type",1493),D(1494,1,li,EK),l.Mb=function(e){return Prn(u(e,10))},F($n,"EndLabelPostprocessor/lambda$1$Type",1494),D(1495,1,Un,TK),l.td=function(e){Sdn(u(e,10))},F($n,"EndLabelPostprocessor/lambda$2$Type",1495),D(1496,1,os,CK),l.pf=function(e,n){bpn(u(e,37),n)},F($n,"EndLabelPreprocessor",1496),D(1497,1,{},CL),l.Kb=function(e){return new Tn(null,new _n(u(e,29).a,16))},F($n,"EndLabelPreprocessor/lambda$0$Type",1497),D(1498,1,Un,PYt),l.td=function(e){bXe(this.a,this.b,this.c,u(e,10))},l.a=0,l.b=0,l.c=!1,F($n,"EndLabelPreprocessor/lambda$1$Type",1498),D(1499,1,li,_K),l.Mb=function(e){return Vt(Q(u(e,70),(Te(),Od)))===Vt((M1(),F7))},F($n,"EndLabelPreprocessor/lambda$2$Type",1499),D(1500,1,Un,Pc),l.td=function(e){ri(this.a,u(e,70))},F($n,"EndLabelPreprocessor/lambda$3$Type",1500),D(1501,1,li,SK),l.Mb=function(e){return Vt(Q(u(e,70),(Te(),Od)))===Vt((M1(),Zy))},F($n,"EndLabelPreprocessor/lambda$4$Type",1501),D(1502,1,Un,Za),l.td=function(e){ri(this.a,u(e,70))},F($n,"EndLabelPreprocessor/lambda$5$Type",1502),D(1551,1,os,UJ),l.pf=function(e,n){Yln(u(e,37),n)};var e2e;F($n,"EndLabelSorter",1551),D(1552,1,Oi,NT),l.ue=function(e,n){return Tfn(u(e,456),u(n,456))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"EndLabelSorter/1",1552),D(456,1,{456:1},tQt),F($n,"EndLabelSorter/LabelGroup",456),D(1553,1,{},cN),l.Kb=function(e){return EM(),new Tn(null,new _n(u(e,29).a,16))},F($n,"EndLabelSorter/lambda$0$Type",1553),D(1554,1,li,K5),l.Mb=function(e){return EM(),u(e,10).k==(Vn(),Os)},F($n,"EndLabelSorter/lambda$1$Type",1554),D(1555,1,Un,AK),l.td=function(e){Sgn(u(e,10))},F($n,"EndLabelSorter/lambda$2$Type",1555),D(1556,1,li,LK),l.Mb=function(e){return EM(),Vt(Q(u(e,70),(Te(),Od)))===Vt((M1(),Zy))},F($n,"EndLabelSorter/lambda$3$Type",1556),D(1557,1,li,MK),l.Mb=function(e){return EM(),Vt(Q(u(e,70),(Te(),Od)))===Vt((M1(),F7))},F($n,"EndLabelSorter/lambda$4$Type",1557),D(1503,1,os,DK),l.pf=function(e,n){y3n(this,u(e,37))},l.b=0,l.c=0,F($n,"FinalSplineBendpointsCalculator",1503),D(1504,1,{},IK),l.Kb=function(e){return new Tn(null,new _n(u(e,29).a,16))},F($n,"FinalSplineBendpointsCalculator/lambda$0$Type",1504),D(1505,1,{},BT),l.Kb=function(e){return new Tn(null,new jw(new ar(lr(Ds(u(e,10)).a.Kc(),new z))))},F($n,"FinalSplineBendpointsCalculator/lambda$1$Type",1505),D(1506,1,li,_L),l.Mb=function(e){return!Ga(u(e,17))},F($n,"FinalSplineBendpointsCalculator/lambda$2$Type",1506),D(1507,1,li,uN),l.Mb=function(e){return Us(u(e,17),(ae(),R2))},F($n,"FinalSplineBendpointsCalculator/lambda$3$Type",1507),D(1508,1,Un,mc),l.td=function(e){Omn(this.a,u(e,128))},F($n,"FinalSplineBendpointsCalculator/lambda$4$Type",1508),D(1509,1,Un,C3),l.td=function(e){Yst(u(e,17).a)},F($n,"FinalSplineBendpointsCalculator/lambda$5$Type",1509),D(792,1,os,Ta),l.pf=function(e,n){d4n(this,u(e,37),n)},F($n,"GraphTransformer",792),D(511,22,{3:1,35:1,22:1,511:1},Fbt);var dlt,yO,n2e=jr($n,"GraphTransformer/Mode",511,Hr,nin,Ptn),r2e;D(1510,1,os,_3),l.pf=function(e,n){Hwn(u(e,37),n)},F($n,"HierarchicalNodeResizingProcessor",1510),D(1511,1,os,OK),l.pf=function(e,n){Tcn(u(e,37),n)},F($n,"HierarchicalPortConstraintProcessor",1511),D(1512,1,Oi,of),l.ue=function(e,n){return Ffn(u(e,10),u(n,10))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"HierarchicalPortConstraintProcessor/NodeComparator",1512),D(1513,1,os,X5),l.pf=function(e,n){Vyn(u(e,37),n)},F($n,"HierarchicalPortDummySizeProcessor",1513),D(1514,1,os,PK),l.pf=function(e,n){zvn(this,u(e,37),n)},l.a=0,F($n,"HierarchicalPortOrthogonalEdgeRouter",1514),D(1515,1,Oi,_k),l.ue=function(e,n){return UQe(u(e,10),u(n,10))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"HierarchicalPortOrthogonalEdgeRouter/1",1515),D(1516,1,Oi,zd),l.ue=function(e,n){return aon(u(e,10),u(n,10))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"HierarchicalPortOrthogonalEdgeRouter/2",1516),D(1517,1,os,FK),l.pf=function(e,n){fgn(u(e,37),n)},F($n,"HierarchicalPortPositionProcessor",1517),D(1518,1,os,YJ),l.pf=function(e,n){oxn(this,u(e,37))},l.a=0,l.c=0;var mV,yV;F($n,"HighDegreeNodeLayeringProcessor",1518),D(571,1,{571:1},NK),l.b=-1,l.d=-1,F($n,"HighDegreeNodeLayeringProcessor/HighDegreeNodeInformation",571),D(1519,1,{},BK),l.Kb=function(e){return KM(),jo(u(e,10))},l.Fb=function(e){return this===e},F($n,"HighDegreeNodeLayeringProcessor/lambda$0$Type",1519),D(1520,1,{},RK),l.Kb=function(e){return KM(),Ds(u(e,10))},l.Fb=function(e){return this===e},F($n,"HighDegreeNodeLayeringProcessor/lambda$1$Type",1520),D(1526,1,os,RT),l.pf=function(e,n){vyn(this,u(e,37),n)},F($n,"HyperedgeDummyMerger",1526),D(793,1,{},Cwt),l.a=!1,l.b=!1,l.c=!1,F($n,"HyperedgeDummyMerger/MergeState",793),D(1527,1,{},SL),l.Kb=function(e){return new Tn(null,new _n(u(e,29).a,16))},F($n,"HyperedgeDummyMerger/lambda$0$Type",1527),D(1528,1,{},lN),l.Kb=function(e){return new Tn(null,new _n(u(e,10).j,16))},F($n,"HyperedgeDummyMerger/lambda$1$Type",1528),D(1529,1,Un,AL),l.td=function(e){u(e,11).p=-1},F($n,"HyperedgeDummyMerger/lambda$2$Type",1529),D(1530,1,os,Q5),l.pf=function(e,n){byn(u(e,37),n)},F($n,"HypernodesProcessor",1530),D(1531,1,os,jK),l.pf=function(e,n){wyn(u(e,37),n)},F($n,"InLayerConstraintProcessor",1531),D(1532,1,os,hN),l.pf=function(e,n){Wcn(u(e,37),n)},F($n,"InnermostNodeMarginCalculator",1532),D(1533,1,os,fN),l.pf=function(e,n){T5n(this,u(e,37))},l.a=Cs,l.b=Cs,l.c=as,l.d=as;var u6n=F($n,"InteractiveExternalPortPositioner",1533);D(1534,1,{},$K),l.Kb=function(e){return u(e,17).d.i},l.Fb=function(e){return this===e},F($n,"InteractiveExternalPortPositioner/lambda$0$Type",1534),D(1535,1,{},Ja),l.Kb=function(e){return KQe(this.a,ye(e))},l.Fb=function(e){return this===e},F($n,"InteractiveExternalPortPositioner/lambda$1$Type",1535),D(1536,1,{},zK),l.Kb=function(e){return u(e,17).c.i},l.Fb=function(e){return this===e},F($n,"InteractiveExternalPortPositioner/lambda$2$Type",1536),D(1537,1,{},ml),l.Kb=function(e){return XQe(this.a,ye(e))},l.Fb=function(e){return this===e},F($n,"InteractiveExternalPortPositioner/lambda$3$Type",1537),D(1538,1,{},qf),l.Kb=function(e){return jZe(this.a,ye(e))},l.Fb=function(e){return this===e},F($n,"InteractiveExternalPortPositioner/lambda$4$Type",1538),D(1539,1,{},Cp),l.Kb=function(e){return $Ze(this.a,ye(e))},l.Fb=function(e){return this===e},F($n,"InteractiveExternalPortPositioner/lambda$5$Type",1539),D(77,22,{3:1,35:1,22:1,77:1,234:1},ms),l.Kf=function(){switch(this.g){case 15:return new rQ;case 22:return new iQ;case 47:return new oQ;case 28:case 35:return new S3;case 32:return new Ck;case 42:return new wK;case 1:return new vK;case 41:return new mK;case 56:return new Ta((X8(),yO));case 0:return new Ta((X8(),dlt));case 2:return new yK;case 54:return new xK;case 33:return new CK;case 51:return new DK;case 55:return new _3;case 13:return new OK;case 38:return new X5;case 44:return new PK;case 40:return new FK;case 9:return new YJ;case 49:return new yWt;case 37:return new RT;case 43:return new Q5;case 27:return new jK;case 30:return new hN;case 3:return new fN;case 18:return new HK;case 29:return new VK;case 5:return new zB;case 50:return new qK;case 34:return new KJ;case 36:return new Sk;case 52:return new UJ;case 11:return new ym;case 7:return new QJ;case 39:return new Ak;case 45:return new YK;case 16:return new jT;case 10:return new sd;case 48:return new ML;case 21:return new Lk;case 23:return new det((ev(),FS));case 8:return new bN;case 12:return new IL;case 4:return new XK;case 19:return new wC;case 17:return new eX;case 53:return new nX;case 6:return new EN;case 25:return new Tqt;case 46:return new aX;case 31:return new iYt;case 14:return new PL;case 26:return new lQ;case 20:return new gX;case 24:return new det((ev(),TG));default:throw it(new Fn(Yot+(this.f!=null?this.f:""+this.g)))}};var V7t,G7t,U7t,W7t,Y7t,K7t,X7t,Q7t,Z7t,J7t,gS,xV,kV,tTt,eTt,nTt,rTt,iTt,sTt,aTt,pS,oTt,cTt,uTt,lTt,hTt,glt,EV,TV,fTt,CV,_V,SV,u7,l7,h7,dTt,AV,LV,gTt,MV,DV,pTt,bTt,wTt,vTt,IV,plt,xO,OV,PV,FV,NV,mTt,yTt,xTt,kTt,l6n=jr($n,T6t,77,Hr,Yce,Otn),i2e;D(1540,1,os,HK),l.pf=function(e,n){_5n(u(e,37),n)},F($n,"InvertedPortProcessor",1540),D(1541,1,os,VK),l.pf=function(e,n){_mn(u(e,37),n)},F($n,"LabelAndNodeSizeProcessor",1541),D(1542,1,li,GK),l.Mb=function(e){return u(e,10).k==(Vn(),Os)},F($n,"LabelAndNodeSizeProcessor/lambda$0$Type",1542),D(1543,1,li,qd),l.Mb=function(e){return u(e,10).k==(Vn(),ks)},F($n,"LabelAndNodeSizeProcessor/lambda$1$Type",1543),D(1544,1,Un,FYt),l.td=function(e){wXe(this.b,this.a,this.c,u(e,10))},l.a=!1,l.c=!1,F($n,"LabelAndNodeSizeProcessor/lambda$2$Type",1544),D(1545,1,os,zB),l.pf=function(e,n){X4n(u(e,37),n)};var s2e;F($n,"LabelDummyInserter",1545),D(1546,1,xd,dw),l.Lb=function(e){return Vt(Q(u(e,70),(Te(),Od)))===Vt((M1(),P7))},l.Fb=function(e){return this===e},l.Mb=function(e){return Vt(Q(u(e,70),(Te(),Od)))===Vt((M1(),P7))},F($n,"LabelDummyInserter/1",1546),D(1547,1,os,qK),l.pf=function(e,n){Z3n(u(e,37),n)},F($n,"LabelDummyRemover",1547),D(1548,1,li,UK),l.Mb=function(e){return je(Re(Q(u(e,70),(Te(),rht))))},F($n,"LabelDummyRemover/lambda$0$Type",1548),D(1359,1,os,KJ),l.pf=function(e,n){S4n(this,u(e,37),n)},l.a=null;var blt;F($n,"LabelDummySwitcher",1359),D(286,1,{286:1},Uue),l.c=0,l.d=null,l.f=0,F($n,"LabelDummySwitcher/LabelDummyInfo",286),D(1360,1,{},dN),l.Kb=function(e){return r6(),new Tn(null,new _n(u(e,29).a,16))},F($n,"LabelDummySwitcher/lambda$0$Type",1360),D(1361,1,li,gN),l.Mb=function(e){return r6(),u(e,10).k==(Vn(),Ll)},F($n,"LabelDummySwitcher/lambda$1$Type",1361),D(1362,1,{},_g),l.Kb=function(e){return AZe(this.a,u(e,10))},F($n,"LabelDummySwitcher/lambda$2$Type",1362),D(1363,1,Un,cd),l.td=function(e){Snn(this.a,u(e,286))},F($n,"LabelDummySwitcher/lambda$3$Type",1363),D(1364,1,Oi,WK),l.ue=function(e,n){return enn(u(e,286),u(n,286))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"LabelDummySwitcher/lambda$4$Type",1364),D(791,1,os,S3),l.pf=function(e,n){Ran(u(e,37),n)},F($n,"LabelManagementProcessor",791),D(1549,1,os,Sk),l.pf=function(e,n){uvn(u(e,37),n)},F($n,"LabelSideSelector",1549),D(1550,1,li,LL),l.Mb=function(e){return je(Re(Q(u(e,70),(Te(),rht))))},F($n,"LabelSideSelector/lambda$0$Type",1550),D(1558,1,os,ym),l.pf=function(e,n){Gyn(u(e,37),n)},F($n,"LayerConstraintPostprocessor",1558),D(1559,1,os,QJ),l.pf=function(e,n){s2n(u(e,37),n)};var ETt;F($n,"LayerConstraintPreprocessor",1559),D(360,22,{3:1,35:1,22:1,360:1},tj);var kO,BV,RV,wlt,a2e=jr($n,"LayerConstraintPreprocessor/HiddenNodeConnections",360,Hr,Dsn,TJe),o2e;D(1560,1,os,Ak),l.pf=function(e,n){K3n(u(e,37),n)},F($n,"LayerSizeAndGraphHeightCalculator",1560),D(1561,1,os,YK),l.pf=function(e,n){Z2n(u(e,37),n)},F($n,"LongEdgeJoiner",1561),D(1562,1,os,jT),l.pf=function(e,n){M3n(u(e,37),n)},F($n,"LongEdgeSplitter",1562),D(1563,1,os,sd),l.pf=function(e,n){M4n(this,u(e,37),n)},l.d=0,l.e=0,l.i=0,l.j=0,l.k=0,l.n=0,F($n,"NodePromotion",1563),D(1564,1,{},pN),l.Kb=function(e){return u(e,46),Nn(),!0},l.Fb=function(e){return this===e},F($n,"NodePromotion/lambda$0$Type",1564),D(1565,1,{},_p),l.Kb=function(e){return Ynn(this.a,u(e,46))},l.Fb=function(e){return this===e},l.a=0,F($n,"NodePromotion/lambda$1$Type",1565),D(1566,1,{},Hf),l.Kb=function(e){return Knn(this.a,u(e,46))},l.Fb=function(e){return this===e},l.a=0,F($n,"NodePromotion/lambda$2$Type",1566),D(1567,1,os,ML),l.pf=function(e,n){txn(u(e,37),n)},F($n,"NorthSouthPortPostprocessor",1567),D(1568,1,os,Lk),l.pf=function(e,n){j5n(u(e,37),n)},F($n,"NorthSouthPortPreprocessor",1568),D(1569,1,Oi,DL),l.ue=function(e,n){return gun(u(e,11),u(n,11))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"NorthSouthPortPreprocessor/lambda$0$Type",1569),D(1570,1,os,bN),l.pf=function(e,n){nyn(u(e,37),n)},F($n,"PartitionMidprocessor",1570),D(1571,1,li,KK),l.Mb=function(e){return Us(u(e,10),(Te(),T7))},F($n,"PartitionMidprocessor/lambda$0$Type",1571),D(1572,1,Un,mw),l.td=function(e){wrn(this.a,u(e,10))},F($n,"PartitionMidprocessor/lambda$1$Type",1572),D(1573,1,os,IL),l.pf=function(e,n){vwn(u(e,37),n)},F($n,"PartitionPostprocessor",1573),D(1574,1,os,XK),l.pf=function(e,n){Abn(u(e,37),n)},F($n,"PartitionPreprocessor",1574),D(1575,1,li,QK),l.Mb=function(e){return Us(u(e,10),(Te(),T7))},F($n,"PartitionPreprocessor/lambda$0$Type",1575),D(1576,1,{},wN),l.Kb=function(e){return new Tn(null,new jw(new ar(lr(Ds(u(e,10)).a.Kc(),new z))))},F($n,"PartitionPreprocessor/lambda$1$Type",1576),D(1577,1,li,Z5),l.Mb=function(e){return xfn(u(e,17))},F($n,"PartitionPreprocessor/lambda$2$Type",1577),D(1578,1,Un,vN),l.td=function(e){Tun(u(e,17))},F($n,"PartitionPreprocessor/lambda$3$Type",1578),D(1579,1,os,wC),l.pf=function(e,n){$mn(u(e,37),n)};var TTt,c2e,u2e,l2e,CTt,_Tt;F($n,"PortListSorter",1579),D(1580,1,{},J5),l.Kb=function(e){return oE(),u(e,11).e},F($n,"PortListSorter/lambda$0$Type",1580),D(1581,1,{},ZK),l.Kb=function(e){return oE(),u(e,11).g},F($n,"PortListSorter/lambda$1$Type",1581),D(1582,1,Oi,OL),l.ue=function(e,n){return aJt(u(e,11),u(n,11))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"PortListSorter/lambda$2$Type",1582),D(1583,1,Oi,JK),l.ue=function(e,n){return G1n(u(e,11),u(n,11))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"PortListSorter/lambda$3$Type",1583),D(1584,1,Oi,tX),l.ue=function(e,n){return ple(u(e,11),u(n,11))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"PortListSorter/lambda$4$Type",1584),D(1585,1,os,eX),l.pf=function(e,n){Jbn(u(e,37),n)},F($n,"PortSideProcessor",1585),D(1586,1,os,nX),l.pf=function(e,n){tmn(u(e,37),n)},F($n,"ReversedEdgeRestorer",1586),D(1591,1,os,Tqt),l.pf=function(e,n){L1n(this,u(e,37),n)},F($n,"SelfLoopPortRestorer",1591),D(1592,1,{},mN),l.Kb=function(e){return new Tn(null,new _n(u(e,29).a,16))},F($n,"SelfLoopPortRestorer/lambda$0$Type",1592),D(1593,1,li,rX),l.Mb=function(e){return u(e,10).k==(Vn(),Os)},F($n,"SelfLoopPortRestorer/lambda$1$Type",1593),D(1594,1,li,iX),l.Mb=function(e){return Us(u(e,10),(ae(),x7))},F($n,"SelfLoopPortRestorer/lambda$2$Type",1594),D(1595,1,{},sX),l.Kb=function(e){return u(Q(u(e,10),(ae(),x7)),403)},F($n,"SelfLoopPortRestorer/lambda$3$Type",1595),D(1596,1,Un,Lm),l.td=function(e){Rgn(this.a,u(e,403))},F($n,"SelfLoopPortRestorer/lambda$4$Type",1596),D(794,1,Un,yN),l.td=function(e){Jgn(u(e,101))},F($n,"SelfLoopPortRestorer/lambda$5$Type",794),D(1597,1,os,aX),l.pf=function(e,n){Rfn(u(e,37),n)},F($n,"SelfLoopPostProcessor",1597),D(1598,1,{},oX),l.Kb=function(e){return new Tn(null,new _n(u(e,29).a,16))},F($n,"SelfLoopPostProcessor/lambda$0$Type",1598),D(1599,1,li,cX),l.Mb=function(e){return u(e,10).k==(Vn(),Os)},F($n,"SelfLoopPostProcessor/lambda$1$Type",1599),D(1600,1,li,xN),l.Mb=function(e){return Us(u(e,10),(ae(),x7))},F($n,"SelfLoopPostProcessor/lambda$2$Type",1600),D(1601,1,Un,uX),l.td=function(e){Gdn(u(e,10))},F($n,"SelfLoopPostProcessor/lambda$3$Type",1601),D(1602,1,{},lX),l.Kb=function(e){return new Tn(null,new _n(u(e,101).f,1))},F($n,"SelfLoopPostProcessor/lambda$4$Type",1602),D(1603,1,Un,xx),l.td=function(e){Psn(this.a,u(e,409))},F($n,"SelfLoopPostProcessor/lambda$5$Type",1603),D(1604,1,li,kN),l.Mb=function(e){return!!u(e,101).i},F($n,"SelfLoopPostProcessor/lambda$6$Type",1604),D(1605,1,Un,F3),l.td=function(e){vKe(this.a,u(e,101))},F($n,"SelfLoopPostProcessor/lambda$7$Type",1605),D(1587,1,os,EN),l.pf=function(e,n){D2n(u(e,37),n)},F($n,"SelfLoopPreProcessor",1587),D(1588,1,{},TN),l.Kb=function(e){return new Tn(null,new _n(u(e,101).f,1))},F($n,"SelfLoopPreProcessor/lambda$0$Type",1588),D(1589,1,{},hX),l.Kb=function(e){return u(e,409).a},F($n,"SelfLoopPreProcessor/lambda$1$Type",1589),D(1590,1,Un,fX),l.td=function(e){EQe(u(e,17))},F($n,"SelfLoopPreProcessor/lambda$2$Type",1590),D(1606,1,os,iYt),l.pf=function(e,n){Agn(this,u(e,37),n)},F($n,"SelfLoopRouter",1606),D(1607,1,{},Mk),l.Kb=function(e){return new Tn(null,new _n(u(e,29).a,16))},F($n,"SelfLoopRouter/lambda$0$Type",1607),D(1608,1,li,tx),l.Mb=function(e){return u(e,10).k==(Vn(),Os)},F($n,"SelfLoopRouter/lambda$1$Type",1608),D(1609,1,li,$T),l.Mb=function(e){return Us(u(e,10),(ae(),x7))},F($n,"SelfLoopRouter/lambda$2$Type",1609),D(1610,1,{},dX),l.Kb=function(e){return u(Q(u(e,10),(ae(),x7)),403)},F($n,"SelfLoopRouter/lambda$3$Type",1610),D(1611,1,Un,tGt),l.td=function(e){crn(this.a,this.b,u(e,403))},F($n,"SelfLoopRouter/lambda$4$Type",1611),D(1612,1,os,PL),l.pf=function(e,n){Qwn(u(e,37),n)},F($n,"SemiInteractiveCrossMinProcessor",1612),D(1613,1,li,zT),l.Mb=function(e){return u(e,10).k==(Vn(),Os)},F($n,"SemiInteractiveCrossMinProcessor/lambda$0$Type",1613),D(1614,1,li,FL),l.Mb=function(e){return yKt(u(e,10))._b((Te(),Uy))},F($n,"SemiInteractiveCrossMinProcessor/lambda$1$Type",1614),D(1615,1,Oi,CN),l.ue=function(e,n){return _cn(u(e,10),u(n,10))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F($n,"SemiInteractiveCrossMinProcessor/lambda$2$Type",1615),D(1616,1,{},_N),l.Ce=function(e,n){return Crn(u(e,10),u(n,10))},F($n,"SemiInteractiveCrossMinProcessor/lambda$3$Type",1616),D(1618,1,os,gX),l.pf=function(e,n){Uyn(u(e,37),n)},F($n,"SortByInputModelProcessor",1618),D(1619,1,li,pX),l.Mb=function(e){return u(e,11).g.c.length!=0},F($n,"SortByInputModelProcessor/lambda$0$Type",1619),D(1620,1,Un,kx),l.td=function(e){ipn(this.a,u(e,11))},F($n,"SortByInputModelProcessor/lambda$1$Type",1620),D(1693,803,{},pne),l.Me=function(e){var n,r,s,o;switch(this.c=e,this.a.g){case 2:n=new he,ls(Ri(new Tn(null,new _n(this.c.a.b,16)),new MN),new sGt(this,n)),hI(this,new AN),xu(n,new wX),n.c=Nt(Qn,De,1,0,5,1),ls(Ri(new Tn(null,new _n(this.c.a.b,16)),new vX),new N3(n)),hI(this,new mX),xu(n,new yX),n.c=Nt(Qn,De,1,0,5,1),r=RUt(Ane(l$(new Tn(null,new _n(this.c.a.b,16)),new Hd(this))),new xX),ls(new Tn(null,new _n(this.c.a.a,16)),new nGt(r,n)),hI(this,new kX),xu(n,new bX),n.c=Nt(Qn,De,1,0,5,1);break;case 3:s=new he,hI(this,new SN),o=RUt(Ane(l$(new Tn(null,new _n(this.c.a.b,16)),new SC(this))),new LN),ls(Ri(new Tn(null,new _n(this.c.a.b,16)),new EX),new iGt(o,s)),hI(this,new TX),xu(s,new CX),s.c=Nt(Qn,De,1,0,5,1);break;default:throw it(new uqt)}},l.b=0,F(_s,"EdgeAwareScanlineConstraintCalculation",1693),D(1694,1,xd,SN),l.Lb=function(e){return _t(u(e,57).g,145)},l.Fb=function(e){return this===e},l.Mb=function(e){return _t(u(e,57).g,145)},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$0$Type",1694),D(1695,1,{},SC),l.Fe=function(e){return Bpn(this.a,u(e,57))},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$1$Type",1695),D(1703,1,Vq,eGt),l.Vd=function(){h_(this.a,this.b,-1)},l.b=0,F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$10$Type",1703),D(1705,1,xd,AN),l.Lb=function(e){return _t(u(e,57).g,145)},l.Fb=function(e){return this===e},l.Mb=function(e){return _t(u(e,57).g,145)},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$11$Type",1705),D(1706,1,Un,wX),l.td=function(e){u(e,365).Vd()},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$12$Type",1706),D(1707,1,li,vX),l.Mb=function(e){return _t(u(e,57).g,10)},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$13$Type",1707),D(1709,1,Un,N3),l.td=function(e){lhn(this.a,u(e,57))},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$14$Type",1709),D(1708,1,Vq,uGt),l.Vd=function(){h_(this.b,this.a,-1)},l.a=0,F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$15$Type",1708),D(1710,1,xd,mX),l.Lb=function(e){return _t(u(e,57).g,10)},l.Fb=function(e){return this===e},l.Mb=function(e){return _t(u(e,57).g,10)},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$16$Type",1710),D(1711,1,Un,yX),l.td=function(e){u(e,365).Vd()},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$17$Type",1711),D(1712,1,{},Hd),l.Fe=function(e){return Rpn(this.a,u(e,57))},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$18$Type",1712),D(1713,1,{},xX),l.De=function(){return 0},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$19$Type",1713),D(1696,1,{},LN),l.De=function(){return 0},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$2$Type",1696),D(1715,1,Un,nGt),l.td=function(e){Gen(this.a,this.b,u(e,307))},l.a=0,F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$20$Type",1715),D(1714,1,Vq,rGt),l.Vd=function(){Cce(this.a,this.b,-1)},l.b=0,F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$21$Type",1714),D(1716,1,xd,kX),l.Lb=function(e){return u(e,57),!0},l.Fb=function(e){return this===e},l.Mb=function(e){return u(e,57),!0},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$22$Type",1716),D(1717,1,Un,bX),l.td=function(e){u(e,365).Vd()},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$23$Type",1717),D(1697,1,li,EX),l.Mb=function(e){return _t(u(e,57).g,10)},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$3$Type",1697),D(1699,1,Un,iGt),l.td=function(e){Uen(this.a,this.b,u(e,57))},l.a=0,F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$4$Type",1699),D(1698,1,Vq,lGt),l.Vd=function(){h_(this.b,this.a,-1)},l.a=0,F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$5$Type",1698),D(1700,1,xd,TX),l.Lb=function(e){return u(e,57),!0},l.Fb=function(e){return this===e},l.Mb=function(e){return u(e,57),!0},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$6$Type",1700),D(1701,1,Un,CX),l.td=function(e){u(e,365).Vd()},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$7$Type",1701),D(1702,1,li,MN),l.Mb=function(e){return _t(u(e,57).g,145)},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$8$Type",1702),D(1704,1,Un,sGt),l.td=function(e){Hon(this.a,this.b,u(e,57))},F(_s,"EdgeAwareScanlineConstraintCalculation/lambda$9$Type",1704),D(1521,1,os,yWt),l.pf=function(e,n){B3n(this,u(e,37),n)};var h2e;F(_s,"HorizontalGraphCompactor",1521),D(1522,1,{},y1),l.Oe=function(e,n){var r,s,o;return qmt(e,n)||(r=t4(e),s=t4(n),r&&r.k==(Vn(),ks)||s&&s.k==(Vn(),ks))?0:(o=u(Q(this.a.a,(ae(),Q4)),304),QQe(o,r?r.k:(Vn(),ta),s?s.k:(Vn(),ta)))},l.Pe=function(e,n){var r,s,o;return qmt(e,n)?1:(r=t4(e),s=t4(n),o=u(Q(this.a.a,(ae(),Q4)),304),B2t(o,r?r.k:(Vn(),ta),s?s.k:(Vn(),ta)))},F(_s,"HorizontalGraphCompactor/1",1522),D(1523,1,{},qT),l.Ne=function(e,n){return GC(),e.a.i==0},F(_s,"HorizontalGraphCompactor/lambda$0$Type",1523),D(1524,1,{},Vd),l.Ne=function(e,n){return xrn(this.a,e,n)},F(_s,"HorizontalGraphCompactor/lambda$1$Type",1524),D(1664,1,{},tee);var f2e,d2e;F(_s,"LGraphToCGraphTransformer",1664),D(1672,1,li,_X),l.Mb=function(e){return e!=null},F(_s,"LGraphToCGraphTransformer/0methodref$nonNull$Type",1672),D(1665,1,{},SX),l.Kb=function(e){return df(),$o(Q(u(u(e,57).g,10),(ae(),_i)))},F(_s,"LGraphToCGraphTransformer/lambda$0$Type",1665),D(1666,1,{},DN),l.Kb=function(e){return df(),rie(u(u(e,57).g,145))},F(_s,"LGraphToCGraphTransformer/lambda$1$Type",1666),D(1675,1,li,AX),l.Mb=function(e){return df(),_t(u(e,57).g,10)},F(_s,"LGraphToCGraphTransformer/lambda$10$Type",1675),D(1676,1,Un,LX),l.td=function(e){yrn(u(e,57))},F(_s,"LGraphToCGraphTransformer/lambda$11$Type",1676),D(1677,1,li,MX),l.Mb=function(e){return df(),_t(u(e,57).g,145)},F(_s,"LGraphToCGraphTransformer/lambda$12$Type",1677),D(1681,1,Un,DX),l.td=function(e){Cln(u(e,57))},F(_s,"LGraphToCGraphTransformer/lambda$13$Type",1681),D(1678,1,Un,AC),l.td=function(e){KXe(this.a,u(e,8))},l.a=0,F(_s,"LGraphToCGraphTransformer/lambda$14$Type",1678),D(1679,1,Un,Yb),l.td=function(e){QXe(this.a,u(e,110))},l.a=0,F(_s,"LGraphToCGraphTransformer/lambda$15$Type",1679),D(1680,1,Un,dR),l.td=function(e){XXe(this.a,u(e,8))},l.a=0,F(_s,"LGraphToCGraphTransformer/lambda$16$Type",1680),D(1682,1,{},IX),l.Kb=function(e){return df(),new Tn(null,new jw(new ar(lr(Ds(u(e,10)).a.Kc(),new z))))},F(_s,"LGraphToCGraphTransformer/lambda$17$Type",1682),D(1683,1,li,OX),l.Mb=function(e){return df(),Ga(u(e,17))},F(_s,"LGraphToCGraphTransformer/lambda$18$Type",1683),D(1684,1,Un,Htt),l.td=function(e){Don(this.a,u(e,17))},F(_s,"LGraphToCGraphTransformer/lambda$19$Type",1684),D(1668,1,Un,Vtt),l.td=function(e){hsn(this.a,u(e,145))},F(_s,"LGraphToCGraphTransformer/lambda$2$Type",1668),D(1685,1,{},IN),l.Kb=function(e){return df(),new Tn(null,new _n(u(e,29).a,16))},F(_s,"LGraphToCGraphTransformer/lambda$20$Type",1685),D(1686,1,{},PX),l.Kb=function(e){return df(),new Tn(null,new jw(new ar(lr(Ds(u(e,10)).a.Kc(),new z))))},F(_s,"LGraphToCGraphTransformer/lambda$21$Type",1686),D(1687,1,{},ON),l.Kb=function(e){return df(),u(Q(u(e,17),(ae(),R2)),15)},F(_s,"LGraphToCGraphTransformer/lambda$22$Type",1687),D(1688,1,li,FX),l.Mb=function(e){return JQe(u(e,15))},F(_s,"LGraphToCGraphTransformer/lambda$23$Type",1688),D(1689,1,Un,Gtt),l.td=function(e){Apn(this.a,u(e,15))},F(_s,"LGraphToCGraphTransformer/lambda$24$Type",1689),D(1667,1,Un,aGt),l.td=function(e){Zsn(this.a,this.b,u(e,145))},F(_s,"LGraphToCGraphTransformer/lambda$3$Type",1667),D(1669,1,{},NX),l.Kb=function(e){return df(),new Tn(null,new _n(u(e,29).a,16))},F(_s,"LGraphToCGraphTransformer/lambda$4$Type",1669),D(1670,1,{},BX),l.Kb=function(e){return df(),new Tn(null,new jw(new ar(lr(Ds(u(e,10)).a.Kc(),new z))))},F(_s,"LGraphToCGraphTransformer/lambda$5$Type",1670),D(1671,1,{},HT),l.Kb=function(e){return df(),u(Q(u(e,17),(ae(),R2)),15)},F(_s,"LGraphToCGraphTransformer/lambda$6$Type",1671),D(1673,1,Un,Utt),l.td=function(e){abn(this.a,u(e,15))},F(_s,"LGraphToCGraphTransformer/lambda$8$Type",1673),D(1674,1,Un,oGt),l.td=function(e){mQe(this.a,this.b,u(e,145))},F(_s,"LGraphToCGraphTransformer/lambda$9$Type",1674),D(1663,1,{},RX),l.Le=function(e){var n,r,s,o,h;for(this.a=e,this.d=new eet,this.c=Nt(a7t,De,121,this.a.a.a.c.length,0,1),this.b=0,r=new S(this.a.a.a);r.a=tt&&(le(h,pe(M)),St=b.Math.max(St,Rt[M-1]-j),v+=K,gt+=Rt[M-1]-gt,j=Rt[M-1],K=k[M]),K=b.Math.max(K,k[M]),++M;v+=K}G=b.Math.min(1/St,1/n.b/v),G>s&&(s=G,r=h)}return r},l.Wf=function(){return!1},F(Cd,"MSDCutIndexHeuristic",802),D(1617,1,os,lQ),l.pf=function(e,n){Ryn(u(e,37),n)},F(Cd,"SingleEdgeGraphWrapper",1617),D(227,22,{3:1,35:1,22:1,227:1},ZC);var V4,g7,p7,Ny,bS,G4,b7=jr(kc,"CenterEdgeLabelPlacementStrategy",227,Hr,Kan,SJe),C2e;D(422,22,{3:1,35:1,22:1,422:1},Bbt);var ATt,Alt,LTt=jr(kc,"ConstraintCalculationStrategy",422,Hr,jrn,AJe),_2e;D(314,22,{3:1,35:1,22:1,314:1,246:1,234:1},Pet),l.Kf=function(){return Noe(this)},l.Xf=function(){return Noe(this)};var EO,P6,MTt,DTt=jr(kc,"CrossingMinimizationStrategy",314,Hr,Din,LJe),S2e;D(337,22,{3:1,35:1,22:1,337:1},Fet);var ITt,Llt,VV,OTt=jr(kc,"CuttingStrategy",337,Hr,Iin,IJe),A2e;D(335,22,{3:1,35:1,22:1,335:1,246:1,234:1},AM),l.Kf=function(){return kce(this)},l.Xf=function(){return kce(this)};var PTt,Mlt,wS,Dlt,vS,FTt=jr(kc,"CycleBreakingStrategy",335,Hr,xan,OJe),L2e;D(419,22,{3:1,35:1,22:1,419:1},Rbt);var GV,NTt,BTt=jr(kc,"DirectionCongruency",419,Hr,Rrn,PJe),M2e;D(450,22,{3:1,35:1,22:1,450:1},Net);var w7,Ilt,U4,D2e=jr(kc,"EdgeConstraint",450,Hr,Oin,FJe),I2e;D(276,22,{3:1,35:1,22:1,276:1},JC);var Olt,Plt,Flt,Nlt,UV,Blt,RTt=jr(kc,"EdgeLabelSideSelection",276,Hr,Jan,NJe),O2e;D(479,22,{3:1,35:1,22:1,479:1},jbt);var WV,jTt,$Tt=jr(kc,"EdgeStraighteningStrategy",479,Hr,Brn,BJe),P2e;D(274,22,{3:1,35:1,22:1,274:1},t9);var Rlt,zTt,qTt,YV,HTt,VTt,GTt=jr(kc,"FixedAlignment",274,Hr,Qan,RJe),F2e;D(275,22,{3:1,35:1,22:1,275:1},e9);var UTt,WTt,YTt,KTt,mS,XTt,QTt=jr(kc,"GraphCompactionStrategy",275,Hr,Xan,jJe),N2e;D(256,22,{3:1,35:1,22:1,256:1},Fm);var v7,KV,m7,vh,yS,XV,y7,W4,QV,xS,jlt=jr(kc,"GraphProperties",256,Hr,Rcn,$Je),B2e;D(292,22,{3:1,35:1,22:1,292:1},Bet);var TO,$lt,zlt,qlt=jr(kc,"GreedySwitchType",292,Hr,Nin,zJe),R2e;D(303,22,{3:1,35:1,22:1,303:1},Ret);var F6,CO,Y4,j2e=jr(kc,"InLayerConstraint",303,Hr,Fin,qJe),$2e;D(420,22,{3:1,35:1,22:1,420:1},$bt);var Hlt,ZTt,JTt=jr(kc,"InteractiveReferencePoint",420,Hr,$rn,HJe),z2e,tCt,N6,Iv,ZV,eCt,nCt,JV,rCt,_O,tG,kS,B6,By,Vlt,eG,oc,iCt,Ov,Vc,Glt,Ult,SO,B2,Pv,R6,sCt,j6,AO,Ry,r1,$h,Wlt,K4,Tc,_i,aCt,oCt,cCt,uCt,lCt,Ylt,nG,Ju,Fv,Klt,$6,LO,q1,X4,x7,Q4,Z4,k7,R2,hCt,Xlt,Qlt,z6;D(163,22,{3:1,35:1,22:1,163:1},MM);var ES,bb,TS,jy,MO,fCt=jr(kc,"LayerConstraint",163,Hr,Tan,VJe),q2e;D(848,1,Oh,rtt),l.Qe=function(e){an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,C6t),""),"Direction Congruency"),"Specifies how drawings of the same graph with different layout directions compare to each other: either a natural reading direction is preserved or the drawings are rotated versions of each other."),kCt),(Ug(),us)),BTt),un((Qf(),qn))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,_6t),""),"Feedback Edges"),"Whether feedback edges should be highlighted by routing around the nodes."),(Nn(),!1)),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,sH),""),"Interactive Reference Point"),"Determines which point of a node is considered by interactive layout phases."),ACt),us),JTt),un(qn)))),ca(e,sH,Qot,Owe),ca(e,sH,H_,Iwe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,S6t),""),"Merge Edges"),"Edges that have no ports are merged so they touch the connected nodes at the same points. When this option is disabled, one port is created for each edge directly connected to a node. When it is enabled, all such incoming edges share an input port, and all outgoing edges share an output port."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,A6t),""),"Merge Hierarchy-Crossing Edges"),"If hierarchical layout is active, hierarchy-crossing edges use as few hierarchical ports as possible. They are broken by the algorithm, with hierarchical ports inserted as required. Usually, one such port is created for each edge at each hierarchy crossing point. With this option set to true, we try to create as few hierarchical ports as possible in the process. In particular, all edges that form a hyperedge can share a port."),!0),La),Rs),un(qn)))),an(e,new Xe(XKe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,L6t),""),"Allow Non-Flow Ports To Switch Sides"),"Specifies whether non-flow ports may switch sides if their node's port constraints are either FIXED_SIDE or FIXED_ORDER. A non-flow port is a port on a side that is not part of the currently configured layout flow. For instance, given a left-to-right layout direction, north and south ports would be considered non-flow ports. Further note that the underlying criterium whether to switch sides or not solely relies on the minimization of edge crossings. Hence, edge length and other aesthetics criteria are not addressed."),!1),La),Rs),un(V2)),lt(ct(Ae,1),ee,2,6,["org.eclipse.elk.layered.northOrSouthPort"])))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,M6t),""),"Port Sorting Strategy"),"Only relevant for nodes with FIXED_SIDE port constraints. Determines the way a node's ports are distributed on the sides of a node if their order is not prescribed. The option is set on parent nodes."),NCt),us),V9t),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,D6t),""),"Thoroughness"),"How much effort should be spent to produce a nice layout."),pe(7)),gc),ja),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,I6t),""),"Add Unnecessary Bendpoints"),"Adds bend points even if an edge does not change direction. If true, each long edge dummy will contribute a bend point to its edges and hierarchy-crossing edges will always get a bend point where they cross hierarchy boundaries. By default, bend points are only added where an edge changes direction."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,O6t),""),"Generate Position and Layer IDs"),"If enabled position id and layer id are generated, which are usually only used internally when setting the interactiveLayout option. This option should be specified on the root node."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Qot),"cycleBreaking"),"Cycle Breaking Strategy"),"Strategy for cycle breaking. Cycle breaking looks for cycles in the graph and determines which edges to reverse to break the cycles. Reversed edges will end up pointing to the opposite direction of regular edges (that is, reversed edges will point left if edges usually point right)."),xCt),us),FTt),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,KI),xct),"Node Layering Strategy"),"Strategy for node layering."),DCt),us),I9t),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,P6t),xct),"Layer Constraint"),"Determines a constraint on the placement of the node regarding the layering."),LCt),us),fCt),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,F6t),xct),"Layer Choice Constraint"),"Allows to set a constraint regarding the layer placement of a node. Let i be the value of teh constraint. Assumed the drawing has n layers and i < n. If set to i, it expresses that the node should be placed in i-th layer. Should i>=n be true then the node is placed in the last layer of the drawing. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),pe(-1)),gc),ja),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,N6t),xct),"Layer ID"),"Layer identifier that was calculated by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set."),pe(-1)),gc),ja),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Zot),I1e),"Upper Bound On Width [MinWidth Layerer]"),"Defines a loose upper bound on the width of the MinWidth layerer. If set to '-1' multiple values are tested and the best result is selected."),pe(4)),gc),ja),un(qn)))),ca(e,Zot,KI,$we),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Jot),I1e),"Upper Layer Estimation Scaling Factor [MinWidth Layerer]"),"Multiplied with Upper Bound On Width for defining an upper bound on the width of layers which haven't been determined yet, but whose maximum width had been (roughly) estimated by the MinWidth algorithm. Compensates for too high estimations. If set to '-1' multiple values are tested and the best result is selected."),pe(2)),gc),ja),un(qn)))),ca(e,Jot,KI,qwe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,tct),O1e),"Node Promotion Strategy"),"Reduces number of dummy nodes after layering phase (if possible)."),MCt),us),z9t),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,ect),O1e),"Max Node Promotion Iterations"),"Limits the number of iterations for node promotion."),pe(0)),gc),ja),un(qn)))),ca(e,ect,tct,null),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,nct),"layering.coffmanGraham"),"Layer Bound"),"The maximum number of nodes allowed per layer."),pe(wi)),gc),ja),un(qn)))),ca(e,nct,KI,Fwe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,H_),XI),"Crossing Minimization Strategy"),"Strategy for crossing minimization."),yCt),us),DTt),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,B6t),XI),"Force Node Model Order"),"The node order given by the model does not change to produce a better layout. E.g. if node A is before node B in the model this is not changed during crossing minimization. This assumes that the node model order is already respected before crossing minimization. This can be achieved by setting considerModelOrder.strategy to NODES_AND_EDGES."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,rct),XI),"Hierarchical Sweepiness"),"How likely it is to use cross-hierarchy (1) vs bottom-up (-1)."),.1),Oo),la),un(qn)))),ca(e,rct,vH,owe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,ict),XI),"Semi-Interactive Crossing Minimization"),"Preserves the order of nodes within a layer but still minimizes crossings between edges connecting long edge dummies. Derives the desired order from positions specified by the 'org.eclipse.elk.position' layout option. Requires a crossing minimization strategy that is able to process 'in-layer' constraints."),!1),La),Rs),un(qn)))),ca(e,ict,H_,hwe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,R6t),XI),"Position Choice Constraint"),"Allows to set a constraint regarding the position placement of a node in a layer. Assumed the layer in which the node placed includes n other nodes and i < n. If set to i, it expresses that the node should be placed at the i-th position. Should i>=n be true then the node is placed at the last position in the layer. Note that this option is not part of any of ELK Layered's default configurations but is only evaluated as part of the `InteractiveLayeredGraphVisitor`, which must be applied manually or used via the `DiagramLayoutEngine."),pe(-1)),gc),ja),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,j6t),XI),"Position ID"),"Position within a layer that was determined by ELK Layered for a node. This is only generated if interactiveLayot or generatePositionAndLayerIds is set."),pe(-1)),gc),ja),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,$6t),P1e),"Greedy Switch Activation Threshold"),"By default it is decided automatically if the greedy switch is activated or not. The decision is based on whether the size of the input graph (without dummy nodes) is smaller than the value of this option. A '0' enforces the activation."),pe(40)),gc),ja),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,sct),P1e),"Greedy Switch Crossing Minimization"),"Greedy Switch strategy for crossing minimization. The greedy switch heuristic is executed after the regular crossing minimization as a post-processor. Note that if 'hierarchyHandling' is set to 'INCLUDE_CHILDREN', the 'greedySwitchHierarchical.type' option must be used."),mCt),us),qlt),un(qn)))),ca(e,sct,H_,swe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,aH),"crossingMinimization.greedySwitchHierarchical"),"Greedy Switch Crossing Minimization (hierarchical)"),"Activates the greedy switch heuristic in case hierarchical layout is used. The differences to the non-hierarchical case (see 'greedySwitch.type') are: 1) greedy switch is inactive by default, 3) only the option value set on the node at which hierarchical layout starts is relevant, and 2) if it's activated by the user, it properly addresses hierarchy-crossing edges."),vCt),us),qlt),un(qn)))),ca(e,aH,H_,nwe),ca(e,aH,vH,rwe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,I4),F1e),"Node Placement Strategy"),"Strategy for node placement."),FCt),us),N9t),un(qn)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,oH),F1e),"Favor Straight Edges Over Balancing"),"Favor straight edges over a balanced node placement. The default behavior is determined automatically based on the used 'edgeRouting'. For an orthogonal style it is set to true, for all other styles to false."),La),Rs),un(qn)))),ca(e,oH,I4,Jwe),ca(e,oH,I4,tve),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,act),N1e),"BK Edge Straightening"),"Specifies whether the Brandes Koepf node placer tries to increase the number of straight edges at the expense of diagram size. There is a subtle difference to the 'favorStraightEdges' option, which decides whether a balanced placement of the nodes is desired, or not. In bk terms this means combining the four alignments into a single balanced one, or not. This option on the other hand tries to straighten additional edges during the creation of each of the four alignments."),ICt),us),$Tt),un(qn)))),ca(e,act,I4,Kwe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,oct),N1e),"BK Fixed Alignment"),"Tells the BK node placer to use a certain alignment (out of its four) instead of the one producing the smallest height, or the combination of all four."),OCt),us),GTt),un(qn)))),ca(e,oct,I4,Qwe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,cct),"nodePlacement.linearSegments"),"Linear Segments Deflection Dampening"),"Dampens the movement of nodes to keep the diagram from getting too large."),.3),Oo),la),un(qn)))),ca(e,cct,I4,nve),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,uct),"nodePlacement.networkSimplex"),"Node Flexibility"),"Aims at shorter and straighter edges. Two configurations are possible: (a) allow ports to move freely on the side they are assigned to (the order is always defined beforehand), (b) additionally allow to enlarge a node wherever it helps. If this option is not configured for a node, the 'nodeFlexibility.default' value is used, which is specified for the node's parent."),us),yht),un(ea)))),ca(e,uct,I4,ave),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,lct),"nodePlacement.networkSimplex.nodeFlexibility"),"Node Flexibility Default"),"Default value of the 'nodeFlexibility' option for the children of a hierarchical node."),PCt),us),yht),un(qn)))),ca(e,lct,I4,sve),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,z6t),B1e),"Self-Loop Distribution"),"Alter the distribution of the loops around the node. It only takes effect for PortConstraints.FREE."),CCt),us),W9t),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,q6t),B1e),"Self-Loop Ordering"),"Alter the ordering of the loops they can either be stacked or sequenced. It only takes effect for PortConstraints.FREE."),_Ct),us),Y9t),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,cH),"edgeRouting.splines"),"Spline Routing Mode"),"Specifies the way control points are assembled for each individual edge. CONSERVATIVE ensures that edges are properly routed around the nodes but feels rather orthogonal at times. SLOPPY uses fewer control points to obtain curvier edge routes but may result in edges overlapping nodes."),SCt),us),X9t),un(qn)))),ca(e,cH,QI,kwe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,uH),"edgeRouting.splines.sloppy"),"Sloppy Spline Layer Spacing Factor"),"Spacing factor for routing area between layers when using sloppy spline routing."),.2),Oo),la),un(qn)))),ca(e,uH,QI,Twe),ca(e,uH,cH,Cwe),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,hct),"edgeRouting.polyline"),"Sloped Edge Zone Width"),"Width of the strip to the left and to the right of each layer where the polyline edge router is allowed to refrain from ensuring that edges are routed horizontally. This prevents awkward bend points for nodes that extent almost to the edge of their layer."),2),Oo),la),un(qn)))),ca(e,hct,QI,vwe),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,H6t),R1),"Spacing Base Value"),"An optional base value for all other layout options of the 'spacing' group. It can be used to conveniently alter the overall 'spaciousness' of the drawing. Whenever an explicit value is set for the other layout options, this base value will have no effect. The base value is not inherited, i.e. it must be set for each hierarchical node."),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,V6t),R1),"Edge Node Between Layers Spacing"),"The spacing to be preserved between nodes and edges that are routed next to the node's layer. For the spacing between nodes and edges that cross the node's layer 'spacing.edgeNode' is used."),10),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,G6t),R1),"Edge Edge Between Layer Spacing"),"Spacing to be preserved between pairs of edges that are routed between the same pair of layers. Note that 'spacing.edgeEdge' is used for the spacing between pairs of edges crossing the same layer."),10),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,U6t),R1),"Node Node Between Layers Spacing"),"The spacing to be preserved between any pair of nodes of two adjacent layers. Note that 'spacing.nodeNode' is used for the spacing between nodes within the layer itself."),20),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,W6t),nkt),"Direction Priority"),"Defines how important it is to have a certain edge point into the direction of the overall layout. This option is evaluated during the cycle breaking phase."),pe(0)),gc),ja),un(Pd)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Y6t),nkt),"Shortness Priority"),"Defines how important it is to keep an edge as short as possible. This option is evaluated during the layering phase."),pe(0)),gc),ja),un(Pd)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,K6t),nkt),"Straightness Priority"),"Defines how important it is to keep an edge straight, i.e. aligned with one of the two axes. This option is evaluated during node placement."),pe(0)),gc),ja),un(Pd)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,fct),rkt),Jfe),"Tries to further compact components (disconnected sub-graphs)."),!1),La),Rs),un(qn)))),ca(e,fct,R_,!0),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,X6t),R1e),"Post Compaction Strategy"),j1e),gCt),us),QTt),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Q6t),R1e),"Post Compaction Constraint Calculation"),j1e),dCt),us),LTt),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,lH),ikt),"High Degree Node Treatment"),"Makes room around high degree nodes to place leafs and trees."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,dct),ikt),"High Degree Node Threshold"),"Whether a node is considered to have a high degree."),pe(16)),gc),ja),un(qn)))),ca(e,dct,lH,!0),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,gct),ikt),"High Degree Node Maximum Tree Height"),"Maximum height of a subtree connected to a high degree node to be moved to separate layers."),pe(5)),gc),ja),un(qn)))),ca(e,gct,lH,!0),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,tg),skt),"Graph Wrapping Strategy"),"For certain graphs and certain prescribed drawing areas it may be desirable to split the laid out graph into chunks that are placed side by side. The edges that connect different chunks are 'wrapped' around from the end of one chunk to the start of the other chunk. The points between the chunks are referred to as 'cuts'."),jCt),us),t_t),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,hH),skt),"Additional Wrapped Edges Spacing"),"To visually separate edges that are wrapped from regularly routed edges an additional spacing value can be specified in form of this layout option. The spacing is added to the regular edgeNode spacing."),10),Oo),la),un(qn)))),ca(e,hH,tg,mve),ca(e,hH,tg,yve),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,fH),skt),"Correction Factor for Wrapping"),"At times and for certain types of graphs the executed wrapping may produce results that are consistently biased in the same fashion: either wrapping to often or to rarely. This factor can be used to correct the bias. Internally, it is simply multiplied with the 'aspect ratio' layout option."),1),Oo),la),un(qn)))),ca(e,fH,tg,kve),ca(e,fH,tg,Eve),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,V_),$1e),"Cutting Strategy"),"The strategy by which the layer indexes are determined at which the layering crumbles into chunks."),RCt),us),OTt),un(qn)))),ca(e,V_,tg,Lve),ca(e,V_,tg,Mve),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,pct),$1e),"Manually Specified Cuts"),"Allows the user to specify her own cuts for a certain graph."),V1),wh),un(qn)))),ca(e,pct,V_,Cve),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,bct),"wrapping.cutting.msd"),"MSD Freedom"),"The MSD cutting strategy starts with an initial guess on the number of chunks the graph should be split into. The freedom specifies how much the strategy may deviate from this guess. E.g. if an initial number of 3 is computed, a freedom of 1 allows 2, 3, and 4 cuts."),BCt),gc),ja),un(qn)))),ca(e,bct,V_,Sve),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,dH),z1e),"Validification Strategy"),"When wrapping graphs, one can specify indices that are not allowed as split points. The validification strategy makes sure every computed split point is allowed."),$Ct),us),J9t),un(qn)))),ca(e,dH,tg,qve),ca(e,dH,tg,Hve),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,gH),z1e),"Valid Indices for Wrapping"),null),V1),wh),un(qn)))),ca(e,gH,tg,jve),ca(e,gH,tg,$ve),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,pH),akt),"Improve Cuts"),"For general graphs it is important that not too many edges wrap backwards. Thus a compromise between evenly-distributed cuts and the total number of cut edges is sought."),!0),La),Rs),un(qn)))),ca(e,pH,tg,Pve),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,bH),akt),"Distance Penalty When Improving Cuts"),null),2),Oo),la),un(qn)))),ca(e,bH,tg,Ive),ca(e,bH,pH,!0),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,wct),akt),"Improve Wrapped Edges"),"The initial wrapping is performed in a very simple way. As a consequence, edges that wrap from one chunk to another may be unnecessarily long. Activating this option tries to shorten such edges."),!0),La),Rs),un(qn)))),ca(e,wct,tg,Nve),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Z6t),kct),"Edge Label Side Selection"),"Method to decide on edge label sides."),TCt),us),RTt),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,J6t),kct),"Edge Center Label Placement Strategy"),"Determines in which layer center labels of long edges should be placed."),ECt),us),b7),ji(qn,lt(ct(ip,1),oe,175,0,[rp]))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,wH),ZI),"Consider Model Order"),"Preserves the order of nodes and edges in the model file if this does not lead to additional edge crossings. Depending on the strategy this is not always possible since the node and edge order might be conflicting."),wCt),us),H9t),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,tkt),ZI),"No Model Order"),"Set on a node to not set a model order for this node even though it is a real node."),!1),La),Rs),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,vct),ZI),"Consider Model Order for Components"),"If set to NONE the usual ordering strategy (by cumulative node priority and size of nodes) is used. INSIDE_PORT_SIDES orders the components with external ports only inside the groups with the same port side. FORCE_MODEL_ORDER enforces the mode order on components. This option might produce bad alignments and sub optimal drawings in terms of used area since the ordering should be respected."),pCt),us),F7t),un(qn)))),ca(e,vct,R_,null),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,ekt),ZI),"Long Edge Ordering Strategy"),"Indicates whether long edges are sorted under, over, or equal to nodes that have no connection to a previous layer in a left-to-right or right-to-left layout. Under and over changes to right and left in a vertical layout."),bCt),us),P9t),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,mct),ZI),"Crossing Counter Node Order Influence"),"Indicates with what percentage (1 for 100%) violations of the node model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal node order. Defaults to no influence (0)."),0),Oo),la),un(qn)))),ca(e,mct,wH,null),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,yct),ZI),"Crossing Counter Port Order Influence"),"Indicates with what percentage (1 for 100%) violations of the port model order are weighted against the crossings e.g. a value of 0.5 means two model order violations are as important as on edge crossing. This allows some edge crossings in favor of preserving the model order. It is advised to set this value to a very small positive value (e.g. 0.001) to have minimal crossing and a optimal port order. Defaults to no influence (0)."),0),Oo),la),un(qn)))),ca(e,yct,wH,null),ife((new HB,e))};var H2e,V2e,G2e,dCt,U2e,gCt,W2e,pCt,Y2e,K2e,X2e,bCt,Q2e,Z2e,wCt,J2e,twe,ewe,vCt,nwe,rwe,iwe,mCt,swe,awe,owe,cwe,uwe,lwe,hwe,fwe,yCt,dwe,xCt,gwe,kCt,pwe,ECt,bwe,TCt,wwe,vwe,mwe,CCt,ywe,_Ct,xwe,SCt,kwe,Ewe,Twe,Cwe,_we,Swe,Awe,Lwe,Mwe,Dwe,ACt,Iwe,Owe,Pwe,Fwe,Nwe,Bwe,LCt,Rwe,jwe,$we,zwe,qwe,Hwe,Vwe,MCt,Gwe,DCt,Uwe,Wwe,Ywe,ICt,Kwe,Xwe,OCt,Qwe,Zwe,Jwe,tve,eve,nve,rve,ive,PCt,sve,ave,ove,FCt,cve,NCt,uve,lve,hve,fve,dve,gve,pve,bve,wve,vve,mve,yve,xve,kve,Eve,Tve,Cve,_ve,BCt,Sve,Ave,RCt,Lve,Mve,Dve,Ive,Ove,Pve,Fve,Nve,Bve,jCt,Rve,jve,$ve,zve,$Ct,qve,Hve;F(kc,"LayeredMetaDataProvider",848),D(986,1,Oh,HB),l.Qe=function(e){ife(e)};var Id,Zlt,rG,CS,iG,zCt,sG,q6,aG,qCt,HCt,Jlt,wb,tht,$y,VCt,DO,eht,GCt,Vve,oG,nht,_S,zy,Gve,Wl,UCt,WCt,cG,rht,Od,uG,eg,YCt,KCt,XCt,iht,sht,QCt,Jg,aht,ZCt,qy,JCt,t9t,e9t,lG,Hy,j2,n9t,r9t,So,i9t,Uve,uu,hG,s9t,a9t,o9t,oht,c9t,fG,u9t,l9t,dG,Nv,h9t,cht,SS,f9t,Bv,AS,gG,$2,uht,E7,pG,z2,d9t,g9t,p9t,T7,b9t,Wve,Yve,Kve,Xve,Rv,Vy,cs,tp,Qve,Gy,w9t,C7,v9t,Uy,Zve,_7,m9t,H6,Jve,tme,IO,lht,y9t,OO,Tf,J4,V6,jv,q2,bG,Wy,hht,S7,A7,$v,t5,fht,PO,LS,MS,dht,x9t,k9t,E9t,T9t,ght,C9t,_9t,S9t,A9t,pht,wG;F(kc,"LayeredOptions",986),D(987,1,{},fQ),l.$e=function(){var e;return e=new gqt,e},l._e=function(e){},F(kc,"LayeredOptions/LayeredFactory",987),D(1372,1,{}),l.a=0;var eme;F(Ec,"ElkSpacings/AbstractSpacingsBuilder",1372),D(779,1372,{},w3t);var vG,nme;F(kc,"LayeredSpacings/LayeredSpacingsBuilder",779),D(313,22,{3:1,35:1,22:1,313:1,246:1,234:1},n9),l.Kf=function(){return Bce(this)},l.Xf=function(){return Bce(this)};var bht,L9t,M9t,mG,wht,D9t,I9t=jr(kc,"LayeringStrategy",313,Hr,Zan,GJe),rme;D(378,22,{3:1,35:1,22:1,378:1},jet);var vht,O9t,yG,P9t=jr(kc,"LongEdgeOrderingStrategy",378,Hr,Min,UJe),ime;D(197,22,{3:1,35:1,22:1,197:1},nj);var e5,n5,xG,mht,yht=jr(kc,"NodeFlexibility",197,Hr,Bsn,WJe),sme;D(315,22,{3:1,35:1,22:1,315:1,246:1,234:1},LM),l.Kf=function(){return xce(this)},l.Xf=function(){return xce(this)};var DS,xht,kht,IS,F9t,N9t=jr(kc,"NodePlacementStrategy",315,Hr,yan,JJe),ame;D(260,22,{3:1,35:1,22:1,260:1},Ix);var B9t,FO,R9t,j9t,NO,$9t,kG,EG,z9t=jr(kc,"NodePromotionStrategy",260,Hr,Qon,KJe),ome;D(339,22,{3:1,35:1,22:1,339:1},$et);var q9t,vb,Eht,H9t=jr(kc,"OrderingStrategy",339,Hr,Rin,XJe),cme;D(421,22,{3:1,35:1,22:1,421:1},zbt);var Tht,Cht,V9t=jr(kc,"PortSortingStrategy",421,Hr,zrn,QJe),ume;D(452,22,{3:1,35:1,22:1,452:1},zet);var tl,nu,OS,lme=jr(kc,"PortType",452,Hr,Bin,YJe),hme;D(375,22,{3:1,35:1,22:1,375:1},qet);var G9t,_ht,U9t,W9t=jr(kc,"SelfLoopDistributionStrategy",375,Hr,jin,ZJe),fme;D(376,22,{3:1,35:1,22:1,376:1},qbt);var BO,Sht,Y9t=jr(kc,"SelfLoopOrderingStrategy",376,Hr,Nrn,ttn),dme;D(304,1,{304:1},ahe),F(kc,"Spacings",304),D(336,22,{3:1,35:1,22:1,336:1},Het);var Aht,K9t,PS,X9t=jr(kc,"SplineRoutingMode",336,Hr,zin,etn),gme;D(338,22,{3:1,35:1,22:1,338:1},Vet);var Lht,Q9t,Z9t,J9t=jr(kc,"ValidifyStrategy",338,Hr,qin,ntn),pme;D(377,22,{3:1,35:1,22:1,377:1},Get);var Yy,Mht,L7,t_t=jr(kc,"WrappingStrategy",377,Hr,$in,rtn),bme;D(1383,1,zc,att),l.Yf=function(e){return u(e,37),wme},l.pf=function(e,n){I3n(this,u(e,37),n)};var wme;F(xH,"DepthFirstCycleBreaker",1383),D(782,1,zc,evt),l.Yf=function(e){return u(e,37),vme},l.pf=function(e,n){Mxn(this,u(e,37),n)},l.Zf=function(e){return u(Ne(e,Zz(this.d,e.c.length)),10)};var vme;F(xH,"GreedyCycleBreaker",782),D(1386,782,zc,WGt),l.Zf=function(e){var n,r,s,o;for(o=null,n=wi,s=new S(e);s.a1&&(je(Re(Q(Na((An(0,e.c.length),u(e.c[0],10))),(Te(),$y))))?Dce(e,this.d,u(this,660)):(wn(),Zs(e,this.d)),Qne(this.e,e))},l.Sf=function(e,n,r,s){var o,h,d,v,k,C,M;for(n!=kKt(r,e.length)&&(h=e[n-(r?1:-1)],_mt(this.f,h,r?(so(),nu):(so(),tl))),o=e[n][0],M=!s||o.k==(Vn(),ks),C=A1(e[n]),this.ag(C,M,!1,r),d=0,k=new S(C);k.a"),e0?Crt(this.a,e[n-1],e[n]):!r&&n1&&(je(Re(Q(Na((An(0,e.c.length),u(e.c[0],10))),(Te(),$y))))?Dce(e,this.d,this):(wn(),Zs(e,this.d)),je(Re(Q(Na((An(0,e.c.length),u(e.c[0],10))),$y)))||Qne(this.e,e))},F(qu,"ModelOrderBarycenterHeuristic",660),D(1803,1,Oi,D$t),l.ue=function(e,n){return Ugn(this.a,u(e,10),u(n,10))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(qu,"ModelOrderBarycenterHeuristic/lambda$0$Type",1803),D(1403,1,zc,ltt),l.Yf=function(e){var n;return u(e,37),n=pj(Dme),bi(n,(Wa(),cu),(ro(),IV)),n},l.pf=function(e,n){Drn((u(e,37),n))};var Dme;F(qu,"NoCrossingMinimizer",1403),D(796,402,qkt,hbt),l.$f=function(e,n,r){var s,o,h,d,v,k,C,M,j,H,G;switch(j=this.g,r.g){case 1:{for(o=0,h=0,M=new S(e.j);M.a1&&(o.j==(ve(),Hn)?this.b[e]=!0:o.j==Bn&&e>0&&(this.b[e-1]=!0))},l.f=0,F(c0,"AllCrossingsCounter",1798),D(587,1,{},gz),l.b=0,l.d=0,F(c0,"BinaryIndexedTree",587),D(524,1,{},YM);var r_t,CG;F(c0,"CrossingsCounter",524),D(1906,1,Oi,I$t),l.ue=function(e,n){return Pen(this.a,u(e,11),u(n,11))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(c0,"CrossingsCounter/lambda$0$Type",1906),D(1907,1,Oi,O$t),l.ue=function(e,n){return Fen(this.a,u(e,11),u(n,11))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(c0,"CrossingsCounter/lambda$1$Type",1907),D(1908,1,Oi,P$t),l.ue=function(e,n){return Nen(this.a,u(e,11),u(n,11))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(c0,"CrossingsCounter/lambda$2$Type",1908),D(1909,1,Oi,F$t),l.ue=function(e,n){return Ben(this.a,u(e,11),u(n,11))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(c0,"CrossingsCounter/lambda$3$Type",1909),D(1910,1,Un,N$t),l.td=function(e){von(this.a,u(e,11))},F(c0,"CrossingsCounter/lambda$4$Type",1910),D(1911,1,li,B$t),l.Mb=function(e){return IXe(this.a,u(e,11))},F(c0,"CrossingsCounter/lambda$5$Type",1911),D(1912,1,Un,R$t),l.td=function(e){HGt(this,e)},F(c0,"CrossingsCounter/lambda$6$Type",1912),D(1913,1,Un,pGt),l.td=function(e){var n;k8(),Up(this.b,(n=this.a,u(e,11),n))},F(c0,"CrossingsCounter/lambda$7$Type",1913),D(826,1,xd,YN),l.Lb=function(e){return k8(),Us(u(e,11),(ae(),Ju))},l.Fb=function(e){return this===e},l.Mb=function(e){return k8(),Us(u(e,11),(ae(),Ju))},F(c0,"CrossingsCounter/lambda$8$Type",826),D(1905,1,{},j$t),F(c0,"HyperedgeCrossingsCounter",1905),D(467,1,{35:1,467:1},sYt),l.wd=function(e){return pfn(this,u(e,467))},l.b=0,l.c=0,l.e=0,l.f=0;var h6n=F(c0,"HyperedgeCrossingsCounter/Hyperedge",467);D(362,1,{35:1,362:1},f$),l.wd=function(e){return d2n(this,u(e,362))},l.b=0,l.c=0;var Ime=F(c0,"HyperedgeCrossingsCounter/HyperedgeCorner",362);D(523,22,{3:1,35:1,22:1,523:1},Hbt);var NS,BS,Ome=jr(c0,"HyperedgeCrossingsCounter/HyperedgeCorner/Type",523,Hr,qrn,stn),Pme;D(1405,1,zc,stt),l.Yf=function(e){return u(Q(u(e,37),(ae(),Vc)),21).Hc((oo(),vh))?Fme:null},l.pf=function(e,n){Pdn(this,u(e,37),n)};var Fme;F(uo,"InteractiveNodePlacer",1405),D(1406,1,zc,itt),l.Yf=function(e){return u(Q(u(e,37),(ae(),Vc)),21).Hc((oo(),vh))?Nme:null},l.pf=function(e,n){v1n(this,u(e,37),n)};var Nme,_G,SG;F(uo,"LinearSegmentsNodePlacer",1406),D(257,1,{35:1,257:1},zpt),l.wd=function(e){return VKe(this,u(e,257))},l.Fb=function(e){var n;return _t(e,257)?(n=u(e,257),this.b==n.b):!1},l.Hb=function(){return this.b},l.Ib=function(){return"ls"+eb(this.e)},l.a=0,l.b=0,l.c=-1,l.d=-1,l.g=0;var Bme=F(uo,"LinearSegmentsNodePlacer/LinearSegment",257);D(1408,1,zc,IKt),l.Yf=function(e){return u(Q(u(e,37),(ae(),Vc)),21).Hc((oo(),vh))?Rme:null},l.pf=function(e,n){kxn(this,u(e,37),n)},l.b=0,l.g=0;var Rme;F(uo,"NetworkSimplexPlacer",1408),D(1427,1,Oi,wQ),l.ue=function(e,n){return pu(u(e,19).a,u(n,19).a)},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(uo,"NetworkSimplexPlacer/0methodref$compare$Type",1427),D(1429,1,Oi,vQ),l.ue=function(e,n){return pu(u(e,19).a,u(n,19).a)},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(uo,"NetworkSimplexPlacer/1methodref$compare$Type",1429),D(649,1,{649:1},bGt);var f6n=F(uo,"NetworkSimplexPlacer/EdgeRep",649);D(401,1,{401:1},Ovt),l.b=!1;var d6n=F(uo,"NetworkSimplexPlacer/NodeRep",401);D(508,12,{3:1,4:1,20:1,28:1,52:1,12:1,14:1,15:1,54:1,508:1},Cqt),F(uo,"NetworkSimplexPlacer/Path",508),D(1409,1,{},mQ),l.Kb=function(e){return u(e,17).d.i.k},F(uo,"NetworkSimplexPlacer/Path/lambda$0$Type",1409),D(1410,1,li,yQ),l.Mb=function(e){return u(e,267)==(Vn(),ta)},F(uo,"NetworkSimplexPlacer/Path/lambda$1$Type",1410),D(1411,1,{},xQ),l.Kb=function(e){return u(e,17).d.i},F(uo,"NetworkSimplexPlacer/Path/lambda$2$Type",1411),D(1412,1,li,$$t),l.Mb=function(e){return HWt(Aie(u(e,10)))},F(uo,"NetworkSimplexPlacer/Path/lambda$3$Type",1412),D(1413,1,li,kQ),l.Mb=function(e){return Een(u(e,11))},F(uo,"NetworkSimplexPlacer/lambda$0$Type",1413),D(1414,1,Un,wGt),l.td=function(e){yQe(this.a,this.b,u(e,11))},F(uo,"NetworkSimplexPlacer/lambda$1$Type",1414),D(1423,1,Un,z$t),l.td=function(e){$pn(this.a,u(e,17))},F(uo,"NetworkSimplexPlacer/lambda$10$Type",1423),D(1424,1,{},EQ),l.Kb=function(e){return Fl(),new Tn(null,new _n(u(e,29).a,16))},F(uo,"NetworkSimplexPlacer/lambda$11$Type",1424),D(1425,1,Un,q$t),l.td=function(e){Nvn(this.a,u(e,10))},F(uo,"NetworkSimplexPlacer/lambda$12$Type",1425),D(1426,1,{},TQ),l.Kb=function(e){return Fl(),pe(u(e,121).e)},F(uo,"NetworkSimplexPlacer/lambda$13$Type",1426),D(1428,1,{},CQ),l.Kb=function(e){return Fl(),pe(u(e,121).e)},F(uo,"NetworkSimplexPlacer/lambda$15$Type",1428),D(1430,1,li,_Q),l.Mb=function(e){return Fl(),u(e,401).c.k==(Vn(),Os)},F(uo,"NetworkSimplexPlacer/lambda$17$Type",1430),D(1431,1,li,SQ),l.Mb=function(e){return Fl(),u(e,401).c.j.c.length>1},F(uo,"NetworkSimplexPlacer/lambda$18$Type",1431),D(1432,1,Un,jXt),l.td=function(e){_hn(this.c,this.b,this.d,this.a,u(e,401))},l.c=0,l.d=0,F(uo,"NetworkSimplexPlacer/lambda$19$Type",1432),D(1415,1,{},AQ),l.Kb=function(e){return Fl(),new Tn(null,new _n(u(e,29).a,16))},F(uo,"NetworkSimplexPlacer/lambda$2$Type",1415),D(1433,1,Un,H$t),l.td=function(e){vQe(this.a,u(e,11))},l.a=0,F(uo,"NetworkSimplexPlacer/lambda$20$Type",1433),D(1434,1,{},nx),l.Kb=function(e){return Fl(),new Tn(null,new _n(u(e,29).a,16))},F(uo,"NetworkSimplexPlacer/lambda$21$Type",1434),D(1435,1,Un,V$t),l.td=function(e){OQe(this.a,u(e,10))},F(uo,"NetworkSimplexPlacer/lambda$22$Type",1435),D(1436,1,li,KN),l.Mb=function(e){return HWt(e)},F(uo,"NetworkSimplexPlacer/lambda$23$Type",1436),D(1437,1,{},LQ),l.Kb=function(e){return Fl(),new Tn(null,new _n(u(e,29).a,16))},F(uo,"NetworkSimplexPlacer/lambda$24$Type",1437),D(1438,1,li,G$t),l.Mb=function(e){return jXe(this.a,u(e,10))},F(uo,"NetworkSimplexPlacer/lambda$25$Type",1438),D(1439,1,Un,vGt),l.td=function(e){cpn(this.a,this.b,u(e,10))},F(uo,"NetworkSimplexPlacer/lambda$26$Type",1439),D(1440,1,li,MQ),l.Mb=function(e){return Fl(),!Ga(u(e,17))},F(uo,"NetworkSimplexPlacer/lambda$27$Type",1440),D(1441,1,li,DQ),l.Mb=function(e){return Fl(),!Ga(u(e,17))},F(uo,"NetworkSimplexPlacer/lambda$28$Type",1441),D(1442,1,{},U$t),l.Ce=function(e,n){return MQe(this.a,u(e,29),u(n,29))},F(uo,"NetworkSimplexPlacer/lambda$29$Type",1442),D(1416,1,{},XN),l.Kb=function(e){return Fl(),new Tn(null,new jw(new ar(lr(Ds(u(e,10)).a.Kc(),new z))))},F(uo,"NetworkSimplexPlacer/lambda$3$Type",1416),D(1417,1,li,IQ),l.Mb=function(e){return Fl(),wsn(u(e,17))},F(uo,"NetworkSimplexPlacer/lambda$4$Type",1417),D(1418,1,Un,W$t),l.td=function(e){Fyn(this.a,u(e,17))},F(uo,"NetworkSimplexPlacer/lambda$5$Type",1418),D(1419,1,{},WT),l.Kb=function(e){return Fl(),new Tn(null,new _n(u(e,29).a,16))},F(uo,"NetworkSimplexPlacer/lambda$6$Type",1419),D(1420,1,li,OQ),l.Mb=function(e){return Fl(),u(e,10).k==(Vn(),Os)},F(uo,"NetworkSimplexPlacer/lambda$7$Type",1420),D(1421,1,{},PQ),l.Kb=function(e){return Fl(),new Tn(null,new jw(new ar(lr(U0(u(e,10)).a.Kc(),new z))))},F(uo,"NetworkSimplexPlacer/lambda$8$Type",1421),D(1422,1,li,FQ),l.Mb=function(e){return Fl(),wen(u(e,17))},F(uo,"NetworkSimplexPlacer/lambda$9$Type",1422),D(1404,1,zc,vC),l.Yf=function(e){return u(Q(u(e,37),(ae(),Vc)),21).Hc((oo(),vh))?jme:null},l.pf=function(e,n){b3n(u(e,37),n)};var jme;F(uo,"SimpleNodePlacer",1404),D(180,1,{180:1},E4),l.Ib=function(){var e;return e="",this.c==(bd(),zv)?e+=x6:this.c==ep&&(e+=y6),this.o==(C1(),H2)?e+=Dot:this.o==H1?e+="UP":e+="BALANCED",e},F(ub,"BKAlignedLayout",180),D(516,22,{3:1,35:1,22:1,516:1},Gbt);var ep,zv,$me=jr(ub,"BKAlignedLayout/HDirection",516,Hr,Vrn,atn),zme;D(515,22,{3:1,35:1,22:1,515:1},Vbt);var H2,H1,qme=jr(ub,"BKAlignedLayout/VDirection",515,Hr,Grn,otn),Hme;D(1634,1,{},mGt),F(ub,"BKAligner",1634),D(1637,1,{},Zse),F(ub,"BKCompactor",1637),D(654,1,{654:1},NQ),l.a=0,F(ub,"BKCompactor/ClassEdge",654),D(458,1,{458:1},Eqt),l.a=null,l.b=0,F(ub,"BKCompactor/ClassNode",458),D(1407,1,zc,GGt),l.Yf=function(e){return u(Q(u(e,37),(ae(),Vc)),21).Hc((oo(),vh))?Vme:null},l.pf=function(e,n){Bxn(this,u(e,37),n)},l.d=!1;var Vme;F(ub,"BKNodePlacer",1407),D(1635,1,{},BQ),l.d=0,F(ub,"NeighborhoodInformation",1635),D(1636,1,Oi,Y$t),l.ue=function(e,n){return Von(this,u(e,46),u(n,46))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(ub,"NeighborhoodInformation/NeighborComparator",1636),D(808,1,{}),F(ub,"ThresholdStrategy",808),D(1763,808,{},Aqt),l.bg=function(e,n,r){return this.a.o==(C1(),H1)?as:Cs},l.cg=function(){},F(ub,"ThresholdStrategy/NullThresholdStrategy",1763),D(579,1,{579:1},yGt),l.c=!1,l.d=!1,F(ub,"ThresholdStrategy/Postprocessable",579),D(1764,808,{},Lqt),l.bg=function(e,n,r){var s,o,h;return o=n==r,s=this.a.a[r.p]==n,o||s?(h=e,this.a.c==(bd(),zv)?(o&&(h=Dat(this,n,!0)),!isNaN(h)&&!isFinite(h)&&s&&(h=Dat(this,r,!1))):(o&&(h=Dat(this,n,!0)),!isNaN(h)&&!isFinite(h)&&s&&(h=Dat(this,r,!1))),h):e},l.cg=function(){for(var e,n,r,s,o;this.d.b!=0;)o=u(oin(this.d),579),s=mle(this,o),s.a&&(e=s.a,r=je(this.a.f[this.a.g[o.b.p].p]),!(!r&&!Ga(e)&&e.c.i.c==e.d.i.c)&&(n=_ce(this,o),n||WXe(this.e,o)));for(;this.e.a.c.length!=0;)_ce(this,u(Nre(this.e),579))},F(ub,"ThresholdStrategy/SimpleThresholdStrategy",1764),D(635,1,{635:1,246:1,234:1},RQ),l.Kf=function(){return Une(this)},l.Xf=function(){return Une(this)};var Dht;F(Sct,"EdgeRouterFactory",635),D(1458,1,zc,od),l.Yf=function(e){return pvn(u(e,37))},l.pf=function(e,n){E3n(u(e,37),n)};var Gme,Ume,Wme,Yme,Kme,i_t,Xme,Qme;F(Sct,"OrthogonalEdgeRouter",1458),D(1451,1,zc,UGt),l.Yf=function(e){return jdn(u(e,37))},l.pf=function(e,n){H5n(this,u(e,37),n)};var Zme,Jme,tye,eye,jO,nye;F(Sct,"PolylineEdgeRouter",1451),D(1452,1,xd,jQ),l.Lb=function(e){return yyt(u(e,10))},l.Fb=function(e){return this===e},l.Mb=function(e){return yyt(u(e,10))},F(Sct,"PolylineEdgeRouter/1",1452),D(1809,1,li,$Q),l.Mb=function(e){return u(e,129).c==(Uf(),mb)},F(t1,"HyperEdgeCycleDetector/lambda$0$Type",1809),D(1810,1,{},zQ),l.Ge=function(e){return u(e,129).d},F(t1,"HyperEdgeCycleDetector/lambda$1$Type",1810),D(1811,1,li,qQ),l.Mb=function(e){return u(e,129).c==(Uf(),mb)},F(t1,"HyperEdgeCycleDetector/lambda$2$Type",1811),D(1812,1,{},rx),l.Ge=function(e){return u(e,129).d},F(t1,"HyperEdgeCycleDetector/lambda$3$Type",1812),D(1813,1,{},HQ),l.Ge=function(e){return u(e,129).d},F(t1,"HyperEdgeCycleDetector/lambda$4$Type",1813),D(1814,1,{},VQ),l.Ge=function(e){return u(e,129).d},F(t1,"HyperEdgeCycleDetector/lambda$5$Type",1814),D(112,1,{35:1,112:1},PD),l.wd=function(e){return GKe(this,u(e,112))},l.Fb=function(e){var n;return _t(e,112)?(n=u(e,112),this.g==n.g):!1},l.Hb=function(){return this.g},l.Ib=function(){var e,n,r,s;for(e=new Ol("{"),s=new S(this.n);s.a"+this.b+" ("+nZe(this.c)+")"},l.d=0,F(t1,"HyperEdgeSegmentDependency",129),D(520,22,{3:1,35:1,22:1,520:1},Ubt);var mb,Ky,rye=jr(t1,"HyperEdgeSegmentDependency/DependencyType",520,Hr,Hrn,ctn),iye;D(1815,1,{},K$t),F(t1,"HyperEdgeSegmentSplitter",1815),D(1816,1,{},_Ht),l.a=0,l.b=0,F(t1,"HyperEdgeSegmentSplitter/AreaRating",1816),D(329,1,{329:1},Dnt),l.a=0,l.b=0,l.c=0,F(t1,"HyperEdgeSegmentSplitter/FreeArea",329),D(1817,1,Oi,QQ),l.ue=function(e,n){return ZZe(u(e,112),u(n,112))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(t1,"HyperEdgeSegmentSplitter/lambda$0$Type",1817),D(1818,1,Un,$Xt),l.td=function(e){ran(this.a,this.d,this.c,this.b,u(e,112))},l.b=0,F(t1,"HyperEdgeSegmentSplitter/lambda$1$Type",1818),D(1819,1,{},ZQ),l.Kb=function(e){return new Tn(null,new _n(u(e,112).e,16))},F(t1,"HyperEdgeSegmentSplitter/lambda$2$Type",1819),D(1820,1,{},JQ),l.Kb=function(e){return new Tn(null,new _n(u(e,112).j,16))},F(t1,"HyperEdgeSegmentSplitter/lambda$3$Type",1820),D(1821,1,{},tZ),l.Fe=function(e){return Xt(ye(e))},F(t1,"HyperEdgeSegmentSplitter/lambda$4$Type",1821),D(655,1,{},ert),l.a=0,l.b=0,l.c=0,F(t1,"OrthogonalRoutingGenerator",655),D(1638,1,{},eZ),l.Kb=function(e){return new Tn(null,new _n(u(e,112).e,16))},F(t1,"OrthogonalRoutingGenerator/lambda$0$Type",1638),D(1639,1,{},nZ),l.Kb=function(e){return new Tn(null,new _n(u(e,112).j,16))},F(t1,"OrthogonalRoutingGenerator/lambda$1$Type",1639),D(661,1,{}),F(Act,"BaseRoutingDirectionStrategy",661),D(1807,661,{},Mqt),l.dg=function(e,n,r){var s,o,h,d,v,k,C,M,j,H,G,K,tt;if(!(e.r&&!e.q))for(M=n+e.o*r,C=new S(e.n);C.aEd&&(h=M,o=e,s=new $e(j,h),ri(d.a,s),pv(this,d,o,s,!1),H=e.r,H&&(G=Xt(ye(Zf(H.e,0))),s=new $e(G,h),ri(d.a,s),pv(this,d,o,s,!1),h=n+H.o*r,o=H,s=new $e(G,h),ri(d.a,s),pv(this,d,o,s,!1)),s=new $e(tt,h),ri(d.a,s),pv(this,d,o,s,!1)))},l.eg=function(e){return e.i.n.a+e.n.a+e.a.a},l.fg=function(){return ve(),mr},l.gg=function(){return ve(),Pn},F(Act,"NorthToSouthRoutingStrategy",1807),D(1808,661,{},Dqt),l.dg=function(e,n,r){var s,o,h,d,v,k,C,M,j,H,G,K,tt;if(!(e.r&&!e.q))for(M=n-e.o*r,C=new S(e.n);C.aEd&&(h=M,o=e,s=new $e(j,h),ri(d.a,s),pv(this,d,o,s,!1),H=e.r,H&&(G=Xt(ye(Zf(H.e,0))),s=new $e(G,h),ri(d.a,s),pv(this,d,o,s,!1),h=n-H.o*r,o=H,s=new $e(G,h),ri(d.a,s),pv(this,d,o,s,!1)),s=new $e(tt,h),ri(d.a,s),pv(this,d,o,s,!1)))},l.eg=function(e){return e.i.n.a+e.n.a+e.a.a},l.fg=function(){return ve(),Pn},l.gg=function(){return ve(),mr},F(Act,"SouthToNorthRoutingStrategy",1808),D(1806,661,{},Iqt),l.dg=function(e,n,r){var s,o,h,d,v,k,C,M,j,H,G,K,tt;if(!(e.r&&!e.q))for(M=n+e.o*r,C=new S(e.n);C.aEd&&(h=M,o=e,s=new $e(h,j),ri(d.a,s),pv(this,d,o,s,!0),H=e.r,H&&(G=Xt(ye(Zf(H.e,0))),s=new $e(h,G),ri(d.a,s),pv(this,d,o,s,!0),h=n+H.o*r,o=H,s=new $e(h,G),ri(d.a,s),pv(this,d,o,s,!0)),s=new $e(h,tt),ri(d.a,s),pv(this,d,o,s,!0)))},l.eg=function(e){return e.i.n.b+e.n.b+e.a.b},l.fg=function(){return ve(),Hn},l.gg=function(){return ve(),Bn},F(Act,"WestToEastRoutingStrategy",1806),D(813,1,{},fxt),l.Ib=function(){return eb(this.a)},l.b=0,l.c=!1,l.d=!1,l.f=0,F(Sy,"NubSpline",813),D(407,1,{407:1},eue,yQt),F(Sy,"NubSpline/PolarCP",407),D(1453,1,zc,Vse),l.Yf=function(e){return A0n(u(e,37))},l.pf=function(e,n){cxn(this,u(e,37),n)};var sye,aye,oye,cye,uye;F(Sy,"SplineEdgeRouter",1453),D(268,1,{268:1},R$),l.Ib=function(){return this.a+" ->("+this.c+") "+this.b},l.c=0,F(Sy,"SplineEdgeRouter/Dependency",268),D(455,22,{3:1,35:1,22:1,455:1},Wbt);var yb,r5,lye=jr(Sy,"SplineEdgeRouter/SideToProcess",455,Hr,Urn,utn),hye;D(1454,1,li,XQ),l.Mb=function(e){return m_(),!u(e,128).o},F(Sy,"SplineEdgeRouter/lambda$0$Type",1454),D(1455,1,{},KQ),l.Ge=function(e){return m_(),u(e,128).v+1},F(Sy,"SplineEdgeRouter/lambda$1$Type",1455),D(1456,1,Un,xGt),l.td=function(e){men(this.a,this.b,u(e,46))},F(Sy,"SplineEdgeRouter/lambda$2$Type",1456),D(1457,1,Un,kGt),l.td=function(e){yen(this.a,this.b,u(e,46))},F(Sy,"SplineEdgeRouter/lambda$3$Type",1457),D(128,1,{35:1,128:1},voe,vxt),l.wd=function(e){return UKe(this,u(e,128))},l.b=0,l.e=!1,l.f=0,l.g=0,l.j=!1,l.k=!1,l.n=0,l.o=!1,l.p=!1,l.q=!1,l.s=0,l.u=0,l.v=0,l.F=0,F(Sy,"SplineSegment",128),D(459,1,{459:1},YT),l.a=0,l.b=!1,l.c=!1,l.d=!1,l.e=!1,l.f=0,F(Sy,"SplineSegment/EdgeInformation",459),D(1234,1,{},GQ),F(G_,d6t,1234),D(1235,1,Oi,UQ),l.ue=function(e,n){return nbn(u(e,135),u(n,135))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(G_,n1e,1235),D(1233,1,{},qHt),F(G_,"MrTree",1233),D(393,22,{3:1,35:1,22:1,393:1,246:1,234:1},rj),l.Kf=function(){return Hoe(this)},l.Xf=function(){return Hoe(this)};var AG,RS,$O,jS,s_t=jr(G_,"TreeLayoutPhases",393,Hr,Rsn,ltn),fye;D(1130,209,S2,cYt),l.Ze=function(e,n){var r,s,o,h,d,v,k;for(je(Re(qe(e,(gv(),h_t))))||y$((r=new rr((Pm(),new Mm(e))),r)),d=(v=new j$,Mo(v,e),Jt(v,(fc(),qS),e),k=new _r,Wmn(e,v,k),lyn(e,v,k),v),h=ryn(this.a,d),o=new S(h);o.a"+S$(this.c):"e_"+Hi(this)},F(U_,"TEdge",188),D(135,134,{3:1,135:1,94:1,134:1},j$),l.Ib=function(){var e,n,r,s,o;for(o=null,s=ei(this.b,0);s.b!=s.d.c;)r=u(ti(s),86),o+=(r.c==null||r.c.length==0?"n_"+r.g:"n_"+r.c)+` +`;for(n=ei(this.a,0);n.b!=n.d.c;)e=u(ti(n),188),o+=(e.b&&e.c?S$(e.b)+"->"+S$(e.c):"e_"+Hi(e))+` +`;return o};var g6n=F(U_,"TGraph",135);D(633,502,{3:1,502:1,633:1,94:1,134:1}),F(U_,"TShape",633),D(86,633,{3:1,502:1,86:1,633:1,94:1,134:1},Dit),l.Ib=function(){return S$(this)};var p6n=F(U_,"TNode",86);D(255,1,r0,Lp),l.Jc=function(e){va(this,e)},l.Kc=function(){var e;return e=ei(this.a.d,0),new Ex(e)},F(U_,"TNode/2",255),D(358,1,sa,Ex),l.Nb=function(e){ba(this,e)},l.Pb=function(){return u(ti(this.a),188).c},l.Ob=function(){return OR(this.a)},l.Qb=function(){tz(this.a)},F(U_,"TNode/2/1",358),D(1840,1,os,oYt),l.pf=function(e,n){_yn(this,u(e,135),n)},F(A6,"FanProcessor",1840),D(327,22,{3:1,35:1,22:1,327:1,234:1},r9),l.Kf=function(){switch(this.g){case 0:return new Wqt;case 1:return new oYt;case 2:return new ix;case 3:return new rZ;case 4:return new sZ;case 5:return new RL;default:throw it(new Fn(Yot+(this.f!=null?this.f:""+this.g)))}};var Iht,Oht,Pht,Fht,Nht,LG,dye=jr(A6,T6t,327,Hr,ton,htn),gye;D(1843,1,os,rZ),l.pf=function(e,n){c2n(this,u(e,135),n)},l.a=0,F(A6,"LevelHeightProcessor",1843),D(1844,1,r0,iZ),l.Jc=function(e){va(this,e)},l.Kc=function(){return wn(),h8(),a7},F(A6,"LevelHeightProcessor/1",1844),D(1841,1,os,ix),l.pf=function(e,n){ppn(this,u(e,135),n)},l.a=0,F(A6,"NeighborsProcessor",1841),D(1842,1,r0,QN),l.Jc=function(e){va(this,e)},l.Kc=function(){return wn(),h8(),a7},F(A6,"NeighborsProcessor/1",1842),D(1845,1,os,sZ),l.pf=function(e,n){o2n(this,u(e,135),n)},l.a=0,F(A6,"NodePositionProcessor",1845),D(1839,1,os,Wqt),l.pf=function(e,n){O3n(this,u(e,135))},F(A6,"RootProcessor",1839),D(1846,1,os,RL),l.pf=function(e,n){qln(u(e,135))},F(A6,"Untreeifyer",1846);var zO,$S,pye,Bht,MG,zS,Rht,DG,IG,M7,qS,OG,np,a_t,bye,jht,Xy,$ht,o_t;D(851,1,Oh,D3),l.Qe=function(e){an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Hkt),""),"Weighting of Nodes"),"Which weighting to use when computing a node order."),u_t),(Ug(),us)),b_t),un((Qf(),qn))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Vkt),""),"Search Order"),"Which search order to use when computing a spanning tree."),c_t),us),v_t),un(qn)))),phe((new JL,e))};var wye,c_t,vye,u_t;F(EH,"MrTreeMetaDataProvider",851),D(994,1,Oh,JL),l.Qe=function(e){phe(e)};var mye,l_t,yye,xye,kye,Eye,h_t,Tye,f_t,Cye,PG,d_t,_ye,g_t,Sye;F(EH,"MrTreeOptions",994),D(995,1,{},aZ),l.$e=function(){var e;return e=new cYt,e},l._e=function(e){},F(EH,"MrTreeOptions/MrtreeFactory",995),D(480,22,{3:1,35:1,22:1,480:1},Ybt);var zht,p_t,b_t=jr(EH,"OrderWeighting",480,Hr,Yrn,ftn),Aye;D(425,22,{3:1,35:1,22:1,425:1},Kbt);var w_t,qht,v_t=jr(EH,"TreeifyingOrder",425,Hr,Wrn,gtn),Lye;D(1459,1,zc,ZL),l.Yf=function(e){return u(e,135),Mye},l.pf=function(e,n){zcn(this,u(e,135),n)};var Mye;F("org.eclipse.elk.alg.mrtree.p1treeify","DFSTreeifyer",1459),D(1460,1,zc,ctt),l.Yf=function(e){return u(e,135),Dye},l.pf=function(e,n){Cpn(this,u(e,135),n)};var Dye;F("org.eclipse.elk.alg.mrtree.p2order","NodeOrderer",1460),D(1461,1,zc,ott),l.Yf=function(e){return u(e,135),Iye},l.pf=function(e,n){qvn(this,u(e,135),n)},l.a=0;var Iye;F("org.eclipse.elk.alg.mrtree.p3place","NodePlacer",1461),D(1462,1,zc,GB),l.Yf=function(e){return u(e,135),Oye},l.pf=function(e,n){gdn(u(e,135),n)};var Oye;F("org.eclipse.elk.alg.mrtree.p4route","EdgeRouter",1462);var HS;D(495,22,{3:1,35:1,22:1,495:1,246:1,234:1},Xbt),l.Kf=function(){return xie(this)},l.Xf=function(){return xie(this)};var FG,D7,m_t=jr(Gkt,"RadialLayoutPhases",495,Hr,Krn,dtn),Pye;D(1131,209,S2,zHt),l.Ze=function(e,n){var r,s,o,h,d,v;if(r=Toe(this,e),vr(n,"Radial layout",r.c.length),je(Re(qe(e,(uy(),L_t))))||y$((s=new rr((Pm(),new Mm(e))),s)),v=D0n(e),wo(e,(m9(),HS),v),!v)throw it(new Fn("The given graph is not a tree!"));for(o=Xt(ye(qe(e,RG))),o==0&&(o=Roe(e)),wo(e,RG,o),d=new S(Toe(this,e));d.a0&&Ure((Rr(n-1,e.length),e.charCodeAt(n-1)),d1e);)--n;if(s>=n)throw it(new Fn("The given string does not contain any numbers."));if(o=vy(e.substr(s,n-s),`,|;|\r| +`),o.length!=2)throw it(new Fn("Exactly two numbers are expected, "+o.length+" were found."));try{this.a=dy(fy(o[0])),this.b=dy(fy(o[1]))}catch(h){throw h=Wi(h),_t(h,127)?(r=h,it(new Fn(g1e+r))):it(h)}},l.Ib=function(){return"("+this.a+","+this.b+")"},l.a=0,l.b=0;var Ws=F(WI,"KVector",8);D(74,68,{3:1,4:1,20:1,28:1,52:1,14:1,68:1,15:1,74:1,414:1},Pu,DR,MWt),l.Pc=function(){return tln(this)},l.Jf=function(e){var n,r,s,o,h,d;s=vy(e,`,|;|\\(|\\)|\\[|\\]|\\{|\\}| | | +`),Ah(this);try{for(r=0,h=0,o=0,d=0;r0&&(h%2==0?o=dy(s[r]):d=dy(s[r]),h>0&&h%2!=0&&ri(this,new $e(o,d)),++h),++r}catch(v){throw v=Wi(v),_t(v,127)?(n=v,it(new Fn("The given string does not match the expected format for vectors."+n))):it(v)}},l.Ib=function(){var e,n,r;for(e=new Ol("("),n=ei(this,0);n.b!=n.d.c;)r=u(ti(n),8),Gr(e,r.a+","+r.b),n.b!=n.d.c&&(e.a+="; ");return(e.a+=")",e).a};var ASt=F(WI,"KVectorChain",74);D(248,22,{3:1,35:1,22:1,248:1},i9);var uft,GG,UG,GO,UO,WG,LSt=jr(Fh,"Alignment",248,Hr,Yan,Dtn),J3e;D(979,1,Oh,htt),l.Qe=function(e){lle(e)};var MSt,lft,t4e,DSt,ISt,e4e,OSt,n4e,r4e,PSt,FSt,i4e;F(Fh,"BoxLayouterOptions",979),D(980,1,{},qZ),l.$e=function(){var e;return e=new YZ,e},l._e=function(e){},F(Fh,"BoxLayouterOptions/BoxFactory",980),D(291,22,{3:1,35:1,22:1,291:1},s9);var WO,hft,YO,KO,XO,fft,dft=jr(Fh,"ContentAlignment",291,Hr,Wan,Itn),s4e;D(684,1,Oh,Tp),l.Qe=function(e){an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,ude),""),"Layout Algorithm"),"Select a specific layout algorithm."),(Ug(),I7)),Ae),un((Qf(),qn))))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,lde),""),"Resolved Layout Algorithm"),"Meta data associated with the selected algorithm."),V1),v6n),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,xkt),""),"Alignment"),"Alignment of the selected node relative to other nodes; the exact meaning depends on the used algorithm."),NSt),us),LSt),un(ea)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,E6),""),"Aspect Ratio"),"The desired aspect ratio of the drawing, that is the quotient of width by height."),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,p8t),""),"Bend Points"),"A fixed list of bend points for the edge. This is used by the 'Fixed Layout' algorithm to specify a pre-defined routing for an edge. The vector chain must include the source point, any bend points, and the target point, so it must have at least two points."),V1),ASt),un(Pd)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,mH),""),"Content Alignment"),"Specifies how the content of a node are aligned. Each node can individually control the alignment of its contents. I.e. if a node should be aligned top left in its parent node, the parent node should specify that option."),RSt),U6),dft),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,JI),""),"Debug Mode"),"Whether additional debug information shall be generated."),(Nn(),!1)),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Tkt),""),i6t),"Overall direction of edges: horizontal (right / left) or vertical (down / up)."),jSt),us),XS),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,QI),""),"Edge Routing"),"What kind of edge routing style should be applied for the content of a parent node. Algorithms may also set this option to single edges in order to mark them as splines. The bend point list of edges with this option set to SPLINES must be interpreted as control points for a piecewise cubic spline."),qSt),us),_ft),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,CH),""),"Expand Nodes"),"If active, nodes are expanded to fill the area of their parent."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,vH),""),"Hierarchy Handling"),"Determines whether separate layout runs are triggered for different compound nodes in a hierarchical graph. Setting a node's hierarchy handling to `INCLUDE_CHILDREN` will lay out that node and all of its descendants in a single layout run, until a descendant is encountered which has its hierarchy handling set to `SEPARATE_CHILDREN`. In general, `SEPARATE_CHILDREN` will ensure that a new layout run is triggered for a node with that setting. Including multiple levels of hierarchy in a single layout run may allow cross-hierarchical edges to be laid out properly. If the root node is set to `INHERIT` (or not set at all), the default behavior is `SEPARATE_CHILDREN`."),USt),us),DAt),ji(qn,lt(ct(ip,1),oe,175,0,[ea]))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,xv),""),"Padding"),"The padding to be left to a parent element's border when placing child elements. This can also serve as an output option of a layout algorithm if node size calculation is setup appropriately."),nAt),V1),B7t),ji(qn,lt(ct(ip,1),oe,175,0,[ea]))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,GI),""),"Interactive"),"Whether the algorithm should be run in interactive mode for the content of a parent node. What this means exactly depends on how the specific algorithm interprets this option. Usually in the interactive mode algorithms try to modify the current layout as little as possible."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,_ct),""),"interactive Layout"),"Whether the graph should be changeable interactively and by setting constraints"),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,j_),""),"Omit Node Micro Layout"),"Node micro layout comprises the computation of node dimensions (if requested), the placement of ports and their labels, and the placement of node labels. The functionality is implemented independent of any specific layout algorithm and shouldn't have any negative impact on the layout algorithm's performance itself. Yet, if any unforeseen behavior occurs, this option allows to deactivate the micro layout."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Got),""),"Port Constraints"),"Defines constraints of the position of the ports of a node."),oAt),us),PAt),un(ea)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,yH),""),"Position"),"The position of a node, port, or label. This is used by the 'Fixed Layout' algorithm to specify a pre-defined position."),V1),Ws),ji(ea,lt(ct(ip,1),oe,175,0,[V2,rp]))))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,VI),""),"Priority"),"Defines the priority of an object; its meaning depends on the specific layout algorithm and the context where it is used."),gc),ja),ji(ea,lt(ct(ip,1),oe,175,0,[Pd]))))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,tH),""),"Randomization Seed"),"Seed used for pseudo-random number generators to control the layout algorithm. If the value is 0, the seed shall be determined pseudo-randomly (e.g. from the system time)."),gc),ja),un(qn)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,R_),""),"Separate Connected Components"),"Whether each connected component should be processed separately."),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Okt),""),"Junction Points"),"This option is not used as option, but as output of the layout algorithms. It is attached to edges and determines the points where junction symbols should be drawn in order to represent hyperedges with orthogonal routing. Whether such points are computed depends on the chosen layout algorithm and edge routing style. The points are put into the vector chain with no specific order."),YSt),V1),ASt),un(Pd)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Nkt),""),"Comment Box"),"Whether the node should be regarded as a comment box instead of a regular node. In that case its placement should be similar to how labels are handled. Any edges incident to a comment box specify to which graph elements the comment is related."),!1),La),Rs),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Bkt),""),"Hypernode"),"Whether the node should be handled as a hypernode."),!1),La),Rs),un(ea)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,Uxn),""),"Label Manager"),"Label managers can shorten labels upon a layout algorithm's request."),V1),E6n),ji(qn,lt(ct(ip,1),oe,175,0,[rp]))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,jkt),""),"Margins"),"Margins define additional space around the actual bounds of a graph element. For instance, ports or labels being placed on the outside of a node's border might introduce such a margin. The margin is used to guarantee non-overlap of other graph elements with those ports or labels."),KSt),V1),N7t),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,mkt),""),"No Layout"),"No layout is done for the associated element. This is used to mark parts of a diagram to avoid their inclusion in the layout graph, or to mark parts of the layout graph to prevent layout engines from processing them. If you wish to exclude the contents of a compound node from automatic layout, while the node itself is still considered on its own layer, use the 'Fixed Layout' algorithm for that node."),!1),La),Rs),ji(ea,lt(ct(ip,1),oe,175,0,[Pd,V2,rp]))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,hde),""),"Scale Factor"),"The scaling factor to be applied to the corresponding node in recursive layout. It causes the corresponding node's size to be adjusted, and its ports and labels to be sized and placed accordingly after the layout of that node has been determined (and before the node itself and its siblings are arranged). The scaling is not reverted afterwards, so the resulting layout graph contains the adjusted size and position data. This option is currently not supported if 'Layout Hierarchy' is set."),1),Oo),la),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,fde),""),"Animate"),"Whether the shift from the old layout to the new computed layout shall be animated."),!0),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,dde),""),"Animation Time Factor"),"Factor for computation of animation time. The higher the value, the longer the animation time. If the value is 0, the resulting time is always equal to the minimum defined by 'Minimal Animation Time'."),pe(100)),gc),ja),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,gde),""),"Layout Ancestors"),"Whether the hierarchy levels on the path from the selected element to the root of the diagram shall be included in the layout process."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,pde),""),"Maximal Animation Time"),"The maximal time for animations, in milliseconds."),pe(4e3)),gc),ja),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,bde),""),"Minimal Animation Time"),"The minimal time for animations, in milliseconds."),pe(400)),gc),ja),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,wde),""),"Progress Bar"),"Whether a progress bar shall be displayed during layout computations."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,vde),""),"Validate Graph"),"Whether the graph shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,mde),""),"Validate Options"),"Whether layout options shall be validated before any layout algorithm is applied. If this option is enabled and at least one error is found, the layout process is aborted and a message is shown to the user."),!0),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,yde),""),"Zoom to Fit"),"Whether the zoom level shall be set to view the whole diagram after layout."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,g8t),"box"),"Box Layout Mode"),"Configures the packing mode used by the {@link BoxLayoutProvider}. If SIMPLE is not required (neither priorities are used nor the interactive mode), GROUP_DEC can improve the packing and decrease the area. GROUP_MIXED and GROUP_INC may, in very specific scenarios, work better."),BSt),us),$At),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,okt),R1),"Comment Comment Spacing"),"Spacing to be preserved between a comment box and other comment boxes connected to the same node. The space left between comment boxes of different nodes is controlled by the node-node spacing."),10),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,ckt),R1),"Comment Node Spacing"),"Spacing to be preserved between a node and its connected comment boxes. The space left between a node and the comments of another node is controlled by the node-node spacing."),10),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,jot),R1),"Components Spacing"),"Spacing to be preserved between pairs of connected components. This option is only relevant if 'separateConnectedComponents' is activated."),20),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,ukt),R1),"Edge Spacing"),"Spacing to be preserved between any two edges. Note that while this can somewhat easily be satisfied for the segments of orthogonally drawn edges, it is harder for general polylines or splines."),10),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Vot),R1),"Edge Label Spacing"),"The minimal distance to be preserved between a label and the edge it is associated with. Note that the placement of a label is influenced by the 'edgelabels.placement' option."),2),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,lkt),R1),"Edge Node Spacing"),"Spacing to be preserved between nodes and edges."),10),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,hkt),R1),"Label Spacing"),"Determines the amount of space to be left between two labels of the same graph element."),0),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,gkt),R1),"Label Node Spacing"),"Spacing to be preserved between labels and the border of node they are associated with. Note that the placement of a label is influenced by the 'nodelabels.placement' option."),5),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,fkt),R1),"Horizontal spacing between Label and Port"),"Horizontal spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,dkt),R1),"Vertical spacing between Label and Port"),"Vertical spacing to be preserved between labels and the ports they are associated with. Note that the placement of a label is influenced by the 'portlabels.placement' option."),1),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Cy),R1),"Node Spacing"),"The minimal distance to be preserved between each two nodes."),20),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,pkt),R1),"Node Self Loop Spacing"),"Spacing to be preserved between a node and its self loops."),10),Oo),la),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,bkt),R1),"Port Spacing"),"Spacing between pairs of ports of the same node."),10),Oo),la),ji(qn,lt(ct(ip,1),oe,175,0,[ea]))))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,wkt),R1),"Individual Spacing"),"Allows to specify individual spacing values for graph elements that shall be different from the value specified for the element's parent."),V1),$4e),ji(ea,lt(ct(ip,1),oe,175,0,[Pd,V2,rp]))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,$kt),R1),"Additional Port Space"),"Additional space around the sets of ports on each node side. For each side of a node, this option can reserve additional space before and after the ports on each side. For example, a top spacing of 20 makes sure that the first port on the western and eastern side is 20 units away from the northern border."),wAt),V1),N7t),un(qn)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,Cct),Ede),"Layout Partition"),"Partition to which the node belongs. This requires Layout Partitioning to be active. Nodes with lower partition IDs will appear to the left of nodes with higher partition IDs (assuming a left-to-right layout direction)."),gc),ja),ji(qn,lt(ct(ip,1),oe,175,0,[ea]))))),ca(e,Cct,Tct,d4e),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Tct),Ede),"Layout Partitioning"),"Whether to activate partitioned layout. This will allow to group nodes through the Layout Partition option. a pair of nodes with different partition indices is then placed such that the node with lower index is placed to the left of the other node (with left-to-right layout direction). Depending on the layout algorithm, this may only be guaranteed to work if all nodes have a layout partition configured, or at least if edges that cross partitions are not part of a partition-crossing cycle."),rAt),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Ckt),Tde),"Node Label Padding"),"Define padding for node labels that are placed inside of a node."),QSt),V1),B7t),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,UE),Tde),"Node Label Placement"),"Hints for where node labels are to be placed; if empty, the node label's position is not modified."),ZSt),U6),lo),ji(ea,lt(ct(ip,1),oe,175,0,[rp]))))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Akt),SH),"Port Alignment"),"Defines the default port distribution for a node. May be overridden for each side individually."),sAt),us),tA),un(ea)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,Lkt),SH),"Port Alignment (North)"),"Defines how ports on the northern side are placed, overriding the node's general port alignment."),us),tA),un(ea)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,Mkt),SH),"Port Alignment (South)"),"Defines how ports on the southern side are placed, overriding the node's general port alignment."),us),tA),un(ea)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,Dkt),SH),"Port Alignment (West)"),"Defines how ports on the western side are placed, overriding the node's general port alignment."),us),tA),un(ea)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,Ikt),SH),"Port Alignment (East)"),"Defines how ports on the eastern side are placed, overriding the node's general port alignment."),us),tA),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,D4),Gct),"Node Size Constraints"),"What should be taken into account when calculating a node's size. Empty size constraints specify that a node's size is already fixed and should not be changed."),JSt),U6),rA),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,T6),Gct),"Node Size Options"),"Options modifying the behavior of the size constraints set on a node. Each member of the set specifies something that should be taken into account when calculating node sizes. The empty set corresponds to no further modifications."),eAt),U6),NAt),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,C6),Gct),"Node Size Minimum"),"The minimal size to which a node can be reduced."),tAt),V1),Ws),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Ect),Gct),"Fixed Graph Size"),"By default, the fixed layout provider will enlarge a graph until it is large enough to contain its children. If this option is set, it won't do so."),!1),La),Rs),un(qn)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Pkt),kct),"Edge Label Placement"),"Gives a hint on where to put edge labels."),$St),us),mAt),un(rp)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,eH),kct),"Inline Edge Labels"),"If true, an edge label is placed directly on its edge. May only apply to center edge labels. This kind of label placement is only advisable if the label's rendering is such that it is not crossed by its edge and thus stays legible."),!1),La),Rs),un(rp)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,Wxn),"font"),"Font Name"),"Font name used for a label."),I7),Ae),un(rp)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,xde),"font"),"Font Size"),"Font size used for a label."),gc),ja),un(rp)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,Rkt),Uct),"Port Anchor Offset"),"The offset to the port position where connections shall be attached."),V1),Ws),un(V2)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,Fkt),Uct),"Port Index"),"The index of a port in the fixed order around a node. The order is assumed as clockwise, starting with the leftmost port on the top side. This option must be set if 'Port Constraints' is set to FIXED_ORDER and no specific positions are given for the ports. Additionally, the option 'Port Side' must be defined in this case."),gc),ja),un(V2)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,ykt),Uct),"Port Side"),"The side of a node on which a port is situated. This option must be set if 'Port Constraints' is set to FIXED_SIDE or FIXED_ORDER and no specific positions are given for the ports."),lAt),us),Xa),un(V2)))),an(e,new Xe(rn(nn(sn(Ze(en(Je(tn(new Ue,vkt),Uct),"Port Border Offset"),"The offset of ports on the node border. With a positive offset the port is moved outside of the node, while with a negative offset the port is moved towards the inside. An offset of 0 means that the port is placed directly on the node border, i.e. if the port side is north, the port's south border touches the nodes's north border; if the port side is east, the port's west border touches the nodes's east border; if the port side is south, the port's north border touches the node's south border; if the port side is west, the port's east border touches the node's west border."),Oo),la),un(V2)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,WE),b8t),"Port Label Placement"),"Decides on a placement method for port labels; if empty, the node label's position is not modified."),cAt),U6),eU),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,_kt),b8t),"Port Labels Next to Port"),"Use 'portLabels.placement': NEXT_TO_PORT_OF_POSSIBLE."),!1),La),Rs),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Skt),b8t),"Treat Port Labels as Group"),"If this option is true (default), the labels of a port will be treated as a group when it comes to centering them next to their port. If this option is false, only the first label will be centered next to the port, with the others being placed below. This only applies to labels of eastern and western ports and will have no effect if labels are not placed next to their port."),!0),La),Rs),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,kkt),Cde),"Activate Inside Self Loops"),"Whether this node allows to route self loops inside of it instead of around it. If set to true, this will make the node a compound node if it isn't already, and will require the layout algorithm to support compound nodes with hierarchical ports."),!1),La),Rs),un(ea)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,Ekt),Cde),"Inside Self Loop"),"Whether a self loop should be routed inside a node instead of around that node."),!1),La),Rs),un(Pd)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,$ot),"edge"),"Edge Thickness"),"The thickness of an edge. This is a hint on the line width used to draw an edge, possibly requiring more space to be reserved for it."),1),Oo),la),un(Pd)))),an(e,new Xe(rn(nn(sn(kn(Ze(en(Je(tn(new Ue,kde),"edge"),"Edge Type"),"The type of an edge. This is usually used for UML class diagrams, where associations must be handled differently from generalizations."),VSt),us),CAt),un(Pd)))),WC(e,new Yx(zC(o8(a8(new xm,Gn),"Layered"),'The layer-based method was introduced by Sugiyama, Tagawa and Toda in 1981. It emphasizes the direction of edges by pointing as many edges as possible into the same direction. The nodes are arranged in layers, which are sometimes called "hierarchies", and then reordered such that the number of edge crossings is minimized. Afterwards, concrete coordinates are computed for the nodes and edge bend points.'))),WC(e,new Yx(zC(o8(a8(new xm,"org.eclipse.elk.orthogonal"),"Orthogonal"),`Orthogonal methods that follow the "topology-shape-metrics" approach by Batini, Nardelli and Tamassia '86. The first phase determines the topology of the drawing by applying a planarization technique, which results in a planar representation of the graph. The orthogonal shape is computed in the second phase, which aims at minimizing the number of edge bends, and is called orthogonalization. The third phase leads to concrete coordinates for nodes and edge bend points by applying a compaction method, thus defining the metrics.`))),WC(e,new Yx(zC(o8(a8(new xm,Vl),"Force"),"Layout algorithms that follow physical analogies by simulating a system of attractive and repulsive forces. The first successful method of this kind was proposed by Eades in 1984."))),WC(e,new Yx(zC(o8(a8(new xm,"org.eclipse.elk.circle"),"Circle"),"Circular layout algorithms emphasize cycles or biconnected components of a graph by arranging them in circles. This is useful if a drawing is desired where such components are clearly grouped, or where cycles are shown as prominent OPTIONS of the graph."))),WC(e,new Yx(zC(o8(a8(new xm,K1e),"Tree"),"Specialized layout methods for trees, i.e. acyclic graphs. The regular structure of graphs that have no undirected cycles can be emphasized using an algorithm of this type."))),WC(e,new Yx(zC(o8(a8(new xm,"org.eclipse.elk.planar"),"Planar"),"Algorithms that require a planar or upward planar graph. Most of these algorithms are theoretically interesting, but not practically usable."))),WC(e,new Yx(zC(o8(a8(new xm,Sd),"Radial"),"Radial layout algorithms usually position the nodes of the graph on concentric circles."))),Kue((new QB,e)),lle((new htt,e)),Cue((new ZB,e))};var YS,a4e,NSt,W6,o4e,c4e,BSt,u4e,YG,RSt,QO,qv,jSt,gft,pft,$St,zSt,qSt,HSt,VSt,GSt,s5,USt,l4e,ZO,bft,KG,WSt,a5,YSt,JO,KSt,XSt,QSt,o5,ZSt,G2,JSt,XG,c5,tAt,xb,eAt,QG,tP,U2,nAt,h4e,rAt,f4e,d4e,iAt,sAt,wft,vft,mft,yft,aAt,dl,KS,oAt,xft,kft,Qy,cAt,uAt,u5,lAt,Y6,ZG,Eft,O7,g4e,Tft,p4e,b4e,hAt,w4e,fAt,v4e,K6,dAt,JG,gAt,pAt,W2,m4e,bAt,wAt,vAt;F(Fh,"CoreOptions",684),D(103,22,{3:1,35:1,22:1,103:1},PM);var ng,zh,Cf,h0,rg,XS=jr(Fh,i6t,103,Hr,ban,Ftn),y4e;D(272,22,{3:1,35:1,22:1,272:1},Zet);var P7,Zy,F7,mAt=jr(Fh,"EdgeLabelPlacement",272,Hr,Xin,Ntn),x4e;D(218,22,{3:1,35:1,22:1,218:1},sj);var N7,eP,X6,Cft,_ft=jr(Fh,"EdgeRouting",218,Hr,qsn,Btn),k4e;D(312,22,{3:1,35:1,22:1,312:1},a9);var yAt,xAt,kAt,EAt,Sft,TAt,CAt=jr(Fh,"EdgeType",312,Hr,non,Rtn),E4e;D(977,1,Oh,QB),l.Qe=function(e){Kue(e)};var _At,SAt,AAt,LAt,T4e,MAt,QS;F(Fh,"FixedLayouterOptions",977),D(978,1,{},qL),l.$e=function(){var e;return e=new UZ,e},l._e=function(e){},F(Fh,"FixedLayouterOptions/FixedFactory",978),D(334,22,{3:1,35:1,22:1,334:1},Jet);var sp,tU,ZS,DAt=jr(Fh,"HierarchyHandling",334,Hr,Kin,jtn),C4e;D(285,22,{3:1,35:1,22:1,285:1},aj);var f0,kb,nP,rP,_4e=jr(Fh,"LabelSide",285,Hr,zsn,$tn),S4e;D(93,22,{3:1,35:1,22:1,93:1},q3);var ig,_f,qh,Sf,Yl,Af,Hh,d0,Lf,lo=jr(Fh,"NodeLabelPlacement",93,Hr,scn,ztn),A4e;D(249,22,{3:1,35:1,22:1,249:1},FM);var IAt,JS,Eb,OAt,iP,tA=jr(Fh,"PortAlignment",249,Hr,wan,qtn),L4e;D(98,22,{3:1,35:1,22:1,98:1},o9);var Y2,Gc,g0,B7,G1,Tb,PAt=jr(Fh,"PortConstraints",98,Hr,jan,Htn),M4e;D(273,22,{3:1,35:1,22:1,273:1},c9);var eA,nA,sg,sP,Cb,Q6,eU=jr(Fh,"PortLabelPlacement",273,Hr,eon,Vtn),D4e;D(61,22,{3:1,35:1,22:1,61:1},NM);var Hn,Pn,mh,yh,Su,lu,U1,Mf,el,Vu,Uc,nl,Au,Lu,Df,Kl,Xl,Vh,mr,Zo,Bn,Xa=jr(Fh,"PortSide",61,Hr,dan,Wtn),I4e;D(981,1,Oh,ZB),l.Qe=function(e){Cue(e)};var O4e,P4e,FAt,F4e,N4e;F(Fh,"RandomLayouterOptions",981),D(982,1,{},ZZ),l.$e=function(){var e;return e=new tJ,e},l._e=function(e){},F(Fh,"RandomLayouterOptions/RandomFactory",982),D(374,22,{3:1,35:1,22:1,374:1},oj);var Jy,aP,oP,K2,rA=jr(Fh,"SizeConstraint",374,Hr,$sn,Gtn),B4e;D(259,22,{3:1,35:1,22:1,259:1},H3);var cP,nU,R7,Aft,uP,iA,rU,iU,sU,NAt=jr(Fh,"SizeOptions",259,Hr,fcn,Utn),R4e;D(370,1,{1949:1},r8),l.b=!1,l.c=0,l.d=-1,l.e=null,l.f=null,l.g=-1,l.j=!1,l.k=!1,l.n=!1,l.o=0,l.q=0,l.r=0,F(Ec,"BasicProgressMonitor",370),D(972,209,S2,YZ),l.Ze=function(e,n){var r,s,o,h,d,v,k,C,M;switch(vr(n,"Box layout",2),o=pM(ye(qe(e,(fq(),i4e)))),h=u(qe(e,r4e),116),r=je(Re(qe(e,DSt))),s=je(Re(qe(e,ISt))),u(qe(e,lft),311).g){case 0:d=(v=new Bu((!e.a&&(e.a=new fe(rs,e,10,11)),e.a)),wn(),Zs(v,new ozt(s)),v),k=Q4t(e),C=ye(qe(e,MSt)),(C==null||(On(C),C<=0))&&(C=1.3),M=Q5n(d,o,h,k.a,k.b,r,(On(C),C)),wv(e,M.a,M.b,!1,!0);break;default:W3n(e,o,h,r)}or(n)},F(Ec,"BoxLayoutProvider",972),D(973,1,Oi,ozt),l.ue=function(e,n){return pwn(this,u(e,33),u(n,33))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},l.a=!1,F(Ec,"BoxLayoutProvider/1",973),D(157,1,{157:1},rz,LWt),l.Ib=function(){return this.c?X5t(this.c):eb(this.b)},F(Ec,"BoxLayoutProvider/Group",157),D(311,22,{3:1,35:1,22:1,311:1},cj);var BAt,RAt,jAt,Lft,$At=jr(Ec,"BoxLayoutProvider/PackingMode",311,Hr,Hsn,Ytn),j4e;D(974,1,Oi,KZ),l.ue=function(e,n){return vrn(u(e,157),u(n,157))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(Ec,"BoxLayoutProvider/lambda$0$Type",974),D(975,1,Oi,sB),l.ue=function(e,n){return hrn(u(e,157),u(n,157))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(Ec,"BoxLayoutProvider/lambda$1$Type",975),D(976,1,Oi,XZ),l.ue=function(e,n){return frn(u(e,157),u(n,157))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(Ec,"BoxLayoutProvider/lambda$2$Type",976),D(1365,1,{831:1},QZ),l.qg=function(e,n){return HR(),!_t(n,160)||jHt((i6(),u(e,160)),n)},F(Ec,"ElkSpacings/AbstractSpacingsBuilder/lambda$0$Type",1365),D(1366,1,Un,czt),l.td=function(e){nln(this.a,u(e,146))},F(Ec,"ElkSpacings/AbstractSpacingsBuilder/lambda$1$Type",1366),D(1367,1,Un,WZ),l.td=function(e){u(e,94),HR()},F(Ec,"ElkSpacings/AbstractSpacingsBuilder/lambda$2$Type",1367),D(1371,1,Un,uzt),l.td=function(e){Scn(this.a,u(e,94))},F(Ec,"ElkSpacings/AbstractSpacingsBuilder/lambda$3$Type",1371),D(1369,1,li,CGt),l.Mb=function(e){return qun(this.a,this.b,u(e,146))},F(Ec,"ElkSpacings/AbstractSpacingsBuilder/lambda$4$Type",1369),D(1368,1,li,_Gt),l.Mb=function(e){return sZe(this.a,this.b,u(e,831))},F(Ec,"ElkSpacings/AbstractSpacingsBuilder/lambda$5$Type",1368),D(1370,1,Un,SGt),l.td=function(e){snn(this.a,this.b,u(e,146))},F(Ec,"ElkSpacings/AbstractSpacingsBuilder/lambda$6$Type",1370),D(935,1,{},GZ),l.Kb=function(e){return SUt(e)},l.Fb=function(e){return this===e},F(Ec,"ElkUtil/lambda$0$Type",935),D(936,1,Un,AGt),l.td=function(e){wbn(this.a,this.b,u(e,79))},l.a=0,l.b=0,F(Ec,"ElkUtil/lambda$1$Type",936),D(937,1,Un,LGt),l.td=function(e){wKe(this.a,this.b,u(e,202))},l.a=0,l.b=0,F(Ec,"ElkUtil/lambda$2$Type",937),D(938,1,Un,MGt),l.td=function(e){cQe(this.a,this.b,u(e,137))},l.a=0,l.b=0,F(Ec,"ElkUtil/lambda$3$Type",938),D(939,1,Un,lzt),l.td=function(e){xen(this.a,u(e,469))},F(Ec,"ElkUtil/lambda$4$Type",939),D(342,1,{35:1,342:1},WYe),l.wd=function(e){return NQe(this,u(e,236))},l.Fb=function(e){var n;return _t(e,342)?(n=u(e,342),this.a==n.a):!1},l.Hb=function(){return ps(this.a)},l.Ib=function(){return this.a+" (exclusive)"},l.a=0,F(Ec,"ExclusiveBounds/ExclusiveLowerBound",342),D(1138,209,S2,UZ),l.Ze=function(e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt,St,Rt,Kt,ue,_e,We,Qe;for(vr(n,"Fixed Layout",1),h=u(qe(e,(ui(),zSt)),218),j=0,H=0,St=new nr((!e.a&&(e.a=new fe(rs,e,10,11)),e.a));St.e!=St.i.gc();){for(gt=u(dr(St),33),Qe=u(qe(gt,(Sz(),QS)),8),Qe&&(x1(gt,Qe.a,Qe.b),u(qe(gt,SAt),174).Hc((Al(),Jy))&&(G=u(qe(gt,LAt),8),G.a>0&&G.b>0&&wv(gt,G.a,G.b,!0,!0))),j=b.Math.max(j,gt.i+gt.g),H=b.Math.max(H,gt.j+gt.f),C=new nr((!gt.n&&(gt.n=new fe(qo,gt,1,7)),gt.n));C.e!=C.i.gc();)v=u(dr(C),137),Qe=u(qe(v,QS),8),Qe&&x1(v,Qe.a,Qe.b),j=b.Math.max(j,gt.i+v.i+v.g),H=b.Math.max(H,gt.j+v.j+v.f);for(ue=new nr((!gt.c&&(gt.c=new fe(gl,gt,9,9)),gt.c));ue.e!=ue.i.gc();)for(Kt=u(dr(ue),118),Qe=u(qe(Kt,QS),8),Qe&&x1(Kt,Qe.a,Qe.b),_e=gt.i+Kt.i,We=gt.j+Kt.j,j=b.Math.max(j,_e+Kt.g),H=b.Math.max(H,We+Kt.f),k=new nr((!Kt.n&&(Kt.n=new fe(qo,Kt,1,7)),Kt.n));k.e!=k.i.gc();)v=u(dr(k),137),Qe=u(qe(v,QS),8),Qe&&x1(v,Qe.a,Qe.b),j=b.Math.max(j,_e+v.i+v.g),H=b.Math.max(H,We+v.j+v.f);for(o=new ar(lr(K0(gt).a.Kc(),new z));zr(o);)r=u(Mr(o),79),M=$he(r),j=b.Math.max(j,M.a),H=b.Math.max(H,M.b);for(s=new ar(lr(wI(gt).a.Kc(),new z));zr(s);)r=u(Mr(s),79),es(e0(r))!=e&&(M=$he(r),j=b.Math.max(j,M.a),H=b.Math.max(H,M.b))}if(h==(W0(),N7))for(Mt=new nr((!e.a&&(e.a=new fe(rs,e,10,11)),e.a));Mt.e!=Mt.i.gc();)for(gt=u(dr(Mt),33),s=new ar(lr(K0(gt).a.Kc(),new z));zr(s);)r=u(Mr(s),79),d=gyn(r),d.b==0?wo(r,a5,null):wo(r,a5,d);je(Re(qe(e,(Sz(),AAt))))||(Rt=u(qe(e,T4e),116),tt=j+Rt.b+Rt.c,K=H+Rt.d+Rt.a,wv(e,tt,K,!0,!0)),or(n)},F(Ec,"FixedLayoutProvider",1138),D(373,134,{3:1,414:1,373:1,94:1,134:1},Yu,ree),l.Jf=function(e){var n,r,s,o,h,d,v,k,C;if(e)try{for(k=vy(e,";,;"),h=k,d=0,v=h.length;d>16&ys|n^s<<16},l.Kc=function(){return new hzt(this)},l.Ib=function(){return this.a==null&&this.b==null?"pair(null,null)":this.a==null?"pair(null,"+$o(this.b)+")":this.b==null?"pair("+$o(this.a)+",null)":"pair("+$o(this.a)+","+$o(this.b)+")"},F(Ec,"Pair",46),D(983,1,sa,hzt),l.Nb=function(e){ba(this,e)},l.Ob=function(){return!this.c&&(!this.b&&this.a.a!=null||this.a.b!=null)},l.Pb=function(){if(!this.c&&!this.b&&this.a.a!=null)return this.b=!0,this.a.a;if(!this.c&&this.a.b!=null)return this.c=!0,this.a.b;throw it(new lc)},l.Qb=function(){throw this.c&&this.a.b!=null?this.a.b=null:this.b&&this.a.a!=null&&(this.a.a=null),it(new Ou)},l.b=!1,l.c=!1,F(Ec,"Pair/1",983),D(448,1,{448:1},zXt),l.Fb=function(e){return Fc(this.a,u(e,448).a)&&Fc(this.c,u(e,448).c)&&Fc(this.d,u(e,448).d)&&Fc(this.b,u(e,448).b)},l.Hb=function(){return Az(lt(ct(Qn,1),De,1,5,[this.a,this.c,this.d,this.b]))},l.Ib=function(){return"("+this.a+Ya+this.c+Ya+this.d+Ya+this.b+")"},F(Ec,"Quadruple",448),D(1126,209,S2,tJ),l.Ze=function(e,n){var r,s,o,h,d;if(vr(n,"Random Layout",1),(!e.a&&(e.a=new fe(rs,e,10,11)),e.a).i==0){or(n);return}h=u(qe(e,(S3t(),F4e)),19),h&&h.a!=0?o=new F$(h.a):o=new Zit,r=pM(ye(qe(e,O4e))),d=pM(ye(qe(e,N4e))),s=u(qe(e,P4e),116),A5n(e,o,r,d,s),or(n)},F(Ec,"RandomLayoutProvider",1126);var H4e;D(553,1,{}),l.qf=function(){return new $e(this.f.i,this.f.j)},l.We=function(e){return dQt(e,(ui(),dl))?qe(this.f,V4e):qe(this.f,e)},l.rf=function(){return new $e(this.f.g,this.f.f)},l.sf=function(){return this.g},l.Xe=function(e){return o2(this.f,e)},l.tf=function(e){ku(this.f,e.a),Eu(this.f,e.b)},l.uf=function(e){tv(this.f,e.a),Jw(this.f,e.b)},l.vf=function(e){this.g=e},l.g=0;var V4e;F(K_,"ElkGraphAdapters/AbstractElkGraphElementAdapter",553),D(554,1,{839:1},wR),l.wf=function(){var e,n;if(!this.b)for(this.b=D$(u$(this.a).i),n=new nr(u$(this.a));n.e!=n.i.gc();)e=u(dr(n),137),le(this.b,new get(e));return this.b},l.b=null,F(K_,"ElkGraphAdapters/ElkEdgeAdapter",554),D(301,553,{},Mm),l.xf=function(){return zse(this)},l.a=null,F(K_,"ElkGraphAdapters/ElkGraphAdapter",301),D(630,553,{181:1},get),F(K_,"ElkGraphAdapters/ElkLabelAdapter",630),D(629,553,{680:1},gnt),l.wf=function(){return M1n(this)},l.Af=function(){var e;return e=u(qe(this.f,(ui(),JO)),142),!e&&(e=new OC),e},l.Cf=function(){return D1n(this)},l.Ef=function(e){var n;n=new Lnt(e),wo(this.f,(ui(),JO),n)},l.Ff=function(e){wo(this.f,(ui(),U2),new kwt(e))},l.yf=function(){return this.d},l.zf=function(){var e,n;if(!this.a)for(this.a=new he,n=new ar(lr(wI(u(this.f,33)).a.Kc(),new z));zr(n);)e=u(Mr(n),79),le(this.a,new wR(e));return this.a},l.Bf=function(){var e,n;if(!this.c)for(this.c=new he,n=new ar(lr(K0(u(this.f,33)).a.Kc(),new z));zr(n);)e=u(Mr(n),79),le(this.c,new wR(e));return this.c},l.Df=function(){return p$(u(this.f,33)).i!=0||je(Re(u(this.f,33).We((ui(),ZO))))},l.Gf=function(){xon(this,(Pm(),H4e))},l.a=null,l.b=null,l.c=null,l.d=null,l.e=null,F(K_,"ElkGraphAdapters/ElkNodeAdapter",629),D(1266,553,{838:1},$zt),l.wf=function(){return j1n(this)},l.zf=function(){var e,n;if(!this.a)for(this.a=Ud(u(this.f,118).xg().i),n=new nr(u(this.f,118).xg());n.e!=n.i.gc();)e=u(dr(n),79),le(this.a,new wR(e));return this.a},l.Bf=function(){var e,n;if(!this.c)for(this.c=Ud(u(this.f,118).yg().i),n=new nr(u(this.f,118).yg());n.e!=n.i.gc();)e=u(dr(n),79),le(this.c,new wR(e));return this.c},l.Hf=function(){return u(u(this.f,118).We((ui(),u5)),61)},l.If=function(){var e,n,r,s,o,h,d,v;for(s=T1(u(this.f,118)),r=new nr(u(this.f,118).yg());r.e!=r.i.gc();)for(e=u(dr(r),79),v=new nr((!e.c&&(e.c=new Cn(br,e,5,8)),e.c));v.e!=v.i.gc();){if(d=u(dr(v),82),ey(Do(d),s))return!0;if(Do(d)==s&&je(Re(qe(e,(ui(),bft)))))return!0}for(n=new nr(u(this.f,118).xg());n.e!=n.i.gc();)for(e=u(dr(n),79),h=new nr((!e.b&&(e.b=new Cn(br,e,4,7)),e.b));h.e!=h.i.gc();)if(o=u(dr(h),82),ey(Do(o),s))return!0;return!1},l.a=null,l.b=null,l.c=null,F(K_,"ElkGraphAdapters/ElkPortAdapter",1266),D(1267,1,Oi,eJ),l.ue=function(e,n){return omn(u(e,118),u(n,118))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(K_,"ElkGraphAdapters/PortComparator",1267);var _b=Ki(ph,"EObject"),j7=Ki(F4,Ade),Gh=Ki(F4,Lde),lP=Ki(F4,Mde),hP=Ki(F4,"ElkShape"),br=Ki(F4,Dde),Ys=Ki(F4,w8t),Ji=Ki(F4,Ide),fP=Ki(ph,Ode),sA=Ki(ph,"EFactory"),G4e,Mft=Ki(ph,Pde),i1=Ki(ph,"EPackage"),na,U4e,W4e,VAt,aU,Y4e,GAt,UAt,WAt,Sb,K4e,X4e,qo=Ki(F4,v8t),rs=Ki(F4,m8t),gl=Ki(F4,y8t);D(90,1,Fde),l.Jg=function(){return this.Kg(),null},l.Kg=function(){return null},l.Lg=function(){return this.Kg(),!1},l.Mg=function(){return!1},l.Ng=function(e){mi(this,e)},F(L6,"BasicNotifierImpl",90),D(97,90,jde),l.nh=function(){return xl(this)},l.Og=function(e,n){return e},l.Pg=function(){throw it(new Or)},l.Qg=function(e){var n;return n=no(u(yn(this.Tg(),this.Vg()),18)),this.eh().ih(this,n.n,n.f,e)},l.Rg=function(e,n){throw it(new Or)},l.Sg=function(e,n,r){return Hl(this,e,n,r)},l.Tg=function(){var e;return this.Pg()&&(e=this.Pg().ck(),e)?e:this.zh()},l.Ug=function(){return eat(this)},l.Vg=function(){throw it(new Or)},l.Wg=function(){var e,n;return n=this.ph().dk(),!n&&this.Pg().ik(n=(YC(),e=jvt(vd(this.Tg())),e==null?Rft:new jM(this,e))),n},l.Xg=function(e,n){return e},l.Yg=function(e){var n;return n=e.Gj(),n?e.aj():Gi(this.Tg(),e)},l.Zg=function(){var e;return e=this.Pg(),e?e.fk():null},l.$g=function(){return this.Pg()?this.Pg().ck():null},l._g=function(e,n,r){return Xz(this,e,n,r)},l.ah=function(e){return j8(this,e)},l.bh=function(e,n){return Urt(this,e,n)},l.dh=function(){var e;return e=this.Pg(),!!e&&e.gk()},l.eh=function(){throw it(new Or)},l.fh=function(){return Hz(this)},l.gh=function(e,n,r,s){return c6(this,e,n,s)},l.hh=function(e,n,r){var s;return s=u(yn(this.Tg(),n),66),s.Nj().Qj(this,this.yh(),n-this.Ah(),e,r)},l.ih=function(e,n,r,s){return m$(this,e,n,s)},l.jh=function(e,n,r){var s;return s=u(yn(this.Tg(),n),66),s.Nj().Rj(this,this.yh(),n-this.Ah(),e,r)},l.kh=function(){return!!this.Pg()&&!!this.Pg().ek()},l.lh=function(e){return fst(this,e)},l.mh=function(e){return MQt(this,e)},l.oh=function(e){return ehe(this,e)},l.ph=function(){throw it(new Or)},l.qh=function(){return this.Pg()?this.Pg().ek():null},l.rh=function(){return Hz(this)},l.sh=function(e,n){Xst(this,e,n)},l.th=function(e){this.ph().hk(e)},l.uh=function(e){this.ph().kk(e)},l.vh=function(e){this.ph().jk(e)},l.wh=function(e,n){var r,s,o,h;return h=this.Zg(),h&&e&&(n=Ba(h.Vk(),this,n),h.Zk(this)),s=this.eh(),s&&(wat(this,this.eh(),this.Vg()).Bb&Ka?(o=s.fh(),o&&(e?!h&&o.Zk(this):o.Yk(this))):(n=(r=this.Vg(),r>=0?this.Qg(n):this.eh().ih(this,-1-r,null,n)),n=this.Sg(null,-1,n))),this.uh(e),n},l.xh=function(e){var n,r,s,o,h,d,v,k;if(r=this.Tg(),h=Gi(r,e),n=this.Ah(),h>=n)return u(e,66).Nj().Uj(this,this.yh(),h-n);if(h<=-1)if(d=C4(($u(),ya),r,e),d){if(to(),u(d,66).Oj()||(d=Kx(To(ya,d))),o=(s=this.Yg(d),u(s>=0?this._g(s,!0,!0):dv(this,d,!0),153)),k=d.Zj(),k>1||k==-1)return u(u(o,215).hl(e,!1),76)}else throw it(new Fn(lb+e.ne()+Wct));else if(e.$j())return s=this.Yg(e),u(s>=0?this._g(s,!1,!0):dv(this,e,!1),76);return v=new XGt(this,e),v},l.yh=function(){return $mt(this)},l.zh=function(){return(Hp(),Ln).S},l.Ah=function(){return Jn(this.zh())},l.Bh=function(e){Gst(this,e)},l.Ib=function(){return mf(this)},F(Mn,"BasicEObjectImpl",97);var Q4e;D(114,97,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1}),l.Ch=function(e){var n;return n=zmt(this),n[e]},l.Dh=function(e,n){var r;r=zmt(this),ts(r,e,n)},l.Eh=function(e){var n;n=zmt(this),ts(n,e,null)},l.Jg=function(){return u(Dn(this,4),126)},l.Kg=function(){throw it(new Or)},l.Lg=function(){return(this.Db&4)!=0},l.Pg=function(){throw it(new Or)},l.Fh=function(e){o6(this,2,e)},l.Rg=function(e,n){this.Db=n<<16|this.Db&255,this.Fh(e)},l.Tg=function(){return vu(this)},l.Vg=function(){return this.Db>>16},l.Wg=function(){var e,n;return YC(),n=jvt(vd((e=u(Dn(this,16),26),e||this.zh()))),n==null?Rft:new jM(this,n)},l.Mg=function(){return(this.Db&1)==0},l.Zg=function(){return u(Dn(this,128),1935)},l.$g=function(){return u(Dn(this,16),26)},l.dh=function(){return(this.Db&32)!=0},l.eh=function(){return u(Dn(this,2),49)},l.kh=function(){return(this.Db&64)!=0},l.ph=function(){throw it(new Or)},l.qh=function(){return u(Dn(this,64),281)},l.th=function(e){o6(this,16,e)},l.uh=function(e){o6(this,128,e)},l.vh=function(e){o6(this,64,e)},l.yh=function(){return su(this)},l.Db=0,F(Mn,"MinimalEObjectImpl",114),D(115,114,{105:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),l.Fh=function(e){this.Cb=e},l.eh=function(){return this.Cb},F(Mn,"MinimalEObjectImpl/Container",115),D(1985,115,{105:1,413:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),l._g=function(e,n,r){return Z3t(this,e,n,r)},l.jh=function(e,n,r){return $4t(this,e,n,r)},l.lh=function(e){return Qvt(this,e)},l.sh=function(e,n){Byt(this,e,n)},l.zh=function(){return Jc(),X4e},l.Bh=function(e){_yt(this,e)},l.Ve=function(){return cse(this)},l.We=function(e){return qe(this,e)},l.Xe=function(e){return o2(this,e)},l.Ye=function(e,n){return wo(this,e,n)},F(M2,"EMapPropertyHolderImpl",1985),D(567,115,{105:1,469:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},xp),l._g=function(e,n,r){switch(e){case 0:return this.a;case 1:return this.b}return Xz(this,e,n,r)},l.lh=function(e){switch(e){case 0:return this.a!=0;case 1:return this.b!=0}return fst(this,e)},l.sh=function(e,n){switch(e){case 0:iz(this,Xt(ye(n)));return;case 1:sz(this,Xt(ye(n)));return}Xst(this,e,n)},l.zh=function(){return Jc(),U4e},l.Bh=function(e){switch(e){case 0:iz(this,0);return;case 1:sz(this,0);return}Gst(this,e)},l.Ib=function(){var e;return this.Db&64?mf(this):(e=new _h(mf(this)),e.a+=" (x: ",$3(e,this.a),e.a+=", y: ",$3(e,this.b),e.a+=")",e.a)},l.a=0,l.b=0,F(M2,"ElkBendPointImpl",567),D(723,1985,{105:1,413:1,160:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),l._g=function(e,n,r){return n3t(this,e,n,r)},l.hh=function(e,n,r){return jst(this,e,n,r)},l.jh=function(e,n,r){return Eit(this,e,n,r)},l.lh=function(e){return vyt(this,e)},l.sh=function(e,n){w4t(this,e,n)},l.zh=function(){return Jc(),Y4e},l.Bh=function(e){Zyt(this,e)},l.zg=function(){return this.k},l.Ag=function(){return u$(this)},l.Ib=function(){return Xit(this)},l.k=null,F(M2,"ElkGraphElementImpl",723),D(724,723,{105:1,413:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),l._g=function(e,n,r){return f3t(this,e,n,r)},l.lh=function(e){return m3t(this,e)},l.sh=function(e,n){v4t(this,e,n)},l.zh=function(){return Jc(),K4e},l.Bh=function(e){T3t(this,e)},l.Bg=function(){return this.f},l.Cg=function(){return this.g},l.Dg=function(){return this.i},l.Eg=function(){return this.j},l.Fg=function(e,n){bj(this,e,n)},l.Gg=function(e,n){x1(this,e,n)},l.Hg=function(e){ku(this,e)},l.Ig=function(e){Eu(this,e)},l.Ib=function(){return Vst(this)},l.f=0,l.g=0,l.i=0,l.j=0,F(M2,"ElkShapeImpl",724),D(725,724,{105:1,413:1,82:1,160:1,470:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1}),l._g=function(e,n,r){return U3t(this,e,n,r)},l.hh=function(e,n,r){return h4t(this,e,n,r)},l.jh=function(e,n,r){return f4t(this,e,n,r)},l.lh=function(e){return Fyt(this,e)},l.sh=function(e,n){x5t(this,e,n)},l.zh=function(){return Jc(),W4e},l.Bh=function(e){R3t(this,e)},l.xg=function(){return!this.d&&(this.d=new Cn(Ys,this,8,5)),this.d},l.yg=function(){return!this.e&&(this.e=new Cn(Ys,this,7,4)),this.e},F(M2,"ElkConnectableShapeImpl",725),D(352,723,{105:1,413:1,79:1,160:1,352:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},pw),l.Qg=function(e){return o4t(this,e)},l._g=function(e,n,r){switch(e){case 3:return cD(this);case 4:return!this.b&&(this.b=new Cn(br,this,4,7)),this.b;case 5:return!this.c&&(this.c=new Cn(br,this,5,8)),this.c;case 6:return!this.a&&(this.a=new fe(Ji,this,6,6)),this.a;case 7:return Nn(),!this.b&&(this.b=new Cn(br,this,4,7)),!(this.b.i<=1&&(!this.c&&(this.c=new Cn(br,this,5,8)),this.c.i<=1));case 8:return Nn(),!!w_(this);case 9:return Nn(),!!fv(this);case 10:return Nn(),!this.b&&(this.b=new Cn(br,this,4,7)),this.b.i!=0&&(!this.c&&(this.c=new Cn(br,this,5,8)),this.c.i!=0)}return n3t(this,e,n,r)},l.hh=function(e,n,r){var s;switch(n){case 3:return this.Cb&&(r=(s=this.Db>>16,s>=0?o4t(this,r):this.Cb.ih(this,-1-s,null,r))),twt(this,u(e,33),r);case 4:return!this.b&&(this.b=new Cn(br,this,4,7)),Zc(this.b,e,r);case 5:return!this.c&&(this.c=new Cn(br,this,5,8)),Zc(this.c,e,r);case 6:return!this.a&&(this.a=new fe(Ji,this,6,6)),Zc(this.a,e,r)}return jst(this,e,n,r)},l.jh=function(e,n,r){switch(n){case 3:return twt(this,null,r);case 4:return!this.b&&(this.b=new Cn(br,this,4,7)),Ba(this.b,e,r);case 5:return!this.c&&(this.c=new Cn(br,this,5,8)),Ba(this.c,e,r);case 6:return!this.a&&(this.a=new fe(Ji,this,6,6)),Ba(this.a,e,r)}return Eit(this,e,n,r)},l.lh=function(e){switch(e){case 3:return!!cD(this);case 4:return!!this.b&&this.b.i!=0;case 5:return!!this.c&&this.c.i!=0;case 6:return!!this.a&&this.a.i!=0;case 7:return!this.b&&(this.b=new Cn(br,this,4,7)),!(this.b.i<=1&&(!this.c&&(this.c=new Cn(br,this,5,8)),this.c.i<=1));case 8:return w_(this);case 9:return fv(this);case 10:return!this.b&&(this.b=new Cn(br,this,4,7)),this.b.i!=0&&(!this.c&&(this.c=new Cn(br,this,5,8)),this.c.i!=0)}return vyt(this,e)},l.sh=function(e,n){switch(e){case 3:oat(this,u(n,33));return;case 4:!this.b&&(this.b=new Cn(br,this,4,7)),xr(this.b),!this.b&&(this.b=new Cn(br,this,4,7)),is(this.b,u(n,14));return;case 5:!this.c&&(this.c=new Cn(br,this,5,8)),xr(this.c),!this.c&&(this.c=new Cn(br,this,5,8)),is(this.c,u(n,14));return;case 6:!this.a&&(this.a=new fe(Ji,this,6,6)),xr(this.a),!this.a&&(this.a=new fe(Ji,this,6,6)),is(this.a,u(n,14));return}w4t(this,e,n)},l.zh=function(){return Jc(),VAt},l.Bh=function(e){switch(e){case 3:oat(this,null);return;case 4:!this.b&&(this.b=new Cn(br,this,4,7)),xr(this.b);return;case 5:!this.c&&(this.c=new Cn(br,this,5,8)),xr(this.c);return;case 6:!this.a&&(this.a=new fe(Ji,this,6,6)),xr(this.a);return}Zyt(this,e)},l.Ib=function(){return $le(this)},F(M2,"ElkEdgeImpl",352),D(439,1985,{105:1,413:1,202:1,439:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},ad),l.Qg=function(e){return r4t(this,e)},l._g=function(e,n,r){switch(e){case 1:return this.j;case 2:return this.k;case 3:return this.b;case 4:return this.c;case 5:return!this.a&&(this.a=new As(Gh,this,5)),this.a;case 6:return SQt(this);case 7:return n?wst(this):this.i;case 8:return n?bst(this):this.f;case 9:return!this.g&&(this.g=new Cn(Ji,this,9,10)),this.g;case 10:return!this.e&&(this.e=new Cn(Ji,this,10,9)),this.e;case 11:return this.d}return Z3t(this,e,n,r)},l.hh=function(e,n,r){var s,o,h;switch(n){case 6:return this.Cb&&(r=(o=this.Db>>16,o>=0?r4t(this,r):this.Cb.ih(this,-1-o,null,r))),ewt(this,u(e,79),r);case 9:return!this.g&&(this.g=new Cn(Ji,this,9,10)),Zc(this.g,e,r);case 10:return!this.e&&(this.e=new Cn(Ji,this,10,9)),Zc(this.e,e,r)}return h=u(yn((s=u(Dn(this,16),26),s||(Jc(),aU)),n),66),h.Nj().Qj(this,su(this),n-Jn((Jc(),aU)),e,r)},l.jh=function(e,n,r){switch(n){case 5:return!this.a&&(this.a=new As(Gh,this,5)),Ba(this.a,e,r);case 6:return ewt(this,null,r);case 9:return!this.g&&(this.g=new Cn(Ji,this,9,10)),Ba(this.g,e,r);case 10:return!this.e&&(this.e=new Cn(Ji,this,10,9)),Ba(this.e,e,r)}return $4t(this,e,n,r)},l.lh=function(e){switch(e){case 1:return this.j!=0;case 2:return this.k!=0;case 3:return this.b!=0;case 4:return this.c!=0;case 5:return!!this.a&&this.a.i!=0;case 6:return!!SQt(this);case 7:return!!this.i;case 8:return!!this.f;case 9:return!!this.g&&this.g.i!=0;case 10:return!!this.e&&this.e.i!=0;case 11:return this.d!=null}return Qvt(this,e)},l.sh=function(e,n){switch(e){case 1:G8(this,Xt(ye(n)));return;case 2:W8(this,Xt(ye(n)));return;case 3:V8(this,Xt(ye(n)));return;case 4:U8(this,Xt(ye(n)));return;case 5:!this.a&&(this.a=new As(Gh,this,5)),xr(this.a),!this.a&&(this.a=new As(Gh,this,5)),is(this.a,u(n,14));return;case 6:zce(this,u(n,79));return;case 7:lz(this,u(n,82));return;case 8:uz(this,u(n,82));return;case 9:!this.g&&(this.g=new Cn(Ji,this,9,10)),xr(this.g),!this.g&&(this.g=new Cn(Ji,this,9,10)),is(this.g,u(n,14));return;case 10:!this.e&&(this.e=new Cn(Ji,this,10,9)),xr(this.e),!this.e&&(this.e=new Cn(Ji,this,10,9)),is(this.e,u(n,14));return;case 11:uyt(this,Br(n));return}Byt(this,e,n)},l.zh=function(){return Jc(),aU},l.Bh=function(e){switch(e){case 1:G8(this,0);return;case 2:W8(this,0);return;case 3:V8(this,0);return;case 4:U8(this,0);return;case 5:!this.a&&(this.a=new As(Gh,this,5)),xr(this.a);return;case 6:zce(this,null);return;case 7:lz(this,null);return;case 8:uz(this,null);return;case 9:!this.g&&(this.g=new Cn(Ji,this,9,10)),xr(this.g);return;case 10:!this.e&&(this.e=new Cn(Ji,this,10,9)),xr(this.e);return;case 11:uyt(this,null);return}_yt(this,e)},l.Ib=function(){return sce(this)},l.b=0,l.c=0,l.d=null,l.j=0,l.k=0,F(M2,"ElkEdgeSectionImpl",439),D(150,115,{105:1,92:1,90:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1}),l._g=function(e,n,r){var s;return e==0?(!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab):uh(this,e-Jn(this.zh()),yn((s=u(Dn(this,16),26),s||this.zh()),e),n,r)},l.hh=function(e,n,r){var s,o;return n==0?(!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r)):(o=u(yn((s=u(Dn(this,16),26),s||this.zh()),n),66),o.Nj().Qj(this,su(this),n-Jn(this.zh()),e,r))},l.jh=function(e,n,r){var s,o;return n==0?(!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r)):(o=u(yn((s=u(Dn(this,16),26),s||this.zh()),n),66),o.Nj().Rj(this,su(this),n-Jn(this.zh()),e,r))},l.lh=function(e){var n;return e==0?!!this.Ab&&this.Ab.i!=0:oh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.oh=function(e){return Lxt(this,e)},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return}gh(this,e-Jn(this.zh()),yn((r=u(Dn(this,16),26),r||this.zh()),e),n)},l.uh=function(e){o6(this,128,e)},l.zh=function(){return dn(),p5e},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return}fh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.Gh=function(){this.Bb|=1},l.Hh=function(e){return k_(this,e)},l.Bb=0,F(Mn,"EModelElementImpl",150),D(704,150,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},JB),l.Ih=function(e,n){return bhe(this,e,n)},l.Jh=function(e){var n,r,s,o,h;if(this.a!=Rl(e)||e.Bb&256)throw it(new Fn(Kct+e.zb+Cv));for(s=Ao(e);Lc(s.a).i!=0;){if(r=u(AI(s,0,(n=u(At(Lc(s.a),0),87),h=n.c,_t(h,88)?u(h,26):(dn(),Kh))),26),hv(r))return o=Rl(r).Nh().Jh(r),u(o,49).th(e),o;s=Ao(r)}return(e.D!=null?e.D:e.B)=="java.util.Map$Entry"?new hKt(e):new zwt(e)},l.Kh=function(e,n){return vv(this,e,n)},l._g=function(e,n,r){var s;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.a}return uh(this,e-Jn((dn(),Db)),yn((s=u(Dn(this,16),26),s||Db),e),n,r)},l.hh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r);case 1:return this.a&&(r=u(this.a,49).ih(this,4,i1,r)),Xyt(this,u(e,235),r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),Db)),n),66),o.Nj().Qj(this,su(this),n-Jn((dn(),Db)),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 1:return Xyt(this,null,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),Db)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),Db)),e,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return!!this.a}return oh(this,e-Jn((dn(),Db)),yn((n=u(Dn(this,16),26),n||Db),e))},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:zae(this,u(n,235));return}gh(this,e-Jn((dn(),Db)),yn((r=u(Dn(this,16),26),r||Db),e),n)},l.zh=function(){return dn(),Db},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:zae(this,null);return}fh(this,e-Jn((dn(),Db)),yn((n=u(Dn(this,16),26),n||Db),e))};var aA,YAt,Z4e;F(Mn,"EFactoryImpl",704),D(xf,704,{105:1,2014:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1},ax),l.Ih=function(e,n){switch(e.yj()){case 12:return u(n,146).tg();case 13:return $o(n);default:throw it(new Fn(QE+e.ne()+Cv))}},l.Jh=function(e){var n,r,s,o,h,d,v,k;switch(e.G==-1&&(e.G=(n=Rl(e),n?Hg(n.Mh(),e):-1)),e.G){case 4:return h=new ZT,h;case 6:return d=new Vpt,d;case 7:return v=new Gpt,v;case 8:return s=new pw,s;case 9:return r=new xp,r;case 10:return o=new ad,o;case 11:return k=new aB,k;default:throw it(new Fn(Kct+e.zb+Cv))}},l.Kh=function(e,n){switch(e.yj()){case 13:case 12:return null;default:throw it(new Fn(QE+e.ne()+Cv))}},F(M2,"ElkGraphFactoryImpl",xf),D(438,150,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1}),l.Wg=function(){var e,n;return n=(e=u(Dn(this,16),26),jvt(vd(e||this.zh()))),n==null?(YC(),YC(),Rft):new IWt(this,n)},l._g=function(e,n,r){var s;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.ne()}return uh(this,e-Jn(this.zh()),yn((s=u(Dn(this,16),26),s||this.zh()),e),n,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null}return oh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:this.Lh(Br(n));return}gh(this,e-Jn(this.zh()),yn((r=u(Dn(this,16),26),r||this.zh()),e),n)},l.zh=function(){return dn(),b5e},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:this.Lh(null);return}fh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.ne=function(){return this.zb},l.Lh=function(e){Qc(this,e)},l.Ib=function(){return J9(this)},l.zb=null,F(Mn,"ENamedElementImpl",438),D(179,438,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},fQt),l.Qg=function(e){return eae(this,e)},l._g=function(e,n,r){var s;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.yb;case 3:return this.xb;case 4:return this.sb;case 5:return!this.rb&&(this.rb=new Gm(this,s1,this)),this.rb;case 6:return!this.vb&&(this.vb=new Rx(i1,this,6,7)),this.vb;case 7:return n?this.Db>>16==7?u(this.Cb,235):null:AQt(this)}return uh(this,e-Jn((dn(),up)),yn((s=u(Dn(this,16),26),s||up),e),n,r)},l.hh=function(e,n,r){var s,o,h;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r);case 4:return this.sb&&(r=u(this.sb,49).ih(this,1,sA,r)),t3t(this,u(e,471),r);case 5:return!this.rb&&(this.rb=new Gm(this,s1,this)),Zc(this.rb,e,r);case 6:return!this.vb&&(this.vb=new Rx(i1,this,6,7)),Zc(this.vb,e,r);case 7:return this.Cb&&(r=(o=this.Db>>16,o>=0?eae(this,r):this.Cb.ih(this,-1-o,null,r))),Hl(this,e,7,r)}return h=u(yn((s=u(Dn(this,16),26),s||(dn(),up)),n),66),h.Nj().Qj(this,su(this),n-Jn((dn(),up)),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 4:return t3t(this,null,r);case 5:return!this.rb&&(this.rb=new Gm(this,s1,this)),Ba(this.rb,e,r);case 6:return!this.vb&&(this.vb=new Rx(i1,this,6,7)),Ba(this.vb,e,r);case 7:return Hl(this,null,7,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),up)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),up)),e,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.yb!=null;case 3:return this.xb!=null;case 4:return!!this.sb;case 5:return!!this.rb&&this.rb.i!=0;case 6:return!!this.vb&&this.vb.i!=0;case 7:return!!AQt(this)}return oh(this,e-Jn((dn(),up)),yn((n=u(Dn(this,16),26),n||up),e))},l.oh=function(e){var n;return n=Lwn(this,e),n||Lxt(this,e)},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:Qc(this,Br(n));return;case 2:wz(this,Br(n));return;case 3:bz(this,Br(n));return;case 4:Hst(this,u(n,471));return;case 5:!this.rb&&(this.rb=new Gm(this,s1,this)),xr(this.rb),!this.rb&&(this.rb=new Gm(this,s1,this)),is(this.rb,u(n,14));return;case 6:!this.vb&&(this.vb=new Rx(i1,this,6,7)),xr(this.vb),!this.vb&&(this.vb=new Rx(i1,this,6,7)),is(this.vb,u(n,14));return}gh(this,e-Jn((dn(),up)),yn((r=u(Dn(this,16),26),r||up),e),n)},l.vh=function(e){var n,r;if(e&&this.rb)for(r=new nr(this.rb);r.e!=r.i.gc();)n=dr(r),_t(n,351)&&(u(n,351).w=null);o6(this,64,e)},l.zh=function(){return dn(),up},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:Qc(this,null);return;case 2:wz(this,null);return;case 3:bz(this,null);return;case 4:Hst(this,null);return;case 5:!this.rb&&(this.rb=new Gm(this,s1,this)),xr(this.rb);return;case 6:!this.vb&&(this.vb=new Rx(i1,this,6,7)),xr(this.vb);return}fh(this,e-Jn((dn(),up)),yn((n=u(Dn(this,16),26),n||up),e))},l.Gh=function(){Mst(this)},l.Mh=function(){return!this.rb&&(this.rb=new Gm(this,s1,this)),this.rb},l.Nh=function(){return this.sb},l.Oh=function(){return this.ub},l.Ph=function(){return this.xb},l.Qh=function(){return this.yb},l.Rh=function(e){this.ub=e},l.Ib=function(){var e;return this.Db&64?J9(this):(e=new _h(J9(this)),e.a+=" (nsURI: ",go(e,this.yb),e.a+=", nsPrefix: ",go(e,this.xb),e.a+=")",e.a)},l.xb=null,l.yb=null,F(Mn,"EPackageImpl",179),D(555,179,{105:1,2016:1,555:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1},gce),l.q=!1,l.r=!1;var J4e=!1;F(M2,"ElkGraphPackageImpl",555),D(354,724,{105:1,413:1,160:1,137:1,470:1,354:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},ZT),l.Qg=function(e){return i4t(this,e)},l._g=function(e,n,r){switch(e){case 7:return LQt(this);case 8:return this.a}return f3t(this,e,n,r)},l.hh=function(e,n,r){var s;switch(n){case 7:return this.Cb&&(r=(s=this.Db>>16,s>=0?i4t(this,r):this.Cb.ih(this,-1-s,null,r))),nvt(this,u(e,160),r)}return jst(this,e,n,r)},l.jh=function(e,n,r){return n==7?nvt(this,null,r):Eit(this,e,n,r)},l.lh=function(e){switch(e){case 7:return!!LQt(this);case 8:return!hn("",this.a)}return m3t(this,e)},l.sh=function(e,n){switch(e){case 7:F5t(this,u(n,160));return;case 8:nyt(this,Br(n));return}v4t(this,e,n)},l.zh=function(){return Jc(),GAt},l.Bh=function(e){switch(e){case 7:F5t(this,null);return;case 8:nyt(this,"");return}T3t(this,e)},l.Ib=function(){return eoe(this)},l.a="",F(M2,"ElkLabelImpl",354),D(239,725,{105:1,413:1,82:1,160:1,33:1,470:1,239:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Vpt),l.Qg=function(e){return c4t(this,e)},l._g=function(e,n,r){switch(e){case 9:return!this.c&&(this.c=new fe(gl,this,9,9)),this.c;case 10:return!this.a&&(this.a=new fe(rs,this,10,11)),this.a;case 11:return es(this);case 12:return!this.b&&(this.b=new fe(Ys,this,12,3)),this.b;case 13:return Nn(),!this.a&&(this.a=new fe(rs,this,10,11)),this.a.i>0}return U3t(this,e,n,r)},l.hh=function(e,n,r){var s;switch(n){case 9:return!this.c&&(this.c=new fe(gl,this,9,9)),Zc(this.c,e,r);case 10:return!this.a&&(this.a=new fe(rs,this,10,11)),Zc(this.a,e,r);case 11:return this.Cb&&(r=(s=this.Db>>16,s>=0?c4t(this,r):this.Cb.ih(this,-1-s,null,r))),lwt(this,u(e,33),r);case 12:return!this.b&&(this.b=new fe(Ys,this,12,3)),Zc(this.b,e,r)}return h4t(this,e,n,r)},l.jh=function(e,n,r){switch(n){case 9:return!this.c&&(this.c=new fe(gl,this,9,9)),Ba(this.c,e,r);case 10:return!this.a&&(this.a=new fe(rs,this,10,11)),Ba(this.a,e,r);case 11:return lwt(this,null,r);case 12:return!this.b&&(this.b=new fe(Ys,this,12,3)),Ba(this.b,e,r)}return f4t(this,e,n,r)},l.lh=function(e){switch(e){case 9:return!!this.c&&this.c.i!=0;case 10:return!!this.a&&this.a.i!=0;case 11:return!!es(this);case 12:return!!this.b&&this.b.i!=0;case 13:return!this.a&&(this.a=new fe(rs,this,10,11)),this.a.i>0}return Fyt(this,e)},l.sh=function(e,n){switch(e){case 9:!this.c&&(this.c=new fe(gl,this,9,9)),xr(this.c),!this.c&&(this.c=new fe(gl,this,9,9)),is(this.c,u(n,14));return;case 10:!this.a&&(this.a=new fe(rs,this,10,11)),xr(this.a),!this.a&&(this.a=new fe(rs,this,10,11)),is(this.a,u(n,14));return;case 11:I5t(this,u(n,33));return;case 12:!this.b&&(this.b=new fe(Ys,this,12,3)),xr(this.b),!this.b&&(this.b=new fe(Ys,this,12,3)),is(this.b,u(n,14));return}x5t(this,e,n)},l.zh=function(){return Jc(),UAt},l.Bh=function(e){switch(e){case 9:!this.c&&(this.c=new fe(gl,this,9,9)),xr(this.c);return;case 10:!this.a&&(this.a=new fe(rs,this,10,11)),xr(this.a);return;case 11:I5t(this,null);return;case 12:!this.b&&(this.b=new fe(Ys,this,12,3)),xr(this.b);return}R3t(this,e)},l.Ib=function(){return X5t(this)},F(M2,"ElkNodeImpl",239),D(186,725,{105:1,413:1,82:1,160:1,118:1,470:1,186:1,94:1,92:1,90:1,56:1,108:1,49:1,97:1,114:1,115:1},Gpt),l.Qg=function(e){return s4t(this,e)},l._g=function(e,n,r){return e==9?T1(this):U3t(this,e,n,r)},l.hh=function(e,n,r){var s;switch(n){case 9:return this.Cb&&(r=(s=this.Db>>16,s>=0?s4t(this,r):this.Cb.ih(this,-1-s,null,r))),nwt(this,u(e,33),r)}return h4t(this,e,n,r)},l.jh=function(e,n,r){return n==9?nwt(this,null,r):f4t(this,e,n,r)},l.lh=function(e){return e==9?!!T1(this):Fyt(this,e)},l.sh=function(e,n){switch(e){case 9:D5t(this,u(n,33));return}x5t(this,e,n)},l.zh=function(){return Jc(),WAt},l.Bh=function(e){switch(e){case 9:D5t(this,null);return}R3t(this,e)},l.Ib=function(){return zue(this)},F(M2,"ElkPortImpl",186);var t5e=Ki(Ra,"BasicEMap/Entry");D(1092,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,114:1,115:1},aB),l.Fb=function(e){return this===e},l.cd=function(){return this.b},l.Hb=function(){return Pw(this)},l.Uh=function(e){ryt(this,u(e,146))},l._g=function(e,n,r){switch(e){case 0:return this.b;case 1:return this.c}return Xz(this,e,n,r)},l.lh=function(e){switch(e){case 0:return!!this.b;case 1:return this.c!=null}return fst(this,e)},l.sh=function(e,n){switch(e){case 0:ryt(this,u(n,146));return;case 1:ayt(this,n);return}Xst(this,e,n)},l.zh=function(){return Jc(),Sb},l.Bh=function(e){switch(e){case 0:ryt(this,null);return;case 1:ayt(this,null);return}Gst(this,e)},l.Sh=function(){var e;return this.a==-1&&(e=this.b,this.a=e?Hi(e):0),this.a},l.dd=function(){return this.c},l.Th=function(e){this.a=e},l.ed=function(e){var n;return n=this.c,ayt(this,e),n},l.Ib=function(){var e;return this.Db&64?mf(this):(e=new Mp,Gr(Gr(Gr(e,this.b?this.b.tg():_u),Uot),b9(this.c)),e.a)},l.a=-1,l.c=null;var Hv=F(M2,"ElkPropertyToValueMapEntryImpl",1092);D(984,1,{},oB),F(ma,"JsonAdapter",984),D(210,60,Q0,ud),F(ma,"JsonImportException",210),D(857,1,{},nae),F(ma,"JsonImporter",857),D(891,1,{},DGt),F(ma,"JsonImporter/lambda$0$Type",891),D(892,1,{},IGt),F(ma,"JsonImporter/lambda$1$Type",892),D(900,1,{},fzt),F(ma,"JsonImporter/lambda$10$Type",900),D(902,1,{},OGt),F(ma,"JsonImporter/lambda$11$Type",902),D(903,1,{},PGt),F(ma,"JsonImporter/lambda$12$Type",903),D(909,1,{},UXt),F(ma,"JsonImporter/lambda$13$Type",909),D(908,1,{},GXt),F(ma,"JsonImporter/lambda$14$Type",908),D(904,1,{},FGt),F(ma,"JsonImporter/lambda$15$Type",904),D(905,1,{},NGt),F(ma,"JsonImporter/lambda$16$Type",905),D(906,1,{},BGt),F(ma,"JsonImporter/lambda$17$Type",906),D(907,1,{},RGt),F(ma,"JsonImporter/lambda$18$Type",907),D(912,1,{},dzt),F(ma,"JsonImporter/lambda$19$Type",912),D(893,1,{},gzt),F(ma,"JsonImporter/lambda$2$Type",893),D(910,1,{},pzt),F(ma,"JsonImporter/lambda$20$Type",910),D(911,1,{},bzt),F(ma,"JsonImporter/lambda$21$Type",911),D(915,1,{},wzt),F(ma,"JsonImporter/lambda$22$Type",915),D(913,1,{},vzt),F(ma,"JsonImporter/lambda$23$Type",913),D(914,1,{},mzt),F(ma,"JsonImporter/lambda$24$Type",914),D(917,1,{},yzt),F(ma,"JsonImporter/lambda$25$Type",917),D(916,1,{},xzt),F(ma,"JsonImporter/lambda$26$Type",916),D(918,1,Un,jGt),l.td=function(e){ion(this.b,this.a,Br(e))},F(ma,"JsonImporter/lambda$27$Type",918),D(919,1,Un,$Gt),l.td=function(e){son(this.b,this.a,Br(e))},F(ma,"JsonImporter/lambda$28$Type",919),D(920,1,{},zGt),F(ma,"JsonImporter/lambda$29$Type",920),D(896,1,{},kzt),F(ma,"JsonImporter/lambda$3$Type",896),D(921,1,{},qGt),F(ma,"JsonImporter/lambda$30$Type",921),D(922,1,{},Ezt),F(ma,"JsonImporter/lambda$31$Type",922),D(923,1,{},Tzt),F(ma,"JsonImporter/lambda$32$Type",923),D(924,1,{},Czt),F(ma,"JsonImporter/lambda$33$Type",924),D(925,1,{},_zt),F(ma,"JsonImporter/lambda$34$Type",925),D(859,1,{},Szt),F(ma,"JsonImporter/lambda$35$Type",859),D(929,1,{},BYt),F(ma,"JsonImporter/lambda$36$Type",929),D(926,1,Un,Azt),l.td=function(e){can(this.a,u(e,469))},F(ma,"JsonImporter/lambda$37$Type",926),D(927,1,Un,YGt),l.td=function(e){NXe(this.a,this.b,u(e,202))},F(ma,"JsonImporter/lambda$38$Type",927),D(928,1,Un,KGt),l.td=function(e){BXe(this.a,this.b,u(e,202))},F(ma,"JsonImporter/lambda$39$Type",928),D(894,1,{},Lzt),F(ma,"JsonImporter/lambda$4$Type",894),D(930,1,Un,Mzt),l.td=function(e){uan(this.a,u(e,8))},F(ma,"JsonImporter/lambda$40$Type",930),D(895,1,{},Dzt),F(ma,"JsonImporter/lambda$5$Type",895),D(899,1,{},Izt),F(ma,"JsonImporter/lambda$6$Type",899),D(897,1,{},Ozt),F(ma,"JsonImporter/lambda$7$Type",897),D(898,1,{},Pzt),F(ma,"JsonImporter/lambda$8$Type",898),D(901,1,{},Fzt),F(ma,"JsonImporter/lambda$9$Type",901),D(948,1,Un,Nzt),l.td=function(e){Vx(this.a,new Um(Br(e)))},F(ma,"JsonMetaDataConverter/lambda$0$Type",948),D(949,1,Un,Bzt),l.td=function(e){Cnn(this.a,u(e,237))},F(ma,"JsonMetaDataConverter/lambda$1$Type",949),D(950,1,Un,Rzt),l.td=function(e){kin(this.a,u(e,149))},F(ma,"JsonMetaDataConverter/lambda$2$Type",950),D(951,1,Un,jzt),l.td=function(e){_nn(this.a,u(e,175))},F(ma,"JsonMetaDataConverter/lambda$3$Type",951),D(237,22,{3:1,35:1,22:1,237:1},Px);var oU,cU,Dft,uU,lU,hU,Ift,Oft,fU=jr(qI,"GraphFeature",237,Hr,Yon,Xtn),e5e;D(13,1,{35:1,146:1},Vi,Ps,mn,eo),l.wd=function(e){return FQe(this,u(e,146))},l.Fb=function(e){return dQt(this,e)},l.wg=function(){return Ie(this)},l.tg=function(){return this.b},l.Hb=function(){return Vg(this.b)},l.Ib=function(){return this.b},F(qI,"Property",13),D(818,1,Oi,Ept),l.ue=function(e,n){return Jln(this,u(e,94),u(n,94))},l.Fb=function(e){return this===e},l.ve=function(){return new dt(this)},F(qI,"PropertyHolderComparator",818),D(695,1,sa,Tpt),l.Nb=function(e){ba(this,e)},l.Pb=function(){return uon(this)},l.Qb=function(){IHt()},l.Ob=function(){return!!this.a},F(DH,"ElkGraphUtil/AncestorIterator",695);var KAt=Ki(Ra,"EList");D(67,52,{20:1,28:1,52:1,14:1,15:1,67:1,58:1}),l.Vc=function(e,n){n_(this,e,n)},l.Fc=function(e){return Dr(this,e)},l.Wc=function(e,n){return Syt(this,e,n)},l.Gc=function(e){return is(this,e)},l.Zh=function(){return new Bx(this)},l.$h=function(){return new $M(this)},l._h=function(e){return DD(this,e)},l.ai=function(){return!0},l.bi=function(e,n){},l.ci=function(){},l.di=function(e,n){Yrt(this,e,n)},l.ei=function(e,n,r){},l.fi=function(e,n){},l.gi=function(e,n,r){},l.Fb=function(e){return Sue(this,e)},l.Hb=function(){return kyt(this)},l.hi=function(){return!1},l.Kc=function(){return new nr(this)},l.Yc=function(){return new Nx(this)},l.Zc=function(e){var n;if(n=this.gc(),e<0||e>n)throw it(new qm(e,n));return new Jnt(this,e)},l.ji=function(e,n){this.ii(e,this.Xc(n))},l.Mc=function(e){return X$(this,e)},l.li=function(e,n){return n},l._c=function(e,n){return h4(this,e,n)},l.Ib=function(){return g3t(this)},l.ni=function(){return!0},l.oi=function(e,n){return sE(this,n)},F(Ra,"AbstractEList",67),D(63,67,Ld,ox,Qw,gyt),l.Vh=function(e,n){return $st(this,e,n)},l.Wh=function(e){return Lse(this,e)},l.Xh=function(e,n){UD(this,e,n)},l.Yh=function(e){gD(this,e)},l.pi=function(e){return Fmt(this,e)},l.$b=function(){z9(this)},l.Hc=function(e){return yE(this,e)},l.Xb=function(e){return At(this,e)},l.qi=function(e){var n,r,s;++this.j,r=this.g==null?0:this.g.length,e>r&&(s=this.g,n=r+(r/2|0)+4,n=0?(this.$c(n),!0):!1},l.mi=function(e,n){return this.Ui(e,this.oi(e,n))},l.gc=function(){return this.Vi()},l.Pc=function(){return this.Wi()},l.Qc=function(e){return this.Xi(e)},l.Ib=function(){return this.Yi()},F(Ra,"DelegatingEList",1995),D(1996,1995,E0e),l.Vh=function(e,n){return sxt(this,e,n)},l.Wh=function(e){return this.Vh(this.Vi(),e)},l.Xh=function(e,n){fce(this,e,n)},l.Yh=function(e){rce(this,e)},l.ai=function(){return!this.bj()},l.$b=function(){A_(this)},l.Zi=function(e,n,r,s,o){return new pQt(this,e,n,r,s,o)},l.$i=function(e){mi(this.Ai(),e)},l._i=function(){return null},l.aj=function(){return-1},l.Ai=function(){return null},l.bj=function(){return!1},l.cj=function(e,n){return n},l.dj=function(e,n){return n},l.ej=function(){return!1},l.fj=function(){return!this.Ri()},l.ii=function(e,n){var r,s;return this.ej()?(s=this.fj(),r=B4t(this,e,n),this.$i(this.Zi(7,pe(n),r,e,s)),r):B4t(this,e,n)},l.$c=function(e){var n,r,s,o;return this.ej()?(r=null,s=this.fj(),n=this.Zi(4,o=Hj(this,e),null,e,s),this.bj()&&o?(r=this.dj(o,r),r?(r.Ei(n),r.Fi()):this.$i(n)):r?(r.Ei(n),r.Fi()):this.$i(n),o):(o=Hj(this,e),this.bj()&&o&&(r=this.dj(o,null),r&&r.Fi()),o)},l.mi=function(e,n){return yle(this,e,n)},F(L6,"DelegatingNotifyingListImpl",1996),D(143,1,nO),l.Ei=function(e){return T4t(this,e)},l.Fi=function(){rit(this)},l.xi=function(){return this.d},l._i=function(){return null},l.gj=function(){return null},l.yi=function(e){return-1},l.zi=function(){return aue(this)},l.Ai=function(){return null},l.Bi=function(){return $5t(this)},l.Ci=function(){return this.o<0?this.o<-2?-2-this.o-1:-1:this.o},l.hj=function(){return!1},l.Di=function(e){var n,r,s,o,h,d,v,k,C,M,j;switch(this.d){case 1:case 2:switch(o=e.xi(),o){case 1:case 2:if(h=e.Ai(),Vt(h)===Vt(this.Ai())&&this.yi(null)==e.yi(null))return this.g=e.zi(),e.xi()==1&&(this.d=1),!0}case 4:{switch(o=e.xi(),o){case 4:{if(h=e.Ai(),Vt(h)===Vt(this.Ai())&&this.yi(null)==e.yi(null))return C=kxt(this),k=this.o<0?this.o<-2?-2-this.o-1:-1:this.o,d=e.Ci(),this.d=6,j=new Qw(2),k<=d?(Dr(j,this.n),Dr(j,e.Bi()),this.g=lt(ct(Cr,1),Xr,25,15,[this.o=k,d+1])):(Dr(j,e.Bi()),Dr(j,this.n),this.g=lt(ct(Cr,1),Xr,25,15,[this.o=d,k])),this.n=j,C||(this.o=-2-this.o-1),!0;break}}break}case 6:{switch(o=e.xi(),o){case 4:{if(h=e.Ai(),Vt(h)===Vt(this.Ai())&&this.yi(null)==e.yi(null)){for(C=kxt(this),d=e.Ci(),M=u(this.g,48),s=Nt(Cr,Xr,25,M.length+1,15,1),n=0;n>>0,n.toString(16))),s.a+=" (eventType: ",this.d){case 1:{s.a+="SET";break}case 2:{s.a+="UNSET";break}case 3:{s.a+="ADD";break}case 5:{s.a+="ADD_MANY";break}case 4:{s.a+="REMOVE";break}case 6:{s.a+="REMOVE_MANY";break}case 7:{s.a+="MOVE";break}case 8:{s.a+="REMOVING_ADAPTER";break}case 9:{s.a+="RESOLVE";break}default:{xet(s,this.d);break}}if(Yue(this)&&(s.a+=", touch: true"),s.a+=", position: ",xet(s,this.o<0?this.o<-2?-2-this.o-1:-1:this.o),s.a+=", notifier: ",l9(s,this.Ai()),s.a+=", feature: ",l9(s,this._i()),s.a+=", oldValue: ",l9(s,$5t(this)),s.a+=", newValue: ",this.d==6&&_t(this.g,48)){for(r=u(this.g,48),s.a+="[",e=0;e10?((!this.b||this.c.j!=this.a)&&(this.b=new E9(this),this.a=this.j),I0(this.b,e)):yE(this,e)},l.ni=function(){return!0},l.a=0,F(Ra,"AbstractEList/1",953),D(295,73,bot,qm),F(Ra,"AbstractEList/BasicIndexOutOfBoundsException",295),D(40,1,sa,nr),l.Nb=function(e){ba(this,e)},l.mj=function(){if(this.i.j!=this.f)throw it(new rh)},l.nj=function(){return dr(this)},l.Ob=function(){return this.e!=this.i.gc()},l.Pb=function(){return this.nj()},l.Qb=function(){f_(this)},l.e=0,l.f=0,l.g=-1,F(Ra,"AbstractEList/EIterator",40),D(278,40,n0,Nx,Jnt),l.Qb=function(){f_(this)},l.Rb=function(e){Die(this,e)},l.oj=function(){var e;try{return e=this.d.Xb(--this.e),this.mj(),this.g=this.e,e}catch(n){throw n=Wi(n),_t(n,73)?(this.mj(),it(new lc)):it(n)}},l.pj=function(e){Ise(this,e)},l.Sb=function(){return this.e!=0},l.Tb=function(){return this.e},l.Ub=function(){return this.oj()},l.Vb=function(){return this.e-1},l.Wb=function(e){this.pj(e)},F(Ra,"AbstractEList/EListIterator",278),D(341,40,sa,Bx),l.nj=function(){return dst(this)},l.Qb=function(){throw it(new Or)},F(Ra,"AbstractEList/NonResolvingEIterator",341),D(385,278,n0,$M,wwt),l.Rb=function(e){throw it(new Or)},l.nj=function(){var e;try{return e=this.c.ki(this.e),this.mj(),this.g=this.e++,e}catch(n){throw n=Wi(n),_t(n,73)?(this.mj(),it(new lc)):it(n)}},l.oj=function(){var e;try{return e=this.c.ki(--this.e),this.mj(),this.g=this.e,e}catch(n){throw n=Wi(n),_t(n,73)?(this.mj(),it(new lc)):it(n)}},l.Qb=function(){throw it(new Or)},l.Wb=function(e){throw it(new Or)},F(Ra,"AbstractEList/NonResolvingEListIterator",385),D(1982,67,T0e),l.Vh=function(e,n){var r,s,o,h,d,v,k,C,M,j,H;if(o=n.gc(),o!=0){for(C=u(Dn(this.a,4),126),M=C==null?0:C.length,H=M+o,s=Fit(this,H),j=M-e,j>0&&Dc(C,e,s,e+o,j),k=n.Kc(),d=0;dr)throw it(new qm(e,r));return new _Xt(this,e)},l.$b=function(){var e,n;++this.j,e=u(Dn(this.a,4),126),n=e==null?0:e.length,bE(this,null),Yrt(this,n,e)},l.Hc=function(e){var n,r,s,o,h;if(n=u(Dn(this.a,4),126),n!=null){if(e!=null){for(s=n,o=0,h=s.length;o=r)throw it(new qm(e,r));return n[e]},l.Xc=function(e){var n,r,s;if(n=u(Dn(this.a,4),126),n!=null){if(e!=null){for(r=0,s=n.length;rr)throw it(new qm(e,r));return new CXt(this,e)},l.ii=function(e,n){var r,s,o;if(r=jie(this),o=r==null?0:r.length,e>=o)throw it(new yo(iut+e+D2+o));if(n>=o)throw it(new yo(sut+n+D2+o));return s=r[n],e!=n&&(e0&&Dc(e,0,n,0,r),n},l.Qc=function(e){var n,r,s;return n=u(Dn(this.a,4),126),s=n==null?0:n.length,s>0&&(e.lengths&&ts(e,s,null),e};var n5e;F(Ra,"ArrayDelegatingEList",1982),D(1038,40,sa,FJt),l.mj=function(){if(this.b.j!=this.f||Vt(u(Dn(this.b.a,4),126))!==Vt(this.a))throw it(new rh)},l.Qb=function(){f_(this),this.a=u(Dn(this.b.a,4),126)},F(Ra,"ArrayDelegatingEList/EIterator",1038),D(706,278,n0,KKt,CXt),l.mj=function(){if(this.b.j!=this.f||Vt(u(Dn(this.b.a,4),126))!==Vt(this.a))throw it(new rh)},l.pj=function(e){Ise(this,e),this.a=u(Dn(this.b.a,4),126)},l.Qb=function(){f_(this),this.a=u(Dn(this.b.a,4),126)},F(Ra,"ArrayDelegatingEList/EListIterator",706),D(1039,341,sa,NJt),l.mj=function(){if(this.b.j!=this.f||Vt(u(Dn(this.b.a,4),126))!==Vt(this.a))throw it(new rh)},F(Ra,"ArrayDelegatingEList/NonResolvingEIterator",1039),D(707,385,n0,XKt,_Xt),l.mj=function(){if(this.b.j!=this.f||Vt(u(Dn(this.b.a,4),126))!==Vt(this.a))throw it(new rh)},F(Ra,"ArrayDelegatingEList/NonResolvingEListIterator",707),D(606,295,bot,nnt),F(Ra,"BasicEList/BasicIndexOutOfBoundsException",606),D(696,63,Ld,n2t),l.Vc=function(e,n){throw it(new Or)},l.Fc=function(e){throw it(new Or)},l.Wc=function(e,n){throw it(new Or)},l.Gc=function(e){throw it(new Or)},l.$b=function(){throw it(new Or)},l.qi=function(e){throw it(new Or)},l.Kc=function(){return this.Zh()},l.Yc=function(){return this.$h()},l.Zc=function(e){return this._h(e)},l.ii=function(e,n){throw it(new Or)},l.ji=function(e,n){throw it(new Or)},l.$c=function(e){throw it(new Or)},l.Mc=function(e){throw it(new Or)},l._c=function(e,n){throw it(new Or)},F(Ra,"BasicEList/UnmodifiableEList",696),D(705,1,{3:1,20:1,14:1,15:1,58:1,589:1}),l.Vc=function(e,n){CQe(this,e,u(n,42))},l.Fc=function(e){return hZe(this,u(e,42))},l.Jc=function(e){va(this,e)},l.Xb=function(e){return u(At(this.c,e),133)},l.ii=function(e,n){return u(this.c.ii(e,n),42)},l.ji=function(e,n){_Qe(this,e,u(n,42))},l.Lc=function(){return new Tn(null,new _n(this,16))},l.$c=function(e){return u(this.c.$c(e),42)},l._c=function(e,n){return mnn(this,e,u(n,42))},l.ad=function(e){r4(this,e)},l.Nc=function(){return new _n(this,16)},l.Oc=function(){return new Tn(null,new _n(this,16))},l.Wc=function(e,n){return this.c.Wc(e,n)},l.Gc=function(e){return this.c.Gc(e)},l.$b=function(){this.c.$b()},l.Hc=function(e){return this.c.Hc(e)},l.Ic=function(e){return ND(this.c,e)},l.qj=function(){var e,n,r;if(this.d==null){for(this.d=Nt(XAt,R8t,63,2*this.f+1,0,1),r=this.e,this.f=0,n=this.c.Kc();n.e!=n.i.gc();)e=u(n.nj(),133),Jz(this,e);this.e=r}},l.Fb=function(e){return xYt(this,e)},l.Hb=function(){return kyt(this.c)},l.Xc=function(e){return this.c.Xc(e)},l.rj=function(){this.c=new zzt(this)},l.dc=function(){return this.f==0},l.Kc=function(){return this.c.Kc()},l.Yc=function(){return this.c.Yc()},l.Zc=function(e){return this.c.Zc(e)},l.sj=function(){return wD(this)},l.tj=function(e,n,r){return new RYt(e,n,r)},l.uj=function(){return new kp},l.Mc=function(e){return tne(this,e)},l.gc=function(){return this.f},l.bd=function(e,n){return new Qd(this.c,e,n)},l.Pc=function(){return this.c.Pc()},l.Qc=function(e){return this.c.Qc(e)},l.Ib=function(){return g3t(this.c)},l.e=0,l.f=0,F(Ra,"BasicEMap",705),D(1033,63,Ld,zzt),l.bi=function(e,n){cKe(this,u(n,133))},l.ei=function(e,n,r){var s;++(s=this,u(n,133),s).a.e},l.fi=function(e,n){uKe(this,u(n,133))},l.gi=function(e,n,r){ZQe(this,u(n,133),u(r,133))},l.di=function(e,n){Vne(this.a)},F(Ra,"BasicEMap/1",1033),D(1034,63,Ld,kp),l.ri=function(e){return Nt(y6n,C0e,612,e,0,1)},F(Ra,"BasicEMap/2",1034),D(1035,N1,zu,qzt),l.$b=function(){this.a.c.$b()},l.Hc=function(e){return ist(this.a,e)},l.Kc=function(){return this.a.f==0?(y8(),pP.a):new EHt(this.a)},l.Mc=function(e){var n;return n=this.a.f,qz(this.a,e),this.a.f!=n},l.gc=function(){return this.a.f},F(Ra,"BasicEMap/3",1035),D(1036,28,xy,Hzt),l.$b=function(){this.a.c.$b()},l.Hc=function(e){return Aue(this.a,e)},l.Kc=function(){return this.a.f==0?(y8(),pP.a):new THt(this.a)},l.gc=function(){return this.a.f},F(Ra,"BasicEMap/4",1036),D(1037,N1,zu,Vzt),l.$b=function(){this.a.c.$b()},l.Hc=function(e){var n,r,s,o,h,d,v,k,C;if(this.a.f>0&&_t(e,42)&&(this.a.qj(),k=u(e,42),v=k.cd(),o=v==null?0:Hi(v),h=rwt(this.a,o),n=this.a.d[h],n)){for(r=u(n.g,367),C=n.i,d=0;d"+this.c},l.a=0;var y6n=F(Ra,"BasicEMap/EntryImpl",612);D(536,1,{},Ik),F(Ra,"BasicEMap/View",536);var pP;D(768,1,{}),l.Fb=function(e){return k5t((wn(),io),e)},l.Hb=function(){return Pyt((wn(),io))},l.Ib=function(){return eb((wn(),io))},F(Ra,"ECollections/BasicEmptyUnmodifiableEList",768),D(1312,1,n0,cB),l.Nb=function(e){ba(this,e)},l.Rb=function(e){throw it(new Or)},l.Ob=function(){return!1},l.Sb=function(){return!1},l.Pb=function(){throw it(new lc)},l.Tb=function(){return 0},l.Ub=function(){throw it(new lc)},l.Vb=function(){return-1},l.Qb=function(){throw it(new Or)},l.Wb=function(e){throw it(new Or)},F(Ra,"ECollections/BasicEmptyUnmodifiableEList/1",1312),D(1310,768,{20:1,14:1,15:1,58:1},Pqt),l.Vc=function(e,n){GHt()},l.Fc=function(e){return UHt()},l.Wc=function(e,n){return WHt()},l.Gc=function(e){return YHt()},l.$b=function(){KHt()},l.Hc=function(e){return!1},l.Ic=function(e){return!1},l.Jc=function(e){va(this,e)},l.Xb=function(e){return s2t((wn(),e)),null},l.Xc=function(e){return-1},l.dc=function(){return!0},l.Kc=function(){return this.a},l.Yc=function(){return this.a},l.Zc=function(e){return this.a},l.ii=function(e,n){return XHt()},l.ji=function(e,n){QHt()},l.Lc=function(){return new Tn(null,new _n(this,16))},l.$c=function(e){return ZHt()},l.Mc=function(e){return JHt()},l._c=function(e,n){return tVt()},l.gc=function(){return 0},l.ad=function(e){r4(this,e)},l.Nc=function(){return new _n(this,16)},l.Oc=function(){return new Tn(null,new _n(this,16))},l.bd=function(e,n){return wn(),new Qd(io,e,n)},l.Pc=function(){return svt((wn(),io))},l.Qc=function(e){return wn(),eI(io,e)},F(Ra,"ECollections/EmptyUnmodifiableEList",1310),D(1311,768,{20:1,14:1,15:1,58:1,589:1},Fqt),l.Vc=function(e,n){GHt()},l.Fc=function(e){return UHt()},l.Wc=function(e,n){return WHt()},l.Gc=function(e){return YHt()},l.$b=function(){KHt()},l.Hc=function(e){return!1},l.Ic=function(e){return!1},l.Jc=function(e){va(this,e)},l.Xb=function(e){return s2t((wn(),e)),null},l.Xc=function(e){return-1},l.dc=function(){return!0},l.Kc=function(){return this.a},l.Yc=function(){return this.a},l.Zc=function(e){return this.a},l.ii=function(e,n){return XHt()},l.ji=function(e,n){QHt()},l.Lc=function(){return new Tn(null,new _n(this,16))},l.$c=function(e){return ZHt()},l.Mc=function(e){return JHt()},l._c=function(e,n){return tVt()},l.gc=function(){return 0},l.ad=function(e){r4(this,e)},l.Nc=function(){return new _n(this,16)},l.Oc=function(){return new Tn(null,new _n(this,16))},l.bd=function(e,n){return wn(),new Qd(io,e,n)},l.Pc=function(){return svt((wn(),io))},l.Qc=function(e){return wn(),eI(io,e)},l.sj=function(){return wn(),wn(),u0},F(Ra,"ECollections/EmptyUnmodifiableEMap",1311);var ZAt=Ki(Ra,"Enumerator"),dU;D(281,1,{281:1},fat),l.Fb=function(e){var n;return this===e?!0:_t(e,281)?(n=u(e,281),this.f==n.f&&$en(this.i,n.i)&&jnt(this.a,this.f&256?n.f&256?n.a:null:n.f&256?null:n.a)&&jnt(this.d,n.d)&&jnt(this.g,n.g)&&jnt(this.e,n.e)&&Pfn(this,n)):!1},l.Hb=function(){return this.f},l.Ib=function(){return sle(this)},l.f=0;var r5e=0,i5e=0,s5e=0,a5e=0,JAt=0,tLt=0,eLt=0,nLt=0,rLt=0,o5e,oA=0,cA=0,c5e=0,u5e=0,gU,iLt;F(Ra,"URI",281),D(1091,43,A4,Nqt),l.zc=function(e,n){return u(ko(this,Br(e),u(n,281)),281)},F(Ra,"URI/URICache",1091),D(497,63,Ld,Ok,Gj),l.hi=function(){return!0},F(Ra,"UniqueEList",497),D(581,60,Q0,W$),F(Ra,"WrappedException",581);var Zr=Ki(ph,A0e),t3=Ki(ph,L0e),Mu=Ki(ph,M0e),e3=Ki(ph,D0e),s1=Ki(ph,I0e),Uh=Ki(ph,"EClass"),Nft=Ki(ph,"EDataType"),l5e;D(1183,43,A4,Bqt),l.xc=function(e){return ra(e)?Nc(this,e):ec(Lo(this.f,e))},F(ph,"EDataType/Internal/ConversionDelegate/Factory/Registry/Impl",1183);var pU=Ki(ph,"EEnum"),ag=Ki(ph,O0e),ho=Ki(ph,P0e),Wh=Ki(ph,F0e),Yh,Vv=Ki(ph,N0e),n3=Ki(ph,B0e);D(1029,1,{},nJ),l.Ib=function(){return"NIL"},F(ph,"EStructuralFeature/Internal/DynamicValueHolder/1",1029);var h5e;D(1028,43,A4,Rqt),l.xc=function(e){return ra(e)?Nc(this,e):ec(Lo(this.f,e))},F(ph,"EStructuralFeature/Internal/SettingDelegate/Factory/Registry/Impl",1028);var hu=Ki(ph,R0e),Z6=Ki(ph,"EValidator/PatternMatcher"),sLt,aLt,Ln,ap,r3,Lb,f5e,d5e,g5e,Mb,op,Db,Gv,W1,p5e,b5e,Kh,cp,w5e,up,i3,l5,Qa,v5e,m5e,Uv,bU=Ki($i,"FeatureMap/Entry");D(535,1,{72:1},lj),l.ak=function(){return this.a},l.dd=function(){return this.b},F(Mn,"BasicEObjectImpl/1",535),D(1027,1,hut,XGt),l.Wj=function(e){return Urt(this.a,this.b,e)},l.fj=function(){return MQt(this.a,this.b)},l.Wb=function(e){zvt(this.a,this.b,e)},l.Xj=function(){Nnn(this.a,this.b)},F(Mn,"BasicEObjectImpl/4",1027),D(1983,1,{108:1}),l.bk=function(e){this.e=e==0?y5e:Nt(Qn,De,1,e,5,1)},l.Ch=function(e){return this.e[e]},l.Dh=function(e,n){this.e[e]=n},l.Eh=function(e){this.e[e]=null},l.ck=function(){return this.c},l.dk=function(){throw it(new Or)},l.ek=function(){throw it(new Or)},l.fk=function(){return this.d},l.gk=function(){return this.e!=null},l.hk=function(e){this.c=e},l.ik=function(e){throw it(new Or)},l.jk=function(e){throw it(new Or)},l.kk=function(e){this.d=e};var y5e;F(Mn,"BasicEObjectImpl/EPropertiesHolderBaseImpl",1983),D(185,1983,{108:1},nh),l.dk=function(){return this.a},l.ek=function(){return this.b},l.ik=function(e){this.a=e},l.jk=function(e){this.b=e},F(Mn,"BasicEObjectImpl/EPropertiesHolderImpl",185),D(506,97,jde,Pk),l.Kg=function(){return this.f},l.Pg=function(){return this.k},l.Rg=function(e,n){this.g=e,this.i=n},l.Tg=function(){return this.j&2?this.ph().ck():this.zh()},l.Vg=function(){return this.i},l.Mg=function(){return(this.j&1)!=0},l.eh=function(){return this.g},l.kh=function(){return(this.j&4)!=0},l.ph=function(){return!this.k&&(this.k=new nh),this.k},l.th=function(e){this.ph().hk(e),e?this.j|=2:this.j&=-3},l.vh=function(e){this.ph().jk(e),e?this.j|=4:this.j&=-5},l.zh=function(){return(Hp(),Ln).S},l.i=0,l.j=1,F(Mn,"EObjectImpl",506),D(780,506,{105:1,92:1,90:1,56:1,108:1,49:1,97:1},zwt),l.Ch=function(e){return this.e[e]},l.Dh=function(e,n){this.e[e]=n},l.Eh=function(e){this.e[e]=null},l.Tg=function(){return this.d},l.Yg=function(e){return Gi(this.d,e)},l.$g=function(){return this.d},l.dh=function(){return this.e!=null},l.ph=function(){return!this.k&&(this.k=new uB),this.k},l.th=function(e){this.d=e},l.yh=function(){var e;return this.e==null&&(e=Jn(this.d),this.e=e==0?x5e:Nt(Qn,De,1,e,5,1)),this},l.Ah=function(){return 0};var x5e;F(Mn,"DynamicEObjectImpl",780),D(1376,780,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1},hKt),l.Fb=function(e){return this===e},l.Hb=function(){return Pw(this)},l.th=function(e){this.d=e,this.b=mI(e,"key"),this.c=mI(e,Z_)},l.Sh=function(){var e;return this.a==-1&&(e=iit(this,this.b),this.a=e==null?0:Hi(e)),this.a},l.cd=function(){return iit(this,this.b)},l.dd=function(){return iit(this,this.c)},l.Th=function(e){this.a=e},l.Uh=function(e){zvt(this,this.b,e)},l.ed=function(e){var n;return n=iit(this,this.c),zvt(this,this.c,e),n},l.a=0,F(Mn,"DynamicEObjectImpl/BasicEMapEntry",1376),D(1377,1,{108:1},uB),l.bk=function(e){throw it(new Or)},l.Ch=function(e){throw it(new Or)},l.Dh=function(e,n){throw it(new Or)},l.Eh=function(e){throw it(new Or)},l.ck=function(){throw it(new Or)},l.dk=function(){return this.a},l.ek=function(){return this.b},l.fk=function(){return this.c},l.gk=function(){throw it(new Or)},l.hk=function(e){throw it(new Or)},l.ik=function(e){this.a=e},l.jk=function(e){this.b=e},l.kk=function(e){this.c=e},F(Mn,"DynamicEObjectImpl/DynamicEPropertiesHolderImpl",1377),D(510,150,{105:1,92:1,90:1,590:1,147:1,56:1,108:1,49:1,97:1,510:1,150:1,114:1,115:1},lB),l.Qg=function(e){return a4t(this,e)},l._g=function(e,n,r){var s;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.d;case 2:return r?(!this.b&&(this.b=new kl((dn(),Qa),cc,this)),this.b):(!this.b&&(this.b=new kl((dn(),Qa),cc,this)),wD(this.b));case 3:return FQt(this);case 4:return!this.a&&(this.a=new As(_b,this,4)),this.a;case 5:return!this.c&&(this.c=new Y3(_b,this,5)),this.c}return uh(this,e-Jn((dn(),ap)),yn((s=u(Dn(this,16),26),s||ap),e),n,r)},l.hh=function(e,n,r){var s,o,h;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r);case 3:return this.Cb&&(r=(o=this.Db>>16,o>=0?a4t(this,r):this.Cb.ih(this,-1-o,null,r))),rvt(this,u(e,147),r)}return h=u(yn((s=u(Dn(this,16),26),s||(dn(),ap)),n),66),h.Nj().Qj(this,su(this),n-Jn((dn(),ap)),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 2:return!this.b&&(this.b=new kl((dn(),Qa),cc,this)),Oj(this.b,e,r);case 3:return rvt(this,null,r);case 4:return!this.a&&(this.a=new As(_b,this,4)),Ba(this.a,e,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),ap)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),ap)),e,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.d!=null;case 2:return!!this.b&&this.b.f!=0;case 3:return!!FQt(this);case 4:return!!this.a&&this.a.i!=0;case 5:return!!this.c&&this.c.i!=0}return oh(this,e-Jn((dn(),ap)),yn((n=u(Dn(this,16),26),n||ap),e))},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:Cen(this,Br(n));return;case 2:!this.b&&(this.b=new kl((dn(),Qa),cc,this)),xz(this.b,n);return;case 3:Kce(this,u(n,147));return;case 4:!this.a&&(this.a=new As(_b,this,4)),xr(this.a),!this.a&&(this.a=new As(_b,this,4)),is(this.a,u(n,14));return;case 5:!this.c&&(this.c=new Y3(_b,this,5)),xr(this.c),!this.c&&(this.c=new Y3(_b,this,5)),is(this.c,u(n,14));return}gh(this,e-Jn((dn(),ap)),yn((r=u(Dn(this,16),26),r||ap),e),n)},l.zh=function(){return dn(),ap},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:oyt(this,null);return;case 2:!this.b&&(this.b=new kl((dn(),Qa),cc,this)),this.b.c.$b();return;case 3:Kce(this,null);return;case 4:!this.a&&(this.a=new As(_b,this,4)),xr(this.a);return;case 5:!this.c&&(this.c=new Y3(_b,this,5)),xr(this.c);return}fh(this,e-Jn((dn(),ap)),yn((n=u(Dn(this,16),26),n||ap),e))},l.Ib=function(){return lie(this)},l.d=null,F(Mn,"EAnnotationImpl",510),D(151,705,j8t,_l),l.Xh=function(e,n){oQe(this,e,u(n,42))},l.lk=function(e,n){return eJe(this,u(e,42),n)},l.pi=function(e){return u(u(this.c,69).pi(e),133)},l.Zh=function(){return u(this.c,69).Zh()},l.$h=function(){return u(this.c,69).$h()},l._h=function(e){return u(this.c,69)._h(e)},l.mk=function(e,n){return Oj(this,e,n)},l.Wj=function(e){return u(this.c,76).Wj(e)},l.rj=function(){},l.fj=function(){return u(this.c,76).fj()},l.tj=function(e,n,r){var s;return s=u(Rl(this.b).Nh().Jh(this.b),133),s.Th(e),s.Uh(n),s.ed(r),s},l.uj=function(){return new _pt(this)},l.Wb=function(e){xz(this,e)},l.Xj=function(){u(this.c,76).Xj()},F($i,"EcoreEMap",151),D(158,151,j8t,kl),l.qj=function(){var e,n,r,s,o,h;if(this.d==null){for(h=Nt(XAt,R8t,63,2*this.f+1,0,1),r=this.c.Kc();r.e!=r.i.gc();)n=u(r.nj(),133),s=n.Sh(),o=(s&wi)%h.length,e=h[o],!e&&(e=h[o]=new _pt(this)),e.Fc(n);this.d=h}},F(Mn,"EAnnotationImpl/1",158),D(284,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,472:1,49:1,97:1,150:1,284:1,114:1,115:1}),l._g=function(e,n,r){var s,o;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Nn(),!!(this.Bb&256);case 3:return Nn(),!!(this.Bb&512);case 4:return pe(this.s);case 5:return pe(this.t);case 6:return Nn(),!!this.$j();case 7:return Nn(),o=this.s,o>=1;case 8:return n?Dh(this):this.r;case 9:return this.q}return uh(this,e-Jn(this.zh()),yn((s=u(Dn(this,16),26),s||this.zh()),e),n,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 9:return nrt(this,r)}return o=u(yn((s=u(Dn(this,16),26),s||this.zh()),n),66),o.Nj().Rj(this,su(this),n-Jn(this.zh()),e,r)},l.lh=function(e){var n,r;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return(this.Bb&256)==0;case 3:return(this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return this.$j();case 7:return r=this.s,r>=1;case 8:return!!this.r&&!this.q.e&&qw(this.q).i==0;case 9:return!!this.q&&!(this.r&&!this.q.e&&qw(this.q).i==0)}return oh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.sh=function(e,n){var r,s;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:this.Lh(Br(n));return;case 2:zg(this,je(Re(n)));return;case 3:qg(this,je(Re(n)));return;case 4:Rg(this,u(n,19).a);return;case 5:this.ok(u(n,19).a);return;case 8:b2(this,u(n,138));return;case 9:s=F1(this,u(n,87),null),s&&s.Fi();return}gh(this,e-Jn(this.zh()),yn((r=u(Dn(this,16),26),r||this.zh()),e),n)},l.zh=function(){return dn(),m5e},l.Bh=function(e){var n,r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:this.Lh(null);return;case 2:zg(this,!0);return;case 3:qg(this,!0);return;case 4:Rg(this,0);return;case 5:this.ok(1);return;case 8:b2(this,null);return;case 9:r=F1(this,null,null),r&&r.Fi();return}fh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.Gh=function(){Dh(this),this.Bb|=1},l.Yj=function(){return Dh(this)},l.Zj=function(){return this.t},l.$j=function(){var e;return e=this.t,e>1||e==-1},l.hi=function(){return(this.Bb&512)!=0},l.nk=function(e,n){return e3t(this,e,n)},l.ok=function(e){ry(this,e)},l.Ib=function(){return f5t(this)},l.s=0,l.t=1,F(Mn,"ETypedElementImpl",284),D(449,284,{105:1,92:1,90:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,449:1,284:1,114:1,115:1,677:1}),l.Qg=function(e){return Use(this,e)},l._g=function(e,n,r){var s,o;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Nn(),!!(this.Bb&256);case 3:return Nn(),!!(this.Bb&512);case 4:return pe(this.s);case 5:return pe(this.t);case 6:return Nn(),!!this.$j();case 7:return Nn(),o=this.s,o>=1;case 8:return n?Dh(this):this.r;case 9:return this.q;case 10:return Nn(),!!(this.Bb&xf);case 11:return Nn(),!!(this.Bb&Dy);case 12:return Nn(),!!(this.Bb&Ey);case 13:return this.j;case 14:return SE(this);case 15:return Nn(),!!(this.Bb&Hu);case 16:return Nn(),!!(this.Bb&md);case 17:return Ym(this)}return uh(this,e-Jn(this.zh()),yn((s=u(Dn(this,16),26),s||this.zh()),e),n,r)},l.hh=function(e,n,r){var s,o,h;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r);case 17:return this.Cb&&(r=(o=this.Db>>16,o>=0?Use(this,r):this.Cb.ih(this,-1-o,null,r))),Hl(this,e,17,r)}return h=u(yn((s=u(Dn(this,16),26),s||this.zh()),n),66),h.Nj().Qj(this,su(this),n-Jn(this.zh()),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 9:return nrt(this,r);case 17:return Hl(this,null,17,r)}return o=u(yn((s=u(Dn(this,16),26),s||this.zh()),n),66),o.Nj().Rj(this,su(this),n-Jn(this.zh()),e,r)},l.lh=function(e){var n,r;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return(this.Bb&256)==0;case 3:return(this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return this.$j();case 7:return r=this.s,r>=1;case 8:return!!this.r&&!this.q.e&&qw(this.q).i==0;case 9:return!!this.q&&!(this.r&&!this.q.e&&qw(this.q).i==0);case 10:return(this.Bb&xf)==0;case 11:return(this.Bb&Dy)!=0;case 12:return(this.Bb&Ey)!=0;case 13:return this.j!=null;case 14:return SE(this)!=null;case 15:return(this.Bb&Hu)!=0;case 16:return(this.Bb&md)!=0;case 17:return!!Ym(this)}return oh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.sh=function(e,n){var r,s;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:Mrt(this,Br(n));return;case 2:zg(this,je(Re(n)));return;case 3:qg(this,je(Re(n)));return;case 4:Rg(this,u(n,19).a);return;case 5:this.ok(u(n,19).a);return;case 8:b2(this,u(n,138));return;case 9:s=F1(this,u(n,87),null),s&&s.Fi();return;case 10:lE(this,je(Re(n)));return;case 11:dE(this,je(Re(n)));return;case 12:hE(this,je(Re(n)));return;case 13:r2t(this,Br(n));return;case 15:fE(this,je(Re(n)));return;case 16:gE(this,je(Re(n)));return}gh(this,e-Jn(this.zh()),yn((r=u(Dn(this,16),26),r||this.zh()),e),n)},l.zh=function(){return dn(),v5e},l.Bh=function(e){var n,r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:_t(this.Cb,88)&&gy(sl(u(this.Cb,88)),4),Qc(this,null);return;case 2:zg(this,!0);return;case 3:qg(this,!0);return;case 4:Rg(this,0);return;case 5:this.ok(1);return;case 8:b2(this,null);return;case 9:r=F1(this,null,null),r&&r.Fi();return;case 10:lE(this,!0);return;case 11:dE(this,!1);return;case 12:hE(this,!1);return;case 13:this.i=null,fz(this,null);return;case 15:fE(this,!1);return;case 16:gE(this,!1);return}fh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.Gh=function(){M8(To(($u(),ya),this)),Dh(this),this.Bb|=1},l.Gj=function(){return this.f},l.zj=function(){return SE(this)},l.Hj=function(){return Ym(this)},l.Lj=function(){return null},l.pk=function(){return this.k},l.aj=function(){return this.n},l.Mj=function(){return cq(this)},l.Nj=function(){var e,n,r,s,o,h,d,v,k;return this.p||(r=Ym(this),(r.i==null&&vd(r),r.i).length,s=this.Lj(),s&&Jn(Ym(s)),o=Dh(this),d=o.Bj(),e=d?d.i&1?d==pl?Rs:d==Cr?ja:d==a3?i7:d==aa?la:d==Ob?Sv:d==g5?Av:d==Gu?M6:uS:d:null,n=SE(this),v=o.zj(),shn(this),this.Bb&md&&((h=d4t(($u(),ya),r))&&h!=this||(h=Kx(To(ya,this))))?this.p=new ZGt(this,h):this.$j()?this.rk()?s?this.Bb&Hu?e?this.sk()?this.p=new n2(47,e,this,s):this.p=new n2(5,e,this,s):this.sk()?this.p=new s2(46,this,s):this.p=new s2(4,this,s):e?this.sk()?this.p=new n2(49,e,this,s):this.p=new n2(7,e,this,s):this.sk()?this.p=new s2(48,this,s):this.p=new s2(6,this,s):this.Bb&Hu?e?e==P2?this.p=new Ig(50,t5e,this):this.sk()?this.p=new Ig(43,e,this):this.p=new Ig(1,e,this):this.sk()?this.p=new Pg(42,this):this.p=new Pg(0,this):e?e==P2?this.p=new Ig(41,t5e,this):this.sk()?this.p=new Ig(45,e,this):this.p=new Ig(3,e,this):this.sk()?this.p=new Pg(44,this):this.p=new Pg(2,this):_t(o,148)?e==bU?this.p=new Pg(40,this):this.Bb&512?this.Bb&Hu?e?this.p=new Ig(9,e,this):this.p=new Pg(8,this):e?this.p=new Ig(11,e,this):this.p=new Pg(10,this):this.Bb&Hu?e?this.p=new Ig(13,e,this):this.p=new Pg(12,this):e?this.p=new Ig(15,e,this):this.p=new Pg(14,this):s?(k=s.t,k>1||k==-1?this.sk()?this.Bb&Hu?e?this.p=new n2(25,e,this,s):this.p=new s2(24,this,s):e?this.p=new n2(27,e,this,s):this.p=new s2(26,this,s):this.Bb&Hu?e?this.p=new n2(29,e,this,s):this.p=new s2(28,this,s):e?this.p=new n2(31,e,this,s):this.p=new s2(30,this,s):this.sk()?this.Bb&Hu?e?this.p=new n2(33,e,this,s):this.p=new s2(32,this,s):e?this.p=new n2(35,e,this,s):this.p=new s2(34,this,s):this.Bb&Hu?e?this.p=new n2(37,e,this,s):this.p=new s2(36,this,s):e?this.p=new n2(39,e,this,s):this.p=new s2(38,this,s)):this.sk()?this.Bb&Hu?e?this.p=new Ig(17,e,this):this.p=new Pg(16,this):e?this.p=new Ig(19,e,this):this.p=new Pg(18,this):this.Bb&Hu?e?this.p=new Ig(21,e,this):this.p=new Pg(20,this):e?this.p=new Ig(23,e,this):this.p=new Pg(22,this):this.qk()?this.sk()?this.p=new jYt(u(o,26),this,s):this.p=new $vt(u(o,26),this,s):_t(o,148)?e==bU?this.p=new Pg(40,this):this.Bb&Hu?e?this.p=new BKt(n,v,this,(rst(),d==Cr?dLt:d==pl?cLt:d==Ob?gLt:d==a3?fLt:d==aa?hLt:d==g5?pLt:d==Gu?uLt:d==xh?lLt:jft)):this.p=new KXt(u(o,148),n,v,this):e?this.p=new NKt(n,v,this,(rst(),d==Cr?dLt:d==pl?cLt:d==Ob?gLt:d==a3?fLt:d==aa?hLt:d==g5?pLt:d==Gu?uLt:d==xh?lLt:jft)):this.p=new YXt(u(o,148),n,v,this):this.rk()?s?this.Bb&Hu?this.sk()?this.p=new zYt(u(o,26),this,s):this.p=new Dwt(u(o,26),this,s):this.sk()?this.p=new $Yt(u(o,26),this,s):this.p=new Int(u(o,26),this,s):this.Bb&Hu?this.sk()?this.p=new NWt(u(o,26),this):this.p=new G2t(u(o,26),this):this.sk()?this.p=new FWt(u(o,26),this):this.p=new vnt(u(o,26),this):this.sk()?s?this.Bb&Hu?this.p=new qYt(u(o,26),this,s):this.p=new Lwt(u(o,26),this,s):this.Bb&Hu?this.p=new BWt(u(o,26),this):this.p=new U2t(u(o,26),this):s?this.Bb&Hu?this.p=new HYt(u(o,26),this,s):this.p=new Mwt(u(o,26),this,s):this.Bb&Hu?this.p=new RWt(u(o,26),this):this.p=new Uj(u(o,26),this)),this.p},l.Ij=function(){return(this.Bb&xf)!=0},l.qk=function(){return!1},l.rk=function(){return!1},l.Jj=function(){return(this.Bb&md)!=0},l.Oj=function(){return ait(this)},l.sk=function(){return!1},l.Kj=function(){return(this.Bb&Hu)!=0},l.tk=function(e){this.k=e},l.Lh=function(e){Mrt(this,e)},l.Ib=function(){return _q(this)},l.e=!1,l.n=0,F(Mn,"EStructuralFeatureImpl",449),D(322,449,{105:1,92:1,90:1,34:1,147:1,191:1,56:1,170:1,66:1,108:1,472:1,49:1,97:1,322:1,150:1,449:1,284:1,114:1,115:1,677:1},ret),l._g=function(e,n,r){var s,o;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Nn(),!!(this.Bb&256);case 3:return Nn(),!!(this.Bb&512);case 4:return pe(this.s);case 5:return pe(this.t);case 6:return Nn(),!!c5t(this);case 7:return Nn(),o=this.s,o>=1;case 8:return n?Dh(this):this.r;case 9:return this.q;case 10:return Nn(),!!(this.Bb&xf);case 11:return Nn(),!!(this.Bb&Dy);case 12:return Nn(),!!(this.Bb&Ey);case 13:return this.j;case 14:return SE(this);case 15:return Nn(),!!(this.Bb&Hu);case 16:return Nn(),!!(this.Bb&md);case 17:return Ym(this);case 18:return Nn(),!!(this.Bb&dc);case 19:return n?Tit(this):KJt(this)}return uh(this,e-Jn((dn(),r3)),yn((s=u(Dn(this,16),26),s||r3),e),n,r)},l.lh=function(e){var n,r;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return(this.Bb&256)==0;case 3:return(this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return c5t(this);case 7:return r=this.s,r>=1;case 8:return!!this.r&&!this.q.e&&qw(this.q).i==0;case 9:return!!this.q&&!(this.r&&!this.q.e&&qw(this.q).i==0);case 10:return(this.Bb&xf)==0;case 11:return(this.Bb&Dy)!=0;case 12:return(this.Bb&Ey)!=0;case 13:return this.j!=null;case 14:return SE(this)!=null;case 15:return(this.Bb&Hu)!=0;case 16:return(this.Bb&md)!=0;case 17:return!!Ym(this);case 18:return(this.Bb&dc)!=0;case 19:return!!KJt(this)}return oh(this,e-Jn((dn(),r3)),yn((n=u(Dn(this,16),26),n||r3),e))},l.sh=function(e,n){var r,s;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:Mrt(this,Br(n));return;case 2:zg(this,je(Re(n)));return;case 3:qg(this,je(Re(n)));return;case 4:Rg(this,u(n,19).a);return;case 5:SHt(this,u(n,19).a);return;case 8:b2(this,u(n,138));return;case 9:s=F1(this,u(n,87),null),s&&s.Fi();return;case 10:lE(this,je(Re(n)));return;case 11:dE(this,je(Re(n)));return;case 12:hE(this,je(Re(n)));return;case 13:r2t(this,Br(n));return;case 15:fE(this,je(Re(n)));return;case 16:gE(this,je(Re(n)));return;case 18:Kit(this,je(Re(n)));return}gh(this,e-Jn((dn(),r3)),yn((r=u(Dn(this,16),26),r||r3),e),n)},l.zh=function(){return dn(),r3},l.Bh=function(e){var n,r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:_t(this.Cb,88)&&gy(sl(u(this.Cb,88)),4),Qc(this,null);return;case 2:zg(this,!0);return;case 3:qg(this,!0);return;case 4:Rg(this,0);return;case 5:this.b=0,ry(this,1);return;case 8:b2(this,null);return;case 9:r=F1(this,null,null),r&&r.Fi();return;case 10:lE(this,!0);return;case 11:dE(this,!1);return;case 12:hE(this,!1);return;case 13:this.i=null,fz(this,null);return;case 15:fE(this,!1);return;case 16:gE(this,!1);return;case 18:Kit(this,!1);return}fh(this,e-Jn((dn(),r3)),yn((n=u(Dn(this,16),26),n||r3),e))},l.Gh=function(){Tit(this),M8(To(($u(),ya),this)),Dh(this),this.Bb|=1},l.$j=function(){return c5t(this)},l.nk=function(e,n){return this.b=0,this.a=null,e3t(this,e,n)},l.ok=function(e){SHt(this,e)},l.Ib=function(){var e;return this.Db&64?_q(this):(e=new _h(_q(this)),e.a+=" (iD: ",Lg(e,(this.Bb&dc)!=0),e.a+=")",e.a)},l.b=0,F(Mn,"EAttributeImpl",322),D(351,438,{105:1,92:1,90:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,351:1,150:1,114:1,115:1,676:1}),l.uk=function(e){return e.Tg()==this},l.Qg=function(e){return Lst(this,e)},l.Rg=function(e,n){this.w=null,this.Db=n<<16|this.Db&255,this.Cb=e},l._g=function(e,n,r){var s;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.D!=null?this.D:this.B;case 3:return hv(this);case 4:return this.zj();case 5:return this.F;case 6:return n?Rl(this):O8(this);case 7:return!this.A&&(this.A=new Fu(hu,this,7)),this.A}return uh(this,e-Jn(this.zh()),yn((s=u(Dn(this,16),26),s||this.zh()),e),n,r)},l.hh=function(e,n,r){var s,o,h;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r);case 6:return this.Cb&&(r=(o=this.Db>>16,o>=0?Lst(this,r):this.Cb.ih(this,-1-o,null,r))),Hl(this,e,6,r)}return h=u(yn((s=u(Dn(this,16),26),s||this.zh()),n),66),h.Nj().Qj(this,su(this),n-Jn(this.zh()),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 6:return Hl(this,null,6,r);case 7:return!this.A&&(this.A=new Fu(hu,this,7)),Ba(this.A,e,r)}return o=u(yn((s=u(Dn(this,16),26),s||this.zh()),n),66),o.Nj().Rj(this,su(this),n-Jn(this.zh()),e,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return!!hv(this);case 4:return this.zj()!=null;case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return!!O8(this);case 7:return!!this.A&&this.A.i!=0}return oh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:_$(this,Br(n));return;case 2:snt(this,Br(n));return;case 5:OE(this,Br(n));return;case 7:!this.A&&(this.A=new Fu(hu,this,7)),xr(this.A),!this.A&&(this.A=new Fu(hu,this,7)),is(this.A,u(n,14));return}gh(this,e-Jn(this.zh()),yn((r=u(Dn(this,16),26),r||this.zh()),e),n)},l.zh=function(){return dn(),f5e},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:_t(this.Cb,179)&&(u(this.Cb,179).tb=null),Qc(this,null);return;case 2:aE(this,null),Y8(this,this.D);return;case 5:OE(this,null);return;case 7:!this.A&&(this.A=new Fu(hu,this,7)),xr(this.A);return}fh(this,e-Jn(this.zh()),yn((n=u(Dn(this,16),26),n||this.zh()),e))},l.yj=function(){var e;return this.G==-1&&(this.G=(e=Rl(this),e?Hg(e.Mh(),this):-1)),this.G},l.zj=function(){return null},l.Aj=function(){return Rl(this)},l.vk=function(){return this.v},l.Bj=function(){return hv(this)},l.Cj=function(){return this.D!=null?this.D:this.B},l.Dj=function(){return this.F},l.wj=function(e){return xat(this,e)},l.wk=function(e){this.v=e},l.xk=function(e){Cne(this,e)},l.yk=function(e){this.C=e},l.Lh=function(e){_$(this,e)},l.Ib=function(){return Rz(this)},l.C=null,l.D=null,l.G=-1,F(Mn,"EClassifierImpl",351),D(88,351,{105:1,92:1,90:1,26:1,138:1,147:1,191:1,56:1,108:1,49:1,97:1,88:1,351:1,150:1,473:1,114:1,115:1,676:1},eM),l.uk=function(e){return zZe(this,e.Tg())},l._g=function(e,n,r){var s;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return this.D!=null?this.D:this.B;case 3:return hv(this);case 4:return null;case 5:return this.F;case 6:return n?Rl(this):O8(this);case 7:return!this.A&&(this.A=new Fu(hu,this,7)),this.A;case 8:return Nn(),!!(this.Bb&256);case 9:return Nn(),!!(this.Bb&512);case 10:return Ao(this);case 11:return!this.q&&(this.q=new fe(Wh,this,11,10)),this.q;case 12:return T4(this);case 13:return C_(this);case 14:return C_(this),this.r;case 15:return T4(this),this.k;case 16:return Z4t(this);case 17:return _at(this);case 18:return vd(this);case 19:return mq(this);case 20:return T4(this),this.o;case 21:return!this.s&&(this.s=new fe(Mu,this,21,17)),this.s;case 22:return Lc(this);case 23:return hat(this)}return uh(this,e-Jn((dn(),Lb)),yn((s=u(Dn(this,16),26),s||Lb),e),n,r)},l.hh=function(e,n,r){var s,o,h;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r);case 6:return this.Cb&&(r=(o=this.Db>>16,o>=0?Lst(this,r):this.Cb.ih(this,-1-o,null,r))),Hl(this,e,6,r);case 11:return!this.q&&(this.q=new fe(Wh,this,11,10)),Zc(this.q,e,r);case 21:return!this.s&&(this.s=new fe(Mu,this,21,17)),Zc(this.s,e,r)}return h=u(yn((s=u(Dn(this,16),26),s||(dn(),Lb)),n),66),h.Nj().Qj(this,su(this),n-Jn((dn(),Lb)),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 6:return Hl(this,null,6,r);case 7:return!this.A&&(this.A=new Fu(hu,this,7)),Ba(this.A,e,r);case 11:return!this.q&&(this.q=new fe(Wh,this,11,10)),Ba(this.q,e,r);case 21:return!this.s&&(this.s=new fe(Mu,this,21,17)),Ba(this.s,e,r);case 22:return Ba(Lc(this),e,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),Lb)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),Lb)),e,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return!!hv(this);case 4:return!1;case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return!!O8(this);case 7:return!!this.A&&this.A.i!=0;case 8:return(this.Bb&256)!=0;case 9:return(this.Bb&512)!=0;case 10:return!!this.u&&Lc(this.u.a).i!=0&&!(this.n&&vst(this.n));case 11:return!!this.q&&this.q.i!=0;case 12:return T4(this).i!=0;case 13:return C_(this).i!=0;case 14:return C_(this),this.r.i!=0;case 15:return T4(this),this.k.i!=0;case 16:return Z4t(this).i!=0;case 17:return _at(this).i!=0;case 18:return vd(this).i!=0;case 19:return mq(this).i!=0;case 20:return T4(this),!!this.o;case 21:return!!this.s&&this.s.i!=0;case 22:return!!this.n&&vst(this.n);case 23:return hat(this).i!=0}return oh(this,e-Jn((dn(),Lb)),yn((n=u(Dn(this,16),26),n||Lb),e))},l.oh=function(e){var n;return n=this.i==null||this.q&&this.q.i!=0?null:mI(this,e),n||Lxt(this,e)},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:_$(this,Br(n));return;case 2:snt(this,Br(n));return;case 5:OE(this,Br(n));return;case 7:!this.A&&(this.A=new Fu(hu,this,7)),xr(this.A),!this.A&&(this.A=new Fu(hu,this,7)),is(this.A,u(n,14));return;case 8:r3t(this,je(Re(n)));return;case 9:i3t(this,je(Re(n)));return;case 10:A_(Ao(this)),is(Ao(this),u(n,14));return;case 11:!this.q&&(this.q=new fe(Wh,this,11,10)),xr(this.q),!this.q&&(this.q=new fe(Wh,this,11,10)),is(this.q,u(n,14));return;case 21:!this.s&&(this.s=new fe(Mu,this,21,17)),xr(this.s),!this.s&&(this.s=new fe(Mu,this,21,17)),is(this.s,u(n,14));return;case 22:xr(Lc(this)),is(Lc(this),u(n,14));return}gh(this,e-Jn((dn(),Lb)),yn((r=u(Dn(this,16),26),r||Lb),e),n)},l.zh=function(){return dn(),Lb},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:_t(this.Cb,179)&&(u(this.Cb,179).tb=null),Qc(this,null);return;case 2:aE(this,null),Y8(this,this.D);return;case 5:OE(this,null);return;case 7:!this.A&&(this.A=new Fu(hu,this,7)),xr(this.A);return;case 8:r3t(this,!1);return;case 9:i3t(this,!1);return;case 10:this.u&&A_(this.u);return;case 11:!this.q&&(this.q=new fe(Wh,this,11,10)),xr(this.q);return;case 21:!this.s&&(this.s=new fe(Mu,this,21,17)),xr(this.s);return;case 22:this.n&&xr(this.n);return}fh(this,e-Jn((dn(),Lb)),yn((n=u(Dn(this,16),26),n||Lb),e))},l.Gh=function(){var e,n;if(T4(this),C_(this),Z4t(this),_at(this),vd(this),mq(this),hat(this),z9(ien(sl(this))),this.s)for(e=0,n=this.s.i;e=0;--n)At(this,n);return _3t(this,e)},l.Xj=function(){xr(this)},l.oi=function(e,n){return Yee(this,e,n)},F($i,"EcoreEList",622),D(496,622,zo,ZM),l.ai=function(){return!1},l.aj=function(){return this.c},l.bj=function(){return!1},l.Fk=function(){return!0},l.hi=function(){return!0},l.li=function(e,n){return n},l.ni=function(){return!1},l.c=0,F($i,"EObjectEList",496),D(85,496,zo,As),l.bj=function(){return!0},l.Dk=function(){return!1},l.rk=function(){return!0},F($i,"EObjectContainmentEList",85),D(545,85,zo,kj),l.ci=function(){this.b=!0},l.fj=function(){return this.b},l.Xj=function(){var e;xr(this),xl(this.e)?(e=this.b,this.b=!1,mi(this.e,new bf(this.e,2,this.c,e,!1))):this.b=!1},l.b=!1,F($i,"EObjectContainmentEList/Unsettable",545),D(1140,545,zo,PKt),l.ii=function(e,n){var r,s;return r=u(r_(this,e,n),87),xl(this.e)&&n8(this,new mD(this.a,7,(dn(),d5e),pe(n),(s=r.c,_t(s,88)?u(s,26):Kh),e)),r},l.jj=function(e,n){return Uhn(this,u(e,87),n)},l.kj=function(e,n){return Ghn(this,u(e,87),n)},l.lj=function(e,n,r){return Wdn(this,u(e,87),u(n,87),r)},l.Zi=function(e,n,r,s,o){switch(e){case 3:return F9(this,e,n,r,s,this.i>1);case 5:return F9(this,e,n,r,s,this.i-u(r,15).gc()>0);default:return new z0(this.e,e,this.c,n,r,s,!0)}},l.ij=function(){return!0},l.fj=function(){return vst(this)},l.Xj=function(){xr(this)},F(Mn,"EClassImpl/1",1140),D(1154,1153,B8t),l.ui=function(e){var n,r,s,o,h,d,v;if(r=e.xi(),r!=8){if(s=Lfn(e),s==0)switch(r){case 1:case 9:{v=e.Bi(),v!=null&&(n=sl(u(v,473)),!n.c&&(n.c=new Tm),X$(n.c,e.Ai())),d=e.zi(),d!=null&&(o=u(d,473),o.Bb&1||(n=sl(o),!n.c&&(n.c=new Tm),Dr(n.c,u(e.Ai(),26))));break}case 3:{d=e.zi(),d!=null&&(o=u(d,473),o.Bb&1||(n=sl(o),!n.c&&(n.c=new Tm),Dr(n.c,u(e.Ai(),26))));break}case 5:{if(d=e.zi(),d!=null)for(h=u(d,14).Kc();h.Ob();)o=u(h.Pb(),473),o.Bb&1||(n=sl(o),!n.c&&(n.c=new Tm),Dr(n.c,u(e.Ai(),26)));break}case 4:{v=e.Bi(),v!=null&&(o=u(v,473),o.Bb&1||(n=sl(o),!n.c&&(n.c=new Tm),X$(n.c,e.Ai())));break}case 6:{if(v=e.Bi(),v!=null)for(h=u(v,14).Kc();h.Ob();)o=u(h.Pb(),473),o.Bb&1||(n=sl(o),!n.c&&(n.c=new Tm),X$(n.c,e.Ai()));break}}this.Hk(s)}},l.Hk=function(e){Oue(this,e)},l.b=63,F(Mn,"ESuperAdapter",1154),D(1155,1154,B8t,Uzt),l.Hk=function(e){gy(this,e)},F(Mn,"EClassImpl/10",1155),D(1144,696,zo),l.Vh=function(e,n){return $st(this,e,n)},l.Wh=function(e){return Lse(this,e)},l.Xh=function(e,n){UD(this,e,n)},l.Yh=function(e){gD(this,e)},l.pi=function(e){return Fmt(this,e)},l.mi=function(e,n){return sit(this,e,n)},l.lk=function(e,n){throw it(new Or)},l.Zh=function(){return new Bx(this)},l.$h=function(){return new $M(this)},l._h=function(e){return DD(this,e)},l.mk=function(e,n){throw it(new Or)},l.Wj=function(e){return this},l.fj=function(){return this.i!=0},l.Wb=function(e){throw it(new Or)},l.Xj=function(){throw it(new Or)},F($i,"EcoreEList/UnmodifiableEList",1144),D(319,1144,zo,V3),l.ni=function(){return!1},F($i,"EcoreEList/UnmodifiableEList/FastCompare",319),D(1147,319,zo,wre),l.Xc=function(e){var n,r,s;if(_t(e,170)&&(n=u(e,170),r=n.aj(),r!=-1)){for(s=this.i;r4)if(this.wj(e)){if(this.rk()){if(s=u(e,49),r=s.Ug(),v=r==this.b&&(this.Dk()?s.Og(s.Vg(),u(yn(vu(this.b),this.aj()).Yj(),26).Bj())==no(u(yn(vu(this.b),this.aj()),18)).n:-1-s.Vg()==this.aj()),this.Ek()&&!v&&!r&&s.Zg()){for(o=0;o1||s==-1)):!1},l.Dk=function(){var e,n,r;return n=yn(vu(this.b),this.aj()),_t(n,99)?(e=u(n,18),r=no(e),!!r):!1},l.Ek=function(){var e,n;return n=yn(vu(this.b),this.aj()),_t(n,99)?(e=u(n,18),(e.Bb&Ka)!=0):!1},l.Xc=function(e){var n,r,s,o;if(s=this.Qi(e),s>=0)return s;if(this.Fk()){for(r=0,o=this.Vi();r=0;--e)AI(this,e,this.Oi(e));return this.Wi()},l.Qc=function(e){var n;if(this.Ek())for(n=this.Vi()-1;n>=0;--n)AI(this,n,this.Oi(n));return this.Xi(e)},l.Xj=function(){A_(this)},l.oi=function(e,n){return Ite(this,e,n)},F($i,"DelegatingEcoreEList",742),D(1150,742,z8t,KWt),l.Hi=function(e,n){pZe(this,e,u(n,26))},l.Ii=function(e){uQe(this,u(e,26))},l.Oi=function(e){var n,r;return n=u(At(Lc(this.a),e),87),r=n.c,_t(r,88)?u(r,26):(dn(),Kh)},l.Ti=function(e){var n,r;return n=u(by(Lc(this.a),e),87),r=n.c,_t(r,88)?u(r,26):(dn(),Kh)},l.Ui=function(e,n){return b1n(this,e,u(n,26))},l.ai=function(){return!1},l.Zi=function(e,n,r,s,o){return null},l.Ji=function(){return new Yzt(this)},l.Ki=function(){xr(Lc(this.a))},l.Li=function(e){return cie(this,e)},l.Mi=function(e){var n,r;for(r=e.Kc();r.Ob();)if(n=r.Pb(),!cie(this,n))return!1;return!0},l.Ni=function(e){var n,r,s;if(_t(e,15)&&(s=u(e,15),s.gc()==Lc(this.a).i)){for(n=s.Kc(),r=new nr(this);n.Ob();)if(Vt(n.Pb())!==Vt(dr(r)))return!1;return!0}return!1},l.Pi=function(){var e,n,r,s,o;for(r=1,n=new nr(Lc(this.a));n.e!=n.i.gc();)e=u(dr(n),87),s=(o=e.c,_t(o,88)?u(o,26):(dn(),Kh)),r=31*r+(s?Pw(s):0);return r},l.Qi=function(e){var n,r,s,o;for(s=0,r=new nr(Lc(this.a));r.e!=r.i.gc();){if(n=u(dr(r),87),Vt(e)===Vt((o=n.c,_t(o,88)?u(o,26):(dn(),Kh))))return s;++s}return-1},l.Ri=function(){return Lc(this.a).i==0},l.Si=function(){return null},l.Vi=function(){return Lc(this.a).i},l.Wi=function(){var e,n,r,s,o,h;for(h=Lc(this.a).i,o=Nt(Qn,De,1,h,5,1),r=0,n=new nr(Lc(this.a));n.e!=n.i.gc();)e=u(dr(n),87),o[r++]=(s=e.c,_t(s,88)?u(s,26):(dn(),Kh));return o},l.Xi=function(e){var n,r,s,o,h,d,v;for(v=Lc(this.a).i,e.lengthv&&ts(e,v,null),s=0,r=new nr(Lc(this.a));r.e!=r.i.gc();)n=u(dr(r),87),h=(d=n.c,_t(d,88)?u(d,26):(dn(),Kh)),ts(e,s++,h);return e},l.Yi=function(){var e,n,r,s,o;for(o=new Ag,o.a+="[",e=Lc(this.a),n=0,s=Lc(this.a).i;n>16,o>=0?Lst(this,r):this.Cb.ih(this,-1-o,null,r))),Hl(this,e,6,r);case 9:return!this.a&&(this.a=new fe(ag,this,9,5)),Zc(this.a,e,r)}return h=u(yn((s=u(Dn(this,16),26),s||(dn(),Mb)),n),66),h.Nj().Qj(this,su(this),n-Jn((dn(),Mb)),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 6:return Hl(this,null,6,r);case 7:return!this.A&&(this.A=new Fu(hu,this,7)),Ba(this.A,e,r);case 9:return!this.a&&(this.a=new fe(ag,this,9,5)),Ba(this.a,e,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),Mb)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),Mb)),e,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.D!=null&&this.D==this.F;case 3:return!!hv(this);case 4:return!!Hyt(this);case 5:return this.F!=null&&this.F!=this.D&&this.F!=this.B;case 6:return!!O8(this);case 7:return!!this.A&&this.A.i!=0;case 8:return(this.Bb&256)==0;case 9:return!!this.a&&this.a.i!=0}return oh(this,e-Jn((dn(),Mb)),yn((n=u(Dn(this,16),26),n||Mb),e))},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:_$(this,Br(n));return;case 2:snt(this,Br(n));return;case 5:OE(this,Br(n));return;case 7:!this.A&&(this.A=new Fu(hu,this,7)),xr(this.A),!this.A&&(this.A=new Fu(hu,this,7)),is(this.A,u(n,14));return;case 8:Iz(this,je(Re(n)));return;case 9:!this.a&&(this.a=new fe(ag,this,9,5)),xr(this.a),!this.a&&(this.a=new fe(ag,this,9,5)),is(this.a,u(n,14));return}gh(this,e-Jn((dn(),Mb)),yn((r=u(Dn(this,16),26),r||Mb),e),n)},l.zh=function(){return dn(),Mb},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:_t(this.Cb,179)&&(u(this.Cb,179).tb=null),Qc(this,null);return;case 2:aE(this,null),Y8(this,this.D);return;case 5:OE(this,null);return;case 7:!this.A&&(this.A=new Fu(hu,this,7)),xr(this.A);return;case 8:Iz(this,!0);return;case 9:!this.a&&(this.a=new fe(ag,this,9,5)),xr(this.a);return}fh(this,e-Jn((dn(),Mb)),yn((n=u(Dn(this,16),26),n||Mb),e))},l.Gh=function(){var e,n;if(this.a)for(e=0,n=this.a.i;e>16==5?u(this.Cb,671):null}return uh(this,e-Jn((dn(),op)),yn((s=u(Dn(this,16),26),s||op),e),n,r)},l.hh=function(e,n,r){var s,o,h;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r);case 5:return this.Cb&&(r=(o=this.Db>>16,o>=0?tae(this,r):this.Cb.ih(this,-1-o,null,r))),Hl(this,e,5,r)}return h=u(yn((s=u(Dn(this,16),26),s||(dn(),op)),n),66),h.Nj().Qj(this,su(this),n-Jn((dn(),op)),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 5:return Hl(this,null,5,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),op)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),op)),e,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return this.d!=0;case 3:return!!this.b;case 4:return this.c!=null;case 5:return!!(this.Db>>16==5&&u(this.Cb,671))}return oh(this,e-Jn((dn(),op)),yn((n=u(Dn(this,16),26),n||op),e))},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:Qc(this,Br(n));return;case 2:hit(this,u(n,19).a);return;case 3:Koe(this,u(n,1940));return;case 4:dit(this,Br(n));return}gh(this,e-Jn((dn(),op)),yn((r=u(Dn(this,16),26),r||op),e),n)},l.zh=function(){return dn(),op},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:Qc(this,null);return;case 2:hit(this,0);return;case 3:Koe(this,null);return;case 4:dit(this,null);return}fh(this,e-Jn((dn(),op)),yn((n=u(Dn(this,16),26),n||op),e))},l.Ib=function(){var e;return e=this.c,e??this.zb},l.b=null,l.c=null,l.d=0,F(Mn,"EEnumLiteralImpl",573);var x6n=Ki(Mn,"EFactoryImpl/InternalEDateTimeFormat");D(489,1,{2015:1},fM),F(Mn,"EFactoryImpl/1ClientInternalEDateTimeFormat",489),D(241,115,{105:1,92:1,90:1,87:1,56:1,108:1,49:1,97:1,241:1,114:1,115:1},xw),l.Sg=function(e,n,r){var s;return r=Hl(this,e,n,r),this.e&&_t(e,170)&&(s=vq(this,this.e),s!=this.c&&(r=PE(this,s,r))),r},l._g=function(e,n,r){var s;switch(e){case 0:return this.f;case 1:return!this.d&&(this.d=new As(ho,this,1)),this.d;case 2:return n?Lq(this):this.c;case 3:return this.b;case 4:return this.e;case 5:return n?xst(this):this.a}return uh(this,e-Jn((dn(),Gv)),yn((s=u(Dn(this,16),26),s||Gv),e),n,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return Zre(this,null,r);case 1:return!this.d&&(this.d=new As(ho,this,1)),Ba(this.d,e,r);case 3:return Qre(this,null,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),Gv)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),Gv)),e,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.f;case 1:return!!this.d&&this.d.i!=0;case 2:return!!this.c;case 3:return!!this.b;case 4:return!!this.e;case 5:return!!this.a}return oh(this,e-Jn((dn(),Gv)),yn((n=u(Dn(this,16),26),n||Gv),e))},l.sh=function(e,n){var r;switch(e){case 0:vae(this,u(n,87));return;case 1:!this.d&&(this.d=new As(ho,this,1)),xr(this.d),!this.d&&(this.d=new As(ho,this,1)),is(this.d,u(n,14));return;case 3:k4t(this,u(n,87));return;case 4:j4t(this,u(n,836));return;case 5:H8(this,u(n,138));return}gh(this,e-Jn((dn(),Gv)),yn((r=u(Dn(this,16),26),r||Gv),e),n)},l.zh=function(){return dn(),Gv},l.Bh=function(e){var n;switch(e){case 0:vae(this,null);return;case 1:!this.d&&(this.d=new As(ho,this,1)),xr(this.d);return;case 3:k4t(this,null);return;case 4:j4t(this,null);return;case 5:H8(this,null);return}fh(this,e-Jn((dn(),Gv)),yn((n=u(Dn(this,16),26),n||Gv),e))},l.Ib=function(){var e;return e=new Ol(mf(this)),e.a+=" (expression: ",Mat(this,e),e.a+=")",e.a};var oLt;F(Mn,"EGenericTypeImpl",241),D(1969,1964,NH),l.Xh=function(e,n){UWt(this,e,n)},l.lk=function(e,n){return UWt(this,this.gc(),e),n},l.pi=function(e){return Zf(this.Gi(),e)},l.Zh=function(){return this.$h()},l.Gi=function(){return new Zzt(this)},l.$h=function(){return this._h(0)},l._h=function(e){return this.Gi().Zc(e)},l.mk=function(e,n){return ay(this,e,!0),n},l.ii=function(e,n){var r,s;return s=Dst(this,n),r=this.Zc(e),r.Rb(s),s},l.ji=function(e,n){var r;ay(this,n,!0),r=this.Zc(e),r.Rb(n)},F($i,"AbstractSequentialInternalEList",1969),D(486,1969,NH,jM),l.pi=function(e){return Zf(this.Gi(),e)},l.Zh=function(){return this.b==null?(Mg(),Mg(),bP):this.Jk()},l.Gi=function(){return new wUt(this.a,this.b)},l.$h=function(){return this.b==null?(Mg(),Mg(),bP):this.Jk()},l._h=function(e){var n,r;if(this.b==null){if(e<0||e>1)throw it(new yo(J_+e+", size=0"));return Mg(),Mg(),bP}for(r=this.Jk(),n=0;n0;)if(n=this.c[--this.d],(!this.e||n.Gj()!=j7||n.aj()!=0)&&(!this.Mk()||this.b.mh(n))){if(h=this.b.bh(n,this.Lk()),this.f=(to(),u(n,66).Oj()),this.f||n.$j()){if(this.Lk()?(s=u(h,15),this.k=s):(s=u(h,69),this.k=this.j=s),_t(this.k,54)?(this.o=this.k.gc(),this.n=this.o):this.p=this.j?this.j._h(this.k.gc()):this.k.Zc(this.k.gc()),this.p?loe(this,this.p):koe(this))return o=this.p?this.p.Ub():this.j?this.j.pi(--this.n):this.k.Xb(--this.n),this.f?(e=u(o,72),e.ak(),r=e.dd(),this.i=r):(r=o,this.i=r),this.g=-3,!0}else if(h!=null)return this.k=null,this.p=null,r=h,this.i=r,this.g=-2,!0}return this.k=null,this.p=null,this.g=-1,!1}else return o=this.p?this.p.Ub():this.j?this.j.pi(--this.n):this.k.Xb(--this.n),this.f?(e=u(o,72),e.ak(),r=e.dd(),this.i=r):(r=o,this.i=r),this.g=-3,!0}},l.Pb=function(){return kz(this)},l.Tb=function(){return this.a},l.Ub=function(){var e;if(this.g<-1||this.Sb())return--this.a,this.g=0,e=this.i,this.Sb(),e;throw it(new lc)},l.Vb=function(){return this.a-1},l.Qb=function(){throw it(new Or)},l.Lk=function(){return!1},l.Wb=function(e){throw it(new Or)},l.Mk=function(){return!0},l.a=0,l.d=0,l.f=!1,l.g=0,l.n=0,l.o=0;var bP;F($i,"EContentsEList/FeatureIteratorImpl",279),D(697,279,BH,V2t),l.Lk=function(){return!0},F($i,"EContentsEList/ResolvingFeatureIteratorImpl",697),D(1157,697,BH,PWt),l.Mk=function(){return!1},F(Mn,"ENamedElementImpl/1/1",1157),D(1158,279,BH,OWt),l.Mk=function(){return!1},F(Mn,"ENamedElementImpl/1/2",1158),D(36,143,nO,Qm,Rrt,Js,Jrt,z0,bf,Ymt,cZt,Kmt,uZt,mmt,lZt,Zmt,hZt,ymt,fZt,Xmt,dZt,A9,mD,brt,Qmt,gZt,xmt,pZt),l._i=function(){return Imt(this)},l.gj=function(){var e;return e=Imt(this),e?e.zj():null},l.yi=function(e){return this.b==-1&&this.a&&(this.b=this.c.Xg(this.a.aj(),this.a.Gj())),this.c.Og(this.b,e)},l.Ai=function(){return this.c},l.hj=function(){var e;return e=Imt(this),e?e.Kj():!1},l.b=-1,F(Mn,"ENotificationImpl",36),D(399,284,{105:1,92:1,90:1,147:1,191:1,56:1,59:1,108:1,472:1,49:1,97:1,150:1,399:1,284:1,114:1,115:1},iet),l.Qg=function(e){return rae(this,e)},l._g=function(e,n,r){var s,o,h;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Nn(),!!(this.Bb&256);case 3:return Nn(),!!(this.Bb&512);case 4:return pe(this.s);case 5:return pe(this.t);case 6:return Nn(),h=this.t,h>1||h==-1;case 7:return Nn(),o=this.s,o>=1;case 8:return n?Dh(this):this.r;case 9:return this.q;case 10:return this.Db>>16==10?u(this.Cb,26):null;case 11:return!this.d&&(this.d=new Fu(hu,this,11)),this.d;case 12:return!this.c&&(this.c=new fe(Vv,this,12,10)),this.c;case 13:return!this.a&&(this.a=new GM(this,this)),this.a;case 14:return al(this)}return uh(this,e-Jn((dn(),cp)),yn((s=u(Dn(this,16),26),s||cp),e),n,r)},l.hh=function(e,n,r){var s,o,h;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r);case 10:return this.Cb&&(r=(o=this.Db>>16,o>=0?rae(this,r):this.Cb.ih(this,-1-o,null,r))),Hl(this,e,10,r);case 12:return!this.c&&(this.c=new fe(Vv,this,12,10)),Zc(this.c,e,r)}return h=u(yn((s=u(Dn(this,16),26),s||(dn(),cp)),n),66),h.Nj().Qj(this,su(this),n-Jn((dn(),cp)),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 9:return nrt(this,r);case 10:return Hl(this,null,10,r);case 11:return!this.d&&(this.d=new Fu(hu,this,11)),Ba(this.d,e,r);case 12:return!this.c&&(this.c=new fe(Vv,this,12,10)),Ba(this.c,e,r);case 14:return Ba(al(this),e,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),cp)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),cp)),e,r)},l.lh=function(e){var n,r,s;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return(this.Bb&256)==0;case 3:return(this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return s=this.t,s>1||s==-1;case 7:return r=this.s,r>=1;case 8:return!!this.r&&!this.q.e&&qw(this.q).i==0;case 9:return!!this.q&&!(this.r&&!this.q.e&&qw(this.q).i==0);case 10:return!!(this.Db>>16==10&&u(this.Cb,26));case 11:return!!this.d&&this.d.i!=0;case 12:return!!this.c&&this.c.i!=0;case 13:return!!this.a&&al(this.a.a).i!=0&&!(this.b&&mst(this.b));case 14:return!!this.b&&mst(this.b)}return oh(this,e-Jn((dn(),cp)),yn((n=u(Dn(this,16),26),n||cp),e))},l.sh=function(e,n){var r,s;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:Qc(this,Br(n));return;case 2:zg(this,je(Re(n)));return;case 3:qg(this,je(Re(n)));return;case 4:Rg(this,u(n,19).a);return;case 5:ry(this,u(n,19).a);return;case 8:b2(this,u(n,138));return;case 9:s=F1(this,u(n,87),null),s&&s.Fi();return;case 11:!this.d&&(this.d=new Fu(hu,this,11)),xr(this.d),!this.d&&(this.d=new Fu(hu,this,11)),is(this.d,u(n,14));return;case 12:!this.c&&(this.c=new fe(Vv,this,12,10)),xr(this.c),!this.c&&(this.c=new fe(Vv,this,12,10)),is(this.c,u(n,14));return;case 13:!this.a&&(this.a=new GM(this,this)),A_(this.a),!this.a&&(this.a=new GM(this,this)),is(this.a,u(n,14));return;case 14:xr(al(this)),is(al(this),u(n,14));return}gh(this,e-Jn((dn(),cp)),yn((r=u(Dn(this,16),26),r||cp),e),n)},l.zh=function(){return dn(),cp},l.Bh=function(e){var n,r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:Qc(this,null);return;case 2:zg(this,!0);return;case 3:qg(this,!0);return;case 4:Rg(this,0);return;case 5:ry(this,1);return;case 8:b2(this,null);return;case 9:r=F1(this,null,null),r&&r.Fi();return;case 11:!this.d&&(this.d=new Fu(hu,this,11)),xr(this.d);return;case 12:!this.c&&(this.c=new fe(Vv,this,12,10)),xr(this.c);return;case 13:this.a&&A_(this.a);return;case 14:this.b&&xr(this.b);return}fh(this,e-Jn((dn(),cp)),yn((n=u(Dn(this,16),26),n||cp),e))},l.Gh=function(){var e,n;if(this.c)for(e=0,n=this.c.i;ev&&ts(e,v,null),s=0,r=new nr(al(this.a));r.e!=r.i.gc();)n=u(dr(r),87),h=(d=n.c,d||(dn(),W1)),ts(e,s++,h);return e},l.Yi=function(){var e,n,r,s,o;for(o=new Ag,o.a+="[",e=al(this.a),n=0,s=al(this.a).i;n1);case 5:return F9(this,e,n,r,s,this.i-u(r,15).gc()>0);default:return new z0(this.e,e,this.c,n,r,s,!0)}},l.ij=function(){return!0},l.fj=function(){return mst(this)},l.Xj=function(){xr(this)},F(Mn,"EOperationImpl/2",1341),D(498,1,{1938:1,498:1},QGt),F(Mn,"EPackageImpl/1",498),D(16,85,zo,fe),l.zk=function(){return this.d},l.Ak=function(){return this.b},l.Dk=function(){return!0},l.b=0,F($i,"EObjectContainmentWithInverseEList",16),D(353,16,zo,Rx),l.Ek=function(){return!0},l.li=function(e,n){return g6(this,e,u(n,56))},F($i,"EObjectContainmentWithInverseEList/Resolving",353),D(298,353,zo,Gm),l.ci=function(){this.a.tb=null},F(Mn,"EPackageImpl/2",298),D(1228,1,{},hB),F(Mn,"EPackageImpl/3",1228),D(718,43,A4,Upt),l._b=function(e){return ra(e)?wrt(this,e):!!Lo(this.f,e)},F(Mn,"EPackageRegistryImpl",718),D(509,284,{105:1,92:1,90:1,147:1,191:1,56:1,2017:1,108:1,472:1,49:1,97:1,150:1,509:1,284:1,114:1,115:1},set),l.Qg=function(e){return iae(this,e)},l._g=function(e,n,r){var s,o,h;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Nn(),!!(this.Bb&256);case 3:return Nn(),!!(this.Bb&512);case 4:return pe(this.s);case 5:return pe(this.t);case 6:return Nn(),h=this.t,h>1||h==-1;case 7:return Nn(),o=this.s,o>=1;case 8:return n?Dh(this):this.r;case 9:return this.q;case 10:return this.Db>>16==10?u(this.Cb,59):null}return uh(this,e-Jn((dn(),i3)),yn((s=u(Dn(this,16),26),s||i3),e),n,r)},l.hh=function(e,n,r){var s,o,h;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Zc(this.Ab,e,r);case 10:return this.Cb&&(r=(o=this.Db>>16,o>=0?iae(this,r):this.Cb.ih(this,-1-o,null,r))),Hl(this,e,10,r)}return h=u(yn((s=u(Dn(this,16),26),s||(dn(),i3)),n),66),h.Nj().Qj(this,su(this),n-Jn((dn(),i3)),e,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 9:return nrt(this,r);case 10:return Hl(this,null,10,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),i3)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),i3)),e,r)},l.lh=function(e){var n,r,s;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return(this.Bb&256)==0;case 3:return(this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return s=this.t,s>1||s==-1;case 7:return r=this.s,r>=1;case 8:return!!this.r&&!this.q.e&&qw(this.q).i==0;case 9:return!!this.q&&!(this.r&&!this.q.e&&qw(this.q).i==0);case 10:return!!(this.Db>>16==10&&u(this.Cb,59))}return oh(this,e-Jn((dn(),i3)),yn((n=u(Dn(this,16),26),n||i3),e))},l.zh=function(){return dn(),i3},F(Mn,"EParameterImpl",509),D(99,449,{105:1,92:1,90:1,147:1,191:1,56:1,18:1,170:1,66:1,108:1,472:1,49:1,97:1,150:1,99:1,449:1,284:1,114:1,115:1,677:1},K2t),l._g=function(e,n,r){var s,o,h,d;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return Nn(),!!(this.Bb&256);case 3:return Nn(),!!(this.Bb&512);case 4:return pe(this.s);case 5:return pe(this.t);case 6:return Nn(),d=this.t,d>1||d==-1;case 7:return Nn(),o=this.s,o>=1;case 8:return n?Dh(this):this.r;case 9:return this.q;case 10:return Nn(),!!(this.Bb&xf);case 11:return Nn(),!!(this.Bb&Dy);case 12:return Nn(),!!(this.Bb&Ey);case 13:return this.j;case 14:return SE(this);case 15:return Nn(),!!(this.Bb&Hu);case 16:return Nn(),!!(this.Bb&md);case 17:return Ym(this);case 18:return Nn(),!!(this.Bb&dc);case 19:return Nn(),h=no(this),!!(h&&h.Bb&dc);case 20:return Nn(),!!(this.Bb&Ka);case 21:return n?no(this):this.b;case 22:return n?Iyt(this):BJt(this);case 23:return!this.a&&(this.a=new Y3(e3,this,23)),this.a}return uh(this,e-Jn((dn(),l5)),yn((s=u(Dn(this,16),26),s||l5),e),n,r)},l.lh=function(e){var n,r,s,o;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return(this.Bb&256)==0;case 3:return(this.Bb&512)==0;case 4:return this.s!=0;case 5:return this.t!=1;case 6:return o=this.t,o>1||o==-1;case 7:return r=this.s,r>=1;case 8:return!!this.r&&!this.q.e&&qw(this.q).i==0;case 9:return!!this.q&&!(this.r&&!this.q.e&&qw(this.q).i==0);case 10:return(this.Bb&xf)==0;case 11:return(this.Bb&Dy)!=0;case 12:return(this.Bb&Ey)!=0;case 13:return this.j!=null;case 14:return SE(this)!=null;case 15:return(this.Bb&Hu)!=0;case 16:return(this.Bb&md)!=0;case 17:return!!Ym(this);case 18:return(this.Bb&dc)!=0;case 19:return s=no(this),!!s&&(s.Bb&dc)!=0;case 20:return(this.Bb&Ka)==0;case 21:return!!this.b;case 22:return!!BJt(this);case 23:return!!this.a&&this.a.i!=0}return oh(this,e-Jn((dn(),l5)),yn((n=u(Dn(this,16),26),n||l5),e))},l.sh=function(e,n){var r,s;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:Mrt(this,Br(n));return;case 2:zg(this,je(Re(n)));return;case 3:qg(this,je(Re(n)));return;case 4:Rg(this,u(n,19).a);return;case 5:ry(this,u(n,19).a);return;case 8:b2(this,u(n,138));return;case 9:s=F1(this,u(n,87),null),s&&s.Fi();return;case 10:lE(this,je(Re(n)));return;case 11:dE(this,je(Re(n)));return;case 12:hE(this,je(Re(n)));return;case 13:r2t(this,Br(n));return;case 15:fE(this,je(Re(n)));return;case 16:gE(this,je(Re(n)));return;case 18:xin(this,je(Re(n)));return;case 20:u3t(this,je(Re(n)));return;case 21:cyt(this,u(n,18));return;case 23:!this.a&&(this.a=new Y3(e3,this,23)),xr(this.a),!this.a&&(this.a=new Y3(e3,this,23)),is(this.a,u(n,14));return}gh(this,e-Jn((dn(),l5)),yn((r=u(Dn(this,16),26),r||l5),e),n)},l.zh=function(){return dn(),l5},l.Bh=function(e){var n,r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:_t(this.Cb,88)&&gy(sl(u(this.Cb,88)),4),Qc(this,null);return;case 2:zg(this,!0);return;case 3:qg(this,!0);return;case 4:Rg(this,0);return;case 5:ry(this,1);return;case 8:b2(this,null);return;case 9:r=F1(this,null,null),r&&r.Fi();return;case 10:lE(this,!0);return;case 11:dE(this,!1);return;case 12:hE(this,!1);return;case 13:this.i=null,fz(this,null);return;case 15:fE(this,!1);return;case 16:gE(this,!1);return;case 18:c3t(this,!1),_t(this.Cb,88)&&gy(sl(u(this.Cb,88)),2);return;case 20:u3t(this,!0);return;case 21:cyt(this,null);return;case 23:!this.a&&(this.a=new Y3(e3,this,23)),xr(this.a);return}fh(this,e-Jn((dn(),l5)),yn((n=u(Dn(this,16),26),n||l5),e))},l.Gh=function(){Iyt(this),M8(To(($u(),ya),this)),Dh(this),this.Bb|=1},l.Lj=function(){return no(this)},l.qk=function(){var e;return e=no(this),!!e&&(e.Bb&dc)!=0},l.rk=function(){return(this.Bb&dc)!=0},l.sk=function(){return(this.Bb&Ka)!=0},l.nk=function(e,n){return this.c=null,e3t(this,e,n)},l.Ib=function(){var e;return this.Db&64?_q(this):(e=new _h(_q(this)),e.a+=" (containment: ",Lg(e,(this.Bb&dc)!=0),e.a+=", resolveProxies: ",Lg(e,(this.Bb&Ka)!=0),e.a+=")",e.a)},F(Mn,"EReferenceImpl",99),D(548,115,{105:1,42:1,92:1,90:1,133:1,56:1,108:1,49:1,97:1,548:1,114:1,115:1},iJ),l.Fb=function(e){return this===e},l.cd=function(){return this.b},l.dd=function(){return this.c},l.Hb=function(){return Pw(this)},l.Uh=function(e){_en(this,Br(e))},l.ed=function(e){return gen(this,Br(e))},l._g=function(e,n,r){var s;switch(e){case 0:return this.b;case 1:return this.c}return uh(this,e-Jn((dn(),Qa)),yn((s=u(Dn(this,16),26),s||Qa),e),n,r)},l.lh=function(e){var n;switch(e){case 0:return this.b!=null;case 1:return this.c!=null}return oh(this,e-Jn((dn(),Qa)),yn((n=u(Dn(this,16),26),n||Qa),e))},l.sh=function(e,n){var r;switch(e){case 0:Sen(this,Br(n));return;case 1:syt(this,Br(n));return}gh(this,e-Jn((dn(),Qa)),yn((r=u(Dn(this,16),26),r||Qa),e),n)},l.zh=function(){return dn(),Qa},l.Bh=function(e){var n;switch(e){case 0:iyt(this,null);return;case 1:syt(this,null);return}fh(this,e-Jn((dn(),Qa)),yn((n=u(Dn(this,16),26),n||Qa),e))},l.Sh=function(){var e;return this.a==-1&&(e=this.b,this.a=e==null?0:Vg(e)),this.a},l.Th=function(e){this.a=e},l.Ib=function(){var e;return this.Db&64?mf(this):(e=new _h(mf(this)),e.a+=" (key: ",go(e,this.b),e.a+=", value: ",go(e,this.c),e.a+=")",e.a)},l.a=-1,l.b=null,l.c=null;var cc=F(Mn,"EStringToStringMapEntryImpl",548),E5e=Ki($i,"FeatureMap/Entry/Internal");D(565,1,RH),l.Ok=function(e){return this.Pk(u(e,49))},l.Pk=function(e){return this.Ok(e)},l.Fb=function(e){var n,r;return this===e?!0:_t(e,72)?(n=u(e,72),n.ak()==this.c?(r=this.dd(),r==null?n.dd()==null:yi(r,n.dd())):!1):!1},l.ak=function(){return this.c},l.Hb=function(){var e;return e=this.dd(),Hi(this.c)^(e==null?0:Hi(e))},l.Ib=function(){var e,n;return e=this.c,n=Rl(e.Hj()).Ph(),e.ne(),(n!=null&&n.length!=0?n+":"+e.ne():e.ne())+"="+this.dd()},F(Mn,"EStructuralFeatureImpl/BasicFeatureMapEntry",565),D(776,565,RH,iwt),l.Pk=function(e){return new iwt(this.c,e)},l.dd=function(){return this.a},l.Qk=function(e,n,r){return Hcn(this,e,this.a,n,r)},l.Rk=function(e,n,r){return Vcn(this,e,this.a,n,r)},F(Mn,"EStructuralFeatureImpl/ContainmentUpdatingFeatureMapEntry",776),D(1314,1,{},ZGt),l.Pj=function(e,n,r,s,o){var h;return h=u(j8(e,this.b),215),h.nl(this.a).Wj(s)},l.Qj=function(e,n,r,s,o){var h;return h=u(j8(e,this.b),215),h.el(this.a,s,o)},l.Rj=function(e,n,r,s,o){var h;return h=u(j8(e,this.b),215),h.fl(this.a,s,o)},l.Sj=function(e,n,r){var s;return s=u(j8(e,this.b),215),s.nl(this.a).fj()},l.Tj=function(e,n,r,s){var o;o=u(j8(e,this.b),215),o.nl(this.a).Wb(s)},l.Uj=function(e,n,r){return u(j8(e,this.b),215).nl(this.a)},l.Vj=function(e,n,r){var s;s=u(j8(e,this.b),215),s.nl(this.a).Xj()},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateFeatureMapDelegator",1314),D(89,1,{},Ig,n2,Pg,s2),l.Pj=function(e,n,r,s,o){var h;if(h=n.Ch(r),h==null&&n.Dh(r,h=jq(this,e)),!o)switch(this.e){case 50:case 41:return u(h,589).sj();case 40:return u(h,215).kl()}return h},l.Qj=function(e,n,r,s,o){var h,d;return d=n.Ch(r),d==null&&n.Dh(r,d=jq(this,e)),h=u(d,69).lk(s,o),h},l.Rj=function(e,n,r,s,o){var h;return h=n.Ch(r),h!=null&&(o=u(h,69).mk(s,o)),o},l.Sj=function(e,n,r){var s;return s=n.Ch(r),s!=null&&u(s,76).fj()},l.Tj=function(e,n,r,s){var o;o=u(n.Ch(r),76),!o&&n.Dh(r,o=jq(this,e)),o.Wb(s)},l.Uj=function(e,n,r){var s,o;return o=n.Ch(r),o==null&&n.Dh(r,o=jq(this,e)),_t(o,76)?u(o,76):(s=u(n.Ch(r),15),new Qzt(s))},l.Vj=function(e,n,r){var s;s=u(n.Ch(r),76),!s&&n.Dh(r,s=jq(this,e)),s.Xj()},l.b=0,l.e=0,F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateMany",89),D(504,1,{}),l.Qj=function(e,n,r,s,o){throw it(new Or)},l.Rj=function(e,n,r,s,o){throw it(new Or)},l.Uj=function(e,n,r){return new WXt(this,e,n,r)};var p0;F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingle",504),D(1331,1,hut,WXt),l.Wj=function(e){return this.a.Pj(this.c,this.d,this.b,e,!0)},l.fj=function(){return this.a.Sj(this.c,this.d,this.b)},l.Wb=function(e){this.a.Tj(this.c,this.d,this.b,e)},l.Xj=function(){this.a.Vj(this.c,this.d,this.b)},l.b=0,F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingle/1",1331),D(769,504,{},$vt),l.Pj=function(e,n,r,s,o){return wat(e,e.eh(),e.Vg())==this.b?this.sk()&&s?eat(e):e.eh():null},l.Qj=function(e,n,r,s,o){var h,d;return e.eh()&&(o=(h=e.Vg(),h>=0?e.Qg(o):e.eh().ih(e,-1-h,null,o))),d=Gi(e.Tg(),this.e),e.Sg(s,d,o)},l.Rj=function(e,n,r,s,o){var h;return h=Gi(e.Tg(),this.e),e.Sg(null,h,o)},l.Sj=function(e,n,r){var s;return s=Gi(e.Tg(),this.e),!!e.eh()&&e.Vg()==s},l.Tj=function(e,n,r,s){var o,h,d,v,k;if(s!=null&&!xat(this.a,s))throw it(new i8(jH+(_t(s,56)?y4t(u(s,56).Tg()):Vmt(ol(s)))+$H+this.a+"'"));if(o=e.eh(),d=Gi(e.Tg(),this.e),Vt(s)!==Vt(o)||e.Vg()!=d&&s!=null){if(vE(e,u(s,56)))throw it(new Fn(Q_+e.Ib()));k=null,o&&(k=(h=e.Vg(),h>=0?e.Qg(k):e.eh().ih(e,-1-h,null,k))),v=u(s,49),v&&(k=v.gh(e,Gi(v.Tg(),this.b),null,k)),k=e.Sg(v,d,k),k&&k.Fi()}else e.Lg()&&e.Mg()&&mi(e,new Js(e,1,d,s,s))},l.Vj=function(e,n,r){var s,o,h,d;s=e.eh(),s?(d=(o=e.Vg(),o>=0?e.Qg(null):e.eh().ih(e,-1-o,null,null)),h=Gi(e.Tg(),this.e),d=e.Sg(null,h,d),d&&d.Fi()):e.Lg()&&e.Mg()&&mi(e,new A9(e,1,this.e,null,null))},l.sk=function(){return!1},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleContainer",769),D(1315,769,{},jYt),l.sk=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleContainerResolving",1315),D(563,504,{}),l.Pj=function(e,n,r,s,o){var h;return h=n.Ch(r),h==null?this.b:Vt(h)===Vt(p0)?null:h},l.Sj=function(e,n,r){var s;return s=n.Ch(r),s!=null&&(Vt(s)===Vt(p0)||!yi(s,this.b))},l.Tj=function(e,n,r,s){var o,h;e.Lg()&&e.Mg()?(o=(h=n.Ch(r),h==null?this.b:Vt(h)===Vt(p0)?null:h),s==null?this.c!=null?(n.Dh(r,null),s=this.b):this.b!=null?n.Dh(r,p0):n.Dh(r,null):(this.Sk(s),n.Dh(r,s)),mi(e,this.d.Tk(e,1,this.e,o,s))):s==null?this.c!=null?n.Dh(r,null):this.b!=null?n.Dh(r,p0):n.Dh(r,null):(this.Sk(s),n.Dh(r,s))},l.Vj=function(e,n,r){var s,o;e.Lg()&&e.Mg()?(s=(o=n.Ch(r),o==null?this.b:Vt(o)===Vt(p0)?null:o),n.Eh(r),mi(e,this.d.Tk(e,1,this.e,s,this.b))):n.Eh(r)},l.Sk=function(e){throw it(new oqt)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData",563),D(R4,1,{},fB),l.Tk=function(e,n,r,s,o){return new A9(e,n,r,s,o)},l.Uk=function(e,n,r,s,o,h){return new brt(e,n,r,s,o,h)};var cLt,uLt,lLt,hLt,fLt,dLt,gLt,jft,pLt;F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator",R4),D(1332,R4,{},dB),l.Tk=function(e,n,r,s,o){return new xmt(e,n,r,je(Re(s)),je(Re(o)))},l.Uk=function(e,n,r,s,o,h){return new pZt(e,n,r,je(Re(s)),je(Re(o)),h)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/1",1332),D(1333,R4,{},gB),l.Tk=function(e,n,r,s,o){return new Ymt(e,n,r,u(s,217).a,u(o,217).a)},l.Uk=function(e,n,r,s,o,h){return new cZt(e,n,r,u(s,217).a,u(o,217).a,h)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/2",1333),D(1334,R4,{},Nk),l.Tk=function(e,n,r,s,o){return new Kmt(e,n,r,u(s,172).a,u(o,172).a)},l.Uk=function(e,n,r,s,o,h){return new uZt(e,n,r,u(s,172).a,u(o,172).a,h)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/3",1334),D(1335,R4,{},pB),l.Tk=function(e,n,r,s,o){return new mmt(e,n,r,Xt(ye(s)),Xt(ye(o)))},l.Uk=function(e,n,r,s,o,h){return new lZt(e,n,r,Xt(ye(s)),Xt(ye(o)),h)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/4",1335),D(1336,R4,{},bB),l.Tk=function(e,n,r,s,o){return new Zmt(e,n,r,u(s,155).a,u(o,155).a)},l.Uk=function(e,n,r,s,o,h){return new hZt(e,n,r,u(s,155).a,u(o,155).a,h)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/5",1336),D(1337,R4,{},sJ),l.Tk=function(e,n,r,s,o){return new ymt(e,n,r,u(s,19).a,u(o,19).a)},l.Uk=function(e,n,r,s,o,h){return new fZt(e,n,r,u(s,19).a,u(o,19).a,h)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/6",1337),D(1338,R4,{},Bk),l.Tk=function(e,n,r,s,o){return new Xmt(e,n,r,u(s,162).a,u(o,162).a)},l.Uk=function(e,n,r,s,o,h){return new dZt(e,n,r,u(s,162).a,u(o,162).a,h)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/7",1338),D(1339,R4,{},Rk),l.Tk=function(e,n,r,s,o){return new Qmt(e,n,r,u(s,184).a,u(o,184).a)},l.Uk=function(e,n,r,s,o,h){return new gZt(e,n,r,u(s,184).a,u(o,184).a,h)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleData/NotificationCreator/8",1339),D(1317,563,{},YXt),l.Sk=function(e){if(!this.a.wj(e))throw it(new i8(jH+ol(e)+$H+this.a+"'"))},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataDynamic",1317),D(1318,563,{},NKt),l.Sk=function(e){},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataStatic",1318),D(770,563,{}),l.Sj=function(e,n,r){var s;return s=n.Ch(r),s!=null},l.Tj=function(e,n,r,s){var o,h;e.Lg()&&e.Mg()?(o=!0,h=n.Ch(r),h==null?(o=!1,h=this.b):Vt(h)===Vt(p0)&&(h=null),s==null?this.c!=null?(n.Dh(r,null),s=this.b):n.Dh(r,p0):(this.Sk(s),n.Dh(r,s)),mi(e,this.d.Uk(e,1,this.e,h,s,!o))):s==null?this.c!=null?n.Dh(r,null):n.Dh(r,p0):(this.Sk(s),n.Dh(r,s))},l.Vj=function(e,n,r){var s,o;e.Lg()&&e.Mg()?(s=!0,o=n.Ch(r),o==null?(s=!1,o=this.b):Vt(o)===Vt(p0)&&(o=null),n.Eh(r),mi(e,this.d.Uk(e,2,this.e,o,this.b,s))):n.Eh(r)},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettable",770),D(1319,770,{},KXt),l.Sk=function(e){if(!this.a.wj(e))throw it(new i8(jH+ol(e)+$H+this.a+"'"))},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableDynamic",1319),D(1320,770,{},BKt),l.Sk=function(e){},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleDataUnsettableStatic",1320),D(398,504,{},Uj),l.Pj=function(e,n,r,s,o){var h,d,v,k,C;if(C=n.Ch(r),this.Kj()&&Vt(C)===Vt(p0))return null;if(this.sk()&&s&&C!=null){if(v=u(C,49),v.kh()&&(k=Zp(e,v),v!=k)){if(!xat(this.a,k))throw it(new i8(jH+ol(k)+$H+this.a+"'"));n.Dh(r,C=k),this.rk()&&(h=u(k,49),d=v.ih(e,this.b?Gi(v.Tg(),this.b):-1-Gi(e.Tg(),this.e),null,null),!h.eh()&&(d=h.gh(e,this.b?Gi(h.Tg(),this.b):-1-Gi(e.Tg(),this.e),null,d)),d&&d.Fi()),e.Lg()&&e.Mg()&&mi(e,new A9(e,9,this.e,v,k))}return C}else return C},l.Qj=function(e,n,r,s,o){var h,d;return d=n.Ch(r),Vt(d)===Vt(p0)&&(d=null),n.Dh(r,s),this.bj()?Vt(d)!==Vt(s)&&d!=null&&(h=u(d,49),o=h.ih(e,Gi(h.Tg(),this.b),null,o)):this.rk()&&d!=null&&(o=u(d,49).ih(e,-1-Gi(e.Tg(),this.e),null,o)),e.Lg()&&e.Mg()&&(!o&&(o=new Dp(4)),o.Ei(new A9(e,1,this.e,d,s))),o},l.Rj=function(e,n,r,s,o){var h;return h=n.Ch(r),Vt(h)===Vt(p0)&&(h=null),n.Eh(r),e.Lg()&&e.Mg()&&(!o&&(o=new Dp(4)),this.Kj()?o.Ei(new A9(e,2,this.e,h,null)):o.Ei(new A9(e,1,this.e,h,null))),o},l.Sj=function(e,n,r){var s;return s=n.Ch(r),s!=null},l.Tj=function(e,n,r,s){var o,h,d,v,k;if(s!=null&&!xat(this.a,s))throw it(new i8(jH+(_t(s,56)?y4t(u(s,56).Tg()):Vmt(ol(s)))+$H+this.a+"'"));k=n.Ch(r),v=k!=null,this.Kj()&&Vt(k)===Vt(p0)&&(k=null),d=null,this.bj()?Vt(k)!==Vt(s)&&(k!=null&&(o=u(k,49),d=o.ih(e,Gi(o.Tg(),this.b),null,d)),s!=null&&(o=u(s,49),d=o.gh(e,Gi(o.Tg(),this.b),null,d))):this.rk()&&Vt(k)!==Vt(s)&&(k!=null&&(d=u(k,49).ih(e,-1-Gi(e.Tg(),this.e),null,d)),s!=null&&(d=u(s,49).gh(e,-1-Gi(e.Tg(),this.e),null,d))),s==null&&this.Kj()?n.Dh(r,p0):n.Dh(r,s),e.Lg()&&e.Mg()?(h=new brt(e,1,this.e,k,s,this.Kj()&&!v),d?(d.Ei(h),d.Fi()):mi(e,h)):d&&d.Fi()},l.Vj=function(e,n,r){var s,o,h,d,v;v=n.Ch(r),d=v!=null,this.Kj()&&Vt(v)===Vt(p0)&&(v=null),h=null,v!=null&&(this.bj()?(s=u(v,49),h=s.ih(e,Gi(s.Tg(),this.b),null,h)):this.rk()&&(h=u(v,49).ih(e,-1-Gi(e.Tg(),this.e),null,h))),n.Eh(r),e.Lg()&&e.Mg()?(o=new brt(e,this.Kj()?2:1,this.e,v,null,d),h?(h.Ei(o),h.Fi()):mi(e,o)):h&&h.Fi()},l.bj=function(){return!1},l.rk=function(){return!1},l.sk=function(){return!1},l.Kj=function(){return!1},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObject",398),D(564,398,{},vnt),l.rk=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainment",564),D(1323,564,{},FWt),l.sk=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentResolving",1323),D(772,564,{},G2t),l.Kj=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettable",772),D(1325,772,{},NWt),l.sk=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentUnsettableResolving",1325),D(640,564,{},Int),l.bj=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverse",640),D(1324,640,{},$Yt),l.sk=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseResolving",1324),D(773,640,{},Dwt),l.Kj=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettable",773),D(1326,773,{},zYt),l.sk=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectContainmentWithInverseUnsettableResolving",1326),D(641,398,{},U2t),l.sk=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolving",641),D(1327,641,{},BWt),l.Kj=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingUnsettable",1327),D(774,641,{},Lwt),l.bj=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverse",774),D(1328,774,{},qYt),l.Kj=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectResolvingWithInverseUnsettable",1328),D(1321,398,{},RWt),l.Kj=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectUnsettable",1321),D(771,398,{},Mwt),l.bj=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverse",771),D(1322,771,{},HYt),l.Kj=function(){return!0},F(Mn,"EStructuralFeatureImpl/InternalSettingDelegateSingleEObjectWithInverseUnsettable",1322),D(775,565,RH,_vt),l.Pk=function(e){return new _vt(this.a,this.c,e)},l.dd=function(){return this.b},l.Qk=function(e,n,r){return Van(this,e,this.b,r)},l.Rk=function(e,n,r){return Gan(this,e,this.b,r)},F(Mn,"EStructuralFeatureImpl/InverseUpdatingFeatureMapEntry",775),D(1329,1,hut,Qzt),l.Wj=function(e){return this.a},l.fj=function(){return _t(this.a,95)?u(this.a,95).fj():!this.a.dc()},l.Wb=function(e){this.a.$b(),this.a.Gc(u(e,15))},l.Xj=function(){_t(this.a,95)?u(this.a,95).Xj():this.a.$b()},F(Mn,"EStructuralFeatureImpl/SettingMany",1329),D(1330,565,RH,rJt),l.Ok=function(e){return new xnt((Ii(),fA),this.b.Ih(this.a,e))},l.dd=function(){return null},l.Qk=function(e,n,r){return r},l.Rk=function(e,n,r){return r},F(Mn,"EStructuralFeatureImpl/SimpleContentFeatureMapEntry",1330),D(642,565,RH,xnt),l.Ok=function(e){return new xnt(this.c,e)},l.dd=function(){return this.a},l.Qk=function(e,n,r){return r},l.Rk=function(e,n,r){return r},F(Mn,"EStructuralFeatureImpl/SimpleFeatureMapEntry",642),D(391,497,Ld,Tm),l.ri=function(e){return Nt(Uh,De,26,e,0,1)},l.ni=function(){return!1},F(Mn,"ESuperAdapter/1",391),D(444,438,{105:1,92:1,90:1,147:1,191:1,56:1,108:1,836:1,49:1,97:1,150:1,444:1,114:1,115:1},HL),l._g=function(e,n,r){var s;switch(e){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),this.Ab;case 1:return this.zb;case 2:return!this.a&&(this.a=new T9(this,ho,this)),this.a}return uh(this,e-Jn((dn(),Uv)),yn((s=u(Dn(this,16),26),s||Uv),e),n,r)},l.jh=function(e,n,r){var s,o;switch(n){case 0:return!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),Ba(this.Ab,e,r);case 2:return!this.a&&(this.a=new T9(this,ho,this)),Ba(this.a,e,r)}return o=u(yn((s=u(Dn(this,16),26),s||(dn(),Uv)),n),66),o.Nj().Rj(this,su(this),n-Jn((dn(),Uv)),e,r)},l.lh=function(e){var n;switch(e){case 0:return!!this.Ab&&this.Ab.i!=0;case 1:return this.zb!=null;case 2:return!!this.a&&this.a.i!=0}return oh(this,e-Jn((dn(),Uv)),yn((n=u(Dn(this,16),26),n||Uv),e))},l.sh=function(e,n){var r;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab),!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),is(this.Ab,u(n,14));return;case 1:Qc(this,Br(n));return;case 2:!this.a&&(this.a=new T9(this,ho,this)),xr(this.a),!this.a&&(this.a=new T9(this,ho,this)),is(this.a,u(n,14));return}gh(this,e-Jn((dn(),Uv)),yn((r=u(Dn(this,16),26),r||Uv),e),n)},l.zh=function(){return dn(),Uv},l.Bh=function(e){var n;switch(e){case 0:!this.Ab&&(this.Ab=new fe(Zr,this,0,3)),xr(this.Ab);return;case 1:Qc(this,null);return;case 2:!this.a&&(this.a=new T9(this,ho,this)),xr(this.a);return}fh(this,e-Jn((dn(),Uv)),yn((n=u(Dn(this,16),26),n||Uv),e))},F(Mn,"ETypeParameterImpl",444),D(445,85,zo,T9),l.cj=function(e,n){return G0n(this,u(e,87),n)},l.dj=function(e,n){return U0n(this,u(e,87),n)},F(Mn,"ETypeParameterImpl/1",445),D(634,43,A4,aet),l.ec=function(){return new mR(this)},F(Mn,"ETypeParameterImpl/2",634),D(556,N1,zu,mR),l.Fc=function(e){return lYt(this,u(e,87))},l.Gc=function(e){var n,r,s;for(s=!1,r=e.Kc();r.Ob();)n=u(r.Pb(),87),ki(this.a,n,"")==null&&(s=!0);return s},l.$b=function(){Xu(this.a)},l.Hc=function(e){return Tl(this.a,e)},l.Kc=function(){var e;return e=new p2(new Cg(this.a).a),new yR(e)},l.Mc=function(e){return XJt(this,e)},l.gc=function(){return HC(this.a)},F(Mn,"ETypeParameterImpl/2/1",556),D(557,1,sa,yR),l.Nb=function(e){ba(this,e)},l.Pb=function(){return u(Zw(this.a).cd(),87)},l.Ob=function(){return this.a.b},l.Qb=function(){Ste(this.a)},F(Mn,"ETypeParameterImpl/2/1/1",557),D(1276,43,A4,zqt),l._b=function(e){return ra(e)?wrt(this,e):!!Lo(this.f,e)},l.xc=function(e){var n,r;return n=ra(e)?Nc(this,e):ec(Lo(this.f,e)),_t(n,837)?(r=u(n,837),n=r._j(),ki(this,u(e,235),n),n):n??(e==null?(Tet(),C5e):null)},F(Mn,"EValidatorRegistryImpl",1276),D(1313,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,1941:1,49:1,97:1,150:1,114:1,115:1},aJ),l.Ih=function(e,n){switch(e.yj()){case 21:case 22:case 23:case 24:case 26:case 31:case 32:case 37:case 38:case 39:case 40:case 43:case 44:case 48:case 49:case 20:return n==null?null:$o(n);case 25:return Jon(n);case 27:return bon(n);case 28:return won(n);case 29:return n==null?null:VUt(aA[0],u(n,199));case 41:return n==null?"":Ip(u(n,290));case 42:return $o(n);case 50:return Br(n);default:throw it(new Fn(QE+e.ne()+Cv))}},l.Jh=function(e){var n,r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt;switch(e.G==-1&&(e.G=(H=Rl(e),H?Hg(H.Mh(),e):-1)),e.G){case 0:return r=new ret,r;case 1:return n=new lB,n;case 2:return s=new eM,s;case 4:return o=new xR,o;case 5:return h=new $qt,h;case 6:return d=new lqt,d;case 7:return v=new JB,v;case 10:return C=new Pk,C;case 11:return M=new iet,M;case 12:return j=new fQt,j;case 13:return G=new set,G;case 14:return K=new K2t,K;case 17:return tt=new iJ,tt;case 18:return k=new xw,k;case 19:return gt=new HL,gt;default:throw it(new Fn(Kct+e.zb+Cv))}},l.Kh=function(e,n){switch(e.yj()){case 20:return n==null?null:new gbt(n);case 21:return n==null?null:new Rp(n);case 23:case 22:return n==null?null:ifn(n);case 26:case 24:return n==null?null:AD(ql(n,-128,127)<<24>>24);case 25:return p2n(n);case 27:return z1n(n);case 28:return q1n(n);case 29:return lgn(n);case 32:case 31:return n==null?null:dy(n);case 38:case 37:return n==null?null:new Ppt(n);case 40:case 39:return n==null?null:pe(ql(n,Sa,wi));case 41:return null;case 42:return n==null,null;case 44:case 43:return n==null?null:v2(Rq(n));case 49:case 48:return n==null?null:uE(ql(n,zH,32767)<<16>>16);case 50:return n;default:throw it(new Fn(QE+e.ne()+Cv))}},F(Mn,"EcoreFactoryImpl",1313),D(547,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,1939:1,49:1,97:1,150:1,179:1,547:1,114:1,115:1,675:1},LXt),l.gb=!1,l.hb=!1;var bLt,T5e=!1;F(Mn,"EcorePackageImpl",547),D(1184,1,{837:1},oJ),l._j=function(){return gWt(),_5e},F(Mn,"EcorePackageImpl/1",1184),D(1193,1,si,cJ),l.wj=function(e){return _t(e,147)},l.xj=function(e){return Nt(fP,De,147,e,0,1)},F(Mn,"EcorePackageImpl/10",1193),D(1194,1,si,uJ),l.wj=function(e){return _t(e,191)},l.xj=function(e){return Nt(Mft,De,191,e,0,1)},F(Mn,"EcorePackageImpl/11",1194),D(1195,1,si,lJ),l.wj=function(e){return _t(e,56)},l.xj=function(e){return Nt(_b,De,56,e,0,1)},F(Mn,"EcorePackageImpl/12",1195),D(1196,1,si,hJ),l.wj=function(e){return _t(e,399)},l.xj=function(e){return Nt(Wh,$8t,59,e,0,1)},F(Mn,"EcorePackageImpl/13",1196),D(1197,1,si,fJ),l.wj=function(e){return _t(e,235)},l.xj=function(e){return Nt(i1,De,235,e,0,1)},F(Mn,"EcorePackageImpl/14",1197),D(1198,1,si,dJ),l.wj=function(e){return _t(e,509)},l.xj=function(e){return Nt(Vv,De,2017,e,0,1)},F(Mn,"EcorePackageImpl/15",1198),D(1199,1,si,wB),l.wj=function(e){return _t(e,99)},l.xj=function(e){return Nt(n3,B4,18,e,0,1)},F(Mn,"EcorePackageImpl/16",1199),D(1200,1,si,gJ),l.wj=function(e){return _t(e,170)},l.xj=function(e){return Nt(Mu,B4,170,e,0,1)},F(Mn,"EcorePackageImpl/17",1200),D(1201,1,si,pJ),l.wj=function(e){return _t(e,472)},l.xj=function(e){return Nt(t3,De,472,e,0,1)},F(Mn,"EcorePackageImpl/18",1201),D(1202,1,si,bJ),l.wj=function(e){return _t(e,548)},l.xj=function(e){return Nt(cc,C0e,548,e,0,1)},F(Mn,"EcorePackageImpl/19",1202),D(1185,1,si,vB),l.wj=function(e){return _t(e,322)},l.xj=function(e){return Nt(e3,B4,34,e,0,1)},F(Mn,"EcorePackageImpl/2",1185),D(1203,1,si,jk),l.wj=function(e){return _t(e,241)},l.xj=function(e){return Nt(ho,q0e,87,e,0,1)},F(Mn,"EcorePackageImpl/20",1203),D(1204,1,si,eC),l.wj=function(e){return _t(e,444)},l.xj=function(e){return Nt(hu,De,836,e,0,1)},F(Mn,"EcorePackageImpl/21",1204),D(1205,1,si,mB),l.wj=function(e){return Nm(e)},l.xj=function(e){return Nt(Rs,ee,476,e,8,1)},F(Mn,"EcorePackageImpl/22",1205),D(1206,1,si,wJ),l.wj=function(e){return _t(e,190)},l.xj=function(e){return Nt(Gu,ee,190,e,0,2)},F(Mn,"EcorePackageImpl/23",1206),D(1207,1,si,yB),l.wj=function(e){return _t(e,217)},l.xj=function(e){return Nt(M6,ee,217,e,0,1)},F(Mn,"EcorePackageImpl/24",1207),D(1208,1,si,xB),l.wj=function(e){return _t(e,172)},l.xj=function(e){return Nt(uS,ee,172,e,0,1)},F(Mn,"EcorePackageImpl/25",1208),D(1209,1,si,vJ),l.wj=function(e){return _t(e,199)},l.xj=function(e){return Nt(tV,ee,199,e,0,1)},F(Mn,"EcorePackageImpl/26",1209),D(1210,1,si,nC),l.wj=function(e){return!1},l.xj=function(e){return Nt(PLt,De,2110,e,0,1)},F(Mn,"EcorePackageImpl/27",1210),D(1211,1,si,Cm),l.wj=function(e){return Bm(e)},l.xj=function(e){return Nt(la,ee,333,e,7,1)},F(Mn,"EcorePackageImpl/28",1211),D(1212,1,si,kB),l.wj=function(e){return _t(e,58)},l.xj=function(e){return Nt(KAt,Ty,58,e,0,1)},F(Mn,"EcorePackageImpl/29",1212),D(1186,1,si,EB),l.wj=function(e){return _t(e,510)},l.xj=function(e){return Nt(Zr,{3:1,4:1,5:1,1934:1},590,e,0,1)},F(Mn,"EcorePackageImpl/3",1186),D(1213,1,si,mJ),l.wj=function(e){return _t(e,573)},l.xj=function(e){return Nt(ZAt,De,1940,e,0,1)},F(Mn,"EcorePackageImpl/30",1213),D(1214,1,si,yJ),l.wj=function(e){return _t(e,153)},l.xj=function(e){return Nt(xLt,Ty,153,e,0,1)},F(Mn,"EcorePackageImpl/31",1214),D(1215,1,si,rC),l.wj=function(e){return _t(e,72)},l.xj=function(e){return Nt(bU,Q0e,72,e,0,1)},F(Mn,"EcorePackageImpl/32",1215),D(1216,1,si,TB),l.wj=function(e){return _t(e,155)},l.xj=function(e){return Nt(i7,ee,155,e,0,1)},F(Mn,"EcorePackageImpl/33",1216),D(1217,1,si,CB),l.wj=function(e){return _t(e,19)},l.xj=function(e){return Nt(ja,ee,19,e,0,1)},F(Mn,"EcorePackageImpl/34",1217),D(1218,1,si,uc),l.wj=function(e){return _t(e,290)},l.xj=function(e){return Nt(J8t,De,290,e,0,1)},F(Mn,"EcorePackageImpl/35",1218),D(1219,1,si,xJ),l.wj=function(e){return _t(e,162)},l.xj=function(e){return Nt(Sv,ee,162,e,0,1)},F(Mn,"EcorePackageImpl/36",1219),D(1220,1,si,_B),l.wj=function(e){return _t(e,83)},l.xj=function(e){return Nt(tEt,De,83,e,0,1)},F(Mn,"EcorePackageImpl/37",1220),D(1221,1,si,iC),l.wj=function(e){return _t(e,591)},l.xj=function(e){return Nt(wLt,De,591,e,0,1)},F(Mn,"EcorePackageImpl/38",1221),D(1222,1,si,kJ),l.wj=function(e){return!1},l.xj=function(e){return Nt(FLt,De,2111,e,0,1)},F(Mn,"EcorePackageImpl/39",1222),D(1187,1,si,EJ),l.wj=function(e){return _t(e,88)},l.xj=function(e){return Nt(Uh,De,26,e,0,1)},F(Mn,"EcorePackageImpl/4",1187),D(1223,1,si,sC),l.wj=function(e){return _t(e,184)},l.xj=function(e){return Nt(Av,ee,184,e,0,1)},F(Mn,"EcorePackageImpl/40",1223),D(1224,1,si,SB),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(Mn,"EcorePackageImpl/41",1224),D(1225,1,si,aC),l.wj=function(e){return _t(e,588)},l.xj=function(e){return Nt(QAt,De,588,e,0,1)},F(Mn,"EcorePackageImpl/42",1225),D(1226,1,si,oC),l.wj=function(e){return!1},l.xj=function(e){return Nt(NLt,ee,2112,e,0,1)},F(Mn,"EcorePackageImpl/43",1226),D(1227,1,si,jf),l.wj=function(e){return _t(e,42)},l.xj=function(e){return Nt(P2,Hq,42,e,0,1)},F(Mn,"EcorePackageImpl/44",1227),D(1188,1,si,VL),l.wj=function(e){return _t(e,138)},l.xj=function(e){return Nt(s1,De,138,e,0,1)},F(Mn,"EcorePackageImpl/5",1188),D(1189,1,si,GL),l.wj=function(e){return _t(e,148)},l.xj=function(e){return Nt(Nft,De,148,e,0,1)},F(Mn,"EcorePackageImpl/6",1189),D(1190,1,si,lx),l.wj=function(e){return _t(e,457)},l.xj=function(e){return Nt(pU,De,671,e,0,1)},F(Mn,"EcorePackageImpl/7",1190),D(1191,1,si,TJ),l.wj=function(e){return _t(e,573)},l.xj=function(e){return Nt(ag,De,678,e,0,1)},F(Mn,"EcorePackageImpl/8",1191),D(1192,1,si,CJ),l.wj=function(e){return _t(e,471)},l.xj=function(e){return Nt(sA,De,471,e,0,1)},F(Mn,"EcorePackageImpl/9",1192),D(1025,1982,T0e,sHt),l.bi=function(e,n){Mln(this,u(n,415))},l.fi=function(e,n){moe(this,e,u(n,415))},F(Mn,"MinimalEObjectImpl/1ArrayDelegatingAdapterList",1025),D(1026,143,nO,yXt),l.Ai=function(){return this.a.a},F(Mn,"MinimalEObjectImpl/1ArrayDelegatingAdapterList/1",1026),D(1053,1052,{},NUt),F("org.eclipse.emf.ecore.plugin","EcorePlugin",1053);var wLt=Ki(Z0e,"Resource");D(781,1378,J0e),l.Yk=function(e){},l.Zk=function(e){},l.Vk=function(){return!this.a&&(this.a=new Ztt(this)),this.a},l.Wk=function(e){var n,r,s,o,h;if(s=e.length,s>0)if(Rr(0,e.length),e.charCodeAt(0)==47){for(h=new Xc(4),o=1,n=1;n0&&(e=e.substr(0,r)));return Zpn(this,e)},l.Xk=function(){return this.c},l.Ib=function(){var e;return Ip(this.gm)+"@"+(e=Hi(this)>>>0,e.toString(16))+" uri='"+this.d+"'"},l.b=!1,F(fut,"ResourceImpl",781),D(1379,781,J0e,Jzt),F(fut,"BinaryResourceImpl",1379),D(1169,694,aut),l.si=function(e){return _t(e,56)?Orn(this,u(e,56)):_t(e,591)?new nr(u(e,591).Vk()):Vt(e)===Vt(this.f)?u(e,14).Kc():(y8(),pP.a)},l.Ob=function(){return h5t(this)},l.a=!1,F($i,"EcoreUtil/ContentTreeIterator",1169),D(1380,1169,aut,QKt),l.si=function(e){return Vt(e)===Vt(this.f)?u(e,15).Kc():new PZt(u(e,56))},F(fut,"ResourceImpl/5",1380),D(648,1994,z0e,Ztt),l.Hc=function(e){return this.i<=4?yE(this,e):_t(e,49)&&u(e,49).Zg()==this.a},l.bi=function(e,n){e==this.i-1&&(this.a.b||(this.a.b=!0))},l.di=function(e,n){e==0?this.a.b||(this.a.b=!0):Yrt(this,e,n)},l.fi=function(e,n){},l.gi=function(e,n,r){},l.aj=function(){return 2},l.Ai=function(){return this.a},l.bj=function(){return!0},l.cj=function(e,n){var r;return r=u(e,49),n=r.wh(this.a,n),n},l.dj=function(e,n){var r;return r=u(e,49),r.wh(null,n)},l.ej=function(){return!1},l.hi=function(){return!0},l.ri=function(e){return Nt(_b,De,56,e,0,1)},l.ni=function(){return!1},F(fut,"ResourceImpl/ContentsEList",648),D(957,1964,jE,Zzt),l.Zc=function(e){return this.a._h(e)},l.gc=function(){return this.a.gc()},F($i,"AbstractSequentialInternalEList/1",957);var vLt,mLt,ya,yLt;D(624,1,{},JYt);var wU,vU;F($i,"BasicExtendedMetaData",624),D(1160,1,{},JGt),l.$k=function(){return null},l._k=function(){return this.a==-2&&Tg(this,sgn(this.d,this.b)),this.a},l.al=function(){return null},l.bl=function(){return wn(),wn(),io},l.ne=function(){return this.c==t7&&O3(this,Xie(this.d,this.b)),this.c},l.cl=function(){return 0},l.a=-2,l.c=t7,F($i,"BasicExtendedMetaData/EClassExtendedMetaDataImpl",1160),D(1161,1,{},yZt),l.$k=function(){return this.a==(B8(),wU)&&ypt(this,xwn(this.f,this.b)),this.a},l._k=function(){return 0},l.al=function(){return this.c==(B8(),wU)&&Ftt(this,kwn(this.f,this.b)),this.c},l.bl=function(){return!this.d&&Ntt(this,xmn(this.f,this.b)),this.d},l.ne=function(){return this.e==t7&&cR(this,Xie(this.f,this.b)),this.e},l.cl=function(){return this.g==-2&&uR(this,T0n(this.f,this.b)),this.g},l.e=t7,l.g=-2,F($i,"BasicExtendedMetaData/EDataTypeExtendedMetaDataImpl",1161),D(1159,1,{},eUt),l.b=!1,l.c=!1,F($i,"BasicExtendedMetaData/EPackageExtendedMetaDataImpl",1159),D(1162,1,{},mZt),l.c=-2,l.e=t7,l.f=t7,F($i,"BasicExtendedMetaData/EStructuralFeatureExtendedMetaDataImpl",1162),D(585,622,zo,Rj),l.aj=function(){return this.c},l.Fk=function(){return!1},l.li=function(e,n){return n},l.c=0,F($i,"EDataTypeEList",585);var xLt=Ki($i,"FeatureMap");D(75,585,{3:1,4:1,20:1,28:1,52:1,14:1,15:1,54:1,67:1,63:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},ss),l.Vc=function(e,n){wwn(this,e,u(n,72))},l.Fc=function(e){return N2n(this,u(e,72))},l.Yh=function(e){knn(this,u(e,72))},l.cj=function(e,n){return nJe(this,u(e,72),n)},l.dj=function(e,n){return vwt(this,u(e,72),n)},l.ii=function(e,n){return jmn(this,e,n)},l.li=function(e,n){return v4n(this,e,u(n,72))},l._c=function(e,n){return ovn(this,e,u(n,72))},l.jj=function(e,n){return rJe(this,u(e,72),n)},l.kj=function(e,n){return TYt(this,u(e,72),n)},l.lj=function(e,n,r){return o0n(this,u(e,72),u(n,72),r)},l.oi=function(e,n){return Rst(this,e,u(n,72))},l.dl=function(e,n){return J5t(this,e,n)},l.Wc=function(e,n){var r,s,o,h,d,v,k,C,M;for(C=new Qw(n.gc()),o=n.Kc();o.Ob();)if(s=u(o.Pb(),72),h=s.ak(),X0(this.e,h))(!h.hi()||!O$(this,h,s.dd())&&!yE(C,s))&&Dr(C,s);else{for(M=ou(this.e.Tg(),h),r=u(this.g,119),d=!0,v=0;v=0;)if(n=e[this.c],this.k.rl(n.ak()))return this.j=this.f?n:n.dd(),this.i=-2,!0;return this.i=-1,this.g=-1,!1},F($i,"BasicFeatureMap/FeatureEIterator",410),D(662,410,n0,rnt),l.Lk=function(){return!0},F($i,"BasicFeatureMap/ResolvingFeatureEIterator",662),D(955,486,NH,UUt),l.Gi=function(){return this},F($i,"EContentsEList/1",955),D(956,486,NH,wUt),l.Lk=function(){return!1},F($i,"EContentsEList/2",956),D(954,279,BH,WUt),l.Nk=function(e){},l.Ob=function(){return!1},l.Sb=function(){return!1},F($i,"EContentsEList/FeatureIteratorImpl/1",954),D(825,585,zo,E2t),l.ci=function(){this.a=!0},l.fj=function(){return this.a},l.Xj=function(){var e;xr(this),xl(this.e)?(e=this.a,this.a=!1,mi(this.e,new bf(this.e,2,this.c,e,!1))):this.a=!1},l.a=!1,F($i,"EDataTypeEList/Unsettable",825),D(1849,585,zo,eWt),l.hi=function(){return!0},F($i,"EDataTypeUniqueEList",1849),D(1850,825,zo,nWt),l.hi=function(){return!0},F($i,"EDataTypeUniqueEList/Unsettable",1850),D(139,85,zo,Fu),l.Ek=function(){return!0},l.li=function(e,n){return g6(this,e,u(n,56))},F($i,"EObjectContainmentEList/Resolving",139),D(1163,545,zo,tWt),l.Ek=function(){return!0},l.li=function(e,n){return g6(this,e,u(n,56))},F($i,"EObjectContainmentEList/Unsettable/Resolving",1163),D(748,16,zo,hwt),l.ci=function(){this.a=!0},l.fj=function(){return this.a},l.Xj=function(){var e;xr(this),xl(this.e)?(e=this.a,this.a=!1,mi(this.e,new bf(this.e,2,this.c,e,!1))):this.a=!1},l.a=!1,F($i,"EObjectContainmentWithInverseEList/Unsettable",748),D(1173,748,zo,hYt),l.Ek=function(){return!0},l.li=function(e,n){return g6(this,e,u(n,56))},F($i,"EObjectContainmentWithInverseEList/Unsettable/Resolving",1173),D(743,496,zo,k2t),l.ci=function(){this.a=!0},l.fj=function(){return this.a},l.Xj=function(){var e;xr(this),xl(this.e)?(e=this.a,this.a=!1,mi(this.e,new bf(this.e,2,this.c,e,!1))):this.a=!1},l.a=!1,F($i,"EObjectEList/Unsettable",743),D(328,496,zo,Y3),l.Ek=function(){return!0},l.li=function(e,n){return g6(this,e,u(n,56))},F($i,"EObjectResolvingEList",328),D(1641,743,zo,rWt),l.Ek=function(){return!0},l.li=function(e,n){return g6(this,e,u(n,56))},F($i,"EObjectResolvingEList/Unsettable",1641),D(1381,1,{},_J);var C5e;F($i,"EObjectValidator",1381),D(546,496,zo,r$),l.zk=function(){return this.d},l.Ak=function(){return this.b},l.bj=function(){return!0},l.Dk=function(){return!0},l.b=0,F($i,"EObjectWithInverseEList",546),D(1176,546,zo,fYt),l.Ck=function(){return!0},F($i,"EObjectWithInverseEList/ManyInverse",1176),D(625,546,zo,Ent),l.ci=function(){this.a=!0},l.fj=function(){return this.a},l.Xj=function(){var e;xr(this),xl(this.e)?(e=this.a,this.a=!1,mi(this.e,new bf(this.e,2,this.c,e,!1))):this.a=!1},l.a=!1,F($i,"EObjectWithInverseEList/Unsettable",625),D(1175,625,zo,dYt),l.Ck=function(){return!0},F($i,"EObjectWithInverseEList/Unsettable/ManyInverse",1175),D(749,546,zo,fwt),l.Ek=function(){return!0},l.li=function(e,n){return g6(this,e,u(n,56))},F($i,"EObjectWithInverseResolvingEList",749),D(31,749,zo,Cn),l.Ck=function(){return!0},F($i,"EObjectWithInverseResolvingEList/ManyInverse",31),D(750,625,zo,dwt),l.Ek=function(){return!0},l.li=function(e,n){return g6(this,e,u(n,56))},F($i,"EObjectWithInverseResolvingEList/Unsettable",750),D(1174,750,zo,gYt),l.Ck=function(){return!0},F($i,"EObjectWithInverseResolvingEList/Unsettable/ManyInverse",1174),D(1164,622,zo),l.ai=function(){return(this.b&1792)==0},l.ci=function(){this.b|=1},l.Bk=function(){return(this.b&4)!=0},l.bj=function(){return(this.b&40)!=0},l.Ck=function(){return(this.b&16)!=0},l.Dk=function(){return(this.b&8)!=0},l.Ek=function(){return(this.b&Dy)!=0},l.rk=function(){return(this.b&32)!=0},l.Fk=function(){return(this.b&xf)!=0},l.wj=function(e){return this.d?KZt(this.d,e):this.ak().Yj().wj(e)},l.fj=function(){return this.b&2?(this.b&1)!=0:this.i!=0},l.hi=function(){return(this.b&128)!=0},l.Xj=function(){var e;xr(this),this.b&2&&(xl(this.e)?(e=(this.b&1)!=0,this.b&=-2,n8(this,new bf(this.e,2,Gi(this.e.Tg(),this.ak()),e,!1))):this.b&=-2)},l.ni=function(){return(this.b&1536)==0},l.b=0,F($i,"EcoreEList/Generic",1164),D(1165,1164,zo,iQt),l.ak=function(){return this.a},F($i,"EcoreEList/Dynamic",1165),D(747,63,Ld,_pt),l.ri=function(e){return MD(this.a.a,e)},F($i,"EcoreEMap/1",747),D(746,85,zo,hvt),l.bi=function(e,n){Jz(this.b,u(n,133))},l.di=function(e,n){Vne(this.b)},l.ei=function(e,n,r){var s;++(s=this.b,u(n,133),s).e},l.fi=function(e,n){Wit(this.b,u(n,133))},l.gi=function(e,n,r){Wit(this.b,u(r,133)),Vt(r)===Vt(n)&&u(r,133).Th(hQe(u(n,133).cd())),Jz(this.b,u(n,133))},F($i,"EcoreEMap/DelegateEObjectContainmentEList",746),D(1171,151,j8t,rne),F($i,"EcoreEMap/Unsettable",1171),D(1172,746,zo,pYt),l.ci=function(){this.a=!0},l.fj=function(){return this.a},l.Xj=function(){var e;xr(this),xl(this.e)?(e=this.a,this.a=!1,mi(this.e,new bf(this.e,2,this.c,e,!1))):this.a=!1},l.a=!1,F($i,"EcoreEMap/Unsettable/UnsettableDelegateEObjectContainmentEList",1172),D(1168,228,A4,oXt),l.a=!1,l.b=!1,F($i,"EcoreUtil/Copier",1168),D(745,1,sa,PZt),l.Nb=function(e){ba(this,e)},l.Ob=function(){return Mie(this)},l.Pb=function(){var e;return Mie(this),e=this.b,this.b=null,e},l.Qb=function(){this.a.Qb()},F($i,"EcoreUtil/ProperContentIterator",745),D(1382,1381,{},tR);var _5e;F($i,"EcoreValidator",1382);var S5e;Ki($i,"FeatureMapUtil/Validator"),D(1260,1,{1942:1},SJ),l.rl=function(e){return!0},F($i,"FeatureMapUtil/1",1260),D(757,1,{1942:1},Axt),l.rl=function(e){var n;return this.c==e?!0:(n=Re(tr(this.a,e)),n==null?nmn(this,e)?(qJt(this.a,e,(Nn(),r7)),!0):(qJt(this.a,e,(Nn(),F2)),!1):n==(Nn(),r7))},l.e=!1;var $ft;F($i,"FeatureMapUtil/BasicValidator",757),D(758,43,A4,v2t),F($i,"FeatureMapUtil/BasicValidator/Cache",758),D(501,52,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,69:1,95:1},BM),l.Vc=function(e,n){sue(this.c,this.b,e,n)},l.Fc=function(e){return J5t(this.c,this.b,e)},l.Wc=function(e,n){return w3n(this.c,this.b,e,n)},l.Gc=function(e){return g9(this,e)},l.Xh=function(e,n){Ron(this.c,this.b,e,n)},l.lk=function(e,n){return W5t(this.c,this.b,e,n)},l.pi=function(e){return Iq(this.c,this.b,e,!1)},l.Zh=function(){return AUt(this.c,this.b)},l.$h=function(){return ZXe(this.c,this.b)},l._h=function(e){return Han(this.c,this.b,e)},l.mk=function(e,n){return WWt(this,e,n)},l.$b=function(){Tx(this)},l.Hc=function(e){return O$(this.c,this.b,e)},l.Ic=function(e){return qcn(this.c,this.b,e)},l.Xb=function(e){return Iq(this.c,this.b,e,!0)},l.Wj=function(e){return this},l.Xc=function(e){return tan(this.c,this.b,e)},l.dc=function(){return hj(this)},l.fj=function(){return!XD(this.c,this.b)},l.Kc=function(){return _on(this.c,this.b)},l.Yc=function(){return Son(this.c,this.b)},l.Zc=function(e){return jln(this.c,this.b,e)},l.ii=function(e,n){return Ele(this.c,this.b,e,n)},l.ji=function(e,n){Ban(this.c,this.b,e,n)},l.$c=function(e){return noe(this.c,this.b,e)},l.Mc=function(e){return Emn(this.c,this.b,e)},l._c=function(e,n){return Lle(this.c,this.b,e,n)},l.Wb=function(e){pq(this.c,this.b),g9(this,u(e,15))},l.gc=function(){return Zln(this.c,this.b)},l.Pc=function(){return Qin(this.c,this.b)},l.Qc=function(e){return ean(this.c,this.b,e)},l.Ib=function(){var e,n;for(n=new Ag,n.a+="[",e=AUt(this.c,this.b);Bit(e);)go(n,b9(Qz(e))),Bit(e)&&(n.a+=Ya);return n.a+="]",n.a},l.Xj=function(){pq(this.c,this.b)},F($i,"FeatureMapUtil/FeatureEList",501),D(627,36,nO,jrt),l.yi=function(e){return e_(this,e)},l.Di=function(e){var n,r,s,o,h,d,v;switch(this.d){case 1:case 2:{if(h=e.Ai(),Vt(h)===Vt(this.c)&&e_(this,null)==e.yi(null))return this.g=e.zi(),e.xi()==1&&(this.d=1),!0;break}case 3:{switch(o=e.xi(),o){case 3:{if(h=e.Ai(),Vt(h)===Vt(this.c)&&e_(this,null)==e.yi(null))return this.d=5,n=new Qw(2),Dr(n,this.g),Dr(n,e.zi()),this.g=n,!0;break}}break}case 5:{switch(o=e.xi(),o){case 3:{if(h=e.Ai(),Vt(h)===Vt(this.c)&&e_(this,null)==e.yi(null))return r=u(this.g,14),r.Fc(e.zi()),!0;break}}break}case 4:{switch(o=e.xi(),o){case 3:{if(h=e.Ai(),Vt(h)===Vt(this.c)&&e_(this,null)==e.yi(null))return this.d=1,this.g=e.zi(),!0;break}case 4:{if(h=e.Ai(),Vt(h)===Vt(this.c)&&e_(this,null)==e.yi(null))return this.d=6,v=new Qw(2),Dr(v,this.n),Dr(v,e.Bi()),this.n=v,d=lt(ct(Cr,1),Xr,25,15,[this.o,e.Ci()]),this.g=d,!0;break}}break}case 6:{switch(o=e.xi(),o){case 4:{if(h=e.Ai(),Vt(h)===Vt(this.c)&&e_(this,null)==e.yi(null))return r=u(this.n,14),r.Fc(e.Bi()),d=u(this.g,48),s=Nt(Cr,Xr,25,d.length+1,15,1),Dc(d,0,s,0,d.length),s[d.length]=e.Ci(),this.g=s,!0;break}}break}}return!1},F($i,"FeatureMapUtil/FeatureENotificationImpl",627),D(552,501,{20:1,28:1,52:1,14:1,15:1,58:1,76:1,153:1,215:1,1937:1,69:1,95:1},qj),l.dl=function(e,n){return J5t(this.c,e,n)},l.el=function(e,n,r){return W5t(this.c,e,n,r)},l.fl=function(e,n,r){return bxt(this.c,e,n,r)},l.gl=function(){return this},l.hl=function(e,n){return SI(this.c,e,n)},l.il=function(e){return u(Iq(this.c,this.b,e,!1),72).ak()},l.jl=function(e){return u(Iq(this.c,this.b,e,!1),72).dd()},l.kl=function(){return this.a},l.ll=function(e){return!XD(this.c,e)},l.ml=function(e,n){Oq(this.c,e,n)},l.nl=function(e){return lne(this.c,e)},l.ol=function(e){Pse(this.c,e)},F($i,"FeatureMapUtil/FeatureFeatureMap",552),D(1259,1,hut,nUt),l.Wj=function(e){return Iq(this.b,this.a,-1,e)},l.fj=function(){return!XD(this.b,this.a)},l.Wb=function(e){Oq(this.b,this.a,e)},l.Xj=function(){pq(this.b,this.a)},F($i,"FeatureMapUtil/FeatureValue",1259);var J6,zft,qft,tk,A5e,wP=Ki(GH,"AnyType");D(666,60,Q0,pet),F(GH,"InvalidDatatypeValueException",666);var mU=Ki(GH,ege),vP=Ki(GH,nge),kLt=Ki(GH,rge),L5e,pc,ELt,X2,M5e,D5e,I5e,O5e,P5e,F5e,N5e,B5e,R5e,j5e,$5e,h5,z5e,f5,lA,q5e,Wv,mP,yP,H5e,hA,fA;D(830,506,{105:1,92:1,90:1,56:1,49:1,97:1,843:1},Wpt),l._g=function(e,n,r){switch(e){case 0:return r?(!this.c&&(this.c=new ss(this,0)),this.c):(!this.c&&(this.c=new ss(this,0)),this.c.b);case 1:return r?(!this.c&&(this.c=new ss(this,0)),u(Bc(this.c,(Ii(),X2)),153)):(!this.c&&(this.c=new ss(this,0)),u(u(Bc(this.c,(Ii(),X2)),153),215)).kl();case 2:return r?(!this.b&&(this.b=new ss(this,2)),this.b):(!this.b&&(this.b=new ss(this,2)),this.b.b)}return uh(this,e-Jn(this.zh()),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():this.zh(),e),n,r)},l.jh=function(e,n,r){var s;switch(n){case 0:return!this.c&&(this.c=new ss(this,0)),EI(this.c,e,r);case 1:return(!this.c&&(this.c=new ss(this,0)),u(u(Bc(this.c,(Ii(),X2)),153),69)).mk(e,r);case 2:return!this.b&&(this.b=new ss(this,2)),EI(this.b,e,r)}return s=u(yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():this.zh(),n),66),s.Nj().Rj(this,$mt(this),n-Jn(this.zh()),e,r)},l.lh=function(e){switch(e){case 0:return!!this.c&&this.c.i!=0;case 1:return!(!this.c&&(this.c=new ss(this,0)),u(Bc(this.c,(Ii(),X2)),153)).dc();case 2:return!!this.b&&this.b.i!=0}return oh(this,e-Jn(this.zh()),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():this.zh(),e))},l.sh=function(e,n){switch(e){case 0:!this.c&&(this.c=new ss(this,0)),nD(this.c,n);return;case 1:(!this.c&&(this.c=new ss(this,0)),u(u(Bc(this.c,(Ii(),X2)),153),215)).Wb(n);return;case 2:!this.b&&(this.b=new ss(this,2)),nD(this.b,n);return}gh(this,e-Jn(this.zh()),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():this.zh(),e),n)},l.zh=function(){return Ii(),ELt},l.Bh=function(e){switch(e){case 0:!this.c&&(this.c=new ss(this,0)),xr(this.c);return;case 1:(!this.c&&(this.c=new ss(this,0)),u(Bc(this.c,(Ii(),X2)),153)).$b();return;case 2:!this.b&&(this.b=new ss(this,2)),xr(this.b);return}fh(this,e-Jn(this.zh()),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():this.zh(),e))},l.Ib=function(){var e;return this.j&4?mf(this):(e=new _h(mf(this)),e.a+=" (mixed: ",l9(e,this.c),e.a+=", anyAttribute: ",l9(e,this.b),e.a+=")",e.a)},F(xs,"AnyTypeImpl",830),D(667,506,{105:1,92:1,90:1,56:1,49:1,97:1,2021:1,667:1},AB),l._g=function(e,n,r){switch(e){case 0:return this.a;case 1:return this.b}return uh(this,e-Jn((Ii(),h5)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():h5,e),n,r)},l.lh=function(e){switch(e){case 0:return this.a!=null;case 1:return this.b!=null}return oh(this,e-Jn((Ii(),h5)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():h5,e))},l.sh=function(e,n){switch(e){case 0:$tt(this,Br(n));return;case 1:kpt(this,Br(n));return}gh(this,e-Jn((Ii(),h5)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():h5,e),n)},l.zh=function(){return Ii(),h5},l.Bh=function(e){switch(e){case 0:this.a=null;return;case 1:this.b=null;return}fh(this,e-Jn((Ii(),h5)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():h5,e))},l.Ib=function(){var e;return this.j&4?mf(this):(e=new _h(mf(this)),e.a+=" (data: ",go(e,this.a),e.a+=", target: ",go(e,this.b),e.a+=")",e.a)},l.a=null,l.b=null,F(xs,"ProcessingInstructionImpl",667),D(668,830,{105:1,92:1,90:1,56:1,49:1,97:1,843:1,2022:1,668:1},Hqt),l._g=function(e,n,r){switch(e){case 0:return r?(!this.c&&(this.c=new ss(this,0)),this.c):(!this.c&&(this.c=new ss(this,0)),this.c.b);case 1:return r?(!this.c&&(this.c=new ss(this,0)),u(Bc(this.c,(Ii(),X2)),153)):(!this.c&&(this.c=new ss(this,0)),u(u(Bc(this.c,(Ii(),X2)),153),215)).kl();case 2:return r?(!this.b&&(this.b=new ss(this,2)),this.b):(!this.b&&(this.b=new ss(this,2)),this.b.b);case 3:return!this.c&&(this.c=new ss(this,0)),Br(SI(this.c,(Ii(),lA),!0));case 4:return gwt(this.a,(!this.c&&(this.c=new ss(this,0)),Br(SI(this.c,(Ii(),lA),!0))));case 5:return this.a}return uh(this,e-Jn((Ii(),f5)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():f5,e),n,r)},l.lh=function(e){switch(e){case 0:return!!this.c&&this.c.i!=0;case 1:return!(!this.c&&(this.c=new ss(this,0)),u(Bc(this.c,(Ii(),X2)),153)).dc();case 2:return!!this.b&&this.b.i!=0;case 3:return!this.c&&(this.c=new ss(this,0)),Br(SI(this.c,(Ii(),lA),!0))!=null;case 4:return gwt(this.a,(!this.c&&(this.c=new ss(this,0)),Br(SI(this.c,(Ii(),lA),!0))))!=null;case 5:return!!this.a}return oh(this,e-Jn((Ii(),f5)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():f5,e))},l.sh=function(e,n){switch(e){case 0:!this.c&&(this.c=new ss(this,0)),nD(this.c,n);return;case 1:(!this.c&&(this.c=new ss(this,0)),u(u(Bc(this.c,(Ii(),X2)),153),215)).Wb(n);return;case 2:!this.b&&(this.b=new ss(this,2)),nD(this.b,n);return;case 3:Jvt(this,Br(n));return;case 4:Jvt(this,pwt(this.a,n));return;case 5:vc(this,u(n,148));return}gh(this,e-Jn((Ii(),f5)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():f5,e),n)},l.zh=function(){return Ii(),f5},l.Bh=function(e){switch(e){case 0:!this.c&&(this.c=new ss(this,0)),xr(this.c);return;case 1:(!this.c&&(this.c=new ss(this,0)),u(Bc(this.c,(Ii(),X2)),153)).$b();return;case 2:!this.b&&(this.b=new ss(this,2)),xr(this.b);return;case 3:!this.c&&(this.c=new ss(this,0)),Oq(this.c,(Ii(),lA),null);return;case 4:Jvt(this,pwt(this.a,null));return;case 5:this.a=null;return}fh(this,e-Jn((Ii(),f5)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():f5,e))},F(xs,"SimpleAnyTypeImpl",668),D(669,506,{105:1,92:1,90:1,56:1,49:1,97:1,2023:1,669:1},qqt),l._g=function(e,n,r){switch(e){case 0:return r?(!this.a&&(this.a=new ss(this,0)),this.a):(!this.a&&(this.a=new ss(this,0)),this.a.b);case 1:return r?(!this.b&&(this.b=new _l((dn(),Qa),cc,this,1)),this.b):(!this.b&&(this.b=new _l((dn(),Qa),cc,this,1)),wD(this.b));case 2:return r?(!this.c&&(this.c=new _l((dn(),Qa),cc,this,2)),this.c):(!this.c&&(this.c=new _l((dn(),Qa),cc,this,2)),wD(this.c));case 3:return!this.a&&(this.a=new ss(this,0)),Bc(this.a,(Ii(),mP));case 4:return!this.a&&(this.a=new ss(this,0)),Bc(this.a,(Ii(),yP));case 5:return!this.a&&(this.a=new ss(this,0)),Bc(this.a,(Ii(),hA));case 6:return!this.a&&(this.a=new ss(this,0)),Bc(this.a,(Ii(),fA))}return uh(this,e-Jn((Ii(),Wv)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():Wv,e),n,r)},l.jh=function(e,n,r){var s;switch(n){case 0:return!this.a&&(this.a=new ss(this,0)),EI(this.a,e,r);case 1:return!this.b&&(this.b=new _l((dn(),Qa),cc,this,1)),Oj(this.b,e,r);case 2:return!this.c&&(this.c=new _l((dn(),Qa),cc,this,2)),Oj(this.c,e,r);case 5:return!this.a&&(this.a=new ss(this,0)),WWt(Bc(this.a,(Ii(),hA)),e,r)}return s=u(yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():(Ii(),Wv),n),66),s.Nj().Rj(this,$mt(this),n-Jn((Ii(),Wv)),e,r)},l.lh=function(e){switch(e){case 0:return!!this.a&&this.a.i!=0;case 1:return!!this.b&&this.b.f!=0;case 2:return!!this.c&&this.c.f!=0;case 3:return!this.a&&(this.a=new ss(this,0)),!hj(Bc(this.a,(Ii(),mP)));case 4:return!this.a&&(this.a=new ss(this,0)),!hj(Bc(this.a,(Ii(),yP)));case 5:return!this.a&&(this.a=new ss(this,0)),!hj(Bc(this.a,(Ii(),hA)));case 6:return!this.a&&(this.a=new ss(this,0)),!hj(Bc(this.a,(Ii(),fA)))}return oh(this,e-Jn((Ii(),Wv)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():Wv,e))},l.sh=function(e,n){switch(e){case 0:!this.a&&(this.a=new ss(this,0)),nD(this.a,n);return;case 1:!this.b&&(this.b=new _l((dn(),Qa),cc,this,1)),xz(this.b,n);return;case 2:!this.c&&(this.c=new _l((dn(),Qa),cc,this,2)),xz(this.c,n);return;case 3:!this.a&&(this.a=new ss(this,0)),Tx(Bc(this.a,(Ii(),mP))),!this.a&&(this.a=new ss(this,0)),g9(Bc(this.a,mP),u(n,14));return;case 4:!this.a&&(this.a=new ss(this,0)),Tx(Bc(this.a,(Ii(),yP))),!this.a&&(this.a=new ss(this,0)),g9(Bc(this.a,yP),u(n,14));return;case 5:!this.a&&(this.a=new ss(this,0)),Tx(Bc(this.a,(Ii(),hA))),!this.a&&(this.a=new ss(this,0)),g9(Bc(this.a,hA),u(n,14));return;case 6:!this.a&&(this.a=new ss(this,0)),Tx(Bc(this.a,(Ii(),fA))),!this.a&&(this.a=new ss(this,0)),g9(Bc(this.a,fA),u(n,14));return}gh(this,e-Jn((Ii(),Wv)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():Wv,e),n)},l.zh=function(){return Ii(),Wv},l.Bh=function(e){switch(e){case 0:!this.a&&(this.a=new ss(this,0)),xr(this.a);return;case 1:!this.b&&(this.b=new _l((dn(),Qa),cc,this,1)),this.b.c.$b();return;case 2:!this.c&&(this.c=new _l((dn(),Qa),cc,this,2)),this.c.c.$b();return;case 3:!this.a&&(this.a=new ss(this,0)),Tx(Bc(this.a,(Ii(),mP)));return;case 4:!this.a&&(this.a=new ss(this,0)),Tx(Bc(this.a,(Ii(),yP)));return;case 5:!this.a&&(this.a=new ss(this,0)),Tx(Bc(this.a,(Ii(),hA)));return;case 6:!this.a&&(this.a=new ss(this,0)),Tx(Bc(this.a,(Ii(),fA)));return}fh(this,e-Jn((Ii(),Wv)),yn(this.j&2?(!this.k&&(this.k=new nh),this.k).ck():Wv,e))},l.Ib=function(){var e;return this.j&4?mf(this):(e=new _h(mf(this)),e.a+=" (mixed: ",l9(e,this.a),e.a+=")",e.a)},F(xs,"XMLTypeDocumentRootImpl",669),D(1919,704,{105:1,92:1,90:1,471:1,147:1,56:1,108:1,49:1,97:1,150:1,114:1,115:1,2024:1},_m),l.Ih=function(e,n){switch(e.yj()){case 7:case 8:case 9:case 10:case 16:case 22:case 23:case 24:case 25:case 26:case 32:case 33:case 34:case 36:case 37:case 44:case 45:case 50:case 51:case 53:case 55:case 56:case 57:case 58:case 60:case 61:case 4:return n==null?null:$o(n);case 19:case 28:case 29:case 35:case 38:case 39:case 41:case 46:case 52:case 54:case 5:return Br(n);case 6:return bZe(u(n,190));case 12:case 47:case 49:case 11:return bhe(this,e,n);case 13:return n==null?null:r3n(u(n,240));case 15:case 14:return n==null?null:dnn(Xt(ye(n)));case 17:return mae((Ii(),n));case 18:return mae(n);case 21:case 20:return n==null?null:gnn(u(n,155).a);case 27:return wZe(u(n,190));case 30:return Fse((Ii(),u(n,15)));case 31:return Fse(u(n,15));case 40:return mZe((Ii(),n));case 42:return yae((Ii(),n));case 43:return yae(n);case 59:case 48:return vZe((Ii(),n));default:throw it(new Fn(QE+e.ne()+Cv))}},l.Jh=function(e){var n,r,s,o,h;switch(e.G==-1&&(e.G=(r=Rl(e),r?Hg(r.Mh(),e):-1)),e.G){case 0:return n=new Wpt,n;case 1:return s=new AB,s;case 2:return o=new Hqt,o;case 3:return h=new qqt,h;default:throw it(new Fn(Kct+e.zb+Cv))}},l.Kh=function(e,n){var r,s,o,h,d,v,k,C,M,j,H,G,K,tt,gt,Mt;switch(e.yj()){case 5:case 52:case 4:return n;case 6:return Ofn(n);case 8:case 7:return n==null?null:y0n(n);case 9:return n==null?null:AD(ql((s=$c(n,!0),s.length>0&&(Rr(0,s.length),s.charCodeAt(0)==43)?s.substr(1):s),-128,127)<<24>>24);case 10:return n==null?null:AD(ql((o=$c(n,!0),o.length>0&&(Rr(0,o.length),o.charCodeAt(0)==43)?o.substr(1):o),-128,127)<<24>>24);case 11:return Br(vv(this,(Ii(),I5e),n));case 12:return Br(vv(this,(Ii(),O5e),n));case 13:return n==null?null:new gbt($c(n,!0));case 15:case 14:return z2n(n);case 16:return Br(vv(this,(Ii(),P5e),n));case 17:return zie((Ii(),n));case 18:return zie(n);case 28:case 29:case 35:case 38:case 39:case 41:case 54:case 19:return $c(n,!0);case 21:case 20:return X2n(n);case 22:return Br(vv(this,(Ii(),F5e),n));case 23:return Br(vv(this,(Ii(),N5e),n));case 24:return Br(vv(this,(Ii(),B5e),n));case 25:return Br(vv(this,(Ii(),R5e),n));case 26:return Br(vv(this,(Ii(),j5e),n));case 27:return Afn(n);case 30:return qie((Ii(),n));case 31:return qie(n);case 32:return n==null?null:pe(ql((M=$c(n,!0),M.length>0&&(Rr(0,M.length),M.charCodeAt(0)==43)?M.substr(1):M),Sa,wi));case 33:return n==null?null:new Rp((j=$c(n,!0),j.length>0&&(Rr(0,j.length),j.charCodeAt(0)==43)?j.substr(1):j));case 34:return n==null?null:pe(ql((H=$c(n,!0),H.length>0&&(Rr(0,H.length),H.charCodeAt(0)==43)?H.substr(1):H),Sa,wi));case 36:return n==null?null:v2(Rq((G=$c(n,!0),G.length>0&&(Rr(0,G.length),G.charCodeAt(0)==43)?G.substr(1):G)));case 37:return n==null?null:v2(Rq((K=$c(n,!0),K.length>0&&(Rr(0,K.length),K.charCodeAt(0)==43)?K.substr(1):K)));case 40:return Vhn((Ii(),n));case 42:return Hie((Ii(),n));case 43:return Hie(n);case 44:return n==null?null:new Rp((tt=$c(n,!0),tt.length>0&&(Rr(0,tt.length),tt.charCodeAt(0)==43)?tt.substr(1):tt));case 45:return n==null?null:new Rp((gt=$c(n,!0),gt.length>0&&(Rr(0,gt.length),gt.charCodeAt(0)==43)?gt.substr(1):gt));case 46:return $c(n,!1);case 47:return Br(vv(this,(Ii(),$5e),n));case 59:case 48:return Hhn((Ii(),n));case 49:return Br(vv(this,(Ii(),z5e),n));case 50:return n==null?null:uE(ql((Mt=$c(n,!0),Mt.length>0&&(Rr(0,Mt.length),Mt.charCodeAt(0)==43)?Mt.substr(1):Mt),zH,32767)<<16>>16);case 51:return n==null?null:uE(ql((h=$c(n,!0),h.length>0&&(Rr(0,h.length),h.charCodeAt(0)==43)?h.substr(1):h),zH,32767)<<16>>16);case 53:return Br(vv(this,(Ii(),q5e),n));case 55:return n==null?null:uE(ql((d=$c(n,!0),d.length>0&&(Rr(0,d.length),d.charCodeAt(0)==43)?d.substr(1):d),zH,32767)<<16>>16);case 56:return n==null?null:uE(ql((v=$c(n,!0),v.length>0&&(Rr(0,v.length),v.charCodeAt(0)==43)?v.substr(1):v),zH,32767)<<16>>16);case 57:return n==null?null:v2(Rq((k=$c(n,!0),k.length>0&&(Rr(0,k.length),k.charCodeAt(0)==43)?k.substr(1):k)));case 58:return n==null?null:v2(Rq((C=$c(n,!0),C.length>0&&(Rr(0,C.length),C.charCodeAt(0)==43)?C.substr(1):C)));case 60:return n==null?null:pe(ql((r=$c(n,!0),r.length>0&&(Rr(0,r.length),r.charCodeAt(0)==43)?r.substr(1):r),Sa,wi));case 61:return n==null?null:pe(ql($c(n,!0),Sa,wi));default:throw it(new Fn(QE+e.ne()+Cv))}};var V5e,TLt,G5e,CLt;F(xs,"XMLTypeFactoryImpl",1919),D(586,179,{105:1,92:1,90:1,147:1,191:1,56:1,235:1,108:1,49:1,97:1,150:1,179:1,114:1,115:1,675:1,1945:1,586:1},AXt),l.N=!1,l.O=!1;var U5e=!1;F(xs,"XMLTypePackageImpl",586),D(1852,1,{837:1},hx),l._j=function(){return oxt(),exe},F(xs,"XMLTypePackageImpl/1",1852),D(1861,1,si,d1),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/10",1861),D(1862,1,si,LB),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/11",1862),D(1863,1,si,MB),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/12",1863),D(1864,1,si,DB),l.wj=function(e){return Bm(e)},l.xj=function(e){return Nt(la,ee,333,e,7,1)},F(xs,"XMLTypePackageImpl/13",1864),D(1865,1,si,IB),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/14",1865),D(1866,1,si,OB),l.wj=function(e){return _t(e,15)},l.xj=function(e){return Nt(wh,Ty,15,e,0,1)},F(xs,"XMLTypePackageImpl/15",1866),D(1867,1,si,PB),l.wj=function(e){return _t(e,15)},l.xj=function(e){return Nt(wh,Ty,15,e,0,1)},F(xs,"XMLTypePackageImpl/16",1867),D(1868,1,si,$f),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/17",1868),D(1869,1,si,du),l.wj=function(e){return _t(e,155)},l.xj=function(e){return Nt(i7,ee,155,e,0,1)},F(xs,"XMLTypePackageImpl/18",1869),D(1870,1,si,AJ),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/19",1870),D(1853,1,si,LJ),l.wj=function(e){return _t(e,843)},l.xj=function(e){return Nt(wP,De,843,e,0,1)},F(xs,"XMLTypePackageImpl/2",1853),D(1871,1,si,MJ),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/20",1871),D(1872,1,si,gu),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/21",1872),D(1873,1,si,cC),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/22",1873),D(1874,1,si,FB),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/23",1874),D(1875,1,si,NB),l.wj=function(e){return _t(e,190)},l.xj=function(e){return Nt(Gu,ee,190,e,0,2)},F(xs,"XMLTypePackageImpl/24",1875),D(1876,1,si,fx),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/25",1876),D(1877,1,si,DJ),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/26",1877),D(1878,1,si,$k),l.wj=function(e){return _t(e,15)},l.xj=function(e){return Nt(wh,Ty,15,e,0,1)},F(xs,"XMLTypePackageImpl/27",1878),D(1879,1,si,IJ),l.wj=function(e){return _t(e,15)},l.xj=function(e){return Nt(wh,Ty,15,e,0,1)},F(xs,"XMLTypePackageImpl/28",1879),D(1880,1,si,BB),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/29",1880),D(1854,1,si,OJ),l.wj=function(e){return _t(e,667)},l.xj=function(e){return Nt(mU,De,2021,e,0,1)},F(xs,"XMLTypePackageImpl/3",1854),D(1881,1,si,PJ),l.wj=function(e){return _t(e,19)},l.xj=function(e){return Nt(ja,ee,19,e,0,1)},F(xs,"XMLTypePackageImpl/30",1881),D(1882,1,si,uC),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/31",1882),D(1883,1,si,RB),l.wj=function(e){return _t(e,162)},l.xj=function(e){return Nt(Sv,ee,162,e,0,1)},F(xs,"XMLTypePackageImpl/32",1883),D(1884,1,si,UL),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/33",1884),D(1885,1,si,lC),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/34",1885),D(1886,1,si,FJ),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/35",1886),D(1887,1,si,NJ),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/36",1887),D(1888,1,si,WL),l.wj=function(e){return _t(e,15)},l.xj=function(e){return Nt(wh,Ty,15,e,0,1)},F(xs,"XMLTypePackageImpl/37",1888),D(1889,1,si,hC),l.wj=function(e){return _t(e,15)},l.xj=function(e){return Nt(wh,Ty,15,e,0,1)},F(xs,"XMLTypePackageImpl/38",1889),D(1890,1,si,g1),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/39",1890),D(1855,1,si,zk),l.wj=function(e){return _t(e,668)},l.xj=function(e){return Nt(vP,De,2022,e,0,1)},F(xs,"XMLTypePackageImpl/4",1855),D(1891,1,si,BJ),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/40",1891),D(1892,1,si,qk),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/41",1892),D(1893,1,si,YL),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/42",1893),D(1894,1,si,Wb),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/43",1894),D(1895,1,si,fC),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/44",1895),D(1896,1,si,KL),l.wj=function(e){return _t(e,184)},l.xj=function(e){return Nt(Av,ee,184,e,0,1)},F(xs,"XMLTypePackageImpl/45",1896),D(1897,1,si,zf),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/46",1897),D(1898,1,si,dC),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/47",1898),D(1899,1,si,p1),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/48",1899),D(ab,1,si,b1),l.wj=function(e){return _t(e,184)},l.xj=function(e){return Nt(Av,ee,184,e,0,1)},F(xs,"XMLTypePackageImpl/49",ab),D(1856,1,si,RJ),l.wj=function(e){return _t(e,669)},l.xj=function(e){return Nt(kLt,De,2023,e,0,1)},F(xs,"XMLTypePackageImpl/5",1856),D(1901,1,si,jJ),l.wj=function(e){return _t(e,162)},l.xj=function(e){return Nt(Sv,ee,162,e,0,1)},F(xs,"XMLTypePackageImpl/50",1901),D(1902,1,si,M3),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/51",1902),D(1903,1,si,Hk),l.wj=function(e){return _t(e,19)},l.xj=function(e){return Nt(ja,ee,19,e,0,1)},F(xs,"XMLTypePackageImpl/52",1903),D(1857,1,si,Vk),l.wj=function(e){return ra(e)},l.xj=function(e){return Nt(Ae,ee,2,e,6,1)},F(xs,"XMLTypePackageImpl/6",1857),D(1858,1,si,gC),l.wj=function(e){return _t(e,190)},l.xj=function(e){return Nt(Gu,ee,190,e,0,2)},F(xs,"XMLTypePackageImpl/7",1858),D(1859,1,si,$J),l.wj=function(e){return Nm(e)},l.xj=function(e){return Nt(Rs,ee,476,e,8,1)},F(xs,"XMLTypePackageImpl/8",1859),D(1860,1,si,dx),l.wj=function(e){return _t(e,217)},l.xj=function(e){return Nt(M6,ee,217,e,0,1)},F(xs,"XMLTypePackageImpl/9",1860);var Y1,lp,dA,yU,wt;D(50,60,Q0,Nr),F(Zg,"RegEx/ParseException",50),D(820,1,{},XL),l.sl=function(e){return er*16)throw it(new Nr(qr((Pr(),g0e))));r=r*16+o}while(!0);if(this.a!=125)throw it(new Nr(qr((Pr(),p0e))));if(r>e7)throw it(new Nr(qr((Pr(),b0e))));e=r}else{if(o=0,this.c!=0||(o=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(r=o,fi(this),this.c!=0||(o=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));r=r*16+o,e=r}break;case 117:if(s=0,fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(n=s,fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(n=n*16+s,fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(n=n*16+s,fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));n=n*16+s,e=n;break;case 118:if(fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(n=s,fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(n=n*16+s,fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(n=n*16+s,fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(n=n*16+s,fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(n=n*16+s,fi(this),this.c!=0||(s=y2(this.a))<0)throw it(new Nr(qr((Pr(),Qg))));if(n=n*16+s,n>e7)throw it(new Nr(qr((Pr(),"parser.descappe.4"))));e=n;break;case 65:case 90:case 122:throw it(new Nr(qr((Pr(),w0e))))}return e},l.ul=function(e){var n,r;switch(e){case 100:r=(this.e&32)==32?ib("Nd",!0):(gi(),xU);break;case 68:r=(this.e&32)==32?ib("Nd",!1):(gi(),DLt);break;case 119:r=(this.e&32)==32?ib("IsWord",!0):(gi(),q7);break;case 87:r=(this.e&32)==32?ib("IsWord",!1):(gi(),OLt);break;case 115:r=(this.e&32)==32?ib("IsSpace",!0):(gi(),ek);break;case 83:r=(this.e&32)==32?ib("IsSpace",!1):(gi(),ILt);break;default:throw it(new Vo((n=e,wge+n.toString(16))))}return r},l.vl=function(e){var n,r,s,o,h,d,v,k,C,M,j,H;for(this.b=1,fi(this),n=null,this.c==0&&this.a==94?(fi(this),e?M=(gi(),gi(),new Nl(5)):(n=(gi(),gi(),new Nl(4)),jc(n,0,e7),M=new Nl(4))):M=(gi(),gi(),new Nl(4)),o=!0;(H=this.c)!=1&&!(H==0&&this.a==93&&!o);){if(o=!1,r=this.a,s=!1,H==10)switch(r){case 100:case 68:case 119:case 87:case 115:case 83:yy(M,this.ul(r)),s=!0;break;case 105:case 73:case 99:case 67:r=this.Ll(M,r),r<0&&(s=!0);break;case 112:case 80:if(j=u5t(this,r),!j)throw it(new Nr(qr((Pr(),cut))));yy(M,j),s=!0;break;default:r=this.tl()}else if(H==20){if(d=v8(this.i,58,this.d),d<0)throw it(new Nr(qr((Pr(),O8t))));if(v=!0,wa(this.i,this.d)==94&&(++this.d,v=!1),h=Pl(this.i,this.d,d),k=Lte(h,v,(this.e&512)==512),!k)throw it(new Nr(qr((Pr(),u0e))));if(yy(M,k),s=!0,d+1>=this.j||wa(this.i,d+1)!=93)throw it(new Nr(qr((Pr(),O8t))));this.d=d+2}if(fi(this),!s)if(this.c!=0||this.a!=45)jc(M,r,r);else{if(fi(this),(H=this.c)==1)throw it(new Nr(qr((Pr(),PH))));H==0&&this.a==93?(jc(M,r,r),jc(M,45,45)):(C=this.a,H==10&&(C=this.tl()),fi(this),jc(M,r,C))}(this.e&xf)==xf&&this.c==0&&this.a==44&&fi(this)}if(this.c==1)throw it(new Nr(qr((Pr(),PH))));return n&&(L_(n,M),M=n),v4(M),S_(M),this.b=0,fi(this),M},l.wl=function(){var e,n,r,s;for(r=this.vl(!1);(s=this.c)!=7;)if(e=this.a,s==0&&(e==45||e==38)||s==4){if(fi(this),this.c!=9)throw it(new Nr(qr((Pr(),h0e))));if(n=this.vl(!1),s==4)yy(r,n);else if(e==45)L_(r,n);else if(e==38)lhe(r,n);else throw it(new Vo("ASSERT"))}else throw it(new Nr(qr((Pr(),f0e))));return fi(this),r},l.xl=function(){var e,n;return e=this.a-48,n=(gi(),gi(),new krt(12,null,e)),!this.g&&(this.g=new ER),kR(this.g,new Spt(e)),fi(this),n},l.yl=function(){return fi(this),gi(),K5e},l.zl=function(){return fi(this),gi(),Y5e},l.Al=function(){throw it(new Nr(qr((Pr(),bh))))},l.Bl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Cl=function(){return fi(this),Gun()},l.Dl=function(){return fi(this),gi(),Q5e},l.El=function(){return fi(this),gi(),J5e},l.Fl=function(){var e;if(this.d>=this.j||((e=wa(this.i,this.d++))&65504)!=64)throw it(new Nr(qr((Pr(),a0e))));return fi(this),gi(),gi(),new Yd(0,e-64)},l.Gl=function(){return fi(this),Ayn()},l.Hl=function(){return fi(this),gi(),txe},l.Il=function(){var e;return e=(gi(),gi(),new Yd(0,105)),fi(this),e},l.Jl=function(){return fi(this),gi(),Z5e},l.Kl=function(){return fi(this),gi(),X5e},l.Ll=function(e,n){return this.tl()},l.Ml=function(){return fi(this),gi(),LLt},l.Nl=function(){var e,n,r,s,o;if(this.d+1>=this.j)throw it(new Nr(qr((Pr(),r0e))));if(s=-1,n=null,e=wa(this.i,this.d),49<=e&&e<=57){if(s=e-48,!this.g&&(this.g=new ER),kR(this.g,new Spt(s)),++this.d,wa(this.i,this.d)!=41)throw it(new Nr(qr((Pr(),I2))));++this.d}else switch(e==63&&--this.d,fi(this),n=Ixt(this),n.e){case 20:case 21:case 22:case 23:break;case 8:if(this.c!=7)throw it(new Nr(qr((Pr(),I2))));break;default:throw it(new Nr(qr((Pr(),i0e))))}if(fi(this),o=cv(this),r=null,o.e==2){if(o.em()!=2)throw it(new Nr(qr((Pr(),s0e))));r=o.am(1),o=o.am(0)}if(this.c!=7)throw it(new Nr(qr((Pr(),I2))));return fi(this),gi(),gi(),new oee(s,n,o,r)},l.Ol=function(){return fi(this),gi(),MLt},l.Pl=function(){var e;if(fi(this),e=i$(24,cv(this)),this.c!=7)throw it(new Nr(qr((Pr(),I2))));return fi(this),e},l.Ql=function(){var e;if(fi(this),e=i$(20,cv(this)),this.c!=7)throw it(new Nr(qr((Pr(),I2))));return fi(this),e},l.Rl=function(){var e;if(fi(this),e=i$(22,cv(this)),this.c!=7)throw it(new Nr(qr((Pr(),I2))));return fi(this),e},l.Sl=function(){var e,n,r,s,o;for(e=0,r=0,n=-1;this.d=this.j)throw it(new Nr(qr((Pr(),D8t))));if(n==45){for(++this.d;this.d=this.j)throw it(new Nr(qr((Pr(),D8t))))}if(n==58){if(++this.d,fi(this),s=fXt(cv(this),e,r),this.c!=7)throw it(new Nr(qr((Pr(),I2))));fi(this)}else if(n==41)++this.d,fi(this),s=fXt(cv(this),e,r);else throw it(new Nr(qr((Pr(),n0e))));return s},l.Tl=function(){var e;if(fi(this),e=i$(21,cv(this)),this.c!=7)throw it(new Nr(qr((Pr(),I2))));return fi(this),e},l.Ul=function(){var e;if(fi(this),e=i$(23,cv(this)),this.c!=7)throw it(new Nr(qr((Pr(),I2))));return fi(this),e},l.Vl=function(){var e,n;if(fi(this),e=this.f++,n=Knt(cv(this),e),this.c!=7)throw it(new Nr(qr((Pr(),I2))));return fi(this),n},l.Wl=function(){var e;if(fi(this),e=Knt(cv(this),0),this.c!=7)throw it(new Nr(qr((Pr(),I2))));return fi(this),e},l.Xl=function(e){return fi(this),this.c==5?(fi(this),Yj(e,(gi(),gi(),new Xm(9,e)))):Yj(e,(gi(),gi(),new Xm(3,e)))},l.Yl=function(e){var n;return fi(this),n=(gi(),gi(),new d9(2)),this.c==5?(fi(this),E2(n,pA),E2(n,e)):(E2(n,e),E2(n,pA)),n},l.Zl=function(e){return fi(this),this.c==5?(fi(this),gi(),gi(),new Xm(9,e)):(gi(),gi(),new Xm(3,e))},l.a=0,l.b=0,l.c=0,l.d=0,l.e=0,l.f=1,l.g=null,l.j=0,F(Zg,"RegEx/RegexParser",820),D(1824,820,{},Vqt),l.sl=function(e){return!1},l.tl=function(){return H5t(this)},l.ul=function(e){return ME(e)},l.vl=function(e){return nfe(this)},l.wl=function(){throw it(new Nr(qr((Pr(),bh))))},l.xl=function(){throw it(new Nr(qr((Pr(),bh))))},l.yl=function(){throw it(new Nr(qr((Pr(),bh))))},l.zl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Al=function(){return fi(this),ME(67)},l.Bl=function(){return fi(this),ME(73)},l.Cl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Dl=function(){throw it(new Nr(qr((Pr(),bh))))},l.El=function(){throw it(new Nr(qr((Pr(),bh))))},l.Fl=function(){return fi(this),ME(99)},l.Gl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Hl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Il=function(){return fi(this),ME(105)},l.Jl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Kl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Ll=function(e,n){return yy(e,ME(n)),-1},l.Ml=function(){return fi(this),gi(),gi(),new Yd(0,94)},l.Nl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Ol=function(){return fi(this),gi(),gi(),new Yd(0,36)},l.Pl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Ql=function(){throw it(new Nr(qr((Pr(),bh))))},l.Rl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Sl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Tl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Ul=function(){throw it(new Nr(qr((Pr(),bh))))},l.Vl=function(){var e;if(fi(this),e=Knt(cv(this),0),this.c!=7)throw it(new Nr(qr((Pr(),I2))));return fi(this),e},l.Wl=function(){throw it(new Nr(qr((Pr(),bh))))},l.Xl=function(e){return fi(this),Yj(e,(gi(),gi(),new Xm(3,e)))},l.Yl=function(e){var n;return fi(this),n=(gi(),gi(),new d9(2)),E2(n,e),E2(n,pA),n},l.Zl=function(e){return fi(this),gi(),gi(),new Xm(3,e)};var d5=null,$7=null;F(Zg,"RegEx/ParserForXMLSchema",1824),D(117,1,n7,yw),l.$l=function(e){throw it(new Vo("Not supported."))},l._l=function(){return-1},l.am=function(e){return null},l.bm=function(){return null},l.cm=function(e){},l.dm=function(e){},l.em=function(){return 0},l.Ib=function(){return this.fm(0)},l.fm=function(e){return this.e==11?".":""},l.e=0;var _Lt,z7,gA,W5e,SLt,s3=null,xU,Hft=null,ALt,pA,Vft=null,LLt,MLt,DLt,ILt,OLt,Y5e,ek,K5e,X5e,Q5e,Z5e,q7,J5e,txe,k6n=F(Zg,"RegEx/Token",117);D(136,117,{3:1,136:1,117:1},Nl),l.fm=function(e){var n,r,s;if(this.e==4)if(this==ALt)r=".";else if(this==xU)r="\\d";else if(this==q7)r="\\w";else if(this==ek)r="\\s";else{for(s=new Ag,s.a+="[",n=0;n0&&(s.a+=","),this.b[n]===this.b[n+1]?go(s,_I(this.b[n])):(go(s,_I(this.b[n])),s.a+="-",go(s,_I(this.b[n+1])));s.a+="]",r=s.a}else if(this==DLt)r="\\D";else if(this==OLt)r="\\W";else if(this==ILt)r="\\S";else{for(s=new Ag,s.a+="[^",n=0;n0&&(s.a+=","),this.b[n]===this.b[n+1]?go(s,_I(this.b[n])):(go(s,_I(this.b[n])),s.a+="-",go(s,_I(this.b[n+1])));s.a+="]",r=s.a}return r},l.a=!1,l.c=!1,F(Zg,"RegEx/RangeToken",136),D(584,1,{584:1},Spt),l.a=0,F(Zg,"RegEx/RegexParser/ReferencePosition",584),D(583,1,{3:1,583:1},eVt),l.Fb=function(e){var n;return e==null||!_t(e,583)?!1:(n=u(e,583),hn(this.b,n.b)&&this.a==n.a)},l.Hb=function(){return Vg(this.b+"/"+B5t(this.a))},l.Ib=function(){return this.c.fm(this.a)},l.a=0,F(Zg,"RegEx/RegularExpression",583),D(223,117,n7,Yd),l._l=function(){return this.a},l.fm=function(e){var n,r,s;switch(this.e){case 0:switch(this.a){case 124:case 42:case 43:case 63:case 40:case 41:case 46:case 91:case 123:case 92:s="\\"+knt(this.a&ys);break;case 12:s="\\f";break;case 10:s="\\n";break;case 13:s="\\r";break;case 9:s="\\t";break;case 27:s="\\e";break;default:this.a>=Ka?(r=(n=this.a>>>0,"0"+n.toString(16)),s="\\v"+Pl(r,r.length-6,r.length)):s=""+knt(this.a&ys)}break;case 8:this==LLt||this==MLt?s=""+knt(this.a&ys):s="\\"+knt(this.a&ys);break;default:s=null}return s},l.a=0,F(Zg,"RegEx/Token/CharToken",223),D(309,117,n7,Xm),l.am=function(e){return this.a},l.cm=function(e){this.b=e},l.dm=function(e){this.c=e},l.em=function(){return 1},l.fm=function(e){var n;if(this.e==3)if(this.c<0&&this.b<0)n=this.a.fm(e)+"*";else if(this.c==this.b)n=this.a.fm(e)+"{"+this.c+"}";else if(this.c>=0&&this.b>=0)n=this.a.fm(e)+"{"+this.c+","+this.b+"}";else if(this.c>=0&&this.b<0)n=this.a.fm(e)+"{"+this.c+",}";else throw it(new Vo("Token#toString(): CLOSURE "+this.c+Ya+this.b));else if(this.c<0&&this.b<0)n=this.a.fm(e)+"*?";else if(this.c==this.b)n=this.a.fm(e)+"{"+this.c+"}?";else if(this.c>=0&&this.b>=0)n=this.a.fm(e)+"{"+this.c+","+this.b+"}?";else if(this.c>=0&&this.b<0)n=this.a.fm(e)+"{"+this.c+",}?";else throw it(new Vo("Token#toString(): NONGREEDYCLOSURE "+this.c+Ya+this.b));return n},l.b=0,l.c=0,F(Zg,"RegEx/Token/ClosureToken",309),D(821,117,n7,mvt),l.am=function(e){return e==0?this.a:this.b},l.em=function(){return 2},l.fm=function(e){var n;return this.b.e==3&&this.b.am(0)==this.a?n=this.a.fm(e)+"+":this.b.e==9&&this.b.am(0)==this.a?n=this.a.fm(e)+"+?":n=this.a.fm(e)+(""+this.b.fm(e)),n},F(Zg,"RegEx/Token/ConcatToken",821),D(1822,117,n7,oee),l.am=function(e){if(e==0)return this.d;if(e==1)return this.b;throw it(new Vo("Internal Error: "+e))},l.em=function(){return this.b?2:1},l.fm=function(e){var n;return this.c>0?n="(?("+this.c+")":this.a.e==8?n="(?("+this.a+")":n="(?"+this.a,this.b?n+=this.d+"|"+this.b+")":n+=this.d+")",n},l.c=0,F(Zg,"RegEx/Token/ConditionToken",1822),D(1823,117,n7,oZt),l.am=function(e){return this.b},l.em=function(){return 1},l.fm=function(e){return"(?"+(this.a==0?"":B5t(this.a))+(this.c==0?"":B5t(this.c))+":"+this.b.fm(e)+")"},l.a=0,l.c=0,F(Zg,"RegEx/Token/ModifierToken",1823),D(822,117,n7,Cvt),l.am=function(e){return this.a},l.em=function(){return 1},l.fm=function(e){var n;switch(n=null,this.e){case 6:this.b==0?n="(?:"+this.a.fm(e)+")":n="("+this.a.fm(e)+")";break;case 20:n="(?="+this.a.fm(e)+")";break;case 21:n="(?!"+this.a.fm(e)+")";break;case 22:n="(?<="+this.a.fm(e)+")";break;case 23:n="(?"+this.a.fm(e)+")"}return n},l.b=0,F(Zg,"RegEx/Token/ParenToken",822),D(521,117,{3:1,117:1,521:1},krt),l.bm=function(){return this.b},l.fm=function(e){return this.e==12?"\\"+this.a:Nbn(this.b)},l.a=0,F(Zg,"RegEx/Token/StringToken",521),D(465,117,n7,d9),l.$l=function(e){E2(this,e)},l.am=function(e){return u(zw(this.a,e),117)},l.em=function(){return this.a?this.a.a.c.length:0},l.fm=function(e){var n,r,s,o,h;if(this.e==1){if(this.a.a.c.length==2)n=u(zw(this.a,0),117),r=u(zw(this.a,1),117),r.e==3&&r.am(0)==n?o=n.fm(e)+"+":r.e==9&&r.am(0)==n?o=n.fm(e)+"+?":o=n.fm(e)+(""+r.fm(e));else{for(h=new Ag,s=0;s=this.c.b:this.a<=this.c.b},l.Sb=function(){return this.b>0},l.Tb=function(){return this.b},l.Vb=function(){return this.b-1},l.Qb=function(){throw it(new Sg(Tge))},l.a=0,l.b=0,F(Z8t,"ExclusiveRange/RangeIterator",254);var xh=A8(FH,"C"),Cr=A8(rS,"I"),pl=A8(b6,"Z"),Ob=A8(iS,"J"),Gu=A8(tS,"B"),aa=A8(eS,"D"),a3=A8(nS,"F"),g5=A8(sS,"S"),E6n=Ki("org.eclipse.elk.core.labels","ILabelManager"),PLt=Ki(Ra,"DiagnosticChain"),FLt=Ki(Z0e,"ResourceSet"),NLt=F(Ra,"InvocationTargetException",null),nxe=(AR(),gan),rxe=rxe=r0n;ucn(nKe),Fcn("permProps",[[[YH,KH],[XH,"gecko1_8"]],[[YH,KH],[XH,"ie10"]],[[YH,KH],[XH,"ie8"]],[[YH,KH],[XH,"ie9"]],[[YH,KH],[XH,"safari"]]]),rxe(null,"elk",null)}).call(this)}).call(this,typeof b0<"u"?b0:typeof self<"u"?self:typeof window<"u"?window:{})},{}],3:[function(f,p,w){function m(I,B){if(!(I instanceof B))throw new TypeError("Cannot call a class as a function")}function b(I,B){if(!I)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return B&&(typeof B=="object"||typeof B=="function")?B:I}function E(I,B){if(typeof B!="function"&&B!==null)throw new TypeError("Super expression must either be null or a function, not "+typeof B);I.prototype=Object.create(B&&B.prototype,{constructor:{value:I,enumerable:!1,writable:!0,configurable:!0}}),B&&(Object.setPrototypeOf?Object.setPrototypeOf(I,B):I.__proto__=B)}var _=f("./elk-api.js").default,A=function(I){E(B,I);function B(){var N=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};m(this,B);var R=Object.assign({},N),z=!1;try{f.resolve("web-worker"),z=!0}catch{}if(N.workerUrl)if(z){var W=f("web-worker");R.workerFactory=function(at){return new W(at)}}else console.warn(`Web worker requested but 'web-worker' package not installed. +Consider installing the package or pass your own 'workerFactory' to ELK's constructor. +... Falling back to non-web worker version.`);if(!R.workerFactory){var et=f("./elk-worker.min.js"),st=et.Worker;R.workerFactory=function(at){return new st(at)}}return b(this,(B.__proto__||Object.getPrototypeOf(B)).call(this,R))}return B}(_);Object.defineProperty(p.exports,"__esModule",{value:!0}),p.exports=A,A.default=A},{"./elk-api.js":1,"./elk-worker.min.js":2,"web-worker":4}],4:[function(f,p,w){p.exports=Worker},{}]},{},[3])(3)})})(Bjt);var oWe=Bjt.exports;const cWe=G7(oWe),Rjt=new cWe;let ow={};const uWe={};let q5={};const lWe=async function(i,a,f,p,w,m,b){const _=f.select(`[id="${a}"]`).insert("g").attr("class","nodes"),A=Object.keys(i);return await Promise.all(A.map(async function(I){const B=i[I];let N="default";B.classes.length>0&&(N=B.classes.join(" ")),N=N+" flowchart-label";const R=im(B.styles);let z=B.text!==void 0?B.text:B.id;const W={width:0,height:0},et=[{id:B.id+"-west",layoutOptions:{"port.side":"WEST"}},{id:B.id+"-east",layoutOptions:{"port.side":"EAST"}},{id:B.id+"-south",layoutOptions:{"port.side":"SOUTH"}},{id:B.id+"-north",layoutOptions:{"port.side":"NORTH"}}];let st=0,at="",bt={};switch(B.type){case"round":st=5,at="rect";break;case"square":at="rect";break;case"diamond":at="question",bt={portConstraints:"FIXED_SIDE"};break;case"hexagon":at="hexagon";break;case"odd":at="rect_left_inv_arrow";break;case"lean_right":at="lean_right";break;case"lean_left":at="lean_left";break;case"trapezoid":at="trapezoid";break;case"inv_trapezoid":at="inv_trapezoid";break;case"odd_right":at="rect_left_inv_arrow";break;case"circle":at="circle";break;case"ellipse":at="ellipse";break;case"stadium":at="stadium";break;case"subroutine":at="subroutine";break;case"cylinder":at="cylinder";break;case"group":at="rect";break;case"doublecircle":at="doublecircle";break;default:at="rect"}const mt={labelStyle:R.labelStyle,shape:at,labelText:z,labelType:B.labelType,rx:st,ry:st,class:N,style:R.style,id:B.id,link:B.link,linkTarget:B.linkTarget,tooltip:w.db.getTooltip(B.id)||"",domId:w.db.lookUpDomId(B.id),haveCallback:B.haveCallback,width:B.type==="group"?500:void 0,dir:B.dir,type:B.type,props:B.props,padding:Fd().flowchart.padding};let yt,ft;if(mt.type!=="group")ft=await kBt(_,mt,B.dir),yt=ft.node().getBBox();else{p.createElementNS("http://www.w3.org/2000/svg","text");const{shapeSvg:vt,bbox:X}=await Nd(_,mt,void 0,!0);W.width=X.width,W.wrappingWidth=Fd().flowchart.wrappingWidth,W.height=X.height,W.labelNode=vt.node(),mt.labelData=W}const ut={id:B.id,ports:B.type==="diamond"?et:[],layoutOptions:bt,labelText:z,labelData:W,domId:w.db.lookUpDomId(B.id),width:yt==null?void 0:yt.width,height:yt==null?void 0:yt.height,type:B.type,el:ft,parent:m.parentById[B.id]};q5[mt.id]=ut})),b},jjt=(i,a,f)=>{const p={TB:{in:{north:"north"},out:{south:"west",west:"east",east:"south"}},LR:{in:{west:"west"},out:{east:"south",south:"north",north:"east"}},RL:{in:{east:"east"},out:{west:"north",north:"south",south:"west"}},BT:{in:{south:"south"},out:{north:"east",east:"west",west:"north"}}};return p.TD=p.TB,Ut.info("abc88",f,a,i),p[f][a][i]},$jt=(i,a,f)=>{if(Ut.info("getNextPort abc88",{node:i,edgeDirection:a,graphDirection:f}),!ow[i])switch(f){case"TB":case"TD":ow[i]={inPosition:"north",outPosition:"south"};break;case"BT":ow[i]={inPosition:"south",outPosition:"north"};break;case"RL":ow[i]={inPosition:"east",outPosition:"west"};break;case"LR":ow[i]={inPosition:"west",outPosition:"east"};break}const p=a==="in"?ow[i].inPosition:ow[i].outPosition;return a==="in"?ow[i].inPosition=jjt(ow[i].inPosition,a,f):ow[i].outPosition=jjt(ow[i].outPosition,a,f),p},hWe=(i,a)=>{let f=i.start,p=i.end;const w=f,m=p,b=q5[f],E=q5[p];return!b||!E?{source:f,target:p}:(b.type==="diamond"&&(f=`${f}-${$jt(f,"out",a)}`),E.type==="diamond"&&(p=`${p}-${$jt(p,"in",a)}`),{source:f,target:p,sourceId:w,targetId:m})},fWe=function(i,a,f,p){Ut.info("abc78 edges = ",i);const w=p.insert("g").attr("class","edgeLabels");let m={},b=a.db.getDirection(),E,_;if(i.defaultStyle!==void 0){const A=im(i.defaultStyle);E=A.style,_=A.labelStyle}return i.forEach(function(A){const I="L-"+A.start+"-"+A.end;m[I]===void 0?(m[I]=0,Ut.info("abc78 new entry",I,m[I])):(m[I]++,Ut.info("abc78 new entry",I,m[I]));let B=I+"-"+m[I];Ut.info("abc78 new link id to be used is",I,B,m[I]);const N="LS-"+A.start,R="LE-"+A.end,z={style:"",labelStyle:""};switch(z.minlen=A.length||1,A.type==="arrow_open"?z.arrowhead="none":z.arrowhead="normal",z.arrowTypeStart="arrow_open",z.arrowTypeEnd="arrow_open",A.type){case"double_arrow_cross":z.arrowTypeStart="arrow_cross";case"arrow_cross":z.arrowTypeEnd="arrow_cross";break;case"double_arrow_point":z.arrowTypeStart="arrow_point";case"arrow_point":z.arrowTypeEnd="arrow_point";break;case"double_arrow_circle":z.arrowTypeStart="arrow_circle";case"arrow_circle":z.arrowTypeEnd="arrow_circle";break}let W="",et="";switch(A.stroke){case"normal":W="fill:none;",E!==void 0&&(W=E),_!==void 0&&(et=_),z.thickness="normal",z.pattern="solid";break;case"dotted":z.thickness="normal",z.pattern="dotted",z.style="fill:none;stroke-width:2px;stroke-dasharray:3;";break;case"thick":z.thickness="thick",z.pattern="solid",z.style="stroke-width: 3.5px;fill:none;";break}if(A.style!==void 0){const ft=im(A.style);W=ft.style,et=ft.labelStyle}z.style=z.style+=W,z.labelStyle=z.labelStyle+=et,A.interpolate!==void 0?z.curve=ew(A.interpolate,cg):i.defaultInterpolate!==void 0?z.curve=ew(i.defaultInterpolate,cg):z.curve=ew(uWe.curve,cg),A.text===void 0?A.style!==void 0&&(z.arrowheadStyle="fill: #333"):(z.arrowheadStyle="fill: #333",z.labelpos="c"),z.labelType=A.labelType,z.label=A.text.replace(Kr.lineBreakRegex,` +`),A.style===void 0&&(z.style=z.style||"stroke: #333; stroke-width: 1.5px;fill:none;"),z.labelStyle=z.labelStyle.replace("color:","fill:"),z.id=B,z.classes="flowchart-link "+N+" "+R;const st=_Bt(w,z),{source:at,target:bt,sourceId:mt,targetId:yt}=hWe(A,b);Ut.debug("abc78 source and target",at,bt),f.edges.push({id:"e"+A.start+A.end,sources:[at],targets:[bt],sourceId:mt,targetId:yt,labelEl:st,labels:[{width:z.width,height:z.height,orgWidth:z.width,orgHeight:z.height,text:z.label,layoutOptions:{"edgeLabels.inline":"true","edgeLabels.placement":"CENTER"}}],edgeData:z})}),f},dWe=function(i,a,f,p,w){let m="";switch(p&&(m=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,m=m.replace(/\(/g,"\\("),m=m.replace(/\)/g,"\\)")),a.arrowTypeStart){case"arrow_cross":i.attr("marker-start","url("+m+"#"+w+"_"+f+"-crossStart)");break;case"arrow_point":i.attr("marker-start","url("+m+"#"+w+"_"+f+"-pointStart)");break;case"arrow_barb":i.attr("marker-start","url("+m+"#"+w+"_"+f+"-barbStart)");break;case"arrow_circle":i.attr("marker-start","url("+m+"#"+w+"_"+f+"-circleStart)");break;case"aggregation":i.attr("marker-start","url("+m+"#"+w+"_"+f+"-aggregationStart)");break;case"extension":i.attr("marker-start","url("+m+"#"+w+"_"+f+"-extensionStart)");break;case"composition":i.attr("marker-start","url("+m+"#"+w+"_"+f+"-compositionStart)");break;case"dependency":i.attr("marker-start","url("+m+"#"+w+"_"+f+"-dependencyStart)");break;case"lollipop":i.attr("marker-start","url("+m+"#"+w+"_"+f+"-lollipopStart)");break}switch(a.arrowTypeEnd){case"arrow_cross":i.attr("marker-end","url("+m+"#"+w+"_"+f+"-crossEnd)");break;case"arrow_point":i.attr("marker-end","url("+m+"#"+w+"_"+f+"-pointEnd)");break;case"arrow_barb":i.attr("marker-end","url("+m+"#"+w+"_"+f+"-barbEnd)");break;case"arrow_circle":i.attr("marker-end","url("+m+"#"+w+"_"+f+"-circleEnd)");break;case"aggregation":i.attr("marker-end","url("+m+"#"+w+"_"+f+"-aggregationEnd)");break;case"extension":i.attr("marker-end","url("+m+"#"+w+"_"+f+"-extensionEnd)");break;case"composition":i.attr("marker-end","url("+m+"#"+w+"_"+f+"-compositionEnd)");break;case"dependency":i.attr("marker-end","url("+m+"#"+w+"_"+f+"-dependencyEnd)");break;case"lollipop":i.attr("marker-end","url("+m+"#"+w+"_"+f+"-lollipopEnd)");break}},gWe=function(i,a){return Ut.info("Extracting classes"),a.db.getClasses()},pWe=function(i){const a={parentById:{},childrenById:{}},f=i.getSubGraphs();return Ut.info("Subgraphs - ",f),f.forEach(function(p){p.nodes.forEach(function(w){a.parentById[w]=p.id,a.childrenById[p.id]===void 0&&(a.childrenById[p.id]=[]),a.childrenById[p.id].push(w)})}),f.forEach(function(p){p.id,a.parentById[p.id]!==void 0&&a.parentById[p.id]}),a},bWe=function(i,a,f){const p=aWe(i,a,f);if(p===void 0||p==="root")return{x:0,y:0};const w=q5[p].offset;return{x:w.posX,y:w.posY}},wWe=function(i,a,f,p,w,m){const b=bWe(a.sourceId,a.targetId,w),E=a.sections[0].startPoint,_=a.sections[0].endPoint,I=(a.sections[0].bendPoints?a.sections[0].bendPoints:[]).map(bt=>[bt.x+b.x,bt.y+b.y]),B=[[E.x+b.x,E.y+b.y],...I,[_.x+b.x,_.y+b.y]],{x:N,y:R}=CBt(a.edgeData),z=E5().x(N).y(R).curve(cg),W=i.insert("path").attr("d",z(B)).attr("class","path "+f.classes).attr("fill","none"),et=i.insert("g").attr("class","edgeLabel"),st=yr(et.node().appendChild(a.labelEl)),at=st.node().firstChild.getBoundingClientRect();st.attr("width",at.width),st.attr("height",at.height),et.attr("transform",`translate(${a.labels[0].x+b.x}, ${a.labels[0].y+b.y})`),dWe(W,f,p.type,p.arrowMarkerAbsolute,m)},zjt=(i,a)=>{i.forEach(f=>{f.children||(f.children=[]);const p=a.childrenById[f.id];p&&p.forEach(w=>{f.children.push(q5[w])}),zjt(f.children,a)})},vWe=async function(i,a,f,p){var ut;p.db.clear(),q5={},ow={},p.db.setGen("gen-2"),p.parser.parse(i);const w=yr("body").append("div").attr("style","height:400px").attr("id","cy");let m={id:"root",layoutOptions:{"elk.hierarchyHandling":"INCLUDE_CHILDREN","org.eclipse.elk.padding":"[top=100, left=100, bottom=110, right=110]","elk.layered.spacing.edgeNodeBetweenLayers":"30","elk.direction":"DOWN"},children:[],edges:[]};switch(Ut.info("Drawing flowchart using v3 renderer",Rjt),p.db.getDirection()){case"BT":m.layoutOptions["elk.direction"]="UP";break;case"TB":m.layoutOptions["elk.direction"]="DOWN";break;case"LR":m.layoutOptions["elk.direction"]="RIGHT";break;case"RL":m.layoutOptions["elk.direction"]="LEFT";break}const{securityLevel:E,flowchart:_}=Fd();let A;E==="sandbox"&&(A=yr("#i"+a));const I=yr(E==="sandbox"?A.nodes()[0].contentDocument.body:"body"),B=E==="sandbox"?A.nodes()[0].contentDocument:document,N=I.select(`[id="${a}"]`);PNt(N,["point","circle","cross"],p.type,a);const z=p.db.getVertices();let W;const et=p.db.getSubGraphs();Ut.info("Subgraphs - ",et);for(let vt=et.length-1;vt>=0;vt--)W=et[vt],p.db.addVertex(W.id,{text:W.title,type:W.labelType},"group",void 0,W.classes,W.dir);const st=N.insert("g").attr("class","subgraphs"),at=pWe(p.db);m=await lWe(z,a,I,B,p,at,m);const bt=N.insert("g").attr("class","edges edgePath"),mt=p.db.getEdges();m=fWe(mt,p,m,N),Object.keys(q5).forEach(vt=>{const X=q5[vt];X.parent||m.children.push(X),at.childrenById[vt]!==void 0&&(X.labels=[{text:X.labelText,layoutOptions:{"nodeLabels.placement":"[H_CENTER, V_TOP, INSIDE]"},width:X.labelData.width,height:X.labelData.height}],delete X.x,delete X.y,delete X.width,delete X.height)}),zjt(m.children,at),Ut.info("after layout",JSON.stringify(m,null,2));const ft=await Rjt.layout(m);qjt(0,0,ft.children,N,st,p,0),Ut.info("after layout",ft),(ut=ft.edges)==null||ut.map(vt=>{wWe(bt,vt,vt.edgeData,p,at,a)}),fT({},N,_.diagramPadding,_.useMaxWidth),w.remove()},qjt=(i,a,f,p,w,m,b)=>{f.forEach(function(E){if(E)if(q5[E.id].offset={posX:E.x+i,posY:E.y+a,x:i,y:a,depth:b,width:E.width,height:E.height},E.type==="group"){const _=w.insert("g").attr("class","subgraph");_.insert("rect").attr("class","subgraph subgraph-lvl-"+b%5+" node").attr("x",E.x+i).attr("y",E.y+a).attr("width",E.width).attr("height",E.height);const A=_.insert("g").attr("class","label"),I=Fd().flowchart.htmlLabels?E.labelData.width/2:0;A.attr("transform",`translate(${E.labels[0].x+i+E.x+I}, ${E.labels[0].y+a+E.y+3})`),A.node().appendChild(E.labelData.labelNode),Ut.info("Id (UGH)= ",E.type,E.labels)}else Ut.info("Id (UGH)= ",E.id),E.el.attr("transform",`translate(${E.x+i+E.width/2}, ${E.y+a+E.height/2})`)}),f.forEach(function(E){E&&E.type==="group"&&qjt(i+E.x,a+E.y,E.children,p,w,m,b+1)})},mWe={getClasses:gWe,draw:vWe},yWe=i=>{let a="";for(let f=0;f<5;f++)a+=` + .subgraph-lvl-${f} { + fill: ${i[`surface${f}`]}; + stroke: ${i[`surfacePeer${f}`]}; + } + `;return a},xWe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{db:lIe,renderer:mWe,parser:Hdt,styles:i=>`.label { + font-family: ${i.fontFamily}; + color: ${i.nodeTextColor||i.textColor}; + } + .cluster-label text { + fill: ${i.titleColor}; + } + .cluster-label span { + color: ${i.titleColor}; + } + + .label text,span { + fill: ${i.nodeTextColor||i.textColor}; + color: ${i.nodeTextColor||i.textColor}; + } + + .node rect, + .node circle, + .node ellipse, + .node polygon, + .node path { + fill: ${i.mainBkg}; + stroke: ${i.nodeBorder}; + stroke-width: 1px; + } + + .node .label { + text-align: center; + } + .node.clickable { + cursor: pointer; + } + + .arrowheadPath { + fill: ${i.arrowheadColor}; + } + + .edgePath .path { + stroke: ${i.lineColor}; + stroke-width: 2.0px; + } + + .flowchart-link { + stroke: ${i.lineColor}; + fill: none; + } + + .edgeLabel { + background-color: ${i.edgeLabelBackground}; + rect { + opacity: 0.85; + background-color: ${i.edgeLabelBackground}; + fill: ${i.edgeLabelBackground}; + } + text-align: center; + } + + .cluster rect { + fill: ${i.clusterBkg}; + stroke: ${i.clusterBorder}; + stroke-width: 1px; + } + + .cluster text { + fill: ${i.titleColor}; + } + + .cluster span { + color: ${i.titleColor}; + } + /* .cluster div { + color: ${i.titleColor}; + } */ + + div.mermaidTooltip { + position: absolute; + text-align: center; + max-width: 200px; + padding: 2px; + font-family: ${i.fontFamily}; + font-size: 12px; + background: ${i.tertiaryColor}; + border: 1px solid ${i.border2}; + border-radius: 2px; + pointer-events: none; + z-index: 100; + } + + .flowchartTitleText { + text-anchor: middle; + font-size: 18px; + fill: ${i.textColor}; + } + .subgraph { + stroke-width:2; + rx:3; + } + // .subgraph-lvl-1 { + // fill:#ccc; + // // stroke:black; + // } + + .flowchart-label text { + text-anchor: middle; + } + + ${yWe(i)} +`}},Symbol.toStringTag,{value:"Module"}));var Ygt=function(){var i=function(N,R,z,W){for(z=z||{},W=N.length;W--;z[N[W]]=R);return z},a=[6,8,10,11,12,14,16,17,20,21],f=[1,9],p=[1,10],w=[1,11],m=[1,12],b=[1,13],E=[1,16],_=[1,17],A={trace:function(){},yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,period_statement:18,event_statement:19,period:20,event:21,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",20:"period",21:"event"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],performAction:function(R,z,W,et,st,at,bt){var mt=at.length-1;switch(st){case 1:return at[mt-1];case 2:this.$=[];break;case 3:at[mt-1].push(at[mt]),this.$=at[mt-1];break;case 4:case 5:this.$=at[mt];break;case 6:case 7:this.$=[];break;case 8:et.getCommonDb().setDiagramTitle(at[mt].substr(6)),this.$=at[mt].substr(6);break;case 9:this.$=at[mt].trim(),et.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=at[mt].trim(),et.getCommonDb().setAccDescription(this.$);break;case 12:et.addSection(at[mt].substr(8)),this.$=at[mt].substr(8);break;case 15:et.addTask(at[mt],0,""),this.$=at[mt];break;case 16:et.addEvent(at[mt].substr(2)),this.$=at[mt];break}},table:[{3:1,4:[1,2]},{1:[3]},i(a,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:f,12:p,14:w,16:m,17:b,18:14,19:15,20:E,21:_},i(a,[2,7],{1:[2,1]}),i(a,[2,3]),{9:18,11:f,12:p,14:w,16:m,17:b,18:14,19:15,20:E,21:_},i(a,[2,5]),i(a,[2,6]),i(a,[2,8]),{13:[1,19]},{15:[1,20]},i(a,[2,11]),i(a,[2,12]),i(a,[2,13]),i(a,[2,14]),i(a,[2,15]),i(a,[2,16]),i(a,[2,4]),i(a,[2,9]),i(a,[2,10])],defaultActions:{},parseError:function(R,z){if(z.recoverable)this.trace(R);else{var W=new Error(R);throw W.hash=z,W}},parse:function(R){var z=this,W=[0],et=[],st=[null],at=[],bt=this.table,mt="",yt=0,ft=0,ut=2,vt=1,X=at.slice.call(arguments,1),pt=Object.create(this.lexer),U={yy:{}};for(var Tt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Tt)&&(U.yy[Tt]=this.yy[Tt]);pt.setInput(R,U.yy),U.yy.lexer=pt,U.yy.parser=this,typeof pt.yylloc>"u"&&(pt.yylloc={});var nt=pt.yylloc;at.push(nt);var It=pt.options&&pt.options.ranges;typeof U.yy.parseError=="function"?this.parseError=U.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ot(){var me;return me=et.pop()||pt.lex()||vt,typeof me!="number"&&(me instanceof Array&&(et=me,me=et.pop()),me=z.symbols_[me]||me),me}for(var Bt,Et,Z,Ct,xt={},Ht,Le,Ft,gn;;){if(Et=W[W.length-1],this.defaultActions[Et]?Z=this.defaultActions[Et]:((Bt===null||typeof Bt>"u")&&(Bt=Ot()),Z=bt[Et]&&bt[Et][Bt]),typeof Z>"u"||!Z.length||!Z[0]){var Se="";gn=[];for(Ht in bt[Et])this.terminals_[Ht]&&Ht>ut&&gn.push("'"+this.terminals_[Ht]+"'");pt.showPosition?Se="Parse error on line "+(yt+1)+`: +`+pt.showPosition()+` +Expecting `+gn.join(", ")+", got '"+(this.terminals_[Bt]||Bt)+"'":Se="Parse error on line "+(yt+1)+": Unexpected "+(Bt==vt?"end of input":"'"+(this.terminals_[Bt]||Bt)+"'"),this.parseError(Se,{text:pt.match,token:this.terminals_[Bt]||Bt,line:pt.yylineno,loc:nt,expected:gn})}if(Z[0]instanceof Array&&Z.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Et+", token: "+Bt);switch(Z[0]){case 1:W.push(Bt),st.push(pt.yytext),at.push(pt.yylloc),W.push(Z[1]),Bt=null,ft=pt.yyleng,mt=pt.yytext,yt=pt.yylineno,nt=pt.yylloc;break;case 2:if(Le=this.productions_[Z[1]][1],xt.$=st[st.length-Le],xt._$={first_line:at[at.length-(Le||1)].first_line,last_line:at[at.length-1].last_line,first_column:at[at.length-(Le||1)].first_column,last_column:at[at.length-1].last_column},It&&(xt._$.range=[at[at.length-(Le||1)].range[0],at[at.length-1].range[1]]),Ct=this.performAction.apply(xt,[mt,ft,yt,U.yy,Z[1],st,at].concat(X)),typeof Ct<"u")return Ct;Le&&(W=W.slice(0,-1*Le*2),st=st.slice(0,-1*Le),at=at.slice(0,-1*Le)),W.push(this.productions_[Z[1]][0]),st.push(xt.$),at.push(xt._$),Ft=bt[W[W.length-2]][W[W.length-1]],W.push(Ft);break;case 3:return!0}}return!0}},I=function(){var N={EOF:1,parseError:function(z,W){if(this.yy.parser)this.yy.parser.parseError(z,W);else throw new Error(z)},setInput:function(R,z){return this.yy=z||this.yy||{},this._input=R,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var R=this._input[0];this.yytext+=R,this.yyleng++,this.offset++,this.match+=R,this.matched+=R;var z=R.match(/(?:\r\n?|\n).*/g);return z?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),R},unput:function(R){var z=R.length,W=R.split(/(?:\r\n?|\n)/g);this._input=R+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-z),this.offset-=z;var et=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),W.length-1&&(this.yylineno-=W.length-1);var st=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:W?(W.length===et.length?this.yylloc.first_column:0)+et[et.length-W.length].length-W[0].length:this.yylloc.first_column-z},this.options.ranges&&(this.yylloc.range=[st[0],st[0]+this.yyleng-z]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(R){this.unput(this.match.slice(R))},pastInput:function(){var R=this.matched.substr(0,this.matched.length-this.match.length);return(R.length>20?"...":"")+R.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var R=this.match;return R.length<20&&(R+=this._input.substr(0,20-R.length)),(R.substr(0,20)+(R.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var R=this.pastInput(),z=new Array(R.length+1).join("-");return R+this.upcomingInput()+` +`+z+"^"},test_match:function(R,z){var W,et,st;if(this.options.backtrack_lexer&&(st={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(st.yylloc.range=this.yylloc.range.slice(0))),et=R[0].match(/(?:\r\n?|\n).*/g),et&&(this.yylineno+=et.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:et?et[et.length-1].length-et[et.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+R[0].length},this.yytext+=R[0],this.match+=R[0],this.matches=R,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(R[0].length),this.matched+=R[0],W=this.performAction.call(this,this.yy,this,z,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),W)return W;if(this._backtrack){for(var at in st)this[at]=st[at];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var R,z,W,et;this._more||(this.yytext="",this.match="");for(var st=this._currentRules(),at=0;atz[0].length)){if(z=W,et=at,this.options.backtrack_lexer){if(R=this.test_match(W,st[at]),R!==!1)return R;if(this._backtrack){z=!1;continue}else return!1}else if(!this.options.flex)break}return z?(R=this.test_match(z,st[et]),R!==!1?R:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var z=this.next();return z||this.lex()},begin:function(z){this.conditionStack.push(z)},popState:function(){var z=this.conditionStack.length-1;return z>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(z){return z=this.conditionStack.length-1-Math.abs(z||0),z>=0?this.conditionStack[z]:"INITIAL"},pushState:function(z){this.begin(z)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(z,W,et,st){switch(et){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),14;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?::\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return N}();A.lexer=I;function B(){this.yy={}}return B.prototype=A,A.Parser=B,new B}();Ygt.parser=Ygt;const kWe=Ygt;let yL="",Hjt=0;const Kgt=[],eK=[],xL=[],Vjt=()=>_Ot,Gjt=function(){Kgt.length=0,eK.length=0,yL="",xL.length=0,hg()},Ujt=function(i){yL=i,Kgt.push(i)},Wjt=function(){return Kgt},Yjt=function(){let i=Zjt();const a=100;let f=0;for(;!i&&ff.id===Hjt-1).events.push(i)},Qjt=function(i){const a={section:yL,type:yL,description:i,task:i,classes:[]};eK.push(a)},Zjt=function(){const i=function(f){return xL[f].processed};let a=!0;for(const[f,p]of xL.entries())i(f),a=a&&p.processed;return a},EWe=Object.freeze(Object.defineProperty({__proto__:null,addEvent:Xjt,addSection:Ujt,addTask:Kjt,addTaskOrg:Qjt,clear:Gjt,default:{clear:Gjt,getCommonDb:Vjt,addSection:Ujt,getSections:Wjt,getTasks:Yjt,addTask:Kjt,addTaskOrg:Qjt,addEvent:Xjt},getCommonDb:Vjt,getSections:Wjt,getTasks:Yjt},Symbol.toStringTag,{value:"Module"})),TWe=12,nK=function(i,a){const f=i.append("rect");return f.attr("x",a.x),f.attr("y",a.y),f.attr("fill",a.fill),f.attr("stroke",a.stroke),f.attr("width",a.width),f.attr("height",a.height),f.attr("rx",a.rx),f.attr("ry",a.ry),a.class!==void 0&&f.attr("class",a.class),f},CWe=function(i,a){const p=i.append("circle").attr("cx",a.cx).attr("cy",a.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),w=i.append("g");w.append("circle").attr("cx",a.cx-15/3).attr("cy",a.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),w.append("circle").attr("cx",a.cx+15/3).attr("cy",a.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function m(_){const A=OA().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);_.append("path").attr("class","mouth").attr("d",A).attr("transform","translate("+a.cx+","+(a.cy+2)+")")}function b(_){const A=OA().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);_.append("path").attr("class","mouth").attr("d",A).attr("transform","translate("+a.cx+","+(a.cy+7)+")")}function E(_){_.append("line").attr("class","mouth").attr("stroke",2).attr("x1",a.cx-5).attr("y1",a.cy+7).attr("x2",a.cx+5).attr("y2",a.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return a.score>3?m(w):a.score<3?b(w):E(w),p},_We=function(i,a){const f=i.append("circle");return f.attr("cx",a.cx),f.attr("cy",a.cy),f.attr("class","actor-"+a.pos),f.attr("fill",a.fill),f.attr("stroke",a.stroke),f.attr("r",a.r),f.class!==void 0&&f.attr("class",f.class),a.title!==void 0&&f.append("title").text(a.title),f},Jjt=function(i,a){const f=a.text.replace(//gi," "),p=i.append("text");p.attr("x",a.x),p.attr("y",a.y),p.attr("class","legend"),p.style("text-anchor",a.anchor),a.class!==void 0&&p.attr("class",a.class);const w=p.append("tspan");return w.attr("x",a.x+a.textMargin*2),w.text(f),p},SWe=function(i,a){function f(w,m,b,E,_){return w+","+m+" "+(w+b)+","+m+" "+(w+b)+","+(m+E-_)+" "+(w+b-_*1.2)+","+(m+E)+" "+w+","+(m+E)}const p=i.append("polygon");p.attr("points",f(a.x,a.y,50,20,7)),p.attr("class","labelBox"),a.y=a.y+a.labelMargin,a.x=a.x+.5*a.labelMargin,Jjt(i,a)},AWe=function(i,a,f){const p=i.append("g"),w=Xgt();w.x=a.x,w.y=a.y,w.fill=a.fill,w.width=f.width,w.height=f.height,w.class="journey-section section-type-"+a.num,w.rx=3,w.ry=3,nK(p,w),e$t(f)(a.text,p,w.x,w.y,w.width,w.height,{class:"journey-section section-type-"+a.num},f,a.colour)};let t$t=-1;const LWe=function(i,a,f){const p=a.x+f.width/2,w=i.append("g");t$t++;const m=300+5*30;w.append("line").attr("id","task"+t$t).attr("x1",p).attr("y1",a.y).attr("x2",p).attr("y2",m).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),CWe(w,{cx:p,cy:300+(5-a.score)*30,score:a.score});const b=Xgt();b.x=a.x,b.y=a.y,b.fill=a.fill,b.width=f.width,b.height=f.height,b.class="task task-type-"+a.num,b.rx=3,b.ry=3,nK(w,b),a.x+14,e$t(f)(a.task,w,b.x,b.y,b.width,b.height,{class:"task"},f,a.colour)},MWe=function(i,a){nK(i,{x:a.startx,y:a.starty,width:a.stopx-a.startx,height:a.stopy-a.starty,fill:a.fill,class:"rect"}).lower()},DWe=function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},Xgt=function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},e$t=function(){function i(w,m,b,E,_,A,I,B){const N=m.append("text").attr("x",b+_/2).attr("y",E+A/2+5).style("font-color",B).style("text-anchor","middle").text(w);p(N,I)}function a(w,m,b,E,_,A,I,B,N){const{taskFontSize:R,taskFontFamily:z}=B,W=w.split(//gi);for(let et=0;et)/).reverse(),w,m=[],b=1.1,E=f.attr("y"),_=parseFloat(f.attr("dy")),A=f.text(null).append("tspan").attr("x",0).attr("y",E).attr("dy",_+"em");for(let I=0;Ia||w==="
")&&(m.pop(),A.text(m.join(" ").trim()),w==="
"?m=[""]:m=[w],A=f.append("tspan").attr("x",0).attr("y",E).attr("dy",b+"em").text(w))})}const OWe=function(i,a,f,p){const w=f%TWe-1,m=i.append("g");a.section=w,m.attr("class",(a.class?a.class+" ":"")+"timeline-node "+("section-"+w));const b=m.append("g"),E=m.append("g"),A=E.append("text").text(a.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(n$t,a.width).node().getBBox(),I=p.fontSize&&p.fontSize.replace?p.fontSize.replace("px",""):p.fontSize;return a.height=A.height+I*1.1*.5+a.padding,a.height=Math.max(a.height,a.maxHeight),a.width=a.width+2*a.padding,E.attr("transform","translate("+a.width/2+", "+a.padding/2+")"),FWe(b,a,w),a},PWe=function(i,a,f){const p=i.append("g"),m=p.append("text").text(a.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(n$t,a.width).node().getBBox(),b=f.fontSize&&f.fontSize.replace?f.fontSize.replace("px",""):f.fontSize;return p.remove(),m.height+b*1.1*.5+a.padding},FWe=function(i,a,f){i.append("path").attr("id","node-"+a.id).attr("class","node-bkg node-"+a.type).attr("d",`M0 ${a.height-5} v${-a.height+2*5} q0,-5 5,-5 h${a.width-2*5} q5,0 5,5 v${a.height-5} H0 Z`),i.append("line").attr("class","node-line-"+f).attr("x1",0).attr("y1",a.height).attr("x2",a.width).attr("y2",a.height)},DT={drawRect:nK,drawCircle:_We,drawSection:AWe,drawText:Jjt,drawLabel:SWe,drawTask:LWe,drawBackgroundRect:MWe,getTextObj:DWe,getNoteRect:Xgt,initGraphics:IWe,drawNode:OWe,getVirtualNodeHeight:PWe},NWe=function(i,a,f,p){var X,pt;const w=Oe(),m=w.leftMargin??50;Ut.debug("timeline",p.db);const b=w.securityLevel;let E;b==="sandbox"&&(E=yr("#i"+a));const A=yr(b==="sandbox"?E.nodes()[0].contentDocument.body:"body").select("#"+a);A.append("g");const I=p.db.getTasks(),B=p.db.getCommonDb().getDiagramTitle();Ut.debug("task",I),DT.initGraphics(A);const N=p.db.getSections();Ut.debug("sections",N);let R=0,z=0,W=0,et=0,st=50+m,at=50;et=50;let bt=0,mt=!0;N.forEach(function(U){const Tt={number:bt,descr:U,section:bt,width:150,padding:20,maxHeight:R},nt=DT.getVirtualNodeHeight(A,Tt,w);Ut.debug("sectionHeight before draw",nt),R=Math.max(R,nt+20)});let yt=0,ft=0;Ut.debug("tasks.length",I.length);for(const[U,Tt]of I.entries()){const nt={number:U,descr:Tt,section:Tt.section,width:150,padding:20,maxHeight:z},It=DT.getVirtualNodeHeight(A,nt,w);Ut.debug("taskHeight before draw",It),z=Math.max(z,It+20),yt=Math.max(yt,Tt.events.length);let Ot=0;for(let Bt=0;Bt0?N.forEach(U=>{const Tt=I.filter(Bt=>Bt.section===U),nt={number:bt,descr:U,section:bt,width:200*Math.max(Tt.length,1)-50,padding:20,maxHeight:R};Ut.debug("sectionNode",nt);const It=A.append("g"),Ot=DT.drawNode(It,nt,bt,w);Ut.debug("sectionNode output",Ot),It.attr("transform",`translate(${st}, ${et})`),at+=R+50,Tt.length>0&&r$t(A,Tt,bt,st,at,z,w,yt,ft,R,!1),st+=200*Math.max(Tt.length,1),at=et,bt++}):(mt=!1,r$t(A,I,bt,st,at,z,w,yt,ft,R,!0));const ut=A.node().getBBox();Ut.debug("bounds",ut),B&&A.append("text").text(B).attr("x",ut.width/2-m).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),W=mt?R+z+150:z+100,A.append("g").attr("class","lineWrapper").append("line").attr("x1",m).attr("y1",W).attr("x2",ut.width+3*m).attr("y2",W).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),fT(void 0,A,((X=w.timeline)==null?void 0:X.padding)??50,((pt=w.timeline)==null?void 0:pt.useMaxWidth)??!1)},r$t=function(i,a,f,p,w,m,b,E,_,A,I){var B;for(const N of a){const R={descr:N.task,section:f,number:f,width:150,padding:20,maxHeight:m};Ut.debug("taskNode",R);const z=i.append("g").attr("class","taskWrapper"),et=DT.drawNode(z,R,f,b).height;if(Ut.debug("taskHeight after draw",et),z.attr("transform",`translate(${p}, ${w})`),m=Math.max(m,et),N.events){const st=i.append("g").attr("class","lineWrapper");let at=m;w+=100,at=at+BWe(i,N.events,f,p,w,b),w-=100,st.append("line").attr("x1",p+190/2).attr("y1",w+m).attr("x2",p+190/2).attr("y2",w+m+(I?m:A)+_+120).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}p=p+200,I&&!((B=b.timeline)!=null&&B.disableMulticolor)&&f++}w=w-10},BWe=function(i,a,f,p,w,m){let b=0;const E=w;w=w+100;for(const _ of a){const A={descr:_,section:f,number:f,width:150,padding:20,maxHeight:50};Ut.debug("eventNode",A);const I=i.append("g").attr("class","eventWrapper"),N=DT.drawNode(I,A,f,m).height;b=b+N,I.attr("transform",`translate(${p}, ${w})`),w=w+10+N}return w=E,b},RWe={setConf:()=>{},draw:NWe},jWe=i=>{let a="";for(let f=0;f` + .edge { + stroke-width: 3; + } + ${jWe(i)} + .section-root rect, .section-root path, .section-root circle { + fill: ${i.git0}; + } + .section-root text { + fill: ${i.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + } +`}},Symbol.toStringTag,{value:"Module"}));var Qgt=function(){var i=function(mt,yt,ft,ut){for(ft=ft||{},ut=mt.length;ut--;ft[mt[ut]]=yt);return ft},a=[1,4],f=[1,13],p=[1,12],w=[1,15],m=[1,16],b=[1,20],E=[1,19],_=[6,7,8],A=[1,26],I=[1,24],B=[1,25],N=[6,7,11],R=[1,6,13,15,16,19,22],z=[1,33],W=[1,34],et=[1,6,7,11,13,15,16,19,22],st={trace:function(){},yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:function(yt,ft,ut,vt,X,pt,U){var Tt=pt.length-1;switch(X){case 6:case 7:return vt;case 8:vt.getLogger().trace("Stop NL ");break;case 9:vt.getLogger().trace("Stop EOF ");break;case 11:vt.getLogger().trace("Stop NL2 ");break;case 12:vt.getLogger().trace("Stop EOF2 ");break;case 15:vt.getLogger().info("Node: ",pt[Tt].id),vt.addNode(pt[Tt-1].length,pt[Tt].id,pt[Tt].descr,pt[Tt].type);break;case 16:vt.getLogger().trace("Icon: ",pt[Tt]),vt.decorateNode({icon:pt[Tt]});break;case 17:case 21:vt.decorateNode({class:pt[Tt]});break;case 18:vt.getLogger().trace("SPACELIST");break;case 19:vt.getLogger().trace("Node: ",pt[Tt].id),vt.addNode(0,pt[Tt].id,pt[Tt].descr,pt[Tt].type);break;case 20:vt.decorateNode({icon:pt[Tt]});break;case 25:vt.getLogger().trace("node found ..",pt[Tt-2]),this.$={id:pt[Tt-1],descr:pt[Tt-1],type:vt.getType(pt[Tt-2],pt[Tt])};break;case 26:this.$={id:pt[Tt],descr:pt[Tt],type:vt.nodeType.DEFAULT};break;case 27:vt.getLogger().trace("node found ..",pt[Tt-3]),this.$={id:pt[Tt-3],descr:pt[Tt-1],type:vt.getType(pt[Tt-2],pt[Tt])};break}},table:[{3:1,4:2,5:3,6:[1,5],8:a},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:a},{6:f,7:[1,10],9:9,12:11,13:p,14:14,15:w,16:m,17:17,18:18,19:b,22:E},i(_,[2,3]),{1:[2,2]},i(_,[2,4]),i(_,[2,5]),{1:[2,6],6:f,12:21,13:p,14:14,15:w,16:m,17:17,18:18,19:b,22:E},{6:f,9:22,12:11,13:p,14:14,15:w,16:m,17:17,18:18,19:b,22:E},{6:A,7:I,10:23,11:B},i(N,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:b,22:E}),i(N,[2,18]),i(N,[2,19]),i(N,[2,20]),i(N,[2,21]),i(N,[2,23]),i(N,[2,24]),i(N,[2,26],{19:[1,30]}),{20:[1,31]},{6:A,7:I,10:32,11:B},{1:[2,7],6:f,12:21,13:p,14:14,15:w,16:m,17:17,18:18,19:b,22:E},i(R,[2,14],{7:z,11:W}),i(et,[2,8]),i(et,[2,9]),i(et,[2,10]),i(N,[2,15]),i(N,[2,16]),i(N,[2,17]),{20:[1,35]},{21:[1,36]},i(R,[2,13],{7:z,11:W}),i(et,[2,11]),i(et,[2,12]),{21:[1,37]},i(N,[2,25]),i(N,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:function(yt,ft){if(ft.recoverable)this.trace(yt);else{var ut=new Error(yt);throw ut.hash=ft,ut}},parse:function(yt){var ft=this,ut=[0],vt=[],X=[null],pt=[],U=this.table,Tt="",nt=0,It=0,Ot=2,Bt=1,Et=pt.slice.call(arguments,1),Z=Object.create(this.lexer),Ct={yy:{}};for(var xt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,xt)&&(Ct.yy[xt]=this.yy[xt]);Z.setInput(yt,Ct.yy),Ct.yy.lexer=Z,Ct.yy.parser=this,typeof Z.yylloc>"u"&&(Z.yylloc={});var Ht=Z.yylloc;pt.push(Ht);var Le=Z.options&&Z.options.ranges;typeof Ct.yy.parseError=="function"?this.parseError=Ct.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ft(){var Pe;return Pe=vt.pop()||Z.lex()||Bt,typeof Pe!="number"&&(Pe instanceof Array&&(vt=Pe,Pe=vt.pop()),Pe=ft.symbols_[Pe]||Pe),Pe}for(var gn,Se,me,Ve,Ye={},ce,ke,zt,re;;){if(Se=ut[ut.length-1],this.defaultActions[Se]?me=this.defaultActions[Se]:((gn===null||typeof gn>"u")&&(gn=Ft()),me=U[Se]&&U[Se][gn]),typeof me>"u"||!me.length||!me[0]){var se="";re=[];for(ce in U[Se])this.terminals_[ce]&&ce>Ot&&re.push("'"+this.terminals_[ce]+"'");Z.showPosition?se="Parse error on line "+(nt+1)+`: +`+Z.showPosition()+` +Expecting `+re.join(", ")+", got '"+(this.terminals_[gn]||gn)+"'":se="Parse error on line "+(nt+1)+": Unexpected "+(gn==Bt?"end of input":"'"+(this.terminals_[gn]||gn)+"'"),this.parseError(se,{text:Z.match,token:this.terminals_[gn]||gn,line:Z.yylineno,loc:Ht,expected:re})}if(me[0]instanceof Array&&me.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Se+", token: "+gn);switch(me[0]){case 1:ut.push(gn),X.push(Z.yytext),pt.push(Z.yylloc),ut.push(me[1]),gn=null,It=Z.yyleng,Tt=Z.yytext,nt=Z.yylineno,Ht=Z.yylloc;break;case 2:if(ke=this.productions_[me[1]][1],Ye.$=X[X.length-ke],Ye._$={first_line:pt[pt.length-(ke||1)].first_line,last_line:pt[pt.length-1].last_line,first_column:pt[pt.length-(ke||1)].first_column,last_column:pt[pt.length-1].last_column},Le&&(Ye._$.range=[pt[pt.length-(ke||1)].range[0],pt[pt.length-1].range[1]]),Ve=this.performAction.apply(Ye,[Tt,It,nt,Ct.yy,me[1],X,pt].concat(Et)),typeof Ve<"u")return Ve;ke&&(ut=ut.slice(0,-1*ke*2),X=X.slice(0,-1*ke),pt=pt.slice(0,-1*ke)),ut.push(this.productions_[me[1]][0]),X.push(Ye.$),pt.push(Ye._$),zt=U[ut[ut.length-2]][ut[ut.length-1]],ut.push(zt);break;case 3:return!0}}return!0}},at=function(){var mt={EOF:1,parseError:function(ft,ut){if(this.yy.parser)this.yy.parser.parseError(ft,ut);else throw new Error(ft)},setInput:function(yt,ft){return this.yy=ft||this.yy||{},this._input=yt,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var yt=this._input[0];this.yytext+=yt,this.yyleng++,this.offset++,this.match+=yt,this.matched+=yt;var ft=yt.match(/(?:\r\n?|\n).*/g);return ft?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),yt},unput:function(yt){var ft=yt.length,ut=yt.split(/(?:\r\n?|\n)/g);this._input=yt+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-ft),this.offset-=ft;var vt=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ut.length-1&&(this.yylineno-=ut.length-1);var X=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ut?(ut.length===vt.length?this.yylloc.first_column:0)+vt[vt.length-ut.length].length-ut[0].length:this.yylloc.first_column-ft},this.options.ranges&&(this.yylloc.range=[X[0],X[0]+this.yyleng-ft]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(yt){this.unput(this.match.slice(yt))},pastInput:function(){var yt=this.matched.substr(0,this.matched.length-this.match.length);return(yt.length>20?"...":"")+yt.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var yt=this.match;return yt.length<20&&(yt+=this._input.substr(0,20-yt.length)),(yt.substr(0,20)+(yt.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var yt=this.pastInput(),ft=new Array(yt.length+1).join("-");return yt+this.upcomingInput()+` +`+ft+"^"},test_match:function(yt,ft){var ut,vt,X;if(this.options.backtrack_lexer&&(X={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(X.yylloc.range=this.yylloc.range.slice(0))),vt=yt[0].match(/(?:\r\n?|\n).*/g),vt&&(this.yylineno+=vt.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:vt?vt[vt.length-1].length-vt[vt.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+yt[0].length},this.yytext+=yt[0],this.match+=yt[0],this.matches=yt,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(yt[0].length),this.matched+=yt[0],ut=this.performAction.call(this,this.yy,this,ft,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ut)return ut;if(this._backtrack){for(var pt in X)this[pt]=X[pt];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var yt,ft,ut,vt;this._more||(this.yytext="",this.match="");for(var X=this._currentRules(),pt=0;ptft[0].length)){if(ft=ut,vt=pt,this.options.backtrack_lexer){if(yt=this.test_match(ut,X[pt]),yt!==!1)return yt;if(this._backtrack){ft=!1;continue}else return!1}else if(!this.options.flex)break}return ft?(yt=this.test_match(ft,X[vt]),yt!==!1?yt:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var ft=this.next();return ft||this.lex()},begin:function(ft){this.conditionStack.push(ft)},popState:function(){var ft=this.conditionStack.length-1;return ft>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(ft){return ft=this.conditionStack.length-1-Math.abs(ft||0),ft>=0?this.conditionStack[ft]:"INITIAL"},pushState:function(ft){this.begin(ft)},stateStackSize:function(){return this.conditionStack.length},options:{"case-insensitive":!0},performAction:function(ft,ut,vt,X){switch(vt){case 0:return ft.getLogger().trace("Found comment",ut.yytext),6;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;case 4:this.popState();break;case 5:ft.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return ft.getLogger().trace("SPACELINE"),6;case 7:return 7;case 8:return 15;case 9:ft.getLogger().trace("end icon"),this.popState();break;case 10:return ft.getLogger().trace("Exploding node"),this.begin("NODE"),19;case 11:return ft.getLogger().trace("Cloud"),this.begin("NODE"),19;case 12:return ft.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;case 13:return ft.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;case 14:return this.begin("NODE"),19;case 15:return this.begin("NODE"),19;case 16:return this.begin("NODE"),19;case 17:return this.begin("NODE"),19;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:ft.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return ft.getLogger().trace("description:",ut.yytext),"NODE_DESCR";case 26:this.popState();break;case 27:return this.popState(),ft.getLogger().trace("node end ))"),"NODE_DEND";case 28:return this.popState(),ft.getLogger().trace("node end )"),"NODE_DEND";case 29:return this.popState(),ft.getLogger().trace("node end ...",ut.yytext),"NODE_DEND";case 30:return this.popState(),ft.getLogger().trace("node end (("),"NODE_DEND";case 31:return this.popState(),ft.getLogger().trace("node end (-"),"NODE_DEND";case 32:return this.popState(),ft.getLogger().trace("node end (-"),"NODE_DEND";case 33:return this.popState(),ft.getLogger().trace("node end (("),"NODE_DEND";case 34:return this.popState(),ft.getLogger().trace("node end (("),"NODE_DEND";case 35:return ft.getLogger().trace("Long description:",ut.yytext),20;case 36:return ft.getLogger().trace("Long description:",ut.yytext),20}},rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return mt}();st.lexer=at;function bt(){this.yy={}}return bt.prototype=st,st.Parser=bt,new bt}();Qgt.parser=Qgt;const zWe=Qgt,rN=i=>Q1(i,Oe());let cw=[],i$t=0,Zgt={};const qWe=()=>{cw=[],i$t=0,Zgt={}},HWe=function(i){for(let a=cw.length-1;a>=0;a--)if(cw[a].levelcw.length>0?cw[0]:null,GWe=(i,a,f,p)=>{Ut.info("addNode",i,a,f,p);const w=Oe(),m={id:i$t++,nodeId:rN(a),level:i,descr:rN(f),type:p,children:[],width:Oe().mindmap.maxNodeWidth};switch(m.type){case Uu.ROUNDED_RECT:m.padding=2*w.mindmap.padding;break;case Uu.RECT:m.padding=2*w.mindmap.padding;break;case Uu.HEXAGON:m.padding=2*w.mindmap.padding;break;default:m.padding=w.mindmap.padding}const b=HWe(i);if(b)b.children.push(m),cw.push(m);else if(cw.length===0)cw.push(m);else{let E=new Error('There can be only one root. No parent could be found for ("'+m.descr+'")');throw E.hash={text:"branch "+name,token:"branch "+name,line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:['"checkout '+name+'"']},E}},Uu={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},UWe=(i,a)=>{switch(Ut.debug("In get type",i,a),i){case"[":return Uu.RECT;case"(":return a===")"?Uu.ROUNDED_RECT:Uu.CLOUD;case"((":return Uu.CIRCLE;case")":return Uu.CLOUD;case"))":return Uu.BANG;case"{{":return Uu.HEXAGON;default:return Uu.DEFAULT}},s$t=(i,a)=>{Zgt[i]=a},WWe=i=>{const a=cw[cw.length-1];i&&i.icon&&(a.icon=rN(i.icon)),i&&i.class&&(a.class=rN(i.class))},IT=i=>{switch(i){case Uu.DEFAULT:return"no-border";case Uu.RECT:return"rect";case Uu.ROUNDED_RECT:return"rounded-rect";case Uu.CIRCLE:return"circle";case Uu.CLOUD:return"cloud";case Uu.BANG:return"bang";case Uu.HEXAGON:return"hexgon";default:return"no-border"}};let a$t;const YWe=i=>{a$t=i},KWe=()=>Ut,XWe=i=>cw[i],Jgt=i=>Zgt[i],QWe=Object.freeze(Object.defineProperty({__proto__:null,addNode:GWe,clear:qWe,decorateNode:WWe,getElementById:Jgt,getLogger:KWe,getMindmap:VWe,getNodeById:XWe,getType:UWe,nodeType:Uu,get parseError(){return a$t},sanitizeText:rN,setElementForId:s$t,setErrorHandler:YWe,type2Str:IT},Symbol.toStringTag,{value:"Module"})),o$t=12,ZWe=function(i,a,f){i.append("path").attr("id","node-"+a.id).attr("class","node-bkg node-"+IT(a.type)).attr("d",`M0 ${a.height-5} v${-a.height+2*5} q0,-5 5,-5 h${a.width-2*5} q5,0 5,5 v${a.height-5} H0 Z`),i.append("line").attr("class","node-line-"+f).attr("x1",0).attr("y1",a.height).attr("x2",a.width).attr("y2",a.height)},JWe=function(i,a){i.append("rect").attr("id","node-"+a.id).attr("class","node-bkg node-"+IT(a.type)).attr("height",a.height).attr("width",a.width)},tYe=function(i,a){const f=a.width,p=a.height,w=.15*f,m=.25*f,b=.35*f,E=.2*f;i.append("path").attr("id","node-"+a.id).attr("class","node-bkg node-"+IT(a.type)).attr("d",`M0 0 a${w},${w} 0 0,1 ${f*.25},${-1*f*.1} + a${b},${b} 1 0,1 ${f*.4},${-1*f*.1} + a${m},${m} 1 0,1 ${f*.35},${1*f*.2} + + a${w},${w} 1 0,1 ${f*.15},${1*p*.35} + a${E},${E} 1 0,1 ${-1*f*.15},${1*p*.65} + + a${m},${w} 1 0,1 ${-1*f*.25},${f*.15} + a${b},${b} 1 0,1 ${-1*f*.5},0 + a${w},${w} 1 0,1 ${-1*f*.25},${-1*f*.15} + + a${w},${w} 1 0,1 ${-1*f*.1},${-1*p*.35} + a${E},${E} 1 0,1 ${f*.1},${-1*p*.65} + + H0 V0 Z`)},eYe=function(i,a){const f=a.width,p=a.height,w=.15*f;i.append("path").attr("id","node-"+a.id).attr("class","node-bkg node-"+IT(a.type)).attr("d",`M0 0 a${w},${w} 1 0,0 ${f*.25},${-1*p*.1} + a${w},${w} 1 0,0 ${f*.25},0 + a${w},${w} 1 0,0 ${f*.25},0 + a${w},${w} 1 0,0 ${f*.25},${1*p*.1} + + a${w},${w} 1 0,0 ${f*.15},${1*p*.33} + a${w*.8},${w*.8} 1 0,0 0,${1*p*.34} + a${w},${w} 1 0,0 ${-1*f*.15},${1*p*.33} + + a${w},${w} 1 0,0 ${-1*f*.25},${p*.15} + a${w},${w} 1 0,0 ${-1*f*.25},0 + a${w},${w} 1 0,0 ${-1*f*.25},0 + a${w},${w} 1 0,0 ${-1*f*.25},${-1*p*.15} + + a${w},${w} 1 0,0 ${-1*f*.1},${-1*p*.33} + a${w*.8},${w*.8} 1 0,0 0,${-1*p*.34} + a${w},${w} 1 0,0 ${f*.1},${-1*p*.33} + + H0 V0 Z`)},nYe=function(i,a){i.append("circle").attr("id","node-"+a.id).attr("class","node-bkg node-"+IT(a.type)).attr("r",a.width/2)};function rYe(i,a,f,p,w){return i.insert("polygon",":first-child").attr("points",p.map(function(m){return m.x+","+m.y}).join(" ")).attr("transform","translate("+(w.width-a)/2+", "+f+")")}const iYe=function(i,a){const f=a.height,w=f/4,m=a.width-a.padding+2*w,b=[{x:w,y:0},{x:m-w,y:0},{x:m,y:-f/2},{x:m-w,y:-f},{x:w,y:-f},{x:0,y:-f/2}];rYe(i,m,f,b,a)},sYe=function(i,a){i.append("rect").attr("id","node-"+a.id).attr("class","node-bkg node-"+IT(a.type)).attr("height",a.height).attr("rx",a.padding).attr("ry",a.padding).attr("width",a.width)},c$t={drawNode:function(i,a,f,p){const w=p.htmlLabels,m=f%(o$t-1),b=i.append("g");a.section=m;let E="section-"+m;m<0&&(E+=" section-root"),b.attr("class",(a.class?a.class+" ":"")+"mindmap-node "+E);const _=b.append("g"),A=b.append("g"),I=a.descr.replace(/()/g,` +`);EY(A,I,{useHtmlLabels:w,width:a.width,classes:"mindmap-node-label"}),w||A.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle");const B=A.node().getBBox(),N=p.fontSize.replace?p.fontSize.replace("px",""):p.fontSize;if(a.height=B.height+N*1.1*.5+a.padding,a.width=B.width+2*a.padding,a.icon)if(a.type===Uu.CIRCLE)a.height+=50,a.width+=50,b.append("foreignObject").attr("height","50px").attr("width",a.width).attr("style","text-align: center;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+m+" "+a.icon),A.attr("transform","translate("+a.width/2+", "+(a.height/2-1.5*a.padding)+")");else{a.width+=50;const R=a.height;a.height=Math.max(R,60);const z=Math.abs(a.height-R);b.append("foreignObject").attr("width","60px").attr("height",a.height).attr("style","text-align: center;margin-top:"+z/2+"px;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+m+" "+a.icon),A.attr("transform","translate("+(25+a.width/2)+", "+(z/2+a.padding/2)+")")}else if(w){const R=(a.width-B.width)/2,z=(a.height-B.height)/2;A.attr("transform","translate("+R+", "+z+")")}else{const R=a.width/2,z=a.padding/2;A.attr("transform","translate("+R+", "+z+")")}switch(a.type){case Uu.DEFAULT:ZWe(_,a,m);break;case Uu.ROUNDED_RECT:sYe(_,a);break;case Uu.RECT:JWe(_,a);break;case Uu.CIRCLE:_.attr("transform","translate("+a.width/2+", "+ +a.height/2+")"),nYe(_,a);break;case Uu.CLOUD:tYe(_,a);break;case Uu.BANG:eYe(_,a);break;case Uu.HEXAGON:iYe(_,a);break}return s$t(a.id,b),a.height},positionNode:function(i){const a=Jgt(i.id),f=i.x||0,p=i.y||0;a.attr("transform","translate("+f+","+p+")")},drawEdge:function(a,f,p,w,m){const b=m%(o$t-1),E=p.x+p.width/2,_=p.y+p.height/2,A=f.x+f.width/2,I=f.y+f.height/2,B=A>E?E+Math.abs(E-A)/2:E-Math.abs(E-A)/2,N=I>_?_+Math.abs(_-I)/2:_-Math.abs(_-I)/2,R=A>E?Math.abs(E-B)/2+E:-Math.abs(E-B)/2+E,z=I>_?Math.abs(_-N)/2+_:-Math.abs(_-N)/2+_;a.append("path").attr("d",p.direction==="TB"||p.direction==="BT"?`M${E},${_} Q${E},${z} ${B},${N} T${A},${I}`:`M${E},${_} Q${R},${_} ${B},${N} T${A},${I}`).attr("class","edge section-edge-"+b+" edge-depth-"+w)}};var u$t={exports:{}};(function(i,a){(function(f,p){i.exports=p()})(b0,function(){function f(y){"@babel/helpers - typeof";return f=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(g){return typeof g}:function(g){return g&&typeof Symbol=="function"&&g.constructor===Symbol&&g!==Symbol.prototype?"symbol":typeof g},f(y)}function p(y,g){if(!(y instanceof g))throw new TypeError("Cannot call a class as a function")}function w(y,g){for(var x=0;xy.length)&&(g=y.length);for(var x=0,T=new Array(g);x"u"?null:window,z=R?R.navigator:null;R&&R.document;var W=f(""),et=f({}),st=f(function(){}),at=typeof HTMLElement>"u"?"undefined":f(HTMLElement),bt=function(g){return g&&g.instanceString&&yt(g.instanceString)?g.instanceString():null},mt=function(g){return g!=null&&f(g)==W},yt=function(g){return g!=null&&f(g)===st},ft=function(g){return!Tt(g)&&(Array.isArray?Array.isArray(g):g!=null&&g instanceof Array)},ut=function(g){return g!=null&&f(g)===et&&!ft(g)&&g.constructor===Object},vt=function(g){return g!=null&&f(g)===et},X=function(g){return g!=null&&f(g)===f(1)&&!isNaN(g)},pt=function(g){return X(g)&&Math.floor(g)===g},U=function(g){if(at!=="undefined")return g!=null&&g instanceof HTMLElement},Tt=function(g){return nt(g)||It(g)},nt=function(g){return bt(g)==="collection"&&g._private.single},It=function(g){return bt(g)==="collection"&&!g._private.single},Ot=function(g){return bt(g)==="core"},Bt=function(g){return bt(g)==="stylesheet"},Et=function(g){return bt(g)==="event"},Z=function(g){return g==null?!0:!!(g===""||g.match(/^\s+$/))},Ct=function(g){return typeof HTMLElement>"u"?!1:g instanceof HTMLElement},xt=function(g){return ut(g)&&X(g.x1)&&X(g.x2)&&X(g.y1)&&X(g.y2)},Ht=function(g){return vt(g)&&yt(g.then)},Le=function(){return z&&z.userAgent.match(/msie|trident|edge/i)},Ft=function(g,x){x||(x=function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var O=[],P=0;Px?1:0},Me=function(g,x){return-1*te(g,x)},de=Object.assign!=null?Object.assign.bind(Object):function(y){for(var g=arguments,x=1;x1&&(Lt-=1),Lt<1/6?ht+(dt-ht)*6*Lt:Lt<1/2?dt:Lt<2/3?ht+(dt-ht)*(2/3-Lt)*6:ht}var Y=new RegExp("^"+zt+"$").exec(g);if(Y){if(T=parseInt(Y[1]),T<0?T=(360- -1*T%360)%360:T>360&&(T=T%360),T/=360,L=parseFloat(Y[2]),L<0||L>100||(L=L/100,O=parseFloat(Y[3]),O<0||O>100)||(O=O/100,P=Y[4],P!==void 0&&(P=parseFloat(P),P<0||P>1)))return;if(L===0)$=q=S=Math.round(O*255);else{var rt=O<.5?O*(1+L):O+L-O*L,ot=2*O-rt;$=Math.round(255*V(ot,rt,T+1/3)),q=Math.round(255*V(ot,rt,T)),S=Math.round(255*V(ot,rt,T-1/3))}x=[$,q,S,P]}return x},Ks=function(g){var x,T=new RegExp("^"+ce+"$").exec(g);if(T){x=[];for(var L=[],O=1;O<=3;O++){var P=T[O];if(P[P.length-1]==="%"&&(L[O]=!0),P=parseFloat(P),L[O]&&(P=P/100*255),P<0||P>255)return;x.push(Math.floor(P))}var $=L[1]||L[2]||L[3],q=L[1]&&L[2]&&L[3];if($&&!q)return;var S=T[4];if(S!==void 0){if(S=parseFloat(S),S<0||S>1)return;x.push(S)}}return x},ws=function(g){return Xi[g.toLowerCase()]},fo=function(g){return(ft(g)?g:null)||ws(g)||on(g)||Ks(g)||ni(g)},Xi={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Er=function(g){for(var x=g.map,T=g.keys,L=T.length,O=0;O=g||qt<0||Y&&ne>=O}function kt(){var Yt=Po();if(Lt(Yt))return Dt(Yt);$=setTimeout(kt,dt(Yt))}function Dt(Yt){return $=void 0,rt&&T?ot(Yt):(T=L=void 0,P)}function Pt(){$!==void 0&&clearTimeout($),S=0,T=q=L=$=void 0}function $t(){return $===void 0?P:Dt(Po())}function Zt(){var Yt=Po(),qt=Lt(Yt);if(T=arguments,L=this,q=Yt,qt){if($===void 0)return ht(q);if(Y)return clearTimeout($),$=setTimeout(kt,g),ot(q)}return $===void 0&&($=setTimeout(kt,g)),P}return Zt.cancel=Pt,Zt.flush=$t,Zt}var Yc=xi,Ce=R?R.performance:null,vp=Ce&&Ce.now?function(){return Ce.now()}:function(){return Date.now()},Be=function(){if(R){if(R.requestAnimationFrame)return function(y){R.requestAnimationFrame(y)};if(R.mozRequestAnimationFrame)return function(y){R.mozRequestAnimationFrame(y)};if(R.webkitRequestAnimationFrame)return function(y){R.webkitRequestAnimationFrame(y)};if(R.msRequestAnimationFrame)return function(y){R.msRequestAnimationFrame(y)}}return function(y){y&&setTimeout(function(){y(vp())},1e3/60)}}(),Bf=function(g){return Be(g)},yg=vp,bm=9261,Ek=65599,E3=5381,Il=function(g){for(var x=arguments.length>1&&arguments[1]!==void 0?arguments[1]:bm,T=x,L;L=g.next(),!L.done;)T=T*Ek+L.value|0;return T},L0=function(g){var x=arguments.length>1&&arguments[1]!==void 0?arguments[1]:bm;return x*Ek+g|0},hw=function(g){var x=arguments.length>1&&arguments[1]!==void 0?arguments[1]:E3;return(x<<5)+x+g|0},H5=function(g,x){return g*2097152+x},Hb=function(g){return g[0]*2097152+g[1]},V5=function(g,x){return[L0(g[0],x[0]),hw(g[1],x[1])]},f1=function(g,x){var T={value:0,done:!1},L=0,O=g.length,P={next:function(){return L=0&&!(g[L]===x&&(g.splice(L,1),T));L--);},TL=function(g){g.splice(0,g.length)},aN=function(g,x){for(var T=0;T"u"?"undefined":f(Set))!==fK?Set:dK,FT=function(g,x){var T=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(g===void 0||x===void 0||!Ot(g)){vl("An element must have a core reference and parameters set");return}var L=x.group;if(L==null&&(x.data&&x.data.source!=null&&x.data.target!=null?L="edges":L="nodes"),L!=="nodes"&&L!=="edges"){vl("An element must be of type `nodes` or `edges`; you specified `"+L+"`");return}this.length=1,this[0]=this;var O=this._private={cy:g,single:!0,data:x.data||{},position:x.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:L,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!x.selected,selectable:x.selectable===void 0?!0:!!x.selectable,locked:!!x.locked,grabbed:!1,grabbable:x.grabbable===void 0?!0:!!x.grabbable,pannable:x.pannable===void 0?L==="edges":!!x.pannable,active:!1,classes:new Y5,animation:{current:[],queue:[]},rscratch:{},scratch:x.scratch||{},edges:[],children:[],parent:x.parent&&x.parent.isNode()?x.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(O.position.x==null&&(O.position.x=0),O.position.y==null&&(O.position.y=0),x.renderedPosition){var P=x.renderedPosition,$=g.pan(),q=g.zoom();O.position={x:(P.x-$.x)/q,y:(P.y-$.y)/q}}var S=[];ft(x.classes)?S=x.classes:mt(x.classes)&&(S=x.classes.split(/\s+/));for(var V=0,Y=S.length;VDt?1:0},V=function(kt,Dt,Pt,$t,Zt){var Yt;if(Pt==null&&(Pt=0),Zt==null&&(Zt=T),Pt<0)throw new Error("lo must be non-negative");for($t==null&&($t=kt.length);Pt<$t;)Yt=L((Pt+$t)/2),Zt(Dt,kt[Yt])<0?$t=Yt:Pt=Yt+1;return[].splice.apply(kt,[Pt,Pt-Pt].concat(Dt)),Dt},$=function(kt,Dt,Pt){return Pt==null&&(Pt=T),kt.push(Dt),dt(kt,0,kt.length-1,Pt)},P=function(kt,Dt){var Pt,$t;return Dt==null&&(Dt=T),Pt=kt.pop(),kt.length?($t=kt[0],kt[0]=Pt,Lt(kt,0,Dt)):$t=Pt,$t},S=function(kt,Dt,Pt){var $t;return Pt==null&&(Pt=T),$t=kt[0],kt[0]=Dt,Lt(kt,0,Pt),$t},q=function(kt,Dt,Pt){var $t;return Pt==null&&(Pt=T),kt.length&&Pt(kt[0],Dt)<0&&($t=[kt[0],Dt],Dt=$t[0],kt[0]=$t[1],Lt(kt,0,Pt)),Dt},O=function(kt,Dt){var Pt,$t,Zt,Yt,qt,ne;for(Dt==null&&(Dt=T),Yt=(function(){ne=[];for(var Gt=0,ge=L(kt.length/2);0<=ge?Gtge;0<=ge?Gt++:Gt--)ne.push(Gt);return ne}).apply(this).reverse(),qt=[],$t=0,Zt=Yt.length;$tbe;0<=be?++ne:--ne)ie.push(P(kt,Pt));return ie},dt=function(kt,Dt,Pt,$t){var Zt,Yt,qt;for($t==null&&($t=T),Zt=kt[Pt];Pt>Dt;){if(qt=Pt-1>>1,Yt=kt[qt],$t(Zt,Yt)<0){kt[Pt]=Yt,Pt=qt;continue}break}return kt[Pt]=Zt},Lt=function(kt,Dt,Pt){var $t,Zt,Yt,qt,ne;for(Pt==null&&(Pt=T),Zt=kt.length,ne=Dt,Yt=kt[Dt],$t=2*Dt+1;$t0;){var Yt=Dt.pop(),qt=Lt(Yt),ne=Yt.id();if(rt[ne]=qt,qt!==1/0)for(var Gt=Yt.neighborhood().intersect(ht),ge=0;ge0)for(En.unshift(Ge);Y[Yn];){var Sn=Y[Yn];En.unshift(Sn.edge),En.unshift(Sn.node),In=Sn.node,Yn=In.id()}return $.spawn(En)}}}},wK={kruskal:function(g){g=g||function(Pt){return 1};for(var x=this.byGroup(),T=x.nodes,L=x.edges,O=T.length,P=new Array(O),$=T,q=function($t){for(var Zt=0;Zt0;){if(Zt(),qt++,$t===V){for(var ne=[],Gt=O,ge=V,be=kt[ge];ne.unshift(Gt),be!=null&&ne.unshift(be),Gt=Lt[ge],Gt!=null;)ge=Gt.id(),be=kt[ge];return{found:!0,distance:Y[$t],path:this.spawn(ne),steps:qt}}ot[$t]=!0;for(var ie=Pt._private.edges,Fe=0;Febe&&(ht[ge]=be,Dt[ge]=Gt,Pt[ge]=Zt),!O){var ie=Gt*V+ne;!O&&ht[ie]>be&&(ht[ie]=be,Dt[ie]=ne,Pt[ie]=Zt)}}}for(var Fe=0;Fe1&&arguments[1]!==void 0?arguments[1]:P,Va=Pt(Si),Qs=[],qs=Va;;){if(qs==null)return x.spawn();var Tr=Dt(qs),Qt=Tr.edge,jn=Tr.pred;if(Qs.unshift(qs[0]),qs.same(Ui)&&Qs.length>0)break;Qt!=null&&Qs.unshift(Qt),qs=jn}return q.spawn(Qs)},Yt=0;Yt=0;V--){var Y=S[V],rt=Y[1],ot=Y[2];(x[rt]===$&&x[ot]===q||x[rt]===q&&x[ot]===$)&&S.splice(V,1)}for(var ht=0;htL;){var O=Math.floor(Math.random()*x.length);x=CK(O,g,x),T--}return x},_K={kargerStein:function(){var g=this,x=this.byGroup(),T=x.nodes,L=x.edges;L.unmergeBy(function(En){return En.isLoop()});var O=T.length,P=L.length,$=Math.ceil(Math.pow(Math.log(O)/Math.LN2,2)),q=Math.floor(O/TK);if(O<2){vl("At least 2 nodes are required for Karger-Stein algorithm");return}for(var S=[],V=0;V1&&arguments[1]!==void 0?arguments[1]:0,T=arguments.length>2&&arguments[2]!==void 0?arguments[2]:g.length,L=1/0,O=x;O1&&arguments[1]!==void 0?arguments[1]:0,T=arguments.length>2&&arguments[2]!==void 0?arguments[2]:g.length,L=-1/0,O=x;O1&&arguments[1]!==void 0?arguments[1]:0,T=arguments.length>2&&arguments[2]!==void 0?arguments[2]:g.length,L=0,O=0,P=x;P1&&arguments[1]!==void 0?arguments[1]:0,T=arguments.length>2&&arguments[2]!==void 0?arguments[2]:g.length,L=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,O=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,P=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;L?g=g.slice(x,T):(T0&&g.splice(0,x));for(var $=0,q=g.length-1;q>=0;q--){var S=g[q];P?isFinite(S)||(g[q]=-1/0,$++):g.splice(q,1)}O&&g.sort(function(rt,ot){return rt-ot});var V=g.length,Y=Math.floor(V/2);return V%2!==0?g[Y+1+$]:(g[Y-1+$]+g[Y+$])/2},IK=function(g){return Math.PI*g/180},BT=function(g,x){return Math.atan2(x,g)-Math.PI/2},_L=Math.log2||function(y){return Math.log(y)/Math.log(2)},uN=function(g){return g>0?1:g<0?-1:0},C3=function(g,x){return Math.sqrt(_3(g,x))},_3=function(g,x){var T=x.x-g.x,L=x.y-g.y;return T*T+L*L},OK=function(g){for(var x=g.length,T=0,L=0;L=g.x1&&g.y2>=g.y1)return{x1:g.x1,y1:g.y1,x2:g.x2,y2:g.y2,w:g.x2-g.x1,h:g.y2-g.y1};if(g.w!=null&&g.h!=null&&g.w>=0&&g.h>=0)return{x1:g.x1,y1:g.y1,x2:g.x1+g.w,y2:g.y1+g.h,w:g.w,h:g.h}}},FK=function(g){return{x1:g.x1,x2:g.x2,w:g.w,y1:g.y1,y2:g.y2,h:g.h}},NK=function(g){g.x1=1/0,g.y1=1/0,g.x2=-1/0,g.y2=-1/0,g.w=0,g.h=0},BK=function(g,x){g.x1=Math.min(g.x1,x.x1),g.x2=Math.max(g.x2,x.x2),g.w=g.x2-g.x1,g.y1=Math.min(g.y1,x.y1),g.y2=Math.max(g.y2,x.y2),g.h=g.y2-g.y1},RK=function(g,x,T){g.x1=Math.min(g.x1,x),g.x2=Math.max(g.x2,x),g.w=g.x2-g.x1,g.y1=Math.min(g.y1,T),g.y2=Math.max(g.y2,T),g.h=g.y2-g.y1},RT=function(g){var x=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return g.x1-=x,g.x2+=x,g.y1-=x,g.y2+=x,g.w=g.x2-g.x1,g.h=g.y2-g.y1,g},SL=function(g){var x=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],T,L,O,P;if(x.length===1)T=L=O=P=x[0];else if(x.length===2)T=O=x[0],P=L=x[1];else if(x.length===4){var $=E(x,4);T=$[0],L=$[1],O=$[2],P=$[3]}return g.x1-=P,g.x2+=L,g.y1-=T,g.y2+=O,g.w=g.x2-g.x1,g.h=g.y2-g.y1,g},lN=function(g,x){g.x1=x.x1,g.y1=x.y1,g.x2=x.x2,g.y2=x.y2,g.w=g.x2-g.x1,g.h=g.y2-g.y1},AL=function(g,x){return!(g.x1>x.x2||x.x1>g.x2||g.x2x.y2||x.y1>g.y2)},Q5=function(g,x,T){return g.x1<=x&&x<=g.x2&&g.y1<=T&&T<=g.y2},jK=function(g,x){return Q5(g,x.x,x.y)},hN=function(g,x){return Q5(g,x.x1,x.y1)&&Q5(g,x.x2,x.y2)},fN=function(g,x,T,L,O,P,$){var q=Lk(O,P),S=O/2,V=P/2,Y;{var rt=T-S+q-$,ot=L-V-$,ht=T+S-q+$,dt=ot;if(Y=ym(g,x,T,L,rt,ot,ht,dt,!1),Y.length>0)return Y}{var Lt=T+S+$,kt=L-V+q-$,Dt=Lt,Pt=L+V-q+$;if(Y=ym(g,x,T,L,Lt,kt,Dt,Pt,!1),Y.length>0)return Y}{var $t=T-S+q-$,Zt=L+V+$,Yt=T+S-q+$,qt=Zt;if(Y=ym(g,x,T,L,$t,Zt,Yt,qt,!1),Y.length>0)return Y}{var ne=T-S-$,Gt=L-V+q-$,ge=ne,be=L+V-q+$;if(Y=ym(g,x,T,L,ne,Gt,ge,be,!1),Y.length>0)return Y}var ie;{var Fe=T-S+q,we=L-V+q;if(ie=Sk(g,x,T,L,Fe,we,q+$),ie.length>0&&ie[0]<=Fe&&ie[1]<=we)return[ie[0],ie[1]]}{var bn=T+S-q,ze=L-V+q;if(ie=Sk(g,x,T,L,bn,ze,q+$),ie.length>0&&ie[0]>=bn&&ie[1]<=ze)return[ie[0],ie[1]]}{var Ge=T+S-q,En=L+V-q;if(ie=Sk(g,x,T,L,Ge,En,q+$),ie.length>0&&ie[0]>=Ge&&ie[1]>=En)return[ie[0],ie[1]]}{var In=T-S+q,Yn=L+V-q;if(ie=Sk(g,x,T,L,In,Yn,q+$),ie.length>0&&ie[0]<=In&&ie[1]>=Yn)return[ie[0],ie[1]]}return[]},$K=function(g,x,T,L,O,P,$){var q=$,S=Math.min(T,O),V=Math.max(T,O),Y=Math.min(L,P),rt=Math.max(L,P);return S-q<=g&&g<=V+q&&Y-q<=x&&x<=rt+q},zK=function(g,x,T,L,O,P,$,q,S){var V={x1:Math.min(T,$,O)-S,x2:Math.max(T,$,O)+S,y1:Math.min(L,q,P)-S,y2:Math.max(L,q,P)+S};return!(gV.x2||xV.y2)},qK=function(g,x,T,L){T-=L;var O=x*x-4*g*T;if(O<0)return[];var P=Math.sqrt(O),$=2*g,q=(-x+P)/$,S=(-x-P)/$;return[q,S]},HK=function(g,x,T,L,O){var P=1e-5;g===0&&(g=P),x/=g,T/=g,L/=g;var $,q,S,V,Y,rt,ot,ht;if(q=(3*T-x*x)/9,S=-(27*L)+x*(9*T-2*(x*x)),S/=54,$=q*q*q+S*S,O[1]=0,ot=x/3,$>0){Y=S+Math.sqrt($),Y=Y<0?-Math.pow(-Y,1/3):Math.pow(Y,1/3),rt=S-Math.sqrt($),rt=rt<0?-Math.pow(-rt,1/3):Math.pow(rt,1/3),O[0]=-ot+Y+rt,ot+=(Y+rt)/2,O[4]=O[2]=-ot,ot=Math.sqrt(3)*(-rt+Y)/2,O[3]=ot,O[5]=-ot;return}if(O[5]=O[3]=0,$===0){ht=S<0?-Math.pow(-S,1/3):Math.pow(S,1/3),O[0]=-ot+2*ht,O[4]=O[2]=-(ht+ot);return}q=-q,V=q*q*q,V=Math.acos(S/Math.sqrt(V)),ht=2*Math.sqrt(q),O[0]=-ot+ht*Math.cos(V/3),O[2]=-ot+ht*Math.cos((V+2*Math.PI)/3),O[4]=-ot+ht*Math.cos((V+4*Math.PI)/3)},VK=function(g,x,T,L,O,P,$,q){var S=1*T*T-4*T*O+2*T*$+4*O*O-4*O*$+$*$+L*L-4*L*P+2*L*q+4*P*P-4*P*q+q*q,V=1*9*T*O-3*T*T-3*T*$-6*O*O+3*O*$+9*L*P-3*L*L-3*L*q-6*P*P+3*P*q,Y=1*3*T*T-6*T*O+T*$-T*g+2*O*O+2*O*g-$*g+3*L*L-6*L*P+L*q-L*x+2*P*P+2*P*x-q*x,rt=1*T*O-T*T+T*g-O*g+L*P-L*L+L*x-P*x,ot=[];HK(S,V,Y,rt,ot);for(var ht=1e-7,dt=[],Lt=0;Lt<6;Lt+=2)Math.abs(ot[Lt+1])=0&&ot[Lt]<=1&&dt.push(ot[Lt]);dt.push(1),dt.push(0);for(var kt=-1,Dt,Pt,$t,Zt=0;Zt=0?$tS?(g-O)*(g-O)+(x-P)*(x-P):V-rt},qd=function(g,x,T){for(var L,O,P,$,q,S=0,V=0;V=g&&g>=P||L<=g&&g<=P)q=(g-L)/(P-L)*($-O)+O,q>x&&S++;else continue;return S%2!==0},dw=function(g,x,T,L,O,P,$,q,S){var V=new Array(T.length),Y;q[0]!=null?(Y=Math.atan(q[1]/q[0]),q[0]<0?Y=Y+Math.PI/2:Y=-Y-Math.PI/2):Y=q;for(var rt=Math.cos(-Y),ot=Math.sin(-Y),ht=0;ht0){var Lt=gN(V,-S);dt=dN(Lt)}else dt=V;return qd(g,x,dt)},UK=function(g,x,T,L,O,P,$){for(var q=new Array(T.length),S=P/2,V=$/2,Y=DL(P,$),rt=Y*Y,ot=0;ot=0&&Lt<=1&&Dt.push(Lt),kt>=0&&kt<=1&&Dt.push(kt),Dt.length===0)return[];var Pt=Dt[0]*q[0]+g,$t=Dt[0]*q[1]+x;if(Dt.length>1){if(Dt[0]==Dt[1])return[Pt,$t];var Zt=Dt[1]*q[0]+g,Yt=Dt[1]*q[1]+x;return[Pt,$t,Zt,Yt]}else return[Pt,$t]},LL=function(g,x,T){return x<=g&&g<=T||T<=g&&g<=x?g:g<=x&&x<=T||T<=x&&x<=g?x:T},ym=function(g,x,T,L,O,P,$,q,S){var V=g-O,Y=T-g,rt=$-O,ot=x-P,ht=L-x,dt=q-P,Lt=rt*ot-dt*V,kt=Y*ot-ht*V,Dt=dt*Y-rt*ht;if(Dt!==0){var Pt=Lt/Dt,$t=kt/Dt,Zt=.001,Yt=0-Zt,qt=1+Zt;return Yt<=Pt&&Pt<=qt&&Yt<=$t&&$t<=qt?[g+Pt*Y,x+Pt*ht]:S?[g+Pt*Y,x+Pt*ht]:[]}else return Lt===0||kt===0?LL(g,T,$)===$?[$,q]:LL(g,T,O)===O?[O,P]:LL(O,$,T)===T?[T,L]:[]:[]},Ak=function(g,x,T,L,O,P,$,q){var S=[],V,Y=new Array(T.length),rt=!0;P==null&&(rt=!1);var ot;if(rt){for(var ht=0;ht0){var dt=gN(Y,-q);ot=dN(dt)}else ot=Y}else ot=T;for(var Lt,kt,Dt,Pt,$t=0;$t2){for(var ze=[S[0],S[1]],Ge=Math.pow(ze[0]-g,2)+Math.pow(ze[1]-x,2),En=1;EnV&&(V=$t)},get:function(Pt){return S[Pt]}},rt=0;rt<$.length;rt++){var ot=$[rt],ht=ot.id();T?q[ht]=ot.outgoers().nodes():q[ht]=ot.openNeighborhood().nodes(),Y.set(ht,0)}for(var dt=function(Pt){for(var $t=$[Pt].id(),Zt=[],Yt={},qt={},ne={},Gt=new Ck(function(ur,er){return ne[ur]-ne[er]}),ge=0;ge<$.length;ge++){var be=$[ge].id();Yt[be]=[],qt[be]=0,ne[be]=1/0}for(qt[$t]=1,ne[$t]=0,Gt.push($t);!Gt.empty();){var ie=Gt.pop();if(Zt.push(ie),O)for(var Fe=0;Fe0?ze=bn.edgesTo(we)[0]:ze=we.edgesTo(bn)[0];var Ge=L(ze);we=we.id(),ne[we]>ne[ie]+Ge&&(ne[we]=ne[ie]+Ge,Gt.nodes.indexOf(we)<0?Gt.push(we):Gt.updateItem(we),qt[we]=0,Yt[we]=[]),ne[we]==ne[ie]+Ge&&(qt[we]=qt[we]+qt[ie],Yt[we].push(ie))}else for(var En=0;En0;){for(var Wn=Zt.pop(),rr=0;rr0&&$.push(T[q]);$.length!==0&&O.push(L.collection($))}return O},oX=function(g,x){for(var T=0;T5&&arguments[5]!==void 0?arguments[5]:lX,$=L,q,S,V=0;V=2?Mk(g,x,T,0,TN,hX):Mk(g,x,T,0,EN)},squaredEuclidean:function(g,x,T){return Mk(g,x,T,0,TN)},manhattan:function(g,x,T){return Mk(g,x,T,0,EN)},max:function(g,x,T){return Mk(g,x,T,-1/0,fX)}};tx["squared-euclidean"]=tx.squaredEuclidean,tx.squaredeuclidean=tx.squaredEuclidean;function $T(y,g,x,T,L,O){var P;return yt(y)?P=y:P=tx[y]||tx.euclidean,g===0&&yt(y)?P(L,O):P(g,x,T,L,O)}var dX=Rf({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),PL=function(g){return dX(g)},zT=function(g,x,T,L,O){var P=O!=="kMedoids",$=P?function(Y){return T[Y]}:function(Y){return L[Y](T)},q=function(rt){return L[rt](x)},S=T,V=x;return $T(g,L.length,$,q,S,V)},FL=function(g,x,T){for(var L=T.length,O=new Array(L),P=new Array(L),$=new Array(x),q=null,S=0;ST)return!1}return!0},bX=function(g,x,T){for(var L=0;L$&&($=x[S][V],q=V);O[q].push(g[S])}for(var Y=0;Y=O.threshold||O.mode==="dendrogram"&&g.length===1)return!1;var ht=x[P],dt=x[L[P]],Lt;O.mode==="dendrogram"?Lt={left:ht,right:dt,key:ht.key}:Lt={value:ht.value.concat(dt.value),key:ht.key},g[ht.index]=Lt,g.splice(dt.index,1),x[ht.key]=Lt;for(var kt=0;ktT[dt.key][Dt.key]&&(q=T[dt.key][Dt.key])):O.linkage==="max"?(q=T[ht.key][Dt.key],T[ht.key][Dt.key]0&&L.push(O);return L},IN=function(g,x,T){for(var L=[],O=0;O$&&(P=S,$=x[O*g+S])}P>0&&L.push(P)}for(var V=0;VS&&(q=V,S=Y)}T[O]=P[q]}return L=IN(g,x,T),L},ON=function(g){for(var x=this.cy(),T=this.nodes(),L=MX(g),O={},P=0;P=be?(ie=be,be=we,Fe=bn):we>ie&&(ie=we);for(var ze=0;ze<$;ze++)Y[ge*$+ze]=(1-L.damping)*(S[ge*$+ze]-be)+L.damping*Pt[ze];Y[ge*$+Fe]=(1-L.damping)*(S[ge*$+Fe]-ie)+L.damping*Pt[Fe]}for(var Ge=0;Ge<$;Ge++){for(var En=0,In=0;In<$;In++)Pt[In]=rt[In*$+Ge],$t[In]=Math.max(0,Y[In*$+Ge]),En+=$t[In];En-=$t[Ge],$t[Ge]=Y[Ge*$+Ge],En+=$t[Ge];for(var Yn=0;Yn<$;Yn++)rt[Yn*$+Ge]=(1-L.damping)*Math.min(0,En-$t[Yn])+L.damping*Pt[Yn];rt[Ge*$+Ge]=(1-L.damping)*(En-$t[Ge])+L.damping*Pt[Ge]}for(var Sn=0,Wn=0;Wn<$;Wn++){var rr=rt[Wn*$+Wn]+Y[Wn*$+Wn]>0?1:0;qt[Gt%L.minIterations*$+Wn]=rr,Sn+=rr}if(Sn>0&&(Gt>=L.minIterations-1||Gt==L.maxIterations-1)){for(var wr=0,ur=0;ur<$;ur++){Zt[ur]=0;for(var er=0;er1||Yt>1)&&($=!0),Y[Pt]=[],Dt.outgoers().forEach(function(ne){ne.isEdge()&&Y[Pt].push(ne.id())})}else rt[Pt]=[void 0,Dt.target().id()]}):P.forEach(function(Dt){var Pt=Dt.id();if(Dt.isNode()){var $t=Dt.degree(!0);$t%2&&(q?S?$=!0:S=Pt:q=Pt),Y[Pt]=[],Dt.connectedEdges().forEach(function(Zt){return Y[Pt].push(Zt.id())})}else rt[Pt]=[Dt.source().id(),Dt.target().id()]});var ot={found:!1,trail:void 0};if($)return ot;if(S&&q)if(O){if(V&&S!=V)return ot;V=S}else{if(V&&S!=V&&q!=V)return ot;V||(V=S)}else V||(V=P[0].id());var ht=function(Pt){for(var $t=Pt,Zt=[Pt],Yt,qt,ne;Y[$t].length;)Yt=Y[$t].shift(),qt=rt[Yt][0],ne=rt[Yt][1],$t!=ne?(Y[ne]=Y[ne].filter(function(Gt){return Gt!=Yt}),$t=ne):!O&&$t!=qt&&(Y[qt]=Y[qt].filter(function(Gt){return Gt!=Yt}),$t=qt),Zt.unshift(Yt),Zt.unshift($t);return Zt},dt=[],Lt=[];for(Lt=ht(V);Lt.length!=1;)Y[Lt[0]].length==0?(dt.unshift(P.getElementById(Lt.shift())),dt.unshift(P.getElementById(Lt.shift()))):Lt=ht(Lt.shift()).concat(Lt);dt.unshift(P.getElementById(Lt.shift()));for(var kt in Y)if(Y[kt].length)return ot;return ot.found=!0,ot.trail=this.spawn(dt,!0),ot}},HT=function(){var g=this,x={},T=0,L=0,O=[],P=[],$={},q=function(rt,ot){for(var ht=P.length-1,dt=[],Lt=g.spawn();P[ht].x!=rt||P[ht].y!=ot;)dt.push(P.pop().edge),ht--;dt.push(P.pop().edge),dt.forEach(function(kt){var Dt=kt.connectedNodes().intersection(g);Lt.merge(kt),Dt.forEach(function(Pt){var $t=Pt.id(),Zt=Pt.connectedEdges().intersection(g);Lt.merge(Pt),x[$t].cutVertex?Lt.merge(Zt.filter(function(Yt){return Yt.isLoop()})):Lt.merge(Zt)})}),O.push(Lt)},S=function Y(rt,ot,ht){rt===ht&&(L+=1),x[ot]={id:T,low:T++,cutVertex:!1};var dt=g.getElementById(ot).connectedEdges().intersection(g);if(dt.size()===0)O.push(g.spawn(g.getElementById(ot)));else{var Lt,kt,Dt,Pt;dt.forEach(function($t){Lt=$t.source().id(),kt=$t.target().id(),Dt=Lt===ot?kt:Lt,Dt!==ht&&(Pt=$t.id(),$[Pt]||($[Pt]=!0,P.push({x:ot,y:Dt,edge:$t})),Dt in x?x[ot].low=Math.min(x[ot].low,x[Dt].id):(Y(rt,Dt,ot),x[ot].low=Math.min(x[ot].low,x[Dt].low),x[ot].id<=x[Dt].low&&(x[ot].cutVertex=!0,q(ot,Dt))))})}};g.forEach(function(Y){if(Y.isNode()){var rt=Y.id();rt in x||(L=0,S(rt,rt),x[rt].cutVertex=L>1)}});var V=Object.keys(x).filter(function(Y){return x[Y].cutVertex}).map(function(Y){return g.getElementById(Y)});return{cut:g.spawn(V),components:O}},RX={hopcroftTarjanBiconnected:HT,htbc:HT,htb:HT,hopcroftTarjanBiconnectedComponents:HT},VT=function(){var g=this,x={},T=0,L=[],O=[],P=g.spawn(g),$=function q(S){O.push(S),x[S]={index:T,low:T++,explored:!1};var V=g.getElementById(S).connectedEdges().intersection(g);if(V.forEach(function(dt){var Lt=dt.target().id();Lt!==S&&(Lt in x||q(Lt),x[Lt].explored||(x[S].low=Math.min(x[S].low,x[Lt].low)))}),x[S].index===x[S].low){for(var Y=g.spawn();;){var rt=O.pop();if(Y.merge(g.getElementById(rt)),x[rt].low=x[S].index,x[rt].explored=!0,rt===S)break}var ot=Y.edgesWith(Y),ht=Y.merge(ot);L.push(ht),P=P.difference(ht)}};return g.forEach(function(q){if(q.isNode()){var S=q.id();S in x||$(S)}}),{cut:P,components:L}},jX={tarjanStronglyConnected:VT,tsc:VT,tscc:VT,tarjanStronglyConnectedComponents:VT},PN={};[Tk,bK,wK,mK,xK,EK,_K,QK,Z5,J5,OL,uX,kX,AX,FX,BX,RX,jX].forEach(function(y){de(PN,y)});/*! +Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable +Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) +Licensed under The MIT License (http://opensource.org/licenses/MIT) +*/var FN=0,NN=1,BN=2,gw=function y(g){if(!(this instanceof y))return new y(g);this.id="Thenable/1.0.7",this.state=FN,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof g=="function"&&g.call(this,this.fulfill.bind(this),this.reject.bind(this))};gw.prototype={fulfill:function(g){return RN(this,NN,"fulfillValue",g)},reject:function(g){return RN(this,BN,"rejectReason",g)},then:function(g,x){var T=this,L=new gw;return T.onFulfilled.push(zN(g,L,"fulfill")),T.onRejected.push(zN(x,L,"reject")),jN(T),L.proxy}};var RN=function(g,x,T,L){return g.state===FN&&(g.state=x,g[T]=L,jN(g)),g},jN=function(g){g.state===NN?$N(g,"onFulfilled",g.fulfillValue):g.state===BN&&$N(g,"onRejected",g.rejectReason)},$N=function(g,x,T){if(g[x].length!==0){var L=g[x];g[x]=[];var O=function(){for(var $=0;$0}},clearQueue:function(){return function(){var x=this,T=x.length!==void 0,L=T?x:[x],O=this._private.cy||this;if(!O.styleEnabled())return this;for(var P=0;P-1}var $Q=jQ;function zQ(y,g){var x=this.__data__,T=WT(x,y);return T<0?(++this.size,x.push([y,g])):x[T][1]=g,this}var qQ=zQ;function rx(y){var g=-1,x=y==null?0:y.length;for(this.clear();++g-1&&y%1==0&&y0&&this.spawn(L).updateStyle().emit("class"),x},addClass:function(g){return this.toggleClass(g,!0)},hasClass:function(g){var x=this[0];return x!=null&&x._private.classes.has(g)},toggleClass:function(g,x){ft(g)||(g=g.match(/\S+/g)||[]);for(var T=this,L=x===void 0,O=[],P=0,$=T.length;P<$;P++)for(var q=T[P],S=q._private.classes,V=!1,Y=0;Y0&&this.spawn(O).updateStyle().emit("class"),T},removeClass:function(g){return this.toggleClass(g,!1)},flashClass:function(g,x){var T=this;if(x==null)x=250;else if(x===0)return T;return T.addClass(g),setTimeout(function(){T.removeClass(g)},x),T}};QT.className=QT.classNames=QT.classes;var tc={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:Ye,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};tc.variable="(?:[\\w-.]|(?:\\\\"+tc.metaChar+"))+",tc.className="(?:[\\w-]|(?:\\\\"+tc.metaChar+"))+",tc.value=tc.string+"|"+tc.number,tc.id=tc.variable,function(){var y,g,x;for(y=tc.comparatorOp.split("|"),x=0;x=0)&&g!=="="&&(tc.comparatorOp+="|\\!"+g)}();var Kc=function(){return{checks:[]}},zi={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},zL=[{selector:":selected",matches:function(g){return g.selected()}},{selector:":unselected",matches:function(g){return!g.selected()}},{selector:":selectable",matches:function(g){return g.selectable()}},{selector:":unselectable",matches:function(g){return!g.selectable()}},{selector:":locked",matches:function(g){return g.locked()}},{selector:":unlocked",matches:function(g){return!g.locked()}},{selector:":visible",matches:function(g){return g.visible()}},{selector:":hidden",matches:function(g){return!g.visible()}},{selector:":transparent",matches:function(g){return g.transparent()}},{selector:":grabbed",matches:function(g){return g.grabbed()}},{selector:":free",matches:function(g){return!g.grabbed()}},{selector:":removed",matches:function(g){return g.removed()}},{selector:":inside",matches:function(g){return!g.removed()}},{selector:":grabbable",matches:function(g){return g.grabbable()}},{selector:":ungrabbable",matches:function(g){return!g.grabbable()}},{selector:":animated",matches:function(g){return g.animated()}},{selector:":unanimated",matches:function(g){return!g.animated()}},{selector:":parent",matches:function(g){return g.isParent()}},{selector:":childless",matches:function(g){return g.isChildless()}},{selector:":child",matches:function(g){return g.isChild()}},{selector:":orphan",matches:function(g){return g.isOrphan()}},{selector:":nonorphan",matches:function(g){return g.isChild()}},{selector:":compound",matches:function(g){return g.isNode()?g.isParent():g.source().isParent()||g.target().isParent()}},{selector:":loop",matches:function(g){return g.isLoop()}},{selector:":simple",matches:function(g){return g.isSimple()}},{selector:":active",matches:function(g){return g.active()}},{selector:":inactive",matches:function(g){return!g.active()}},{selector:":backgrounding",matches:function(g){return g.backgrounding()}},{selector:":nonbackgrounding",matches:function(g){return!g.backgrounding()}}].sort(function(y,g){return Me(y.selector,g.selector)}),qZ=function(){for(var y={},g,x=0;x0&&V.edgeCount>0)return Sc("The selector `"+g+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(V.edgeCount>1)return Sc("The selector `"+g+"` is invalid because it uses multiple edge selectors"),!1;V.edgeCount===1&&Sc("The selector `"+g+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},YZ=function(){if(this.toStringCache!=null)return this.toStringCache;for(var g=function(V){return V??""},x=function(V){return mt(V)?'"'+V+'"':g(V)},T=function(V){return" "+V+" "},L=function(V,Y){var rt=V.type,ot=V.value;switch(rt){case zi.GROUP:{var ht=g(ot);return ht.substring(0,ht.length-1)}case zi.DATA_COMPARE:{var dt=V.field,Lt=V.operator;return"["+dt+T(g(Lt))+x(ot)+"]"}case zi.DATA_BOOL:{var kt=V.operator,Dt=V.field;return"["+g(kt)+Dt+"]"}case zi.DATA_EXIST:{var Pt=V.field;return"["+Pt+"]"}case zi.META_COMPARE:{var $t=V.operator,Zt=V.field;return"[["+Zt+T(g($t))+x(ot)+"]]"}case zi.STATE:return ot;case zi.ID:return"#"+ot;case zi.CLASS:return"."+ot;case zi.PARENT:case zi.CHILD:return O(V.parent,Y)+T(">")+O(V.child,Y);case zi.ANCESTOR:case zi.DESCENDANT:return O(V.ancestor,Y)+" "+O(V.descendant,Y);case zi.COMPOUND_SPLIT:{var Yt=O(V.left,Y),qt=O(V.subject,Y),ne=O(V.right,Y);return Yt+(Yt.length>0?" ":"")+qt+ne}case zi.TRUE:return""}},O=function(V,Y){return V.checks.reduce(function(rt,ot,ht){return rt+(Y===V&&ht===0?"$":"")+L(ot,Y)},"")},P="",$=0;$1&&$=0&&(x=x.replace("!",""),Y=!0),x.indexOf("@")>=0&&(x=x.replace("@",""),V=!0),(O||$||V)&&(q=!O&&!P?"":""+g,S=""+T),V&&(g=q=q.toLowerCase(),T=S=S.toLowerCase()),x){case"*=":L=q.indexOf(S)>=0;break;case"$=":L=q.indexOf(S,q.length-S.length)>=0;break;case"^=":L=q.indexOf(S)===0;break;case"=":L=g===T;break;case">":rt=!0,L=g>T;break;case">=":rt=!0,L=g>=T;break;case"<":rt=!0,L=g0;){var V=L.shift();g(V),O.add(V.id()),$&&T(L,O,V)}return y}function Ik(y,g,x){if(x.isParent())for(var T=x._private.children,L=0;L1&&arguments[1]!==void 0?arguments[1]:!0;return ZT(this,y,g,Ik)};function aB(y,g,x){if(x.isChild()){var T=x._private.parent;g.has(T.id())||y.push(T)}}ax.forEachUp=function(y){var g=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return ZT(this,y,g,aB)};function nJ(y,g,x){aB(y,g,x),Ik(y,g,x)}ax.forEachUpAndDown=function(y){var g=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return ZT(this,y,g,nJ)},ax.ancestors=ax.parents;var Ok,oB;Ok=oB={data:Ac.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:Ac.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:Ac.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Ac.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:Ac.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:Ac.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var g=this[0];if(g)return g._private.data.id}},Ok.attr=Ok.data,Ok.removeAttr=Ok.removeData;var rJ=oB,JT={};function ox(y){return function(g){var x=this;if(g===void 0&&(g=!0),x.length!==0)if(x.isNode()&&!x.removed()){for(var T=0,L=x[0],O=L._private.edges,P=0;Pg}),minIndegree:cx("indegree",function(y,g){return yg}),minOutdegree:cx("outdegree",function(y,g){return yg})}),de(JT,{totalDegree:function(g){for(var x=0,T=this.nodes(),L=0;L0,rt=Y;Y&&(V=V[0]);var ot=rt?V.position():{x:0,y:0};x!==void 0?S.position(g,x+ot[g]):O!==void 0&&S.position({x:O.x+ot.x,y:O.y+ot.y})}else{var ht=T.position(),dt=$?T.parent():null,Lt=dt&&dt.length>0,kt=Lt;Lt&&(dt=dt[0]);var Dt=kt?dt.position():{x:0,y:0};return O={x:ht.x-Dt.x,y:ht.y-Dt.y},g===void 0?O:O[g]}else if(!P)return;return this}},kp.modelPosition=kp.point=kp.position,kp.modelPositions=kp.points=kp.positions,kp.renderedPoint=kp.renderedPosition,kp.relativePoint=kp.relativePosition;var lB=cB,ux,Ub;ux=Ub={},Ub.renderedBoundingBox=function(y){var g=this.boundingBox(y),x=this.cy(),T=x.zoom(),L=x.pan(),O=g.x1*T+L.x,P=g.x2*T+L.x,$=g.y1*T+L.y,q=g.y2*T+L.y;return{x1:O,x2:P,y1:$,y2:q,w:P-O,h:q-$}},Ub.dirtyCompoundBoundsCache=function(){var y=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,g=this.cy();return!g.styleEnabled()||!g.hasCompoundNodes()?this:(this.forEachUp(function(x){if(x.isParent()){var T=x._private;T.compoundBoundsClean=!1,T.bbCache=null,y||x.emitAndNotify("bounds")}}),this)},Ub.updateCompoundBounds=function(){var y=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,g=this.cy();if(!g.styleEnabled()||!g.hasCompoundNodes())return this;if(!y&&g.batching())return this;function x(P){if(!P.isParent())return;var $=P._private,q=P.children(),S=P.pstyle("compound-sizing-wrt-labels").value==="include",V={width:{val:P.pstyle("min-width").pfValue,left:P.pstyle("min-width-bias-left"),right:P.pstyle("min-width-bias-right")},height:{val:P.pstyle("min-height").pfValue,top:P.pstyle("min-height-bias-top"),bottom:P.pstyle("min-height-bias-bottom")}},Y=q.boundingBox({includeLabels:S,includeOverlays:!1,useCache:!1}),rt=$.position;(Y.w===0||Y.h===0)&&(Y={w:P.pstyle("width").pfValue,h:P.pstyle("height").pfValue},Y.x1=rt.x-Y.w/2,Y.x2=rt.x+Y.w/2,Y.y1=rt.y-Y.h/2,Y.y2=rt.y+Y.h/2);function ot(Gt,ge,be){var ie=0,Fe=0,we=ge+be;return Gt>0&&we>0&&(ie=ge/we*Gt,Fe=be/we*Gt),{biasDiff:ie,biasComplementDiff:Fe}}function ht(Gt,ge,be,ie){if(be.units==="%")switch(ie){case"width":return Gt>0?be.pfValue*Gt:0;case"height":return ge>0?be.pfValue*ge:0;case"average":return Gt>0&&ge>0?be.pfValue*(Gt+ge)/2:0;case"min":return Gt>0&&ge>0?Gt>ge?be.pfValue*ge:be.pfValue*Gt:0;case"max":return Gt>0&&ge>0?Gt>ge?be.pfValue*Gt:be.pfValue*ge:0;default:return 0}else return be.units==="px"?be.pfValue:0}var dt=V.width.left.value;V.width.left.units==="px"&&V.width.val>0&&(dt=dt*100/V.width.val);var Lt=V.width.right.value;V.width.right.units==="px"&&V.width.val>0&&(Lt=Lt*100/V.width.val);var kt=V.height.top.value;V.height.top.units==="px"&&V.height.val>0&&(kt=kt*100/V.height.val);var Dt=V.height.bottom.value;V.height.bottom.units==="px"&&V.height.val>0&&(Dt=Dt*100/V.height.val);var Pt=ot(V.width.val-Y.w,dt,Lt),$t=Pt.biasDiff,Zt=Pt.biasComplementDiff,Yt=ot(V.height.val-Y.h,kt,Dt),qt=Yt.biasDiff,ne=Yt.biasComplementDiff;$.autoPadding=ht(Y.w,Y.h,P.pstyle("padding"),P.pstyle("padding-relative-to").value),$.autoWidth=Math.max(Y.w,V.width.val),rt.x=(-$t+Y.x1+Y.x2+Zt)/2,$.autoHeight=Math.max(Y.h,V.height.val),rt.y=(-qt+Y.y1+Y.y2+ne)/2}for(var T=0;Tg.x2?L:g.x2,g.y1=Tg.y2?O:g.y2,g.w=g.x2-g.x1,g.h=g.y2-g.y1)},L3=function(g,x){return x==null?g:Ep(g,x.x1,x.y1,x.x2,x.y2)},Fk=function(g,x,T){return yp(g,x,T)},tC=function(g,x,T){if(!x.cy().headless()){var L=x._private,O=L.rstyle,P=O.arrowWidth/2,$=x.pstyle(T+"-arrow-shape").value,q,S;if($!=="none"){T==="source"?(q=O.srcX,S=O.srcY):T==="target"?(q=O.tgtX,S=O.tgtY):(q=O.midX,S=O.midY);var V=L.arrowBounds=L.arrowBounds||{},Y=V[T]=V[T]||{};Y.x1=q-P,Y.y1=S-P,Y.x2=q+P,Y.y2=S+P,Y.w=Y.x2-Y.x1,Y.h=Y.y2-Y.y1,RT(Y,1),Ep(g,Y.x1,Y.y1,Y.x2,Y.y2)}}},hB=function(g,x,T){if(!x.cy().headless()){var L;T?L=T+"-":L="";var O=x._private,P=O.rstyle,$=x.pstyle(L+"label").strValue;if($){var q=x.pstyle("text-halign"),S=x.pstyle("text-valign"),V=Fk(P,"labelWidth",T),Y=Fk(P,"labelHeight",T),rt=Fk(P,"labelX",T),ot=Fk(P,"labelY",T),ht=x.pstyle(L+"text-margin-x").pfValue,dt=x.pstyle(L+"text-margin-y").pfValue,Lt=x.isEdge(),kt=x.pstyle(L+"text-rotation"),Dt=x.pstyle("text-outline-width").pfValue,Pt=x.pstyle("text-border-width").pfValue,$t=Pt/2,Zt=x.pstyle("text-background-padding").pfValue,Yt=2,qt=Y,ne=V,Gt=ne/2,ge=qt/2,be,ie,Fe,we;if(Lt)be=rt-Gt,ie=rt+Gt,Fe=ot-ge,we=ot+ge;else{switch(q.value){case"left":be=rt-ne,ie=rt;break;case"center":be=rt-Gt,ie=rt+Gt;break;case"right":be=rt,ie=rt+ne;break}switch(S.value){case"top":Fe=ot-qt,we=ot;break;case"center":Fe=ot-ge,we=ot+ge;break;case"bottom":Fe=ot,we=ot+qt;break}}be+=ht-Math.max(Dt,$t)-Zt-Yt,ie+=ht+Math.max(Dt,$t)+Zt+Yt,Fe+=dt-Math.max(Dt,$t)-Zt-Yt,we+=dt+Math.max(Dt,$t)+Zt+Yt;var bn=T||"main",ze=O.labelBounds,Ge=ze[bn]=ze[bn]||{};Ge.x1=be,Ge.y1=Fe,Ge.x2=ie,Ge.y2=we,Ge.w=ie-be,Ge.h=we-Fe;var En=Lt&&kt.strValue==="autorotate",In=kt.pfValue!=null&&kt.pfValue!==0;if(En||In){var Yn=En?Fk(O.rstyle,"labelAngle",T):kt.pfValue,Sn=Math.cos(Yn),Wn=Math.sin(Yn),rr=(be+ie)/2,wr=(Fe+we)/2;if(!Lt){switch(q.value){case"left":rr=ie;break;case"right":rr=be;break}switch(S.value){case"top":wr=we;break;case"bottom":wr=Fe;break}}var ur=function(Ea,Ci){return Ea=Ea-rr,Ci=Ci-wr,{x:Ea*Sn-Ci*Wn+rr,y:Ea*Wn+Ci*Sn+wr}},er=ur(be,Fe),vn=ur(be,we),gr=ur(ie,Fe),fr=ur(ie,we);be=Math.min(er.x,vn.x,gr.x,fr.x),ie=Math.max(er.x,vn.x,gr.x,fr.x),Fe=Math.min(er.y,vn.y,gr.y,fr.y),we=Math.max(er.y,vn.y,gr.y,fr.y)}var Jr=bn+"Rot",vi=ze[Jr]=ze[Jr]||{};vi.x1=be,vi.y1=Fe,vi.x2=ie,vi.y2=we,vi.w=ie-be,vi.h=we-Fe,Ep(g,be,Fe,ie,we),Ep(O.labelBounds.all,be,Fe,ie,we)}return g}},iJ=function(g,x){var T=g._private.cy,L=T.styleEnabled(),O=T.headless(),P=zd(),$=g._private,q=g.isNode(),S=g.isEdge(),V,Y,rt,ot,ht,dt,Lt=$.rstyle,kt=q&&L?g.pstyle("bounds-expansion").pfValue:[0],Dt=function(gs){return gs.pstyle("display").value!=="none"},Pt=!L||Dt(g)&&(!S||Dt(g.source())&&Dt(g.target()));if(Pt){var $t=0,Zt=0;L&&x.includeOverlays&&($t=g.pstyle("overlay-opacity").value,$t!==0&&(Zt=g.pstyle("overlay-padding").value));var Yt=0,qt=0;L&&x.includeUnderlays&&(Yt=g.pstyle("underlay-opacity").value,Yt!==0&&(qt=g.pstyle("underlay-padding").value));var ne=Math.max(Zt,qt),Gt=0,ge=0;if(L&&(Gt=g.pstyle("width").pfValue,ge=Gt/2),q&&x.includeNodes){var be=g.position();ht=be.x,dt=be.y;var ie=g.outerWidth(),Fe=ie/2,we=g.outerHeight(),bn=we/2;V=ht-Fe,Y=ht+Fe,rt=dt-bn,ot=dt+bn,Ep(P,V,rt,Y,ot)}else if(S&&x.includeEdges)if(L&&!O){var ze=g.pstyle("curve-style").strValue;if(V=Math.min(Lt.srcX,Lt.midX,Lt.tgtX),Y=Math.max(Lt.srcX,Lt.midX,Lt.tgtX),rt=Math.min(Lt.srcY,Lt.midY,Lt.tgtY),ot=Math.max(Lt.srcY,Lt.midY,Lt.tgtY),V-=ge,Y+=ge,rt-=ge,ot+=ge,Ep(P,V,rt,Y,ot),ze==="haystack"){var Ge=Lt.haystackPts;if(Ge&&Ge.length===2){if(V=Ge[0].x,rt=Ge[0].y,Y=Ge[1].x,ot=Ge[1].y,V>Y){var En=V;V=Y,Y=En}if(rt>ot){var In=rt;rt=ot,ot=In}Ep(P,V-ge,rt-ge,Y+ge,ot+ge)}}else if(ze==="bezier"||ze==="unbundled-bezier"||ze==="segments"||ze==="taxi"){var Yn;switch(ze){case"bezier":case"unbundled-bezier":Yn=Lt.bezierPts;break;case"segments":case"taxi":Yn=Lt.linePts;break}if(Yn!=null)for(var Sn=0;SnY){var vn=V;V=Y,Y=vn}if(rt>ot){var gr=rt;rt=ot,ot=gr}V-=ge,Y+=ge,rt-=ge,ot+=ge,Ep(P,V,rt,Y,ot)}if(L&&x.includeEdges&&S&&(tC(P,g,"mid-source"),tC(P,g,"mid-target"),tC(P,g,"source"),tC(P,g,"target")),L){var fr=g.pstyle("ghost").value==="yes";if(fr){var Jr=g.pstyle("ghost-offset-x").pfValue,vi=g.pstyle("ghost-offset-y").pfValue;Ep(P,P.x1+Jr,P.y1+vi,P.x2+Jr,P.y2+vi)}}var Xs=$.bodyBounds=$.bodyBounds||{};lN(Xs,P),SL(Xs,kt),RT(Xs,1),L&&(V=P.x1,Y=P.x2,rt=P.y1,ot=P.y2,Ep(P,V-ne,rt-ne,Y+ne,ot+ne));var Ea=$.overlayBounds=$.overlayBounds||{};lN(Ea,P),SL(Ea,kt),RT(Ea,1);var Ci=$.labelBounds=$.labelBounds||{};Ci.all!=null?NK(Ci.all):Ci.all=zd(),L&&x.includeLabels&&(x.includeMainLabels&&hB(P,g,null),S&&(x.includeSourceLabels&&hB(P,g,"source"),x.includeTargetLabels&&hB(P,g,"target")))}return P.x1=M0(P.x1),P.y1=M0(P.y1),P.x2=M0(P.x2),P.y2=M0(P.y2),P.w=M0(P.x2-P.x1),P.h=M0(P.y2-P.y1),P.w>0&&P.h>0&&Pt&&(SL(P,kt),RT(P,1)),P},fB=function(g){var x=0,T=function(P){return(P?1:0)<0&&arguments[0]!==void 0?arguments[0]:vJ,g=arguments.length>1?arguments[1]:void 0,x=0;x=0;$--)P($);return this},Cm.removeAllListeners=function(){return this.removeListener("*")},Cm.emit=Cm.trigger=function(y,g,x){var T=this.listeners,L=T.length;return this.emitting++,ft(g)||(g=[g]),mJ(this,function(O,P){x!=null&&(T=[{event:P.event,type:P.type,namespace:P.namespace,callback:x}],L=T.length);for(var $=function(V){var Y=T[V];if(Y.type===P.type&&(!Y.namespace||Y.namespace===P.namespace||Y.namespace===wJ)&&O.eventMatches(O.context,Y,P)){var rt=[P];g!=null&&aN(rt,g),O.beforeEmit(O.context,Y,P),Y.conf&&Y.conf.one&&(O.listeners=O.listeners.filter(function(dt){return dt!==Y}));var ot=O.callbackContext(O.context,Y,P),ht=Y.callback.apply(ot,rt);O.afterEmit(O.context,Y,P),ht===!1&&(P.stopPropagation(),P.preventDefault())}},q=0;q1&&!P){var $=this.length-1,q=this[$],S=q._private.data.id;this[$]=void 0,this[g]=q,O.set(S,{ele:q,index:g})}return this.length--,this},unmergeOne:function(g){g=g[0];var x=this._private,T=g._private.data.id,L=x.map,O=L.get(T);if(!O)return this;var P=O.index;return this.unmergeAt(P),this},unmerge:function(g){var x=this._private.cy;if(!g)return this;if(g&&mt(g)){var T=g;g=x.mutableElements().filter(T)}for(var L=0;L=0;x--){var T=this[x];g(T)&&this.unmergeAt(x)}return this},map:function(g,x){for(var T=[],L=this,O=0;OT&&(T=q,L=$)}return{value:T,ele:L}},min:function(g,x){for(var T=1/0,L,O=this,P=0;P=0&&O"u"?"undefined":f(Symbol))!=g&&f(Symbol.iterator)!=g;x&&(iC[Symbol.iterator]=function(){var T=this,L={value:void 0,done:!1},O=0,P=this.length;return b({next:function(){return O1&&arguments[1]!==void 0?arguments[1]:!0,T=this[0],L=T.cy();if(L.styleEnabled()&&T){this.cleanStyle();var O=T._private.style[g];return O??(x?L.style().getDefaultProperty(g):null)}},numericStyle:function(g){var x=this[0];if(x.cy().styleEnabled()&&x){var T=x.pstyle(g);return T.pfValue!==void 0?T.pfValue:T.value}},numericStyleUnits:function(g){var x=this[0];if(x.cy().styleEnabled()&&x)return x.pstyle(g).units},renderedStyle:function(g){var x=this.cy();if(!x.styleEnabled())return this;var T=this[0];if(T)return x.style().getRenderedStyle(T,g)},style:function(g,x){var T=this.cy();if(!T.styleEnabled())return this;var L=!1,O=T.style();if(ut(g)){var P=g;O.applyBypass(this,P,L),this.emitAndNotify("style")}else if(mt(g))if(x===void 0){var $=this[0];return $?O.getStylePropertyValue($,g):void 0}else O.applyBypass(this,g,x,L),this.emitAndNotify("style");else if(g===void 0){var q=this[0];return q?O.getRawStyle(q):void 0}return this},removeStyle:function(g){var x=this.cy();if(!x.styleEnabled())return this;var T=!1,L=x.style(),O=this;if(g===void 0)for(var P=0;P0&&g.push(V[0]),g.push($[0])}return this.spawn(g,!0).filter(y)},"neighborhood"),closedNeighborhood:function(g){return this.neighborhood().add(this).filter(g)},openNeighborhood:function(g){return this.neighborhood(g)}}),d1.neighbourhood=d1.neighborhood,d1.closedNeighbourhood=d1.closedNeighborhood,d1.openNeighbourhood=d1.openNeighborhood,de(d1,{source:ad(function(g){var x=this[0],T;return x&&(T=x._private.source||x.cy().collection()),T&&g?T.filter(g):T},"source"),target:ad(function(g){var x=this[0],T;return x&&(T=x._private.target||x.cy().collection()),T&&g?T.filter(g):T},"target"),sources:IB({attr:"source"}),targets:IB({attr:"target"})});function IB(y){return function(x){for(var T=[],L=0;L0);return P},component:function(){var g=this[0];return g.cy().mutableElements().components(g)[0]}}),d1.componentsOf=d1.components;var $f=function(g,x){var T=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,L=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(g===void 0){vl("A collection must have a reference to the core");return}var O=new Gb,P=!1;if(!x)x=[];else if(x.length>0&&ut(x[0])&&!nt(x[0])){P=!0;for(var $=[],q=new Y5,S=0,V=x.length;S0&&arguments[0]!==void 0?arguments[0]:!0,g=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,x=this,T=x.cy(),L=T._private,O=[],P=[],$,q=0,S=x.length;q0){for(var In=$.length===x.length?x:new $f(T,$),Yn=0;Yn0&&arguments[0]!==void 0?arguments[0]:!0,g=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,x=this,T=[],L={},O=x._private.cy;function P(we){for(var bn=we._private.edges,ze=0;ze0&&(y?be.emitAndNotify("remove"):g&&be.emit("remove"));for(var ie=0;ie0?ie=we:be=we;while(Math.abs(Fe)>P&&++bn<$);return we}function Zt(ge){for(var be=0,ie=1,Fe=q-1;ie!==Fe&&rt[ie]<=ge;++ie)be+=S;--ie;var we=(ge-rt[ie])/(rt[ie+1]-rt[ie]),bn=be+we*S,ze=kt(bn,y,x);return ze>=O?Dt(ge,bn):ze===0?bn:$t(ge,be,be+S)}var Yt=!1;function qt(){Yt=!0,(y!==g||x!==T)&&Pt()}var ne=function(be){return Yt||qt(),y===g&&x===T?be:be===0?0:be===1?1:Lt(Zt(be),g,T)};ne.getControlPoints=function(){return[{x:y,y:g},{x,y:T}]};var Gt="generateBezier("+[y,g,x,T]+")";return ne.toString=function(){return Gt},ne}/*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */var MJ=function(){function y(T){return-T.tension*T.x-T.friction*T.v}function g(T,L,O){var P={x:T.x+O.dx*L,v:T.v+O.dv*L,tension:T.tension,friction:T.friction};return{dx:P.v,dv:y(P)}}function x(T,L){var O={dx:T.v,dv:y(T)},P=g(T,L*.5,O),$=g(T,L*.5,P),q=g(T,L,$),S=1/6*(O.dx+2*(P.dx+$.dx)+q.dx),V=1/6*(O.dv+2*(P.dv+$.dv)+q.dv);return T.x=T.x+S*L,T.v=T.v+V*L,T}return function T(L,O,P){var $={x:-1,v:0,tension:null,friction:null},q=[0],S=0,V=1/1e4,Y=16/1e3,rt,ot,ht;for(L=parseFloat(L)||500,O=parseFloat(O)||20,P=P||null,$.tension=L,$.friction=O,rt=P!==null,rt?(S=T(L,O),ot=S/P*Y):ot=Y;ht=x(ht||$,ot),q.push(1+ht.x),S+=16,Math.abs(ht.x)>V&&Math.abs(ht.v)>V;);return rt?function(dt){return q[dt*(q.length-1)|0]}:S}}(),gu=function(g,x,T,L){var O=LJ(g,x,T,L);return function(P,$,q){return P+($-P)*O(q)}},cC={linear:function(g,x,T){return g+(x-g)*T},ease:gu(.25,.1,.25,1),"ease-in":gu(.42,0,1,1),"ease-out":gu(0,0,.58,1),"ease-in-out":gu(.42,0,.58,1),"ease-in-sine":gu(.47,0,.745,.715),"ease-out-sine":gu(.39,.575,.565,1),"ease-in-out-sine":gu(.445,.05,.55,.95),"ease-in-quad":gu(.55,.085,.68,.53),"ease-out-quad":gu(.25,.46,.45,.94),"ease-in-out-quad":gu(.455,.03,.515,.955),"ease-in-cubic":gu(.55,.055,.675,.19),"ease-out-cubic":gu(.215,.61,.355,1),"ease-in-out-cubic":gu(.645,.045,.355,1),"ease-in-quart":gu(.895,.03,.685,.22),"ease-out-quart":gu(.165,.84,.44,1),"ease-in-out-quart":gu(.77,0,.175,1),"ease-in-quint":gu(.755,.05,.855,.06),"ease-out-quint":gu(.23,1,.32,1),"ease-in-out-quint":gu(.86,0,.07,1),"ease-in-expo":gu(.95,.05,.795,.035),"ease-out-expo":gu(.19,1,.22,1),"ease-in-out-expo":gu(1,0,0,1),"ease-in-circ":gu(.6,.04,.98,.335),"ease-out-circ":gu(.075,.82,.165,1),"ease-in-out-circ":gu(.785,.135,.15,.86),spring:function(g,x,T){if(T===0)return cC.linear;var L=MJ(g,x,T);return function(O,P,$){return O+(P-O)*L($)}},"cubic-bezier":gu};function FB(y,g,x,T,L){if(T===1||g===x)return x;var O=L(g,x,T);return y==null||((y.roundValue||y.color)&&(O=Math.round(O)),y.min!==void 0&&(O=Math.max(O,y.min)),y.max!==void 0&&(O=Math.min(O,y.max))),O}function NB(y,g){return y.pfValue!=null||y.value!=null?y.pfValue!=null&&(g==null||g.type.units!=="%")?y.pfValue:y.value:y}function fx(y,g,x,T,L){var O=L!=null?L.type:null;x<0?x=0:x>1&&(x=1);var P=NB(y,L),$=NB(g,L);if(X(P)&&X($))return FB(O,P,$,x,T);if(ft(P)&&ft($)){for(var q=[],S=0;S<$.length;S++){var V=P[S],Y=$[S];if(V!=null&&Y!=null){var rt=FB(O,V,Y,x,T);q.push(rt)}else q.push(Y)}return q}}function DJ(y,g,x,T){var L=!T,O=y._private,P=g._private,$=P.easing,q=P.startTime,S=T?y:y.cy(),V=S.style();if(!P.easingImpl)if($==null)P.easingImpl=cC.linear;else{var Y;if(mt($)){var rt=V.parse("transition-timing-function",$);Y=rt.value}else Y=$;var ot,ht;mt(Y)?(ot=Y,ht=[]):(ot=Y[1],ht=Y.slice(2).map(function(In){return+In})),ht.length>0?(ot==="spring"&&ht.push(P.duration),P.easingImpl=cC[ot].apply(null,ht)):P.easingImpl=cC[ot]}var dt=P.easingImpl,Lt;if(P.duration===0?Lt=1:Lt=(x-q)/P.duration,P.applying&&(Lt=P.progress),Lt<0?Lt=0:Lt>1&&(Lt=1),P.delay==null){var kt=P.startPosition,Dt=P.position;if(Dt&&L&&!y.locked()){var Pt={};$k(kt.x,Dt.x)&&(Pt.x=fx(kt.x,Dt.x,Lt,dt)),$k(kt.y,Dt.y)&&(Pt.y=fx(kt.y,Dt.y,Lt,dt)),y.position(Pt)}var $t=P.startPan,Zt=P.pan,Yt=O.pan,qt=Zt!=null&&T;qt&&($k($t.x,Zt.x)&&(Yt.x=fx($t.x,Zt.x,Lt,dt)),$k($t.y,Zt.y)&&(Yt.y=fx($t.y,Zt.y,Lt,dt)),y.emit("pan"));var ne=P.startZoom,Gt=P.zoom,ge=Gt!=null&&T;ge&&($k(ne,Gt)&&(O.zoom=_k(O.minZoom,fx(ne,Gt,Lt,dt),O.maxZoom)),y.emit("zoom")),(qt||ge)&&y.emit("viewport");var be=P.style;if(be&&be.length>0&&L){for(var ie=0;ie=0;qt--){var ne=Yt[qt];ne()}Yt.splice(0,Yt.length)},Dt=ot.length-1;Dt>=0;Dt--){var Pt=ot[Dt],$t=Pt._private;if($t.stopped){ot.splice(Dt,1),$t.hooked=!1,$t.playing=!1,$t.started=!1,kt($t.frames);continue}!$t.playing&&!$t.applying||($t.playing&&$t.applying&&($t.applying=!1),$t.started||IJ(V,Pt,y),DJ(V,Pt,y,Y),$t.applying&&($t.applying=!1),kt($t.frames),$t.step!=null&&$t.step(y),Pt.completed()&&(ot.splice(Dt,1),$t.hooked=!1,$t.playing=!1,$t.started=!1,kt($t.completes)),dt=!0)}return!Y&&ot.length===0&&ht.length===0&&T.push(V),dt}for(var O=!1,P=0;P0?g.notify("draw",x):g.notify("draw")),x.unmerge(T),g.emit("step")}var OJ={animate:Ac.animate(),animation:Ac.animation(),animated:Ac.animated(),clearQueue:Ac.clearQueue(),delay:Ac.delay(),delayAnimation:Ac.delayAnimation(),stop:Ac.stop(),addToAnimationPool:function(g){var x=this;x.styleEnabled()&&x._private.aniEles.merge(g)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var g=this;if(g._private.animationsRunning=!0,!g.styleEnabled())return;function x(){g._private.animationsRunning&&Bf(function(O){BB(O,g),x()})}var T=g.renderer();T&&T.beforeRender?T.beforeRender(function(O,P){BB(P,g)},T.beforeRenderPriorities.animations):x()}},PJ={qualifierCompare:function(g,x){return g==null||x==null?g==null&&x==null:g.sameText(x)},eventMatches:function(g,x,T){var L=x.qualifier;return L!=null?g!==T.target&&nt(T.target)&&L.matches(T.target):!0},addEventFields:function(g,x){x.cy=g,x.target=g},callbackContext:function(g,x,T){return x.qualifier!=null?T.target:g}},uC=function(g){return mt(g)?new Em(g):g},RB={createEmitter:function(){var g=this._private;return g.emitter||(g.emitter=new nC(PJ,this)),this},emitter:function(){return this._private.emitter},on:function(g,x,T){return this.emitter().on(g,uC(x),T),this},removeListener:function(g,x,T){return this.emitter().removeListener(g,uC(x),T),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(g,x,T){return this.emitter().one(g,uC(x),T),this},once:function(g,x,T){return this.emitter().one(g,uC(x),T),this},emit:function(g,x){return this.emitter().emit(g,x),this},emitAndNotify:function(g,x){return this.emit(g),this.notify(g,x),this}};Ac.eventAliasesOn(RB);var UL={png:function(g){var x=this._private.renderer;return g=g||{},x.png(g)},jpg:function(g){var x=this._private.renderer;return g=g||{},g.bg=g.bg||"#fff",x.jpg(g)}};UL.jpeg=UL.jpg;var lC={layout:function(g){var x=this;if(g==null){vl("Layout options must be specified to make a layout");return}if(g.name==null){vl("A `name` must be specified to make a layout");return}var T=g.name,L=x.extension("layout",T);if(L==null){vl("No such layout `"+T+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var O;mt(g.eles)?O=x.$(g.eles):O=g.eles!=null?g.eles:x.$();var P=new L(de({},g,{cy:x,eles:O}));return P}};lC.createLayout=lC.makeLayout=lC.layout;var FJ={notify:function(g,x){var T=this._private;if(this.batching()){T.batchNotifications=T.batchNotifications||{};var L=T.batchNotifications[g]=T.batchNotifications[g]||this.collection();x!=null&&L.merge(x);return}if(T.notificationsEnabled){var O=this.renderer();this.destroyed()||!O||O.notify(g,x)}},notifications:function(g){var x=this._private;return g===void 0?x.notificationsEnabled:(x.notificationsEnabled=!!g,this)},noNotifications:function(g){this.notifications(!1),g(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var g=this._private;return g.batchCount==null&&(g.batchCount=0),g.batchCount===0&&(g.batchStyleEles=this.collection(),g.batchNotifications={}),g.batchCount++,this},endBatch:function(){var g=this._private;if(g.batchCount===0)return this;if(g.batchCount--,g.batchCount===0){g.batchStyleEles.updateStyle();var x=this.renderer();Object.keys(g.batchNotifications).forEach(function(T){var L=g.batchNotifications[T];L.empty()?x.notify(T):x.notify(T,L)})}return this},batch:function(g){return this.startBatch(),g(),this.endBatch(),this},batchData:function(g){var x=this;return this.batch(function(){for(var T=Object.keys(g),L=0;L0;)x.removeChild(x.childNodes[0]);g._private.renderer=null,g.mutableElements().forEach(function(T){var L=T._private;L.rscratch={},L.rstyle={},L.animation.current=[],L.animation.queue=[]})},onRender:function(g){return this.on("render",g)},offRender:function(g){return this.off("render",g)}};WL.invalidateDimensions=WL.resize;var hC={collection:function(g,x){return mt(g)?this.$(g):Tt(g)?g.collection():ft(g)?(x||(x={}),new $f(this,g,x.unique,x.removed)):new $f(this)},nodes:function(g){var x=this.$(function(T){return T.isNode()});return g?x.filter(g):x},edges:function(g){var x=this.$(function(T){return T.isEdge()});return g?x.filter(g):x},$:function(g){var x=this._private.elements;return g?x.filter(g):x.spawnSelf()},mutableElements:function(){return this._private.elements}};hC.elements=hC.filter=hC.$;var g1={},zk="t",BJ="f";g1.apply=function(y){for(var g=this,x=g._private,T=x.cy,L=T.collection(),O=0;O0;if(rt||Y&&ot){var ht=void 0;rt&&ot||rt?ht=S.properties:ot&&(ht=S.mappedProperties);for(var dt=0;dt1&&($t=1),$.color){var Yt=T.valueMin[0],qt=T.valueMax[0],ne=T.valueMin[1],Gt=T.valueMax[1],ge=T.valueMin[2],be=T.valueMax[2],ie=T.valueMin[3]==null?1:T.valueMin[3],Fe=T.valueMax[3]==null?1:T.valueMax[3],we=[Math.round(Yt+(qt-Yt)*$t),Math.round(ne+(Gt-ne)*$t),Math.round(ge+(be-ge)*$t),Math.round(ie+(Fe-ie)*$t)];O={bypass:T.bypass,name:T.name,value:we,strValue:"rgb("+we[0]+", "+we[1]+", "+we[2]+")"}}else if($.number){var bn=T.valueMin+(T.valueMax-T.valueMin)*$t;O=this.parse(T.name,bn,T.bypass,rt)}else return!1;if(!O)return dt(),!1;O.mapping=T,T=O;break}case P.data:{for(var ze=T.field.split("."),Ge=Y.data,En=0;En0&&O>0){for(var $={},q=!1,S=0;S0?y.delayAnimation(P).play().promise().then(Pt):Pt()}).then(function(){return y.animation({style:$,duration:O,easing:y.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){x.removeBypasses(y,L),y.emitAndNotify("style"),T.transitioning=!1})}else T.transitioning&&(this.removeBypasses(y,L),y.emitAndNotify("style"),T.transitioning=!1)},g1.checkTrigger=function(y,g,x,T,L,O){var P=this.properties[g],$=L(P);$!=null&&$(x,T)&&O(P)},g1.checkZOrderTrigger=function(y,g,x,T){var L=this;this.checkTrigger(y,g,x,T,function(O){return O.triggersZOrder},function(){L._private.cy.notify("zorder",y)})},g1.checkBoundsTrigger=function(y,g,x,T){this.checkTrigger(y,g,x,T,function(L){return L.triggersBounds},function(L){y.dirtyCompoundBoundsCache(),y.dirtyBoundingBoxCache(),L.triggersBoundsOfParallelBeziers&&(g==="curve-style"&&(x==="bezier"||T==="bezier")||g==="display"&&(x==="none"||T==="none"))&&y.parallelEdges().forEach(function(O){O.isBundledBezier()&&O.dirtyBoundingBoxCache()})})},g1.checkTriggers=function(y,g,x,T){y.dirtyStyleCache(),this.checkZOrderTrigger(y,g,x,T),this.checkBoundsTrigger(y,g,x,T)};var qk={};qk.applyBypass=function(y,g,x,T){var L=this,O=[],P=!0;if(g==="*"||g==="**"){if(x!==void 0)for(var $=0;$L.length?T=T.substr(L.length):T=""}function q(){O.length>P.length?O=O.substr(P.length):O=""}for(;;){var S=T.match(/^\s*$/);if(S)break;var V=T.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!V){Sc("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+T);break}L=V[0];var Y=V[1];if(Y!=="core"){var rt=new Em(Y);if(rt.invalid){Sc("Skipping parsing of block: Invalid selector found in string stylesheet: "+Y),$();continue}}var ot=V[2],ht=!1;O=ot;for(var dt=[];;){var Lt=O.match(/^\s*$/);if(Lt)break;var kt=O.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!kt){Sc("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+ot),ht=!0;break}P=kt[0];var Dt=kt[1],Pt=kt[2],$t=g.properties[Dt];if(!$t){Sc("Skipping property: Invalid property name in: "+P),q();continue}var Zt=x.parse(Dt,Pt);if(!Zt){Sc("Skipping property: Invalid property definition in: "+P),q();continue}dt.push({name:Dt,val:Pt}),q()}if(ht){$();break}x.selector(Y);for(var Yt=0;Yt=7&&g[0]==="d"&&(V=new RegExp($.data.regex).exec(g))){if(x)return!1;var rt=$.data;return{name:y,value:V,strValue:""+g,mapped:rt,field:V[1],bypass:x}}else if(g.length>=10&&g[0]==="m"&&(Y=new RegExp($.mapData.regex).exec(g))){if(x||S.multiple)return!1;var ot=$.mapData;if(!(S.color||S.number))return!1;var ht=this.parse(y,Y[4]);if(!ht||ht.mapped)return!1;var dt=this.parse(y,Y[5]);if(!dt||dt.mapped)return!1;if(ht.pfValue===dt.pfValue||ht.strValue===dt.strValue)return Sc("`"+y+": "+g+"` is not a valid mapper because the output range is zero; converting to `"+y+": "+ht.strValue+"`"),this.parse(y,ht.strValue);if(S.color){var Lt=ht.value,kt=dt.value,Dt=Lt[0]===kt[0]&&Lt[1]===kt[1]&&Lt[2]===kt[2]&&(Lt[3]===kt[3]||(Lt[3]==null||Lt[3]===1)&&(kt[3]==null||kt[3]===1));if(Dt)return!1}return{name:y,value:Y,strValue:""+g,mapped:ot,field:Y[1],fieldMin:parseFloat(Y[2]),fieldMax:parseFloat(Y[3]),valueMin:ht.value,valueMax:dt.value,bypass:x}}}if(S.multiple&&T!=="multiple"){var Pt;if(q?Pt=g.split(/\s+/):ft(g)?Pt=g:Pt=[g],S.evenMultiple&&Pt.length%2!==0)return null;for(var $t=[],Zt=[],Yt=[],qt="",ne=!1,Gt=0;Gt0?" ":"")+ge.strValue}return S.validate&&!S.validate($t,Zt)?null:S.singleEnum&&ne?$t.length===1&&mt($t[0])?{name:y,value:$t[0],strValue:$t[0],bypass:x}:null:{name:y,value:$t,pfValue:Yt,strValue:qt,bypass:x,units:Zt}}var be=function(){for(var fr=0;frS.max||S.strictMax&&g===S.max))return null;var ze={name:y,value:g,strValue:""+g+(ie||""),units:ie,bypass:x};return S.unitless||ie!=="px"&&ie!=="em"?ze.pfValue=g:ze.pfValue=ie==="px"||!ie?g:this.getEmSizeInPixels()*g,(ie==="ms"||ie==="s")&&(ze.pfValue=ie==="ms"?g:1e3*g),(ie==="deg"||ie==="rad")&&(ze.pfValue=ie==="rad"?g:IK(g)),ie==="%"&&(ze.pfValue=g/100),ze}else if(S.propList){var Ge=[],En=""+g;if(En!=="none"){for(var In=En.split(/\s*,\s*|\s+/),Yn=0;Yn0&&$>0&&!isNaN(T.w)&&!isNaN(T.h)&&T.w>0&&T.h>0){q=Math.min((P-2*x)/T.w,($-2*x)/T.h),q=q>this._private.maxZoom?this._private.maxZoom:q,q=q=T.minZoom&&(T.maxZoom=x),this},minZoom:function(g){return g===void 0?this._private.minZoom:this.zoomRange({min:g})},maxZoom:function(g){return g===void 0?this._private.maxZoom:this.zoomRange({max:g})},getZoomedViewport:function(g){var x=this._private,T=x.pan,L=x.zoom,O,P,$=!1;if(x.zoomingEnabled||($=!0),X(g)?P=g:ut(g)&&(P=g.level,g.position!=null?O=NT(g.position,L,T):g.renderedPosition!=null&&(O=g.renderedPosition),O!=null&&!x.panningEnabled&&($=!0)),P=P>x.maxZoom?x.maxZoom:P,P=Px.maxZoom||!x.zoomingEnabled?P=!0:(x.zoom=q,O.push("zoom"))}if(L&&(!P||!g.cancelOnFailedZoom)&&x.panningEnabled){var S=g.pan;X(S.x)&&(x.pan.x=S.x,$=!1),X(S.y)&&(x.pan.y=S.y,$=!1),$||O.push("pan")}return O.length>0&&(O.push("viewport"),this.emit(O.join(" ")),this.notify("viewport")),this},center:function(g){var x=this.getCenterPan(g);return x&&(this._private.pan=x,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(g,x){if(this._private.panningEnabled){if(mt(g)){var T=g;g=this.mutableElements().filter(T)}else Tt(g)||(g=this.mutableElements());if(g.length!==0){var L=g.boundingBox(),O=this.width(),P=this.height();x=x===void 0?this._private.zoom:x;var $={x:(O-x*(L.x1+L.x2))/2,y:(P-x*(L.y1+L.y2))/2};return $}}},reset:function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},invalidateSize:function(){this._private.sizeCache=null},size:function(){var g=this._private,x=g.container;return g.sizeCache=g.sizeCache||(x?function(){var T=R.getComputedStyle(x),L=function(P){return parseFloat(T.getPropertyValue(P))};return{width:x.clientWidth-L("padding-left")-L("padding-right"),height:x.clientHeight-L("padding-top")-L("padding-bottom")}}():{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var g=this._private.pan,x=this._private.zoom,T=this.renderedExtent(),L={x1:(T.x1-g.x)/x,x2:(T.x2-g.x)/x,y1:(T.y1-g.y)/x,y2:(T.y2-g.y)/x};return L.w=L.x2-L.x1,L.h=L.y2-L.y1,L},renderedExtent:function(){var g=this.width(),x=this.height();return{x1:0,y1:0,x2:g,y2:x,w:g,h:x}},multiClickDebounceTime:function(g){if(g)this._private.multiClickDebounceTime=g;else return this._private.multiClickDebounceTime;return this}};M3.centre=M3.center,M3.autolockNodes=M3.autolock,M3.autoungrabifyNodes=M3.autoungrabify;var Hk={data:Ac.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:Ac.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:Ac.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Ac.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};Hk.attr=Hk.data,Hk.removeAttr=Hk.removeData;var Vk=function(g){var x=this;g=de({},g);var T=g.container;T&&!U(T)&&U(T[0])&&(T=T[0]);var L=T?T._cyreg:null;L=L||{},L&&L.cy&&(L.cy.destroy(),L={});var O=L.readies=L.readies||[];T&&(T._cyreg=L),L.cy=x;var P=R!==void 0&&T!==void 0&&!g.headless,$=g;$.layout=de({name:P?"grid":"null"},$.layout),$.renderer=de({name:P?"canvas":"null"},$.renderer);var q=function(ht,dt,Lt){return dt!==void 0?dt:Lt!==void 0?Lt:ht},S=this._private={container:T,ready:!1,options:$,elements:new $f(this),listeners:[],aniEles:new $f(this),data:$.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:q(!0,$.zoomingEnabled),userZoomingEnabled:q(!0,$.userZoomingEnabled),panningEnabled:q(!0,$.panningEnabled),userPanningEnabled:q(!0,$.userPanningEnabled),boxSelectionEnabled:q(!0,$.boxSelectionEnabled),autolock:q(!1,$.autolock,$.autolockNodes),autoungrabify:q(!1,$.autoungrabify,$.autoungrabifyNodes),autounselectify:q(!1,$.autounselectify),styleEnabled:$.styleEnabled===void 0?P:$.styleEnabled,zoom:X($.zoom)?$.zoom:1,pan:{x:ut($.pan)&&X($.pan.x)?$.pan.x:0,y:ut($.pan)&&X($.pan.y)?$.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:q(250,$.multiClickDebounceTime)};this.createEmitter(),this.selectionType($.selectionType),this.zoomRange({min:$.minZoom,max:$.maxZoom});var V=function(ht,dt){var Lt=ht.some(Ht);if(Lt)return ex.all(ht).then(dt);dt(ht)};S.styleEnabled&&x.setStyle([]);var Y=de({},$,$.renderer);x.initRenderer(Y);var rt=function(ht,dt,Lt){x.notifications(!1);var kt=x.mutableElements();kt.length>0&&kt.remove(),ht!=null&&(ut(ht)||ft(ht))&&x.add(ht),x.one("layoutready",function(Pt){x.notifications(!0),x.emit(Pt),x.one("load",dt),x.emitAndNotify("load")}).one("layoutstop",function(){x.one("done",Lt),x.emit("done")});var Dt=de({},x._private.options.layout);Dt.eles=x.elements(),x.layout(Dt).run()};V([$.style,$.elements],function(ot){var ht=ot[0],dt=ot[1];S.styleEnabled&&x.style().append(ht),rt(dt,function(){x.startAnimationLoop(),S.ready=!0,yt($.ready)&&x.on("ready",$.ready);for(var Lt=0;Lt0,q=zd(g.boundingBox?g.boundingBox:{x1:0,y1:0,w:x.width(),h:x.height()}),S;if(Tt(g.roots))S=g.roots;else if(ft(g.roots)){for(var V=[],Y=0;Y0;){var bn=we(),ze=ge(bn,ie);if(ze)bn.outgoers().filter(function(Ci){return Ci.isNode()&&T.has(Ci)}).forEach(Fe);else if(ze===null){Sc("Detected double maximal shift for node `"+bn.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}Gt();var Ge=0;if(g.avoidOverlap)for(var En=0;En0&&kt[0].length<=3?qs/2:0),jn=2*Math.PI/kt[qi].length*Si;return qi===0&&kt[0].length===1&&(Qt=1),{x:vi.x+Qt*Math.cos(jn),y:vi.y+Qt*Math.sin(jn)}}else{var Tr={x:vi.x+(Si+1-(Ui+1)/2)*Va,y:(qi+1)*Qs};return Tr}};return T.nodes().layoutPositions(this,g,Ea),this};var zJ={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(g,x){return!0},ready:void 0,stop:void 0,transform:function(g,x){return x}};function pC(y){this.options=de({},zJ,y)}pC.prototype.run=function(){var y=this.options,g=y,x=y.cy,T=g.eles,L=g.counterclockwise!==void 0?!g.counterclockwise:g.clockwise,O=T.nodes().not(":parent");g.sort&&(O=O.sort(g.sort));for(var P=zd(g.boundingBox?g.boundingBox:{x1:0,y1:0,w:x.width(),h:x.height()}),$={x:P.x1+P.w/2,y:P.y1+P.h/2},q=g.sweep===void 0?2*Math.PI-2*Math.PI/O.length:g.sweep,S=q/Math.max(1,O.length-1),V,Y=0,rt=0;rt1&&g.avoidOverlap){Y*=1.75;var kt=Math.cos(S)-Math.cos(0),Dt=Math.sin(S)-Math.sin(0),Pt=Math.sqrt(Y*Y/(kt*kt+Dt*Dt));V=Math.max(Pt,V)}var $t=function(Yt,qt){var ne=g.startAngle+qt*S*(L?1:-1),Gt=V*Math.cos(ne),ge=V*Math.sin(ne),be={x:$.x+Gt,y:$.y+ge};return be};return T.nodes().layoutPositions(this,g,$t),this};var qJ={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:function(g){return g.degree()},levelWidth:function(g){return g.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(g,x){return!0},ready:void 0,stop:void 0,transform:function(g,x){return x}};function $B(y){this.options=de({},qJ,y)}$B.prototype.run=function(){for(var y=this.options,g=y,x=g.counterclockwise!==void 0?!g.counterclockwise:g.clockwise,T=y.cy,L=g.eles,O=L.nodes().not(":parent"),P=zd(g.boundingBox?g.boundingBox:{x1:0,y1:0,w:T.width(),h:T.height()}),$={x:P.x1+P.w/2,y:P.y1+P.h/2},q=[],S=0,V=0;V0){var Zt=Math.abs(Dt[0].value-$t.value);Zt>=Lt&&(Dt=[],kt.push(Dt))}Dt.push($t)}var Yt=S+g.minNodeSpacing;if(!g.avoidOverlap){var qt=kt.length>0&&kt[0].length>1,ne=Math.min(P.w,P.h)/2-Yt,Gt=ne/(kt.length+qt?1:0);Yt=Math.min(Yt,Gt)}for(var ge=0,be=0;be1&&g.avoidOverlap){var bn=Math.cos(we)-Math.cos(0),ze=Math.sin(we)-Math.sin(0),Ge=Math.sqrt(Yt*Yt/(bn*bn+ze*ze));ge=Math.max(Ge,ge)}ie.r=ge,ge+=Yt}if(g.equidistant){for(var En=0,In=0,Yn=0;Yn=y.numIter||(XJ(T,y),T.temperature=T.temperature*y.coolingFactor,T.temperature=y.animationThreshold&&O(),Bf(Y)}};V()}else{for(;S;)S=P(q),q++;HB(T,y),$()}return this},bC.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this},bC.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var VJ=function(g,x,T){for(var L=T.eles.edges(),O=T.eles.nodes(),P={isCompound:g.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:O.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:L.size(),temperature:T.initialTemp,clientWidth:g.width(),clientHeight:g.width(),boundingBox:zd(T.boundingBox?T.boundingBox:{x1:0,y1:0,w:g.width(),h:g.height()})},$=T.eles.components(),q={},S=0;S<$.length;S++)for(var V=$[S],Y=0;Y0){P.graphSet.push(qt);for(var S=0;SL.count?0:L.graph},UJ=function y(g,x,T,L){var O=L.graphSet[T];if(-10)var Y=L.nodeOverlap*V,rt=Math.sqrt($*$+q*q),ot=Y*$/rt,ht=Y*q/rt;else var dt=wC(g,$,q),Lt=wC(x,-1*$,-1*q),kt=Lt.x-dt.x,Dt=Lt.y-dt.y,Pt=kt*kt+Dt*Dt,rt=Math.sqrt(Pt),Y=(g.nodeRepulsion+x.nodeRepulsion)/Pt,ot=Y*kt/rt,ht=Y*Dt/rt;g.isLocked||(g.offsetX-=ot,g.offsetY-=ht),x.isLocked||(x.offsetX+=ot,x.offsetY+=ht)}},JJ=function(g,x,T,L){if(T>0)var O=g.maxX-x.minX;else var O=x.maxX-g.minX;if(L>0)var P=g.maxY-x.minY;else var P=x.maxY-g.minY;return O>=0&&P>=0?Math.sqrt(O*O+P*P):0},wC=function(g,x,T){var L=g.positionX,O=g.positionY,P=g.height||1,$=g.width||1,q=T/x,S=P/$,V={};return x===0&&0T?(V.x=L,V.y=O+P/2,V):0x&&-1*S<=q&&q<=S?(V.x=L-$/2,V.y=O-$*T/2/x,V):0=S)?(V.x=L+P*x/2/T,V.y=O+P/2,V):(0>T&&(q<=-1*S||q>=S)&&(V.x=L-P*x/2/T,V.y=O-P/2),V)},ttt=function(g,x){for(var T=0;TT){var Lt=x.gravity*ot/dt,kt=x.gravity*ht/dt;rt.offsetX+=Lt,rt.offsetY+=kt}}}}},ntt=function(g,x){var T=[],L=0,O=-1;for(T.push.apply(T,g.graphSet[0]),O+=g.graphSet[0].length;L<=O;){var P=T[L++],$=g.idToIndex[P],q=g.layoutNodes[$],S=q.children;if(0T)var O={x:T*g/L,y:T*x/L};else var O={x:g,y:x};return O},stt=function y(g,x){var T=g.parentId;if(T!=null){var L=x.layoutNodes[x.idToIndex[T]],O=!1;if((L.maxX==null||g.maxX+L.padRight>L.maxX)&&(L.maxX=g.maxX+L.padRight,O=!0),(L.minX==null||g.minX-L.padLeftL.maxY)&&(L.maxY=g.maxY+L.padBottom,O=!0),(L.minY==null||g.minY-L.padTopkt&&(ht+=Lt+x.componentSpacing,ot=0,dt=0,Lt=0)}}},att={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:function(g){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(g,x){return!0},ready:void 0,stop:void 0,transform:function(g,x){return x}};function VB(y){this.options=de({},att,y)}VB.prototype.run=function(){var y=this.options,g=y,x=y.cy,T=g.eles,L=T.nodes().not(":parent");g.sort&&(L=L.sort(g.sort));var O=zd(g.boundingBox?g.boundingBox:{x1:0,y1:0,w:x.width(),h:x.height()});if(O.h===0||O.w===0)T.nodes().layoutPositions(this,g,function(rr){return{x:O.x1,y:O.y1}});else{var P=L.size(),$=Math.sqrt(P*O.h/O.w),q=Math.round($),S=Math.round(O.w/O.h*$),V=function(wr){if(wr==null)return Math.min(q,S);var ur=Math.min(q,S);ur==q?q=wr:S=wr},Y=function(wr){if(wr==null)return Math.max(q,S);var ur=Math.max(q,S);ur==q?q=wr:S=wr},rt=g.rows,ot=g.cols!=null?g.cols:g.columns;if(rt!=null&&ot!=null)q=rt,S=ot;else if(rt!=null&&ot==null)q=rt,S=Math.ceil(P/q);else if(rt==null&&ot!=null)S=ot,q=Math.ceil(P/S);else if(S*q>P){var ht=V(),dt=Y();(ht-1)*dt>=P?V(ht-1):(dt-1)*ht>=P&&Y(dt-1)}else for(;S*q=P?Y(kt+1):V(Lt+1)}var Dt=O.w/S,Pt=O.h/q;if(g.condense&&(Dt=0,Pt=0),g.avoidOverlap)for(var $t=0;$t=S&&(bn=0,we++)},Ge={},En=0;En(bn=GK(y,g,ze[Ge],ze[Ge+1],ze[Ge+2],ze[Ge+3])))return Lt(qt,bn),!0}else if(Gt.edgeType==="bezier"||Gt.edgeType==="multibezier"||Gt.edgeType==="self"||Gt.edgeType==="compound"){for(var ze=Gt.allpts,Ge=0;Ge+5(bn=VK(y,g,ze[Ge],ze[Ge+1],ze[Ge+2],ze[Ge+3],ze[Ge+4],ze[Ge+5])))return Lt(qt,bn),!0}for(var En=En||ne.source,In=In||ne.target,Yn=L.getArrowWidth(ge,be),Sn=[{name:"source",x:Gt.arrowStartX,y:Gt.arrowStartY,angle:Gt.srcArrowAngle},{name:"target",x:Gt.arrowEndX,y:Gt.arrowEndY,angle:Gt.tgtArrowAngle},{name:"mid-source",x:Gt.midX,y:Gt.midY,angle:Gt.midsrcArrowAngle},{name:"mid-target",x:Gt.midX,y:Gt.midY,angle:Gt.midtgtArrowAngle}],Ge=0;Ge0&&(kt(En),kt(In))}function Pt(qt,ne,Gt){return yp(qt,ne,Gt)}function $t(qt,ne){var Gt=qt._private,ge=rt,be;ne?be=ne+"-":be="",qt.boundingBox();var ie=Gt.labelBounds[ne||"main"],Fe=qt.pstyle(be+"label").value,we=qt.pstyle("text-events").strValue==="yes";if(!(!we||!Fe)){var bn=Pt(Gt.rscratch,"labelX",ne),ze=Pt(Gt.rscratch,"labelY",ne),Ge=Pt(Gt.rscratch,"labelAngle",ne),En=qt.pstyle(be+"text-margin-x").pfValue,In=qt.pstyle(be+"text-margin-y").pfValue,Yn=ie.x1-ge-En,Sn=ie.x2+ge-En,Wn=ie.y1-ge-In,rr=ie.y2+ge-In;if(Ge){var wr=Math.cos(Ge),ur=Math.sin(Ge),er=function(Ea,Ci){return Ea=Ea-bn,Ci=Ci-ze,{x:Ea*wr-Ci*ur+bn,y:Ea*ur+Ci*wr+ze}},vn=er(Yn,Wn),gr=er(Yn,rr),fr=er(Sn,Wn),Jr=er(Sn,rr),vi=[vn.x+En,vn.y+In,fr.x+En,fr.y+In,Jr.x+En,Jr.y+In,gr.x+En,gr.y+In];if(qd(y,g,vi))return Lt(qt),!0}else if(Q5(ie,y,g))return Lt(qt),!0}}for(var Zt=P.length-1;Zt>=0;Zt--){var Yt=P[Zt];Yt.isNode()?kt(Yt)||$t(Yt):Dt(Yt)||$t(Yt)||$t(Yt,"source")||$t(Yt,"target")}return $},D3.getAllInBox=function(y,g,x,T){var L=this.getCachedZSortedEles().interactive,O=[],P=Math.min(y,x),$=Math.max(y,x),q=Math.min(g,T),S=Math.max(g,T);y=P,x=$,g=q,T=S;for(var V=zd({x1:y,y1:g,x2:x,y2:T}),Y=0;Y0?Math.max(Yi-Fo,0):Math.min(Yi+Fo,0)},Fe=ie(ge,ne),we=ie(be,Gt),bn=!1;Dt===S?kt=Math.abs(Fe)>Math.abs(we)?L:T:Dt===q||Dt===$?(kt=T,bn=!0):(Dt===O||Dt===P)&&(kt=L,bn=!0);var ze=kt===T,Ge=ze?we:Fe,En=ze?be:ge,In=uN(En),Yn=!1;!(bn&&($t||Yt))&&(Dt===$&&En<0||Dt===q&&En>0||Dt===O&&En>0||Dt===P&&En<0)&&(In*=-1,Ge=In*Math.abs(Ge),Yn=!0);var Sn;if($t){var Wn=Zt<0?1+Zt:Zt;Sn=Wn*Ge}else{var rr=Zt<0?Ge:0;Sn=rr+Zt*In}var wr=function(Yi){return Math.abs(Yi)=Math.abs(Ge)},ur=wr(Sn),er=wr(Math.abs(Ge)-Math.abs(Sn)),vn=ur||er;if(vn&&!Yn)if(ze){var gr=Math.abs(En)<=rt/2,fr=Math.abs(ge)<=ot/2;if(gr){var Jr=(V.x1+V.x2)/2,vi=V.y1,Xs=V.y2;x.segpts=[Jr,vi,Jr,Xs]}else if(fr){var Ea=(V.y1+V.y2)/2,Ci=V.x1,hi=V.x2;x.segpts=[Ci,Ea,hi,Ea]}else x.segpts=[V.x1,V.y2]}else{var gs=Math.abs(En)<=Y/2,qi=Math.abs(be)<=ht/2;if(gs){var Si=(V.y1+V.y2)/2,Ui=V.x1,Va=V.x2;x.segpts=[Ui,Si,Va,Si]}else if(qi){var Qs=(V.x1+V.x2)/2,qs=V.y1,Tr=V.y2;x.segpts=[Qs,qs,Qs,Tr]}else x.segpts=[V.x2,V.y1]}else if(ze){var Qt=V.y1+Sn+(Lt?rt/2*In:0),jn=V.x1,Sr=V.x2;x.segpts=[jn,Qt,Sr,Qt]}else{var ir=V.x1+Sn+(Lt?Y/2*In:0),sr=V.y1,Ia=V.y2;x.segpts=[ir,sr,ir,Ia]}},od.tryToCorrectInvalidPoints=function(y,g){var x=y._private.rscratch;if(x.edgeType==="bezier"){var T=g.srcPos,L=g.tgtPos,O=g.srcW,P=g.srcH,$=g.tgtW,q=g.tgtH,S=g.srcShape,V=g.tgtShape,Y=!X(x.startX)||!X(x.startY),rt=!X(x.arrowStartX)||!X(x.arrowStartY),ot=!X(x.endX)||!X(x.endY),ht=!X(x.arrowEndX)||!X(x.arrowEndY),dt=3,Lt=this.getArrowWidth(y.pstyle("width").pfValue,y.pstyle("arrow-scale").value)*this.arrowShapeWidth,kt=dt*Lt,Dt=C3({x:x.ctrlpts[0],y:x.ctrlpts[1]},{x:x.startX,y:x.startY}),Pt=Dtwe.poolIndex()){var bn=Fe;Fe=we,we=bn}var ze=Gt.srcPos=Fe.position(),Ge=Gt.tgtPos=we.position(),En=Gt.srcW=Fe.outerWidth(),In=Gt.srcH=Fe.outerHeight(),Yn=Gt.tgtW=we.outerWidth(),Sn=Gt.tgtH=we.outerHeight(),Wn=Gt.srcShape=x.nodeShapes[g.getNodeShape(Fe)],rr=Gt.tgtShape=x.nodeShapes[g.getNodeShape(we)];Gt.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var wr=0;wr0){var gr=O,fr=_3(gr,K5(x)),Jr=_3(gr,K5(vn)),vi=fr;if(Jr2){var Xs=_3(gr,{x:vn[2],y:vn[3]});Xs0){var jn=P,Sr=_3(jn,K5(x)),ir=_3(jn,K5(Qt)),sr=Sr;if(ir2){var Ia=_3(jn,{x:Qt[2],y:Qt[3]});Ia=ht||qt){Lt={cp:$t,segment:Yt};break}}if(Lt)break}var ne=Lt.cp,Gt=Lt.segment,ge=(ht-kt)/Gt.length,be=Gt.t1-Gt.t0,ie=ot?Gt.t0+be*ge:Gt.t1-be*ge;ie=_k(0,ie,1),g=X5(ne.p0,ne.p1,ne.p2,ie),rt=JB(ne.p0,ne.p1,ne.p2,ie);break}case"straight":case"segments":case"haystack":{for(var Fe=0,we,bn,ze,Ge,En=T.allpts.length,In=0;In+3=ht));In+=2);var Yn=ht-bn,Sn=Yn/we;Sn=_k(0,Sn,1),g=PK(ze,Ge,Sn),rt=ZB(ze,Ge);break}}P("labelX",Y,g.x),P("labelY",Y,g.y),P("labelAutoAngle",Y,rt)}};S("source"),S("target"),this.applyLabelDimensions(y)}},Tp.applyLabelDimensions=function(y){this.applyPrefixedLabelDimensions(y),y.isEdge()&&(this.applyPrefixedLabelDimensions(y,"source"),this.applyPrefixedLabelDimensions(y,"target"))},Tp.applyPrefixedLabelDimensions=function(y,g){var x=y._private,T=this.getLabelText(y,g),L=this.calculateLabelDimensions(y,T),O=y.pstyle("line-height").pfValue,P=y.pstyle("text-wrap").strValue,$=yp(x.rscratch,"labelWrapCachedLines",g)||[],q=P!=="wrap"?1:Math.max($.length,1),S=L.height/q,V=S*O,Y=L.width,rt=L.height+(q-1)*(O-1)*S;mm(x.rstyle,"labelWidth",g,Y),mm(x.rscratch,"labelWidth",g,Y),mm(x.rstyle,"labelHeight",g,rt),mm(x.rscratch,"labelHeight",g,rt),mm(x.rscratch,"labelLineHeight",g,V)},Tp.getLabelText=function(y,g){var x=y._private,T=g?g+"-":"",L=y.pstyle(T+"label").strValue,O=y.pstyle("text-transform").value,P=function(Yn,Sn){return Sn?(mm(x.rscratch,Yn,g,Sn),Sn):yp(x.rscratch,Yn,g)};if(!L)return"";O=="none"||(O=="uppercase"?L=L.toUpperCase():O=="lowercase"&&(L=L.toLowerCase()));var $=y.pstyle("text-wrap").value;if($==="wrap"){var q=P("labelKey");if(q!=null&&P("labelWrapKey")===q)return P("labelWrapCachedText");for(var S="​",V=L.split(` +`),Y=y.pstyle("text-max-width").pfValue,rt=y.pstyle("text-overflow-wrap").value,ot=rt==="anywhere",ht=[],dt=/[\s\u200b]+/,Lt=ot?"":" ",kt=0;ktY){for(var Yt=Dt.split(dt),qt="",ne=0;neFe)break;we+=L[Ge],Ge===L.length-1&&(ze=!0)}return ze||(we+=bn),we}return L},Tp.getLabelJustification=function(y){var g=y.pstyle("text-justification").strValue,x=y.pstyle("text-halign").strValue;if(g==="auto")if(y.isNode())switch(x){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return g},Tp.calculateLabelDimensions=function(y,g){var x=this,T=rd(g,y._private.labelDimsKey),L=x.labelDimCache||(x.labelDimCache=[]),O=L[T];if(O!=null)return O;var P=0,$=y.pstyle("font-style").strValue,q=y.pstyle("font-size").pfValue,S=y.pstyle("font-family").strValue,V=y.pstyle("font-weight").strValue,Y=this.labelCalcCanvas,rt=this.labelCalcCanvasContext;if(!Y){Y=this.labelCalcCanvas=document.createElement("canvas"),rt=this.labelCalcCanvasContext=Y.getContext("2d");var ot=Y.style;ot.position="absolute",ot.left="-9999px",ot.top="-9999px",ot.zIndex="-1",ot.visibility="hidden",ot.pointerEvents="none"}rt.font="".concat($," ").concat(V," ").concat(q,"px ").concat(S);for(var ht=0,dt=0,Lt=g.split(` +`),kt=0;kt1&&arguments[1]!==void 0?arguments[1]:!0;if(g.merge(P),$)for(var q=0;q=y.desktopTapThreshold2}var mw=T(Qt);qf&&(y.hoverData.tapholdCancelled=!0);var Lm=function(){var Yb=y.hoverData.dragDelta=y.hoverData.dragDelta||[];Yb.length===0?(Yb.push(Ja[0]),Yb.push(Ja[1])):(Yb[0]+=Ja[0],Yb[1]+=Ja[1])};Sr=!0,x(Za,["mousemove","vmousemove","tapdrag"],Qt,{x:$r[0],y:$r[1]});var xx=function(){y.data.bgActivePosistion=void 0,y.hoverData.selecting||ir.emit({originalEvent:Qt,type:"boxstart",position:{x:$r[0],y:$r[1]}}),Pc[4]=1,y.hoverData.selecting=!0,y.redrawHint("select",!0),y.redraw()};if(y.hoverData.which===3){if(qf){var F3={originalEvent:Qt,type:"cxtdrag",position:{x:$r[0],y:$r[1]}};Ta?Ta.emit(F3):ir.emit(F3),y.hoverData.cxtDragged=!0,(!y.hoverData.cxtOver||Za!==y.hoverData.cxtOver)&&(y.hoverData.cxtOver&&y.hoverData.cxtOver.emit({originalEvent:Qt,type:"cxtdragout",position:{x:$r[0],y:$r[1]}}),y.hoverData.cxtOver=Za,Za&&Za.emit({originalEvent:Qt,type:"cxtdragover",position:{x:$r[0],y:$r[1]}}))}}else if(y.hoverData.dragging){if(Sr=!0,ir.panningEnabled()&&ir.userPanningEnabled()){var kx;if(y.hoverData.justStartedPan){var SC=y.hoverData.mdownPos;kx={x:($r[0]-SC[0])*sr,y:($r[1]-SC[1])*sr},y.hoverData.justStartedPan=!1}else kx={x:Ja[0]*sr,y:Ja[1]*sr};ir.panBy(kx),ir.emit("dragpan"),y.hoverData.dragged=!0}$r=y.projectIntoViewport(Qt.clientX,Qt.clientY)}else if(Pc[4]==1&&(Ta==null||Ta.pannable())){if(qf){if(!y.hoverData.dragging&&ir.boxSelectionEnabled()&&(mw||!ir.panningEnabled()||!ir.userPanningEnabled()))xx();else if(!y.hoverData.selecting&&ir.panningEnabled()&&ir.userPanningEnabled()){var N3=L(Ta,y.hoverData.downs);N3&&(y.hoverData.dragging=!0,y.hoverData.justStartedPan=!0,Pc[4]=0,y.data.bgActivePosistion=K5(Yi),y.redrawHint("select",!0),y.redraw())}Ta&&Ta.pannable()&&Ta.active()&&Ta.unactivate()}}else{if(Ta&&Ta.pannable()&&Ta.active()&&Ta.unactivate(),(!Ta||!Ta.grabbed())&&Za!=mc&&(mc&&x(mc,["mouseout","tapdragout"],Qt,{x:$r[0],y:$r[1]}),Za&&x(Za,["mouseover","tapdragover"],Qt,{x:$r[0],y:$r[1]}),y.hoverData.last=Za),Ta)if(qf){if(ir.boxSelectionEnabled()&&mw)Ta&&Ta.grabbed()&&(dt(ml),Ta.emit("freeon"),ml.emit("free"),y.dragData.didDrag&&(Ta.emit("dragfreeon"),ml.emit("dragfree"))),xx();else if(Ta&&Ta.grabbed()&&y.nodeIsDraggable(Ta)){var Hd=!y.dragData.didDrag;Hd&&y.redrawHint("eles",!0),y.dragData.didDrag=!0,y.hoverData.draggingEles||ot(ml,{inDragLayer:!0});var y1={x:0,y:0};if(X(Ja[0])&&X(Ja[1])&&(y1.x+=Ja[0],y1.y+=Ja[1],Hd)){var Vd=y.hoverData.dragDelta;Vd&&X(Vd[0])&&X(Vd[1])&&(y1.x+=Vd[0],y1.y+=Vd[1])}y.hoverData.draggingEles=!0,ml.silentShift(y1).emit("position drag"),y.redrawHint("drag",!0),y.redraw()}}else Lm();Sr=!0}if(Pc[2]=$r[0],Pc[3]=$r[1],Sr)return Qt.stopPropagation&&Qt.stopPropagation(),Qt.preventDefault&&Qt.preventDefault(),!1}},!1);var Gt,ge,be;y.registerBinding(window,"mouseup",function(Qt){var jn=y.hoverData.capture;if(jn){y.hoverData.capture=!1;var Sr=y.cy,ir=y.projectIntoViewport(Qt.clientX,Qt.clientY),sr=y.selection,Ia=y.findNearestElement(ir[0],ir[1],!0,!1),$r=y.dragData.possibleDragElements,Yi=y.hoverData.down,Fo=T(Qt);if(y.data.bgActivePosistion&&(y.redrawHint("select",!0),y.redraw()),y.hoverData.tapholdCancelled=!0,y.data.bgActivePosistion=void 0,Yi&&Yi.unactivate(),y.hoverData.which===3){var Pc={originalEvent:Qt,type:"cxttapend",position:{x:ir[0],y:ir[1]}};if(Yi?Yi.emit(Pc):Sr.emit(Pc),!y.hoverData.cxtDragged){var Za={originalEvent:Qt,type:"cxttap",position:{x:ir[0],y:ir[1]}};Yi?Yi.emit(Za):Sr.emit(Za)}y.hoverData.cxtDragged=!1,y.hoverData.which=null}else if(y.hoverData.which===1){if(x(Ia,["mouseup","tapend","vmouseup"],Qt,{x:ir[0],y:ir[1]}),!y.dragData.didDrag&&!y.hoverData.dragged&&!y.hoverData.selecting&&!y.hoverData.isOverThresholdDrag&&(x(Yi,["click","tap","vclick"],Qt,{x:ir[0],y:ir[1]}),ge=!1,Qt.timeStamp-be<=Sr.multiClickDebounceTime()?(Gt&&clearTimeout(Gt),ge=!0,be=null,x(Yi,["dblclick","dbltap","vdblclick"],Qt,{x:ir[0],y:ir[1]})):(Gt=setTimeout(function(){ge||x(Yi,["oneclick","onetap","voneclick"],Qt,{x:ir[0],y:ir[1]})},Sr.multiClickDebounceTime()),be=Qt.timeStamp)),Yi==null&&!y.dragData.didDrag&&!y.hoverData.selecting&&!y.hoverData.dragged&&!T(Qt)&&(Sr.$(g).unselect(["tapunselect"]),$r.length>0&&y.redrawHint("eles",!0),y.dragData.possibleDragElements=$r=Sr.collection()),Ia==Yi&&!y.dragData.didDrag&&!y.hoverData.selecting&&Ia!=null&&Ia._private.selectable&&(y.hoverData.dragging||(Sr.selectionType()==="additive"||Fo?Ia.selected()?Ia.unselect(["tapunselect"]):Ia.select(["tapselect"]):Fo||(Sr.$(g).unmerge(Ia).unselect(["tapunselect"]),Ia.select(["tapselect"]))),y.redrawHint("eles",!0)),y.hoverData.selecting){var mc=Sr.collection(y.getAllInBox(sr[0],sr[1],sr[2],sr[3]));y.redrawHint("select",!0),mc.length>0&&y.redrawHint("eles",!0),Sr.emit({type:"boxend",originalEvent:Qt,position:{x:ir[0],y:ir[1]}});var Ta=function(qf){return qf.selectable()&&!qf.selected()};Sr.selectionType()==="additive"||Fo||Sr.$(g).unmerge(mc).unselect(),mc.emit("box").stdFilter(Ta).select().emit("boxselect"),y.redraw()}if(y.hoverData.dragging&&(y.hoverData.dragging=!1,y.redrawHint("select",!0),y.redrawHint("eles",!0),y.redraw()),!sr[4]){y.redrawHint("drag",!0),y.redrawHint("eles",!0);var Ja=Yi&&Yi.grabbed();dt($r),Ja&&(Yi.emit("freeon"),$r.emit("free"),y.dragData.didDrag&&(Yi.emit("dragfreeon"),$r.emit("dragfree")))}}sr[4]=0,y.hoverData.down=null,y.hoverData.cxtStarted=!1,y.hoverData.draggingEles=!1,y.hoverData.selecting=!1,y.hoverData.isOverThresholdDrag=!1,y.dragData.didDrag=!1,y.hoverData.dragged=!1,y.hoverData.dragDelta=[],y.hoverData.mdownPos=null,y.hoverData.mdownGPos=null}},!1);var ie=function(Qt){if(!y.scrollingPage){var jn=y.cy,Sr=jn.zoom(),ir=jn.pan(),sr=y.projectIntoViewport(Qt.clientX,Qt.clientY),Ia=[sr[0]*Sr+ir.x,sr[1]*Sr+ir.y];if(y.hoverData.draggingEles||y.hoverData.dragging||y.hoverData.cxtStarted||qt()){Qt.preventDefault();return}if(jn.panningEnabled()&&jn.userPanningEnabled()&&jn.zoomingEnabled()&&jn.userZoomingEnabled()){Qt.preventDefault(),y.data.wheelZooming=!0,clearTimeout(y.data.wheelTimeout),y.data.wheelTimeout=setTimeout(function(){y.data.wheelZooming=!1,y.redrawHint("eles",!0),y.redraw()},150);var $r;Qt.deltaY!=null?$r=Qt.deltaY/-250:Qt.wheelDeltaY!=null?$r=Qt.wheelDeltaY/1e3:$r=Qt.wheelDelta/1e3,$r=$r*y.wheelSensitivity;var Yi=Qt.deltaMode===1;Yi&&($r*=33);var Fo=jn.zoom()*Math.pow(10,$r);Qt.type==="gesturechange"&&(Fo=y.gestureStartZoom*Qt.scale),jn.zoom({level:Fo,renderedPosition:{x:Ia[0],y:Ia[1]}}),jn.emit(Qt.type==="gesturechange"?"pinchzoom":"scrollzoom")}}};y.registerBinding(y.container,"wheel",ie,!0),y.registerBinding(window,"scroll",function(Qt){y.scrollingPage=!0,clearTimeout(y.scrollingPageTimeout),y.scrollingPageTimeout=setTimeout(function(){y.scrollingPage=!1},250)},!0),y.registerBinding(y.container,"gesturestart",function(Qt){y.gestureStartZoom=y.cy.zoom(),y.hasTouchStarted||Qt.preventDefault()},!0),y.registerBinding(y.container,"gesturechange",function(Tr){y.hasTouchStarted||ie(Tr)},!0),y.registerBinding(y.container,"mouseout",function(Qt){var jn=y.projectIntoViewport(Qt.clientX,Qt.clientY);y.cy.emit({originalEvent:Qt,type:"mouseout",position:{x:jn[0],y:jn[1]}})},!1),y.registerBinding(y.container,"mouseover",function(Qt){var jn=y.projectIntoViewport(Qt.clientX,Qt.clientY);y.cy.emit({originalEvent:Qt,type:"mouseover",position:{x:jn[0],y:jn[1]}})},!1);var Fe,we,bn,ze,Ge,En,In,Yn,Sn,Wn,rr,wr,ur,er=function(Qt,jn,Sr,ir){return Math.sqrt((Sr-Qt)*(Sr-Qt)+(ir-jn)*(ir-jn))},vn=function(Qt,jn,Sr,ir){return(Sr-Qt)*(Sr-Qt)+(ir-jn)*(ir-jn)},gr;y.registerBinding(y.container,"touchstart",gr=function(Qt){if(y.hasTouchStarted=!0,!!ne(Qt)){kt(),y.touchData.capture=!0,y.data.bgActivePosistion=void 0;var jn=y.cy,Sr=y.touchData.now,ir=y.touchData.earlier;if(Qt.touches[0]){var sr=y.projectIntoViewport(Qt.touches[0].clientX,Qt.touches[0].clientY);Sr[0]=sr[0],Sr[1]=sr[1]}if(Qt.touches[1]){var sr=y.projectIntoViewport(Qt.touches[1].clientX,Qt.touches[1].clientY);Sr[2]=sr[0],Sr[3]=sr[1]}if(Qt.touches[2]){var sr=y.projectIntoViewport(Qt.touches[2].clientX,Qt.touches[2].clientY);Sr[4]=sr[0],Sr[5]=sr[1]}if(Qt.touches[1]){y.touchData.singleTouchMoved=!0,dt(y.dragData.touchDragEles);var Ia=y.findContainerClientCoords();Sn=Ia[0],Wn=Ia[1],rr=Ia[2],wr=Ia[3],Fe=Qt.touches[0].clientX-Sn,we=Qt.touches[0].clientY-Wn,bn=Qt.touches[1].clientX-Sn,ze=Qt.touches[1].clientY-Wn,ur=0<=Fe&&Fe<=rr&&0<=bn&&bn<=rr&&0<=we&&we<=wr&&0<=ze&&ze<=wr;var $r=jn.pan(),Yi=jn.zoom();Ge=er(Fe,we,bn,ze),En=vn(Fe,we,bn,ze),In=[(Fe+bn)/2,(we+ze)/2],Yn=[(In[0]-$r.x)/Yi,(In[1]-$r.y)/Yi];var Fo=200,Pc=Fo*Fo;if(En=1){for(var _p=y.touchData.startPosition=[],Hf=0;Hf=y.touchTapThreshold2}if(jn&&y.touchData.cxt){Qt.preventDefault();var _p=Qt.touches[0].clientX-Sn,Hf=Qt.touches[0].clientY-Wn,_g=Qt.touches[1].clientX-Sn,cd=Qt.touches[1].clientY-Wn,mw=vn(_p,Hf,_g,cd),Lm=mw/En,xx=150,F3=xx*xx,kx=1.5,SC=kx*kx;if(Lm>=SC||mw>=F3){y.touchData.cxt=!1,y.data.bgActivePosistion=void 0,y.redrawHint("select",!0);var N3={originalEvent:Qt,type:"cxttapend",position:{x:sr[0],y:sr[1]}};y.touchData.start?(y.touchData.start.unactivate().emit(N3),y.touchData.start=null):ir.emit(N3)}}if(jn&&y.touchData.cxt){var N3={originalEvent:Qt,type:"cxtdrag",position:{x:sr[0],y:sr[1]}};y.data.bgActivePosistion=void 0,y.redrawHint("select",!0),y.touchData.start?y.touchData.start.emit(N3):ir.emit(N3),y.touchData.start&&(y.touchData.start._private.grabbed=!1),y.touchData.cxtDragged=!0;var Hd=y.findNearestElement(sr[0],sr[1],!0,!0);(!y.touchData.cxtOver||Hd!==y.touchData.cxtOver)&&(y.touchData.cxtOver&&y.touchData.cxtOver.emit({originalEvent:Qt,type:"cxtdragout",position:{x:sr[0],y:sr[1]}}),y.touchData.cxtOver=Hd,Hd&&Hd.emit({originalEvent:Qt,type:"cxtdragover",position:{x:sr[0],y:sr[1]}}))}else if(jn&&Qt.touches[2]&&ir.boxSelectionEnabled())Qt.preventDefault(),y.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,y.touchData.selecting||ir.emit({originalEvent:Qt,type:"boxstart",position:{x:sr[0],y:sr[1]}}),y.touchData.selecting=!0,y.touchData.didSelect=!0,Sr[4]=1,!Sr||Sr.length===0||Sr[0]===void 0?(Sr[0]=(sr[0]+sr[2]+sr[4])/3,Sr[1]=(sr[1]+sr[3]+sr[5])/3,Sr[2]=(sr[0]+sr[2]+sr[4])/3+1,Sr[3]=(sr[1]+sr[3]+sr[5])/3+1):(Sr[2]=(sr[0]+sr[2]+sr[4])/3,Sr[3]=(sr[1]+sr[3]+sr[5])/3),y.redrawHint("select",!0),y.redraw();else if(jn&&Qt.touches[1]&&!y.touchData.didSelect&&ir.zoomingEnabled()&&ir.panningEnabled()&&ir.userZoomingEnabled()&&ir.userPanningEnabled()){Qt.preventDefault(),y.data.bgActivePosistion=void 0,y.redrawHint("select",!0);var y1=y.dragData.touchDragEles;if(y1){y.redrawHint("drag",!0);for(var Vd=0;Vd0&&!y.hoverData.draggingEles&&!y.swipePanning&&y.data.bgActivePosistion!=null&&(y.data.bgActivePosistion=void 0,y.redrawHint("select",!0),y.redraw())}},!1);var Jr;y.registerBinding(window,"touchcancel",Jr=function(Qt){var jn=y.touchData.start;y.touchData.capture=!1,jn&&jn.unactivate()});var vi,Xs,Ea,Ci;if(y.registerBinding(window,"touchend",vi=function(Qt){var jn=y.touchData.start,Sr=y.touchData.capture;if(Sr)Qt.touches.length===0&&(y.touchData.capture=!1),Qt.preventDefault();else return;var ir=y.selection;y.swipePanning=!1,y.hoverData.draggingEles=!1;var sr=y.cy,Ia=sr.zoom(),$r=y.touchData.now,Yi=y.touchData.earlier;if(Qt.touches[0]){var Fo=y.projectIntoViewport(Qt.touches[0].clientX,Qt.touches[0].clientY);$r[0]=Fo[0],$r[1]=Fo[1]}if(Qt.touches[1]){var Fo=y.projectIntoViewport(Qt.touches[1].clientX,Qt.touches[1].clientY);$r[2]=Fo[0],$r[3]=Fo[1]}if(Qt.touches[2]){var Fo=y.projectIntoViewport(Qt.touches[2].clientX,Qt.touches[2].clientY);$r[4]=Fo[0],$r[5]=Fo[1]}jn&&jn.unactivate();var Pc;if(y.touchData.cxt){if(Pc={originalEvent:Qt,type:"cxttapend",position:{x:$r[0],y:$r[1]}},jn?jn.emit(Pc):sr.emit(Pc),!y.touchData.cxtDragged){var Za={originalEvent:Qt,type:"cxttap",position:{x:$r[0],y:$r[1]}};jn?jn.emit(Za):sr.emit(Za)}y.touchData.start&&(y.touchData.start._private.grabbed=!1),y.touchData.cxt=!1,y.touchData.start=null,y.redraw();return}if(!Qt.touches[2]&&sr.boxSelectionEnabled()&&y.touchData.selecting){y.touchData.selecting=!1;var mc=sr.collection(y.getAllInBox(ir[0],ir[1],ir[2],ir[3]));ir[0]=void 0,ir[1]=void 0,ir[2]=void 0,ir[3]=void 0,ir[4]=0,y.redrawHint("select",!0),sr.emit({type:"boxend",originalEvent:Qt,position:{x:$r[0],y:$r[1]}});var Ta=function(F3){return F3.selectable()&&!F3.selected()};mc.emit("box").stdFilter(Ta).select().emit("boxselect"),mc.nonempty()&&y.redrawHint("eles",!0),y.redraw()}if(jn!=null&&jn.unactivate(),Qt.touches[2])y.data.bgActivePosistion=void 0,y.redrawHint("select",!0);else if(!Qt.touches[1]){if(!Qt.touches[0]){if(!Qt.touches[0]){y.data.bgActivePosistion=void 0,y.redrawHint("select",!0);var Ja=y.dragData.touchDragEles;if(jn!=null){var ml=jn._private.grabbed;dt(Ja),y.redrawHint("drag",!0),y.redrawHint("eles",!0),ml&&(jn.emit("freeon"),Ja.emit("free"),y.dragData.didDrag&&(jn.emit("dragfreeon"),Ja.emit("dragfree"))),x(jn,["touchend","tapend","vmouseup","tapdragout"],Qt,{x:$r[0],y:$r[1]}),jn.unactivate(),y.touchData.start=null}else{var qf=y.findNearestElement($r[0],$r[1],!0,!0);x(qf,["touchend","tapend","vmouseup","tapdragout"],Qt,{x:$r[0],y:$r[1]})}var Cp=y.touchData.startPosition[0]-$r[0],_p=Cp*Cp,Hf=y.touchData.startPosition[1]-$r[1],_g=Hf*Hf,cd=_p+_g,mw=cd*Ia*Ia;y.touchData.singleTouchMoved||(jn||sr.$(":selected").unselect(["tapunselect"]),x(jn,["tap","vclick"],Qt,{x:$r[0],y:$r[1]}),Xs=!1,Qt.timeStamp-Ci<=sr.multiClickDebounceTime()?(Ea&&clearTimeout(Ea),Xs=!0,Ci=null,x(jn,["dbltap","vdblclick"],Qt,{x:$r[0],y:$r[1]})):(Ea=setTimeout(function(){Xs||x(jn,["onetap","voneclick"],Qt,{x:$r[0],y:$r[1]})},sr.multiClickDebounceTime()),Ci=Qt.timeStamp)),jn!=null&&!y.dragData.didDrag&&jn._private.selectable&&mw"u"){var hi=[],gs=function(Qt){return{clientX:Qt.clientX,clientY:Qt.clientY,force:1,identifier:Qt.pointerId,pageX:Qt.pageX,pageY:Qt.pageY,radiusX:Qt.width/2,radiusY:Qt.height/2,screenX:Qt.screenX,screenY:Qt.screenY,target:Qt.target}},qi=function(Qt){return{event:Qt,touch:gs(Qt)}},Si=function(Qt){hi.push(qi(Qt))},Ui=function(Qt){for(var jn=0;jn0)return Sn[0]}return null},ot=Object.keys(Y),ht=0;ht0?rt:fN(O,P,g,x,T,L,$)},checkPoint:function(g,x,T,L,O,P,$){var q=Lk(L,O),S=2*q;if(dw(g,x,this.points,P,$,L,O-S,[0,-1],T)||dw(g,x,this.points,P,$,L-S,O,[0,-1],T))return!0;var V=L/2+2*T,Y=O/2+2*T,rt=[P-V,$-Y,P-V,$,P+V,$,P+V,$-Y];return!!(qd(g,x,rt)||S3(g,x,S,S,P+L/2-q,$+O/2-q,T)||S3(g,x,S,S,P-L/2+q,$+O/2-q,T))}}},bw.registerNodeShapes=function(){var y=this.nodeShapes={},g=this;this.generateEllipse(),this.generatePolygon("triangle",sd(3,0)),this.generateRoundPolygon("round-triangle",sd(3,0)),this.generatePolygon("rectangle",sd(4,0)),y.square=y.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var x=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",x),this.generateRoundPolygon("round-diamond",x)}this.generatePolygon("pentagon",sd(5,0)),this.generateRoundPolygon("round-pentagon",sd(5,0)),this.generatePolygon("hexagon",sd(6,0)),this.generateRoundPolygon("round-hexagon",sd(6,0)),this.generatePolygon("heptagon",sd(7,0)),this.generateRoundPolygon("round-heptagon",sd(7,0)),this.generatePolygon("octagon",sd(8,0)),this.generateRoundPolygon("round-octagon",sd(8,0));var T=new Array(20);{var L=ML(5,0),O=ML(5,Math.PI/5),P=.5*(3-Math.sqrt(5));P*=1.57;for(var $=0;$=g.deqFastCost*$t)break}else if(S){if(Dt>=g.deqCost*ot||Dt>=g.deqAvgCost*rt)break}else if(Pt>=g.deqNoDrawCost*rM)break;var Zt=g.deq(T,Lt,dt);if(Zt.length>0)for(var Yt=0;Yt0&&(g.onDeqd(T,ht),!S&&g.shouldRedraw(T,ht,Lt,dt)&&O())},$=g.priority||EL;L.beforeRender(P,$(T))}}}},dtt=function(){function y(g){var x=arguments.length>1&&arguments[1]!==void 0?arguments[1]:wm;p(this,y),this.idsByKey=new Gb,this.keyForId=new Gb,this.cachesByLvl=new Gb,this.lvls=[],this.getKey=g,this.doesEleInvalidateKey=x}return m(y,[{key:"getIdsFor",value:function(x){x==null&&vl("Can not get id list for null key");var T=this.idsByKey,L=this.idsByKey.get(x);return L||(L=new Y5,T.set(x,L)),L}},{key:"addIdForKey",value:function(x,T){x!=null&&this.getIdsFor(x).add(T)}},{key:"deleteIdForKey",value:function(x,T){x!=null&&this.getIdsFor(x).delete(T)}},{key:"getNumberOfIdsForKey",value:function(x){return x==null?0:this.getIdsFor(x).size}},{key:"updateKeyMappingFor",value:function(x){var T=x.id(),L=this.keyForId.get(T),O=this.getKey(x);this.deleteIdForKey(L,T),this.addIdForKey(O,T),this.keyForId.set(T,O)}},{key:"deleteKeyMappingFor",value:function(x){var T=x.id(),L=this.keyForId.get(T);this.deleteIdForKey(L,T),this.keyForId.delete(T)}},{key:"keyHasChangedFor",value:function(x){var T=x.id(),L=this.keyForId.get(T),O=this.getKey(x);return L!==O}},{key:"isInvalid",value:function(x){return this.keyHasChangedFor(x)||this.doesEleInvalidateKey(x)}},{key:"getCachesAt",value:function(x){var T=this.cachesByLvl,L=this.lvls,O=T.get(x);return O||(O=new Gb,T.set(x,O),L.push(x)),O}},{key:"getCache",value:function(x,T){return this.getCachesAt(T).get(x)}},{key:"get",value:function(x,T){var L=this.getKey(x),O=this.getCache(L,T);return O!=null&&this.updateKeyMappingFor(x),O}},{key:"getForCachedKey",value:function(x,T){var L=this.keyForId.get(x.id()),O=this.getCache(L,T);return O}},{key:"hasCache",value:function(x,T){return this.getCachesAt(T).has(x)}},{key:"has",value:function(x,T){var L=this.getKey(x);return this.hasCache(L,T)}},{key:"setCache",value:function(x,T,L){L.key=x,this.getCachesAt(T).set(x,L)}},{key:"set",value:function(x,T,L){var O=this.getKey(x);this.setCache(O,T,L),this.updateKeyMappingFor(x)}},{key:"deleteCache",value:function(x,T){this.getCachesAt(T).delete(x)}},{key:"delete",value:function(x,T){var L=this.getKey(x);this.deleteCache(L,T)}},{key:"invalidateKey",value:function(x){var T=this;this.lvls.forEach(function(L){return T.deleteCache(x,L)})}},{key:"invalidate",value:function(x){var T=x.id(),L=this.keyForId.get(T);this.deleteKeyMappingFor(x);var O=this.doesEleInvalidateKey(x);return O&&this.invalidateKey(L),O||this.getNumberOfIdsForKey(L)===0}}]),y}(),xC=25,kC=50,px=-4,iM=3,sM=7.99,gtt=8,ptt=1024,btt=1024,rR=1024,wtt=.2,vtt=.8,mtt=10,ytt=.15,xtt=.1,ktt=.9,Ett=.9,Ttt=100,Ctt=1,bx={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},_tt=Rf({getKey:null,doesEleInvalidateKey:wm,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:T3,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),Kk=function(g,x){var T=this;T.renderer=g,T.onDequeues=[];var L=_tt(x);de(T,L),T.lookup=new dtt(L.getKey,L.doesEleInvalidateKey),T.setupDequeueing()},Th=Kk.prototype;Th.reasons=bx,Th.getTextureQueue=function(y){var g=this;return g.eleImgCaches=g.eleImgCaches||{},g.eleImgCaches[y]=g.eleImgCaches[y]||[]},Th.getRetiredTextureQueue=function(y){var g=this,x=g.eleImgCaches.retired=g.eleImgCaches.retired||{},T=x[y]=x[y]||[];return T},Th.getElementQueue=function(){var y=this,g=y.eleCacheQueue=y.eleCacheQueue||new Ck(function(x,T){return T.reqs-x.reqs});return g},Th.getElementKeyToQueue=function(){var y=this,g=y.eleKeyToCacheQueue=y.eleKeyToCacheQueue||{};return g},Th.getElement=function(y,g,x,T,L){var O=this,P=this.renderer,$=P.cy.zoom(),q=this.lookup;if(!g||g.w===0||g.h===0||isNaN(g.w)||isNaN(g.h)||!y.visible()||y.removed()||!O.allowEdgeTxrCaching&&y.isEdge()||!O.allowParentTxrCaching&&y.isParent())return null;if(T==null&&(T=Math.ceil(_L($*x))),T=sM||T>iM)return null;var S=Math.pow(2,T),V=g.h*S,Y=g.w*S,rt=P.eleTextBiggerThanMin(y,S);if(!this.isVisible(y,rt))return null;var ot=q.get(y,T);if(ot&&ot.invalidated&&(ot.invalidated=!1,ot.texture.invalidatedWidth-=ot.width),ot)return ot;var ht;if(V<=xC?ht=xC:V<=kC?ht=kC:ht=Math.ceil(V/kC)*kC,V>rR||Y>btt)return null;var dt=O.getTextureQueue(ht),Lt=dt[dt.length-2],kt=function(){return O.recycleTexture(ht,Y)||O.addTexture(ht,Y)};Lt||(Lt=dt[dt.length-1]),Lt||(Lt=kt()),Lt.width-Lt.usedWidthT;be--)Gt=O.getElement(y,g,x,be,bx.downscale);ge()}else return O.queueElement(y,Yt.level-1),Yt;else{var ie;if(!Pt&&!$t&&!Zt)for(var Fe=T-1;Fe>=px;Fe--){var we=q.get(y,Fe);if(we){ie=we;break}}if(Dt(ie))return O.queueElement(y,T),ie;Lt.context.translate(Lt.usedWidth,0),Lt.context.scale(S,S),this.drawElement(Lt.context,y,g,rt,!1),Lt.context.scale(1/S,1/S),Lt.context.translate(-Lt.usedWidth,0)}return ot={x:Lt.usedWidth,texture:Lt,level:T,scale:S,width:Y,height:V,scaledLabelShown:rt},Lt.usedWidth+=Math.ceil(Y+gtt),Lt.eleCaches.push(ot),q.set(y,T,ot),O.checkTextureFullness(Lt),ot},Th.invalidateElements=function(y){for(var g=0;g=wtt*y.width&&this.retireTexture(y)},Th.checkTextureFullness=function(y){var g=this,x=g.getTextureQueue(y.height);y.usedWidth/y.width>vtt&&y.fullnessChecks>=mtt?vm(x,y):y.fullnessChecks++},Th.retireTexture=function(y){var g=this,x=y.height,T=g.getTextureQueue(x),L=this.lookup;vm(T,y),y.retired=!0;for(var O=y.eleCaches,P=0;P=g)return P.retired=!1,P.usedWidth=0,P.invalidatedWidth=0,P.fullnessChecks=0,TL(P.eleCaches),P.context.setTransform(1,0,0,1,0,0),P.context.clearRect(0,0,P.width,P.height),vm(L,P),T.push(P),P}},Th.queueElement=function(y,g){var x=this,T=x.getElementQueue(),L=x.getElementKeyToQueue(),O=this.getKey(y),P=L[O];if(P)P.level=Math.max(P.level,g),P.eles.merge(y),P.reqs++,T.updateItem(P);else{var $={eles:y.spawn().merge(y),level:g,reqs:1,key:O};T.push($),L[O]=$}},Th.dequeue=function(y){for(var g=this,x=g.getElementQueue(),T=g.getElementKeyToQueue(),L=[],O=g.lookup,P=0;P0;P++){var $=x.pop(),q=$.key,S=$.eles[0],V=O.hasCache(S,$.level);if(T[q]=null,V)continue;L.push($);var Y=g.getBoundingBox(S);g.getElement(S,Y,y,$.level,bx.dequeue)}return L},Th.removeFromQueue=function(y){var g=this,x=g.getElementQueue(),T=g.getElementKeyToQueue(),L=this.getKey(y),O=T[L];O!=null&&(O.eles.length===1?(O.reqs=W5,x.updateItem(O),x.pop(),T[L]=null):O.eles.unmerge(y))},Th.onDequeue=function(y){this.onDequeues.push(y)},Th.offDequeue=function(y){vm(this.onDequeues,y)},Th.setupDequeueing=yC.setupDequeueing({deqRedrawThreshold:Ttt,deqCost:ytt,deqAvgCost:xtt,deqNoDrawCost:ktt,deqFastCost:Ett,deq:function(g,x,T){return g.dequeue(x,T)},onDeqd:function(g,x){for(var T=0;T=EC||x>Xk)return null}T.validateLayersElesOrdering(x,y);var q=T.layersByLevel,S=Math.pow(2,x),V=q[x]=q[x]||[],Y,rt=T.levelIsComplete(x,y),ot,ht=function(){var ge=function(bn){if(T.validateLayersElesOrdering(bn,y),T.levelIsComplete(bn,y))return ot=q[bn],!0},be=function(bn){if(!ot)for(var ze=x+bn;wx<=ze&&ze<=Xk&&!ge(ze);ze+=bn);};be(1),be(-1);for(var ie=V.length-1;ie>=0;ie--){var Fe=V[ie];Fe.invalid&&vm(V,Fe)}};if(!rt)ht();else return V;var dt=function(){if(!Y){Y=zd();for(var ge=0;gefpt)return null;var Fe=T.makeLayer(Y,x);if(be!=null){var we=V.indexOf(be)+1;V.splice(we,0,Fe)}else(ge.insert===void 0||ge.insert)&&V.unshift(Fe);return Fe};if(T.skipping&&!$)return null;for(var kt=null,Dt=y.length/Stt,Pt=!$,$t=0;$t=Dt||!hN(kt.bb,Zt.boundingBox()))&&(kt=Lt({insert:!0,after:kt}),!kt))return null;ot||Pt?T.queueLayer(kt,Zt):T.drawEleInLayer(kt,Zt,x,g),kt.eles.push(Zt),qt[x]=kt}return ot||(Pt?null:V)},w1.getEleLevelForLayerLevel=function(y,g){return y},w1.drawEleInLayer=function(y,g,x,T){var L=this,O=this.renderer,P=y.context,$=g.boundingBox();$.w===0||$.h===0||!g.visible()||(x=L.getEleLevelForLayerLevel(x,T),O.setImgSmoothing(P,!1),O.drawCachedElement(P,g,null,null,x,dpt),O.setImgSmoothing(P,!0))},w1.levelIsComplete=function(y,g){var x=this,T=x.layersByLevel[y];if(!T||T.length===0)return!1;for(var L=0,O=0;O0||P.invalid)return!1;L+=P.eles.length}return L===g.length},w1.validateLayersElesOrdering=function(y,g){var x=this.layersByLevel[y];if(x)for(var T=0;T0){g=!0;break}}return g},w1.invalidateElements=function(y){var g=this;y.length!==0&&(g.lastInvalidationTime=yg(),!(y.length===0||!g.haveLayers())&&g.updateElementsInLayers(y,function(T,L,O){g.invalidateLayer(T)}))},w1.invalidateLayer=function(y){if(this.lastInvalidationTime=yg(),!y.invalid){var g=y.level,x=y.eles,T=this.layersByLevel[g];vm(T,y),y.elesQueue=[],y.invalid=!0,y.replacement&&(y.replacement.invalid=!0);for(var L=0;L3&&arguments[3]!==void 0?arguments[3]:!0,L=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,O=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,P=this,$=g._private.rscratch;if(!(O&&!g.visible())&&!($.badLine||$.allpts==null||isNaN($.allpts[0]))){var q;x&&(q=x,y.translate(-q.x1,-q.y1));var S=O?g.pstyle("opacity").value:1,V=O?g.pstyle("line-opacity").value:1,Y=g.pstyle("curve-style").value,rt=g.pstyle("line-style").value,ot=g.pstyle("width").pfValue,ht=g.pstyle("line-cap").value,dt=S*V,Lt=S*V,kt=function(){var ie=arguments.length>0&&arguments[0]!==void 0?arguments[0]:dt;Y==="straight-triangle"?(P.eleStrokeStyle(y,g,ie),P.drawEdgeTrianglePath(g,y,$.allpts)):(y.lineWidth=ot,y.lineCap=ht,P.eleStrokeStyle(y,g,ie),P.drawEdgePath(g,y,$.allpts,rt),y.lineCap="butt")},Dt=function(){L&&P.drawEdgeOverlay(y,g)},Pt=function(){L&&P.drawEdgeUnderlay(y,g)},$t=function(){var ie=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Lt;P.drawArrowheads(y,g,ie)},Zt=function(){P.drawElementText(y,g,null,T)};y.lineJoin="round";var Yt=g.pstyle("ghost").value==="yes";if(Yt){var qt=g.pstyle("ghost-offset-x").pfValue,ne=g.pstyle("ghost-offset-y").pfValue,Gt=g.pstyle("ghost-opacity").value,ge=dt*Gt;y.translate(qt,ne),kt(ge),$t(ge),y.translate(-qt,-ne)}Pt(),kt(),$t(),Dt(),Zt(),x&&y.translate(q.x1,q.y1)}};var Ott=function(g){if(!["overlay","underlay"].includes(g))throw new Error("Invalid state");return function(x,T){if(T.visible()){var L=T.pstyle("".concat(g,"-opacity")).value;if(L!==0){var O=this,P=O.usePaths(),$=T._private.rscratch,q=T.pstyle("".concat(g,"-padding")).pfValue,S=2*q,V=T.pstyle("".concat(g,"-color")).value;x.lineWidth=S,$.edgeType==="self"&&!P?x.lineCap="butt":x.lineCap="round",O.colorStrokeStyle(x,V[0],V[1],V[2],L),O.drawEdgePath(T,x,$.allpts,"solid")}}}};vw.drawEdgeOverlay=Ott("overlay"),vw.drawEdgeUnderlay=Ott("underlay"),vw.drawEdgePath=function(y,g,x,T){var L=y._private.rscratch,O=g,P,$=!1,q=this.usePaths(),S=y.pstyle("line-dash-pattern").pfValue,V=y.pstyle("line-dash-offset").pfValue;if(q){var Y=x.join("$"),rt=L.pathCacheKey&&L.pathCacheKey===Y;rt?(P=g=L.pathCache,$=!0):(P=g=new Path2D,L.pathCacheKey=Y,L.pathCache=P)}if(O.setLineDash)switch(T){case"dotted":O.setLineDash([1,1]);break;case"dashed":O.setLineDash(S),O.lineDashOffset=V;break;case"solid":O.setLineDash([]);break}if(!$&&!L.badLine)switch(g.beginPath&&g.beginPath(),g.moveTo(x[0],x[1]),L.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var ot=2;ot+35&&arguments[5]!==void 0?arguments[5]:!0,P=this;if(T==null){if(O&&!P.eleTextBiggerThanMin(g))return}else if(T===!1)return;if(g.isNode()){var $=g.pstyle("label");if(!$||!$.value)return;var q=P.getLabelJustification(g);y.textAlign=q,y.textBaseline="bottom"}else{var S=g.element()._private.rscratch.badLine,V=g.pstyle("label"),Y=g.pstyle("source-label"),rt=g.pstyle("target-label");if(S||(!V||!V.value)&&(!Y||!Y.value)&&(!rt||!rt.value))return;y.textAlign="center",y.textBaseline="bottom"}var ot=!x,ht;x&&(ht=x,y.translate(-ht.x1,-ht.y1)),L==null?(P.drawText(y,g,null,ot,O),g.isEdge()&&(P.drawText(y,g,"source",ot,O),P.drawText(y,g,"target",ot,O))):P.drawText(y,g,L,ot,O),x&&y.translate(ht.x1,ht.y1)},vx.getFontCache=function(y){var g;this.fontCaches=this.fontCaches||[];for(var x=0;x2&&arguments[2]!==void 0?arguments[2]:!0,T=g.pstyle("font-style").strValue,L=g.pstyle("font-size").pfValue+"px",O=g.pstyle("font-family").strValue,P=g.pstyle("font-weight").strValue,$=x?g.effectiveOpacity()*g.pstyle("text-opacity").value:1,q=g.pstyle("text-outline-opacity").value*$,S=g.pstyle("color").value,V=g.pstyle("text-outline-color").value;y.font=T+" "+P+" "+L+" "+O,y.lineJoin="round",this.colorFillStyle(y,S[0],S[1],S[2],$),this.colorStrokeStyle(y,V[0],V[1],V[2],q)};function mpt(y,g,x,T,L){var O=arguments.length>5&&arguments[5]!==void 0?arguments[5]:5;y.beginPath(),y.moveTo(g+O,x),y.lineTo(g+T-O,x),y.quadraticCurveTo(g+T,x,g+T,x+O),y.lineTo(g+T,x+L-O),y.quadraticCurveTo(g+T,x+L,g+T-O,x+L),y.lineTo(g+O,x+L),y.quadraticCurveTo(g,x+L,g,x+L-O),y.lineTo(g,x+O),y.quadraticCurveTo(g,x,g+O,x),y.closePath(),y.fill()}vx.getTextAngle=function(y,g){var x,T=y._private,L=T.rscratch,O=g?g+"-":"",P=y.pstyle(O+"text-rotation"),$=yp(L,"labelAngle",g);return P.strValue==="autorotate"?x=y.isEdge()?$:0:P.strValue==="none"?x=0:x=P.pfValue,x},vx.drawText=function(y,g,x){var T=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,L=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,O=g._private,P=O.rscratch,$=L?g.effectiveOpacity():1;if(!(L&&($===0||g.pstyle("text-opacity").value===0))){x==="main"&&(x=null);var q=yp(P,"labelX",x),S=yp(P,"labelY",x),V,Y,rt=this.getLabelText(g,x);if(rt!=null&&rt!==""&&!isNaN(q)&&!isNaN(S)){this.setupTextStyle(y,g,L);var ot=x?x+"-":"",ht=yp(P,"labelWidth",x),dt=yp(P,"labelHeight",x),Lt=g.pstyle(ot+"text-margin-x").pfValue,kt=g.pstyle(ot+"text-margin-y").pfValue,Dt=g.isEdge(),Pt=g.pstyle("text-halign").value,$t=g.pstyle("text-valign").value;Dt&&(Pt="center",$t="center"),q+=Lt,S+=kt;var Zt;switch(T?Zt=this.getTextAngle(g,x):Zt=0,Zt!==0&&(V=q,Y=S,y.translate(V,Y),y.rotate(Zt),q=0,S=0),$t){case"top":break;case"center":S+=dt/2;break;case"bottom":S+=dt;break}var Yt=g.pstyle("text-background-opacity").value,qt=g.pstyle("text-border-opacity").value,ne=g.pstyle("text-border-width").pfValue,Gt=g.pstyle("text-background-padding").pfValue;if(Yt>0||ne>0&&qt>0){var ge=q-Gt;switch(Pt){case"left":ge-=ht;break;case"center":ge-=ht/2;break}var be=S-dt-Gt,ie=ht+2*Gt,Fe=dt+2*Gt;if(Yt>0){var we=y.fillStyle,bn=g.pstyle("text-background-color").value;y.fillStyle="rgba("+bn[0]+","+bn[1]+","+bn[2]+","+Yt*$+")";var ze=g.pstyle("text-background-shape").strValue;ze.indexOf("round")===0?mpt(y,ge,be,ie,Fe,2):y.fillRect(ge,be,ie,Fe),y.fillStyle=we}if(ne>0&&qt>0){var Ge=y.strokeStyle,En=y.lineWidth,In=g.pstyle("text-border-color").value,Yn=g.pstyle("text-border-style").value;if(y.strokeStyle="rgba("+In[0]+","+In[1]+","+In[2]+","+qt*$+")",y.lineWidth=ne,y.setLineDash)switch(Yn){case"dotted":y.setLineDash([1,1]);break;case"dashed":y.setLineDash([4,2]);break;case"double":y.lineWidth=ne/4,y.setLineDash([]);break;case"solid":y.setLineDash([]);break}if(y.strokeRect(ge,be,ie,Fe),Yn==="double"){var Sn=ne/2;y.strokeRect(ge+Sn,be+Sn,ie-Sn*2,Fe-Sn*2)}y.setLineDash&&y.setLineDash([]),y.lineWidth=En,y.strokeStyle=Ge}}var Wn=2*g.pstyle("text-outline-width").pfValue;if(Wn>0&&(y.lineWidth=Wn),g.pstyle("text-wrap").value==="wrap"){var rr=yp(P,"labelWrapCachedLines",x),wr=yp(P,"labelLineHeight",x),ur=ht/2,er=this.getLabelJustification(g);switch(er==="auto"||(Pt==="left"?er==="left"?q+=-ht:er==="center"&&(q+=-ur):Pt==="center"?er==="left"?q+=-ur:er==="right"&&(q+=ur):Pt==="right"&&(er==="center"?q+=ur:er==="right"&&(q+=ht))),$t){case"top":S-=(rr.length-1)*wr;break;case"center":case"bottom":S-=(rr.length-1)*wr;break}for(var vn=0;vn0&&y.strokeText(rr[vn],q,S),y.fillText(rr[vn],q,S),S+=wr}else Wn>0&&y.strokeText(rt,q,S),y.fillText(rt,q,S);Zt!==0&&(y.rotate(-Zt),y.translate(-V,-Y))}}};var Zk={};Zk.drawNode=function(y,g,x){var T=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,L=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,O=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,P=this,$,q,S=g._private,V=S.rscratch,Y=g.position();if(!(!X(Y.x)||!X(Y.y))&&!(O&&!g.visible())){var rt=O?g.effectiveOpacity():1,ot=P.usePaths(),ht,dt=!1,Lt=g.padding();$=g.width()+2*Lt,q=g.height()+2*Lt;var kt;x&&(kt=x,y.translate(-kt.x1,-kt.y1));for(var Dt=g.pstyle("background-image"),Pt=Dt.value,$t=new Array(Pt.length),Zt=new Array(Pt.length),Yt=0,qt=0;qt0&&arguments[0]!==void 0?arguments[0]:Fe;P.eleFillStyle(y,g,Si)},En=function(){var Si=arguments.length>0&&arguments[0]!==void 0?arguments[0]:ze;P.colorStrokeStyle(y,we[0],we[1],we[2],Si)},In=g.pstyle("shape").strValue,Yn=g.pstyle("shape-polygon-points").pfValue;if(ot){y.translate(Y.x,Y.y);var Sn=P.nodePathCache=P.nodePathCache||[],Wn=id(In==="polygon"?In+","+Yn.join(","):In,""+q,""+$),rr=Sn[Wn];rr!=null?(ht=rr,dt=!0,V.pathCache=ht):(ht=new Path2D,Sn[Wn]=V.pathCache=ht)}var wr=function(){if(!dt){var Si=Y;ot&&(Si={x:0,y:0}),P.nodeShapes[P.getNodeShape(g)].draw(ht||y,Si.x,Si.y,$,q)}ot?y.fill(ht):y.fill()},ur=function(){for(var Si=arguments.length>0&&arguments[0]!==void 0?arguments[0]:rt,Ui=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,Va=S.backgrounding,Qs=0,qs=0;qs0&&arguments[0]!==void 0?arguments[0]:!1,Ui=arguments.length>1&&arguments[1]!==void 0?arguments[1]:rt;P.hasPie(g)&&(P.drawPie(y,g,Ui),Si&&(ot||P.nodeShapes[P.getNodeShape(g)].draw(y,Y.x,Y.y,$,q)))},vn=function(){var Si=arguments.length>0&&arguments[0]!==void 0?arguments[0]:rt,Ui=(be>0?be:-be)*Si,Va=be>0?0:255;be!==0&&(P.colorFillStyle(y,Va,Va,Va,Ui),ot?y.fill(ht):y.fill())},gr=function(){if(ie>0){if(y.lineWidth=ie,y.lineCap="butt",y.setLineDash)switch(bn){case"dotted":y.setLineDash([1,1]);break;case"dashed":y.setLineDash([4,2]);break;case"solid":case"double":y.setLineDash([]);break}if(ot?y.stroke(ht):y.stroke(),bn==="double"){y.lineWidth=ie/3;var Si=y.globalCompositeOperation;y.globalCompositeOperation="destination-out",ot?y.stroke(ht):y.stroke(),y.globalCompositeOperation=Si}y.setLineDash&&y.setLineDash([])}},fr=function(){L&&P.drawNodeOverlay(y,g,Y,$,q)},Jr=function(){L&&P.drawNodeUnderlay(y,g,Y,$,q)},vi=function(){P.drawElementText(y,g,null,T)},Xs=g.pstyle("ghost").value==="yes";if(Xs){var Ea=g.pstyle("ghost-offset-x").pfValue,Ci=g.pstyle("ghost-offset-y").pfValue,hi=g.pstyle("ghost-opacity").value,gs=hi*rt;y.translate(Ea,Ci),Ge(hi*Fe),wr(),ur(gs,!0),En(hi*ze),gr(),er(be!==0||ie!==0),ur(gs,!1),vn(gs),y.translate(-Ea,-Ci)}ot&&y.translate(-Y.x,-Y.y),Jr(),ot&&y.translate(Y.x,Y.y),Ge(),wr(),ur(rt,!0),En(),gr(),er(be!==0||ie!==0),ur(rt,!1),vn(),ot&&y.translate(-Y.x,-Y.y),vi(),fr(),x&&y.translate(kt.x1,kt.y1)}};var Ptt=function(g){if(!["overlay","underlay"].includes(g))throw new Error("Invalid state");return function(x,T,L,O,P){var $=this;if(T.visible()){var q=T.pstyle("".concat(g,"-padding")).pfValue,S=T.pstyle("".concat(g,"-opacity")).value,V=T.pstyle("".concat(g,"-color")).value,Y=T.pstyle("".concat(g,"-shape")).value;if(S>0){if(L=L||T.position(),O==null||P==null){var rt=T.padding();O=T.width()+2*rt,P=T.height()+2*rt}$.colorFillStyle(x,V[0],V[1],V[2],S),$.nodeShapes[Y].draw(x,L.x,L.y,O+q*2,P+q*2),x.fill()}}}};Zk.drawNodeOverlay=Ptt("overlay"),Zk.drawNodeUnderlay=Ptt("underlay"),Zk.hasPie=function(y){return y=y[0],y._private.hasPie},Zk.drawPie=function(y,g,x,T){g=g[0],T=T||g.position();var L=g.cy().style(),O=g.pstyle("pie-size"),P=T.x,$=T.y,q=g.width(),S=g.height(),V=Math.min(q,S)/2,Y=0,rt=this.usePaths();rt&&(P=0,$=0),O.units==="%"?V=V*O.pfValue:O.pfValue!==void 0&&(V=O.pfValue/2);for(var ot=1;ot<=L.pieBackgroundN;ot++){var ht=g.pstyle("pie-"+ot+"-background-size").value,dt=g.pstyle("pie-"+ot+"-background-color").value,Lt=g.pstyle("pie-"+ot+"-background-opacity").value*x,kt=ht/100;kt+Y>1&&(kt=1-Y);var Dt=1.5*Math.PI+2*Math.PI*Y,Pt=2*Math.PI*kt,$t=Dt+Pt;ht===0||Y>=1||Y+kt>1||(y.beginPath(),y.moveTo(P,$),y.arc(P,$,V,Dt,$t),y.closePath(),this.colorFillStyle(y,dt[0],dt[1],dt[2],Lt),y.fill(),Y+=kt)}};var Tg={},ypt=100;Tg.getPixelRatio=function(){var y=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var g=y.backingStorePixelRatio||y.webkitBackingStorePixelRatio||y.mozBackingStorePixelRatio||y.msBackingStorePixelRatio||y.oBackingStorePixelRatio||y.backingStorePixelRatio||1;return(window.devicePixelRatio||1)/g},Tg.paintCache=function(y){for(var g=this.paintCaches=this.paintCaches||[],x=!0,T,L=0;LP.minMbLowQualFrames&&(P.motionBlurPxRatio=P.mbPxRBlurry)),P.clearingMotionBlur&&(P.motionBlurPxRatio=1),P.textureDrawLastFrame&&!Y&&(V[P.NODE]=!0,V[P.SELECT_BOX]=!0);var Dt=q.style(),Pt=q.zoom(),$t=L!==void 0?L:Pt,Zt=q.pan(),Yt={x:Zt.x,y:Zt.y},qt={zoom:Pt,pan:{x:Zt.x,y:Zt.y}},ne=P.prevViewport,Gt=ne===void 0||qt.zoom!==ne.zoom||qt.pan.x!==ne.pan.x||qt.pan.y!==ne.pan.y;!Gt&&!(dt&&!ht)&&(P.motionBlurPxRatio=1),O&&(Yt=O),$t*=$,Yt.x*=$,Yt.y*=$;var ge=P.getCachedZSortedEles();function be(Ci,hi,gs,qi,Si){var Ui=Ci.globalCompositeOperation;Ci.globalCompositeOperation="destination-out",P.colorFillStyle(Ci,255,255,255,P.motionBlurTransparency),Ci.fillRect(hi,gs,qi,Si),Ci.globalCompositeOperation=Ui}function ie(Ci,hi){var gs,qi,Si,Ui;!P.clearingMotionBlur&&(Ci===S.bufferContexts[P.MOTIONBLUR_BUFFER_NODE]||Ci===S.bufferContexts[P.MOTIONBLUR_BUFFER_DRAG])?(gs={x:Zt.x*ot,y:Zt.y*ot},qi=Pt*ot,Si=P.canvasWidth*ot,Ui=P.canvasHeight*ot):(gs=Yt,qi=$t,Si=P.canvasWidth,Ui=P.canvasHeight),Ci.setTransform(1,0,0,1,0,0),hi==="motionBlur"?be(Ci,0,0,Si,Ui):!g&&(hi===void 0||hi)&&Ci.clearRect(0,0,Si,Ui),x||(Ci.translate(gs.x,gs.y),Ci.scale(qi,qi)),O&&Ci.translate(O.x,O.y),L&&Ci.scale(L,L)}if(Y||(P.textureDrawLastFrame=!1),Y){if(P.textureDrawLastFrame=!0,!P.textureCache){P.textureCache={},P.textureCache.bb=q.mutableElements().boundingBox(),P.textureCache.texture=P.data.bufferCanvases[P.TEXTURE_BUFFER];var Fe=P.data.bufferContexts[P.TEXTURE_BUFFER];Fe.setTransform(1,0,0,1,0,0),Fe.clearRect(0,0,P.canvasWidth*P.textureMult,P.canvasHeight*P.textureMult),P.render({forcedContext:Fe,drawOnlyNodeLayer:!0,forcedPxRatio:$*P.textureMult});var qt=P.textureCache.viewport={zoom:q.zoom(),pan:q.pan(),width:P.canvasWidth,height:P.canvasHeight};qt.mpan={x:(0-qt.pan.x)/qt.zoom,y:(0-qt.pan.y)/qt.zoom}}V[P.DRAG]=!1,V[P.NODE]=!1;var we=S.contexts[P.NODE],bn=P.textureCache.texture,qt=P.textureCache.viewport;we.setTransform(1,0,0,1,0,0),rt?be(we,0,0,qt.width,qt.height):we.clearRect(0,0,qt.width,qt.height);var ze=Dt.core("outside-texture-bg-color").value,Ge=Dt.core("outside-texture-bg-opacity").value;P.colorFillStyle(we,ze[0],ze[1],ze[2],Ge),we.fillRect(0,0,qt.width,qt.height);var Pt=q.zoom();ie(we,!1),we.clearRect(qt.mpan.x,qt.mpan.y,qt.width/qt.zoom/$,qt.height/qt.zoom/$),we.drawImage(bn,qt.mpan.x,qt.mpan.y,qt.width/qt.zoom/$,qt.height/qt.zoom/$)}else P.textureOnViewport&&!g&&(P.textureCache=null);var En=q.extent(),In=P.pinching||P.hoverData.dragging||P.swipePanning||P.data.wheelZooming||P.hoverData.draggingEles||P.cy.animated(),Yn=P.hideEdgesOnViewport&&In,Sn=[];if(Sn[P.NODE]=!V[P.NODE]&&rt&&!P.clearedForMotionBlur[P.NODE]||P.clearingMotionBlur,Sn[P.NODE]&&(P.clearedForMotionBlur[P.NODE]=!0),Sn[P.DRAG]=!V[P.DRAG]&&rt&&!P.clearedForMotionBlur[P.DRAG]||P.clearingMotionBlur,Sn[P.DRAG]&&(P.clearedForMotionBlur[P.DRAG]=!0),V[P.NODE]||x||T||Sn[P.NODE]){var Wn=rt&&!Sn[P.NODE]&&ot!==1,we=g||(Wn?P.data.bufferContexts[P.MOTIONBLUR_BUFFER_NODE]:S.contexts[P.NODE]),rr=rt&&!Wn?"motionBlur":void 0;ie(we,rr),Yn?P.drawCachedNodes(we,ge.nondrag,$,En):P.drawLayeredElements(we,ge.nondrag,$,En),P.debug&&P.drawDebugPoints(we,ge.nondrag),!x&&!rt&&(V[P.NODE]=!1)}if(!T&&(V[P.DRAG]||x||Sn[P.DRAG])){var Wn=rt&&!Sn[P.DRAG]&&ot!==1,we=g||(Wn?P.data.bufferContexts[P.MOTIONBLUR_BUFFER_DRAG]:S.contexts[P.DRAG]);ie(we,rt&&!Wn?"motionBlur":void 0),Yn?P.drawCachedNodes(we,ge.drag,$,En):P.drawCachedElements(we,ge.drag,$,En),P.debug&&P.drawDebugPoints(we,ge.drag),!x&&!rt&&(V[P.DRAG]=!1)}if(P.showFps||!T&&V[P.SELECT_BOX]&&!x){var we=g||S.contexts[P.SELECT_BOX];if(ie(we),P.selection[4]==1&&(P.hoverData.selecting||P.touchData.selecting)){var Pt=P.cy.zoom(),wr=Dt.core("selection-box-border-width").value/Pt;we.lineWidth=wr,we.fillStyle="rgba("+Dt.core("selection-box-color").value[0]+","+Dt.core("selection-box-color").value[1]+","+Dt.core("selection-box-color").value[2]+","+Dt.core("selection-box-opacity").value+")",we.fillRect(P.selection[0],P.selection[1],P.selection[2]-P.selection[0],P.selection[3]-P.selection[1]),wr>0&&(we.strokeStyle="rgba("+Dt.core("selection-box-border-color").value[0]+","+Dt.core("selection-box-border-color").value[1]+","+Dt.core("selection-box-border-color").value[2]+","+Dt.core("selection-box-opacity").value+")",we.strokeRect(P.selection[0],P.selection[1],P.selection[2]-P.selection[0],P.selection[3]-P.selection[1]))}if(S.bgActivePosistion&&!P.hoverData.selecting){var Pt=P.cy.zoom(),ur=S.bgActivePosistion;we.fillStyle="rgba("+Dt.core("active-bg-color").value[0]+","+Dt.core("active-bg-color").value[1]+","+Dt.core("active-bg-color").value[2]+","+Dt.core("active-bg-opacity").value+")",we.beginPath(),we.arc(ur.x,ur.y,Dt.core("active-bg-size").pfValue/Pt,0,2*Math.PI),we.fill()}var er=P.lastRedrawTime;if(P.showFps&&er){er=Math.round(er);var vn=Math.round(1e3/er);we.setTransform(1,0,0,1,0,0),we.fillStyle="rgba(255, 0, 0, 0.75)",we.strokeStyle="rgba(255, 0, 0, 0.75)",we.lineWidth=1,we.fillText("1 frame = "+er+" ms = "+vn+" fps",0,20);var gr=60;we.strokeRect(0,30,250,20),we.fillRect(0,30,250*Math.min(vn/gr,1),20)}x||(V[P.SELECT_BOX]=!1)}if(rt&&ot!==1){var fr=S.contexts[P.NODE],Jr=P.data.bufferCanvases[P.MOTIONBLUR_BUFFER_NODE],vi=S.contexts[P.DRAG],Xs=P.data.bufferCanvases[P.MOTIONBLUR_BUFFER_DRAG],Ea=function(hi,gs,qi){hi.setTransform(1,0,0,1,0,0),qi||!kt?hi.clearRect(0,0,P.canvasWidth,P.canvasHeight):be(hi,0,0,P.canvasWidth,P.canvasHeight);var Si=ot;hi.drawImage(gs,0,0,P.canvasWidth*Si,P.canvasHeight*Si,0,0,P.canvasWidth,P.canvasHeight)};(V[P.NODE]||Sn[P.NODE])&&(Ea(fr,Jr,Sn[P.NODE]),V[P.NODE]=!1),(V[P.DRAG]||Sn[P.DRAG])&&(Ea(vi,Xs,Sn[P.DRAG]),V[P.DRAG]=!1)}P.prevViewport=qt,P.clearingMotionBlur&&(P.clearingMotionBlur=!1,P.motionBlurCleared=!0,P.motionBlur=!0),rt&&(P.motionBlurTimeout=setTimeout(function(){P.motionBlurTimeout=null,P.clearedForMotionBlur[P.NODE]=!1,P.clearedForMotionBlur[P.DRAG]=!1,P.motionBlur=!1,P.clearingMotionBlur=!Y,P.mbFrames=0,V[P.NODE]=!0,V[P.DRAG]=!0,P.redraw()},ypt)),g||q.emit("render")};var O3={};O3.drawPolygonPath=function(y,g,x,T,L,O){var P=T/2,$=L/2;y.beginPath&&y.beginPath(),y.moveTo(g+P*O[0],x+$*O[1]);for(var q=1;q0&&P>0){ot.clearRect(0,0,O,P),ot.globalCompositeOperation="source-over";var ht=this.getCachedZSortedEles();if(y.full)ot.translate(-T.x1*S,-T.y1*S),ot.scale(S,S),this.drawElements(ot,ht),ot.scale(1/S,1/S),ot.translate(T.x1*S,T.y1*S);else{var dt=g.pan(),Lt={x:dt.x*S,y:dt.y*S};S*=g.zoom(),ot.translate(Lt.x,Lt.y),ot.scale(S,S),this.drawElements(ot,ht),ot.scale(1/S,1/S),ot.translate(-Lt.x,-Lt.y)}y.bg&&(ot.globalCompositeOperation="destination-over",ot.fillStyle=y.bg,ot.rect(0,0,O,P),ot.fill())}return rt};function xpt(y,g){for(var x=atob(y),T=new ArrayBuffer(x.length),L=new Uint8Array(T),O=0;O"u"?"undefined":f(OffscreenCanvas))!=="undefined"?x=new OffscreenCanvas(y,g):(x=document.createElement("canvas"),x.width=y,x.height=g),x},[D0,ww,vw,CC,vx,Zk,Tg,O3,_C,$tt].forEach(function(y){de(vc,y)});var mx=[{name:"null",impl:WB},{name:"base",impl:nM},{name:"canvas",impl:kpt}],Cg=[{type:"layout",extensions:ltt},{type:"renderer",extensions:mx}],Sm={},cM={};function v1(y,g,x){var T=x,L=function(ne){Sc("Can not register `"+g+"` for `"+y+"` since `"+ne+"` already exists in the prototype and can not be overridden")};if(y==="core"){if(Vk.prototype[g])return L(g);Vk.prototype[g]=x}else if(y==="collection"){if($f.prototype[g])return L(g);$f.prototype[g]=x}else if(y==="layout"){for(var O=function(ne){this.options=ne,x.call(this,ne),ut(this._private)||(this._private={}),this._private.cy=ne.cy,this._private.listeners=[],this.createEmitter()},P=O.prototype=Object.create(x.prototype),$=[],q=0;q<$.length;q++){var S=$[q];P[S]=P[S]||function(){return this}}P.start&&!P.run?P.run=function(){return this.start(),this}:!P.start&&P.run&&(P.start=function(){return this.run(),this});var V=x.prototype.stop;P.stop=function(){var qt=this.options;if(qt&&qt.animate){var ne=this.animations;if(ne)for(var Gt=0;Gtz&&(this.rect.x-=(this.labelWidth-z)/2,this.setWidth(this.labelWidth)),this.labelHeight>W&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-W)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-W),this.setHeight(this.labelHeight))}}},B.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==b.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},B.prototype.transform=function(R){var z=this.rect.x;z>_.WORLD_BOUNDARY?z=_.WORLD_BOUNDARY:z<-_.WORLD_BOUNDARY&&(z=-_.WORLD_BOUNDARY);var W=this.rect.y;W>_.WORLD_BOUNDARY?W=_.WORLD_BOUNDARY:W<-_.WORLD_BOUNDARY&&(W=-_.WORLD_BOUNDARY);var et=new I(z,W),st=R.inverseTransformPoint(et);this.setLocation(st.x,st.y)},B.prototype.getLeft=function(){return this.rect.x},B.prototype.getRight=function(){return this.rect.x+this.rect.width},B.prototype.getTop=function(){return this.rect.y},B.prototype.getBottom=function(){return this.rect.y+this.rect.height},B.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},f.exports=B},function(f,p,w){function m(b,E){b==null&&E==null?(this.x=0,this.y=0):(this.x=b,this.y=E)}m.prototype.getX=function(){return this.x},m.prototype.getY=function(){return this.y},m.prototype.setX=function(b){this.x=b},m.prototype.setY=function(b){this.y=b},m.prototype.getDifference=function(b){return new DimensionD(this.x-b.x,this.y-b.y)},m.prototype.getCopy=function(){return new m(this.x,this.y)},m.prototype.translate=function(b){return this.x+=b.width,this.y+=b.height,this},f.exports=m},function(f,p,w){var m=w(2),b=w(10),E=w(0),_=w(6),A=w(3),I=w(1),B=w(13),N=w(12),R=w(11);function z(et,st,at){m.call(this,at),this.estimatedSize=b.MIN_VALUE,this.margin=E.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=et,st!=null&&st instanceof _?this.graphManager=st:st!=null&&st instanceof Layout&&(this.graphManager=st.graphManager)}z.prototype=Object.create(m.prototype);for(var W in m)z[W]=m[W];z.prototype.getNodes=function(){return this.nodes},z.prototype.getEdges=function(){return this.edges},z.prototype.getGraphManager=function(){return this.graphManager},z.prototype.getParent=function(){return this.parent},z.prototype.getLeft=function(){return this.left},z.prototype.getRight=function(){return this.right},z.prototype.getTop=function(){return this.top},z.prototype.getBottom=function(){return this.bottom},z.prototype.isConnected=function(){return this.isConnected},z.prototype.add=function(et,st,at){if(st==null&&at==null){var bt=et;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(bt)>-1)throw"Node already in graph!";return bt.owner=this,this.getNodes().push(bt),bt}else{var mt=et;if(!(this.getNodes().indexOf(st)>-1&&this.getNodes().indexOf(at)>-1))throw"Source or target not in graph!";if(!(st.owner==at.owner&&st.owner==this))throw"Both owners must be this graph!";return st.owner!=at.owner?null:(mt.source=st,mt.target=at,mt.isInterGraph=!1,this.getEdges().push(mt),st.edges.push(mt),at!=st&&at.edges.push(mt),mt)}},z.prototype.remove=function(et){var st=et;if(et instanceof A){if(st==null)throw"Node is null!";if(!(st.owner!=null&&st.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var at=st.edges.slice(),bt,mt=at.length,yt=0;yt-1&&vt>-1))throw"Source and/or target doesn't know this edge!";bt.source.edges.splice(ut,1),bt.target!=bt.source&&bt.target.edges.splice(vt,1);var ft=bt.source.owner.getEdges().indexOf(bt);if(ft==-1)throw"Not in owner's edge list!";bt.source.owner.getEdges().splice(ft,1)}},z.prototype.updateLeftTop=function(){for(var et=b.MAX_VALUE,st=b.MAX_VALUE,at,bt,mt,yt=this.getNodes(),ft=yt.length,ut=0;utat&&(et=at),st>bt&&(st=bt)}return et==b.MAX_VALUE?null:(yt[0].getParent().paddingLeft!=null?mt=yt[0].getParent().paddingLeft:mt=this.margin,this.left=st-mt,this.top=et-mt,new N(this.left,this.top))},z.prototype.updateBounds=function(et){for(var st=b.MAX_VALUE,at=-b.MAX_VALUE,bt=b.MAX_VALUE,mt=-b.MAX_VALUE,yt,ft,ut,vt,X,pt=this.nodes,U=pt.length,Tt=0;Ttyt&&(st=yt),atut&&(bt=ut),mtyt&&(st=yt),atut&&(bt=ut),mt=this.nodes.length){var U=0;at.forEach(function(Tt){Tt.owner==et&&U++}),U==this.nodes.length&&(this.isConnected=!0)}},f.exports=z},function(f,p,w){var m,b=w(1);function E(_){m=w(5),this.layout=_,this.graphs=[],this.edges=[]}E.prototype.addRoot=function(){var _=this.layout.newGraph(),A=this.layout.newNode(null),I=this.add(_,A);return this.setRootGraph(I),this.rootGraph},E.prototype.add=function(_,A,I,B,N){if(I==null&&B==null&&N==null){if(_==null)throw"Graph is null!";if(A==null)throw"Parent node is null!";if(this.graphs.indexOf(_)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(_),_.parent!=null)throw"Already has a parent!";if(A.child!=null)throw"Already has a child!";return _.parent=A,A.child=_,_}else{N=I,B=A,I=_;var R=B.getOwner(),z=N.getOwner();if(!(R!=null&&R.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(z!=null&&z.getGraphManager()==this))throw"Target not in this graph mgr!";if(R==z)return I.isInterGraph=!1,R.add(I,B,N);if(I.isInterGraph=!0,I.source=B,I.target=N,this.edges.indexOf(I)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(I),!(I.source!=null&&I.target!=null))throw"Edge source and/or target is null!";if(!(I.source.edges.indexOf(I)==-1&&I.target.edges.indexOf(I)==-1))throw"Edge already in source and/or target incidency list!";return I.source.edges.push(I),I.target.edges.push(I),I}},E.prototype.remove=function(_){if(_ instanceof m){var A=_;if(A.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(A==this.rootGraph||A.parent!=null&&A.parent.graphManager==this))throw"Invalid parent node!";var I=[];I=I.concat(A.getEdges());for(var B,N=I.length,R=0;R=_.getRight()?A[0]+=Math.min(_.getX()-E.getX(),E.getRight()-_.getRight()):_.getX()<=E.getX()&&_.getRight()>=E.getRight()&&(A[0]+=Math.min(E.getX()-_.getX(),_.getRight()-E.getRight())),E.getY()<=_.getY()&&E.getBottom()>=_.getBottom()?A[1]+=Math.min(_.getY()-E.getY(),E.getBottom()-_.getBottom()):_.getY()<=E.getY()&&_.getBottom()>=E.getBottom()&&(A[1]+=Math.min(E.getY()-_.getY(),_.getBottom()-E.getBottom()));var N=Math.abs((_.getCenterY()-E.getCenterY())/(_.getCenterX()-E.getCenterX()));_.getCenterY()===E.getCenterY()&&_.getCenterX()===E.getCenterX()&&(N=1);var R=N*A[0],z=A[1]/N;A[0]R)return A[0]=I,A[1]=W,A[2]=N,A[3]=pt,!1;if(BN)return A[0]=z,A[1]=B,A[2]=vt,A[3]=R,!1;if(IN?(A[0]=st,A[1]=at,It=!0):(A[0]=et,A[1]=W,It=!0):Bt===Z&&(I>N?(A[0]=z,A[1]=W,It=!0):(A[0]=bt,A[1]=at,It=!0)),-Et===Z?N>I?(A[2]=X,A[3]=pt,Ot=!0):(A[2]=vt,A[3]=ut,Ot=!0):Et===Z&&(N>I?(A[2]=ft,A[3]=ut,Ot=!0):(A[2]=U,A[3]=pt,Ot=!0)),It&&Ot)return!1;if(I>N?B>R?(Ct=this.getCardinalDirection(Bt,Z,4),xt=this.getCardinalDirection(Et,Z,2)):(Ct=this.getCardinalDirection(-Bt,Z,3),xt=this.getCardinalDirection(-Et,Z,1)):B>R?(Ct=this.getCardinalDirection(-Bt,Z,1),xt=this.getCardinalDirection(-Et,Z,3)):(Ct=this.getCardinalDirection(Bt,Z,2),xt=this.getCardinalDirection(Et,Z,4)),!It)switch(Ct){case 1:Le=W,Ht=I+-yt/Z,A[0]=Ht,A[1]=Le;break;case 2:Ht=bt,Le=B+mt*Z,A[0]=Ht,A[1]=Le;break;case 3:Le=at,Ht=I+yt/Z,A[0]=Ht,A[1]=Le;break;case 4:Ht=st,Le=B+-mt*Z,A[0]=Ht,A[1]=Le;break}if(!Ot)switch(xt){case 1:gn=ut,Ft=N+-nt/Z,A[2]=Ft,A[3]=gn;break;case 2:Ft=U,gn=R+Tt*Z,A[2]=Ft,A[3]=gn;break;case 3:gn=pt,Ft=N+nt/Z,A[2]=Ft,A[3]=gn;break;case 4:Ft=X,gn=R+-Tt*Z,A[2]=Ft,A[3]=gn;break}}return!1},b.getCardinalDirection=function(E,_,A){return E>_?A:1+A%4},b.getIntersection=function(E,_,A,I){if(I==null)return this.getIntersection2(E,_,A);var B=E.x,N=E.y,R=_.x,z=_.y,W=A.x,et=A.y,st=I.x,at=I.y,bt=void 0,mt=void 0,yt=void 0,ft=void 0,ut=void 0,vt=void 0,X=void 0,pt=void 0,U=void 0;return yt=z-N,ut=B-R,X=R*N-B*z,ft=at-et,vt=W-st,pt=st*et-W*at,U=yt*vt-ft*ut,U===0?null:(bt=(ut*pt-vt*X)/U,mt=(ft*X-yt*pt)/U,new m(bt,mt))},b.angleOfVector=function(E,_,A,I){var B=void 0;return E!==A?(B=Math.atan((I-_)/(A-E)),A0?1:b<0?-1:0},m.floor=function(b){return b<0?Math.ceil(b):Math.floor(b)},m.ceil=function(b){return b<0?Math.floor(b):Math.ceil(b)},f.exports=m},function(f,p,w){function m(){}m.MAX_VALUE=2147483647,m.MIN_VALUE=-2147483648,f.exports=m},function(f,p,w){var m=function(){function B(N,R){for(var z=0;z"u"?"undefined":m(E);return E==null||_!="object"&&_!="function"},f.exports=b},function(f,p,w){function m(W){if(Array.isArray(W)){for(var et=0,st=Array(W.length);et0&&et;){for(yt.push(ut[0]);yt.length>0&&et;){var vt=yt[0];yt.splice(0,1),mt.add(vt);for(var X=vt.getEdges(),bt=0;bt-1&&ut.splice(nt,1)}mt=new Set,ft=new Map}}return W},z.prototype.createDummyNodesForBendpoints=function(W){for(var et=[],st=W.source,at=this.graphManager.calcLowestCommonAncestor(W.source,W.target),bt=0;bt0){for(var at=this.edgeToDummyNodes.get(st),bt=0;bt=0&&et.splice(pt,1);var U=ft.getNeighborsList();U.forEach(function(It){if(st.indexOf(It)<0){var Ot=at.get(It),Bt=Ot-1;Bt==1&&vt.push(It),at.set(It,Bt)}})}st=st.concat(vt),(et.length==1||et.length==2)&&(bt=!0,mt=et[0])}return mt},z.prototype.setGraphManager=function(W){this.graphManager=W},f.exports=z},function(f,p,w){function m(){}m.seed=1,m.x=0,m.nextDouble=function(){return m.x=Math.sin(m.seed++)*1e4,m.x-Math.floor(m.x)},f.exports=m},function(f,p,w){var m=w(4);function b(E,_){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}b.prototype.getWorldOrgX=function(){return this.lworldOrgX},b.prototype.setWorldOrgX=function(E){this.lworldOrgX=E},b.prototype.getWorldOrgY=function(){return this.lworldOrgY},b.prototype.setWorldOrgY=function(E){this.lworldOrgY=E},b.prototype.getWorldExtX=function(){return this.lworldExtX},b.prototype.setWorldExtX=function(E){this.lworldExtX=E},b.prototype.getWorldExtY=function(){return this.lworldExtY},b.prototype.setWorldExtY=function(E){this.lworldExtY=E},b.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},b.prototype.setDeviceOrgX=function(E){this.ldeviceOrgX=E},b.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},b.prototype.setDeviceOrgY=function(E){this.ldeviceOrgY=E},b.prototype.getDeviceExtX=function(){return this.ldeviceExtX},b.prototype.setDeviceExtX=function(E){this.ldeviceExtX=E},b.prototype.getDeviceExtY=function(){return this.ldeviceExtY},b.prototype.setDeviceExtY=function(E){this.ldeviceExtY=E},b.prototype.transformX=function(E){var _=0,A=this.lworldExtX;return A!=0&&(_=this.ldeviceOrgX+(E-this.lworldOrgX)*this.ldeviceExtX/A),_},b.prototype.transformY=function(E){var _=0,A=this.lworldExtY;return A!=0&&(_=this.ldeviceOrgY+(E-this.lworldOrgY)*this.ldeviceExtY/A),_},b.prototype.inverseTransformX=function(E){var _=0,A=this.ldeviceExtX;return A!=0&&(_=this.lworldOrgX+(E-this.ldeviceOrgX)*this.lworldExtX/A),_},b.prototype.inverseTransformY=function(E){var _=0,A=this.ldeviceExtY;return A!=0&&(_=this.lworldOrgY+(E-this.ldeviceOrgY)*this.lworldExtY/A),_},b.prototype.inverseTransformPoint=function(E){var _=new m(this.inverseTransformX(E.x),this.inverseTransformY(E.y));return _},f.exports=b},function(f,p,w){function m(R){if(Array.isArray(R)){for(var z=0,W=Array(R.length);zE.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*E.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(R-E.ADAPTATION_LOWER_NODE_LIMIT)/(E.ADAPTATION_UPPER_NODE_LIMIT-E.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-E.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=E.MAX_NODE_DISPLACEMENT_INCREMENTAL):(R>E.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(E.COOLING_ADAPTATION_FACTOR,1-(R-E.ADAPTATION_LOWER_NODE_LIMIT)/(E.ADAPTATION_UPPER_NODE_LIMIT-E.ADAPTATION_LOWER_NODE_LIMIT)*(1-E.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=E.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},B.prototype.calcSpringForces=function(){for(var R=this.getAllEdges(),z,W=0;W0&&arguments[0]!==void 0?arguments[0]:!0,z=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,W,et,st,at,bt=this.getAllNodes(),mt;if(this.useFRGridVariant)for(this.totalIterations%E.GRID_CALCULATION_CHECK_PERIOD==1&&R&&this.updateGrid(),mt=new Set,W=0;Wyt||mt>yt)&&(R.gravitationForceX=-this.gravityConstant*st,R.gravitationForceY=-this.gravityConstant*at)):(yt=z.getEstimatedSize()*this.compoundGravityRangeFactor,(bt>yt||mt>yt)&&(R.gravitationForceX=-this.gravityConstant*st*this.compoundGravityConstant,R.gravitationForceY=-this.gravityConstant*at*this.compoundGravityConstant))},B.prototype.isConverged=function(){var R,z=!1;return this.totalIterations>this.maxIterations/3&&(z=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),R=this.totalDisplacement=bt.length||yt>=bt[0].length)){for(var ft=0;ftB}}]),A}();f.exports=_},function(f,p,w){var m=function(){function _(A,I){for(var B=0;B2&&arguments[2]!==void 0?arguments[2]:1,N=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,R=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;b(this,_),this.sequence1=A,this.sequence2=I,this.match_score=B,this.mismatch_penalty=N,this.gap_penalty=R,this.iMax=A.length+1,this.jMax=I.length+1,this.grid=new Array(this.iMax);for(var z=0;z=0;A--){var I=this.listeners[A];I.event===E&&I.callback===_&&this.listeners.splice(A,1)}},b.emit=function(E,_){for(var A=0;AI.coolingFactor*I.maxNodeDisplacement&&(this.displacementX=I.coolingFactor*I.maxNodeDisplacement*E.sign(this.displacementX)),Math.abs(this.displacementY)>I.coolingFactor*I.maxNodeDisplacement&&(this.displacementY=I.coolingFactor*I.maxNodeDisplacement*E.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),I.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},_.prototype.propogateDisplacementToChildren=function(I,B){for(var N=this.getChild().getNodes(),R,z=0;z0)this.positionNodesRadially(ut);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var vt=new Set(this.getAllNodes()),X=this.nodesWithGravity.filter(function(pt){return vt.has(pt)});this.graphManager.setAllNodesToApplyGravitation(X),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},yt.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%N.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var ut=new Set(this.getAllNodes()),vt=this.nodesWithGravity.filter(function(U){return ut.has(U)});this.graphManager.setAllNodesToApplyGravitation(vt),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=N.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=N.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var X=!this.isTreeGrowing&&!this.isGrowthFinished,pt=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(X,pt),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},yt.prototype.getPositionsData=function(){for(var ut=this.graphManager.getAllNodes(),vt={},X=0;X1){var It;for(It=0;Itpt&&(pt=Math.floor(nt.y)),Tt=Math.floor(nt.x+B.DEFAULT_COMPONENT_SEPERATION)}this.transform(new W(R.WORLD_CENTER_X-nt.x/2,R.WORLD_CENTER_Y-nt.y/2))},yt.radialLayout=function(ut,vt,X){var pt=Math.max(this.maxDiagonalInTree(ut),B.DEFAULT_RADIAL_SEPARATION);yt.branchRadialLayout(vt,null,0,359,0,pt);var U=bt.calculateBounds(ut),Tt=new mt;Tt.setDeviceOrgX(U.getMinX()),Tt.setDeviceOrgY(U.getMinY()),Tt.setWorldOrgX(X.x),Tt.setWorldOrgY(X.y);for(var nt=0;nt1;){var gn=Ft[0];Ft.splice(0,1);var Se=Z.indexOf(gn);Se>=0&&Z.splice(Se,1),Ht--,Ct--}vt!=null?Le=(Z.indexOf(Ft[0])+1)%Ht:Le=0;for(var me=Math.abs(pt-X)/Ct,Ve=Le;xt!=Ct;Ve=++Ve%Ht){var Ye=Z[Ve].getOtherEnd(ut);if(Ye!=vt){var ce=(X+xt*me)%360,ke=(ce+me)%360;yt.branchRadialLayout(Ye,ut,ce,ke,U+Tt,Tt),xt++}}},yt.maxDiagonalInTree=function(ut){for(var vt=st.MIN_VALUE,X=0;Xvt&&(vt=U)}return vt},yt.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},yt.prototype.groupZeroDegreeMembers=function(){var ut=this,vt={};this.memberGroups={},this.idToDummyNode={};for(var X=[],pt=this.graphManager.getAllNodes(),U=0;U"u"&&(vt[It]=[]),vt[It]=vt[It].concat(Tt)}Object.keys(vt).forEach(function(Ot){if(vt[Ot].length>1){var Bt="DummyCompound_"+Ot;ut.memberGroups[Bt]=vt[Ot];var Et=vt[Ot][0].getParent(),Z=new A(ut.graphManager);Z.id=Bt,Z.paddingLeft=Et.paddingLeft||0,Z.paddingRight=Et.paddingRight||0,Z.paddingBottom=Et.paddingBottom||0,Z.paddingTop=Et.paddingTop||0,ut.idToDummyNode[Bt]=Z;var Ct=ut.getGraphManager().add(ut.newGraph(),Z),xt=Et.getChild();xt.add(Z);for(var Ht=0;Ht=0;ut--){var vt=this.compoundOrder[ut],X=vt.id,pt=vt.paddingLeft,U=vt.paddingTop;this.adjustLocations(this.tiledMemberPack[X],vt.rect.x,vt.rect.y,pt,U)}},yt.prototype.repopulateZeroDegreeMembers=function(){var ut=this,vt=this.tiledZeroDegreePack;Object.keys(vt).forEach(function(X){var pt=ut.idToDummyNode[X],U=pt.paddingLeft,Tt=pt.paddingTop;ut.adjustLocations(vt[X],pt.rect.x,pt.rect.y,U,Tt)})},yt.prototype.getToBeTiled=function(ut){var vt=ut.id;if(this.toBeTiled[vt]!=null)return this.toBeTiled[vt];var X=ut.getChild();if(X==null)return this.toBeTiled[vt]=!1,!1;for(var pt=X.getNodes(),U=0;U0)return this.toBeTiled[vt]=!1,!1;if(Tt.getChild()==null){this.toBeTiled[Tt.id]=!1;continue}if(!this.getToBeTiled(Tt))return this.toBeTiled[vt]=!1,!1}return this.toBeTiled[vt]=!0,!0},yt.prototype.getNodeDegree=function(ut){ut.id;for(var vt=ut.getEdges(),X=0,pt=0;ptOt&&(Ot=Et.rect.height)}X+=Ot+ut.verticalPadding}},yt.prototype.tileCompoundMembers=function(ut,vt){var X=this;this.tiledMemberPack=[],Object.keys(ut).forEach(function(pt){var U=vt[pt];X.tiledMemberPack[pt]=X.tileNodes(ut[pt],U.paddingLeft+U.paddingRight),U.rect.width=X.tiledMemberPack[pt].width,U.rect.height=X.tiledMemberPack[pt].height})},yt.prototype.tileNodes=function(ut,vt){var X=B.TILING_PADDING_VERTICAL,pt=B.TILING_PADDING_HORIZONTAL,U={rows:[],rowWidth:[],rowHeight:[],width:0,height:vt,verticalPadding:X,horizontalPadding:pt};ut.sort(function(It,Ot){return It.rect.width*It.rect.height>Ot.rect.width*Ot.rect.height?-1:It.rect.width*It.rect.height0&&(nt+=ut.horizontalPadding),ut.rowWidth[X]=nt,ut.width0&&(It+=ut.verticalPadding);var Ot=0;It>ut.rowHeight[X]&&(Ot=ut.rowHeight[X],ut.rowHeight[X]=It,Ot=ut.rowHeight[X]-Ot),ut.height+=Ot,ut.rows[X].push(vt)},yt.prototype.getShortestRowIndex=function(ut){for(var vt=-1,X=Number.MAX_VALUE,pt=0;ptX&&(vt=pt,X=ut.rowWidth[pt]);return vt},yt.prototype.canAddHorizontal=function(ut,vt,X){var pt=this.getShortestRowIndex(ut);if(pt<0)return!0;var U=ut.rowWidth[pt];if(U+ut.horizontalPadding+vt<=ut.width)return!0;var Tt=0;ut.rowHeight[pt]0&&(Tt=X+ut.verticalPadding-ut.rowHeight[pt]);var nt;ut.width-U>=vt+ut.horizontalPadding?nt=(ut.height+Tt)/(U+vt+ut.horizontalPadding):nt=(ut.height+Tt)/ut.width,Tt=X+ut.verticalPadding;var It;return ut.widthTt&&vt!=X){pt.splice(-1,1),ut.rows[X].push(U),ut.rowWidth[vt]=ut.rowWidth[vt]-Tt,ut.rowWidth[X]=ut.rowWidth[X]+Tt,ut.width=ut.rowWidth[instance.getLongestRowIndex(ut)];for(var nt=Number.MIN_VALUE,It=0;Itnt&&(nt=pt[It].height);vt>0&&(nt+=ut.verticalPadding);var Ot=ut.rowHeight[vt]+ut.rowHeight[X];ut.rowHeight[vt]=nt,ut.rowHeight[X]0)for(var xt=U;xt<=Tt;xt++)Ct[0]+=this.grid[xt][nt-1].length+this.grid[xt][nt].length-1;if(Tt0)for(var xt=nt;xt<=It;xt++)Ct[3]+=this.grid[U-1][xt].length+this.grid[U][xt].length-1;for(var Ht=st.MAX_VALUE,Le,Ft,gn=0;gn0){var It;It=mt.getGraphManager().add(mt.newGraph(),X),this.processChildrenList(It,vt,mt)}}},W.prototype.stop=function(){return this.stopped=!0,this};var st=function(bt){bt("layout","cose-bilkent",W)};typeof cytoscape<"u"&&st(cytoscape),p.exports=st}])})})(h$t);var uYe=h$t.exports;const lYe=G7(uYe);l$t.use(lYe);function g$t(i,a,f,p){c$t.drawNode(i,a,f,p),a.children&&a.children.forEach((w,m)=>{g$t(i,w,f<0?m:f,p)})}function hYe(i,a){a.edges().map((f,p)=>{const w=f.data();if(f[0]._private.bodyBounds){const m=f[0]._private.rscratch;Ut.trace("Edge: ",p,w),i.insert("path").attr("d",`M ${m.startX},${m.startY} L ${m.midX},${m.midY} L${m.endX},${m.endY} `).attr("class","edge section-edge-"+w.section+" edge-depth-"+w.depth)}})}function p$t(i,a,f,p){a.add({group:"nodes",data:{id:i.id,labelText:i.descr,height:i.height,width:i.width,level:p,nodeId:i.id,padding:i.padding,type:i.type},position:{x:i.x,y:i.y}}),i.children&&i.children.forEach(w=>{p$t(w,a,f,p+1),a.add({group:"edges",data:{id:`${i.id}_${w.id}`,source:i.id,target:w.id,depth:p,section:w.section}})})}function fYe(i,a){return new Promise(f=>{const p=yr("body").append("div").attr("id","cy").attr("style","display:none"),w=l$t({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});p.remove(),p$t(i,w,a,0),w.nodes().forEach(function(m){m.layoutDimensions=()=>{const b=m.data();return{w:b.width,h:b.height}}}),w.layout({name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1}).run(),w.ready(m=>{Ut.info("Ready",m),f(w)})})}function dYe(i){i.nodes().map((a,f)=>{const p=a.data();p.x=a.position().x,p.y=a.position().y,c$t.positionNode(p);const w=Jgt(p.nodeId);Ut.info("Id:",f,"Position: (",a.position().x,", ",a.position().y,")",p),w.attr("transform",`translate(${a.position().x-p.width/2}, ${a.position().y-p.height/2})`),w.attr("attr",`apa-${f})`)})}const gYe={draw:async(i,a,f,p)=>{const w=Oe();w.htmlLabels=!1,Ut.debug(`Rendering mindmap diagram +`+i,p.parser);const m=Oe().securityLevel;let b;m==="sandbox"&&(b=yr("#i"+a));const _=yr(m==="sandbox"?b.nodes()[0].contentDocument.body:"body").select("#"+a);_.append("g");const A=p.db.getMindmap(),I=_.append("g");I.attr("class","mindmap-edges");const B=_.append("g");B.attr("class","mindmap-nodes"),g$t(B,A,-1,w);const N=await fYe(A,w);hYe(I,N),dYe(N),fT(void 0,_,w.mindmap.padding,w.mindmap.useMaxWidth)}},pYe=i=>{let a="";for(let f=0;f` + .edge { + stroke-width: 3; + } + ${pYe(i)} + .section-root rect, .section-root path, .section-root circle, .section-root polygon { + fill: ${i.git0}; + } + .section-root text { + fill: ${i.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .mindmap-node-label { + dy: 1em; + alignment-baseline: middle; + text-anchor: middle; + dominant-baseline: middle; + text-align: center; + } +`}},Symbol.toStringTag,{value:"Module"}));var npt=function(){var i=function(E,_,A,I){for(A=A||{},I=E.length;I--;A[E[I]]=_);return A},a=[1,9],f=[1,10],p=[1,5,10,12],w={trace:function(){},yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:function(_,A,I,B,N,R,z){var W=R.length-1;switch(N){case 7:const et=B.findOrCreateNode(R[W-4].trim().replaceAll('""','"')),st=B.findOrCreateNode(R[W-2].trim().replaceAll('""','"')),at=parseFloat(R[W].trim());B.addLink(et,st,at);break;case 8:case 9:case 11:this.$=R[W];break;case 10:this.$=R[W-1];break}},table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:a,20:f},{1:[2,6],7:11,10:[1,12]},i(f,[2,4],{9:13,5:[1,14]}),{12:[1,15]},i(p,[2,8]),i(p,[2,9]),{19:[1,16]},i(p,[2,11]),{1:[2,1]},{1:[2,5]},i(f,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:a,20:f},{15:18,16:7,17:8,18:a,20:f},{18:[1,19]},i(f,[2,3]),{12:[1,20]},i(p,[2,10]),{15:21,16:7,17:8,18:a,20:f},i([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:function(_,A){if(A.recoverable)this.trace(_);else{var I=new Error(_);throw I.hash=A,I}},parse:function(_){var A=this,I=[0],B=[],N=[null],R=[],z=this.table,W="",et=0,st=0,at=2,bt=1,mt=R.slice.call(arguments,1),yt=Object.create(this.lexer),ft={yy:{}};for(var ut in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ut)&&(ft.yy[ut]=this.yy[ut]);yt.setInput(_,ft.yy),ft.yy.lexer=yt,ft.yy.parser=this,typeof yt.yylloc>"u"&&(yt.yylloc={});var vt=yt.yylloc;R.push(vt);var X=yt.options&&yt.options.ranges;typeof ft.yy.parseError=="function"?this.parseError=ft.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function pt(){var Ht;return Ht=B.pop()||yt.lex()||bt,typeof Ht!="number"&&(Ht instanceof Array&&(B=Ht,Ht=B.pop()),Ht=A.symbols_[Ht]||Ht),Ht}for(var U,Tt,nt,It,Ot={},Bt,Et,Z,Ct;;){if(Tt=I[I.length-1],this.defaultActions[Tt]?nt=this.defaultActions[Tt]:((U===null||typeof U>"u")&&(U=pt()),nt=z[Tt]&&z[Tt][U]),typeof nt>"u"||!nt.length||!nt[0]){var xt="";Ct=[];for(Bt in z[Tt])this.terminals_[Bt]&&Bt>at&&Ct.push("'"+this.terminals_[Bt]+"'");yt.showPosition?xt="Parse error on line "+(et+1)+`: +`+yt.showPosition()+` +Expecting `+Ct.join(", ")+", got '"+(this.terminals_[U]||U)+"'":xt="Parse error on line "+(et+1)+": Unexpected "+(U==bt?"end of input":"'"+(this.terminals_[U]||U)+"'"),this.parseError(xt,{text:yt.match,token:this.terminals_[U]||U,line:yt.yylineno,loc:vt,expected:Ct})}if(nt[0]instanceof Array&&nt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Tt+", token: "+U);switch(nt[0]){case 1:I.push(U),N.push(yt.yytext),R.push(yt.yylloc),I.push(nt[1]),U=null,st=yt.yyleng,W=yt.yytext,et=yt.yylineno,vt=yt.yylloc;break;case 2:if(Et=this.productions_[nt[1]][1],Ot.$=N[N.length-Et],Ot._$={first_line:R[R.length-(Et||1)].first_line,last_line:R[R.length-1].last_line,first_column:R[R.length-(Et||1)].first_column,last_column:R[R.length-1].last_column},X&&(Ot._$.range=[R[R.length-(Et||1)].range[0],R[R.length-1].range[1]]),It=this.performAction.apply(Ot,[W,st,et,ft.yy,nt[1],N,R].concat(mt)),typeof It<"u")return It;Et&&(I=I.slice(0,-1*Et*2),N=N.slice(0,-1*Et),R=R.slice(0,-1*Et)),I.push(this.productions_[nt[1]][0]),N.push(Ot.$),R.push(Ot._$),Z=z[I[I.length-2]][I[I.length-1]],I.push(Z);break;case 3:return!0}}return!0}},m=function(){var E={EOF:1,parseError:function(A,I){if(this.yy.parser)this.yy.parser.parseError(A,I);else throw new Error(A)},setInput:function(_,A){return this.yy=A||this.yy||{},this._input=_,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var _=this._input[0];this.yytext+=_,this.yyleng++,this.offset++,this.match+=_,this.matched+=_;var A=_.match(/(?:\r\n?|\n).*/g);return A?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),_},unput:function(_){var A=_.length,I=_.split(/(?:\r\n?|\n)/g);this._input=_+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-A),this.offset-=A;var B=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),I.length-1&&(this.yylineno-=I.length-1);var N=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:I?(I.length===B.length?this.yylloc.first_column:0)+B[B.length-I.length].length-I[0].length:this.yylloc.first_column-A},this.options.ranges&&(this.yylloc.range=[N[0],N[0]+this.yyleng-A]),this.yyleng=this.yytext.length,this},more:function(){return this._more=!0,this},reject:function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). +`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},less:function(_){this.unput(this.match.slice(_))},pastInput:function(){var _=this.matched.substr(0,this.matched.length-this.match.length);return(_.length>20?"...":"")+_.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var _=this.match;return _.length<20&&(_+=this._input.substr(0,20-_.length)),(_.substr(0,20)+(_.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var _=this.pastInput(),A=new Array(_.length+1).join("-");return _+this.upcomingInput()+` +`+A+"^"},test_match:function(_,A){var I,B,N;if(this.options.backtrack_lexer&&(N={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(N.yylloc.range=this.yylloc.range.slice(0))),B=_[0].match(/(?:\r\n?|\n).*/g),B&&(this.yylineno+=B.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:B?B[B.length-1].length-B[B.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+_[0].length},this.yytext+=_[0],this.match+=_[0],this.matches=_,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(_[0].length),this.matched+=_[0],I=this.performAction.call(this,this.yy,this,A,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),I)return I;if(this._backtrack){for(var R in N)this[R]=N[R];return!1}return!1},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var _,A,I,B;this._more||(this.yytext="",this.match="");for(var N=this._currentRules(),R=0;RA[0].length)){if(A=I,B=R,this.options.backtrack_lexer){if(_=this.test_match(I,N[R]),_!==!1)return _;if(this._backtrack){A=!1;continue}else return!1}else if(!this.options.flex)break}return A?(_=this.test_match(A,N[B]),_!==!1?_:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. +`+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var A=this.next();return A||this.lex()},begin:function(A){this.conditionStack.push(A)},popState:function(){var A=this.conditionStack.length-1;return A>0?this.conditionStack.pop():this.conditionStack[0]},_currentRules:function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},topState:function(A){return A=this.conditionStack.length-1-Math.abs(A||0),A>=0?this.conditionStack[A]:"INITIAL"},pushState:function(A){this.begin(A)},stateStackSize:function(){return this.conditionStack.length},options:{easy_keword_rules:!0},performAction:function(A,I,B,N){switch(B){case 0:return this.pushState("csv"),4;case 1:return 10;case 2:return 5;case 3:return 12;case 4:return this.pushState("escaped_text"),18;case 5:return 20;case 6:return this.popState("escaped_text"),18;case 7:return 19}},rules:[/^(?:sankey-beta\b)/,/^(?:$)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:(\u002C))/,/^(?:(\u0022))/,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/,/^(?:(\u0022)(?!(\u0022)))/,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/],conditions:{csv:{rules:[1,2,3,4,5,6,7],inclusive:!1},escaped_text:{rules:[6,7],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}};return E}();w.lexer=m;function b(){this.yy={}}return b.prototype=w,w.Parser=b,new b}();npt.parser=npt;const rK=npt;let iK=[],sK=[],kL={};const wYe=()=>{iK=[],sK=[],kL={},hg()};class vYe{constructor(a,f,p=0){this.source=a,this.target=f,this.value=p}}const mYe=(i,a,f)=>{iK.push(new vYe(i,a,f))};class yYe{constructor(a){this.ID=a}}const xYe={nodesMap:kL,getConfig:()=>Oe().sankey,getNodes:()=>sK,getLinks:()=>iK,getGraph:()=>({nodes:sK.map(i=>({id:i.ID})),links:iK.map(i=>({source:i.source.ID,target:i.target.ID,value:i.value}))}),addLink:mYe,findOrCreateNode:i=>(i=Kr.sanitizeText(i,Oe()),kL[i]||(kL[i]=new yYe(i),sK.push(kL[i])),kL[i]),getAccTitle:fg,setAccTitle:E0,getAccDescription:gg,setAccDescription:dg,getDiagramTitle:pg,setDiagramTitle:Nb,clear:wYe};function b$t(i,a){let f;if(a===void 0)for(const p of i)p!=null&&(f=p)&&(f=p);else{let p=-1;for(let w of i)(w=a(w,++p,i))!=null&&(f=w)&&(f=w)}return f}function w$t(i,a){let f;if(a===void 0)for(const p of i)p!=null&&(f>p||f===void 0&&p>=p)&&(f=p);else{let p=-1;for(let w of i)(w=a(w,++p,i))!=null&&(f>w||f===void 0&&w>=w)&&(f=w)}return f}function rpt(i,a){let f=0;if(a===void 0)for(let p of i)(p=+p)&&(f+=p);else{let p=-1;for(let w of i)(w=+a(w,++p,i))&&(f+=w)}return f}function kYe(i){return i.target.depth}function EYe(i){return i.depth}function TYe(i,a){return a-1-i.height}function v$t(i,a){return i.sourceLinks.length?i.depth:a-1}function CYe(i){return i.targetLinks.length?i.depth:i.sourceLinks.length?w$t(i.sourceLinks,kYe)-1:0}function aK(i){return function(){return i}}function m$t(i,a){return oK(i.source,a.source)||i.index-a.index}function y$t(i,a){return oK(i.target,a.target)||i.index-a.index}function oK(i,a){return i.y0-a.y0}function ipt(i){return i.value}function _Ye(i){return i.index}function SYe(i){return i.nodes}function AYe(i){return i.links}function x$t(i,a){const f=i.get(a);if(!f)throw new Error("missing: "+a);return f}function k$t({nodes:i}){for(const a of i){let f=a.y0,p=f;for(const w of a.sourceLinks)w.y0=f+w.width/2,f+=w.width;for(const w of a.targetLinks)w.y1=p+w.width/2,p+=w.width}}function LYe(){let i=0,a=0,f=1,p=1,w=24,m=8,b,E=_Ye,_=v$t,A,I,B=SYe,N=AYe,R=6;function z(){const Ot={nodes:B.apply(null,arguments),links:N.apply(null,arguments)};return W(Ot),et(Ot),st(Ot),at(Ot),yt(Ot),k$t(Ot),Ot}z.update=function(Ot){return k$t(Ot),Ot},z.nodeId=function(Ot){return arguments.length?(E=typeof Ot=="function"?Ot:aK(Ot),z):E},z.nodeAlign=function(Ot){return arguments.length?(_=typeof Ot=="function"?Ot:aK(Ot),z):_},z.nodeSort=function(Ot){return arguments.length?(A=Ot,z):A},z.nodeWidth=function(Ot){return arguments.length?(w=+Ot,z):w},z.nodePadding=function(Ot){return arguments.length?(m=b=+Ot,z):m},z.nodes=function(Ot){return arguments.length?(B=typeof Ot=="function"?Ot:aK(Ot),z):B},z.links=function(Ot){return arguments.length?(N=typeof Ot=="function"?Ot:aK(Ot),z):N},z.linkSort=function(Ot){return arguments.length?(I=Ot,z):I},z.size=function(Ot){return arguments.length?(i=a=0,f=+Ot[0],p=+Ot[1],z):[f-i,p-a]},z.extent=function(Ot){return arguments.length?(i=+Ot[0][0],f=+Ot[1][0],a=+Ot[0][1],p=+Ot[1][1],z):[[i,a],[f,p]]},z.iterations=function(Ot){return arguments.length?(R=+Ot,z):R};function W({nodes:Ot,links:Bt}){for(const[Z,Ct]of Ot.entries())Ct.index=Z,Ct.sourceLinks=[],Ct.targetLinks=[];const Et=new Map(Ot.map((Z,Ct)=>[E(Z,Ct,Ot),Z]));for(const[Z,Ct]of Bt.entries()){Ct.index=Z;let{source:xt,target:Ht}=Ct;typeof xt!="object"&&(xt=Ct.source=x$t(Et,xt)),typeof Ht!="object"&&(Ht=Ct.target=x$t(Et,Ht)),xt.sourceLinks.push(Ct),Ht.targetLinks.push(Ct)}if(I!=null)for(const{sourceLinks:Z,targetLinks:Ct}of Ot)Z.sort(I),Ct.sort(I)}function et({nodes:Ot}){for(const Bt of Ot)Bt.value=Bt.fixedValue===void 0?Math.max(rpt(Bt.sourceLinks,ipt),rpt(Bt.targetLinks,ipt)):Bt.fixedValue}function st({nodes:Ot}){const Bt=Ot.length;let Et=new Set(Ot),Z=new Set,Ct=0;for(;Et.size;){for(const xt of Et){xt.depth=Ct;for(const{target:Ht}of xt.sourceLinks)Z.add(Ht)}if(++Ct>Bt)throw new Error("circular link");Et=Z,Z=new Set}}function at({nodes:Ot}){const Bt=Ot.length;let Et=new Set(Ot),Z=new Set,Ct=0;for(;Et.size;){for(const xt of Et){xt.height=Ct;for(const{source:Ht}of xt.targetLinks)Z.add(Ht)}if(++Ct>Bt)throw new Error("circular link");Et=Z,Z=new Set}}function bt({nodes:Ot}){const Bt=b$t(Ot,Ct=>Ct.depth)+1,Et=(f-i-w)/(Bt-1),Z=new Array(Bt);for(const Ct of Ot){const xt=Math.max(0,Math.min(Bt-1,Math.floor(_.call(null,Ct,Bt))));Ct.layer=xt,Ct.x0=i+xt*Et,Ct.x1=Ct.x0+w,Z[xt]?Z[xt].push(Ct):Z[xt]=[Ct]}if(A)for(const Ct of Z)Ct.sort(A);return Z}function mt(Ot){const Bt=w$t(Ot,Et=>(p-a-(Et.length-1)*b)/rpt(Et,ipt));for(const Et of Ot){let Z=a;for(const Ct of Et){Ct.y0=Z,Ct.y1=Z+Ct.value*Bt,Z=Ct.y1+b;for(const xt of Ct.sourceLinks)xt.width=xt.value*Bt}Z=(p-Z+b)/(Et.length+1);for(let Ct=0;CtEt.length)-1)),mt(Bt);for(let Et=0;Et0))continue;let gn=(Le/Ft-Ht.y0)*Bt;Ht.y0+=gn,Ht.y1+=gn,U(Ht)}A===void 0&&xt.sort(oK),vt(xt,Et)}}function ut(Ot,Bt,Et){for(let Z=Ot.length,Ct=Z-2;Ct>=0;--Ct){const xt=Ot[Ct];for(const Ht of xt){let Le=0,Ft=0;for(const{target:Se,value:me}of Ht.sourceLinks){let Ve=me*(Se.layer-Ht.layer);Le+=It(Ht,Se)*Ve,Ft+=Ve}if(!(Ft>0))continue;let gn=(Le/Ft-Ht.y0)*Bt;Ht.y0+=gn,Ht.y1+=gn,U(Ht)}A===void 0&&xt.sort(oK),vt(xt,Et)}}function vt(Ot,Bt){const Et=Ot.length>>1,Z=Ot[Et];pt(Ot,Z.y0-b,Et-1,Bt),X(Ot,Z.y1+b,Et+1,Bt),pt(Ot,p,Ot.length-1,Bt),X(Ot,a,0,Bt)}function X(Ot,Bt,Et,Z){for(;Et1e-6&&(Ct.y0+=xt,Ct.y1+=xt),Bt=Ct.y1+b}}function pt(Ot,Bt,Et,Z){for(;Et>=0;--Et){const Ct=Ot[Et],xt=(Ct.y1-Bt)*Z;xt>1e-6&&(Ct.y0-=xt,Ct.y1-=xt),Bt=Ct.y0-b}}function U({sourceLinks:Ot,targetLinks:Bt}){if(I===void 0){for(const{source:{sourceLinks:Et}}of Bt)Et.sort(y$t);for(const{target:{targetLinks:Et}}of Ot)Et.sort(m$t)}}function Tt(Ot){if(I===void 0)for(const{sourceLinks:Bt,targetLinks:Et}of Ot)Bt.sort(y$t),Et.sort(m$t)}function nt(Ot,Bt){let Et=Ot.y0-(Ot.sourceLinks.length-1)*b/2;for(const{target:Z,width:Ct}of Ot.sourceLinks){if(Z===Bt)break;Et+=Ct+b}for(const{source:Z,width:Ct}of Bt.targetLinks){if(Z===Ot)break;Et-=Ct}return Et}function It(Ot,Bt){let Et=Bt.y0-(Bt.targetLinks.length-1)*b/2;for(const{source:Z,width:Ct}of Bt.targetLinks){if(Z===Ot)break;Et+=Ct+b}for(const{target:Z,width:Ct}of Ot.sourceLinks){if(Z===Bt)break;Et-=Ct}return Et}return z}var spt=Math.PI,apt=2*spt,OT=1e-6,MYe=apt-OT;function opt(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function E$t(){return new opt}opt.prototype=E$t.prototype={constructor:opt,moveTo:function(i,a){this._+="M"+(this._x0=this._x1=+i)+","+(this._y0=this._y1=+a)},closePath:function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(i,a){this._+="L"+(this._x1=+i)+","+(this._y1=+a)},quadraticCurveTo:function(i,a,f,p){this._+="Q"+ +i+","+ +a+","+(this._x1=+f)+","+(this._y1=+p)},bezierCurveTo:function(i,a,f,p,w,m){this._+="C"+ +i+","+ +a+","+ +f+","+ +p+","+(this._x1=+w)+","+(this._y1=+m)},arcTo:function(i,a,f,p,w){i=+i,a=+a,f=+f,p=+p,w=+w;var m=this._x1,b=this._y1,E=f-i,_=p-a,A=m-i,I=b-a,B=A*A+I*I;if(w<0)throw new Error("negative radius: "+w);if(this._x1===null)this._+="M"+(this._x1=i)+","+(this._y1=a);else if(B>OT)if(!(Math.abs(I*E-_*A)>OT)||!w)this._+="L"+(this._x1=i)+","+(this._y1=a);else{var N=f-m,R=p-b,z=E*E+_*_,W=N*N+R*R,et=Math.sqrt(z),st=Math.sqrt(B),at=w*Math.tan((spt-Math.acos((z+B-W)/(2*et*st)))/2),bt=at/st,mt=at/et;Math.abs(bt-1)>OT&&(this._+="L"+(i+bt*A)+","+(a+bt*I)),this._+="A"+w+","+w+",0,0,"+ +(I*N>A*R)+","+(this._x1=i+mt*E)+","+(this._y1=a+mt*_)}},arc:function(i,a,f,p,w,m){i=+i,a=+a,f=+f,m=!!m;var b=f*Math.cos(p),E=f*Math.sin(p),_=i+b,A=a+E,I=1^m,B=m?p-w:w-p;if(f<0)throw new Error("negative radius: "+f);this._x1===null?this._+="M"+_+","+A:(Math.abs(this._x1-_)>OT||Math.abs(this._y1-A)>OT)&&(this._+="L"+_+","+A),f&&(B<0&&(B=B%apt+apt),B>MYe?this._+="A"+f+","+f+",0,1,"+I+","+(i-b)+","+(a-E)+"A"+f+","+f+",0,1,"+I+","+(this._x1=_)+","+(this._y1=A):B>OT&&(this._+="A"+f+","+f+",0,"+ +(B>=spt)+","+I+","+(this._x1=i+f*Math.cos(w))+","+(this._y1=a+f*Math.sin(w))))},rect:function(i,a,f,p){this._+="M"+(this._x0=this._x1=+i)+","+(this._y0=this._y1=+a)+"h"+ +f+"v"+ +p+"h"+-f+"Z"},toString:function(){return this._}};function T$t(i){return function(){return i}}function DYe(i){return i[0]}function IYe(i){return i[1]}var OYe=Array.prototype.slice;function PYe(i){return i.source}function FYe(i){return i.target}function NYe(i){var a=PYe,f=FYe,p=DYe,w=IYe,m=null;function b(){var E,_=OYe.call(arguments),A=a.apply(this,_),I=f.apply(this,_);if(m||(m=E=E$t()),i(m,+p.apply(this,(_[0]=A,_)),+w.apply(this,_),+p.apply(this,(_[0]=I,_)),+w.apply(this,_)),E)return m=null,E+""||null}return b.source=function(E){return arguments.length?(a=E,b):a},b.target=function(E){return arguments.length?(f=E,b):f},b.x=function(E){return arguments.length?(p=typeof E=="function"?E:T$t(+E),b):p},b.y=function(E){return arguments.length?(w=typeof E=="function"?E:T$t(+E),b):w},b.context=function(E){return arguments.length?(m=E??null,b):m},b}function BYe(i,a,f,p,w){i.moveTo(a,f),i.bezierCurveTo(a=(a+p)/2,f,a,w,p,w)}function RYe(){return NYe(BYe)}function jYe(i){return[i.source.x1,i.y0]}function $Ye(i){return[i.target.x0,i.y1]}function zYe(){return RYe().source(jYe).target($Ye)}const C$t=class RLt{static next(a){return new RLt(a+ ++RLt.count)}constructor(a){this.id=a,this.href=`#${a}`}toString(){return"url("+this.href+")"}};C$t.count=0;let _$t=C$t;const qYe={left:EYe,right:TYe,center:CYe,justify:v$t},HYe={draw:function(i,a,f,p){const{securityLevel:w,sankey:m}=Oe(),b=SOt.sankey;let E;w==="sandbox"&&(E=yr("#i"+a));const _=yr(w==="sandbox"?E.nodes()[0].contentDocument.body:"body"),A=w==="sandbox"?_.select(`[id="${a}"]`):yr(`[id="${a}"]`),I=(m==null?void 0:m.width)??b.width,B=(m==null?void 0:m.height)??b.width,N=(m==null?void 0:m.useMaxWidth)??b.useMaxWidth,R=(m==null?void 0:m.nodeAlignment)??b.nodeAlignment,z=(m==null?void 0:m.prefix)??b.prefix,W=(m==null?void 0:m.suffix)??b.suffix,et=(m==null?void 0:m.showValues)??b.showValues;k0(A,B,I,N);const st=p.db.getGraph(),at=qYe[R],bt=10;LYe().nodeId(pt=>pt.id).nodeWidth(bt).nodePadding(10+(et?15:0)).nodeAlign(at).extent([[0,0],[I,B]])(st);const yt=XU(X7e);A.append("g").attr("class","nodes").selectAll(".node").data(st.nodes).join("g").attr("class","node").attr("id",pt=>(pt.uid=_$t.next("node-")).id).attr("transform",function(pt){return"translate("+pt.x0+","+pt.y0+")"}).attr("x",pt=>pt.x0).attr("y",pt=>pt.y0).append("rect").attr("height",pt=>pt.y1-pt.y0).attr("width",pt=>pt.x1-pt.x0).attr("fill",pt=>yt(pt.id));const ft=({id:pt,value:U})=>et?`${pt} +${z}${Math.round(U*100)/100}${W}`:pt;A.append("g").attr("class","node-labels").attr("font-family","sans-serif").attr("font-size",14).selectAll("text").data(st.nodes).join("text").attr("x",pt=>pt.x0(pt.y1+pt.y0)/2).attr("dy",`${et?"0":"0.35"}em`).attr("text-anchor",pt=>pt.x0(U.uid=_$t.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",U=>U.source.x1).attr("x2",U=>U.target.x0);pt.append("stop").attr("offset","0%").attr("stop-color",U=>yt(U.source.id)),pt.append("stop").attr("offset","100%").attr("stop-color",U=>yt(U.target.id))}let X;switch(vt){case"gradient":X=pt=>pt.uid;break;case"source":X=pt=>yt(pt.source.id);break;case"target":X=pt=>yt(pt.target.id);break;default:X=vt}ut.append("path").attr("d",zYe()).attr("stroke",X).attr("stroke-width",pt=>Math.max(1,pt.width))}},VYe=i=>i.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` +`).trim(),GYe=rK.parse.bind(rK);rK.parse=i=>GYe(VYe(i));const UYe=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:rK,db:xYe,renderer:HYe}},Symbol.toStringTag,{value:"Module"}));return Bb}); diff --git a/docs/da_integration.md b/docs/da_integration.md new file mode 100644 index 00000000..cae9c036 --- /dev/null +++ b/docs/da_integration.md @@ -0,0 +1,82 @@ +# CDK DA Integration + +The purpose of this document is to explain how a 3rd Party Data Availability (DA) solution can integrate with CDK. + +## Considerations + +The code outlined in this document is under development, and while we’re confident that it will be ready for production in a few weeks, it is currently under heavy development. + +For the first iteration of integrations, on-chain verification is not expected. Although this document shows how this could be done at the contract level (doing such a thing on the ZKPs is out of the scope right now). In any case, Agglayer will assert that the data is actually available before settling ZKPs. + +## Smart Contracts + +The versions of the smart contracts that are being targeted for the DA integrations are found in [zkevm-contracts @ feature/banana](https://github.com/0xPolygonHermez/zkevm-contracts/tree/feature/banana). This new version of the contracts allow for multiple “consensus” implementations but there are two that are included by default: + +- zkEVM to implement a rollup. +- Validium to implement a validium. +- Adding a custom solution. + +This document only considers the first approach, reusing the `PolygonValidium` consensus. That being said, the `PolygonValidium` implementation allows a custom smart contract to be used in the relevant interaction. This could be used by DAs to add custom on-chain verification logic. While verifying the DA integrity is optional, any new protocol will need to develop a custom smart contract in order to be successfully integrated (more details bellow) + +This is by far the [most relevant part of the contract for DAs](https://github.com/0xPolygonHermez/zkevm-contracts/blob/533641301223a1e413b2e8f0323354671f310922/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol#L91C5-L98C36): + +```javascript + function sequenceBatchesValidium( + ValidiumBatchData[] calldata batches, + uint32 indexL1InfoRoot, + uint64 maxSequenceTimestamp, + bytes32 expectedFinalAccInputHash, + address l2Coinbase, + bytes calldata dataAvailabilityMessage + ) external onlyTrustedSequencer { +``` + +And in particular this [piece of code](https://github.com/0xPolygonHermez/zkevm-contracts/blob/feature/banana/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol#L228C13-L230): + +```javascript + // Validate that the data availability protocol accepts the dataAvailabilityMessage + // note This is a view function, so there's not much risk even if this contract was vulnerable to reentrant attacks + dataAvailabilityProtocol.verifyMessage( + accumulatedNonForcedTransactionsHash, + dataAvailabilityMessage + ); +``` + +It's expected that any protocol build their own contract that follows [this interface](https://github.com/0xPolygonHermez/zkevm-contracts/blob/feature/banana/contracts/v2/interfaces/IDataAvailabilityProtocol.sol#L5), in the same way that the `PolygonDataCommittee` does. The implementation of `verifyMessage` is dependant on each protocol, and in a first iteration could be "dummy", since the AggLayer will ensure that the DA is actually available anyway. That being said we expect protocol integrations to evolve towards "trustless verification" + +## Setup the Node + +In order to integrate a DA solution into CDK, the most fundamental part is for the node to be able to post and retrieve data from the DA backend. + +Up until now, DAs would fork the `cdk-validium-node` repo to make such an integration. But maintaining forks can be really painful, so the team is proposing this solution that will allow the different DAs to be 1st class citizens and live on the official `cdk` repo. + +These items would need to be implemented to have a successful integration: + +1. Create a repository that will host the package that implements [this interface](https://github.com/agglayer/aggkit/blob/develop/dataavailability/interfaces.go#L11-L16). You can check how is done for the [DAC case](https://github.com/agglayer/aggkit/blob/develop/dataavailability/datacommittee/datacommittee.go) as an example. +2. Add a new entry on the [supported backend strings](https://github.com/agglayer/aggkit/blob/develop/dataavailability/config.go) +3. [OPTIONAL] Add a config struct in the new package, and add the struct inside the main data availability config struct, this way your package will be able to receive custom configuration using the main config file of the node. +4. `go get` and instantiate your package and use it to create the main data availability instance, as done in the Polygon implementation. + +> [!TIP] +> By default all E2E tests will run using the DAC. It’s possible to run the E2E test using other DA backends changing the test config file. + +## Test the integration + +1. Create an E2E test that uses your protocol by following the [test/e2e/datacommittee_test.go](https://github.com/0xPolygon/cdk-validium-node/blob/develop/test/e2e/datacommittee_test.go) example. +2. Follow the instructions on [Local Debug](local_debug.md) to run Kurtosis enviroment for local testing +4. Deploy the new contract contract to L1 running in Kurtosis +4. Call `setDataAvailabilityProtocol` in validium consensus contract to use the newly deployed contract. +5. Modify the `Makefile` to be able to run your test, take the case of the DAC test as an example here + +### Example flow + +1. Sequencer groups N batches of arbitrary size into a sequence +2. Sequencer calls `PostSequence` +3. The DA BAckend implementation decides to split the N batches into M chunks, so they fit as good as possible to the size of the DA blobs of the protocol (or other considerations that the protocol may have) +4. The DA BAckend crafts the `dataAvailabilityMessage`, this is optional but could be used to: + - Verify the existance of the data on the DA backend on L1 (this message will be passed down to the DA smart contract, and it could include merkle proofs, ...). Realisitcally speaking, we don't expect to be implemented on a first iteration + - Help the data retrival process, for instance by including the block height or root of the blobs used to store the data. If many DA blobs are used to store a single sequence, one interesting trick would be to post some metadata in another blob, or the lates used blob, that points to the other used blobs. This way only the pointer to the metadata is needed to include into the `dataAvailabilityMessage` (since this message will be posted as part of the calldata, it's interesting to minimize it's size) +5. The sequencer [posts the sequence on L1](https://github.com/0xPolygonHermez/zkevm-contracts/blob/develop/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol#L85), including the `dataAvailabilityMessage`. On that call, [the DA smart contract will be called](https://github.com/0xPolygonHermez/zkevm-contracts/blob/develop/contracts/v2/consensus/validium/PolygonValidiumEtrog.sol#L217). This can be used to validate that the DA protocol has been used as expected (optional) +6. After that happens, any node synchronizing the network will realise of it through an event of the smart contract, and will be able to retrieve the hashes of each batch and the `dataAvailabilityMessage` +7. And so it will be able to call `GetSequence(hashes common.Hash, dataAvailabilityMessage []byte)` to the DA Backend +8. The DA BAckend will then retrieve the data, and return it diff --git a/docs/getting_started.md b/docs/getting_started.md new file mode 100644 index 00000000..702dabaf --- /dev/null +++ b/docs/getting_started.md @@ -0,0 +1,17 @@ +# Welcome to Polygon CDK Tech Docs + +Welcome to the official documentation for the Polygon CDK (Chain Development Kit). This guide will help you get started with building and deploying rollups using the Polygon CDK. + +## Getting Started + +To get started with Polygon CDK, follow these steps: +1. [Getting Started](getting_started.md) + +## Documentation + +Explore the comprehensive documentation to understand the various features and capabilities of the Polygon CDK: +- [3rd party data availability integration](da_integration.md) + +## Support + +Happy coding with Polygon CDK! diff --git a/docs/local_debug.md b/docs/local_debug.md new file mode 100644 index 00000000..ccfbc7e1 --- /dev/null +++ b/docs/local_debug.md @@ -0,0 +1,25 @@ +# Setup environment to local debug on VSCode + +## Requirements + +* Working and running [kurtosis-cdk](https://github.com/0xPolygon/kurtosis-cdk) environment setup. +* In `test/scripts/env.sh` setup `KURTOSIS_FOLDER` pointing to your setup. + +> [!TIP] +> Use your WIP branch in Kurtosis as needed + +## Create configuration for this kurtosis environment + +``` +scripts/local_config +``` + +## Stop aggkit enclave started by Kurtosis + +```bash +kurtosis service stop aggkit cdk-node-001 +``` + +## Add to vscode launch.json + +After execution `scripts/local_config` it suggest an entry for `launch.json` configurations diff --git a/docs/non_evm_integration.md b/docs/non_evm_integration.md new file mode 100644 index 00000000..ed304ea5 --- /dev/null +++ b/docs/non_evm_integration.md @@ -0,0 +1,69 @@ +# Integrating non-EVM systems + +This guide explains how to connect a third-party execution environment to the AggLayer using the CDK. + +## Important note + +The following information is experimental, and there aren't any working examples of non-EVM integrations with the AggLayer yet. While we know what needs to be done conceptually, the implementation details are likely to evolve. Think of this as a rough overview of the effort involved, rather than a step-by-step guide towards a production deployment. + +## Key Concepts + +Any system (chain or not chain) should be able to interact with the [unified LxLy bridge](https://docs.polygon.technology/zkEVM/architecture/unified-LxLy) and settle using the [AggLayer](https://docs.polygon.technology/learn/agglayer/overview/); especially when using the [Pessimistic Proof](https://docs.polygon.technology/learn/agglayer/pessimistic_proof/) option. Support for additional proofs, such as consensus, execution, or data availability are planned for the future. But, for now, this guide is based solely on using the Pessimistic Proof for settlement. + +The CDK client handles the integration with both the unified LxLy bridge and AggLayer. Think of it as an SDK to bring your project into the AggLayer ecosystem. You'll need to write some custom code in an adapter/plugin style so that the CDK client can connect with your service. + +In some cases, you might need to write code in `Go`. When that happens, the code should be in a separate repo and imported into the CDK as a dependency. The goal is to provide implementations that can interact with the *smart contracts* of the system being integrated, allowing the CDK client to reuse the same logic across different systems. Basically, you’ll need to create some *adapters* for the new system, while the existing code handles the rest. + +## Components for integration + +### Smart contracts + +For EVM-based integrations, there are two relevant smart contracts: + +- [Global exit root](https://github.com/0xPolygonHermez/zkevm-contracts/blob/feature/sovereign-bridge/contracts/v2/sovereignChains/GlobalExitRootManagerL2SovereignChain.sol) +- [Bridge](https://github.com/0xPolygonHermez/zkevm-contracts/blob/feature/sovereign-bridge/contracts/v2/sovereignChains/BridgeL2SovereignChain.sol) + +The integrated system needs to implement similar functionality. It doesn't have to be a smart contract per se, and it doesn't need to be split into two parts, but it should perform the functions that we list here: + +- Bridge assets and messages to other networks. +- Handle incoming asset/message claims. +- Export local exit roots (a hash needed for other networks to claim assets). +- Import global exit roots (a hash needed for processing bridge claims). + +### AggOracle + +This component imports global exit roots into the smart contract(s). It should be implemented as a `Go` package, using the [EVM example](../aggoracle/chaingersender/evm.go) as a reference. It should implement the `ChainSender` interface defined [here](../aggoracle/oracle.go). + +### BridgeSync + +BridgeSync synchronizes information about bridges and claims originating from the L2 service attached to the CDK client. In other words, it monitors what's happening with the bridge smart contract, collects the necessary data for interacting with the AggLayer, and feeds the bridge service to enable claims on destination networks. + +> **Heads up:** These interfaces may change. + +To process events from non-EVM systems, you'll need a `downloader` and `driver`. The current setup needs some tweaks to support custom implementations. In short, you need to work with the [`Processor`](../bridgesync/processor.go), particularly the `ProcessorInterface` found [here](../sync/driver.go). The `Events` in `Block` are just interfaces, which should be parsed as `Event` structs defined in the [`Processor`](../bridgesync/processor.go). + +### Claim sponsor + +This component performs claims on behalf of users, which is crucial for systems with "gas" fees (transaction costs). Without it, gas-based systems could face a chicken/egg situation: How can users pay for a claim if they need a previous claim to get the funds to pay for it? + +The claim sponsor is optional and may not be needed in some setups. The [bridge RPC](../rpc/bridge.go) includes a config parameter to enable or disable it. To implement a claim sponsor that can perform claim transactions on the bridge smart contract, you'll need to implement the `ClaimSender` interface, defined [here](../claimsponsor/claimsponsor.go). + +### Last GER sync + +> **Warning:** These interfaces may also change. + +This component tracks which global exit roots have been imported. It helps the bridge service know when incoming bridges are ready to be claimed. The work needed is similar to that for the bridge sync: Implement the [`ProcessorInterface`](../sync/driver.go), with events of type `Event` defined [here](../lastgersync/processor.go). + +## Additional considerations + +### Bridge + +Once all components are implemented, the network should be connected to the unified LxLy bridge. However, keep in mind: + +- Outgoing bridges should work with current tools and UIs, but incoming bridges may not. When using the claim sponsor, things should just work. However, the claim sponsor is optional... The point being that the existing UIs are built to send EVM transactions to make the claim in the absence of claim sponsor. So any claim interaction beyond the auto-claim functionality will need UIs and tooling that are out of the sope of the CDK. +- Bridging assets/messages to another network is specific to the integrated system. You'll need to create mechanisms to interact with the *bridge smart contract* of your service for these actions. +- We’re moving towards an *in-CDK* bridge service (spec [here](https://hackmd.io/0vA-XU2BRHmH3Ab0j4ouZw)), replacing the current separate service ([here](https://github.com/0xPolygonHermez/zkevm-bridge-service)). There's no stable API yet, and SDKs/UIs are still in development. + +### AggLayer + +AggLayer integration will work once the components are ready, but initially, it will only support Pessimistic Proof. Later updates will add more security features like execution proofs, consensus proofs, data availability, and forced transactions. These will be optional, while Pessimistic Proof will remain mandatory. \ No newline at end of file diff --git a/etherman/aggregator.go b/etherman/aggregator.go new file mode 100644 index 00000000..5e1192ec --- /dev/null +++ b/etherman/aggregator.go @@ -0,0 +1,130 @@ +package etherman + +import ( + "context" + "encoding/hex" + "errors" + "fmt" + "math/big" + "strings" + + ethmanTypes "github.com/agglayer/aggkit/aggregator/ethmantypes" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" +) + +// BuildTrustedVerifyBatchesTxData builds a []bytes to be sent to the PoE SC method TrustedVerifyBatches. +func (etherMan *Client) BuildTrustedVerifyBatchesTxData( + lastVerifiedBatch, newVerifiedBatch uint64, inputs *ethmanTypes.FinalProofInputs, beneficiary common.Address, +) (to *common.Address, data []byte, err error) { + opts, err := etherMan.generateRandomAuth() + if err != nil { + return nil, nil, fmt.Errorf("failed to build trusted verify batches, err: %w", err) + } + opts.NoSend = true + // force nonce, gas limit and gas price to avoid querying it from the chain + opts.Nonce = big.NewInt(1) + opts.GasLimit = uint64(1) + opts.GasPrice = big.NewInt(1) + + var newLocalExitRoot [32]byte + copy(newLocalExitRoot[:], inputs.NewLocalExitRoot) + + var newStateRoot [32]byte + copy(newStateRoot[:], inputs.NewStateRoot) + + proof, err := convertProof(inputs.FinalProof.Proof) + if err != nil { + log.Errorf("error converting proof. Error: %v, Proof: %s", err, inputs.FinalProof.Proof) + + return nil, nil, err + } + + const pendStateNum = 0 // TODO hardcoded for now until we implement the pending state feature + + tx, err := etherMan.Contracts.Banana.RollupManager.VerifyBatchesTrustedAggregator( + &opts, + etherMan.RollupID, + pendStateNum, + lastVerifiedBatch, + newVerifiedBatch, + newLocalExitRoot, + newStateRoot, + beneficiary, + proof, + ) + if err != nil { + if parsedErr, ok := TryParseError(err); ok { + err = parsedErr + } + + return nil, nil, err + } + + return tx.To(), tx.Data(), nil +} + +// GetBatchAccInputHash gets the batch accumulated input hash from the ethereum +func (etherMan *Client) GetBatchAccInputHash(ctx context.Context, batchNumber uint64) (common.Hash, error) { + rollupData, err := etherMan.Contracts.Banana.RollupManager.GetRollupSequencedBatches( + &bind.CallOpts{Pending: false}, etherMan.RollupID, batchNumber, + ) + if err != nil { + return common.Hash{}, err + } + + return rollupData.AccInputHash, nil +} + +// GetRollupId returns the rollup id +func (etherMan *Client) GetRollupId() uint32 { //nolint:stylecheck + return etherMan.RollupID +} + +// generateRandomAuth generates an authorization instance from a +// randomly generated private key to be used to estimate gas for PoE +// operations NOT restricted to the Trusted Sequencer +func (etherMan *Client) generateRandomAuth() (bind.TransactOpts, error) { + privateKey, err := crypto.GenerateKey() + if err != nil { + return bind.TransactOpts{}, errors.New("failed to generate a private key to estimate L1 txs") + } + chainID := big.NewInt(0).SetUint64(etherMan.l1Cfg.L1ChainID) + auth, err := bind.NewKeyedTransactorWithChainID(privateKey, chainID) + if err != nil { + return bind.TransactOpts{}, errors.New("failed to generate a fake authorization to estimate L1 txs") + } + + return *auth, nil +} + +func convertProof(p string) ([24][32]byte, error) { + if len(p) != 24*32*2+2 { + return [24][32]byte{}, fmt.Errorf("invalid proof length. Length: %d", len(p)) + } + p = strings.TrimPrefix(p, "0x") + proof := [24][32]byte{} + for i := 0; i < 24; i++ { + data := p[i*64 : (i+1)*64] + p, err := DecodeBytes(&data) + if err != nil { + return [24][32]byte{}, fmt.Errorf("failed to decode proof, err: %w", err) + } + var aux [32]byte + copy(aux[:], p) + proof[i] = aux + } + + return proof, nil +} + +// DecodeBytes decodes a hex string into a []byte +func DecodeBytes(val *string) ([]byte, error) { + if val == nil { + return []byte{}, nil + } + + return hex.DecodeString(strings.TrimPrefix(*val, "0x")) +} diff --git a/etherman/config/config.go b/etherman/config/config.go new file mode 100644 index 00000000..fcf7cd79 --- /dev/null +++ b/etherman/config/config.go @@ -0,0 +1,31 @@ +package config + +import ( + "github.com/0xPolygon/zkevm-ethtx-manager/etherman" + "github.com/ethereum/go-ethereum/common" +) + +// Config represents the configuration of the etherman +type Config struct { + // URL is the URL of the Ethereum node for L1 + URL string `mapstructure:"URL"` + + EthermanConfig etherman.Config + + // ForkIDChunkSize is the max interval for each call to L1 provider to get the forkIDs + ForkIDChunkSize uint64 `mapstructure:"ForkIDChunkSize"` +} + +// L1Config represents the configuration of the network used in L1 +type L1Config struct { + // Chain ID of the L1 network + L1ChainID uint64 `json:"chainId"` + // ZkEVMAddr Address of the L1 contract polygonZkEVMAddress + ZkEVMAddr common.Address `json:"polygonZkEVMAddress"` + // RollupManagerAddr Address of the L1 contract + RollupManagerAddr common.Address `json:"polygonRollupManagerAddress"` + // PolAddr Address of the L1 Pol token Contract + PolAddr common.Address `json:"polTokenAddress"` + // GlobalExitRootManagerAddr Address of the L1 GlobalExitRootManager contract + GlobalExitRootManagerAddr common.Address `json:"polygonZkEVMGlobalExitRootAddress"` +} diff --git a/etherman/contracts/base.go b/etherman/contracts/base.go new file mode 100644 index 00000000..33dac74c --- /dev/null +++ b/etherman/contracts/base.go @@ -0,0 +1,63 @@ +package contracts + +import ( + "reflect" + + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +type ContractBase struct { + address common.Address + contractName NameType + version VersionType +} + +type contractConstructorFunc[T any] func(address common.Address, backend bind.ContractBackend) (T, error) + +func NewContractBase(address common.Address, backend bind.ContractBackend, + name NameType, version VersionType) *ContractBase { + return &ContractBase{ + address: address, + contractName: name, + version: version, + } +} + +func (e *ContractBase) Address() common.Address { + return e.address +} + +func (e *ContractBase) Name() string { + return string(e.contractName) +} + +func (e *ContractBase) Version() string { + return string(e.version) +} + +func (e *ContractBase) String() string { + return e.Version() + "/" + e.Name() + "@" + e.Address().String() +} + +func NewContractMagic[C any, T any]( + constructor contractConstructorFunc[T], + address common.Address, + backend bind.ContractBackend, + name NameType, + version VersionType, +) (*C, error) { + contractBind, err := constructor(address, backend) + if err != nil { + log.Errorf("failed to bind contract %s at address %s. Err:%w", name, address.String(), err) + + return nil, err + } + tmp := new(C) + values := reflect.ValueOf(tmp).Elem() + values.FieldByIndex([]int{0}).Set(reflect.ValueOf(contractBind)) + values.FieldByIndex([]int{1}).Set(reflect.ValueOf(NewContractBase(address, backend, name, version))) + + return tmp, nil +} diff --git a/etherman/contracts/base_test.go b/etherman/contracts/base_test.go new file mode 100644 index 00000000..de99d982 --- /dev/null +++ b/etherman/contracts/base_test.go @@ -0,0 +1,16 @@ +package contracts_test + +import ( + "testing" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygonzkevmglobalexitrootv2" + "github.com/agglayer/aggkit/etherman/contracts" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestNewContractMagic(t *testing.T) { + ger, err := contracts.NewContractMagic[contracts.GlobalExitRootBananaType](polygonzkevmglobalexitrootv2.NewPolygonzkevmglobalexitrootv2, common.Address{}, nil, contracts.ContractNameGlobalExitRoot, contracts.VersionBanana) + require.NoError(t, err) + require.NotNil(t, ger) +} diff --git a/etherman/contracts/contracts.go b/etherman/contracts/contracts.go new file mode 100644 index 00000000..fa20777f --- /dev/null +++ b/etherman/contracts/contracts.go @@ -0,0 +1,32 @@ +package contracts + +import ( + "github.com/agglayer/aggkit/etherman/config" + "github.com/ethereum/go-ethereum/accounts/abi/bind" +) + +type Contracts struct { + Banana ContractsBanana + Elderberry ContractsElderberry +} + +func NewContracts(cfg config.L1Config, backend bind.ContractBackend) (*Contracts, error) { + banana, err := NewContractsBanana(cfg, backend) + if err != nil { + return nil, err + } + + elderberry, err := NewContractsElderberry(cfg, backend) + if err != nil { + return nil, err + } + + return &Contracts{ + Banana: *banana, + Elderberry: *elderberry, + }, nil +} + +func (c *Contracts) String() string { + return " Banana: \n" + c.Banana.String() + "\n Elderberry:\n" + c.Elderberry.String() +} diff --git a/etherman/contracts/contracts_banana.go b/etherman/contracts/contracts_banana.go new file mode 100644 index 00000000..917c90cd --- /dev/null +++ b/etherman/contracts/contracts_banana.go @@ -0,0 +1,64 @@ +package contracts + +import ( + "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygonrollupmanager" + "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygonvalidiumetrog" + "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygonzkevmglobalexitrootv2" + "github.com/agglayer/aggkit/etherman/config" + "github.com/ethereum/go-ethereum/accounts/abi/bind" +) + +type GlobalExitRootBananaType struct { + *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2 + *ContractBase +} + +type RollupManagerBananaType struct { + *polygonrollupmanager.Polygonrollupmanager + *ContractBase +} + +type RollupBananaType struct { + *polygonvalidiumetrog.Polygonvalidiumetrog + *ContractBase +} + +type ContractsBanana struct { + GlobalExitRoot GlobalExitRootBananaType + Rollup RollupBananaType + RollupManager RollupManagerBananaType +} + +func NewContractsBanana(cfg config.L1Config, backend bind.ContractBackend) (*ContractsBanana, error) { + ger, err := NewContractMagic[GlobalExitRootBananaType]( + polygonzkevmglobalexitrootv2.NewPolygonzkevmglobalexitrootv2, + cfg.GlobalExitRootManagerAddr, + backend, ContractNameGlobalExitRoot, VersionBanana) + if err != nil { + return nil, err + } + rollup, err := NewContractMagic[RollupBananaType]( + polygonvalidiumetrog.NewPolygonvalidiumetrog, cfg.ZkEVMAddr, + backend, ContractNameRollup, VersionBanana) + if err != nil { + return nil, err + } + + rollupManager, err := NewContractMagic[RollupManagerBananaType]( + polygonrollupmanager.NewPolygonrollupmanager, cfg.RollupManagerAddr, + backend, ContractNameRollupManager, VersionBanana) + if err != nil { + return nil, err + } + + return &ContractsBanana{ + GlobalExitRoot: *ger, + Rollup: *rollup, + RollupManager: *rollupManager, + }, nil +} + +func (c *ContractsBanana) String() string { + return "RollupManager: " + c.RollupManager.String() + "\nGlobalExitRoot: " + + c.GlobalExitRoot.String() + "\nRollup: " + c.Rollup.String() +} diff --git a/etherman/contracts/contracts_elderberry.go b/etherman/contracts/contracts_elderberry.go new file mode 100644 index 00000000..6154b2d6 --- /dev/null +++ b/etherman/contracts/contracts_elderberry.go @@ -0,0 +1,75 @@ +package contracts + +import ( + "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonrollupmanager" + "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonvalidiumetrog" + "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonzkevmglobalexitrootv2" + "github.com/agglayer/aggkit/etherman/config" + "github.com/ethereum/go-ethereum/accounts/abi/bind" +) + +type GlobalExitRootElderberryType struct { + *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2 + *ContractBase +} + +type RollupElderberryType struct { + *polygonvalidiumetrog.Polygonvalidiumetrog + *ContractBase +} + +type RollupManagerElderberryType struct { + *polygonrollupmanager.Polygonrollupmanager + *ContractBase +} + +type ContractsElderberry struct { + GlobalExitRoot GlobalExitRootElderberryType + Rollup RollupElderberryType + RollupManager RollupManagerElderberryType +} + +func NewContractsElderberry(cfg config.L1Config, backend bind.ContractBackend) (*ContractsElderberry, error) { + ger, err := NewContractMagic[GlobalExitRootElderberryType]( + polygonzkevmglobalexitrootv2.NewPolygonzkevmglobalexitrootv2, + cfg.GlobalExitRootManagerAddr, + backend, + ContractNameGlobalExitRoot, + VersionElderberry, + ) + if err != nil { + return nil, err + } + rollup, err := NewContractMagic[RollupElderberryType]( + polygonvalidiumetrog.NewPolygonvalidiumetrog, + cfg.ZkEVMAddr, + backend, + ContractNameRollup, + VersionElderberry, + ) + if err != nil { + return nil, err + } + + rollupManager, err := NewContractMagic[RollupManagerElderberryType]( + polygonrollupmanager.NewPolygonrollupmanager, + cfg.RollupManagerAddr, + backend, + ContractNameRollupManager, + VersionElderberry, + ) + if err != nil { + return nil, err + } + + return &ContractsElderberry{ + GlobalExitRoot: *ger, + Rollup: *rollup, + RollupManager: *rollupManager, + }, nil +} + +func (c *ContractsElderberry) String() string { + return "RollupManager: " + c.RollupManager.String() + "\nGlobalExitRoot: " + + c.GlobalExitRoot.String() + "\nRollup: " + c.Rollup.String() +} diff --git a/etherman/contracts/types.go b/etherman/contracts/types.go new file mode 100644 index 00000000..e5bfe39c --- /dev/null +++ b/etherman/contracts/types.go @@ -0,0 +1,25 @@ +package contracts + +import ( + "errors" +) + +type NameType string + +const ( + ContractNameDAProtocol NameType = "daprotocol" + ContractNameRollupManager NameType = "rollupmanager" + ContractNameGlobalExitRoot NameType = "globalexitroot" + ContractNameRollup NameType = "rollup" +) + +var ( + ErrNotImplemented = errors.New("not implemented") +) + +type VersionType string + +const ( + VersionBanana VersionType = "banana" + VersionElderberry VersionType = "elderberry" +) diff --git a/etherman/errors.go b/etherman/errors.go new file mode 100644 index 00000000..a2d748e7 --- /dev/null +++ b/etherman/errors.go @@ -0,0 +1,58 @@ +package etherman + +import ( + "errors" + "strings" +) + +var ( + // ErrGasRequiredExceedsAllowance gas required exceeds the allowance + ErrGasRequiredExceedsAllowance = errors.New("gas required exceeds allowance") + // ErrContentLengthTooLarge content length is too large + ErrContentLengthTooLarge = errors.New("content length too large") + // ErrTimestampMustBeInsideRange Timestamp must be inside range + ErrTimestampMustBeInsideRange = errors.New("timestamp must be inside range") + // ErrInsufficientAllowance insufficient allowance + ErrInsufficientAllowance = errors.New("insufficient allowance") + // ErrBothGasPriceAndMaxFeeGasAreSpecified both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified + ErrBothGasPriceAndMaxFeeGasAreSpecified = errors.New( + "both gasPrice and (maxFeePerGas or maxPriorityFeePerGas) specified", + ) + // ErrMaxFeeGasAreSpecifiedButLondonNotActive maxFeePerGas or maxPriorityFeePerGas + // specified but london fork is not active yet + ErrMaxFeeGasAreSpecifiedButLondonNotActive = errors.New( + "maxFeePerGas or maxPriorityFeePerGas specified but london is not active yet", + ) + // ErrNoSigner no signer to authorize the transaction with + ErrNoSigner = errors.New("no signer to authorize the transaction with") + // ErrMissingTrieNode means that a node is missing on the trie + ErrMissingTrieNode = errors.New("missing trie node") + // ErrNotFound is used when the object is not found + ErrNotFound = errors.New("not found") + // ErrPrivateKeyNotFound used when the provided sender does not have a private key registered to be used + ErrPrivateKeyNotFound = errors.New("can't find sender private key to sign tx") + + errorsCache = map[string]error{ + ErrGasRequiredExceedsAllowance.Error(): ErrGasRequiredExceedsAllowance, + ErrContentLengthTooLarge.Error(): ErrContentLengthTooLarge, + ErrTimestampMustBeInsideRange.Error(): ErrTimestampMustBeInsideRange, + ErrInsufficientAllowance.Error(): ErrInsufficientAllowance, + ErrBothGasPriceAndMaxFeeGasAreSpecified.Error(): ErrBothGasPriceAndMaxFeeGasAreSpecified, + ErrMaxFeeGasAreSpecifiedButLondonNotActive.Error(): ErrMaxFeeGasAreSpecifiedButLondonNotActive, + ErrNoSigner.Error(): ErrNoSigner, + ErrMissingTrieNode.Error(): ErrMissingTrieNode, + } +) + +func TryParseError(err error) (error, bool) { + parsedError, exists := errorsCache[err.Error()] + if !exists { + for errStr, actualErr := range errorsCache { + if strings.Contains(err.Error(), errStr) { + return actualErr, true + } + } + } + + return parsedError, exists +} diff --git a/etherman/errors_test.go b/etherman/errors_test.go new file mode 100644 index 00000000..91ca6c50 --- /dev/null +++ b/etherman/errors_test.go @@ -0,0 +1,37 @@ +package etherman + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestTryParseWithExactMatch(t *testing.T) { + expected := ErrTimestampMustBeInsideRange + smartContractErr := expected + + actualErr, ok := TryParseError(smartContractErr) + + assert.ErrorIs(t, actualErr, expected) + assert.True(t, ok) +} + +func TestTryParseWithContains(t *testing.T) { + expected := ErrTimestampMustBeInsideRange + smartContractErr := fmt.Errorf(" execution reverted: ProofOfEfficiency::sequenceBatches: %w", expected) + + actualErr, ok := TryParseError(smartContractErr) + + assert.ErrorIs(t, actualErr, expected) + assert.True(t, ok) +} + +func TestTryParseWithNonExistingErr(t *testing.T) { + smartContractErr := fmt.Errorf("some non-existing err") + + actualErr, ok := TryParseError(smartContractErr) + + assert.Nil(t, actualErr) + assert.False(t, ok) +} diff --git a/etherman/etherman.go b/etherman/etherman.go new file mode 100644 index 00000000..ea4d396c --- /dev/null +++ b/etherman/etherman.go @@ -0,0 +1,499 @@ +package etherman + +import ( + "context" + "crypto/ecdsa" + "errors" + "fmt" + "math/big" + "os" + "path/filepath" + "time" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/idataavailabilityprotocol" + aggkitcommon "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/etherman/config" + "github.com/agglayer/aggkit/etherman/contracts" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/rpc" +) + +// EventOrder is the type used to identify the events order +type EventOrder string + +const ( + // GlobalExitRootsOrder identifies a GlobalExitRoot event + GlobalExitRootsOrder EventOrder = "GlobalExitRoots" + // L1InfoTreeOrder identifies a L1InTree event + L1InfoTreeOrder EventOrder = "L1InfoTreeOrder" + // SequenceBatchesOrder identifies a VerifyBatch event + SequenceBatchesOrder EventOrder = "SequenceBatches" + // ForcedBatchesOrder identifies a ForcedBatches event + ForcedBatchesOrder EventOrder = "ForcedBatches" + // TrustedVerifyBatchOrder identifies a TrustedVerifyBatch event + TrustedVerifyBatchOrder EventOrder = "TrustedVerifyBatch" + // VerifyBatchOrder identifies a VerifyBatch event + VerifyBatchOrder EventOrder = "VerifyBatch" + // SequenceForceBatchesOrder identifies a SequenceForceBatches event + SequenceForceBatchesOrder EventOrder = "SequenceForceBatches" + // ForkIDsOrder identifies an updateZkevmVersion event + ForkIDsOrder EventOrder = "forkIDs" +) + +type ethereumClient interface { + ethereum.ChainReader + ethereum.ChainStateReader + ethereum.ContractCaller + ethereum.GasEstimator + ethereum.GasPricer + ethereum.GasPricer1559 + ethereum.LogFilterer + ethereum.TransactionReader + ethereum.TransactionSender + + bind.DeployBackend +} + +// L1Config represents the configuration of the network used in L1 +type L1Config struct { + // Chain ID of the L1 network + L1ChainID uint64 `json:"chainId" mapstructure:"ChainID"` + // ZkEVMAddr Address of the L1 contract polygonZkEVMAddress + ZkEVMAddr common.Address `json:"polygonZkEVMAddress" mapstructure:"ZkEVMAddr"` + // RollupManagerAddr Address of the L1 contract + RollupManagerAddr common.Address `json:"polygonRollupManagerAddress" mapstructure:"RollupManagerAddr"` + // PolAddr Address of the L1 Pol token Contract + PolAddr common.Address `json:"polTokenAddress" mapstructure:"PolAddr"` + // GlobalExitRootManagerAddr Address of the L1 GlobalExitRootManager contract + GlobalExitRootManagerAddr common.Address `json:"polygonZkEVMGlobalExitRootAddress" mapstructure:"GlobalExitRootManagerAddr"` //nolint:lll +} + +// Client is a simple implementation of EtherMan. +type Client struct { + EthClient ethereumClient + DAProtocol *idataavailabilityprotocol.Idataavailabilityprotocol + + Contracts *contracts.Contracts + RollupID uint32 + + l1Cfg config.L1Config + cfg config.Config + auth map[common.Address]bind.TransactOpts // empty in case of read-only client +} + +func GetRollupID(l1Config config.L1Config, rollupAddr common.Address, ethClient bind.ContractBackend) (uint32, error) { + contracts, err := contracts.NewContracts(l1Config, ethClient) + if err != nil { + return 0, fmt.Errorf("error creating contracts. Err: %w", err) + } + rollupID, err := contracts.Banana.RollupManager.RollupAddressToID(&bind.CallOpts{Pending: false}, rollupAddr) + if err != nil { + log.Errorf("error getting rollupID from %s: %v", contracts.Banana.RollupManager.String(), err) + + return 0, fmt.Errorf("error calling contract RollupManager.RollupAddressToID(%s). Err: %w", rollupAddr.String(), err) + } + log.Infof("rollupID: %d (obtained from contract: %s )", rollupID, contracts.Banana.RollupManager.String()) + + return rollupID, nil +} + +// NewClient creates a new etherman. +func NewClient(cfg config.Config, l1Config config.L1Config, commonConfig aggkitcommon.Config) (*Client, error) { + // Connect to ethereum node + ethClient, err := ethclient.Dial(cfg.EthermanConfig.URL) + if err != nil { + log.Errorf("error connecting to %s: %+v", cfg.EthermanConfig.URL, err) + + return nil, err + } + L1chainID, err := ethClient.ChainID(context.Background()) + if err != nil { + log.Errorf("error getting L1chainID from %s: %+v", cfg.EthermanConfig.URL, err) + + return nil, err + } + log.Infof("L1ChainID: %d", L1chainID.Uint64()) + contracts, err := contracts.NewContracts(l1Config, ethClient) + if err != nil { + return nil, err + } + log.Info(contracts.String()) + // Get RollupID + rollupID, err := contracts.Banana.RollupManager.RollupAddressToID(&bind.CallOpts{Pending: false}, l1Config.ZkEVMAddr) + if err != nil { + log.Errorf("error getting rollupID from %s : %+v", contracts.Banana.RollupManager.String(), err) + + return nil, err + } + if rollupID == 0 { + return nil, errors.New( + "rollupID is 0, is not a valid value. Check that rollup Address is correct " + + l1Config.ZkEVMAddr.String(), + ) + } + log.Infof("rollupID: %d (obtenied from SMC: %s )", rollupID, contracts.Banana.RollupManager.String()) + + client := &Client{ + EthClient: ethClient, + Contracts: contracts, + + RollupID: rollupID, + l1Cfg: l1Config, + cfg: cfg, + auth: map[common.Address]bind.TransactOpts{}, + } + + if commonConfig.IsValidiumMode { + dapAddr, err := contracts.Banana.Rollup.DataAvailabilityProtocol(&bind.CallOpts{Pending: false}) + if err != nil { + return nil, err + } + + client.DAProtocol, err = idataavailabilityprotocol.NewIdataavailabilityprotocol(dapAddr, ethClient) + if err != nil { + return nil, err + } + } + + return client, nil +} + +// Order contains the event order to let the synchronizer store the information following this order. +type Order struct { + Name EventOrder + Pos int +} + +// WaitTxToBeMined waits for an L1 tx to be mined. It will return error if the tx is reverted or timeout is exceeded +func (etherMan *Client) WaitTxToBeMined( + ctx context.Context, tx *types.Transaction, timeout time.Duration, +) (bool, error) { + // err := operations.WaitTxToBeMined(ctx, etherMan.EthClient, tx, timeout) + // if errors.Is(err, context.DeadlineExceeded) { + // return false, nil + // } + // if err != nil { + // return false, err + // } + return true, nil +} + +// GetSendSequenceFee get super/trusted sequencer fee +func (etherMan *Client) GetSendSequenceFee(numBatches uint64) (*big.Int, error) { + f, err := etherMan.Contracts.Banana.RollupManager.GetBatchFee(&bind.CallOpts{Pending: false}) + if err != nil { + return nil, err + } + fee := new(big.Int).Mul(f, new(big.Int).SetUint64(numBatches)) + + return fee, nil +} + +// TrustedSequencer gets trusted sequencer address +func (etherMan *Client) TrustedSequencer() (common.Address, error) { + return etherMan.Contracts.Banana.Rollup.TrustedSequencer(&bind.CallOpts{Pending: false}) +} + +// HeaderByNumber returns a block header from the current canonical chain. If number is +// nil, the latest known header is returned. +func (etherMan *Client) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + return etherMan.EthClient.HeaderByNumber(ctx, number) +} + +// EthBlockByNumber function retrieves the ethereum block information by ethereum block number. +func (etherMan *Client) EthBlockByNumber(ctx context.Context, blockNumber uint64) (*types.Block, error) { + block, err := etherMan.EthClient.BlockByNumber(ctx, new(big.Int).SetUint64(blockNumber)) + if err != nil { + if errors.Is(err, ethereum.NotFound) || err.Error() == "block does not exist in blockchain" { + return nil, ErrNotFound + } + + return nil, err + } + + return block, nil +} + +// GetLatestBatchNumber function allows to retrieve the latest proposed batch in the smc +func (etherMan *Client) GetLatestBatchNumber() (uint64, error) { + rollupData, err := etherMan.Contracts.Banana.RollupManager.RollupIDToRollupData( + &bind.CallOpts{Pending: false}, + etherMan.RollupID, + ) + if err != nil { + return 0, err + } + + return rollupData.LastBatchSequenced, nil +} + +// GetLatestBlockNumber gets the latest block number from the ethereum +func (etherMan *Client) GetLatestBlockNumber(ctx context.Context) (uint64, error) { + return etherMan.getBlockNumber(ctx, rpc.LatestBlockNumber) +} + +// GetSafeBlockNumber gets the safe block number from the ethereum +func (etherMan *Client) GetSafeBlockNumber(ctx context.Context) (uint64, error) { + return etherMan.getBlockNumber(ctx, rpc.SafeBlockNumber) +} + +// GetFinalizedBlockNumber gets the Finalized block number from the ethereum +func (etherMan *Client) GetFinalizedBlockNumber(ctx context.Context) (uint64, error) { + return etherMan.getBlockNumber(ctx, rpc.FinalizedBlockNumber) +} + +// getBlockNumber gets the block header by the provided block number from the ethereum +func (etherMan *Client) getBlockNumber(ctx context.Context, blockNumber rpc.BlockNumber) (uint64, error) { + header, err := etherMan.EthClient.HeaderByNumber(ctx, big.NewInt(int64(blockNumber))) + if err != nil || header == nil { + return 0, err + } + + return header.Number.Uint64(), nil +} + +// GetLatestBlockTimestamp gets the latest block timestamp from the ethereum +func (etherMan *Client) GetLatestBlockTimestamp(ctx context.Context) (uint64, error) { + header, err := etherMan.EthClient.HeaderByNumber(ctx, nil) + if err != nil || header == nil { + return 0, err + } + + return header.Time, nil +} + +// GetLatestVerifiedBatchNum gets latest verified batch from ethereum +func (etherMan *Client) GetLatestVerifiedBatchNum() (uint64, error) { + rollupData, err := etherMan.Contracts.Banana.RollupManager.RollupIDToRollupData( + &bind.CallOpts{Pending: false}, + etherMan.RollupID, + ) + if err != nil { + return 0, err + } + + return rollupData.LastVerifiedBatch, nil +} + +// GetTx function get ethereum tx +func (etherMan *Client) GetTx(ctx context.Context, txHash common.Hash) (*types.Transaction, bool, error) { + return etherMan.EthClient.TransactionByHash(ctx, txHash) +} + +// GetTxReceipt function gets ethereum tx receipt +func (etherMan *Client) GetTxReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { + return etherMan.EthClient.TransactionReceipt(ctx, txHash) +} + +// GetTrustedSequencerURL Gets the trusted sequencer url from rollup smc +func (etherMan *Client) GetTrustedSequencerURL() (string, error) { + return etherMan.Contracts.Banana.Rollup.TrustedSequencerURL(&bind.CallOpts{Pending: false}) +} + +// GetL2ChainID returns L2 Chain ID +func (etherMan *Client) GetL2ChainID() (uint64, error) { + rollupData, err := etherMan.Contracts.Banana.RollupManager.RollupIDToRollupData( + &bind.CallOpts{Pending: false}, + etherMan.RollupID, + ) + log.Debug("chainID read from rollupManager: ", rollupData.ChainID) + if err != nil { + log.Debug("error from rollupManager: ", err) + + return 0, err + } else if rollupData.ChainID == 0 { + return rollupData.ChainID, fmt.Errorf("error: chainID received is 0") + } + + return rollupData.ChainID, nil +} + +// SendTx sends a tx to L1 +func (etherMan *Client) SendTx(ctx context.Context, tx *types.Transaction) error { + return etherMan.EthClient.SendTransaction(ctx, tx) +} + +// CurrentNonce returns the current nonce for the provided account +func (etherMan *Client) CurrentNonce(ctx context.Context, account common.Address) (uint64, error) { + return etherMan.EthClient.NonceAt(ctx, account, nil) +} + +// EstimateGas returns the estimated gas for the tx +func (etherMan *Client) EstimateGas( + ctx context.Context, from common.Address, to *common.Address, value *big.Int, data []byte, +) (uint64, error) { + return etherMan.EthClient.EstimateGas(ctx, ethereum.CallMsg{ + From: from, + To: to, + Value: value, + Data: data, + }) +} + +// CheckTxWasMined check if a tx was already mined +func (etherMan *Client) CheckTxWasMined(ctx context.Context, txHash common.Hash) (bool, *types.Receipt, error) { + receipt, err := etherMan.EthClient.TransactionReceipt(ctx, txHash) + if errors.Is(err, ethereum.NotFound) { + return false, nil, nil + } else if err != nil { + return false, nil, err + } + + return true, receipt, nil +} + +// SignTx tries to sign a transaction accordingly to the provided sender +func (etherMan *Client) SignTx( + ctx context.Context, sender common.Address, tx *types.Transaction, +) (*types.Transaction, error) { + auth, err := etherMan.getAuthByAddress(sender) + if errors.Is(err, ErrNotFound) { + return nil, ErrPrivateKeyNotFound + } + signedTx, err := auth.Signer(auth.From, tx) + if err != nil { + return nil, err + } + + return signedTx, nil +} + +// GetRevertMessage tries to get a revert message of a transaction +func (etherMan *Client) GetRevertMessage(ctx context.Context, tx *types.Transaction) (string, error) { + // if tx == nil { + // return "", nil + // } + + // receipt, err := etherMan.GetTxReceipt(ctx, tx.Hash()) + // if err != nil { + // return "", err + // } + + // if receipt.Status == types.ReceiptStatusFailed { + // revertMessage, err := operations.RevertReason(ctx, etherMan.EthClient, tx, receipt.BlockNumber) + // if err != nil { + // return "", err + // } + // return revertMessage, nil + // } + return "", nil +} + +// AddOrReplaceAuth adds an authorization or replace an existent one to the same account +func (etherMan *Client) AddOrReplaceAuth(auth bind.TransactOpts) error { + log.Infof("added or replaced authorization for address: %v", auth.From.String()) + etherMan.auth[auth.From] = auth + + return nil +} + +// LoadAuthFromKeyStore loads an authorization from a key store file +func (etherMan *Client) LoadAuthFromKeyStore(path, password string) (*bind.TransactOpts, *ecdsa.PrivateKey, error) { + auth, pk, err := newAuthFromKeystore(path, password, etherMan.l1Cfg.L1ChainID) + if err != nil { + return nil, nil, err + } + + log.Infof("loaded authorization for address: %v", auth.From.String()) + etherMan.auth[auth.From] = auth + + return &auth, pk, nil +} + +// newKeyFromKeystore creates an instance of a keystore key from a keystore file +func newKeyFromKeystore(path, password string) (*keystore.Key, error) { + if path == "" && password == "" { + return nil, nil + } + keystoreEncrypted, err := os.ReadFile(filepath.Clean(path)) + if err != nil { + return nil, err + } + log.Infof("decrypting key from: %v", path) + key, err := keystore.DecryptKey(keystoreEncrypted, password) + if err != nil { + return nil, err + } + + return key, nil +} + +// newAuthFromKeystore an authorization instance from a keystore file +func newAuthFromKeystore(path, password string, chainID uint64) (bind.TransactOpts, *ecdsa.PrivateKey, error) { + log.Infof("reading key from: %v", path) + key, err := newKeyFromKeystore(path, password) + if err != nil { + return bind.TransactOpts{}, nil, err + } + if key == nil { + return bind.TransactOpts{}, nil, nil + } + auth, err := bind.NewKeyedTransactorWithChainID(key.PrivateKey, new(big.Int).SetUint64(chainID)) + if err != nil { + return bind.TransactOpts{}, nil, err + } + + return *auth, key.PrivateKey, nil +} + +// getAuthByAddress tries to get an authorization from the authorizations map +func (etherMan *Client) getAuthByAddress(addr common.Address) (bind.TransactOpts, error) { + auth, found := etherMan.auth[addr] + if !found { + return bind.TransactOpts{}, ErrNotFound + } + + return auth, nil +} + +// GetLatestBlockHeader gets the latest block header from the ethereum +func (etherMan *Client) GetLatestBlockHeader(ctx context.Context) (*types.Header, error) { + header, err := etherMan.EthClient.HeaderByNumber(ctx, big.NewInt(int64(rpc.LatestBlockNumber))) + if err != nil || header == nil { + return nil, err + } + + return header, nil +} + +// GetDAProtocolAddr returns the address of the data availability protocol +func (etherMan *Client) GetDAProtocolAddr() (common.Address, error) { + return etherMan.Contracts.Banana.Rollup.DataAvailabilityProtocol(&bind.CallOpts{Pending: false}) +} + +// GetDAProtocolName returns the name of the data availability protocol +func (etherMan *Client) GetDAProtocolName() (string, error) { + return etherMan.DAProtocol.GetProcotolName(&bind.CallOpts{Pending: false}) +} + +// LastAccInputHash gets the last acc input hash from the SC +func (etherMan *Client) LastAccInputHash() (common.Hash, error) { + return etherMan.Contracts.Banana.Rollup.LastAccInputHash(&bind.CallOpts{Pending: false}) +} + +// GetL1InfoRoot gets the L1 info root from the SC +func (etherMan *Client) GetL1InfoRoot(indexL1InfoRoot uint32) (common.Hash, error) { + // Get lastL1InfoTreeRoot (if index==0 then root=0, no call is needed) + var ( + lastL1InfoTreeRoot common.Hash + err error + ) + + if indexL1InfoRoot > 0 { + lastL1InfoTreeRoot, err = etherMan.Contracts.Banana.GlobalExitRoot.L1InfoRootMap( + &bind.CallOpts{Pending: false}, + indexL1InfoRoot, + ) + if err != nil { + log.Errorf("error calling SC globalexitroot L1InfoLeafMap: %v", err) + } + } + + return lastL1InfoTreeRoot, err +} diff --git a/etherman/types.go b/etherman/types.go new file mode 100644 index 00000000..0f705899 --- /dev/null +++ b/etherman/types.go @@ -0,0 +1,205 @@ +package etherman + +import ( + "fmt" + "math/big" + "reflect" + "time" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonvalidiumetrog" + "github.com/ethereum/go-ethereum/common" +) + +// Block struct +type Block struct { + BlockNumber uint64 + BlockHash common.Hash + ParentHash common.Hash + ForcedBatches []ForcedBatch + SequencedBatches [][]SequencedBatch + VerifiedBatches []VerifiedBatch + SequencedForceBatches [][]SequencedForceBatch + ForkIDs []ForkID + ReceivedAt time.Time + // GER data + GlobalExitRoots, L1InfoTree []GlobalExitRoot +} + +// GlobalExitRoot struct +type GlobalExitRoot struct { + BlockNumber uint64 + MainnetExitRoot common.Hash + RollupExitRoot common.Hash + GlobalExitRoot common.Hash + Timestamp time.Time + PreviousBlockHash common.Hash +} + +// PolygonZkEVMBatchData represents PolygonZkEVMBatchData +type PolygonZkEVMBatchData struct { + Transactions []byte + GlobalExitRoot [32]byte + Timestamp uint64 + MinForcedTimestamp uint64 +} + +// SequencedBatch represents virtual batch +type SequencedBatch struct { + BatchNumber uint64 + L1InfoRoot *common.Hash + SequencerAddr common.Address + TxHash common.Hash + Nonce uint64 + Coinbase common.Address + // Struct used in preEtrog forks + *PolygonZkEVMBatchData + // Struct used in Etrog + *polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData +} + +// ForcedBatch represents a ForcedBatch +type ForcedBatch struct { + BlockNumber uint64 + ForcedBatchNumber uint64 + Sequencer common.Address + GlobalExitRoot common.Hash + RawTxsData []byte + ForcedAt time.Time +} + +// VerifiedBatch represents a VerifiedBatch +type VerifiedBatch struct { + BlockNumber uint64 + BatchNumber uint64 + Aggregator common.Address + StateRoot common.Hash + TxHash common.Hash +} + +// SequencedForceBatch is a sturct to track the ForceSequencedBatches event. +type SequencedForceBatch struct { + BatchNumber uint64 + Coinbase common.Address + TxHash common.Hash + Timestamp time.Time + Nonce uint64 + polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData +} + +// ForkID is a sturct to track the ForkID event. +type ForkID struct { + BatchNumber uint64 + ForkID uint64 + Version string +} + +type BlockNumberFinality string + +const ( + SafeBlock = BlockNumberFinality("SafeBlock") + FinalizedBlock = BlockNumberFinality("FinalizedBlock") + LatestBlock = BlockNumberFinality("LatestBlock") + PendingBlock = BlockNumberFinality("PendingBlock") + EarliestBlock = BlockNumberFinality("EarliestBlock") +) + +func (b *BlockNumberFinality) ToBlockNum() (*big.Int, error) { + switch *b { + case FinalizedBlock: + return big.NewInt(int64(Finalized)), nil + case SafeBlock: + return big.NewInt(int64(Safe)), nil + case PendingBlock: + return big.NewInt(int64(Pending)), nil + case LatestBlock: + return big.NewInt(int64(Latest)), nil + case EarliestBlock: + return big.NewInt(int64(Earliest)), nil + default: + return nil, fmt.Errorf("invalid finality keyword: %s", string(*b)) + } +} + +type BlockNumber int64 + +const ( + Safe = BlockNumber(-4) + Finalized = BlockNumber(-3) + Latest = BlockNumber(-2) + Pending = BlockNumber(-1) + Earliest = BlockNumber(0) +) + +// Sequence represents an operation sent to the PoE smart contract to be +// processed. +type Sequence struct { + GlobalExitRoot, StateRoot, LocalExitRoot common.Hash + AccInputHash common.Hash + LastL2BLockTimestamp uint64 + BatchL2Data []byte + IsSequenceTooBig bool + BatchNumber uint64 + ForcedBatchTimestamp int64 + PrevBlockHash common.Hash + LastCoinbase common.Address +} + +// IsEmpty checks is sequence struct is empty +func (s Sequence) IsEmpty() bool { + return reflect.DeepEqual(s, Sequence{}) +} + +type Batch struct { + L2Data []byte + LastCoinbase common.Address + ForcedGlobalExitRoot common.Hash + ForcedBlockHashL1 common.Hash + ForcedBatchTimestamp uint64 + BatchNumber uint64 + L1InfoTreeIndex uint32 + LastL2BLockTimestamp uint64 + GlobalExitRoot common.Hash +} + +type SequenceBanana struct { + Batches []Batch + OldAccInputHash common.Hash + AccInputHash common.Hash + L1InfoRoot common.Hash + MaxSequenceTimestamp uint64 + CounterL1InfoRoot uint32 + L2Coinbase common.Address + LastVirtualBatchNumber uint64 +} + +func NewSequenceBanana(batches []Batch, l2Coinbase common.Address) *SequenceBanana { + var ( + maxSequenceTimestamp uint64 + indexL1InfoRoot uint32 + ) + + for _, batch := range batches { + if batch.LastL2BLockTimestamp > maxSequenceTimestamp { + maxSequenceTimestamp = batch.LastL2BLockTimestamp + } + + if batch.L1InfoTreeIndex > indexL1InfoRoot { + indexL1InfoRoot = batch.L1InfoTreeIndex + } + } + + return &SequenceBanana{ + Batches: batches, + MaxSequenceTimestamp: maxSequenceTimestamp, + CounterL1InfoRoot: indexL1InfoRoot, + L2Coinbase: l2Coinbase, + } +} + +func (s *SequenceBanana) Len() int { + return len(s.Batches) +} + +func (s *SequenceBanana) SetLastVirtualBatchNumber(batchNumber uint64) { + s.LastVirtualBatchNumber = batchNumber +} diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..785acaa5 --- /dev/null +++ b/go.mod @@ -0,0 +1,168 @@ +module github.com/agglayer/aggkit + +go 1.22.4 + +require ( + github.com/0xPolygon/cdk-contracts-tooling v0.0.1 + github.com/0xPolygon/cdk-data-availability v0.0.11 + github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6 + github.com/0xPolygon/zkevm-ethtx-manager v0.2.1 + github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.6 + github.com/ethereum/go-ethereum v1.14.8 + github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 + github.com/hermeznetwork/tracerr v0.3.2 + github.com/iden3/go-iden3-crypto v0.0.17 + github.com/invopop/jsonschema v0.12.0 + github.com/jackc/pgx/v4 v4.18.3 + github.com/knadh/koanf/parsers/json v0.1.0 + github.com/knadh/koanf/parsers/toml v0.1.0 + github.com/knadh/koanf/providers/rawbytes v0.1.0 + github.com/knadh/koanf/v2 v2.1.1 + github.com/mattn/go-sqlite3 v1.14.23 + github.com/mitchellh/mapstructure v1.5.0 + github.com/pelletier/go-toml/v2 v2.2.2 + github.com/rubenv/sql-migrate v1.7.0 + github.com/russross/meddler v1.0.1 + github.com/spf13/viper v1.19.0 + github.com/stretchr/testify v1.9.0 + github.com/urfave/cli/v2 v2.27.4 + github.com/valyala/fasttemplate v1.2.2 + go.opentelemetry.io/otel v1.24.0 + go.opentelemetry.io/otel/metric v1.24.0 + go.uber.org/zap v1.27.0 + golang.org/x/crypto v0.27.0 + golang.org/x/net v0.29.0 + golang.org/x/sync v0.9.0 + google.golang.org/grpc v1.64.0 + google.golang.org/protobuf v1.34.2 + modernc.org/sqlite v1.32.0 +) + +require ( + github.com/0xPolygon/cdk v0.1.0 // indirect + github.com/DataDog/zstd v1.5.6 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/StackExchange/wmi v1.2.1 // indirect + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.14.2 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect + github.com/buger/jsonparser v1.1.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cockroachdb/errors v1.11.3 // indirect + github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect + github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect + github.com/cockroachdb/pebble v1.1.2 // indirect + github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/consensys/bavard v0.1.13 // indirect + github.com/consensys/gnark-crypto v0.13.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect + github.com/crate-crypto/go-kzg-4844 v1.1.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/didip/tollbooth/v6 v6.1.2 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ethereum/c-kzg-4844 v1.0.3 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect + github.com/getsentry/sentry-go v0.28.1 // indirect + github.com/go-gorp/gorp/v3 v3.1.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-pkgz/expirable-cache v0.0.3 // indirect + github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect + github.com/gofrs/flock v0.12.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/hashicorp/go-bexpr v0.1.10 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.1-0.20180906183839-65a6292f0157 // indirect + github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.3.1 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.14.3 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/puddle v1.3.0 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/jmoiron/sqlx v1.2.0 // indirect + github.com/klauspost/compress v1.17.9 // indirect + github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/miguelmota/go-solidity-sha3 v0.1.1 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/pointerstructure v1.2.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.20.4 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rs/cors v1.7.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/status-im/keycard-go v0.2.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/subosito/gotenv v1.6.0 // indirect + github.com/supranational/blst v0.3.11 // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect + github.com/tklauser/go-sysconf v0.3.12 // indirect + github.com/tklauser/numcpus v0.6.1 // indirect + github.com/tyler-smith/go-bip39 v1.1.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect + github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.uber.org/multierr v1.10.0 // indirect + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a // indirect + modernc.org/libc v1.60.0 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.8.0 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 00000000..e9d89463 --- /dev/null +++ b/go.sum @@ -0,0 +1,646 @@ +github.com/0xPolygon/cdk v0.1.0 h1:gS5nLprJV1E48R6+fsTYWL2LrzFHK2ym+GNDnCXTuJk= +github.com/0xPolygon/cdk v0.1.0/go.mod h1:p4gFppiLHwouh77OQU3Z7iHrkkWp77FHqzQXrddUp8s= +github.com/0xPolygon/cdk-contracts-tooling v0.0.1 h1:2HH8KpO1CZRl1zHfn0IYwJhPA7l91DOWrjdExmaB9Kk= +github.com/0xPolygon/cdk-contracts-tooling v0.0.1/go.mod h1:mFlcEjsm2YBBsu8atHJ3zyVnwM+Z/fMXpVmIJge+WVU= +github.com/0xPolygon/cdk-data-availability v0.0.11 h1:enmlyFYCvmDmcX/2fnDjWnn3svqqm9o2Fe+Kupoykdo= +github.com/0xPolygon/cdk-data-availability v0.0.11/go.mod h1:20WaXcSp7ggoxWePL9ReKSuqksHUx5h8LNQ+b56OHJE= +github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6 h1:FXL/rcO7/GtZ3kRFw+C7J6vmGnl8gcazg+Gh/NVmnas= +github.com/0xPolygon/cdk-rpc v0.0.0-20241004114257-6c3cb6eebfb6/go.mod h1:2scWqMMufrQXu7TikDgQ3BsyaKoX8qP26D6E262vSOg= +github.com/0xPolygon/zkevm-ethtx-manager v0.2.1 h1:2Yb+KdJFMpVrS9LIkd658XiWuN+MCTs7SgeWaopXScg= +github.com/0xPolygon/zkevm-ethtx-manager v0.2.1/go.mod h1:lqQmzSo2OXEZItD0R4Cd+lqKFxphXEWgqHefVcGDZZc= +github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.6 h1:+XsCHXvQezRdMnkI37Wa/nV4sOZshJavxNzRpH/R6dw= +github.com/0xPolygonHermez/zkevm-synchronizer-l1 v1.0.6/go.mod h1:X4Su/M/+hSISqdl9yomKlRsbTyuZHsRohporyHsP8gg= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= +github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= +github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= +github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= +github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.14.2 h1:YXVoyPndbdvcEVcseEovVfp0qjJp7S+i5+xgp/Nfbdc= +github.com/bits-and-blooms/bitset v1.14.2/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/cespare/cp v1.1.1 h1:nCb6ZLdB7NRaqsm91JtQTAme2SKJzXVsdPIPkyJr1MU= +github.com/cespare/cp v1.1.1/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 h1:pU88SPhIFid6/k0egdR5V6eALQYq2qbSmukrkgIh/0A= +github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= +github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= +github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= +github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= +github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= +github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= +github.com/consensys/gnark-crypto v0.13.0 h1:VPULb/v6bbYELAPTDFINEVaMTTybV5GLxDdcjnS+4oc= +github.com/consensys/gnark-crypto v0.13.0/go.mod h1:wKqwsieaKPThcFkHe0d0zMsbHEUWFmZcG7KBCse210o= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= +github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= +github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= +github.com/crate-crypto/go-kzg-4844 v1.1.0/go.mod h1:JolLjpSff1tCCJKaJx4psrlEdlXuJEC996PL3tTAFks= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/didip/tollbooth/v6 v6.1.2 h1:Kdqxmqw9YTv0uKajBUiWQg+GURL/k4vy9gmLCL01PjQ= +github.com/didip/tollbooth/v6 v6.1.2/go.mod h1:xjcse6CTHCLuOkzsWrEgdy9WPJFv+p/x6v+MyfP+O9s= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= +github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= +github.com/ethereum/go-ethereum v1.14.8 h1:NgOWvXS+lauK+zFukEvi85UmmsS/OkV0N23UZ1VTIig= +github.com/ethereum/go-ethereum v1.14.8/go.mod h1:TJhyuDq0JDppAkFXgqjwpdlQApywnu/m10kFPxh8vvs= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4= +github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRtY6P5k= +github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= +github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-pkgz/expirable-cache v0.0.3 h1:rTh6qNPp78z0bQE6HDhXBHUwqnV9i09Vm6dksJLXQDc= +github.com/go-pkgz/expirable-cache v0.0.3/go.mod h1:+IauqN00R2FqNRLCLA+X5YljQJrwB179PfiAoMPlTlQ= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= +github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4= +github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd h1:gbpYu9NMq8jhDVbvlGkMFWCjLFlqqEZjEmObmhUy6Vo= +github.com/google/pprof v0.0.0-20240409012703-83162a5b38cd/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= +github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.1-0.20180906183839-65a6292f0157 h1:uyodBE3xDz0ynKs1tLBU26wOQoEkAqqiY18DbZ+FZrA= +github.com/hashicorp/hcl v1.0.1-0.20180906183839-65a6292f0157/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hermeznetwork/tracerr v0.3.2 h1:QB3TlQxO/4XHyixsg+nRZPuoel/FFQlQ7oAoHDD5l1c= +github.com/hermeznetwork/tracerr v0.3.2/go.mod h1:nsWC1+tc4qUEbUGRv4DcPJJTjLsedlPajlFmpJoohK4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/iden3/go-iden3-crypto v0.0.17 h1:NdkceRLJo/pI4UpcjVah4lN/a3yzxRUGXqxbWcYh9mY= +github.com/iden3/go-iden3-crypto v0.0.17/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= +github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10CvzRI= +github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= +github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0= +github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/parsers/json v0.1.0 h1:dzSZl5pf5bBcW0Acnu20Djleto19T0CfHcvZ14NJ6fU= +github.com/knadh/koanf/parsers/json v0.1.0/go.mod h1:ll2/MlXcZ2BfXD6YJcjVFzhG9P0TdJ207aIBKQhV2hY= +github.com/knadh/koanf/parsers/toml v0.1.0 h1:S2hLqS4TgWZYj4/7mI5m1CQQcWurxUz6ODgOub/6LCI= +github.com/knadh/koanf/parsers/toml v0.1.0/go.mod h1:yUprhq6eo3GbyVXFFMdbfZSo928ksS+uo0FFqNMnO18= +github.com/knadh/koanf/providers/rawbytes v0.1.0 h1:dpzgu2KO6uf6oCb4aP05KDmKmAmI51k5pe8RYKQ0qME= +github.com/knadh/koanf/providers/rawbytes v0.1.0/go.mod h1:mMTB1/IcJ/yE++A2iEZbY1MLygX7vttU+C+S/YmPu9c= +github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= +github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= +github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/miguelmota/go-solidity-sha3 v0.1.1 h1:3Y08sKZDtudtE5kbTBPC9RYJznoSYyWI9VD6mghU0CA= +github.com/miguelmota/go-solidity-sha3 v0.1.1/go.mod h1:sax1FvQF+f71j8W1uUHMZn8NxKyl5rYLks2nqj8RFEw= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= +github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= +github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/poy/onpar v1.1.2 h1:QaNrNiZx0+Nar5dLgTVp5mXkyoVFIbepjyEoGSnhbAY= +github.com/poy/onpar v1.1.2/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI= +github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/meddler v1.0.1 h1:JLR7Z4M4iGm1nr7DIURBq18UW8cTrm+qArUFgOhELo8= +github.com/russross/meddler v1.0.1/go.mod h1:GzGDChbFHuzxlFwt8gnJMRRNyFSQDSudmy2kHh7GYnQ= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= +github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= +github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= +github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= +github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/urfave/cli/v2 v2.27.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8= +github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= +github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= +google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ= +modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ= +modernc.org/ccgo/v4 v4.21.0 h1:kKPI3dF7RIag8YcToh5ZwDcVMIv6VGa0ED5cvh0LMW4= +modernc.org/ccgo/v4 v4.21.0/go.mod h1:h6kt6H/A2+ew/3MW/p6KEoQmrq/i3pr0J/SiwiaF/g0= +modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= +modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/gc/v2 v2.5.0 h1:bJ9ChznK1L1mUtAQtxi0wi5AtAs5jQuw4PrPHO5pb6M= +modernc.org/gc/v2 v2.5.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU= +modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a h1:CfbpOLEo2IwNzJdMvE8aiRbPMxoTpgAJeyePh0SmO8M= +modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.60.0 h1:XeRF1gXky7JE5E8IErtYAdKj+ykZPdYUsgJNQ8RFWIA= +modernc.org/libc v1.60.0/go.mod h1:xJuobKuNxKH3RUatS7GjR+suWj+5c2K7bi4m/S5arOY= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E= +modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc= +modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss= +modernc.org/sqlite v1.32.0 h1:6BM4uGza7bWypsw4fdLRsLxut6bHe4c58VeqjRgST8s= +modernc.org/sqlite v1.32.0/go.mod h1:UqoylwmTb9F+IqXERT8bW9zzOWN8qwAIcLdzeBZs4hA= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/hex/hex.go b/hex/hex.go new file mode 100644 index 00000000..c7e1f860 --- /dev/null +++ b/hex/hex.go @@ -0,0 +1,124 @@ +package hex + +import ( + "encoding/hex" + "fmt" + "math/big" + "strconv" + "strings" +) + +const ( + // Base represents the hexadecimal base, which is 16 + Base = 16 + + // BitSize64 64 bits + BitSize64 = 64 +) + +// DecError represents an error when decoding a hex value +type DecError struct{ msg string } + +func (err DecError) Error() string { return err.msg } + +// EncodeToHex generates a hex string based on the byte representation, with the '0x' prefix +func EncodeToHex(str []byte) string { + return "0x" + hex.EncodeToString(str) +} + +// EncodeToString is a wrapper method for hex.EncodeToString +func EncodeToString(str []byte) string { + return hex.EncodeToString(str) +} + +// DecodeString returns the byte representation of the hexadecimal string +func DecodeString(str string) ([]byte, error) { + return hex.DecodeString(str) +} + +// DecodeHex converts a hex string to a byte array +func DecodeHex(str string) ([]byte, error) { + str = strings.TrimPrefix(str, "0x") + + // Check if the string has an odd length + if len(str)%2 != 0 { + // Prepend a '0' to make it even-length + str = "0" + str + } + + return hex.DecodeString(str) +} + +// MustDecodeHex type-checks and converts a hex string to a byte array +func MustDecodeHex(str string) []byte { + buf, err := DecodeHex(str) + if err != nil { + panic(fmt.Errorf("could not decode hex: %w", err)) + } + + return buf +} + +// DecodeUint64 type-checks and converts a hex string to a uint64 +func DecodeUint64(str string) uint64 { + i := DecodeBig(str) + + return i.Uint64() +} + +// EncodeUint64 encodes a number as a hex string with 0x prefix. +func EncodeUint64(i uint64) string { + enc := make([]byte, 2, 10) //nolint:mnd + copy(enc, "0x") + + return string(strconv.AppendUint(enc, i, Base)) +} + +// BadNibble is a nibble that is bad +const BadNibble = ^uint64(0) + +// DecodeNibble decodes a byte into a uint64 +func DecodeNibble(in byte) uint64 { + switch { + case in >= '0' && in <= '9': + return uint64(in - '0') + case in >= 'A' && in <= 'F': + return uint64(in - 'A' + 10) //nolint:mnd + case in >= 'a' && in <= 'f': + return uint64(in - 'a' + 10) //nolint:mnd + default: + return BadNibble + } +} + +// EncodeBig encodes bigint as a hex string with 0x prefix. +// The sign of the integer is ignored. +func EncodeBig(bigint *big.Int) string { + numBits := bigint.BitLen() + if numBits == 0 { + return "0x0" + } + + return fmt.Sprintf("%#x", bigint) +} + +// DecodeBig converts a hex number to a big.Int value +func DecodeBig(hexNum string) *big.Int { + str := strings.TrimPrefix(hexNum, "0x") + createdNum := new(big.Int) + createdNum.SetString(str, Base) + + return createdNum +} + +// IsValid checks if the provided string is a valid hexadecimal value +func IsValid(s string) bool { + str := strings.TrimPrefix(s, "0x") + for _, b := range []byte(str) { + if !(b >= '0' && b <= '9' || b >= 'a' && b <= 'f' || b >= 'A' && b <= 'F') { + return false + } + } + + return true +} diff --git a/hex/hex_test.go b/hex/hex_test.go new file mode 100644 index 00000000..da86da35 --- /dev/null +++ b/hex/hex_test.go @@ -0,0 +1,52 @@ +package hex + +import ( + "encoding/hex" + "math" + "math/big" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestEncodeDecodeBig(t *testing.T) { + b := big.NewInt(math.MaxInt64) + e := EncodeBig(b) + d := DecodeBig(e) + assert.Equal(t, b.Uint64(), d.Uint64()) +} + +// Define a struct for test cases +type TestCase struct { + input string + output []byte + err error +} + +// Unit test function +func TestDecodeHex(t *testing.T) { + testCases := []TestCase{ + {"0", []byte{0}, nil}, + {"00", []byte{0}, nil}, + {"0x0", []byte{0}, nil}, + {"0x00", []byte{0}, nil}, + {"1", []byte{1}, nil}, + {"01", []byte{1}, nil}, + {"", []byte{}, hex.ErrLength}, + {"0x", []byte{}, hex.ErrLength}, + {"zz", []byte{}, hex.InvalidByteError('z')}, + } + + for _, tc := range testCases { + t.Run(tc.input, func(t *testing.T) { + output, err := DecodeHex(tc.input) + if tc.err != nil { + require.Error(t, tc.err, err) + } else { + require.NoError(t, err) + } + require.Equal(t, output, tc.output) + }) + } +} diff --git a/l1infotree/hash.go b/l1infotree/hash.go new file mode 100644 index 00000000..5a33f5a3 --- /dev/null +++ b/l1infotree/hash.go @@ -0,0 +1,45 @@ +package l1infotree + +import ( + "encoding/binary" + + "github.com/ethereum/go-ethereum/common" + "github.com/iden3/go-iden3-crypto/keccak256" + "golang.org/x/crypto/sha3" +) + +// Hash calculates the keccak hash of elements. +func Hash(data ...[32]byte) [32]byte { + var res [32]byte + hash := sha3.NewLegacyKeccak256() + for _, d := range data { + hash.Write(d[:]) + } + copy(res[:], hash.Sum(nil)) + + return res +} + +func generateZeroHashes(height uint8) [][32]byte { + var zeroHashes = [][32]byte{ + common.Hash{}, + } + // This generates a leaf = HashZero in position 0. In the rest of the positions that + // are equivalent to the ascending levels, we set the hashes of the nodes. + // So all nodes from level i=5 will have the same value and same children nodes. + for i := 1; i <= int(height); i++ { + zeroHashes = append(zeroHashes, Hash(zeroHashes[i-1], zeroHashes[i-1])) + } + + return zeroHashes +} + +// HashLeafData calculates the keccak hash of the leaf values. +func HashLeafData(ger, prevBlockHash common.Hash, minTimestamp uint64) [32]byte { + var res [32]byte + t := make([]byte, 8) //nolint:mnd + binary.BigEndian.PutUint64(t, minTimestamp) + copy(res[:], keccak256.Hash(ger.Bytes(), prevBlockHash.Bytes(), t)) + + return res +} diff --git a/l1infotree/hash_test.go b/l1infotree/hash_test.go new file mode 100644 index 00000000..a792c0b8 --- /dev/null +++ b/l1infotree/hash_test.go @@ -0,0 +1,20 @@ +package l1infotree + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" +) + +func TestHashLeaf(t *testing.T) { + expectedLeafHash := common.HexToHash("0xf62f487534b899b1c362242616725878188ca891fab60854b792ca0628286de7") + + prevBlockHash := common.HexToHash("0x24a5871d68723340d9eadc674aa8ad75f3e33b61d5a9db7db92af856a19270bb") + var minTimestamp uint64 = 1697231573 + ger := common.HexToHash("0x16994edfddddb9480667b64174fc00d3b6da7290d37b8db3a16571b4ddf0789f") + + leaf := HashLeafData(ger, prevBlockHash, minTimestamp) + + assert.Equal(t, expectedLeafHash, common.BytesToHash(leaf[:])) +} diff --git a/l1infotree/tree.go b/l1infotree/tree.go new file mode 100644 index 00000000..6f224a42 --- /dev/null +++ b/l1infotree/tree.go @@ -0,0 +1,206 @@ +package l1infotree + +import ( + "fmt" + + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/common" +) + +// L1InfoTree provides methods to compute L1InfoTree +type L1InfoTree struct { + logger *log.Logger + height uint8 + zeroHashes [][32]byte + count uint32 + siblings [][32]byte + currentRoot common.Hash +} + +// NewL1InfoTree creates new L1InfoTree. +func NewL1InfoTree(logger *log.Logger, height uint8, initialLeaves [][32]byte) (*L1InfoTree, error) { + mt := &L1InfoTree{ + logger: logger, + zeroHashes: generateZeroHashes(height), + height: height, + count: uint32(len(initialLeaves)), + } + var err error + mt.siblings, mt.currentRoot, err = mt.initSiblings(initialLeaves) + if err != nil { + mt.logger.Error("error initializing siblings. Error: ", err) + + return nil, err + } + mt.logger.Debug("Initial count: ", mt.count) + mt.logger.Debug("Initial root: ", mt.currentRoot) + return mt, nil +} + +// ResetL1InfoTree resets the L1InfoTree. +func (mt *L1InfoTree) ResetL1InfoTree(initialLeaves [][32]byte) (*L1InfoTree, error) { + const defaultTreeHeight = 32 + mt.logger.Info("Resetting L1InfoTree...") + newMT := &L1InfoTree{ + zeroHashes: generateZeroHashes(defaultTreeHeight), + height: defaultTreeHeight, + count: uint32(len(initialLeaves)), + } + var err error + newMT.siblings, newMT.currentRoot, err = newMT.initSiblings(initialLeaves) + if err != nil { + mt.logger.Error("error initializing siblings. Error: ", err) + + return nil, err + } + mt.logger.Debug("Reset initial count: ", newMT.count) + mt.logger.Debug("Reset initial root: ", newMT.currentRoot) + return newMT, nil +} + +func buildIntermediate(leaves [][32]byte) ([][][]byte, [][32]byte) { + var ( + nodes [][][]byte + hashes [][32]byte + ) + for i := 0; i < len(leaves); i += 2 { + var left, right = i, i + 1 + hash := Hash(leaves[left], leaves[right]) + nodes = append(nodes, [][]byte{hash[:], leaves[left][:], leaves[right][:]}) + hashes = append(hashes, hash) + } + + return nodes, hashes +} + +// BuildL1InfoRoot computes the root given the leaves of the tree +func (mt *L1InfoTree) BuildL1InfoRoot(leaves [][32]byte) (common.Hash, error) { + var ( + nodes [][][][]byte + ns [][][]byte + ) + if len(leaves) == 0 { + leaves = append(leaves, mt.zeroHashes[0]) + } + + for h := uint8(0); h < mt.height; h++ { + if len(leaves)%2 == 1 { + leaves = append(leaves, mt.zeroHashes[h]) + } + ns, leaves = buildIntermediate(leaves) + nodes = append(nodes, ns) + } + if len(ns) != 1 { + return common.Hash{}, fmt.Errorf("error: more than one root detected: %+v", nodes) + } + + return common.BytesToHash(ns[0][0]), nil +} + +// ComputeMerkleProof computes the merkleProof and root given the leaves of the tree +func (mt *L1InfoTree) ComputeMerkleProof(gerIndex uint32, leaves [][32]byte) ([][32]byte, common.Hash, error) { + var ns [][][]byte + if len(leaves) == 0 { + leaves = append(leaves, mt.zeroHashes[0]) + } + var siblings [][32]byte + index := gerIndex + for h := uint8(0); h < mt.height; h++ { + if len(leaves)%2 == 1 { + leaves = append(leaves, mt.zeroHashes[h]) + } + if index >= uint32(len(leaves)) { + siblings = append(siblings, mt.zeroHashes[h]) + } else { + if index%2 == 1 { // If it is odd + siblings = append(siblings, leaves[index-1]) + } else { // It is even + siblings = append(siblings, leaves[index+1]) + } + } + var ( + nsi [][][]byte + hashes [][32]byte + ) + for i := 0; i < len(leaves); i += 2 { + var left, right = i, i + 1 + hash := Hash(leaves[left], leaves[right]) + nsi = append(nsi, [][]byte{hash[:], leaves[left][:], leaves[right][:]}) + hashes = append(hashes, hash) + } + // Find the index of the leaf in the next level of the tree. + // Divide the index by 2 to find the position in the upper level + index = uint32(float64(index) / 2) //nolint:mnd + ns = nsi + leaves = hashes + } + if len(ns) != 1 { + return nil, common.Hash{}, fmt.Errorf("error: more than one root detected: %+v", ns) + } + + return siblings, common.BytesToHash(ns[0][0]), nil +} + +// AddLeaf adds new leaves to the tree and computes the new root +func (mt *L1InfoTree) AddLeaf(index uint32, leaf [32]byte) (common.Hash, error) { + if index != mt.count { + return common.Hash{}, fmt.Errorf("mismatched leaf count: %d, expected: %d", index, mt.count) + } + cur := leaf + isFilledSubTree := true + + for h := uint8(0); h < mt.height; h++ { + if index&(1< 0 { + var child [32]byte + copy(child[:], cur[:]) + parent := Hash(mt.siblings[h], child) + cur = parent + } else { + if isFilledSubTree { + // we will update the sibling when the sub tree is complete + copy(mt.siblings[h][:], cur[:]) + // we have a left child in this layer, it means the right child is empty so the sub tree is not completed + isFilledSubTree = false + } + var child [32]byte + copy(child[:], cur[:]) + parent := Hash(child, mt.zeroHashes[h]) + cur = parent + // the sibling of 0 bit should be the zero hash, since we are in the last node of the tree + } + } + mt.currentRoot = cur + mt.count++ + + return cur, nil +} + +// initSiblings returns the siblings of the node at the given index. +// it is used to initialize the siblings array in the beginning. +func (mt *L1InfoTree) initSiblings(initialLeaves [][32]byte) ([][32]byte, common.Hash, error) { + if mt.count != uint32(len(initialLeaves)) { + return nil, [32]byte{}, fmt.Errorf("error: mt.count and initialLeaves length mismatch") + } + if mt.count == 0 { + var siblings [][32]byte + for h := 0; h < int(mt.height); h++ { + var left [32]byte + copy(left[:], mt.zeroHashes[h][:]) + siblings = append(siblings, left) + } + root, err := mt.BuildL1InfoRoot(initialLeaves) + if err != nil { + mt.logger.Error("error calculating initial root: ", err) + return nil, [32]byte{}, err + } + + return siblings, root, nil + } + + return mt.ComputeMerkleProof(mt.count, initialLeaves) +} + +// GetCurrentRootCountAndSiblings returns the latest root, count and sibblings +func (mt *L1InfoTree) GetCurrentRootCountAndSiblings() (common.Hash, uint32, [][32]byte) { + return mt.currentRoot, mt.count, mt.siblings +} diff --git a/l1infotree/tree_test.go b/l1infotree/tree_test.go new file mode 100644 index 00000000..9e5f7ea1 --- /dev/null +++ b/l1infotree/tree_test.go @@ -0,0 +1,131 @@ +package l1infotree_test + +import ( + "encoding/hex" + "encoding/json" + "os" + "testing" + + "github.com/agglayer/aggkit/l1infotree" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/test/vectors" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestComputeTreeRoot(t *testing.T) { + data, err := os.ReadFile("../test/vectors/src/merkle-tree/l1-info-tree/root-vectors.json") + require.NoError(t, err) + var mtTestVectors []vectors.L1InfoTree + err = json.Unmarshal(data, &mtTestVectors) + require.NoError(t, err) + for _, testVector := range mtTestVectors { + input := testVector.PreviousLeafValues + mt, err := l1infotree.NewL1InfoTree(log.GetDefaultLogger(), uint8(32), [][32]byte{}) + require.NoError(t, err) + + var leaves [][32]byte + for _, v := range input { + leaves = append(leaves, v) + } + + if len(leaves) != 0 { + root, err := mt.BuildL1InfoRoot(leaves) + require.NoError(t, err) + require.Equal(t, testVector.CurrentRoot, root) + } + + leaves = append(leaves, testVector.NewLeafValue) + newRoot, err := mt.BuildL1InfoRoot(leaves) + require.NoError(t, err) + require.Equal(t, testVector.NewRoot, newRoot) + } +} + +func TestComputeMerkleProof(t *testing.T) { + logger := log.GetDefaultLogger() + mt, err := l1infotree.NewL1InfoTree(logger, uint8(32), [][32]byte{}) + require.NoError(t, err) + leaves := [][32]byte{ + common.HexToHash("0x83fc198de31e1b2b1a8212d2430fbb7766c13d9ad305637dea3759065606475d"), + common.HexToHash("0x83fc198de31e1b2b1a8212d2430fbb7766c13d9ad305637dea3759065606475d"), + common.HexToHash("0x0349657c7850dc9b2b73010501b01cd6a38911b6a2ad2167c164c5b2a5b344de"), + common.HexToHash("0xb32f96fad8af99f3b3cb90dfbb4849f73435dbee1877e4ac2c213127379549ce"), + common.HexToHash("0x79ffa1294bf48e0dd41afcb23b2929921e4e17f2f81b7163c23078375b06ba4f"), + common.HexToHash("0x0004063b5c83f56a17f580db0908339c01206cdf8b59beb13ce6f146bb025fe2"), + common.HexToHash("0x68e4f2c517c7f60c3664ac6bbe78f904eacdbe84790aa0d15d79ddd6216c556e"), + common.HexToHash("0xf7245f4d84367a189b90873e4563a000702dbfe974b872fdb13323a828c8fb71"), + common.HexToHash("0x0e43332c71c6e2f4a48326258ea17b75d77d3063a4127047dd32a4cb089e62a4"), + common.HexToHash("0xd35a1dc90098c0869a69891094c119eb281cee1a7829d210df1bf8afbea08adc"), + common.HexToHash("0x13bffd0da370d1e80a470821f1bee9607f116881feb708f1ec255da1689164b3"), + common.HexToHash("0x5fa79a24c9bc73cd507b02e5917cef9782529080aa75eacb2bf4e1d45fda7f1d"), + common.HexToHash("0x975b5bbc67345adc6ee6d1d67d1d5cd2a430c231d93e5a8b5a6f00b0c0862215"), + common.HexToHash("0x0d0fa887c045a53ec6212dee58964d0ae89595b7d11745a05c397240a4dceb20"), + common.HexToHash("0xa6ae5bc494a2ee0e5173d0e0b546533973104e0031c69d0cd65cdc7bb4d64670"), + common.HexToHash("0x21ccc18196a8fd74e720c6c129977d80bb804d3331673d6411871df14f7e7ae4"), + common.HexToHash("0xf8b1b98ac75bea8dbed034d0b3cd08b4c9275644c2242781a827e53deb2386c3"), + common.HexToHash("0x26401c418ef8bc5a80380f25f16dfc78b7053a26c0ca425fda294b1678b779fc"), + common.HexToHash("0xc53fd99005361738fc811ce87d194deed34a7f06ebd5371b19a008e8d1e8799f"), + common.HexToHash("0x570bd643e35fbcda95393994812d9212335e6bd4504b3b1dc8f3c6f1eeb247b2"), + common.HexToHash("0xb21ac971d007810540583bd3c0d4f35e0c2f4b62753e51c104a5753c6372caf8"), + common.HexToHash("0xb8dae305b34c749cbbd98993bfd71ec2323e8364861f25b4c5e0ac3c9587e16d"), + common.HexToHash("0x57c7fabd0f70e0059e871953fcb3dd43c6b8a5f348dbe771190cc8b0320336a5"), + common.HexToHash("0x95b0d23c347e2a88fc8e2ab900b09212a1295ab8f169075aa27e8719557d9b06"), + common.HexToHash("0x95b0d23c347e2a88fc8e2ab900b09212a1295ab8f169075aa27e8719557d9b06"), + common.HexToHash("0x95b0d23c347e2a88fc8e2ab900b09212a1295ab8f169075aa27e8719557d9b06"), + } + require.Equal(t, 26, len(leaves)) + siblings, root, err := mt.ComputeMerkleProof(1, leaves) + require.NoError(t, err) + require.Equal(t, "0x4ed479841384358f765966486782abb598ece1d4f834a22474050d66a18ad296", root.String()) + expectedProof := []string{"0x83fc198de31e1b2b1a8212d2430fbb7766c13d9ad305637dea3759065606475d", "0x2815e0bbb1ec18b8b1bc64454a86d072e12ee5d43bb559b44059e01edff0af7a", "0x7fb6cc0f2120368a845cf435da7102ff6e369280f787bc51b8a989fc178f7252", "0x407db5edcdc0ddd4f7327f208f46db40c4c4dbcc46c94a757e1d1654acbd8b72", "0xce2cdd1ef2e87e82264532285998ff37024404ab3a2b77b50eb1ad856ae83e14", "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9"} + for i := 0; i < len(siblings); i++ { + require.Equal(t, expectedProof[i], "0x"+hex.EncodeToString(siblings[i][:])) + } +} + +func TestAddLeaf(t *testing.T) { + data, err := os.ReadFile("../test/vectors/src/merkle-tree/l1-info-tree/proof-vectors.json") + require.NoError(t, err) + var mtTestVectors []vectors.L1InfoTreeProof + err = json.Unmarshal(data, &mtTestVectors) + require.NoError(t, err) + testVector := mtTestVectors[3] + var leaves [][32]byte + mt, err := l1infotree.NewL1InfoTree(log.GetDefaultLogger(), uint8(32), leaves) + require.NoError(t, err) + for _, leaf := range testVector.Leaves { + _, count, _ := mt.GetCurrentRootCountAndSiblings() + _, err := mt.AddLeaf(count, leaf) + require.NoError(t, err) + } + log.Debugf("%d leaves added successfully", len(testVector.Leaves)) + root, _, _ := mt.GetCurrentRootCountAndSiblings() + require.Equal(t, testVector.Root, root) + log.Debug("Final root: ", root) +} + +func TestAddLeaf2(t *testing.T) { + data, err := os.ReadFile("../test/vectors/src/merkle-tree/l1-info-tree/root-vectors.json") + require.NoError(t, err) + var mtTestVectors []vectors.L1InfoTree + err = json.Unmarshal(data, &mtTestVectors) + require.NoError(t, err) + for _, testVector := range mtTestVectors { + input := testVector.PreviousLeafValues + + var leaves [][32]byte + for _, v := range input { + leaves = append(leaves, v) + } + mt, err := l1infotree.NewL1InfoTree(log.GetDefaultLogger(), uint8(32), leaves) + require.NoError(t, err) + + initialRoot, count, _ := mt.GetCurrentRootCountAndSiblings() + require.Equal(t, testVector.CurrentRoot, initialRoot) + + newRoot, err := mt.AddLeaf(count, testVector.NewLeafValue) + require.NoError(t, err) + require.Equal(t, testVector.NewRoot, newRoot) + } +} diff --git a/l1infotreesync/config.go b/l1infotreesync/config.go new file mode 100644 index 00000000..1ceef331 --- /dev/null +++ b/l1infotreesync/config.go @@ -0,0 +1,20 @@ +package l1infotreesync + +import ( + "github.com/agglayer/aggkit/config/types" + "github.com/ethereum/go-ethereum/common" +) + +type Config struct { + DBPath string `mapstructure:"DBPath"` + GlobalExitRootAddr common.Address `mapstructure:"GlobalExitRootAddr"` + RollupManagerAddr common.Address `mapstructure:"RollupManagerAddr"` + SyncBlockChunkSize uint64 `mapstructure:"SyncBlockChunkSize"` + // BlockFinality indicates the status of the blocks that will be queried in order to sync + BlockFinality string `jsonschema:"enum=LatestBlock, enum=SafeBlock, enum=PendingBlock, enum=FinalizedBlock, enum=EarliestBlock" mapstructure:"BlockFinality"` //nolint:lll + URLRPCL1 string `mapstructure:"URLRPCL1"` + WaitForNewBlocksPeriod types.Duration `mapstructure:"WaitForNewBlocksPeriod"` + InitialBlock uint64 `mapstructure:"InitialBlock"` + RetryAfterErrorPeriod types.Duration `mapstructure:"RetryAfterErrorPeriod"` + MaxRetryAttemptsAfterError int `mapstructure:"MaxRetryAttemptsAfterError"` +} diff --git a/l1infotreesync/downloader.go b/l1infotreesync/downloader.go new file mode 100644 index 00000000..073547c2 --- /dev/null +++ b/l1infotreesync/downloader.go @@ -0,0 +1,191 @@ +package l1infotreesync + +import ( + "fmt" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/etrog/polygonrollupmanager" + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/polygonzkevmglobalexitrootv2" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sync" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +var ( + updateL1InfoTreeSignatureV1 = crypto.Keccak256Hash([]byte("UpdateL1InfoTree(bytes32,bytes32)")) + updateL1InfoTreeSignatureV2 = crypto.Keccak256Hash([]byte("UpdateL1InfoTreeV2(bytes32,uint32,uint256,uint64)")) + verifyBatchesSignature = crypto.Keccak256Hash( + []byte("VerifyBatches(uint32,uint64,bytes32,bytes32,address)"), + ) + verifyBatchesTrustedAggregatorSignature = crypto.Keccak256Hash( + []byte("VerifyBatchesTrustedAggregator(uint32,uint64,bytes32,bytes32,address)"), + ) + initL1InfoRootMapSignature = crypto.Keccak256Hash([]byte("InitL1InfoRootMap(uint32,bytes32)")) +) + +type EthClienter interface { + ethereum.LogFilterer + ethereum.BlockNumberReader + ethereum.ChainReader + bind.ContractBackend +} + +func checkSMCIsRollupManager(rollupManagerAddr common.Address, + rollupManagerContract *polygonrollupmanager.Polygonrollupmanager) error { + bridgeAddr, err := rollupManagerContract.BridgeAddress(nil) + if err != nil { + return fmt.Errorf("fail sanity check RollupManager(%s) Contract. Err: %w", rollupManagerAddr.String(), err) + } + log.Infof("sanity check rollupManager(%s) OK. bridgeAddr: %s", rollupManagerAddr.String(), bridgeAddr.String()) + return nil +} + +func checkSMCIsGlobalExitRoot(globalExitRootAddr common.Address, + gerContract *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2) error { + depositCount, err := gerContract.DepositCount(nil) + if err != nil { + return fmt.Errorf("fail sanity check GlobalExitRoot(%s) Contract. Err: %w", globalExitRootAddr.String(), err) + } + log.Infof("sanity check GlobalExitRoot(%s) OK. DepositCount: %v", globalExitRootAddr.String(), depositCount) + return nil +} + +func sanityCheckContracts(globalExitRoot, rollupManager common.Address, + gerContract *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2, + rollupManagerContract *polygonrollupmanager.Polygonrollupmanager) error { + errGER := checkSMCIsGlobalExitRoot(globalExitRoot, gerContract) + errRollup := checkSMCIsRollupManager(rollupManager, rollupManagerContract) + if errGER != nil || errRollup != nil { + err := fmt.Errorf("sanityCheckContracts: fails sanity check contracts. ErrGER: %w, ErrRollup: %w", errGER, errRollup) + log.Error(err) + return err + } + return nil +} + +func createContracts(client EthClienter, globalExitRoot, rollupManager common.Address) ( + *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2, + *polygonrollupmanager.Polygonrollupmanager, + error) { + gerContract, err := polygonzkevmglobalexitrootv2.NewPolygonzkevmglobalexitrootv2(globalExitRoot, client) + if err != nil { + return nil, nil, err + } + + rollupManagerContract, err := polygonrollupmanager.NewPolygonrollupmanager(rollupManager, client) + if err != nil { + return nil, nil, err + } + return gerContract, rollupManagerContract, nil +} + +func buildAppender(client EthClienter, globalExitRoot, + rollupManager common.Address, flags CreationFlags) (sync.LogAppenderMap, error) { + ger, rm, err := createContracts(client, globalExitRoot, rollupManager) + if err != nil { + err := fmt.Errorf("buildAppender: fails contracts creation. Err:%w", err) + log.Error(err) + return nil, err + } + err = sanityCheckContracts(globalExitRoot, rollupManager, ger, rm) + if err != nil && flags&FlagAllowWrongContractsAddrs == 0 { + return nil, fmt.Errorf("buildAppender: fails sanity check contracts. Err:%w", err) + } + + appender := make(sync.LogAppenderMap) + appender[initL1InfoRootMapSignature] = func(b *sync.EVMBlock, l types.Log) error { + init, err := ger.ParseInitL1InfoRootMap(l) + if err != nil { + return fmt.Errorf( + "error parsing log %+v using ger.ParseInitL1InfoRootMap: %w", + l, err, + ) + } + b.Events = append(b.Events, Event{InitL1InfoRootMap: &InitL1InfoRootMap{ + LeafCount: init.LeafCount, + CurrentL1InfoRoot: init.CurrentL1InfoRoot, + }}) + + return nil + } + appender[updateL1InfoTreeSignatureV1] = func(b *sync.EVMBlock, l types.Log) error { + l1InfoTreeUpdate, err := ger.ParseUpdateL1InfoTree(l) + if err != nil { + return fmt.Errorf( + "error parsing log %+v using ger.ParseUpdateL1InfoTree: %w", + l, err, + ) + } + b.Events = append(b.Events, Event{UpdateL1InfoTree: &UpdateL1InfoTree{ + BlockPosition: uint64(l.Index), + MainnetExitRoot: l1InfoTreeUpdate.MainnetExitRoot, + RollupExitRoot: l1InfoTreeUpdate.RollupExitRoot, + ParentHash: b.ParentHash, + Timestamp: b.Timestamp, + }}) + + return nil + } + + appender[updateL1InfoTreeSignatureV2] = func(b *sync.EVMBlock, l types.Log) error { + l1InfoTreeUpdateV2, err := ger.ParseUpdateL1InfoTreeV2(l) + if err != nil { + return fmt.Errorf( + "error parsing log %+v using ger.ParseUpdateL1InfoTreeV2: %w", + l, err, + ) + } + b.Events = append(b.Events, Event{UpdateL1InfoTreeV2: &UpdateL1InfoTreeV2{ + CurrentL1InfoRoot: l1InfoTreeUpdateV2.CurrentL1InfoRoot, + LeafCount: l1InfoTreeUpdateV2.LeafCount, + Blockhash: common.BytesToHash(l1InfoTreeUpdateV2.Blockhash.Bytes()), + MinTimestamp: l1InfoTreeUpdateV2.MinTimestamp, + }}) + + return nil + } + // This event is coming from RollupManager + appender[verifyBatchesSignature] = func(b *sync.EVMBlock, l types.Log) error { + verifyBatches, err := rm.ParseVerifyBatches(l) + if err != nil { + return fmt.Errorf( + "error parsing log %+v using rm.ParseVerifyBatches: %w", + l, err, + ) + } + b.Events = append(b.Events, Event{VerifyBatches: &VerifyBatches{ + BlockPosition: uint64(l.Index), + RollupID: verifyBatches.RollupID, + NumBatch: verifyBatches.NumBatch, + StateRoot: verifyBatches.StateRoot, + ExitRoot: verifyBatches.ExitRoot, + Aggregator: verifyBatches.Aggregator, + }}) + + return nil + } + appender[verifyBatchesTrustedAggregatorSignature] = func(b *sync.EVMBlock, l types.Log) error { + verifyBatches, err := rm.ParseVerifyBatchesTrustedAggregator(l) + if err != nil { + return fmt.Errorf( + "error parsing log %+v using rm.ParseVerifyBatches: %w", + l, err, + ) + } + b.Events = append(b.Events, Event{VerifyBatches: &VerifyBatches{ + BlockPosition: uint64(l.Index), + RollupID: verifyBatches.RollupID, + NumBatch: verifyBatches.NumBatch, + StateRoot: verifyBatches.StateRoot, + ExitRoot: verifyBatches.ExitRoot, + Aggregator: verifyBatches.Aggregator, + }}) + + return nil + } + + return appender, nil +} diff --git a/l1infotreesync/downloader_test.go b/l1infotreesync/downloader_test.go new file mode 100644 index 00000000..e2f1ed33 --- /dev/null +++ b/l1infotreesync/downloader_test.go @@ -0,0 +1,55 @@ +package l1infotreesync + +import ( + "fmt" + "math/big" + "strings" + "testing" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/polygonzkevmglobalexitrootv2" + mocks_l1infotreesync "github.com/agglayer/aggkit/l1infotreesync/mocks" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestBuildAppenderErrorOnBadContractAddr(t *testing.T) { + l1Client := mocks_l1infotreesync.NewEthClienter(t) + globalExitRoot := common.HexToAddress("0x1") + rollupManager := common.HexToAddress("0x2") + l1Client.EXPECT().CallContract(mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("test-error")) + flags := FlagNone + _, err := buildAppender(l1Client, globalExitRoot, rollupManager, flags) + require.Error(t, err) +} + +func TestBuildAppenderBypassBadContractAddr(t *testing.T) { + l1Client := mocks_l1infotreesync.NewEthClienter(t) + globalExitRoot := common.HexToAddress("0x1") + rollupManager := common.HexToAddress("0x2") + l1Client.EXPECT().CallContract(mock.Anything, mock.Anything, mock.Anything).Return(nil, fmt.Errorf("test-error")) + flags := FlagAllowWrongContractsAddrs + _, err := buildAppender(l1Client, globalExitRoot, rollupManager, flags) + require.NoError(t, err) +} + +func TestBuildAppenderVerifiedContractAddr(t *testing.T) { + l1Client := mocks_l1infotreesync.NewEthClienter(t) + globalExitRoot := common.HexToAddress("0x1") + rollupManager := common.HexToAddress("0x2") + + smcAbi, err := abi.JSON(strings.NewReader(polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2ABI)) + require.NoError(t, err) + bigInt := big.NewInt(1) + returnGER, err := smcAbi.Methods["depositCount"].Outputs.Pack(bigInt) + require.NoError(t, err) + l1Client.EXPECT().CallContract(mock.Anything, mock.Anything, mock.Anything).Return(returnGER, nil).Once() + v := common.HexToAddress("0x1234") + returnRM, err := smcAbi.Methods["bridgeAddress"].Outputs.Pack(v) + require.NoError(t, err) + l1Client.EXPECT().CallContract(mock.Anything, mock.Anything, mock.Anything).Return(returnRM, nil).Once() + flags := FlagNone + _, err = buildAppender(l1Client, globalExitRoot, rollupManager, flags) + require.NoError(t, err) +} diff --git a/l1infotreesync/e2e_test.go b/l1infotreesync/e2e_test.go new file mode 100644 index 00000000..05893ff4 --- /dev/null +++ b/l1infotreesync/e2e_test.go @@ -0,0 +1,347 @@ +package l1infotreesync_test + +import ( + "context" + "fmt" + "math/big" + "path" + "strconv" + "testing" + "time" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/polygonzkevmglobalexitrootv2" + aggkittypes "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/l1infotreesync" + mocks_l1infotreesync "github.com/agglayer/aggkit/l1infotreesync/mocks" + "github.com/agglayer/aggkit/reorgdetector" + "github.com/agglayer/aggkit/test/contracts/verifybatchesmock" + "github.com/agglayer/aggkit/test/helpers" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func newSimulatedClient(t *testing.T) ( + *simulated.Backend, + *bind.TransactOpts, + common.Address, + common.Address, + *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2, + *verifybatchesmock.Verifybatchesmock, +) { + t.Helper() + ctx := context.Background() + + deployerAuth, err := helpers.CreateAccount(big.NewInt(1337)) + require.NoError(t, err) + + client, setup := helpers.NewSimulatedBackend(t, nil, deployerAuth) + + nonce, err := client.Client().PendingNonceAt(ctx, setup.UserAuth.From) + require.NoError(t, err) + + precalculatedGERAddr := crypto.CreateAddress(setup.UserAuth.From, nonce+1) + verifyAddr, _, verifyContract, err := verifybatchesmock.DeployVerifybatchesmock(setup.UserAuth, client.Client(), precalculatedGERAddr) + require.NoError(t, err) + client.Commit() + + gerAddr, _, gerContract, err := polygonzkevmglobalexitrootv2.DeployPolygonzkevmglobalexitrootv2(setup.UserAuth, client.Client(), verifyAddr, setup.UserAuth.From) + require.NoError(t, err) + require.Equal(t, precalculatedGERAddr, gerAddr) + client.Commit() + + err = setup.DeployBridge(client, gerAddr, 0) + require.NoError(t, err) + + return client, setup.UserAuth, gerAddr, verifyAddr, gerContract, verifyContract +} + +func TestE2E(t *testing.T) { + ctx, cancelCtx := context.WithCancel(context.Background()) + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestE2E.sqlite") + + rdm := mocks_l1infotreesync.NewReorgDetectorMock(t) + rdm.On("Subscribe", mock.Anything).Return(&reorgdetector.Subscription{}, nil) + rdm.On("AddBlockToTrack", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) + + client, auth, gerAddr, verifyAddr, gerSc, verifySC := newSimulatedClient(t) + syncer, err := l1infotreesync.New(ctx, dbPath, gerAddr, verifyAddr, 10, etherman.LatestBlock, rdm, client.Client(), time.Millisecond, 0, 100*time.Millisecond, 3, + l1infotreesync.FlagAllowWrongContractsAddrs) + require.NoError(t, err) + + go syncer.Start(ctx) + + // Update GER 3 times + for i := 0; i < 3; i++ { + tx, err := gerSc.UpdateExitRoot(auth, common.HexToHash(strconv.Itoa(i))) + require.NoError(t, err) + client.Commit() + g, err := gerSc.L1InfoRootMap(nil, uint32(i+1)) + require.NoError(t, err) + receipt, err := client.Client().TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) + // Let the processor catch up + helpers.RequireProcessorUpdated(t, syncer, receipt.BlockNumber.Uint64()) + + expectedGER, err := gerSc.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + info, err := syncer.GetInfoByIndex(ctx, uint32(i)) + require.NoError(t, err) + require.Equal(t, common.Hash(expectedGER), info.GlobalExitRoot, fmt.Sprintf("index: %d", i)) + require.Equal(t, receipt.BlockNumber.Uint64(), info.BlockNumber) + + expectedRoot, err := gerSc.GetRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + require.Equal(t, g, expectedRoot) + actualRoot, err := syncer.GetL1InfoTreeRootByIndex(ctx, uint32(i)) + require.NoError(t, err) + require.Equal(t, common.Hash(expectedRoot), actualRoot.Hash) + } + + // Restart syncer + cancelCtx() + ctx = context.Background() + go syncer.Start(ctx) + + // Update 3 rollups (verify batches event) 3 times + for rollupID := uint32(1); rollupID < 3; rollupID++ { + for i := 0; i < 3; i++ { + newLocalExitRoot := common.HexToHash(strconv.Itoa(int(rollupID)) + "ffff" + strconv.Itoa(i)) + tx, err := verifySC.VerifyBatches(auth, rollupID, 0, newLocalExitRoot, common.Hash{}, i%2 != 0) + require.NoError(t, err) + client.Commit() + receipt, err := client.Client().TransactionReceipt(ctx, tx.Hash()) + require.NoError(t, err) + require.Equal(t, receipt.Status, types.ReceiptStatusSuccessful) + require.True(t, len(receipt.Logs) == 1+i%2+i%2) + + // Let the processor catch + helpers.RequireProcessorUpdated(t, syncer, receipt.BlockNumber.Uint64()) + + // Assert rollup exit root + expectedRollupExitRoot, err := verifySC.GetRollupExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + actualRollupExitRoot, err := syncer.GetLastRollupExitRoot(ctx) + require.NoError(t, err) + require.Equal(t, common.Hash(expectedRollupExitRoot), actualRollupExitRoot.Hash, fmt.Sprintf("rollupID: %d, i: %d", rollupID, i)) + + // Assert verify batches + expectedVerify := l1infotreesync.VerifyBatches{ + BlockNumber: receipt.BlockNumber.Uint64(), + BlockPosition: uint64(i%2 + i%2), + RollupID: rollupID, + ExitRoot: newLocalExitRoot, + Aggregator: auth.From, + RollupExitRoot: expectedRollupExitRoot, + } + actualVerify, err := syncer.GetLastVerifiedBatches(rollupID) + require.NoError(t, err) + require.Equal(t, expectedVerify, *actualVerify) + } + } +} + +func TestWithReorgs(t *testing.T) { + ctx := context.Background() + dbPathSyncer := path.Join(t.TempDir(), "l1infotreesyncTestWithReorgs_sync.sqlite") + dbPathReorg := path.Join(t.TempDir(), "l1infotreesyncTestWithReorgs_reorg.sqlite") + + client, auth, gerAddr, verifyAddr, gerSc, verifySC := newSimulatedClient(t) + + rd, err := reorgdetector.New(client.Client(), reorgdetector.Config{DBPath: dbPathReorg, CheckReorgsInterval: aggkittypes.NewDuration(time.Millisecond * 30)}) + require.NoError(t, err) + require.NoError(t, rd.Start(ctx)) + + syncer, err := l1infotreesync.New(ctx, dbPathSyncer, gerAddr, verifyAddr, 10, etherman.LatestBlock, rd, client.Client(), time.Millisecond, 0, time.Second, 25, + l1infotreesync.FlagAllowWrongContractsAddrs) + require.NoError(t, err) + go syncer.Start(ctx) + + // Commit block + header, err := client.Client().HeaderByHash(ctx, client.Commit()) // Block 3 + require.NoError(t, err) + reorgFrom := header.Hash() + fmt.Println("start from header:", header.Number) + + updateL1InfoTreeAndRollupExitTree := func(i int, rollupID uint32) { + // Update L1 Info Tree + _, err := gerSc.UpdateExitRoot(auth, common.HexToHash(strconv.Itoa(i))) + require.NoError(t, err) + + // Update L1 Info Tree + Rollup Exit Tree + newLocalExitRoot := common.HexToHash(strconv.Itoa(i) + "ffff" + strconv.Itoa(1)) + _, err = verifySC.VerifyBatchesTrustedAggregator(auth, rollupID, 0, newLocalExitRoot, common.Hash{}, true) + require.NoError(t, err) + + // Update Rollup Exit Tree + newLocalExitRoot = common.HexToHash(strconv.Itoa(i) + "ffff" + strconv.Itoa(2)) + _, err = verifySC.VerifyBatchesTrustedAggregator(auth, rollupID, 0, newLocalExitRoot, common.Hash{}, false) + require.NoError(t, err) + } + + // create some events and update the trees + updateL1InfoTreeAndRollupExitTree(1, 1) + + // Block 4 + helpers.CommitBlocks(t, client, 1, time.Second*5) + + // Make sure syncer is up to date + waitForSyncerToCatchUp(ctx, t, syncer, client) + + // Assert rollup exit root + expectedRollupExitRoot, err := verifySC.GetRollupExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + actualRollupExitRoot, err := syncer.GetLastRollupExitRoot(ctx) + require.NoError(t, err) + require.Equal(t, common.Hash(expectedRollupExitRoot), actualRollupExitRoot.Hash) + + // Assert L1 Info tree root + expectedL1InfoRoot, err := gerSc.GetRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + expectedGER, err := gerSc.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + actualL1InfoRoot, err := syncer.GetLastL1InfoTreeRoot(ctx) + require.NoError(t, err) + info, err := syncer.GetInfoByIndex(ctx, actualL1InfoRoot.Index) + require.NoError(t, err) + + require.Equal(t, common.Hash(expectedL1InfoRoot), actualL1InfoRoot.Hash) + require.Equal(t, common.Hash(expectedGER), info.GlobalExitRoot, fmt.Sprintf("%+v", info)) + + // Forking from block 3 + err = client.Fork(reorgFrom) + require.NoError(t, err) + + // Block 4, 5, 6 after the fork + helpers.CommitBlocks(t, client, 3, time.Millisecond*500) + + // Make sure syncer is up to date + waitForSyncerToCatchUp(ctx, t, syncer, client) + + // Assert rollup exit root after the fork - should be zero since there are no events in the block after the fork + expectedRollupExitRoot, err = verifySC.GetRollupExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + actualRollupExitRoot, err = syncer.GetLastRollupExitRoot(ctx) + require.ErrorContains(t, err, "not found") // rollup exit tree reorged, it does not have any exits in it + require.Equal(t, common.Hash(expectedRollupExitRoot), actualRollupExitRoot.Hash) + + // Forking from block 3 again + err = client.Fork(reorgFrom) + require.NoError(t, err) + time.Sleep(time.Millisecond * 500) + + // create some events and update the trees + updateL1InfoTreeAndRollupExitTree(2, 1) + + // Block 4, 5, 6, 7 after the fork + helpers.CommitBlocks(t, client, 4, time.Millisecond*100) + + // Make sure syncer is up to date + waitForSyncerToCatchUp(ctx, t, syncer, client) + + // Assert rollup exit root after the fork - should be zero since there are no events in the block after the fork + expectedRollupExitRoot, err = verifySC.GetRollupExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + actualRollupExitRoot, err = syncer.GetLastRollupExitRoot(ctx) + require.NoError(t, err) + require.Equal(t, common.Hash(expectedRollupExitRoot), actualRollupExitRoot.Hash) +} + +func TestStressAndReorgs(t *testing.T) { + const ( + totalIterations = 3 + blocksInIteration = 140 + reorgEveryXIterations = 70 + reorgSizeInBlocks = 2 + maxRollupID = 31 + extraBlocksToMine = 10 + ) + + ctx := context.Background() + dbPathSyncer := path.Join(t.TempDir(), "l1infotreesyncTestStressAndReorgs_sync.sqlite") + dbPathReorg := path.Join(t.TempDir(), "l1infotreesyncTestStressAndReorgs_reorg.sqlite") + + client, auth, gerAddr, verifyAddr, gerSc, verifySC := newSimulatedClient(t) + + rd, err := reorgdetector.New(client.Client(), reorgdetector.Config{DBPath: dbPathReorg, CheckReorgsInterval: aggkittypes.NewDuration(time.Millisecond * 100)}) + require.NoError(t, err) + require.NoError(t, rd.Start(ctx)) + + syncer, err := l1infotreesync.New(ctx, dbPathSyncer, gerAddr, verifyAddr, 10, etherman.LatestBlock, rd, client.Client(), time.Millisecond, 0, time.Second, 100, + l1infotreesync.FlagAllowWrongContractsAddrs) + require.NoError(t, err) + go syncer.Start(ctx) + + updateL1InfoTreeAndRollupExitTree := func(i, j int, rollupID uint32) { + // Update L1 Info Tree + _, err := gerSc.UpdateExitRoot(auth, common.HexToHash(strconv.Itoa(i))) + require.NoError(t, err) + + // Update L1 Info Tree + Rollup Exit Tree + newLocalExitRoot := common.HexToHash(strconv.Itoa(i) + "ffff" + strconv.Itoa(j)) + _, err = verifySC.VerifyBatches(auth, rollupID, 0, newLocalExitRoot, common.Hash{}, true) + require.NoError(t, err) + + // Update Rollup Exit Tree + newLocalExitRoot = common.HexToHash(strconv.Itoa(i) + "fffa" + strconv.Itoa(j)) + _, err = verifySC.VerifyBatches(auth, rollupID, 0, newLocalExitRoot, common.Hash{}, false) + require.NoError(t, err) + } + + for i := 1; i <= totalIterations; i++ { + for j := 1; j <= blocksInIteration; j++ { + helpers.CommitBlocks(t, client, 1, time.Millisecond*10) + if j%reorgEveryXIterations == 0 { + helpers.Reorg(t, client, reorgSizeInBlocks) + } else { + updateL1InfoTreeAndRollupExitTree(i, j, uint32(j%maxRollupID)+1) + } + } + } + + helpers.CommitBlocks(t, client, 1, time.Millisecond*10) + + waitForSyncerToCatchUp(ctx, t, syncer, client) + + // Assert rollup exit root + expectedRollupExitRoot, err := verifySC.GetRollupExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + actualRollupExitRoot, err := syncer.GetLastRollupExitRoot(ctx) + require.NoError(t, err) + require.Equal(t, common.Hash(expectedRollupExitRoot), actualRollupExitRoot.Hash) + + // Assert L1 Info tree root + expectedL1InfoRoot, err := gerSc.GetRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + expectedGER, err := gerSc.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + lastRoot, err := syncer.GetLastL1InfoTreeRoot(ctx) + require.NoError(t, err) + info, err := syncer.GetInfoByIndex(ctx, lastRoot.Index) + require.NoError(t, err, fmt.Sprintf("index: %d", lastRoot.Index)) + + t.Logf("expectedL1InfoRoot: %s", common.Hash(expectedL1InfoRoot).String()) + require.Equal(t, common.Hash(expectedGER), info.GlobalExitRoot, fmt.Sprintf("%+v", info)) + require.Equal(t, common.Hash(expectedL1InfoRoot), lastRoot.Hash) +} + +func waitForSyncerToCatchUp(ctx context.Context, t *testing.T, syncer *l1infotreesync.L1InfoTreeSync, client *simulated.Backend) { + t.Helper() + for { + lastBlockNum, err := client.Client().BlockNumber(ctx) + require.NoError(t, err) + helpers.RequireProcessorUpdated(t, syncer, lastBlockNum) + time.Sleep(time.Second / 2) + lastBlockNum2, err := client.Client().BlockNumber(ctx) + require.NoError(t, err) + if lastBlockNum == lastBlockNum2 { + return + } + } +} diff --git a/l1infotreesync/l1infotreesync.go b/l1infotreesync/l1infotreesync.go new file mode 100644 index 00000000..c686cb1a --- /dev/null +++ b/l1infotreesync/l1infotreesync.go @@ -0,0 +1,276 @@ +package l1infotreesync + +import ( + "context" + "errors" + "time" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/sync" + "github.com/agglayer/aggkit/tree" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" +) + +type CreationFlags uint64 + +const ( + reorgDetectorID = "l1infotreesync" + downloadBufferSize = 1000 + // CreationFlags defitinion + FlagNone CreationFlags = 0 + FlagAllowWrongContractsAddrs CreationFlags = 1 << iota // Allow to set wrong contracts addresses +) + +var ( + ErrNotFound = errors.New("l1infotreesync: not found") +) + +type L1InfoTreeSync struct { + processor *processor + driver *sync.EVMDriver +} + +// New creates a L1 Info tree syncer that syncs the L1 info tree +// and the rollup exit tree +func New( + ctx context.Context, + dbPath string, + globalExitRoot, rollupManager common.Address, + syncBlockChunkSize uint64, + blockFinalityType etherman.BlockNumberFinality, + rd sync.ReorgDetector, + l1Client EthClienter, + waitForNewBlocksPeriod time.Duration, + initialBlock uint64, + retryAfterErrorPeriod time.Duration, + maxRetryAttemptsAfterError int, + flags CreationFlags, +) (*L1InfoTreeSync, error) { + processor, err := newProcessor(dbPath) + if err != nil { + return nil, err + } + // TODO: get the initialBlock from L1 to simplify config + lastProcessedBlock, err := processor.GetLastProcessedBlock(ctx) + if err != nil { + return nil, err + } + if initialBlock > 0 && lastProcessedBlock < initialBlock-1 { + err = processor.ProcessBlock(ctx, sync.Block{ + Num: initialBlock - 1, + }) + if err != nil { + return nil, err + } + } + rh := &sync.RetryHandler{ + RetryAfterErrorPeriod: retryAfterErrorPeriod, + MaxRetryAttemptsAfterError: maxRetryAttemptsAfterError, + } + + appender, err := buildAppender(l1Client, globalExitRoot, rollupManager, flags) + if err != nil { + return nil, err + } + downloader, err := sync.NewEVMDownloader( + "l1infotreesync", + l1Client, + syncBlockChunkSize, + blockFinalityType, + waitForNewBlocksPeriod, + appender, + []common.Address{globalExitRoot, rollupManager}, + rh, + ) + if err != nil { + return nil, err + } + + driver, err := sync.NewEVMDriver(rd, processor, downloader, reorgDetectorID, downloadBufferSize, rh) + if err != nil { + return nil, err + } + + return &L1InfoTreeSync{ + processor: processor, + driver: driver, + }, nil +} + +// Start starts the synchronization process +func (s *L1InfoTreeSync) Start(ctx context.Context) { + s.driver.Sync(ctx) +} + +// GetL1InfoTreeMerkleProof creates a merkle proof for the L1 Info tree +func (s *L1InfoTreeSync) GetL1InfoTreeMerkleProof(ctx context.Context, index uint32) (types.Proof, types.Root, error) { + if s.processor.isHalted() { + return types.Proof{}, types.Root{}, sync.ErrInconsistentState + } + return s.processor.GetL1InfoTreeMerkleProof(ctx, index) +} + +// GetRollupExitTreeMerkleProof creates a merkle proof for the rollup exit tree +func (s *L1InfoTreeSync) GetRollupExitTreeMerkleProof( + ctx context.Context, + networkID uint32, + root common.Hash, +) (types.Proof, error) { + if s.processor.isHalted() { + return types.Proof{}, sync.ErrInconsistentState + } + if networkID == 0 { + return tree.EmptyProof, nil + } + + return s.processor.rollupExitTree.GetProof(ctx, networkID-1, root) +} + +func translateError(err error) error { + if errors.Is(err, db.ErrNotFound) { + return ErrNotFound + } + return err +} + +// GetLatestInfoUntilBlock returns the most recent L1InfoTreeLeaf that occurred before or at blockNum. +// If the blockNum has not been processed yet the error ErrBlockNotProcessed will be returned +// It can returns next errors: +// - ErrBlockNotProcessed, +// - ErrNotFound +func (s *L1InfoTreeSync) GetLatestInfoUntilBlock(ctx context.Context, blockNum uint64) (*L1InfoTreeLeaf, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + leaf, err := s.processor.GetLatestInfoUntilBlock(ctx, blockNum) + return leaf, translateError(err) +} + +// GetInfoByIndex returns the value of a leaf (not the hash) of the L1 info tree +func (s *L1InfoTreeSync) GetInfoByIndex(ctx context.Context, index uint32) (*L1InfoTreeLeaf, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetInfoByIndex(ctx, index) +} + +// GetL1InfoTreeRootByIndex returns the root of the L1 info tree at the moment the leaf with the given index was added +func (s *L1InfoTreeSync) GetL1InfoTreeRootByIndex(ctx context.Context, index uint32) (types.Root, error) { + if s.processor.isHalted() { + return types.Root{}, sync.ErrInconsistentState + } + return s.processor.l1InfoTree.GetRootByIndex(ctx, index) +} + +// GetLastRollupExitRoot return the last rollup exit root processed +func (s *L1InfoTreeSync) GetLastRollupExitRoot(ctx context.Context) (types.Root, error) { + if s.processor.isHalted() { + return types.Root{}, sync.ErrInconsistentState + } + return s.processor.rollupExitTree.GetLastRoot(nil) +} + +// GetLastL1InfoTreeRoot return the last root and index processed from the L1 Info tree +func (s *L1InfoTreeSync) GetLastL1InfoTreeRoot(ctx context.Context) (types.Root, error) { + if s.processor.isHalted() { + return types.Root{}, sync.ErrInconsistentState + } + return s.processor.l1InfoTree.GetLastRoot(nil) +} + +// GetLastProcessedBlock return the last processed block +func (s *L1InfoTreeSync) GetLastProcessedBlock(ctx context.Context) (uint64, error) { + if s.processor.isHalted() { + return 0, sync.ErrInconsistentState + } + return s.processor.GetLastProcessedBlock(ctx) +} + +func (s *L1InfoTreeSync) GetLocalExitRoot( + ctx context.Context, networkID uint32, rollupExitRoot common.Hash, +) (common.Hash, error) { + if s.processor.isHalted() { + return common.Hash{}, sync.ErrInconsistentState + } + if networkID == 0 { + return common.Hash{}, errors.New("network 0 is not a rollup, and it's not part of the rollup exit tree") + } + + return s.processor.rollupExitTree.GetLeaf(nil, networkID-1, rollupExitRoot) +} + +func (s *L1InfoTreeSync) GetLastVerifiedBatches(rollupID uint32) (*VerifyBatches, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetLastVerifiedBatches(rollupID) +} + +func (s *L1InfoTreeSync) GetFirstVerifiedBatches(rollupID uint32) (*VerifyBatches, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetFirstVerifiedBatches(rollupID) +} + +func (s *L1InfoTreeSync) GetFirstVerifiedBatchesAfterBlock(rollupID uint32, blockNum uint64) (*VerifyBatches, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetFirstVerifiedBatchesAfterBlock(rollupID, blockNum) +} + +func (s *L1InfoTreeSync) GetFirstL1InfoWithRollupExitRoot(rollupExitRoot common.Hash) (*L1InfoTreeLeaf, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetFirstL1InfoWithRollupExitRoot(rollupExitRoot) +} + +func (s *L1InfoTreeSync) GetLastInfo() (*L1InfoTreeLeaf, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetLastInfo() +} + +func (s *L1InfoTreeSync) GetFirstInfo() (*L1InfoTreeLeaf, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetFirstInfo() +} + +func (s *L1InfoTreeSync) GetFirstInfoAfterBlock(blockNum uint64) (*L1InfoTreeLeaf, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetFirstInfoAfterBlock(blockNum) +} + +func (s *L1InfoTreeSync) GetInfoByGlobalExitRoot(ger common.Hash) (*L1InfoTreeLeaf, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetInfoByGlobalExitRoot(ger) +} + +// GetL1InfoTreeMerkleProofFromIndexToRoot creates a merkle proof for the L1 Info tree +func (s *L1InfoTreeSync) GetL1InfoTreeMerkleProofFromIndexToRoot( + ctx context.Context, index uint32, root common.Hash, +) (types.Proof, error) { + if s.processor.isHalted() { + return types.Proof{}, sync.ErrInconsistentState + } + return s.processor.l1InfoTree.GetProof(ctx, index, root) +} + +// GetInitL1InfoRootMap returns the initial L1 info root map, nil if no root map has been set +func (s *L1InfoTreeSync) GetInitL1InfoRootMap(ctx context.Context) (*L1InfoTreeInitial, error) { + if s.processor.isHalted() { + return nil, sync.ErrInconsistentState + } + return s.processor.GetInitL1InfoRootMap(nil) +} diff --git a/l1infotreesync/l1infotreesync_test.go b/l1infotreesync/l1infotreesync_test.go new file mode 100644 index 00000000..be4eeb7b --- /dev/null +++ b/l1infotreesync/l1infotreesync_test.go @@ -0,0 +1,198 @@ +package l1infotreesync + +import ( + "context" + "errors" + "testing" + + "github.com/agglayer/aggkit/sync" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestGetL1InfoTreeMerkleProof(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, _, err := s.GetL1InfoTreeMerkleProof(context.Background(), 0) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetRollupExitTreeMerkleProof(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetRollupExitTreeMerkleProof(context.Background(), 0, common.Hash{}) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetLatestInfoUntilBlock(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetLatestInfoUntilBlock(context.Background(), 0) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetInfoByIndex(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetInfoByIndex(context.Background(), 0) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetL1InfoTreeRootByIndex(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetL1InfoTreeRootByIndex(context.Background(), 0) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetLastRollupExitRoot(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetLastRollupExitRoot(context.Background()) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetLastL1InfoTreeRoot(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetLastL1InfoTreeRoot(context.Background()) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetLastProcessedBlock(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetLastProcessedBlock(context.Background()) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetLocalExitRoot(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetLocalExitRoot(context.Background(), 0, common.Hash{}) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetLastVerifiedBatches(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetLastVerifiedBatches(0) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetFirstVerifiedBatches(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetFirstVerifiedBatches(0) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetFirstVerifiedBatchesAfterBlock(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetFirstVerifiedBatchesAfterBlock(0, 0) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetFirstL1InfoWithRollupExitRoot(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetFirstL1InfoWithRollupExitRoot(common.Hash{}) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetLastInfo(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetLastInfo() + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetFirstInfo(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetFirstInfo() + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetFirstInfoAfterBlock(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetFirstInfoAfterBlock(0) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} + +func TestGetL1InfoTreeMerkleProofFromIndexToRoot(t *testing.T) { + s := L1InfoTreeSync{ + processor: &processor{ + halted: true, + }, + } + _, err := s.GetL1InfoTreeMerkleProofFromIndexToRoot(context.Background(), 0, common.Hash{}) + require.Error(t, err) + require.True(t, errors.Is(err, sync.ErrInconsistentState)) +} diff --git a/l1infotreesync/migrations/l1infotreesync0001.sql b/l1infotreesync/migrations/l1infotreesync0001.sql new file mode 100644 index 00000000..7a689281 --- /dev/null +++ b/l1infotreesync/migrations/l1infotreesync0001.sql @@ -0,0 +1,34 @@ +-- +migrate Down +DROP TABLE IF EXISTS block; +DROP TABLE IF EXISTS claim; +DROP TABLE IF EXISTS bridge; + +-- +migrate Up +CREATE TABLE block ( + num BIGINT PRIMARY KEY +); + +CREATE TABLE l1info_leaf ( + block_num INTEGER NOT NULL REFERENCES block(num) ON DELETE CASCADE, + block_pos INTEGER NOT NULL, + position INTEGER NOT NULL, + previous_block_hash VARCHAR NOT NULL, + timestamp INTEGER NOT NULL, + mainnet_exit_root VARCHAR NOT NULL, + rollup_exit_root VARCHAR NOT NULL, + global_exit_root VARCHAR NOT NULL UNIQUE, + hash VARCHAR NOT NULL, + PRIMARY KEY (block_num, block_pos) +); + +CREATE TABLE verify_batches ( + block_num INTEGER NOT NULL REFERENCES block(num) ON DELETE CASCADE, + block_pos INTEGER NOT NULL, + rollup_id INTEGER NOT NULL, + batch_num INTEGER NOT NULL, + state_root VARCHAR NOT NULL, + exit_root VARCHAR NOT NULL, + aggregator VARCHAR NOT NULL, + rollup_exit_root VARCHAR NOT NULL, + PRIMARY KEY (block_num, block_pos) +); diff --git a/l1infotreesync/migrations/l1infotreesync0002.sql b/l1infotreesync/migrations/l1infotreesync0002.sql new file mode 100644 index 00000000..d1f09481 --- /dev/null +++ b/l1infotreesync/migrations/l1infotreesync0002.sql @@ -0,0 +1,14 @@ +-- +migrate Down +DROP TABLE IF EXISTS l1info_initial; + +-- +migrate Up + +CREATE TABLE l1info_initial ( + -- single_row_id prevent to have more than 1 row in this table + single_row_id INTEGER check(single_row_id=1) NOT NULL DEFAULT 1, + block_num INTEGER NOT NULL REFERENCES block(num) ON DELETE CASCADE, + leaf_count INTEGER NOT NULL, + l1_info_root VARCHAR NOT NULL, + PRIMARY KEY (single_row_id) +); + diff --git a/l1infotreesync/migrations/migrations.go b/l1infotreesync/migrations/migrations.go new file mode 100644 index 00000000..a1617842 --- /dev/null +++ b/l1infotreesync/migrations/migrations.go @@ -0,0 +1,46 @@ +package migrations + +import ( + _ "embed" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/db/types" + treeMigrations "github.com/agglayer/aggkit/tree/migrations" +) + +const ( + RollupExitTreePrefix = "rollup_exit_" + L1InfoTreePrefix = "l1_info_" +) + +//go:embed l1infotreesync0001.sql +var mig001 string + +//go:embed l1infotreesync0002.sql +var mig002 string + +func RunMigrations(dbPath string) error { + migrations := []types.Migration{ + { + ID: "l1infotreesync0001", + SQL: mig001, + }, + { + ID: "l1infotreesync0002", + SQL: mig002, + }, + } + for _, tm := range treeMigrations.Migrations { + migrations = append(migrations, types.Migration{ + ID: tm.ID, + SQL: tm.SQL, + Prefix: RollupExitTreePrefix, + }) + migrations = append(migrations, types.Migration{ + ID: tm.ID, + SQL: tm.SQL, + Prefix: L1InfoTreePrefix, + }) + } + return db.RunMigrations(dbPath, migrations) +} diff --git a/l1infotreesync/mocks/eth_clienter.go b/l1infotreesync/mocks/eth_clienter.go new file mode 100644 index 00000000..270c40d9 --- /dev/null +++ b/l1infotreesync/mocks/eth_clienter.go @@ -0,0 +1,1086 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_l1infotreesync + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + ethereum "github.com/ethereum/go-ethereum" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// EthClienter is an autogenerated mock type for the EthClienter type +type EthClienter struct { + mock.Mock +} + +type EthClienter_Expecter struct { + mock *mock.Mock +} + +func (_m *EthClienter) EXPECT() *EthClienter_Expecter { + return &EthClienter_Expecter{mock: &_m.Mock} +} + +// BlockByHash provides a mock function with given fields: ctx, hash +func (_m *EthClienter) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for BlockByHash") + } + + var r0 *types.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Block, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Block); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_BlockByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockByHash' +type EthClienter_BlockByHash_Call struct { + *mock.Call +} + +// BlockByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *EthClienter_Expecter) BlockByHash(ctx interface{}, hash interface{}) *EthClienter_BlockByHash_Call { + return &EthClienter_BlockByHash_Call{Call: _e.mock.On("BlockByHash", ctx, hash)} +} + +func (_c *EthClienter_BlockByHash_Call) Run(run func(ctx context.Context, hash common.Hash)) *EthClienter_BlockByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthClienter_BlockByHash_Call) Return(_a0 *types.Block, _a1 error) *EthClienter_BlockByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_BlockByHash_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Block, error)) *EthClienter_BlockByHash_Call { + _c.Call.Return(run) + return _c +} + +// BlockByNumber provides a mock function with given fields: ctx, number +func (_m *EthClienter) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for BlockByNumber") + } + + var r0 *types.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Block, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Block); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_BlockByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockByNumber' +type EthClienter_BlockByNumber_Call struct { + *mock.Call +} + +// BlockByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *EthClienter_Expecter) BlockByNumber(ctx interface{}, number interface{}) *EthClienter_BlockByNumber_Call { + return &EthClienter_BlockByNumber_Call{Call: _e.mock.On("BlockByNumber", ctx, number)} +} + +func (_c *EthClienter_BlockByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *EthClienter_BlockByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *EthClienter_BlockByNumber_Call) Return(_a0 *types.Block, _a1 error) *EthClienter_BlockByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_BlockByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*types.Block, error)) *EthClienter_BlockByNumber_Call { + _c.Call.Return(run) + return _c +} + +// BlockNumber provides a mock function with given fields: ctx +func (_m *EthClienter) BlockNumber(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for BlockNumber") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_BlockNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockNumber' +type EthClienter_BlockNumber_Call struct { + *mock.Call +} + +// BlockNumber is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthClienter_Expecter) BlockNumber(ctx interface{}) *EthClienter_BlockNumber_Call { + return &EthClienter_BlockNumber_Call{Call: _e.mock.On("BlockNumber", ctx)} +} + +func (_c *EthClienter_BlockNumber_Call) Run(run func(ctx context.Context)) *EthClienter_BlockNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthClienter_BlockNumber_Call) Return(_a0 uint64, _a1 error) *EthClienter_BlockNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_BlockNumber_Call) RunAndReturn(run func(context.Context) (uint64, error)) *EthClienter_BlockNumber_Call { + _c.Call.Return(run) + return _c +} + +// CallContract provides a mock function with given fields: ctx, call, blockNumber +func (_m *EthClienter) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + ret := _m.Called(ctx, call, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for CallContract") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg, *big.Int) ([]byte, error)); ok { + return rf(ctx, call, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg, *big.Int) []byte); ok { + r0 = rf(ctx, call, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg, *big.Int) error); ok { + r1 = rf(ctx, call, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_CallContract_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CallContract' +type EthClienter_CallContract_Call struct { + *mock.Call +} + +// CallContract is a helper method to define mock.On call +// - ctx context.Context +// - call ethereum.CallMsg +// - blockNumber *big.Int +func (_e *EthClienter_Expecter) CallContract(ctx interface{}, call interface{}, blockNumber interface{}) *EthClienter_CallContract_Call { + return &EthClienter_CallContract_Call{Call: _e.mock.On("CallContract", ctx, call, blockNumber)} +} + +func (_c *EthClienter_CallContract_Call) Run(run func(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int)) *EthClienter_CallContract_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.CallMsg), args[2].(*big.Int)) + }) + return _c +} + +func (_c *EthClienter_CallContract_Call) Return(_a0 []byte, _a1 error) *EthClienter_CallContract_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_CallContract_Call) RunAndReturn(run func(context.Context, ethereum.CallMsg, *big.Int) ([]byte, error)) *EthClienter_CallContract_Call { + _c.Call.Return(run) + return _c +} + +// CodeAt provides a mock function with given fields: ctx, contract, blockNumber +func (_m *EthClienter) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { + ret := _m.Called(ctx, contract, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for CodeAt") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) ([]byte, error)); ok { + return rf(ctx, contract, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) []byte); ok { + r0 = rf(ctx, contract, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, *big.Int) error); ok { + r1 = rf(ctx, contract, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_CodeAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CodeAt' +type EthClienter_CodeAt_Call struct { + *mock.Call +} + +// CodeAt is a helper method to define mock.On call +// - ctx context.Context +// - contract common.Address +// - blockNumber *big.Int +func (_e *EthClienter_Expecter) CodeAt(ctx interface{}, contract interface{}, blockNumber interface{}) *EthClienter_CodeAt_Call { + return &EthClienter_CodeAt_Call{Call: _e.mock.On("CodeAt", ctx, contract, blockNumber)} +} + +func (_c *EthClienter_CodeAt_Call) Run(run func(ctx context.Context, contract common.Address, blockNumber *big.Int)) *EthClienter_CodeAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address), args[2].(*big.Int)) + }) + return _c +} + +func (_c *EthClienter_CodeAt_Call) Return(_a0 []byte, _a1 error) *EthClienter_CodeAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_CodeAt_Call) RunAndReturn(run func(context.Context, common.Address, *big.Int) ([]byte, error)) *EthClienter_CodeAt_Call { + _c.Call.Return(run) + return _c +} + +// EstimateGas provides a mock function with given fields: ctx, call +func (_m *EthClienter) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error) { + ret := _m.Called(ctx, call) + + if len(ret) == 0 { + panic("no return value specified for EstimateGas") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) (uint64, error)); ok { + return rf(ctx, call) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) uint64); ok { + r0 = rf(ctx, call) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg) error); ok { + r1 = rf(ctx, call) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_EstimateGas_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateGas' +type EthClienter_EstimateGas_Call struct { + *mock.Call +} + +// EstimateGas is a helper method to define mock.On call +// - ctx context.Context +// - call ethereum.CallMsg +func (_e *EthClienter_Expecter) EstimateGas(ctx interface{}, call interface{}) *EthClienter_EstimateGas_Call { + return &EthClienter_EstimateGas_Call{Call: _e.mock.On("EstimateGas", ctx, call)} +} + +func (_c *EthClienter_EstimateGas_Call) Run(run func(ctx context.Context, call ethereum.CallMsg)) *EthClienter_EstimateGas_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.CallMsg)) + }) + return _c +} + +func (_c *EthClienter_EstimateGas_Call) Return(_a0 uint64, _a1 error) *EthClienter_EstimateGas_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_EstimateGas_Call) RunAndReturn(run func(context.Context, ethereum.CallMsg) (uint64, error)) *EthClienter_EstimateGas_Call { + _c.Call.Return(run) + return _c +} + +// FilterLogs provides a mock function with given fields: ctx, q +func (_m *EthClienter) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) { + ret := _m.Called(ctx, q) + + if len(ret) == 0 { + panic("no return value specified for FilterLogs") + } + + var r0 []types.Log + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery) ([]types.Log, error)); ok { + return rf(ctx, q) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery) []types.Log); ok { + r0 = rf(ctx, q) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.Log) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.FilterQuery) error); ok { + r1 = rf(ctx, q) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_FilterLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterLogs' +type EthClienter_FilterLogs_Call struct { + *mock.Call +} + +// FilterLogs is a helper method to define mock.On call +// - ctx context.Context +// - q ethereum.FilterQuery +func (_e *EthClienter_Expecter) FilterLogs(ctx interface{}, q interface{}) *EthClienter_FilterLogs_Call { + return &EthClienter_FilterLogs_Call{Call: _e.mock.On("FilterLogs", ctx, q)} +} + +func (_c *EthClienter_FilterLogs_Call) Run(run func(ctx context.Context, q ethereum.FilterQuery)) *EthClienter_FilterLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.FilterQuery)) + }) + return _c +} + +func (_c *EthClienter_FilterLogs_Call) Return(_a0 []types.Log, _a1 error) *EthClienter_FilterLogs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_FilterLogs_Call) RunAndReturn(run func(context.Context, ethereum.FilterQuery) ([]types.Log, error)) *EthClienter_FilterLogs_Call { + _c.Call.Return(run) + return _c +} + +// HeaderByHash provides a mock function with given fields: ctx, hash +func (_m *EthClienter) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for HeaderByHash") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Header, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Header); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_HeaderByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByHash' +type EthClienter_HeaderByHash_Call struct { + *mock.Call +} + +// HeaderByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *EthClienter_Expecter) HeaderByHash(ctx interface{}, hash interface{}) *EthClienter_HeaderByHash_Call { + return &EthClienter_HeaderByHash_Call{Call: _e.mock.On("HeaderByHash", ctx, hash)} +} + +func (_c *EthClienter_HeaderByHash_Call) Run(run func(ctx context.Context, hash common.Hash)) *EthClienter_HeaderByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthClienter_HeaderByHash_Call) Return(_a0 *types.Header, _a1 error) *EthClienter_HeaderByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_HeaderByHash_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Header, error)) *EthClienter_HeaderByHash_Call { + _c.Call.Return(run) + return _c +} + +// HeaderByNumber provides a mock function with given fields: ctx, number +func (_m *EthClienter) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for HeaderByNumber") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Header, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Header); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_HeaderByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByNumber' +type EthClienter_HeaderByNumber_Call struct { + *mock.Call +} + +// HeaderByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *EthClienter_Expecter) HeaderByNumber(ctx interface{}, number interface{}) *EthClienter_HeaderByNumber_Call { + return &EthClienter_HeaderByNumber_Call{Call: _e.mock.On("HeaderByNumber", ctx, number)} +} + +func (_c *EthClienter_HeaderByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *EthClienter_HeaderByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *EthClienter_HeaderByNumber_Call) Return(_a0 *types.Header, _a1 error) *EthClienter_HeaderByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_HeaderByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*types.Header, error)) *EthClienter_HeaderByNumber_Call { + _c.Call.Return(run) + return _c +} + +// PendingCodeAt provides a mock function with given fields: ctx, account +func (_m *EthClienter) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { + ret := _m.Called(ctx, account) + + if len(ret) == 0 { + panic("no return value specified for PendingCodeAt") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) ([]byte, error)); ok { + return rf(ctx, account) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) []byte); ok { + r0 = rf(ctx, account) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, account) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_PendingCodeAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PendingCodeAt' +type EthClienter_PendingCodeAt_Call struct { + *mock.Call +} + +// PendingCodeAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +func (_e *EthClienter_Expecter) PendingCodeAt(ctx interface{}, account interface{}) *EthClienter_PendingCodeAt_Call { + return &EthClienter_PendingCodeAt_Call{Call: _e.mock.On("PendingCodeAt", ctx, account)} +} + +func (_c *EthClienter_PendingCodeAt_Call) Run(run func(ctx context.Context, account common.Address)) *EthClienter_PendingCodeAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *EthClienter_PendingCodeAt_Call) Return(_a0 []byte, _a1 error) *EthClienter_PendingCodeAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_PendingCodeAt_Call) RunAndReturn(run func(context.Context, common.Address) ([]byte, error)) *EthClienter_PendingCodeAt_Call { + _c.Call.Return(run) + return _c +} + +// PendingNonceAt provides a mock function with given fields: ctx, account +func (_m *EthClienter) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { + ret := _m.Called(ctx, account) + + if len(ret) == 0 { + panic("no return value specified for PendingNonceAt") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) (uint64, error)); ok { + return rf(ctx, account) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) uint64); ok { + r0 = rf(ctx, account) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, account) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_PendingNonceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PendingNonceAt' +type EthClienter_PendingNonceAt_Call struct { + *mock.Call +} + +// PendingNonceAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +func (_e *EthClienter_Expecter) PendingNonceAt(ctx interface{}, account interface{}) *EthClienter_PendingNonceAt_Call { + return &EthClienter_PendingNonceAt_Call{Call: _e.mock.On("PendingNonceAt", ctx, account)} +} + +func (_c *EthClienter_PendingNonceAt_Call) Run(run func(ctx context.Context, account common.Address)) *EthClienter_PendingNonceAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *EthClienter_PendingNonceAt_Call) Return(_a0 uint64, _a1 error) *EthClienter_PendingNonceAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_PendingNonceAt_Call) RunAndReturn(run func(context.Context, common.Address) (uint64, error)) *EthClienter_PendingNonceAt_Call { + _c.Call.Return(run) + return _c +} + +// SendTransaction provides a mock function with given fields: ctx, tx +func (_m *EthClienter) SendTransaction(ctx context.Context, tx *types.Transaction) error { + ret := _m.Called(ctx, tx) + + if len(ret) == 0 { + panic("no return value specified for SendTransaction") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *types.Transaction) error); ok { + r0 = rf(ctx, tx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EthClienter_SendTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendTransaction' +type EthClienter_SendTransaction_Call struct { + *mock.Call +} + +// SendTransaction is a helper method to define mock.On call +// - ctx context.Context +// - tx *types.Transaction +func (_e *EthClienter_Expecter) SendTransaction(ctx interface{}, tx interface{}) *EthClienter_SendTransaction_Call { + return &EthClienter_SendTransaction_Call{Call: _e.mock.On("SendTransaction", ctx, tx)} +} + +func (_c *EthClienter_SendTransaction_Call) Run(run func(ctx context.Context, tx *types.Transaction)) *EthClienter_SendTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*types.Transaction)) + }) + return _c +} + +func (_c *EthClienter_SendTransaction_Call) Return(_a0 error) *EthClienter_SendTransaction_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthClienter_SendTransaction_Call) RunAndReturn(run func(context.Context, *types.Transaction) error) *EthClienter_SendTransaction_Call { + _c.Call.Return(run) + return _c +} + +// SubscribeFilterLogs provides a mock function with given fields: ctx, q, ch +func (_m *EthClienter) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { + ret := _m.Called(ctx, q, ch) + + if len(ret) == 0 { + panic("no return value specified for SubscribeFilterLogs") + } + + var r0 ethereum.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) (ethereum.Subscription, error)); ok { + return rf(ctx, q, ch) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) ethereum.Subscription); ok { + r0 = rf(ctx, q, ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ethereum.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) error); ok { + r1 = rf(ctx, q, ch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_SubscribeFilterLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeFilterLogs' +type EthClienter_SubscribeFilterLogs_Call struct { + *mock.Call +} + +// SubscribeFilterLogs is a helper method to define mock.On call +// - ctx context.Context +// - q ethereum.FilterQuery +// - ch chan<- types.Log +func (_e *EthClienter_Expecter) SubscribeFilterLogs(ctx interface{}, q interface{}, ch interface{}) *EthClienter_SubscribeFilterLogs_Call { + return &EthClienter_SubscribeFilterLogs_Call{Call: _e.mock.On("SubscribeFilterLogs", ctx, q, ch)} +} + +func (_c *EthClienter_SubscribeFilterLogs_Call) Run(run func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log)) *EthClienter_SubscribeFilterLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.FilterQuery), args[2].(chan<- types.Log)) + }) + return _c +} + +func (_c *EthClienter_SubscribeFilterLogs_Call) Return(_a0 ethereum.Subscription, _a1 error) *EthClienter_SubscribeFilterLogs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_SubscribeFilterLogs_Call) RunAndReturn(run func(context.Context, ethereum.FilterQuery, chan<- types.Log) (ethereum.Subscription, error)) *EthClienter_SubscribeFilterLogs_Call { + _c.Call.Return(run) + return _c +} + +// SubscribeNewHead provides a mock function with given fields: ctx, ch +func (_m *EthClienter) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) { + ret := _m.Called(ctx, ch) + + if len(ret) == 0 { + panic("no return value specified for SubscribeNewHead") + } + + var r0 ethereum.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) (ethereum.Subscription, error)); ok { + return rf(ctx, ch) + } + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) ethereum.Subscription); ok { + r0 = rf(ctx, ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ethereum.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, chan<- *types.Header) error); ok { + r1 = rf(ctx, ch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_SubscribeNewHead_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewHead' +type EthClienter_SubscribeNewHead_Call struct { + *mock.Call +} + +// SubscribeNewHead is a helper method to define mock.On call +// - ctx context.Context +// - ch chan<- *types.Header +func (_e *EthClienter_Expecter) SubscribeNewHead(ctx interface{}, ch interface{}) *EthClienter_SubscribeNewHead_Call { + return &EthClienter_SubscribeNewHead_Call{Call: _e.mock.On("SubscribeNewHead", ctx, ch)} +} + +func (_c *EthClienter_SubscribeNewHead_Call) Run(run func(ctx context.Context, ch chan<- *types.Header)) *EthClienter_SubscribeNewHead_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(chan<- *types.Header)) + }) + return _c +} + +func (_c *EthClienter_SubscribeNewHead_Call) Return(_a0 ethereum.Subscription, _a1 error) *EthClienter_SubscribeNewHead_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_SubscribeNewHead_Call) RunAndReturn(run func(context.Context, chan<- *types.Header) (ethereum.Subscription, error)) *EthClienter_SubscribeNewHead_Call { + _c.Call.Return(run) + return _c +} + +// SuggestGasPrice provides a mock function with given fields: ctx +func (_m *EthClienter) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for SuggestGasPrice") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_SuggestGasPrice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SuggestGasPrice' +type EthClienter_SuggestGasPrice_Call struct { + *mock.Call +} + +// SuggestGasPrice is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthClienter_Expecter) SuggestGasPrice(ctx interface{}) *EthClienter_SuggestGasPrice_Call { + return &EthClienter_SuggestGasPrice_Call{Call: _e.mock.On("SuggestGasPrice", ctx)} +} + +func (_c *EthClienter_SuggestGasPrice_Call) Run(run func(ctx context.Context)) *EthClienter_SuggestGasPrice_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthClienter_SuggestGasPrice_Call) Return(_a0 *big.Int, _a1 error) *EthClienter_SuggestGasPrice_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_SuggestGasPrice_Call) RunAndReturn(run func(context.Context) (*big.Int, error)) *EthClienter_SuggestGasPrice_Call { + _c.Call.Return(run) + return _c +} + +// SuggestGasTipCap provides a mock function with given fields: ctx +func (_m *EthClienter) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for SuggestGasTipCap") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_SuggestGasTipCap_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SuggestGasTipCap' +type EthClienter_SuggestGasTipCap_Call struct { + *mock.Call +} + +// SuggestGasTipCap is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthClienter_Expecter) SuggestGasTipCap(ctx interface{}) *EthClienter_SuggestGasTipCap_Call { + return &EthClienter_SuggestGasTipCap_Call{Call: _e.mock.On("SuggestGasTipCap", ctx)} +} + +func (_c *EthClienter_SuggestGasTipCap_Call) Run(run func(ctx context.Context)) *EthClienter_SuggestGasTipCap_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthClienter_SuggestGasTipCap_Call) Return(_a0 *big.Int, _a1 error) *EthClienter_SuggestGasTipCap_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_SuggestGasTipCap_Call) RunAndReturn(run func(context.Context) (*big.Int, error)) *EthClienter_SuggestGasTipCap_Call { + _c.Call.Return(run) + return _c +} + +// TransactionCount provides a mock function with given fields: ctx, blockHash +func (_m *EthClienter) TransactionCount(ctx context.Context, blockHash common.Hash) (uint, error) { + ret := _m.Called(ctx, blockHash) + + if len(ret) == 0 { + panic("no return value specified for TransactionCount") + } + + var r0 uint + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (uint, error)); ok { + return rf(ctx, blockHash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) uint); ok { + r0 = rf(ctx, blockHash) + } else { + r0 = ret.Get(0).(uint) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, blockHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_TransactionCount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransactionCount' +type EthClienter_TransactionCount_Call struct { + *mock.Call +} + +// TransactionCount is a helper method to define mock.On call +// - ctx context.Context +// - blockHash common.Hash +func (_e *EthClienter_Expecter) TransactionCount(ctx interface{}, blockHash interface{}) *EthClienter_TransactionCount_Call { + return &EthClienter_TransactionCount_Call{Call: _e.mock.On("TransactionCount", ctx, blockHash)} +} + +func (_c *EthClienter_TransactionCount_Call) Run(run func(ctx context.Context, blockHash common.Hash)) *EthClienter_TransactionCount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthClienter_TransactionCount_Call) Return(_a0 uint, _a1 error) *EthClienter_TransactionCount_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_TransactionCount_Call) RunAndReturn(run func(context.Context, common.Hash) (uint, error)) *EthClienter_TransactionCount_Call { + _c.Call.Return(run) + return _c +} + +// TransactionInBlock provides a mock function with given fields: ctx, blockHash, index +func (_m *EthClienter) TransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error) { + ret := _m.Called(ctx, blockHash, index) + + if len(ret) == 0 { + panic("no return value specified for TransactionInBlock") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash, uint) (*types.Transaction, error)); ok { + return rf(ctx, blockHash, index) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash, uint) *types.Transaction); ok { + r0 = rf(ctx, blockHash, index) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash, uint) error); ok { + r1 = rf(ctx, blockHash, index) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClienter_TransactionInBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransactionInBlock' +type EthClienter_TransactionInBlock_Call struct { + *mock.Call +} + +// TransactionInBlock is a helper method to define mock.On call +// - ctx context.Context +// - blockHash common.Hash +// - index uint +func (_e *EthClienter_Expecter) TransactionInBlock(ctx interface{}, blockHash interface{}, index interface{}) *EthClienter_TransactionInBlock_Call { + return &EthClienter_TransactionInBlock_Call{Call: _e.mock.On("TransactionInBlock", ctx, blockHash, index)} +} + +func (_c *EthClienter_TransactionInBlock_Call) Run(run func(ctx context.Context, blockHash common.Hash, index uint)) *EthClienter_TransactionInBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash), args[2].(uint)) + }) + return _c +} + +func (_c *EthClienter_TransactionInBlock_Call) Return(_a0 *types.Transaction, _a1 error) *EthClienter_TransactionInBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClienter_TransactionInBlock_Call) RunAndReturn(run func(context.Context, common.Hash, uint) (*types.Transaction, error)) *EthClienter_TransactionInBlock_Call { + _c.Call.Return(run) + return _c +} + +// NewEthClienter creates a new instance of EthClienter. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthClienter(t interface { + mock.TestingT + Cleanup(func()) +}) *EthClienter { + mock := &EthClienter{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/l1infotreesync/mocks/mock_reorgdetector.go b/l1infotreesync/mocks/mock_reorgdetector.go new file mode 100644 index 00000000..f92260c3 --- /dev/null +++ b/l1infotreesync/mocks/mock_reorgdetector.go @@ -0,0 +1,147 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_l1infotreesync + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + reorgdetector "github.com/agglayer/aggkit/reorgdetector" +) + +// ReorgDetectorMock is an autogenerated mock type for the ReorgDetector type +type ReorgDetectorMock struct { + mock.Mock +} + +type ReorgDetectorMock_Expecter struct { + mock *mock.Mock +} + +func (_m *ReorgDetectorMock) EXPECT() *ReorgDetectorMock_Expecter { + return &ReorgDetectorMock_Expecter{mock: &_m.Mock} +} + +// AddBlockToTrack provides a mock function with given fields: ctx, id, blockNum, blockHash +func (_m *ReorgDetectorMock) AddBlockToTrack(ctx context.Context, id string, blockNum uint64, blockHash common.Hash) error { + ret := _m.Called(ctx, id, blockNum, blockHash) + + if len(ret) == 0 { + panic("no return value specified for AddBlockToTrack") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, uint64, common.Hash) error); ok { + r0 = rf(ctx, id, blockNum, blockHash) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ReorgDetectorMock_AddBlockToTrack_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBlockToTrack' +type ReorgDetectorMock_AddBlockToTrack_Call struct { + *mock.Call +} + +// AddBlockToTrack is a helper method to define mock.On call +// - ctx context.Context +// - id string +// - blockNum uint64 +// - blockHash common.Hash +func (_e *ReorgDetectorMock_Expecter) AddBlockToTrack(ctx interface{}, id interface{}, blockNum interface{}, blockHash interface{}) *ReorgDetectorMock_AddBlockToTrack_Call { + return &ReorgDetectorMock_AddBlockToTrack_Call{Call: _e.mock.On("AddBlockToTrack", ctx, id, blockNum, blockHash)} +} + +func (_c *ReorgDetectorMock_AddBlockToTrack_Call) Run(run func(ctx context.Context, id string, blockNum uint64, blockHash common.Hash)) *ReorgDetectorMock_AddBlockToTrack_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(uint64), args[3].(common.Hash)) + }) + return _c +} + +func (_c *ReorgDetectorMock_AddBlockToTrack_Call) Return(_a0 error) *ReorgDetectorMock_AddBlockToTrack_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ReorgDetectorMock_AddBlockToTrack_Call) RunAndReturn(run func(context.Context, string, uint64, common.Hash) error) *ReorgDetectorMock_AddBlockToTrack_Call { + _c.Call.Return(run) + return _c +} + +// Subscribe provides a mock function with given fields: id +func (_m *ReorgDetectorMock) Subscribe(id string) (*reorgdetector.Subscription, error) { + ret := _m.Called(id) + + if len(ret) == 0 { + panic("no return value specified for Subscribe") + } + + var r0 *reorgdetector.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(string) (*reorgdetector.Subscription, error)); ok { + return rf(id) + } + if rf, ok := ret.Get(0).(func(string) *reorgdetector.Subscription); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*reorgdetector.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ReorgDetectorMock_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' +type ReorgDetectorMock_Subscribe_Call struct { + *mock.Call +} + +// Subscribe is a helper method to define mock.On call +// - id string +func (_e *ReorgDetectorMock_Expecter) Subscribe(id interface{}) *ReorgDetectorMock_Subscribe_Call { + return &ReorgDetectorMock_Subscribe_Call{Call: _e.mock.On("Subscribe", id)} +} + +func (_c *ReorgDetectorMock_Subscribe_Call) Run(run func(id string)) *ReorgDetectorMock_Subscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *ReorgDetectorMock_Subscribe_Call) Return(_a0 *reorgdetector.Subscription, _a1 error) *ReorgDetectorMock_Subscribe_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ReorgDetectorMock_Subscribe_Call) RunAndReturn(run func(string) (*reorgdetector.Subscription, error)) *ReorgDetectorMock_Subscribe_Call { + _c.Call.Return(run) + return _c +} + +// NewReorgDetectorMock creates a new instance of ReorgDetectorMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewReorgDetectorMock(t interface { + mock.TestingT + Cleanup(func()) +}) *ReorgDetectorMock { + mock := &ReorgDetectorMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/l1infotreesync/processor.go b/l1infotreesync/processor.go new file mode 100644 index 00000000..0a26bf4e --- /dev/null +++ b/l1infotreesync/processor.go @@ -0,0 +1,478 @@ +package l1infotreesync + +import ( + "context" + "database/sql" + "encoding/binary" + "errors" + "fmt" + mutex "sync" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/l1infotreesync/migrations" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sync" + "github.com/agglayer/aggkit/tree" + treeTypes "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/iden3/go-iden3-crypto/keccak256" + "github.com/russross/meddler" + "golang.org/x/crypto/sha3" +) + +var ( + ErrBlockNotProcessed = errors.New("given block(s) have not been processed yet") + ErrNoBlock0 = errors.New("blockNum must be greater than 0") +) + +type processor struct { + db *sql.DB + l1InfoTree *tree.AppendOnlyTree + rollupExitTree *tree.UpdatableTree + mu mutex.RWMutex + halted bool + haltedReason string +} + +// UpdateL1InfoTree representation of the UpdateL1InfoTree event +type UpdateL1InfoTree struct { + BlockPosition uint64 + MainnetExitRoot common.Hash + RollupExitRoot common.Hash + ParentHash common.Hash + Timestamp uint64 +} + +type UpdateL1InfoTreeV2 struct { + CurrentL1InfoRoot common.Hash + LeafCount uint32 + Blockhash common.Hash + MinTimestamp uint64 +} + +// VerifyBatches representation of the VerifyBatches and VerifyBatchesTrustedAggregator events +type VerifyBatches struct { + BlockNumber uint64 `meddler:"block_num"` + BlockPosition uint64 `meddler:"block_pos"` + RollupID uint32 `meddler:"rollup_id"` + NumBatch uint64 `meddler:"batch_num"` + StateRoot common.Hash `meddler:"state_root,hash"` + ExitRoot common.Hash `meddler:"exit_root,hash"` + Aggregator common.Address `meddler:"aggregator,address"` + + // Not provided by downloader + RollupExitRoot common.Hash `meddler:"rollup_exit_root,hash"` +} + +func (v *VerifyBatches) String() string { + return fmt.Sprintf("BlockNumber: %d, BlockPosition: %d, RollupID: %d, NumBatch: %d, StateRoot: %s, "+ + "ExitRoot: %s, Aggregator: %s, RollupExitRoot: %s", + v.BlockNumber, v.BlockPosition, v.RollupID, v.NumBatch, v.StateRoot.String(), + v.ExitRoot.String(), v.Aggregator.String(), v.RollupExitRoot.String()) +} + +type InitL1InfoRootMap struct { + LeafCount uint32 + CurrentL1InfoRoot common.Hash +} + +func (i *InitL1InfoRootMap) String() string { + return fmt.Sprintf("LeafCount: %d, CurrentL1InfoRoot: %s", i.LeafCount, i.CurrentL1InfoRoot.String()) +} + +type Event struct { + UpdateL1InfoTree *UpdateL1InfoTree + UpdateL1InfoTreeV2 *UpdateL1InfoTreeV2 + VerifyBatches *VerifyBatches + InitL1InfoRootMap *InitL1InfoRootMap +} + +// L1InfoTreeLeaf representation of a leaf of the L1 Info tree +type L1InfoTreeLeaf struct { + BlockNumber uint64 `meddler:"block_num"` + BlockPosition uint64 `meddler:"block_pos"` + L1InfoTreeIndex uint32 `meddler:"position"` + PreviousBlockHash common.Hash `meddler:"previous_block_hash,hash"` + Timestamp uint64 `meddler:"timestamp"` + MainnetExitRoot common.Hash `meddler:"mainnet_exit_root,hash"` + RollupExitRoot common.Hash `meddler:"rollup_exit_root,hash"` + GlobalExitRoot common.Hash `meddler:"global_exit_root,hash"` + Hash common.Hash `meddler:"hash,hash"` +} + +func (l *L1InfoTreeLeaf) String() string { + return fmt.Sprintf("BlockNumber: %d, BlockPosition: %d, L1InfoTreeIndex: %d, PreviousBlockHash: %s, "+ + "Timestamp: %d, MainnetExitRoot: %s, RollupExitRoot: %s, GlobalExitRoot: %s, Hash: %s", + l.BlockNumber, l.BlockPosition, l.L1InfoTreeIndex, l.PreviousBlockHash.String(), + l.Timestamp, l.MainnetExitRoot.String(), l.RollupExitRoot.String(), l.GlobalExitRoot.String(), l.Hash.String()) +} + +// L1InfoTreeInitial representation of the initial info of the L1 Info tree for this rollup +type L1InfoTreeInitial struct { + BlockNumber uint64 `meddler:"block_num"` + LeafCount uint32 `meddler:"leaf_count"` + L1InfoRoot common.Hash `meddler:"l1_info_root,hash"` +} + +func (l *L1InfoTreeInitial) String() string { + return fmt.Sprintf("BlockNumber: %d, LeafCount: %d, L1InfoRoot: %s", l.BlockNumber, l.LeafCount, l.L1InfoRoot.String()) +} + +// Hash as expected by the tree +func (l *L1InfoTreeLeaf) hash() common.Hash { + var res [treeTypes.DefaultHeight]byte + t := make([]byte, 8) //nolint:mnd + binary.BigEndian.PutUint64(t, l.Timestamp) + copy(res[:], keccak256.Hash(l.globalExitRoot().Bytes(), l.PreviousBlockHash.Bytes(), t)) + return res +} + +// GlobalExitRoot returns the GER +func (l *L1InfoTreeLeaf) globalExitRoot() common.Hash { + var gerBytes [treeTypes.DefaultHeight]byte + hasher := sha3.NewLegacyKeccak256() + hasher.Write(l.MainnetExitRoot[:]) + hasher.Write(l.RollupExitRoot[:]) + copy(gerBytes[:], hasher.Sum(nil)) + + return gerBytes +} + +func newProcessor(dbPath string) (*processor, error) { + err := migrations.RunMigrations(dbPath) + if err != nil { + return nil, err + } + db, err := db.NewSQLiteDB(dbPath) + if err != nil { + return nil, err + } + return &processor{ + db: db, + l1InfoTree: tree.NewAppendOnlyTree(db, migrations.L1InfoTreePrefix), + rollupExitTree: tree.NewUpdatableTree(db, migrations.RollupExitTreePrefix), + }, nil +} + +// GetL1InfoTreeMerkleProof creates a merkle proof for the L1 Info tree +func (p *processor) GetL1InfoTreeMerkleProof( + ctx context.Context, index uint32, +) (treeTypes.Proof, treeTypes.Root, error) { + root, err := p.l1InfoTree.GetRootByIndex(ctx, index) + if err != nil { + return treeTypes.Proof{}, treeTypes.Root{}, err + } + proof, err := p.l1InfoTree.GetProof(ctx, root.Index, root.Hash) + return proof, root, err +} + +// GetLatestInfoUntilBlock returns the most recent L1InfoTreeLeaf that occurred before or at blockNum. +// If the blockNum has not been processed yet the error ErrBlockNotProcessed will be returned +func (p *processor) GetLatestInfoUntilBlock(ctx context.Context, blockNum uint64) (*L1InfoTreeLeaf, error) { + if blockNum == 0 { + return nil, ErrNoBlock0 + } + tx, err := p.db.BeginTx(ctx, &sql.TxOptions{ReadOnly: true}) + if err != nil { + return nil, err + } + defer func() { + if err := tx.Rollback(); err != nil { + log.Warnf("error rolling back tx: %v", err) + } + }() + + lpb, err := p.getLastProcessedBlockWithTx(tx) + if err != nil { + return nil, err + } + if lpb < blockNum { + return nil, ErrBlockNotProcessed + } + + info := &L1InfoTreeLeaf{} + err = meddler.QueryRow( + tx, info, + `SELECT * FROM l1info_leaf ORDER BY block_num DESC, block_pos DESC LIMIT 1;`, + ) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, db.ErrNotFound + } + return nil, err + } + return info, nil +} + +// GetInfoByIndex returns the value of a leaf (not the hash) of the L1 info tree +func (p *processor) GetInfoByIndex(ctx context.Context, index uint32) (*L1InfoTreeLeaf, error) { + return p.getInfoByIndexWithTx(p.db, index) +} + +func (p *processor) getInfoByIndexWithTx(tx db.DBer, index uint32) (*L1InfoTreeLeaf, error) { + info := &L1InfoTreeLeaf{} + return info, meddler.QueryRow( + tx, info, + `SELECT * FROM l1info_leaf WHERE position = $1;`, index, + ) +} + +// GetLastProcessedBlock returns the last processed block +func (p *processor) GetLastProcessedBlock(ctx context.Context) (uint64, error) { + return p.getLastProcessedBlockWithTx(p.db) +} + +func (p *processor) getLastProcessedBlockWithTx(tx db.Querier) (uint64, error) { + var lastProcessedBlock uint64 + row := tx.QueryRow("SELECT num FROM BLOCK ORDER BY num DESC LIMIT 1;") + err := row.Scan(&lastProcessedBlock) + if errors.Is(err, sql.ErrNoRows) { + return 0, nil + } + return lastProcessedBlock, err +} + +// Reorg triggers a purge and reset process on the processor to leaf it on a state +// as if the last block processed was firstReorgedBlock-1 +func (p *processor) Reorg(ctx context.Context, firstReorgedBlock uint64) error { + tx, err := db.NewTx(ctx, p.db) + if err != nil { + return err + } + shouldRollback := true + defer func() { + if shouldRollback { + log.Debugf("rolling back reorg, first reorged block: %d", firstReorgedBlock) + if errRllbck := tx.Rollback(); errRllbck != nil { + log.Errorf("error while rolling back tx %v", errRllbck) + } + } + }() + + res, err := tx.Exec(`DELETE FROM block WHERE num >= $1;`, firstReorgedBlock) + if err != nil { + return err + } + + if err = p.l1InfoTree.Reorg(tx, firstReorgedBlock); err != nil { + return err + } + + if err = p.rollupExitTree.Reorg(tx, firstReorgedBlock); err != nil { + return err + } + rowsAffected, err := res.RowsAffected() + if err != nil { + return err + } + + if err := tx.Commit(); err != nil { + return err + } + sync.UnhaltIfAffectedRows(&p.halted, &p.haltedReason, &p.mu, rowsAffected) + return nil +} + +// ProcessBlock process the events of the block to build the rollup exit tree and the l1 info tree +// and updates the last processed block (can be called without events for that purpose) +func (p *processor) ProcessBlock(ctx context.Context, block sync.Block) error { + if p.isHalted() { + log.Errorf("processor is halted due to: %s", p.haltedReason) + return sync.ErrInconsistentState + } + tx, err := db.NewTx(ctx, p.db) + if err != nil { + return err + } + log.Debugf("init block processing for block %d", block.Num) + shouldRollback := true + defer func() { + if shouldRollback { + log.Debugf("rolling back block processing for block %d", block.Num) + if errRllbck := tx.Rollback(); errRllbck != nil { + log.Errorf("error while rolling back tx %v", errRllbck) + } + } + }() + + if _, err := tx.Exec(`INSERT INTO block (num) VALUES ($1)`, block.Num); err != nil { + return fmt.Errorf("insert Block. err: %w", err) + } + + var initialL1InfoIndex uint32 + var l1InfoLeavesAdded uint32 + lastIndex, err := p.getLastIndex(tx) + + switch { + case errors.Is(err, db.ErrNotFound): + initialL1InfoIndex = 0 + case err != nil: + return fmt.Errorf("getLastIndex err: %w", err) + default: + initialL1InfoIndex = lastIndex + 1 + } + + for _, e := range block.Events { + event, ok := e.(Event) + if !ok { + return errors.New("failed to convert from sync.Block.Event into Event") + } + if event.UpdateL1InfoTree != nil { + index := initialL1InfoIndex + l1InfoLeavesAdded + info := &L1InfoTreeLeaf{ + BlockNumber: block.Num, + BlockPosition: event.UpdateL1InfoTree.BlockPosition, + L1InfoTreeIndex: index, + PreviousBlockHash: event.UpdateL1InfoTree.ParentHash, + Timestamp: event.UpdateL1InfoTree.Timestamp, + MainnetExitRoot: event.UpdateL1InfoTree.MainnetExitRoot, + RollupExitRoot: event.UpdateL1InfoTree.RollupExitRoot, + } + info.GlobalExitRoot = info.globalExitRoot() + info.Hash = info.hash() + if err = meddler.Insert(tx, "l1info_leaf", info); err != nil { + return fmt.Errorf("insert l1info_leaf %s. err: %w", info.String(), err) + } + + err = p.l1InfoTree.AddLeaf(tx, info.BlockNumber, info.BlockPosition, treeTypes.Leaf{ + Index: info.L1InfoTreeIndex, + Hash: info.Hash, + }) + if err != nil { + return fmt.Errorf("AddLeaf(%s). err: %w", info.String(), err) + } + log.Infof("inserted L1InfoTreeLeaf %s", info.String()) + l1InfoLeavesAdded++ + } + if event.UpdateL1InfoTreeV2 != nil { + root, err := p.l1InfoTree.GetLastRoot(tx) + if err != nil { + return fmt.Errorf("GetLastRoot(). err: %w", err) + } + // If the sanity check fails, halt the syncer and rollback. The sanity check could have + // failed due to a reorg. Hopefully, this is the case, eventually the reorg will get detected, + // and the syncer will get unhalted. Otherwise, this means that the syncer has an inconsistent state + // compared to the contracts, and this will need manual intervention. + if root.Hash != event.UpdateL1InfoTreeV2.CurrentL1InfoRoot || root.Index+1 != event.UpdateL1InfoTreeV2.LeafCount { + errStr := fmt.Sprintf( + "failed to check UpdateL1InfoTreeV2. Root: %s vs event:%s. "+ + "Index: : %d vs event.LeafCount:%d. Happened on block %d", + root.Hash, common.Bytes2Hex(event.UpdateL1InfoTreeV2.CurrentL1InfoRoot[:]), + root.Index, event.UpdateL1InfoTreeV2.LeafCount, + block.Num, + ) + log.Error(errStr) + p.mu.Lock() + p.haltedReason = errStr + p.halted = true + p.mu.Unlock() + return sync.ErrInconsistentState + } + } + if event.VerifyBatches != nil { + log.Debugf("handle VerifyBatches event %s", event.VerifyBatches.String()) + err = p.processVerifyBatches(tx, block.Num, event.VerifyBatches) + if err != nil { + err = fmt.Errorf("processVerifyBatches. err: %w", err) + log.Errorf("error processing VerifyBatches: %v", err) + return err + } + } + + if event.InitL1InfoRootMap != nil { + log.Debugf("handle InitL1InfoRootMap event %s", event.InitL1InfoRootMap.String()) + err = processEventInitL1InfoRootMap(tx, block.Num, event.InitL1InfoRootMap) + if err != nil { + err = fmt.Errorf("initL1InfoRootMap. Err: %w", err) + log.Errorf("error processing InitL1InfoRootMap: %v", err) + return err + } + } + } + + if err := tx.Commit(); err != nil { + return fmt.Errorf("err: %w", err) + } + shouldRollback = false + logFunc := log.Debugf + if len(block.Events) > 0 { + logFunc = log.Infof + } + logFunc("block %d processed with %d events", block.Num, len(block.Events)) + return nil +} + +func (p *processor) getLastIndex(tx db.Querier) (uint32, error) { + var lastProcessedIndex uint32 + row := tx.QueryRow("SELECT position FROM l1info_leaf ORDER BY block_num DESC, block_pos DESC LIMIT 1;") + err := row.Scan(&lastProcessedIndex) + if errors.Is(err, sql.ErrNoRows) { + return 0, db.ErrNotFound + } + return lastProcessedIndex, err +} + +func (p *processor) GetFirstL1InfoWithRollupExitRoot(rollupExitRoot common.Hash) (*L1InfoTreeLeaf, error) { + info := &L1InfoTreeLeaf{} + err := meddler.QueryRow(p.db, info, ` + SELECT * FROM l1info_leaf + WHERE rollup_exit_root = $1 + ORDER BY block_num ASC, block_pos ASC + LIMIT 1; + `, rollupExitRoot.Hex()) + return info, db.ReturnErrNotFound(err) +} + +func (p *processor) GetLastInfo() (*L1InfoTreeLeaf, error) { + info := &L1InfoTreeLeaf{} + err := meddler.QueryRow(p.db, info, ` + SELECT * FROM l1info_leaf + ORDER BY block_num DESC, block_pos DESC + LIMIT 1; + `) + return info, db.ReturnErrNotFound(err) +} + +func (p *processor) GetFirstInfo() (*L1InfoTreeLeaf, error) { + info := &L1InfoTreeLeaf{} + err := meddler.QueryRow(p.db, info, ` + SELECT * FROM l1info_leaf + ORDER BY block_num ASC, block_pos ASC + LIMIT 1; + `) + return info, db.ReturnErrNotFound(err) +} + +func (p *processor) GetFirstInfoAfterBlock(blockNum uint64) (*L1InfoTreeLeaf, error) { + info := &L1InfoTreeLeaf{} + err := meddler.QueryRow(p.db, info, ` + SELECT * FROM l1info_leaf + WHERE block_num >= $1 + ORDER BY block_num ASC, block_pos ASC + LIMIT 1; + `, blockNum) + return info, db.ReturnErrNotFound(err) +} + +func (p *processor) GetInfoByGlobalExitRoot(ger common.Hash) (*L1InfoTreeLeaf, error) { + info := &L1InfoTreeLeaf{} + err := meddler.QueryRow(p.db, info, ` + SELECT * FROM l1info_leaf + WHERE global_exit_root = $1 + LIMIT 1; + `, ger.String()) + return info, db.ReturnErrNotFound(err) +} + +func (p *processor) getDBQuerier(tx db.Txer) db.Querier { + if tx != nil { + return tx + } + return p.db +} + +func (p *processor) isHalted() bool { + p.mu.RLock() + defer p.mu.RUnlock() + return p.halted +} diff --git a/l1infotreesync/processor_initl1inforootmap.go b/l1infotreesync/processor_initl1inforootmap.go new file mode 100644 index 00000000..366527dd --- /dev/null +++ b/l1infotreesync/processor_initl1inforootmap.go @@ -0,0 +1,37 @@ +package l1infotreesync + +import ( + "database/sql" + "errors" + "fmt" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/russross/meddler" +) + +func processEventInitL1InfoRootMap(tx db.Txer, blockNumber uint64, event *InitL1InfoRootMap) error { + if event == nil { + return nil + } + info := &L1InfoTreeInitial{ + BlockNumber: blockNumber, + LeafCount: event.LeafCount, + L1InfoRoot: event.CurrentL1InfoRoot, + } + log.Infof("insert InitL1InfoRootMap %s ", info.String()) + if err := meddler.Insert(tx, "l1info_initial", info); err != nil { + return fmt.Errorf("err: %w", err) + } + return nil +} + +// GetInitL1InfoRootMap returns the initial L1 info root map, nil if no root map has been set +func (p *processor) GetInitL1InfoRootMap(tx db.Txer) (*L1InfoTreeInitial, error) { + info := &L1InfoTreeInitial{} + err := meddler.QueryRow(p.getDBQuerier(tx), info, `SELECT block_num, leaf_count,l1_info_root FROM l1info_initial`) + if errors.Is(err, sql.ErrNoRows) { + return nil, nil + } + return info, err +} diff --git a/l1infotreesync/processor_initl1inforootmap_test.go b/l1infotreesync/processor_initl1inforootmap_test.go new file mode 100644 index 00000000..40660f9d --- /dev/null +++ b/l1infotreesync/processor_initl1inforootmap_test.go @@ -0,0 +1,68 @@ +package l1infotreesync + +import ( + "context" + "path" + "testing" + + "github.com/agglayer/aggkit/sync" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestInitL1InfoRootMap(t *testing.T) { + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestInitL1InfoRootMap.sqlite") + sut, err := newProcessor(dbPath) + require.NoError(t, err) + ctx := context.TODO() + event := InitL1InfoRootMap{ + LeafCount: 1, + CurrentL1InfoRoot: common.HexToHash("beef"), + } + block := sync.Block{ + Num: 1, + Events: []interface{}{ + Event{InitL1InfoRootMap: &event}, + }, + } + + err = sut.ProcessBlock(ctx, block) + require.NoError(t, err) + + info, err := sut.GetInitL1InfoRootMap(nil) + require.NoError(t, err) + require.NotNil(t, info) + require.Equal(t, event.LeafCount, info.LeafCount) + require.Equal(t, event.CurrentL1InfoRoot, info.L1InfoRoot) + require.Equal(t, block.Num, info.BlockNumber) +} + +func TestInitL1InfoRootMapDontAllow2Rows(t *testing.T) { + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestInitL1InfoRootMapDontAllow2Rows.sqlite") + sut, err := newProcessor(dbPath) + require.NoError(t, err) + ctx := context.TODO() + block := sync.Block{ + Num: 1, + Events: []interface{}{ + Event{InitL1InfoRootMap: &InitL1InfoRootMap{ + LeafCount: 1, + CurrentL1InfoRoot: common.HexToHash("beef"), + }}, + }, + } + err = sut.ProcessBlock(ctx, block) + require.NoError(t, err) + block.Num = 2 + err = sut.ProcessBlock(ctx, block) + require.Error(t, err, "should not allow to insert a second row") +} + +func TestGetInitL1InfoRootMap(t *testing.T) { + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestGetInitL1InfoRootMap.sqlite") + sut, err := newProcessor(dbPath) + require.NoError(t, err) + info, err := sut.GetInitL1InfoRootMap(nil) + require.NoError(t, err, "should return no error if no row is present, because it returns data=nil") + require.Nil(t, info, "should return nil if no row is present") +} diff --git a/l1infotreesync/processor_test.go b/l1infotreesync/processor_test.go new file mode 100644 index 00000000..087ea8a3 --- /dev/null +++ b/l1infotreesync/processor_test.go @@ -0,0 +1,384 @@ +package l1infotreesync + +import ( + "fmt" + "path" + "testing" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/l1infotree" + "github.com/agglayer/aggkit/l1infotreesync/migrations" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sync" + "github.com/agglayer/aggkit/tree" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" + "golang.org/x/net/context" +) + +func TestGetInfo(t *testing.T) { + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestGetInfo.sqlite") + p, err := newProcessor(dbPath) + require.NoError(t, err) + ctx := context.Background() + + // Test ErrNotFound returned correctly on all methods + _, err = p.GetFirstL1InfoWithRollupExitRoot(common.Hash{}) + require.Equal(t, db.ErrNotFound, err) + _, err = p.GetLastInfo() + require.Equal(t, db.ErrNotFound, err) + _, err = p.GetFirstInfo() + require.Equal(t, db.ErrNotFound, err) + _, err = p.GetFirstInfoAfterBlock(0) + require.Equal(t, db.ErrNotFound, err) + _, err = p.GetInfoByGlobalExitRoot(common.Hash{}) + require.Equal(t, db.ErrNotFound, err) + + // First insert + info1 := &UpdateL1InfoTree{ + MainnetExitRoot: common.HexToHash("beef"), + RollupExitRoot: common.HexToHash("5ca1e"), + ParentHash: common.HexToHash("1010101"), + Timestamp: 420, + } + expected1 := L1InfoTreeLeaf{ + BlockNumber: 1, + L1InfoTreeIndex: 0, + PreviousBlockHash: info1.ParentHash, + Timestamp: info1.Timestamp, + MainnetExitRoot: info1.MainnetExitRoot, + RollupExitRoot: info1.RollupExitRoot, + } + expected1.GlobalExitRoot = expected1.globalExitRoot() + expected1.Hash = expected1.hash() + err = p.ProcessBlock(ctx, sync.Block{ + Num: 1, + Events: []interface{}{ + Event{UpdateL1InfoTree: info1}, + }, + }) + require.NoError(t, err) + actual, err := p.GetFirstL1InfoWithRollupExitRoot(info1.RollupExitRoot) + require.NoError(t, err) + require.Equal(t, expected1, *actual) + actual, err = p.GetLastInfo() + require.NoError(t, err) + require.Equal(t, expected1, *actual) + actual, err = p.GetFirstInfo() + require.NoError(t, err) + require.Equal(t, expected1, *actual) + actual, err = p.GetFirstInfoAfterBlock(0) + require.NoError(t, err) + require.Equal(t, expected1, *actual) + actual, err = p.GetInfoByGlobalExitRoot(expected1.GlobalExitRoot) + require.NoError(t, err) + require.Equal(t, expected1, *actual) + + // Second insert + info2 := &UpdateL1InfoTree{ + MainnetExitRoot: common.HexToHash("b055"), + RollupExitRoot: common.HexToHash("5ca1e"), + ParentHash: common.HexToHash("1010101"), + Timestamp: 420, + } + expected2 := L1InfoTreeLeaf{ + BlockNumber: 2, + L1InfoTreeIndex: 1, + PreviousBlockHash: info2.ParentHash, + Timestamp: info2.Timestamp, + MainnetExitRoot: info2.MainnetExitRoot, + RollupExitRoot: info2.RollupExitRoot, + } + expected2.GlobalExitRoot = expected2.globalExitRoot() + expected2.Hash = expected2.hash() + err = p.ProcessBlock(ctx, sync.Block{ + Num: 2, + Events: []interface{}{ + Event{UpdateL1InfoTree: info2}, + }, + }) + require.NoError(t, err) + actual, err = p.GetFirstL1InfoWithRollupExitRoot(info2.RollupExitRoot) + require.NoError(t, err) + require.Equal(t, expected1, *actual) + actual, err = p.GetLastInfo() + require.NoError(t, err) + require.Equal(t, expected2, *actual) + actual, err = p.GetFirstInfo() + require.NoError(t, err) + require.Equal(t, expected1, *actual) + actual, err = p.GetFirstInfoAfterBlock(2) + require.NoError(t, err) + require.Equal(t, expected2, *actual) + actual, err = p.GetInfoByGlobalExitRoot(expected2.GlobalExitRoot) + require.NoError(t, err) + require.Equal(t, expected2, *actual) +} + +func TestGetLatestInfoUntilBlockIfNotFoundReturnsErrNotFound(t *testing.T) { + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestGetLatestInfoUntilBlockIfNotFoundReturnsErrNotFound.sqlite") + sut, err := newProcessor(dbPath) + require.NoError(t, err) + ctx := context.Background() + // Fake block 1 + _, err = sut.db.Exec(`INSERT INTO block (num) VALUES ($1)`, 1) + require.NoError(t, err) + + _, err = sut.GetLatestInfoUntilBlock(ctx, 1) + require.Equal(t, db.ErrNotFound, err) +} + +func Test_processor_GetL1InfoTreeMerkleProof(t *testing.T) { + testTable := []struct { + name string + getProcessor func(t *testing.T) *processor + idx uint32 + expectedRoot types.Root + expectedErr error + }{ + { + name: "empty tree", + getProcessor: func(t *testing.T) *processor { + t.Helper() + + p, err := newProcessor(path.Join(t.TempDir(), "l1infotreesyncTest_processor_GetL1InfoTreeMerkleProof_1.sqlite")) + require.NoError(t, err) + + return p + }, + idx: 0, + expectedErr: db.ErrNotFound, + }, + { + name: "single leaf tree", + getProcessor: func(t *testing.T) *processor { + t.Helper() + + p, err := newProcessor(path.Join(t.TempDir(), "l1infotreesyncTest_processor_GetL1InfoTreeMerkleProof_2.sqlite")) + require.NoError(t, err) + + info := &UpdateL1InfoTree{ + MainnetExitRoot: common.HexToHash("beef"), + RollupExitRoot: common.HexToHash("5ca1e"), + ParentHash: common.HexToHash("1010101"), + Timestamp: 420, + } + err = p.ProcessBlock(context.Background(), sync.Block{ + Num: 1, + Events: []interface{}{ + Event{UpdateL1InfoTree: info}, + }, + }) + require.NoError(t, err) + + return p + }, + idx: 0, + expectedRoot: types.Root{ + Hash: common.HexToHash("beef"), + Index: 0, + BlockNum: 1, + BlockPosition: 0, + }, + }, + } + + for _, tt := range testTable { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + p := tt.getProcessor(t) + proof, root, err := p.GetL1InfoTreeMerkleProof(context.Background(), tt.idx) + if tt.expectedErr != nil { + require.Equal(t, tt.expectedErr, err) + } else { + require.NoError(t, err) + require.NotEmpty(t, proof) + require.NotEmpty(t, root.Hash) + require.Equal(t, tt.expectedRoot.Index, root.Index) + require.Equal(t, tt.expectedRoot.BlockNum, root.BlockNum) + require.Equal(t, tt.expectedRoot.BlockPosition, root.BlockPosition) + } + }) + } +} + +func Test_processor_Reorg(t *testing.T) { + t.Parallel() + + testTable := []struct { + name string + getProcessor func(t *testing.T) *processor + reorgBlock uint64 + expectedErr error + }{ + { + name: "empty tree", + getProcessor: func(t *testing.T) *processor { + t.Helper() + + p, err := newProcessor(path.Join(t.TempDir(), "l1infotreesyncTest_processor_Reorg_1.sqlite")) + require.NoError(t, err) + return p + }, + reorgBlock: 0, + expectedErr: nil, + }, + { + name: "single leaf tree", + getProcessor: func(t *testing.T) *processor { + t.Helper() + + p, err := newProcessor(path.Join(t.TempDir(), "l1infotreesyncTest_processor_Reorg_2.sqlite")) + require.NoError(t, err) + + info := &UpdateL1InfoTree{ + MainnetExitRoot: common.HexToHash("beef"), + RollupExitRoot: common.HexToHash("5ca1e"), + ParentHash: common.HexToHash("1010101"), + Timestamp: 420, + } + err = p.ProcessBlock(context.Background(), sync.Block{ + Num: 1, + Events: []interface{}{ + Event{UpdateL1InfoTree: info}, + }, + }) + require.NoError(t, err) + + return p + }, + reorgBlock: 1, + }, + } + + for _, tt := range testTable { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + p := tt.getProcessor(t) + err := p.Reorg(context.Background(), tt.reorgBlock) + if tt.expectedErr != nil { + require.Equal(t, tt.expectedErr, err) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestProofsFromDifferentTrees(t *testing.T) { + fmt.Println("aggregator L1InfoTree ===============================================") + + l1Tree, err := l1infotree.NewL1InfoTree(log.WithFields("test"), types.DefaultHeight, [][32]byte{}) + require.NoError(t, err) + + leaves := createTestLeaves(t, 2) + + aLeaves := make([][32]byte, len(leaves)) + for i, leaf := range leaves { + aLeaves[i] = l1infotree.HashLeafData( + leaf.GlobalExitRoot, + leaf.PreviousBlockHash, + leaf.Timestamp) + } + + aggregatorL1InfoTree, aggregatorRoot, err := l1Tree.ComputeMerkleProof(leaves[0].L1InfoTreeIndex, aLeaves) + require.NoError(t, err) + + aggregatorProof := types.Proof{} + for i, p := range aggregatorL1InfoTree { + aggregatorProof[i] = common.BytesToHash(p[:]) + } + + fmt.Println(aggregatorRoot) + fmt.Println(aggregatorProof) + fmt.Println("l1 info tree syncer L1InfoTree ===============================================") + + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestProofsFromDifferentTrees.sqlite") + require.NoError(t, migrations.RunMigrations(dbPath)) + + dbe, err := db.NewSQLiteDB(dbPath) + require.NoError(t, err) + + l1InfoTree := tree.NewAppendOnlyTree(dbe, migrations.L1InfoTreePrefix) + + tx, err := db.NewTx(context.Background(), dbe) + require.NoError(t, err) + + for _, leaf := range leaves { + err = l1InfoTree.AddLeaf(tx, leaf.BlockNumber, leaf.BlockPosition, types.Leaf{ + Index: leaf.L1InfoTreeIndex, + Hash: leaf.Hash, + }) + + require.NoError(t, err) + } + + require.NoError(t, tx.Commit()) + + l1InfoTreeSyncerRoot, err := l1InfoTree.GetRootByIndex(context.Background(), leaves[1].L1InfoTreeIndex) + require.NoError(t, err) + l1InfoTreeSyncerProof, err := l1InfoTree.GetProof(context.Background(), leaves[0].L1InfoTreeIndex, l1InfoTreeSyncerRoot.Hash) + require.NoError(t, err) + for i, l := range aggregatorL1InfoTree { + require.Equal(t, common.Hash(l), l1InfoTreeSyncerProof[i]) + } + + fmt.Println(leaves[0].GlobalExitRoot) + fmt.Println(l1InfoTreeSyncerProof) + + require.Equal(t, aggregatorRoot, l1InfoTreeSyncerRoot.Hash) + require.Equal(t, aggregatorProof, l1InfoTreeSyncerProof) +} + +func createTestLeaves(t *testing.T, numOfLeaves int) []*L1InfoTreeLeaf { + t.Helper() + + leaves := make([]*L1InfoTreeLeaf, 0, numOfLeaves) + + for i := 0; i < numOfLeaves; i++ { + leaf := &L1InfoTreeLeaf{ + L1InfoTreeIndex: uint32(i), + Timestamp: uint64(i), + BlockNumber: uint64(i), + BlockPosition: uint64(i), + PreviousBlockHash: common.HexToHash(fmt.Sprintf("0x%x", i)), + MainnetExitRoot: common.HexToHash(fmt.Sprintf("0x%x", i)), + RollupExitRoot: common.HexToHash(fmt.Sprintf("0x%x", i)), + } + + leaf.GlobalExitRoot = leaf.globalExitRoot() + leaf.Hash = leaf.hash() + + leaves = append(leaves, leaf) + } + + return leaves +} + +func TestProcessBlockUpdateL1InfoTreeV2DontMatchTree(t *testing.T) { + sut, err := newProcessor(path.Join(t.TempDir(), "l1infotreesyncTestProcessBlockUpdateL1InfoTreeV2DontMatchTree.sqlite")) + require.NoError(t, err) + block := sync.Block{ + Num: 10, + Events: []interface{}{ + Event{UpdateL1InfoTree: &UpdateL1InfoTree{ + MainnetExitRoot: common.HexToHash("beef"), + RollupExitRoot: common.HexToHash("5ca1e"), + ParentHash: common.HexToHash("1010101"), + Timestamp: 420, + }}, + Event{UpdateL1InfoTreeV2: &UpdateL1InfoTreeV2{ + CurrentL1InfoRoot: common.HexToHash("beef"), + LeafCount: 1, + }}, + }, + } + err = sut.ProcessBlock(context.Background(), block) + require.ErrorIs(t, err, sync.ErrInconsistentState) + require.True(t, sut.halted) +} diff --git a/l1infotreesync/processor_verifybatches.go b/l1infotreesync/processor_verifybatches.go new file mode 100644 index 00000000..1ce15b8e --- /dev/null +++ b/l1infotreesync/processor_verifybatches.go @@ -0,0 +1,104 @@ +package l1infotreesync + +import ( + "errors" + "fmt" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + treeTypes "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/russross/meddler" +) + +func (p *processor) processVerifyBatches(tx db.Txer, blockNumber uint64, event *VerifyBatches) error { + if event == nil { + return fmt.Errorf("processVerifyBatches: event is nil") + } + if tx == nil { + return fmt.Errorf("processVerifyBatches: tx is nil, is mandatory to pass a tx") + } + log.Debugf("VerifyBatches: rollupExitTree.UpsertLeaf (blockNumber=%d, event=%s)", blockNumber, event.String()) + // If ExitRoot is zero if the leaf doesnt exists doesnt change the root of tree. + // if leaf already exists doesn't make sense to 'empty' the leaf, so we keep previous value + if event.ExitRoot == (common.Hash{}) { + log.Infof("skipping VerifyBatches event with empty ExitRoot (blockNumber=%d, event=%s)", blockNumber, event.String()) + return nil + } + isNewLeaf, err := p.isNewValueForRollupExitTree(tx, event) + if err != nil { + return fmt.Errorf("isNewValueForrollupExitTree. err: %w", err) + } + if !isNewLeaf { + log.Infof("skipping VerifyBatches event with same ExitRoot (blockNumber=%d, event=%s)", blockNumber, event.String()) + return nil + } + log.Infof("UpsertLeaf VerifyBatches event (blockNumber=%d, event=%s)", blockNumber, event.String()) + newRoot, err := p.rollupExitTree.UpsertLeaf(tx, blockNumber, event.BlockPosition, treeTypes.Leaf{ + Index: event.RollupID - 1, + Hash: event.ExitRoot, + }) + if err != nil { + return fmt.Errorf("error rollupExitTree.UpsertLeaf. err: %w", err) + } + verifyBatches := event + verifyBatches.BlockNumber = blockNumber + verifyBatches.RollupExitRoot = newRoot + if err = meddler.Insert(tx, "verify_batches", verifyBatches); err != nil { + return fmt.Errorf("error inserting verify_batches. err: %w", err) + } + return nil +} + +func (p *processor) isNewValueForRollupExitTree(tx db.Querier, event *VerifyBatches) (bool, error) { + currentRoot, err := p.rollupExitTree.GetLastRoot(tx) + if err != nil && errors.Is(err, db.ErrNotFound) { + // The tree is empty, so is a new value for sure + return true, nil + } + if err != nil { + return false, fmt.Errorf("error rollupExitTree.GetLastRoot. err: %w", err) + } + leaf, err := p.rollupExitTree.GetLeaf(tx, event.RollupID-1, currentRoot.Hash) + if err != nil && errors.Is(err, db.ErrNotFound) { + // The leaf doesn't exist, so is a new value + return true, nil + } + if err != nil { + return false, fmt.Errorf("error rollupExitTree.GetLeaf. err: %w", err) + } + return leaf != event.ExitRoot, nil +} + +func (p *processor) GetLastVerifiedBatches(rollupID uint32) (*VerifyBatches, error) { + verified := &VerifyBatches{} + err := meddler.QueryRow(p.db, verified, ` + SELECT * FROM verify_batches + WHERE rollup_id = $1 + ORDER BY block_num DESC, block_pos DESC + LIMIT 1; + `, rollupID) + return verified, db.ReturnErrNotFound(err) +} + +func (p *processor) GetFirstVerifiedBatches(rollupID uint32) (*VerifyBatches, error) { + verified := &VerifyBatches{} + err := meddler.QueryRow(p.db, verified, ` + SELECT * FROM verify_batches + WHERE rollup_id = $1 + ORDER BY block_num ASC, block_pos ASC + LIMIT 1; + `, rollupID) + return verified, db.ReturnErrNotFound(err) +} + +func (p *processor) GetFirstVerifiedBatchesAfterBlock(rollupID uint32, blockNum uint64) (*VerifyBatches, error) { + verified := &VerifyBatches{} + err := meddler.QueryRow(p.db, verified, ` + SELECT * FROM verify_batches + WHERE rollup_id = $1 AND block_num >= $2 + ORDER BY block_num ASC, block_pos ASC + LIMIT 1; + `, rollupID, blockNum) + return verified, db.ReturnErrNotFound(err) +} diff --git a/l1infotreesync/processor_verifybatches_test.go b/l1infotreesync/processor_verifybatches_test.go new file mode 100644 index 00000000..6d8e6860 --- /dev/null +++ b/l1infotreesync/processor_verifybatches_test.go @@ -0,0 +1,128 @@ +package l1infotreesync + +import ( + "context" + "path" + "testing" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/sync" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestProcessVerifyBatchesNil(t *testing.T) { + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestProcessVerifyBatchesNil.sqlite") + sut, err := newProcessor(dbPath) + require.NoError(t, err) + err = sut.processVerifyBatches(nil, 1, nil) + require.Error(t, err) +} + +func TestProcessVerifyBatchesOK(t *testing.T) { + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestProcessVerifyBatchesOK.sqlite") + sut, err := newProcessor(dbPath) + require.NoError(t, err) + event := VerifyBatches{ + BlockPosition: 1, + RollupID: 1, + NumBatch: 1, + StateRoot: common.HexToHash("5ca1e"), + ExitRoot: common.HexToHash("b455"), + Aggregator: common.HexToAddress("beef"), + RollupExitRoot: common.HexToHash("b455"), + } + ctx := context.TODO() + tx, err := db.NewTx(ctx, sut.db) + require.NoError(t, err) + _, err = tx.Exec(`INSERT INTO block (num) VALUES ($1)`, 1) + require.NoError(t, err) + err = sut.processVerifyBatches(tx, 1, &event) + require.NoError(t, err) +} + +func TestProcessVerifyBatchesSkip0000(t *testing.T) { + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestProcessVerifyBatchesSkip0000.sqlite") + sut, err := newProcessor(dbPath) + require.NoError(t, err) + event := VerifyBatches{ + BlockPosition: 1, + RollupID: 1, + NumBatch: 1, + StateRoot: common.HexToHash("5ca1e"), + ExitRoot: common.Hash{}, + Aggregator: common.HexToAddress("beef"), + RollupExitRoot: common.HexToHash("b455"), + } + ctx := context.TODO() + tx, err := db.NewTx(ctx, sut.db) + require.NoError(t, err) + err = sut.processVerifyBatches(tx, 1, &event) + require.NoError(t, err) +} + +func TestGetVerifiedBatches(t *testing.T) { + dbPath := path.Join(t.TempDir(), "l1infotreesyncTestGetVerifiedBatches.sqlite") + p, err := newProcessor(dbPath) + require.NoError(t, err) + ctx := context.Background() + + // Test ErrNotFound returned correctly on all methods + _, err = p.GetLastVerifiedBatches(0) + require.Equal(t, db.ErrNotFound, err) + _, err = p.GetFirstVerifiedBatches(0) + require.Equal(t, db.ErrNotFound, err) + _, err = p.GetFirstVerifiedBatchesAfterBlock(0, 0) + require.Equal(t, db.ErrNotFound, err) + + // First insert + expected1 := &VerifyBatches{ + RollupID: 420, + NumBatch: 69, + StateRoot: common.HexToHash("5ca1e"), + ExitRoot: common.HexToHash("b455"), + Aggregator: common.HexToAddress("beef"), + } + err = p.ProcessBlock(ctx, sync.Block{ + Num: 1, + Events: []interface{}{ + Event{VerifyBatches: expected1}, + }, + }) + require.NoError(t, err) + _, err = p.GetLastVerifiedBatches(0) + require.Equal(t, db.ErrNotFound, err) + actual, err := p.GetLastVerifiedBatches(420) + require.NoError(t, err) + require.Equal(t, expected1, actual) + actual, err = p.GetFirstVerifiedBatches(420) + require.NoError(t, err) + require.Equal(t, expected1, actual) + + // Second insert + expected2 := &VerifyBatches{ + RollupID: 420, + NumBatch: 690, + StateRoot: common.HexToHash("5ca1e3"), + ExitRoot: common.HexToHash("ba55"), + Aggregator: common.HexToAddress("beef3"), + } + err = p.ProcessBlock(ctx, sync.Block{ + Num: 2, + Events: []interface{}{ + Event{VerifyBatches: expected2}, + }, + }) + require.NoError(t, err) + _, err = p.GetLastVerifiedBatches(0) + require.Equal(t, db.ErrNotFound, err) + actual, err = p.GetLastVerifiedBatches(420) + require.NoError(t, err) + require.Equal(t, expected2, actual) + actual, err = p.GetFirstVerifiedBatches(420) + require.NoError(t, err) + require.Equal(t, expected1, actual) + actual, err = p.GetFirstVerifiedBatchesAfterBlock(420, 2) + require.NoError(t, err) + require.Equal(t, expected2, actual) +} diff --git a/lastgersync/config.go b/lastgersync/config.go new file mode 100644 index 00000000..c8574b4b --- /dev/null +++ b/lastgersync/config.go @@ -0,0 +1,28 @@ +package lastgersync + +import ( + "github.com/agglayer/aggkit/config/types" + "github.com/ethereum/go-ethereum/common" +) + +type Config struct { + // DBPath path of the DB + DBPath string `mapstructure:"DBPath"` + // BlockFinality indicates the status of the blocks that will be queried in order to sync + BlockFinality string `jsonschema:"enum=LatestBlock, enum=SafeBlock, enum=PendingBlock, enum=FinalizedBlock, enum=EarliestBlock" mapstructure:"BlockFinality"` //nolint:lll + // InitialBlockNum is the first block that will be queried when starting the synchronization from scratch. + // It should be a number equal or bellow the creation of the bridge contract + InitialBlockNum uint64 `mapstructure:"InitialBlockNum"` + // GlobalExitRootL2Addr is the address of the GER smart contract on L2 + GlobalExitRootL2Addr common.Address `mapstructure:"GlobalExitRootL2Addr"` + // RetryAfterErrorPeriod is the time that will be waited when an unexpected error happens before retry + RetryAfterErrorPeriod types.Duration `mapstructure:"RetryAfterErrorPeriod"` + // MaxRetryAttemptsAfterError is the maximum number of consecutive attempts that will happen before panicing. + // Any number smaller than zero will be considered as unlimited retries + MaxRetryAttemptsAfterError int `mapstructure:"MaxRetryAttemptsAfterError"` + // WaitForNewBlocksPeriod time that will be waited when the synchronizer has reached the latest block + WaitForNewBlocksPeriod types.Duration `mapstructure:"WaitForNewBlocksPeriod"` + // DownloadBufferSize buffer of events to be porcessed. When the buffer limit is reached, + // downloading will stop until the processing catches up. + DownloadBufferSize int `mapstructure:"DownloadBufferSize"` +} diff --git a/lastgersync/e2e_test.go b/lastgersync/e2e_test.go new file mode 100644 index 00000000..e1fe3d25 --- /dev/null +++ b/lastgersync/e2e_test.go @@ -0,0 +1,60 @@ +package lastgersync_test + +import ( + "context" + "fmt" + "path" + "strconv" + "testing" + "time" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/lastgersync" + "github.com/agglayer/aggkit/test/helpers" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestE2E(t *testing.T) { + ctx := context.Background() + setup := helpers.NewE2EEnvWithEVML2(t) + dbPathSyncer := path.Join(t.TempDir(), "lastgersyncTestE2E.sqlite") + syncer, err := lastgersync.New( + ctx, + dbPathSyncer, + setup.L2Environment.ReorgDetector, + setup.L2Environment.SimBackend.Client(), + setup.L2Environment.GERAddr, + setup.InfoTreeSync, + 0, + 0, + etherman.LatestBlock, + time.Millisecond*30, + 10, + ) + require.NoError(t, err) + go syncer.Start(ctx) + + for i := 0; i < 10; i++ { + // Update GER on L1 + _, err := setup.L1Environment.GERContract.UpdateExitRoot(setup.L1Environment.Auth, common.HexToHash(strconv.Itoa(i))) + require.NoError(t, err) + setup.L1Environment.SimBackend.Commit() + time.Sleep(time.Millisecond * 150) + expectedGER, err := setup.L1Environment.GERContract.GetLastGlobalExitRoot(&bind.CallOpts{Pending: false}) + require.NoError(t, err) + isInjected, err := setup.AggoracleSender.IsGERInjected(expectedGER) + require.NoError(t, err) + require.True(t, isInjected, fmt.Sprintf("iteration %d, GER: %s", i, common.Bytes2Hex(expectedGER[:]))) + + // Wait for syncer to catch up + lb, err := setup.L2Environment.SimBackend.Client().BlockNumber(ctx) + require.NoError(t, err) + helpers.RequireProcessorUpdated(t, syncer, lb) + + e, err := syncer.GetFirstGERAfterL1InfoTreeIndex(ctx, uint32(i)) + require.NoError(t, err, fmt.Sprint("iteration: ", i)) + require.Equal(t, common.Hash(expectedGER), e.GlobalExitRoot, fmt.Sprint("iteration: ", i)) + } +} diff --git a/lastgersync/evmdownloader.go b/lastgersync/evmdownloader.go new file mode 100644 index 00000000..5ba44129 --- /dev/null +++ b/lastgersync/evmdownloader.go @@ -0,0 +1,180 @@ +package lastgersync + +import ( + "context" + "errors" + "fmt" + "math/big" + "time" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/globalexitrootmanagerl2sovereignchain" + aggkitcommon "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sync" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +type EthClienter interface { + ethereum.LogFilterer + ethereum.BlockNumberReader + ethereum.ChainReader + bind.ContractBackend +} + +type downloader struct { + *sync.EVMDownloaderImplementation + l2GERManager *globalexitrootmanagerl2sovereignchain.Globalexitrootmanagerl2sovereignchain + l1InfoTreesync *l1infotreesync.L1InfoTreeSync + processor *processor + rh *sync.RetryHandler +} + +func newDownloader( + l2Client EthClienter, + l2GERAddr common.Address, + l1InfoTreeSync *l1infotreesync.L1InfoTreeSync, + processor *processor, + rh *sync.RetryHandler, + blockFinality *big.Int, + waitForNewBlocksPeriod time.Duration, +) (*downloader, error) { + gerContract, err := globalexitrootmanagerl2sovereignchain.NewGlobalexitrootmanagerl2sovereignchain( + l2GERAddr, l2Client) + if err != nil { + return nil, err + } + + return &downloader{ + EVMDownloaderImplementation: sync.NewEVMDownloaderImplementation( + "lastgersync", l2Client, blockFinality, waitForNewBlocksPeriod, nil, nil, nil, rh, + ), + l2GERManager: gerContract, + l1InfoTreesync: l1InfoTreeSync, + processor: processor, + rh: rh, + }, nil +} + +func (d *downloader) Download(ctx context.Context, fromBlock uint64, downloadedCh chan sync.EVMBlock) { + var ( + attempts int + nextIndex uint32 + err error + ) + for { + lastIndex, err := d.processor.getLastIndex() + if errors.Is(err, db.ErrNotFound) { + nextIndex = 0 + } else if err != nil { + log.Errorf("error getting last indes: %v", err) + attempts++ + d.rh.Handle("getLastIndex", attempts) + + continue + } + if lastIndex > 0 { + nextIndex = lastIndex + 1 + } + break + } + for { + select { + case <-ctx.Done(): + log.Debug("closing channel") + close(downloadedCh) + + return + default: + } + fromBlock = d.WaitForNewBlocks(ctx, fromBlock) + + attempts = 0 + var gers []Event + for { + gers, err = d.getGERsFromIndex(ctx, nextIndex) + if err != nil { + log.Errorf("error getting GERs: %v", err) + attempts++ + d.rh.Handle("getGERsFromIndex", attempts) + + continue + } + + break + } + + blockHeader, isCanceled := d.GetBlockHeader(ctx, fromBlock) + if isCanceled { + return + } + + block := &sync.EVMBlock{ + EVMBlockHeader: sync.EVMBlockHeader{ + Num: blockHeader.Num, + Hash: blockHeader.Hash, + ParentHash: blockHeader.ParentHash, + Timestamp: blockHeader.Timestamp, + }, + } + d.setGreatestGERInjectedFromList(block, gers) + + downloadedCh <- *block + if len(block.Events) > 0 { + event, ok := block.Events[0].(Event) + if !ok { + log.Errorf("unexpected type %T in events", block.Events[0]) + } + nextIndex = event.L1InfoTreeIndex + 1 + } + } +} + +func (d *downloader) getGERsFromIndex(ctx context.Context, fromL1InfoTreeIndex uint32) ([]Event, error) { + lastRoot, err := d.l1InfoTreesync.GetLastL1InfoTreeRoot(ctx) + if errors.Is(err, db.ErrNotFound) { + return nil, nil + } + if err != nil { + return nil, fmt.Errorf("error calling GetLastL1InfoTreeRoot: %w", err) + } + + gers := []Event{} + for i := fromL1InfoTreeIndex; i <= lastRoot.Index; i++ { + info, err := d.l1InfoTreesync.GetInfoByIndex(ctx, i) + if err != nil { + return nil, fmt.Errorf("error calling GetInfoByIndex: %w", err) + } + gers = append(gers, Event{ + L1InfoTreeIndex: i, + GlobalExitRoot: info.GlobalExitRoot, + }) + } + + return gers, nil +} + +func (d *downloader) setGreatestGERInjectedFromList(b *sync.EVMBlock, list []Event) { + for _, event := range list { + var attempts int + for { + blockHashBigInt, err := d.l2GERManager.GlobalExitRootMap(&bind.CallOpts{Pending: false}, event.GlobalExitRoot) + if err != nil { + attempts++ + log.Errorf("failed to check if global exit root %s is injected on L2: %s", event.GlobalExitRoot.Hex(), err) + d.rh.Handle("GlobalExitRootMap", attempts) + + continue + } + + if common.BigToHash(blockHashBigInt) != aggkitcommon.ZeroHash { + b.Events = []interface{}{event} + } + + break + } + } +} diff --git a/lastgersync/lastgersync.go b/lastgersync/lastgersync.go new file mode 100644 index 00000000..b49f599f --- /dev/null +++ b/lastgersync/lastgersync.go @@ -0,0 +1,84 @@ +package lastgersync + +import ( + "context" + "time" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/sync" + "github.com/ethereum/go-ethereum/common" +) + +const ( + reorgDetectorID = "lastGERSync" +) + +type LastGERSync struct { + driver *sync.EVMDriver + processor *processor +} + +func New( + ctx context.Context, + dbPath string, + rdL2 sync.ReorgDetector, + l2Client EthClienter, + globalExitRootL2 common.Address, + l1InfoTreesync *l1infotreesync.L1InfoTreeSync, + retryAfterErrorPeriod time.Duration, + maxRetryAttemptsAfterError int, + blockFinality etherman.BlockNumberFinality, + waitForNewBlocksPeriod time.Duration, + downloadBufferSize int, +) (*LastGERSync, error) { + processor, err := newProcessor(dbPath, "lastGERSync") + if err != nil { + return nil, err + } + + rh := &sync.RetryHandler{ + RetryAfterErrorPeriod: retryAfterErrorPeriod, + MaxRetryAttemptsAfterError: maxRetryAttemptsAfterError, + } + bf, err := blockFinality.ToBlockNum() + if err != nil { + return nil, err + } + downloader, err := newDownloader( + l2Client, + globalExitRootL2, + l1InfoTreesync, + processor, + rh, + bf, + waitForNewBlocksPeriod, + ) + if err != nil { + return nil, err + } + + driver, err := sync.NewEVMDriver(rdL2, processor, downloader, reorgDetectorID, downloadBufferSize, rh) + if err != nil { + return nil, err + } + + return &LastGERSync{ + driver: driver, + processor: processor, + }, nil +} + +func (s *LastGERSync) Start(ctx context.Context) { + s.driver.Sync(ctx) +} + +func (s *LastGERSync) GetFirstGERAfterL1InfoTreeIndex( + ctx context.Context, atOrAfterL1InfoTreeIndex uint32, +) (Event, error) { + return s.processor.GetFirstGERAfterL1InfoTreeIndex(ctx, atOrAfterL1InfoTreeIndex) +} + +func (s *LastGERSync) GetLastProcessedBlock(ctx context.Context) (uint64, error) { + return s.processor.GetLastProcessedBlock(ctx) +} diff --git a/lastgersync/migrations/lastgersync0001.sql b/lastgersync/migrations/lastgersync0001.sql new file mode 100644 index 00000000..88021fa1 --- /dev/null +++ b/lastgersync/migrations/lastgersync0001.sql @@ -0,0 +1,14 @@ +-- +migrate Down +DROP TABLE IF EXISTS block; +DROP TABLE IF EXISTS global_exit_root; + +-- +migrate Up +CREATE TABLE block ( + num BIGINT PRIMARY KEY +); + +CREATE TABLE imported_global_exit_root ( + block_num INTEGER PRIMARY KEY REFERENCES block(num) ON DELETE CASCADE, + global_exit_root VARCHAR NOT NULL, + l1_info_tree_index INTEGER NOT NULL +); \ No newline at end of file diff --git a/lastgersync/migrations/migrations.go b/lastgersync/migrations/migrations.go new file mode 100644 index 00000000..e0c13341 --- /dev/null +++ b/lastgersync/migrations/migrations.go @@ -0,0 +1,21 @@ +package migrations + +import ( + _ "embed" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/db/types" +) + +//go:embed lastgersync0001.sql +var mig001 string + +func RunMigrations(dbPath string) error { + migrations := []types.Migration{ + { + ID: "lastgersync0001", + SQL: mig001, + }, + } + return db.RunMigrations(dbPath, migrations) +} diff --git a/lastgersync/processor.go b/lastgersync/processor.go new file mode 100644 index 00000000..88b572b5 --- /dev/null +++ b/lastgersync/processor.go @@ -0,0 +1,138 @@ +package lastgersync + +import ( + "context" + "database/sql" + "errors" + "fmt" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/lastgersync/migrations" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sync" + ethCommon "github.com/ethereum/go-ethereum/common" + "github.com/russross/meddler" +) + +type Event struct { + GlobalExitRoot ethCommon.Hash `meddler:"global_exit_root,hash"` + L1InfoTreeIndex uint32 `meddler:"l1_info_tree_index"` +} + +type eventWithBlockNum struct { + GlobalExitRoot ethCommon.Hash `meddler:"global_exit_root,hash"` + L1InfoTreeIndex uint32 `meddler:"l1_info_tree_index"` + BlockNum uint64 `meddler:"block_num"` +} + +type processor struct { + db *sql.DB + log *log.Logger +} + +func newProcessor(dbPath string, loggerPrefix string) (*processor, error) { + err := migrations.RunMigrations(dbPath) + if err != nil { + return nil, err + } + db, err := db.NewSQLiteDB(dbPath) + if err != nil { + return nil, err + } + logger := log.WithFields("lastger-syncer", loggerPrefix) + return &processor{ + db: db, + log: logger, + }, nil +} + +// GetLastProcessedBlock returns the last processed block by the processor, including blocks +// that don't have events +func (p *processor) GetLastProcessedBlock(ctx context.Context) (uint64, error) { + var lastProcessedBlock uint64 + row := p.db.QueryRow("SELECT num FROM BLOCK ORDER BY num DESC LIMIT 1;") + err := row.Scan(&lastProcessedBlock) + if errors.Is(err, sql.ErrNoRows) { + return 0, nil + } + return lastProcessedBlock, err +} + +func (p *processor) getLastIndex() (uint32, error) { + var lastIndex uint32 + row := p.db.QueryRow(` + SELECT l1_info_tree_index + FROM imported_global_exit_root + ORDER BY l1_info_tree_index DESC LIMIT 1; + `) + err := row.Scan(&lastIndex) + if errors.Is(err, sql.ErrNoRows) { + return 0, nil + } + return lastIndex, err +} + +func (p *processor) ProcessBlock(ctx context.Context, block sync.Block) error { + tx, err := db.NewTx(ctx, p.db) + if err != nil { + return err + } + shouldRollback := true + defer func() { + if shouldRollback { + if errRollback := tx.Rollback(); errRollback != nil { + log.Errorf("error while rolling back tx %v", errRollback) + } + } + }() + + if _, err := tx.Exec(`INSERT INTO block (num) VALUES ($1)`, block.Num); err != nil { + return err + } + for _, e := range block.Events { + event, ok := e.(Event) + if !ok { + return errors.New("failed to convert sync.Block.Event to Event") + } + if err = meddler.Insert(tx, "imported_global_exit_root", &eventWithBlockNum{ + GlobalExitRoot: event.GlobalExitRoot, + L1InfoTreeIndex: event.L1InfoTreeIndex, + BlockNum: block.Num, + }); err != nil { + return err + } + } + + if err := tx.Commit(); err != nil { + return err + } + shouldRollback = false + p.log.Debugf("processed %d events until block %d", len(block.Events), block.Num) + return nil +} + +func (p *processor) Reorg(ctx context.Context, firstReorgedBlock uint64) error { + _, err := p.db.Exec(`DELETE FROM block WHERE num >= $1;`, firstReorgedBlock) + return fmt.Errorf("error processing reorg: %w", err) +} + +// GetFirstGERAfterL1InfoTreeIndex returns the first GER injected on the chain that is related to l1InfoTreeIndex +// or greater +func (p *processor) GetFirstGERAfterL1InfoTreeIndex( + ctx context.Context, l1InfoTreeIndex uint32, +) (Event, error) { + e := Event{} + err := meddler.QueryRow(p.db, &e, ` + SELECT l1_info_tree_index, global_exit_root + FROM imported_global_exit_root + WHERE l1_info_tree_index >= $1 + ORDER BY l1_info_tree_index ASC LIMIT 1; + `, l1InfoTreeIndex) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return e, db.ErrNotFound + } + return e, err + } + return e, nil +} diff --git a/log/config.go b/log/config.go new file mode 100644 index 00000000..4ebbf502 --- /dev/null +++ b/log/config.go @@ -0,0 +1,15 @@ +package log + +// Config for log +type Config struct { + // Environment defining the log format ("production" or "development"). + // In development mode enables development mode (which makes DPanicLevel logs panic), + // uses a console encoder, writes to standard error, and disables sampling. + // Stacktraces are automatically included on logs of WarnLevel and above. + // Check [here](https://pkg.go.dev/go.uber.org/zap@v1.24.0#NewDevelopmentConfig) + Environment LogEnvironment `mapstructure:"Environment" jsonschema:"enum=production,enum=development"` + // Level of log. As lower value more logs are going to be generated + Level string `mapstructure:"Level" jsonschema:"enum=debug,enum=info,enum=warn,enum=error,enum=dpanic,enum=panic,enum=fatal"` //nolint:lll + // Outputs + Outputs []string `mapstructure:"Outputs"` +} diff --git a/log/log.go b/log/log.go new file mode 100644 index 00000000..2c390730 --- /dev/null +++ b/log/log.go @@ -0,0 +1,330 @@ +package log + +import ( + "fmt" + "os" + "strings" + "sync/atomic" + + zkevm "github.com/agglayer/aggkit" + "github.com/hermeznetwork/tracerr" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +// LogEnvironment represents the possible log environments. +type LogEnvironment string + +const ( + // EnvironmentProduction production log environment. + EnvironmentProduction = LogEnvironment("production") + // EnvironmentDevelopment development log environment. + EnvironmentDevelopment = LogEnvironment("development") +) + +// Logger is a wrapper providing logging facilities. +type Logger struct { + x *zap.SugaredLogger +} + +// root logger +var log atomic.Pointer[Logger] + +func GetDefaultLogger() *Logger { + l := log.Load() + if l != nil { + return l + } + // default level: debug + zapLogger, _, err := NewLogger( + Config{ + Environment: EnvironmentDevelopment, + Level: "debug", + Outputs: []string{"stderr"}, + }) + if err != nil { + panic(err) + } + log.Store(&Logger{x: zapLogger}) + return log.Load() +} + +// Init the logger with defined level. outputs defines the outputs where the +// logs will be sent. By default outputs contains "stdout", which prints the +// logs at the output of the process. To add a log file as output, the path +// should be added at the outputs array. To avoid printing the logs but storing +// them on a file, can use []string{"pathtofile.log"} +func Init(cfg Config) { + zapLogger, _, err := NewLogger(cfg) + if err != nil { + panic(err) + } + log.Store(&Logger{x: zapLogger}) +} + +// NewLogger creates the logger with defined level. outputs defines the outputs where the +// logs will be sent. By default, outputs contains "stdout", which prints the +// logs at the output of the process. To add a log file as output, the path +// should be added at the outputs array. To avoid printing the logs but storing +// them on a file, can use []string{"pathtofile.log"} +func NewLogger(cfg Config) (*zap.SugaredLogger, *zap.AtomicLevel, error) { + var level zap.AtomicLevel + err := level.UnmarshalText([]byte(cfg.Level)) + if err != nil { + return nil, nil, fmt.Errorf("error on setting log level: %w", err) + } + + var zapCfg zap.Config + + switch cfg.Environment { + case EnvironmentProduction: + zapCfg = zap.NewProductionConfig() + default: + zapCfg = zap.NewDevelopmentConfig() + zapCfg.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder + } + zapCfg.Level = level + zapCfg.OutputPaths = cfg.Outputs + zapCfg.InitialFields = map[string]interface{}{ + "version": zkevm.Version, + "pid": os.Getpid(), + } + + logger, err := zapCfg.Build() + if err != nil { + return nil, nil, err + } + defer logger.Sync() //nolint:errcheck + + // skip 2 callers: one for our wrapper methods and one for the package functions + withOptions := logger.WithOptions(zap.AddCallerSkip(2)) //nolint:mnd + return withOptions.Sugar(), &level, nil +} + +// WithFields returns a new Logger (derived from the root one) with additional +// fields as per keyValuePairs. The root Logger instance is not affected. +func WithFields(keyValuePairs ...interface{}) *Logger { + l := GetDefaultLogger().WithFields(keyValuePairs...) + + // since we are returning a new instance, remove one caller from the + // stack, because we'll be calling the retruned Logger methods + // directly, not the package functions. + x := l.x.WithOptions(zap.AddCallerSkip(-1)) + l.x = x + return l +} + +// WithFields returns a new Logger with additional fields as per keyValuePairs. +// The original Logger instance is not affected. +func (l *Logger) WithFields(keyValuePairs ...interface{}) *Logger { + return &Logger{ + x: l.x.With(keyValuePairs...), + } +} + +// GetSugaredLogger is a getter function that returns instance of already built zap.SugaredLogger. +func (l *Logger) GetSugaredLogger() *zap.SugaredLogger { + return l.x +} + +func sprintStackTrace(st []tracerr.Frame) string { + builder := strings.Builder{} + // Skip deepest frame because it belongs to the go runtime and we don't + // care about it. + if len(st) > 0 { + st = st[:len(st)-1] + } + for _, f := range st { + builder.WriteString(fmt.Sprintf("\n%s:%d %s()", f.Path, f.Line, f.Func)) + } + builder.WriteString("\n") + return builder.String() +} + +// appendStackTraceMaybeArgs will append the stacktrace to the args +func appendStackTraceMaybeArgs(args []interface{}) []interface{} { + for i := range args { + if err, ok := args[i].(error); ok { + err = tracerr.Wrap(err) + st := tracerr.StackTrace(err) + return append(args, sprintStackTrace(st)) + } + } + return args +} + +// Debug calls log.Debug +func (l *Logger) Debug(args ...interface{}) { + l.x.Debug(args...) +} + +// Info calls log.Info +func (l *Logger) Info(args ...interface{}) { + l.x.Info(args...) +} + +// Warn calls log.Warn +func (l *Logger) Warn(args ...interface{}) { + l.x.Warn(args...) +} + +// Error calls log.Error +func (l *Logger) Error(args ...interface{}) { + l.x.Error(args...) +} + +// Fatal calls log.Fatal +func (l *Logger) Fatal(args ...interface{}) { + l.x.Fatal(args...) +} + +// Debugf calls log.Debugf +func (l *Logger) Debugf(template string, args ...interface{}) { + l.x.Debugf(template, args...) +} + +// Infof calls log.Infof +func (l *Logger) Infof(template string, args ...interface{}) { + l.x.Infof(template, args...) +} + +// Warnf calls log.Warnf +func (l *Logger) Warnf(template string, args ...interface{}) { + l.x.Warnf(template, args...) +} + +// Fatalf calls log.Fatalf +func (l *Logger) Fatalf(template string, args ...interface{}) { + l.x.Fatalf(template, args...) +} + +// Errorf calls log.Errorf and stores the error message into the ErrorFile +func (l *Logger) Errorf(template string, args ...interface{}) { + l.x.Errorf(template, args...) +} + +// Debug calls log.Debug on the root Logger. +func Debug(args ...interface{}) { + GetDefaultLogger().Debug(args...) +} + +// Info calls log.Info on the root Logger. +func Info(args ...interface{}) { + GetDefaultLogger().Info(args...) +} + +// Warn calls log.Warn on the root Logger. +func Warn(args ...interface{}) { + GetDefaultLogger().Warn(args...) +} + +// Error calls log.Error on the root Logger. +func Error(args ...interface{}) { + args = appendStackTraceMaybeArgs(args) + GetDefaultLogger().Error(args...) +} + +// Fatal calls log.Fatal on the root Logger. +func Fatal(args ...interface{}) { + args = appendStackTraceMaybeArgs(args) + GetDefaultLogger().Fatal(args...) +} + +// Debugf calls log.Debugf on the root Logger. +func Debugf(template string, args ...interface{}) { + GetDefaultLogger().Debugf(template, args...) +} + +// Infof calls log.Infof on the root Logger. +func Infof(template string, args ...interface{}) { + GetDefaultLogger().Infof(template, args...) +} + +// Warnf calls log.Warnf on the root Logger. +func Warnf(template string, args ...interface{}) { + GetDefaultLogger().Warnf(template, args...) +} + +// Fatalf calls log.Fatalf on the root Logger. +func Fatalf(template string, args ...interface{}) { + args = appendStackTraceMaybeArgs(args) + GetDefaultLogger().Fatalf(template, args...) +} + +// Errorf calls log.Errorf on the root logger and stores the error message into +// the ErrorFile. +func Errorf(template string, args ...interface{}) { + args = appendStackTraceMaybeArgs(args) + GetDefaultLogger().Errorf(template, args...) +} + +// Debugw calls log.Debugw +func (l *Logger) Debugw(msg string, kv ...interface{}) { + l.x.Debugw(msg, kv...) +} + +// Infow calls log.Infow +func (l *Logger) Infow(msg string, kv ...interface{}) { + l.x.Infow(msg, kv...) +} + +// Warnw calls log.Warnw +func (l *Logger) Warnw(msg string, kv ...interface{}) { + l.x.Warnw(msg, kv...) +} + +// Errorw calls log.Errorw +func (l *Logger) Errorw(msg string, kv ...interface{}) { + l.x.Errorw(msg, kv...) +} + +// Fatalw calls log.Fatalw +func (l *Logger) Fatalw(msg string, kv ...interface{}) { + l.x.Fatalw(msg, kv...) +} + +// Debugw calls log.Debugw on the root Logger. +func Debugw(msg string, kv ...interface{}) { + GetDefaultLogger().Debugw(msg, kv...) +} + +// Infow calls log.Infow on the root Logger. +func Infow(msg string, kv ...interface{}) { + GetDefaultLogger().Infow(msg, kv...) +} + +// Warnw calls log.Warnw on the root Logger. +func Warnw(msg string, kv ...interface{}) { + GetDefaultLogger().Warnw(msg, kv...) +} + +// Errorw calls log.Errorw on the root Logger. +func Errorw(msg string, kv ...interface{}) { + msg = appendStackTraceMaybeKV(msg, kv) + GetDefaultLogger().Errorw(msg, kv...) +} + +// Fatalw calls log.Fatalw on the root Logger. +func Fatalw(msg string, kv ...interface{}) { + msg = appendStackTraceMaybeKV(msg, kv) + GetDefaultLogger().Fatalw(msg, kv...) +} + +// appendStackTraceMaybeKV will append the stacktrace to the KV +func appendStackTraceMaybeKV(msg string, kv []interface{}) string { + for i := range kv { + if i%2 == 0 { + continue + } + if err, ok := kv[i].(error); ok { + err = tracerr.Wrap(err) + st := tracerr.StackTrace(err) + return fmt.Sprintf("%v: %v%v\n", msg, err, sprintStackTrace(st)) + } + } + return msg +} + +func (l *Logger) IsEnabledLogLevel(lvl zapcore.Level) bool { + return l.x.Level().Enabled(lvl) +} diff --git a/log/log_test.go b/log/log_test.go new file mode 100644 index 00000000..9a596608 --- /dev/null +++ b/log/log_test.go @@ -0,0 +1,37 @@ +package log + +import ( + "testing" +) + +func TestLogNotInitialized(t *testing.T) { + Info("Test log.Info", " value is ", 10) + Infof("Test log.Infof %d", 10) + Infow("Test log.Infow", "value", 10) + Debugf("Test log.Debugf %d", 10) + Error("Test log.Error", " value is ", 10) + Errorf("Test log.Errorf %d", 10) + Errorw("Test log.Errorw", "value", 10) + Warnf("Test log.Warnf %d", 10) + Warnw("Test log.Warnw", "value", 10) +} + +func TestLog(t *testing.T) { + cfg := Config{ + Environment: EnvironmentDevelopment, + Level: "debug", + Outputs: []string{"stderr"}, // []string{"stdout", "test.log"} + } + + Init(cfg) + + Info("Test log.Info", " value is ", 10) + Infof("Test log.Infof %d", 10) + Infow("Test log.Infow", "value", 10) + Debugf("Test log.Debugf %d", 10) + Error("Test log.Error", " value is ", 10) + Errorf("Test log.Errorf %d", 10) + Errorw("Test log.Errorw", "value", 10) + Warnf("Test log.Warnf %d", 10) + Warnw("Test log.Warnw", "value", 10) +} diff --git a/merkletree/key.go b/merkletree/key.go new file mode 100644 index 00000000..7926df60 --- /dev/null +++ b/merkletree/key.go @@ -0,0 +1,207 @@ +package merkletree + +import ( + "math" + "math/big" + + "github.com/ethereum/go-ethereum/common" + poseidon "github.com/iden3/go-iden3-crypto/goldenposeidon" +) + +// Key stores key of the leaf +type Key [32]byte + +const ( + // HashPoseidonAllZeroes represents the poseidon hash for an input with all + // bits set to zero. + HashPoseidonAllZeroes = "0xc71603f33a1144ca7953db0ab48808f4c4055e3364a246c33c18a9786cb0b359" +) + +// keyEthAddr is the common code for all the keys related to ethereum addresses. +func keyEthAddr(ethAddr common.Address, leafType leafType, key1Capacity [4]uint64) ([]byte, error) { + ethAddrBI := new(big.Int).SetBytes(ethAddr.Bytes()) + ethAddrArr := scalar2fea(ethAddrBI) + + key1 := [8]uint64{ + ethAddrArr[0], + ethAddrArr[1], + ethAddrArr[2], + ethAddrArr[3], + ethAddrArr[4], + 0, + uint64(leafType), + 0, + } + + result, err := poseidon.Hash(key1, key1Capacity) + if err != nil { + return nil, err + } + + return h4ToFilledByteSlice(result[:]), nil +} + +func defaultCapIn() ([4]uint64, error) { + capIn, err := StringToh4(HashPoseidonAllZeroes) + if err != nil { + return [4]uint64{}, err + } + + return [4]uint64{capIn[0], capIn[1], capIn[2], capIn[3]}, nil +} + +// KeyEthAddrBalance returns the key of balance leaf: +// hk0: H([0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0]) +// key: H([ethAddr[0:4], ethAddr[4:8], ethAddr[8:12], ethAddr[12:16], ethAddr[16:20], 0, 0, 0], +// [hk0[0], hk0[1], hk0[2], hk0[3]]) +func KeyEthAddrBalance(ethAddr common.Address) ([]byte, error) { + capIn, err := defaultCapIn() + if err != nil { + return nil, err + } + + return keyEthAddr(ethAddr, LeafTypeBalance, capIn) +} + +// KeyEthAddrNonce returns the key of nonce leaf: +// hk0: H([0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0]) +// key: H([ethAddr[0:4], ethAddr[4:8], ethAddr[8:12], ethAddr[12:16], ethAddr[16:20], 0, 1, 0], +// [hk0[0], hk0[1], hk0[2], hk0[3]] +func KeyEthAddrNonce(ethAddr common.Address) ([]byte, error) { + capIn, err := defaultCapIn() + if err != nil { + return nil, err + } + + return keyEthAddr(ethAddr, LeafTypeNonce, capIn) +} + +// KeyContractCode returns the key of contract code leaf: +// hk0: H([0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0]) +// key: H([ethAddr[0:4], ethAddr[4:8], ethAddr[8:12], ethAddr[12:16], ethAddr[16:20], 0, 2, 0], +// [hk0[0], hk0[1], hk0[2], hk0[3]] +func KeyContractCode(ethAddr common.Address) ([]byte, error) { + capIn, err := defaultCapIn() + if err != nil { + return nil, err + } + + return keyEthAddr(ethAddr, LeafTypeCode, capIn) +} + +// KeyContractStorage returns the key of contract storage position leaf: +// hk0: H([stoPos[0:4], stoPos[4:8], stoPos[8:12], stoPos[12:16], stoPos[16:20], stoPos[20:24], +// stoPos[24:28], stoPos[28:32], [0, 0, 0, 0]) +// key: H([ethAddr[0:4], ethAddr[4:8], ethAddr[8:12], ethAddr[12:16], ethAddr[16:20], 0, 3, 0], +// [hk0[0], hk0[1], hk0[2], hk0[3]) +func KeyContractStorage(ethAddr common.Address, storagePos []byte) ([]byte, error) { + storageBI := new(big.Int).SetBytes(storagePos) + + storageArr := scalar2fea(storageBI) + + hk0, err := poseidon.Hash([8]uint64{ + storageArr[0], + storageArr[1], + storageArr[2], + storageArr[3], + storageArr[4], + storageArr[5], + storageArr[6], + storageArr[7], + }, [4]uint64{}) + if err != nil { + return nil, err + } + + return keyEthAddr(ethAddr, LeafTypeStorage, hk0) +} + +// HashContractBytecode computes the bytecode hash in order to add it to the +// state-tree. +func HashContractBytecode(code []byte) ([]uint64, error) { + const ( + bytecodeElementsHash = 8 + bytecodeBytesElement = 7 + + maxBytesToAdd = bytecodeElementsHash * bytecodeBytesElement + ) + + // add 0x01 + code = append(code, 0x01) //nolint:mnd + + // add padding + for len(code)%(56) != 0 { + code = append(code, 0x00) //nolint:mnd + } + + code[len(code)-1] = code[len(code)-1] | 0x80 //nolint:mnd + + numHashes := int(math.Ceil(float64(len(code)) / float64(maxBytesToAdd))) + + tmpHash := [4]uint64{} + var err error + + bytesPointer := 0 + for i := 0; i < numHashes; i++ { + elementsToHash := [12]uint64{} + + for j := 0; j < 4; j++ { + elementsToHash[j] = tmpHash[j] + } + + subsetBytecode := code[bytesPointer : int(math.Min(float64(len(code)-1), float64(bytesPointer+maxBytesToAdd)))+1] + bytesPointer += maxBytesToAdd + tmpElem := [7]byte{} + counter := 0 + index := 4 + for j := 0; j < maxBytesToAdd; j++ { + byteToAdd := []byte{0} + + if j < len(subsetBytecode) { + byteToAdd = subsetBytecode[j : j+1] + } + + tmpElem[bytecodeBytesElement-1-counter] = byteToAdd[0] + counter++ + + if counter == bytecodeBytesElement { + elementsToHash[index] = new(big.Int).SetBytes(tmpElem[:]).Uint64() + index++ + tmpElem = [7]byte{} + counter = 0 + } + } + tmpHash, err = poseidon.Hash([8]uint64{ + elementsToHash[4], + elementsToHash[5], + elementsToHash[6], + elementsToHash[7], + elementsToHash[8], + elementsToHash[9], + elementsToHash[10], + elementsToHash[11], + }, [4]uint64{ + elementsToHash[0], + elementsToHash[1], + elementsToHash[2], + elementsToHash[3], + }) + if err != nil { + return nil, err + } + } + return tmpHash[:], nil +} + +// KeyCodeLength returns the key of code length leaf: +// hk0: H([0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0]) +// key: H([ethAddr[0:4], ethAddr[4:8], ethAddr[8:12], ethAddr[12:16], ethAddr[16:20], 0, 4, 0], +// [hk0[0], hk0[1], hk0[2], hk0[3]] +func KeyCodeLength(ethAddr common.Address) ([]byte, error) { + capIn, err := defaultCapIn() + if err != nil { + return nil, err + } + + return keyEthAddr(ethAddr, LeafTypeSCLength, capIn) +} diff --git a/merkletree/key_test.go b/merkletree/key_test.go new file mode 100644 index 00000000..fab056f9 --- /dev/null +++ b/merkletree/key_test.go @@ -0,0 +1,127 @@ +package merkletree + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "math/big" + "os" + "path" + "runtime" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type testVectorKey struct { + EthAddr string `json:"ethAddr"` + StoragePosition string `json:"storagePosition"` + ExpectedKey string `json:"expectedKey"` +} + +type bytecodeTest struct { + Bytecode string `json:"bytecode"` + ExpectedHash string `json:"expectedHash"` +} + +func init() { + // Change dir to project root + // This is important because we have relative paths to files containing test vectors + _, filename, _, _ := runtime.Caller(0) //nolint:dogsled + dir := path.Join(path.Dir(filename), "../") + + if err := os.Chdir(dir); err != nil { + panic(err) + } +} + +func Test_CommonKeys(t *testing.T) { + tcs := []struct { + description string + testVectorFile string + keyFunc func(common.Address) ([]byte, error) + }{ + { + description: "keyEthAddressBalance", + testVectorFile: "test/vectors/src/merkle-tree/smt-key-eth-balance.json", + keyFunc: KeyEthAddrBalance, + }, + { + description: "keyEthAddressNonce", + testVectorFile: "test/vectors/src/merkle-tree/smt-key-eth-nonce.json", + keyFunc: KeyEthAddrNonce, + }, + { + description: "keyContractCode", + testVectorFile: "test/vectors/src/merkle-tree/smt-key-contract-code.json", + keyFunc: KeyContractCode, + }, + { + description: "keyCodeLength", + testVectorFile: "test/vectors/src/merkle-tree/smt-key-contract-length.json", + keyFunc: KeyCodeLength, + }, + } + for _, tc := range tcs { + tc := tc + + data, err := os.ReadFile(tc.testVectorFile) + require.NoError(t, err) + + var testVectors []testVectorKey + err = json.Unmarshal(data, &testVectors) + require.NoError(t, err) + + for ti, testVector := range testVectors { + t.Run(fmt.Sprintf("%s, test vector %d", tc.description, ti), func(t *testing.T) { + key, err := tc.keyFunc(common.HexToAddress(testVector.EthAddr)) + require.NoError(t, err) + require.Equal(t, len(key), maxBigIntLen) + + expected, _ := new(big.Int).SetString(testVector.ExpectedKey, 10) + assert.Equal(t, hex.EncodeToString(expected.Bytes()), hex.EncodeToString(key)) + }) + } + } +} + +func Test_KeyContractStorage(t *testing.T) { + data, err := os.ReadFile("test/vectors/src/merkle-tree/smt-key-contract-storage.json") + require.NoError(t, err) + + var testVectors []testVectorKey + err = json.Unmarshal(data, &testVectors) + require.NoError(t, err) + + for ti, testVector := range testVectors { + t.Run(fmt.Sprintf("Test vector %d", ti), func(t *testing.T) { + storagePosition, ok := new(big.Int).SetString(testVector.StoragePosition, 10) + require.True(t, ok) + key, err := KeyContractStorage(common.HexToAddress(testVector.EthAddr), storagePosition.Bytes()) + require.NoError(t, err) + require.Equal(t, len(key), maxBigIntLen) + + expected, _ := new(big.Int).SetString(testVector.ExpectedKey, 10) + assert.Equal(t, hex.EncodeToString(expected.Bytes()), hex.EncodeToString(key)) + }) + } +} + +func Test_byteCodeHash(t *testing.T) { + data, err := os.ReadFile("test/vectors/src/merkle-tree/smt-hash-bytecode.json") + require.NoError(t, err) + + var testVectors []bytecodeTest + err = json.Unmarshal(data, &testVectors) + require.NoError(t, err) + + for ti, testVector := range testVectors { + t.Run(fmt.Sprintf("Test vector %d", ti), func(t *testing.T) { + hash, err := HashContractBytecode(common.Hex2Bytes(testVector.Bytecode)) + require.NoError(t, err) + assert.Equal(t, common.HexToHash(testVector.ExpectedHash), common.HexToHash(H4ToString(hash))) + }) + } +} diff --git a/merkletree/leaf.go b/merkletree/leaf.go new file mode 100644 index 00000000..5321f69a --- /dev/null +++ b/merkletree/leaf.go @@ -0,0 +1,17 @@ +package merkletree + +// leafType specifies type of the leaf +type leafType uint8 + +const ( + // LeafTypeBalance specifies that leaf stores Balance + LeafTypeBalance leafType = 0 + // LeafTypeNonce specifies that leaf stores Nonce + LeafTypeNonce leafType = 1 + // LeafTypeCode specifies that leaf stores Code + LeafTypeCode leafType = 2 + // LeafTypeStorage specifies that leaf stores Storage Value + LeafTypeStorage leafType = 3 + // LeafTypeSCLength specifies that leaf stores Storage Value + LeafTypeSCLength leafType = 4 +) diff --git a/merkletree/split.go b/merkletree/split.go new file mode 100644 index 00000000..68032363 --- /dev/null +++ b/merkletree/split.go @@ -0,0 +1,96 @@ +package merkletree + +import ( + "encoding/binary" + "fmt" + "math/big" + "strings" + + "github.com/agglayer/aggkit/hex" +) + +// maxBigIntLen is 256 bits (32 bytes) +const maxBigIntLen = 32 + +// wordLength is the number of bits of each ff limb +const wordLength = 64 + +// scalar2fea splits a *big.Int into array of 32bit uint64 values. +func scalar2fea(value *big.Int) []uint64 { + val := make([]uint64, 8) //nolint:mnd + mask, _ := new(big.Int).SetString("FFFFFFFF", 16) //nolint:mnd + val[0] = new(big.Int).And(value, mask).Uint64() + val[1] = new(big.Int).And(new(big.Int).Rsh(value, 32), mask).Uint64() //nolint:mnd + val[2] = new(big.Int).And(new(big.Int).Rsh(value, 64), mask).Uint64() //nolint:mnd + val[3] = new(big.Int).And(new(big.Int).Rsh(value, 96), mask).Uint64() //nolint:mnd + val[4] = new(big.Int).And(new(big.Int).Rsh(value, 128), mask).Uint64() //nolint:mnd + val[5] = new(big.Int).And(new(big.Int).Rsh(value, 160), mask).Uint64() //nolint:mnd + val[6] = new(big.Int).And(new(big.Int).Rsh(value, 192), mask).Uint64() //nolint:mnd + val[7] = new(big.Int).And(new(big.Int).Rsh(value, 224), mask).Uint64() //nolint:mnd + return val +} + +// h4ToScalar converts array of 4 uint64 into a unique 256 bits scalar. +func h4ToScalar(h4 []uint64) *big.Int { + if len(h4) == 0 { + return new(big.Int) + } + result := new(big.Int).SetUint64(h4[0]) + + for i := 1; i < 4; i++ { + b2 := new(big.Int).SetUint64(h4[i]) + b2.Lsh(b2, uint(wordLength*i)) + result = result.Add(result, b2) + } + + return result +} + +// H4ToString converts array of 4 Scalars of 64 bits into an hex string. +func H4ToString(h4 []uint64) string { + sc := h4ToScalar(h4) + + return fmt.Sprintf("0x%064s", hex.EncodeToString(sc.Bytes())) +} + +// StringToh4 converts an hex string into array of 4 Scalars of 64 bits. +func StringToh4(str string) ([]uint64, error) { + str = strings.TrimPrefix(str, "0x") + + bi, ok := new(big.Int).SetString(str, hex.Base) + if !ok { + return nil, fmt.Errorf("could not convert %q into big int", str) + } + + return scalarToh4(bi), nil +} + +// scalarToh4 converts a *big.Int into an array of 4 uint64 +func scalarToh4(s *big.Int) []uint64 { + b := ScalarToFilledByteSlice(s) + + r := make([]uint64, 4) //nolint:mnd + + f, _ := hex.DecodeHex("0xFFFFFFFFFFFFFFFF") + fbe := binary.BigEndian.Uint64(f) + + r[3] = binary.BigEndian.Uint64(b[0:8]) & fbe + r[2] = binary.BigEndian.Uint64(b[8:16]) & fbe + r[1] = binary.BigEndian.Uint64(b[16:24]) & fbe + r[0] = binary.BigEndian.Uint64(b[24:]) & fbe + + return r +} + +// ScalarToFilledByteSlice converts a *big.Int into an array of maxBigIntLen +// bytes. +func ScalarToFilledByteSlice(s *big.Int) []byte { + buf := make([]byte, maxBigIntLen) + return s.FillBytes(buf) +} + +// h4ToFilledByteSlice converts an array of 4 uint64 into an array of +// maxBigIntLen bytes. +func h4ToFilledByteSlice(h4 []uint64) []byte { + return ScalarToFilledByteSlice(h4ToScalar(h4)) +} diff --git a/merkletree/split_test.go b/merkletree/split_test.go new file mode 100644 index 00000000..70b99b7e --- /dev/null +++ b/merkletree/split_test.go @@ -0,0 +1,276 @@ +package merkletree + +import ( + "fmt" + "math/big" + "reflect" + "testing" + + "github.com/agglayer/aggkit/hex" + "github.com/agglayer/aggkit/test/testutils" + "github.com/stretchr/testify/require" +) + +func TestScalar2Fea(t *testing.T) { + tests := []struct { + name string + input string + expected []uint64 + }{ + { + name: "Zero value", + input: "0", + expected: []uint64{0, 0, 0, 0, 0, 0, 0, 0}, + }, + { + name: "Single 32-bit value", + input: "FFFFFFFF", + expected: []uint64{0xFFFFFFFF, 0, 0, 0, 0, 0, 0, 0}, + }, + { + name: "Mixed bits across chunks (128-bit)", + input: "1234567890ABCDEF1234567890ABCDEF", + expected: []uint64{0x90ABCDEF, 0x12345678, 0x90ABCDEF, 0x12345678, 0, 0, 0, 0}, + }, + { + name: "All bits set in each 32-bit chunk (256-bit)", + input: "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + expected: []uint64{0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + inputVal, success := new(big.Int).SetString(tt.input, 16) + if !success { + t.Fatalf("Invalid input value: %s", tt.input) + } + + result := scalar2fea(inputVal) + + if !reflect.DeepEqual(result, tt.expected) { + t.Errorf("scalar2fea(%s) = %v, want %v", tt.input, result, tt.expected) + } + }) + } +} + +func Test_h4ToScalar(t *testing.T) { + tcs := []struct { + input []uint64 + expected string + }{ + { + input: []uint64{0, 0, 0, 0}, + expected: "0", + }, + { + input: []uint64{0, 1, 2, 3}, + expected: "18831305206160042292187933003464876175252262292329349513216", + }, + } + + for i, tc := range tcs { + tc := tc + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + actual := h4ToScalar(tc.input) + expected, ok := new(big.Int).SetString(tc.expected, 10) + require.True(t, ok) + require.Equal(t, expected, actual) + }) + } +} + +func Test_scalarToh4(t *testing.T) { + tcs := []struct { + input string + expected []uint64 + }{ + { + input: "0", + expected: []uint64{0, 0, 0, 0}, + }, + { + input: "18831305206160042292187933003464876175252262292329349513216", + expected: []uint64{0, 1, 2, 3}, + }, + } + + for i, tc := range tcs { + tc := tc + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + bi, ok := new(big.Int).SetString(tc.input, 10) + require.True(t, ok) + + actual := scalarToh4(bi) + require.Equal(t, tc.expected, actual) + }) + } +} + +func Test_h4ToString(t *testing.T) { + tcs := []struct { + input []uint64 + expected string + }{ + { + input: []uint64{0, 0, 0, 0}, + expected: "0x0000000000000000000000000000000000000000000000000000000000000000", + }, + { + input: []uint64{0, 1, 2, 3}, + expected: "0x0000000000000003000000000000000200000000000000010000000000000000", + }, + } + + for i, tc := range tcs { + tc := tc + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + actual := H4ToString(tc.input) + require.Equal(t, tc.expected, actual) + }) + } +} + +func Test_Conversions(t *testing.T) { + tcs := []struct { + input []uint64 + }{ + { + input: []uint64{0, 0, 0, 0}, + }, + { + input: []uint64{0, 1, 2, 3}, + }, + } + + for i, tc := range tcs { + tc := tc + t.Run(fmt.Sprintf("case %d", i), func(t *testing.T) { + resScalar := h4ToScalar(tc.input) + init := scalarToh4(resScalar) + require.Equal(t, tc.input, init) + }) + } +} + +func Test_stringToh4(t *testing.T) { + tcs := []struct { + description string + input string + expected []uint64 + expectedErr bool + expectedErrMsg string + }{ + { + description: "happy path", + input: "cafe", + expected: []uint64{51966, 0, 0, 0}, + }, + { + description: "0x prefix is allowed", + input: "0xcafe", + expected: []uint64{51966, 0, 0, 0}, + }, + + { + description: "non hex input causes error", + input: "yu74", + expectedErr: true, + expectedErrMsg: "could not convert \"yu74\" into big int", + }, + { + description: "empty input causes error", + input: "", + expectedErr: true, + expectedErrMsg: "could not convert \"\" into big int", + }, + } + + for _, tc := range tcs { + tc := tc + t.Run(tc.description, func(t *testing.T) { + actual, err := StringToh4(tc.input) + require.NoError(t, testutils.CheckError(err, tc.expectedErr, tc.expectedErrMsg)) + + require.Equal(t, tc.expected, actual) + }) + } +} + +func Test_ScalarToFilledByteSlice(t *testing.T) { + tcs := []struct { + input string + expected string + }{ + { + input: "0", + expected: "0x0000000000000000000000000000000000000000000000000000000000000000", + }, + { + input: "256", + expected: "0x0000000000000000000000000000000000000000000000000000000000000100", + }, + { + input: "235938498573495379548793890390932048239042839490238", + expected: "0x0000000000000000000000a16f882ee8972432c0a71c5e309ad5f7215690aebe", + }, + { + input: "4309593458485959083095843905390485089430985490434080439904305093450934509490", + expected: "0x098724b9a1bc97eee674cf5b6b56b8fafd83ac49c3da1f2c87c822548bbfdfb2", + }, + { + input: "98999023430240239049320492430858334093493024832984092384902398409234090932489", + expected: "0xdadf762a31e865f150a1456d7db7963c91361b771c8381a3fb879cf5bf91b909", + }, + } + + for i, tc := range tcs { + tc := tc + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + input, ok := big.NewInt(0).SetString(tc.input, 10) + require.True(t, ok) + + actualSlice := ScalarToFilledByteSlice(input) + + actual := hex.EncodeToHex(actualSlice) + + require.Equal(t, tc.expected, actual) + }) + } +} + +func Test_h4ToFilledByteSlice(t *testing.T) { + tcs := []struct { + input []uint64 + expected string + }{ + { + input: []uint64{0, 0, 0, 0}, + expected: "0x0000000000000000000000000000000000000000000000000000000000000000", + }, + { + input: []uint64{0, 1, 2, 3}, + expected: "0x0000000000000003000000000000000200000000000000010000000000000000", + }, + { + input: []uint64{55345354959, 991992992929, 2, 3}, + expected: "0x00000000000000030000000000000002000000e6f763d4a10000000ce2d718cf", + }, + { + input: []uint64{8398349845894398543, 3485942349435495945, 734034022234249459, 5490434584389534589}, + expected: "0x4c31f12a390ec37d0a2fd00ddc52d8f330608e18f597e609748ceeb03ffe024f", + }, + } + + for i, tc := range tcs { + tc := tc + t.Run(fmt.Sprintf("test case %d", i), func(t *testing.T) { + actualSlice := h4ToFilledByteSlice(tc.input) + + actual := hex.EncodeToHex(actualSlice) + + require.Equal(t, tc.expected, actual) + }) + } +} diff --git a/packaging/deb/cdk/DEBIAN/postinst b/packaging/deb/cdk/DEBIAN/postinst new file mode 100755 index 00000000..8b449361 --- /dev/null +++ b/packaging/deb/cdk/DEBIAN/postinst @@ -0,0 +1,12 @@ +#!/bin/bash +# This is a postinstallation script so the service can be configured and started when requested +# +adduser --disabled-password --disabled-login --shell /usr/sbin/nologin --quiet --system --no-create-home --home /nonexistent aggkit +if [ -d "/opt/aggkit" ] +then + echo "Directory /opt/aggkit exists." +else + mkdir -p /opt/aggkit + chown -R aggkit /opt/aggkit +fi +systemctl daemon-reload diff --git a/packaging/deb/cdk/DEBIAN/postrm b/packaging/deb/cdk/DEBIAN/postrm new file mode 100755 index 00000000..458fbd7c --- /dev/null +++ b/packaging/deb/cdk/DEBIAN/postrm @@ -0,0 +1,8 @@ +#!/bin/bash +# +############### +# Remove aggkit installs +############## +#rm -rf /lib/systemd/system/aggkit.service +deluser aggkit +#systemctl daemon-reload diff --git a/packaging/systemd/cdk.service.example b/packaging/systemd/cdk.service.example new file mode 100644 index 00000000..a36fda12 --- /dev/null +++ b/packaging/systemd/cdk.service.example @@ -0,0 +1,16 @@ +[Unit] + Description=aggkit + StartLimitIntervalSec=500 + StartLimitBurst=5 + +[Service] + Restart=on-failure + RestartSec=5s + ExecStart=/usr/bin/aggkit --config $config --chain $chain node + Type=simple + KillSignal=SIGINT + User=aggkit + TimeoutStopSec=120 + +[Install] + WantedBy=multi-user.target diff --git a/proto/include/google/protobuf/empty.proto b/proto/include/google/protobuf/empty.proto new file mode 100644 index 00000000..22274621 --- /dev/null +++ b/proto/include/google/protobuf/empty.proto @@ -0,0 +1,51 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "google.golang.org/protobuf/types/known/emptypb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "EmptyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +message Empty {} diff --git a/proto/src/proto/aggregator/v1/aggregator.proto b/proto/src/proto/aggregator/v1/aggregator.proto new file mode 100644 index 00000000..d462e205 --- /dev/null +++ b/proto/src/proto/aggregator/v1/aggregator.proto @@ -0,0 +1,330 @@ +syntax = "proto3"; + +package aggregator.v1; + +option go_package = ""github.com/agglayer/aggkit/proverclient/prover"; + +message Version { + string v0_0_1 = 1; +} + +// timestamps are represented in unix time in seconds + +/** + * Define all methods implementes by the gRPC + * Channel: prover receives aggregator messages and returns prover messages with the same id + */ +service AggregatorService { + rpc Channel(stream ProverMessage) returns (stream AggregatorMessage) {} +} + +message AggregatorMessage +{ + string id = 1; + oneof request + { + GetStatusRequest get_status_request = 2; + GenBatchProofRequest gen_batch_proof_request = 3; + GenAggregatedProofRequest gen_aggregated_proof_request = 4; + GenFinalProofRequest gen_final_proof_request = 5; + CancelRequest cancel_request = 6; + GetProofRequest get_proof_request = 7; + GenStatelessBatchProofRequest gen_stateless_batch_proof_request = 8; + } +} + +message ProverMessage +{ + string id = 1; + oneof response + { + GetStatusResponse get_status_response = 2; + GenBatchProofResponse gen_batch_proof_response = 3; + GenAggregatedProofResponse gen_aggregated_proof_response = 4; + GenFinalProofResponse gen_final_proof_response = 5; + CancelResponse cancel_response = 6; + GetProofResponse get_proof_response = 7; + } +} + +/////////////////// +// Request messages +/////////////////// + +/** + * @dev GetStatusRequest + */ +message GetStatusRequest {} + +/** + * @dev GenBatchProofRequest + * @param {input} - input prover + */ +message GenBatchProofRequest { + InputProver input = 1; +} + +message GenStatelessBatchProofRequest { + StatelessInputProver input = 1; +} + +/** + * @dev GenAggregatedProofRequest + * @param {recursive_proof_1} - proof json of the first batch to aggregate + * @param {recursive_proof_2} - proof json of the second batch to aggregate + */ +message GenAggregatedProofRequest { + string recursive_proof_1 = 1; + string recursive_proof_2 = 2; +} + +/** + * @dev GenFinalProofRequest + * @param {recursive_proof} - proof json of the batch or aggregated proof to finalise + * @param {aggregator_addr} - address of the aggregator + */ +message GenFinalProofRequest { + string recursive_proof = 1; + string aggregator_addr = 2; +} + +/** + * @dev CancelRequest + * @param {id} - identifier of the proof request to cancel + */ + message CancelRequest { + string id = 1; +} + +/** + * @dev Request GetProof + * @param {id} - proof identifier of the proof request + * @param {timeout} - time to wait until the service responds + */ +message GetProofRequest { + string id = 1; + uint64 timeout = 2; +} + +///////////////////// +// Responses messages +///////////////////// + +/** + * @dev Response GetStatus + * @param {status} - server status + * - BOOTING: being ready to compute proofs + * - COMPUTING: busy computing a proof + * - IDLE: waiting for a proof to compute + * - HALT: stop + * @param {last_computed_request_id} - last proof identifier that has been computed + * @param {last_computed_end_time} - last proof timestamp when it was finished + * @param {current_computing_request_id} - id of the proof that is being computed + * @param {current_computing_start_time} - timestamp when the proof that is being computed started + * @param {version_proto} - .proto verion + * @param {version_server} - server version + * @param {pending_request_queue_ids} - list of identifierss of proof requests that are in the pending queue + * @param {prover_name} - id of this prover server, normally specified via config.json, or UNSPECIFIED otherwise; it does not change if prover reboots + * @param {prover_id} - id of this prover instance or reboot; it changes if prover reboots; it is a UUID, automatically generated during the initialization + * @param {number_of_cores} - number of cores in the system where the prover is running + * @param {total_memory} - total memory in the system where the prover is running + * @param {free_memory} - free memory in the system where the prover is running + */ +message GetStatusResponse { + enum Status { + STATUS_UNSPECIFIED = 0; + STATUS_BOOTING = 1; + STATUS_COMPUTING = 2; + STATUS_IDLE = 3; + STATUS_HALT = 4; + } + Status status = 1; + string last_computed_request_id = 2; + uint64 last_computed_end_time = 3; + string current_computing_request_id = 4; + uint64 current_computing_start_time = 5; + string version_proto = 6; + string version_server = 7; + repeated string pending_request_queue_ids = 8; + string prover_name = 9; + string prover_id = 10; + uint64 number_of_cores = 11; + uint64 total_memory = 12; + uint64 free_memory = 13; + uint64 fork_id = 14; +} + +/** + * @dev Result + * - OK: succesfully completed + * - ERROR: request is not correct, i.e. input data is wrong + * - INTERNAL_ERROR: internal server error when delivering the response + */ +enum Result { + RESULT_UNSPECIFIED = 0; + RESULT_OK = 1; + RESULT_ERROR = 2; + RESULT_INTERNAL_ERROR = 3; +} + +/** + * @dev GenBatchProofResponse + * @param {id} - proof identifier, to be used in GetProofRequest() + * @param {result} - request result + */ +message GenBatchProofResponse { + string id = 1; + Result result = 2; +} + +/** + * @dev GenAggregatedProofResponse + * @param {id} - proof identifier, to be used in GetProofRequest() + * @param {result} - request result + */ +message GenAggregatedProofResponse { + string id = 1; + Result result = 2; +} + +/** + * @dev Response GenFinalProof + * @param {id} - proof identifier, to be used in GetProofRequest() + * @param {result} - request result + */ +message GenFinalProofResponse { + string id = 1; + Result result = 2; +} + +/** + * @dev CancelResponse + * @param {result} - request result + */ +message CancelResponse { + Result result = 1; +} + +/** + * @dev GetProofResponse + * @param {id} - proof identifier + * @param {final_proof} - groth16 proof + public circuit inputs + * @param {recursive_proof} - recursive proof json + * @param {result} - proof result + * - COMPLETED_OK: proof has been computed successfully and it is valid + * - ERROR: request error + * - COMPLETED_ERROR: proof has been computed successfully and it is not valid + * - PENDING: proof is being computed + * - INTERNAL_ERROR: server error during proof computation + * - CANCEL: proof has been cancelled + * @param {result_string} - extends result information + */ +message GetProofResponse { + enum Result { + RESULT_UNSPECIFIED = 0; + RESULT_COMPLETED_OK = 1; + RESULT_ERROR = 2; + RESULT_COMPLETED_ERROR = 3; + RESULT_PENDING = 4; + RESULT_INTERNAL_ERROR = 5; + RESULT_CANCEL = 6; + } + string id = 1; + oneof proof { + FinalProof final_proof = 2; + string recursive_proof =3; + } + Result result = 4; + string result_string = 5; +} + +/* + * @dev FinalProof + * @param {proof} - groth16 proof + * @param {public} - public circuit inputs +*/ +message FinalProof { + string proof = 1; + PublicInputsExtended public = 2; +} + +/* + * @dev PublicInputs + * @param {old_state_root} + * @param {old_acc_input_hash} + * @param {old_batch_num} + * @param {chain_id} + * @param {batch_l2_data} + * @param {global_exit_root} + * @param {sequencer_addr} + * @param {aggregator_addr} + */ +message PublicInputs { + bytes old_state_root = 1; + bytes old_acc_input_hash = 2; + uint64 old_batch_num = 3; + uint64 chain_id = 4; + uint64 fork_id = 5; + bytes batch_l2_data = 6; + bytes l1_info_root = 7; + uint64 timestamp_limit = 8; + string sequencer_addr = 9; + bytes forced_blockhash_l1 = 10; + string aggregator_addr = 12; + map l1_info_tree_data = 16; +} + +message StatelessPublicInputs { + bytes witness = 1; + bytes old_acc_input_hash = 2; + uint64 old_batch_num = 3; + uint64 chain_id = 4; + uint64 fork_id = 5; + bytes batch_l2_data = 6; + bytes l1_info_root = 7; + uint64 timestamp_limit = 8; + string sequencer_addr = 9; + bytes forced_blockhash_l1 = 10; + string aggregator_addr = 11; + map l1_info_tree_data = 12; +} + +// l1InfoTree leaf values +message L1Data { + bytes global_exit_root = 1; + bytes blockhash_l1 = 2; + uint32 min_timestamp = 3; + repeated bytes smt_proof = 4; +} + +/** + * @dev InputProver + * @param {public_inputs} - public inputs + * @param {db} - database containing all key-values in smt matching the old state root + * @param {contracts_bytecode} - key is the hash(contractBytecode), value is the bytecode itself + */ +message InputProver { + PublicInputs public_inputs = 1; + map db = 4; // For debug/testing purpposes only. Don't fill this on production + map contracts_bytecode = 5; // For debug/testing purpposes only. Don't fill this on production +} + +message StatelessInputProver { + StatelessPublicInputs public_inputs = 1; +} + +/** + * @dev PublicInputsExtended + * @param {public_inputs} - public inputs + * @param {new_state_root} - final state root. Used as a sanity check. + * @param {new_acc_input_hash} - final accumulate input hash. Used as a sanity check. + * @param {new_local_exit_root} - new local exit root. Used as a sanity check. + * @param {new_batch_num} - final num batch. Used as a sanity check. + */ +message PublicInputsExtended { + PublicInputs public_inputs = 1; + bytes new_state_root = 2; + bytes new_acc_input_hash = 3; + bytes new_local_exit_root = 4; + uint64 new_batch_num = 5; +} diff --git a/proto/src/proto/datastream/v1/datastream.proto b/proto/src/proto/datastream/v1/datastream.proto new file mode 100644 index 00000000..827c81e6 --- /dev/null +++ b/proto/src/proto/datastream/v1/datastream.proto @@ -0,0 +1,90 @@ +syntax = "proto3"; + +package datastream.v1; + +option go_package = "github.com/agglayer/aggkit"state/datastream"; + +message BatchStart { + uint64 number = 1; + BatchType type = 2; + uint64 fork_id = 3; + uint64 chain_id = 4; + Debug debug = 5; +} + +message BatchEnd { + uint64 number = 1; + bytes local_exit_root = 2; + bytes state_root = 3; + Debug debug = 4; +} + +message L2Block { + uint64 number = 1; + uint64 batch_number = 2; + uint64 timestamp = 3; + uint32 delta_timestamp = 4; + uint64 min_timestamp = 5; + bytes l1_blockhash = 6; + uint32 l1_infotree_index = 7; + bytes hash = 8; + bytes state_root = 9; + bytes global_exit_root = 10; + bytes coinbase = 11; + uint64 block_gas_limit = 12; + bytes block_info_root = 13; + Debug debug = 14; +} + +message Transaction { + uint64 l2block_number = 1; + uint64 index = 2; + bool is_valid = 3; + bytes encoded = 4; + uint32 effective_gas_price_percentage = 5; + bytes im_state_root = 6; + Debug debug = 7; +} + +message UpdateGER { + uint64 batch_number = 1; + uint64 timestamp = 2; + bytes global_exit_root = 3; + bytes coinbase = 4; + uint64 fork_id = 5; + uint64 chain_id = 6; + bytes state_root = 7; + Debug debug = 8; +} + +message BookMark { + BookmarkType type = 1; + uint64 value = 2; +} + +message Debug { + string message = 1; +} + +enum BookmarkType { + BOOKMARK_TYPE_UNSPECIFIED = 0; + BOOKMARK_TYPE_BATCH = 1; + BOOKMARK_TYPE_L2_BLOCK = 2; +} + +enum EntryType { + ENTRY_TYPE_UNSPECIFIED = 0; + ENTRY_TYPE_BATCH_START = 1; + ENTRY_TYPE_L2_BLOCK = 2; + ENTRY_TYPE_TRANSACTION = 3; + ENTRY_TYPE_BATCH_END = 4; + ENTRY_TYPE_UPDATE_GER = 5; +} + +enum BatchType { + BATCH_TYPE_UNSPECIFIED = 0; + BATCH_TYPE_REGULAR = 1; + BATCH_TYPE_FORCED = 2; + BATCH_TYPE_INJECTED = 3; + BATCH_TYPE_INVALID = 4; +} diff --git a/reorgdetector/config.go b/reorgdetector/config.go new file mode 100644 index 00000000..77b56397 --- /dev/null +++ b/reorgdetector/config.go @@ -0,0 +1,29 @@ +package reorgdetector + +import ( + "time" + + "github.com/agglayer/aggkit/config/types" +) + +const ( + defaultCheckReorgsInterval = 2 * time.Second +) + +// Config is the configuration for the reorg detector +type Config struct { + // DBPath is the path to the database + DBPath string `mapstructure:"DBPath"` + + // CheckReorgsInterval is the interval to check for reorgs in tracked blocks + CheckReorgsInterval types.Duration `mapstructure:"CheckReorgsInterval"` +} + +// GetCheckReorgsInterval returns the interval to check for reorgs in tracked blocks +func (c *Config) GetCheckReorgsInterval() time.Duration { + if c.CheckReorgsInterval.Duration == 0 { + return defaultCheckReorgsInterval + } + + return c.CheckReorgsInterval.Duration +} diff --git a/reorgdetector/migrations/migrations.go b/reorgdetector/migrations/migrations.go new file mode 100644 index 00000000..49d85972 --- /dev/null +++ b/reorgdetector/migrations/migrations.go @@ -0,0 +1,21 @@ +package migrations + +import ( + _ "embed" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/db/types" +) + +//go:embed reorgdetector0001.sql +var mig001 string + +func RunMigrations(dbPath string) error { + migrations := []types.Migration{ + { + ID: "reorgdetector0001", + SQL: mig001, + }, + } + return db.RunMigrations(dbPath, migrations) +} diff --git a/reorgdetector/migrations/reorgdetector0001.sql b/reorgdetector/migrations/reorgdetector0001.sql new file mode 100644 index 00000000..8b5092ba --- /dev/null +++ b/reorgdetector/migrations/reorgdetector0001.sql @@ -0,0 +1,11 @@ +-- +migrate Down +DROP TABLE IF EXISTS block; +DROP TABLE IF EXISTS claim; +DROP TABLE IF EXISTS bridge; + +-- +migrate Up +CREATE TABLE tracked_block ( + subscriber_id VARCHAR NOT NULL, + num BIGINT NOT NULL, + hash VARCHAR NOT NULL +); \ No newline at end of file diff --git a/reorgdetector/mock_eth_client.go b/reorgdetector/mock_eth_client.go new file mode 100644 index 00000000..1a42104b --- /dev/null +++ b/reorgdetector/mock_eth_client.go @@ -0,0 +1,220 @@ +// Code generated by mockery. DO NOT EDIT. + +package reorgdetector + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + ethereum "github.com/ethereum/go-ethereum" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// EthClientMock is an autogenerated mock type for the EthClient type +type EthClientMock struct { + mock.Mock +} + +type EthClientMock_Expecter struct { + mock *mock.Mock +} + +func (_m *EthClientMock) EXPECT() *EthClientMock_Expecter { + return &EthClientMock_Expecter{mock: &_m.Mock} +} + +// HeaderByHash provides a mock function with given fields: ctx, hash +func (_m *EthClientMock) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for HeaderByHash") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Header, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Header); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClientMock_HeaderByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByHash' +type EthClientMock_HeaderByHash_Call struct { + *mock.Call +} + +// HeaderByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *EthClientMock_Expecter) HeaderByHash(ctx interface{}, hash interface{}) *EthClientMock_HeaderByHash_Call { + return &EthClientMock_HeaderByHash_Call{Call: _e.mock.On("HeaderByHash", ctx, hash)} +} + +func (_c *EthClientMock_HeaderByHash_Call) Run(run func(ctx context.Context, hash common.Hash)) *EthClientMock_HeaderByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthClientMock_HeaderByHash_Call) Return(_a0 *types.Header, _a1 error) *EthClientMock_HeaderByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClientMock_HeaderByHash_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Header, error)) *EthClientMock_HeaderByHash_Call { + _c.Call.Return(run) + return _c +} + +// HeaderByNumber provides a mock function with given fields: ctx, number +func (_m *EthClientMock) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for HeaderByNumber") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Header, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Header); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClientMock_HeaderByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByNumber' +type EthClientMock_HeaderByNumber_Call struct { + *mock.Call +} + +// HeaderByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *EthClientMock_Expecter) HeaderByNumber(ctx interface{}, number interface{}) *EthClientMock_HeaderByNumber_Call { + return &EthClientMock_HeaderByNumber_Call{Call: _e.mock.On("HeaderByNumber", ctx, number)} +} + +func (_c *EthClientMock_HeaderByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *EthClientMock_HeaderByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *EthClientMock_HeaderByNumber_Call) Return(_a0 *types.Header, _a1 error) *EthClientMock_HeaderByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClientMock_HeaderByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*types.Header, error)) *EthClientMock_HeaderByNumber_Call { + _c.Call.Return(run) + return _c +} + +// SubscribeNewHead provides a mock function with given fields: ctx, ch +func (_m *EthClientMock) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) { + ret := _m.Called(ctx, ch) + + if len(ret) == 0 { + panic("no return value specified for SubscribeNewHead") + } + + var r0 ethereum.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) (ethereum.Subscription, error)); ok { + return rf(ctx, ch) + } + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) ethereum.Subscription); ok { + r0 = rf(ctx, ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ethereum.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, chan<- *types.Header) error); ok { + r1 = rf(ctx, ch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthClientMock_SubscribeNewHead_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewHead' +type EthClientMock_SubscribeNewHead_Call struct { + *mock.Call +} + +// SubscribeNewHead is a helper method to define mock.On call +// - ctx context.Context +// - ch chan<- *types.Header +func (_e *EthClientMock_Expecter) SubscribeNewHead(ctx interface{}, ch interface{}) *EthClientMock_SubscribeNewHead_Call { + return &EthClientMock_SubscribeNewHead_Call{Call: _e.mock.On("SubscribeNewHead", ctx, ch)} +} + +func (_c *EthClientMock_SubscribeNewHead_Call) Run(run func(ctx context.Context, ch chan<- *types.Header)) *EthClientMock_SubscribeNewHead_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(chan<- *types.Header)) + }) + return _c +} + +func (_c *EthClientMock_SubscribeNewHead_Call) Return(_a0 ethereum.Subscription, _a1 error) *EthClientMock_SubscribeNewHead_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthClientMock_SubscribeNewHead_Call) RunAndReturn(run func(context.Context, chan<- *types.Header) (ethereum.Subscription, error)) *EthClientMock_SubscribeNewHead_Call { + _c.Call.Return(run) + return _c +} + +// NewEthClientMock creates a new instance of EthClientMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthClientMock(t interface { + mock.TestingT + Cleanup(func()) +}) *EthClientMock { + mock := &EthClientMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/reorgdetector/reorgdetector.go b/reorgdetector/reorgdetector.go new file mode 100644 index 00000000..d11f90d5 --- /dev/null +++ b/reorgdetector/reorgdetector.go @@ -0,0 +1,210 @@ +package reorgdetector + +import ( + "context" + "database/sql" + "fmt" + "math/big" + "sync" + "time" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/reorgdetector/migrations" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rpc" + "golang.org/x/sync/errgroup" +) + +type EthClient interface { + SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) + HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) + HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) +} + +type ReorgDetector struct { + client EthClient + db *sql.DB + checkReorgInterval time.Duration + + trackedBlocksLock sync.RWMutex + trackedBlocks map[string]*headersList + + subscriptionsLock sync.RWMutex + subscriptions map[string]*Subscription +} + +func New(client EthClient, cfg Config) (*ReorgDetector, error) { + err := migrations.RunMigrations(cfg.DBPath) + if err != nil { + return nil, err + } + db, err := db.NewSQLiteDB(cfg.DBPath) + if err != nil { + return nil, err + } + + return &ReorgDetector{ + client: client, + db: db, + checkReorgInterval: cfg.GetCheckReorgsInterval(), + trackedBlocks: make(map[string]*headersList), + subscriptions: make(map[string]*Subscription), + }, nil +} + +// Start starts the reorg detector +func (rd *ReorgDetector) Start(ctx context.Context) (err error) { + // Load tracked blocks from the DB + if err = rd.loadTrackedHeaders(); err != nil { + return fmt.Errorf("failed to load tracked headers: %w", err) + } + + // Continuously check reorgs in tracked by subscribers blocks + go func() { + ticker := time.NewTicker(rd.checkReorgInterval) + for { + select { + case <-ctx.Done(): + ticker.Stop() + return + case <-ticker.C: + if err = rd.detectReorgInTrackedList(ctx); err != nil { + log.Errorf("failed to detect reorg in tracked list: %v", err) + } + } + } + }() + + return nil +} + +// AddBlockToTrack adds a block to the tracked list for a subscriber +func (rd *ReorgDetector) AddBlockToTrack(ctx context.Context, id string, num uint64, hash common.Hash) error { + // Skip if the given block has already been stored + rd.trackedBlocksLock.RLock() + trackedBlocks, ok := rd.trackedBlocks[id] + if !ok { + rd.trackedBlocksLock.RUnlock() + return fmt.Errorf("subscriber %s is not subscribed", id) + } + rd.trackedBlocksLock.RUnlock() + + if existingHeader, err := trackedBlocks.get(num); err == nil && existingHeader.Hash == hash { + return nil + } + + // Store the given header to the tracked list + hdr := newHeader(num, hash) + if err := rd.saveTrackedBlock(id, hdr); err != nil { + return fmt.Errorf("failed to save tracked block: %w", err) + } + + return nil +} + +// detectReorgInTrackedList detects reorgs in the tracked blocks. +// Notifies subscribers if reorg has happened +func (rd *ReorgDetector) detectReorgInTrackedList(ctx context.Context) error { + // Get the latest finalized block + lastFinalisedBlock, err := rd.client.HeaderByNumber(ctx, big.NewInt(int64(rpc.FinalizedBlockNumber))) + if err != nil { + return fmt.Errorf("failed to get the latest finalized block: %w", err) + } + + var ( + headersCacheLock sync.Mutex + headersCache = map[uint64]*types.Header{ + lastFinalisedBlock.Number.Uint64(): lastFinalisedBlock, + } + errGroup errgroup.Group + ) + + subscriberIDs := rd.getSubscriberIDs() + + for _, id := range subscriberIDs { + id := id + + // This is done like this because of a possible deadlock + // between AddBlocksToTrack and detectReorgInTrackedList + rd.trackedBlocksLock.RLock() + hdrs, ok := rd.trackedBlocks[id] + rd.trackedBlocksLock.RUnlock() + + if !ok { + continue + } + + errGroup.Go(func() error { + headers := hdrs.getSorted() + for _, hdr := range headers { + // Get the actual header from the network or from the cache + var err error + headersCacheLock.Lock() + currentHeader, ok := headersCache[hdr.Num] + if !ok || currentHeader == nil { + if currentHeader, err = rd.client.HeaderByNumber(ctx, new(big.Int).SetUint64(hdr.Num)); err != nil { + headersCacheLock.Unlock() + return fmt.Errorf("failed to get the header %d: %w", hdr.Num, err) + } + headersCache[hdr.Num] = currentHeader + } + headersCacheLock.Unlock() + + // Check if the block hash matches with the actual block hash + if hdr.Hash == currentHeader.Hash() { + // Delete block from the tracked blocks list if it is less than or equal to the last finalized block + // and hashes matches. If higher than finalized block, we assume a reorg still might happen. + if hdr.Num <= lastFinalisedBlock.Number.Uint64() { + hdrs.removeRange(hdr.Num, hdr.Num) + } + if err := rd.removeTrackedBlockRange(id, hdr.Num, hdr.Num); err != nil { + return fmt.Errorf("error removing blocks from DB for subscriber %s between blocks %d and %d: %w", + id, hdr.Num, hdr.Num, err) + } + + continue + } + + // Notify the subscriber about the reorg + rd.notifySubscriber(id, hdr) + + // Remove the reorged block and all the following blocks from DB + if err := rd.removeTrackedBlockRange(id, hdr.Num, headers[len(headers)-1].Num); err != nil { + return fmt.Errorf("error removing blocks from DB for subscriber %s between blocks %d and %d: %w", + id, hdr.Num, headers[len(headers)-1].Num, err) + } + // Remove the reorged block and all the following blocks from memory + hdrs.removeRange(hdr.Num, headers[len(headers)-1].Num) + + break + } + return nil + }) + } + + return errGroup.Wait() +} + +// loadTrackedHeaders loads tracked headers from the DB and stores them in memory +func (rd *ReorgDetector) loadTrackedHeaders() (err error) { + rd.trackedBlocksLock.Lock() + defer rd.trackedBlocksLock.Unlock() + + // Load tracked blocks for all subscribers from the DB + if rd.trackedBlocks, err = rd.getTrackedBlocks(); err != nil { + return fmt.Errorf("failed to get tracked blocks: %w", err) + } + + // Go over tracked blocks and create subscription for each tracker + for id := range rd.trackedBlocks { + rd.subscriptions[id] = &Subscription{ + ReorgedBlock: make(chan uint64), + ReorgProcessed: make(chan bool), + } + } + + return nil +} diff --git a/reorgdetector/reorgdetector_db.go b/reorgdetector/reorgdetector_db.go new file mode 100644 index 00000000..f5bed3a7 --- /dev/null +++ b/reorgdetector/reorgdetector_db.go @@ -0,0 +1,77 @@ +package reorgdetector + +import ( + "errors" + "fmt" + + "github.com/agglayer/aggkit/db" + "github.com/russross/meddler" +) + +// getTrackedBlocks returns a list of tracked blocks for each subscriber from db +func (rd *ReorgDetector) getTrackedBlocks() (map[string]*headersList, error) { + trackedBlocks := make(map[string]*headersList, 0) + var headersWithID []*headerWithSubscriberID + err := meddler.QueryAll(rd.db, &headersWithID, "SELECT * FROM tracked_block ORDER BY subscriber_id;") + if err != nil { + if errors.Is(err, db.ErrNotFound) { + return trackedBlocks, nil + } + return nil, fmt.Errorf("error queryng tracked_block: %w", err) + } + if len(headersWithID) == 0 { + return trackedBlocks, nil + } + currentID := headersWithID[0].SubscriberID + currentHeaders := []header{} + for i := 0; i < len(headersWithID); i++ { + if i == len(headersWithID)-1 { + currentHeaders = append(currentHeaders, header{ + Num: headersWithID[i].Num, + Hash: headersWithID[i].Hash, + }) + trackedBlocks[currentID] = newHeadersList(currentHeaders...) + } else if headersWithID[i].SubscriberID != currentID { + trackedBlocks[currentID] = newHeadersList(currentHeaders...) + currentHeaders = []header{{ + Num: headersWithID[i].Num, + Hash: headersWithID[i].Hash, + }} + currentID = headersWithID[i].SubscriberID + } else { + currentHeaders = append(currentHeaders, header{ + Num: headersWithID[i].Num, + Hash: headersWithID[i].Hash, + }) + } + } + + return trackedBlocks, nil +} + +// saveTrackedBlock saves the tracked block for a subscriber in db and in memory +func (rd *ReorgDetector) saveTrackedBlock(id string, b header) error { + rd.trackedBlocksLock.Lock() + hdrs, ok := rd.trackedBlocks[id] + if !ok || hdrs.isEmpty() { + hdrs = newHeadersList(b) + rd.trackedBlocks[id] = hdrs + } else { + hdrs.add(b) + } + rd.trackedBlocksLock.Unlock() + return meddler.Insert(rd.db, "tracked_block", &headerWithSubscriberID{ + SubscriberID: id, + Num: b.Num, + Hash: b.Hash, + }) +} + +// updateTrackedBlocksDB updates the tracked blocks for a subscriber in db +func (rd *ReorgDetector) removeTrackedBlockRange(id string, fromBlock, toBlock uint64) error { + _, err := rd.db.Exec( + "DELETE FROM tracked_block WHERE num >= $1 AND NUM <= 2 AND subscriber_id = $3;", + fromBlock, toBlock, id, + ) + return err +} diff --git a/reorgdetector/reorgdetector_sub.go b/reorgdetector/reorgdetector_sub.go new file mode 100644 index 00000000..c5002a2b --- /dev/null +++ b/reorgdetector/reorgdetector_sub.go @@ -0,0 +1,57 @@ +package reorgdetector + +// Subscription is a subscription to reorg events +type Subscription struct { + ReorgedBlock chan uint64 + ReorgProcessed chan bool +} + +// Subscribe subscribes to reorg events +func (rd *ReorgDetector) Subscribe(id string) (*Subscription, error) { + rd.subscriptionsLock.Lock() + defer rd.subscriptionsLock.Unlock() + + if sub, ok := rd.subscriptions[id]; ok { + return sub, nil + } + + // Create a new subscription + sub := &Subscription{ + ReorgedBlock: make(chan uint64), + ReorgProcessed: make(chan bool), + } + rd.subscriptions[id] = sub + + // Create a new tracked blocks list for the subscriber + rd.trackedBlocksLock.Lock() + rd.trackedBlocks[id] = newHeadersList() + rd.trackedBlocksLock.Unlock() + + return sub, nil +} + +// notifySubscriber notifies the subscriber with the block of the reorg +func (rd *ReorgDetector) notifySubscriber(id string, startingBlock header) { + // Notify subscriber about this particular reorg + rd.subscriptionsLock.RLock() + sub, ok := rd.subscriptions[id] + rd.subscriptionsLock.RUnlock() + + if ok { + sub.ReorgedBlock <- startingBlock.Num + <-sub.ReorgProcessed + } +} + +// getSubscriberIDs returns a list of subscriber IDs +func (rd *ReorgDetector) getSubscriberIDs() []string { + rd.subscriptionsLock.RLock() + defer rd.subscriptionsLock.RUnlock() + + ids := make([]string, 0, len(rd.subscriptions)) + for id := range rd.subscriptions { + ids = append(ids, id) + } + + return ids +} diff --git a/reorgdetector/reorgdetector_test.go b/reorgdetector/reorgdetector_test.go new file mode 100644 index 00000000..f5cf50b4 --- /dev/null +++ b/reorgdetector/reorgdetector_test.go @@ -0,0 +1,160 @@ +package reorgdetector + +import ( + "context" + "path" + "strings" + "testing" + "time" + + aggkittypes "github.com/agglayer/aggkit/config/types" + common "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/stretchr/testify/require" +) + +func Test_ReorgDetector(t *testing.T) { + const subID = "test" + + ctx := context.Background() + + // Simulated L1 + clientL1 := simulated.NewBackend(nil, simulated.WithBlockGasLimit(10000000)) + + // Create test DB dir + testDir := path.Join(t.TempDir(), "reorgdetectorTest_ReorgDetector.sqlite") + + reorgDetector, err := New(clientL1.Client(), Config{DBPath: testDir, CheckReorgsInterval: aggkittypes.NewDuration(time.Millisecond * 100)}) + require.NoError(t, err) + + err = reorgDetector.Start(ctx) + require.NoError(t, err) + + reorgSub, err := reorgDetector.Subscribe(subID) + require.NoError(t, err) + + // Block 1 + header1, err := clientL1.Client().HeaderByHash(ctx, clientL1.Commit()) + require.NoError(t, err) + require.Equal(t, uint64(1), header1.Number.Uint64()) + err = reorgDetector.AddBlockToTrack(ctx, subID, header1.Number.Uint64(), header1.Hash()) // Adding block 1 + require.NoError(t, err) + + // Block 2 + header2, err := clientL1.Client().HeaderByHash(ctx, clientL1.Commit()) + require.NoError(t, err) + require.Equal(t, uint64(2), header2.Number.Uint64()) + err = reorgDetector.AddBlockToTrack(ctx, subID, header2.Number.Uint64(), header2.Hash()) // Adding block 1 + require.NoError(t, err) + + // Block 3 + header3Reorged, err := clientL1.Client().HeaderByHash(ctx, clientL1.Commit()) + require.NoError(t, err) + require.Equal(t, uint64(3), header3Reorged.Number.Uint64()) + err = reorgDetector.AddBlockToTrack(ctx, subID, header3Reorged.Number.Uint64(), header3Reorged.Hash()) // Adding block 3 + require.NoError(t, err) + + // Block 4 + header4Reorged, err := clientL1.Client().HeaderByHash(ctx, clientL1.Commit()) + require.Equal(t, uint64(4), header4Reorged.Number.Uint64()) + require.NoError(t, err) + err = reorgDetector.AddBlockToTrack(ctx, subID, header4Reorged.Number.Uint64(), header4Reorged.Hash()) // Adding block 4 + require.NoError(t, err) + + err = clientL1.Fork(header2.Hash()) // Reorg on block 2 (block 2 is still valid) + require.NoError(t, err) + + // Make sure that the new canonical chain is longer than the previous one so the reorg is visible to the detector + header3AfterReorg := clientL1.Commit() // Next block 3 after reorg on block 2 + require.NotEqual(t, header3Reorged.Hash(), header3AfterReorg) + header4AfterReorg := clientL1.Commit() // Block 4 + require.NotEqual(t, header4Reorged.Hash(), header4AfterReorg) + clientL1.Commit() // Block 5 + + // Expect reorg on added blocks 3 -> all further blocks should be removed + select { + case firstReorgedBlock := <-reorgSub.ReorgedBlock: + reorgSub.ReorgProcessed <- true + require.Equal(t, header3Reorged.Number.Uint64(), firstReorgedBlock) + case <-time.After(5 * time.Second): + t.Fatal("timeout waiting for reorg") + } + + // just wait a little for completion + time.Sleep(time.Second / 5) + + reorgDetector.trackedBlocksLock.Lock() + headersList, ok := reorgDetector.trackedBlocks[subID] + reorgDetector.trackedBlocksLock.Unlock() + require.True(t, ok) + require.Equal(t, 2, headersList.len()) // Only blocks 1 and 2 left + actualHeader1, err := headersList.get(1) + require.NoError(t, err) + require.Equal(t, header1.Hash(), actualHeader1.Hash) + actualHeader2, err := headersList.get(2) + require.NoError(t, err) + require.Equal(t, header2.Hash(), actualHeader2.Hash) +} + +func TestGetTrackedBlocks(t *testing.T) { + clientL1 := simulated.NewBackend(nil, simulated.WithBlockGasLimit(10000000)) + testDir := path.Join(t.TempDir(), "reorgdetector_TestGetTrackedBlocks.sqlite") + reorgDetector, err := New(clientL1.Client(), Config{DBPath: testDir, CheckReorgsInterval: aggkittypes.NewDuration(time.Millisecond * 100)}) + require.NoError(t, err) + list, err := reorgDetector.getTrackedBlocks() + require.NoError(t, err) + require.Equal(t, len(list), 0) + + expectedList := make(map[string]*headersList) + headersMapFoo := make(map[uint64]header) + headerFoo2 := header{ + Num: 2, + Hash: common.HexToHash("foofoo"), + } + err = reorgDetector.saveTrackedBlock("foo", headerFoo2) + require.NoError(t, err) + headersMapFoo[2] = headerFoo2 + headerFoo3 := header{ + Num: 3, + Hash: common.HexToHash("foofoofoo"), + } + err = reorgDetector.saveTrackedBlock("foo", headerFoo3) + require.NoError(t, err) + headersMapFoo[3] = headerFoo3 + expectedList["foo"] = &headersList{ + headers: headersMapFoo, + } + list, err = reorgDetector.getTrackedBlocks() + require.NoError(t, err) + require.Equal(t, expectedList, list) + + headersMapBar := make(map[uint64]header) + headerBar2 := header{ + Num: 2, + Hash: common.HexToHash("BarBar"), + } + err = reorgDetector.saveTrackedBlock("Bar", headerBar2) + require.NoError(t, err) + headersMapBar[2] = headerBar2 + expectedList["Bar"] = &headersList{ + headers: headersMapBar, + } + list, err = reorgDetector.getTrackedBlocks() + require.NoError(t, err) + require.Equal(t, expectedList, list) + + require.NoError(t, reorgDetector.loadTrackedHeaders()) + _, ok := reorgDetector.subscriptions["foo"] + require.True(t, ok) + _, ok = reorgDetector.subscriptions["Bar"] + require.True(t, ok) +} + +func TestNotSubscribed(t *testing.T) { + clientL1 := simulated.NewBackend(nil, simulated.WithBlockGasLimit(10000000)) + testDir := path.Join(t.TempDir(), "reorgdetectorTestNotSubscribed.sqlite") + reorgDetector, err := New(clientL1.Client(), Config{DBPath: testDir, CheckReorgsInterval: aggkittypes.NewDuration(time.Millisecond * 100)}) + require.NoError(t, err) + err = reorgDetector.AddBlockToTrack(context.Background(), "foo", 1, common.Hash{}) + require.True(t, strings.Contains(err.Error(), "is not subscribed")) +} diff --git a/reorgdetector/types.go b/reorgdetector/types.go new file mode 100644 index 00000000..ae3c0c29 --- /dev/null +++ b/reorgdetector/types.go @@ -0,0 +1,119 @@ +package reorgdetector + +import ( + "sort" + "sync" + + "github.com/agglayer/aggkit/db" + "github.com/ethereum/go-ethereum/common" +) + +type header struct { + Num uint64 `meddler:"num"` + Hash common.Hash `meddler:"hash,hash"` +} + +type headerWithSubscriberID struct { + SubscriberID string `meddler:"subscriber_id"` + Num uint64 `meddler:"num"` + Hash common.Hash `meddler:"hash,hash"` +} + +// newHeader returns a new instance of header +func newHeader(num uint64, hash common.Hash) header { + return header{ + Num: num, + Hash: hash, + } +} + +type headersList struct { + sync.RWMutex + headers map[uint64]header +} + +// newHeadersList returns a new instance of headersList +func newHeadersList(headers ...header) *headersList { + headersMap := make(map[uint64]header, len(headers)) + + for _, b := range headers { + headersMap[b.Num] = b + } + + return &headersList{ + headers: headersMap, + } +} + +// len returns the number of headers in the headers list +func (hl *headersList) len() int { + hl.RLock() + ln := len(hl.headers) + hl.RUnlock() + return ln +} + +// isEmpty returns true if the headers list is empty +func (hl *headersList) isEmpty() bool { + return hl.len() == 0 +} + +// add adds a header to the headers list +func (hl *headersList) add(h header) { + hl.Lock() + hl.headers[h.Num] = h + hl.Unlock() +} + +// copy returns a copy of the headers list +func (hl *headersList) copy() *headersList { + hl.RLock() + defer hl.RUnlock() + + headersMap := make(map[uint64]header, len(hl.headers)) + for k, v := range hl.headers { + headersMap[k] = v + } + + return &headersList{ + headers: headersMap, + } +} + +// get returns a header by block number +func (hl *headersList) get(num uint64) (*header, error) { + hl.RLock() + defer hl.RUnlock() + + if b, ok := hl.headers[num]; ok { + return &b, nil + } + + return nil, db.ErrNotFound +} + +// getSorted returns headers in sorted order +func (hl *headersList) getSorted() []header { + hl.RLock() + sortedBlocks := make([]header, 0, len(hl.headers)) + + for _, b := range hl.headers { + sortedBlocks = append(sortedBlocks, b) + } + hl.RUnlock() + + sort.Slice(sortedBlocks, func(i, j int) bool { + return sortedBlocks[i].Num < sortedBlocks[j].Num + }) + + return sortedBlocks +} + +// removeRange removes headers from "from" to "to" +func (hl *headersList) removeRange(from, to uint64) { + hl.Lock() + for i := from; i <= to; i++ { + delete(hl.headers, i) + } + hl.Unlock() +} diff --git a/reorgdetector/types_test.go b/reorgdetector/types_test.go new file mode 100644 index 00000000..d2562078 --- /dev/null +++ b/reorgdetector/types_test.go @@ -0,0 +1,111 @@ +package reorgdetector + +import ( + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestBlockMap(t *testing.T) { + t.Parallel() + + // Create a new block map + bm := newHeadersList( + header{Num: 1, Hash: common.HexToHash("0x123")}, + header{Num: 2, Hash: common.HexToHash("0x456")}, + header{Num: 3, Hash: common.HexToHash("0x789")}, + ) + + t.Run("len", func(t *testing.T) { + t.Parallel() + + actualLen := bm.len() + expectedLen := 3 + if !reflect.DeepEqual(expectedLen, actualLen) { + t.Errorf("len() returned incorrect result, expected: %v, got: %v", expectedLen, actualLen) + } + }) + + t.Run("isEmpty", func(t *testing.T) { + t.Parallel() + + if bm.isEmpty() { + t.Error("isEmpty() returned incorrect result, expected: false, got: true") + } + }) + + t.Run("add", func(t *testing.T) { + t.Parallel() + + bm := bm.copy() + tba := header{Num: 4, Hash: common.HexToHash("0xabc")} + bm.add(tba) + if !reflect.DeepEqual(tba, bm.headers[4]) { + t.Errorf("add() returned incorrect result, expected: %v, got: %v", tba, bm.headers[4]) + } + }) + + t.Run("copy", func(t *testing.T) { + t.Parallel() + + copiedBm := bm.copy() + for i, header := range bm.headers { + copiedHeader, exists := copiedBm.headers[i] + require.True(t, exists) + if !reflect.DeepEqual(header, copiedHeader) { + t.Errorf("copy() returned incorrect result, expected: %v, got: %v", header, copiedHeader) + } + } + }) + + t.Run("get", func(t *testing.T) { + t.Parallel() + + header, err := bm.get(3) + require.NoError(t, err) + if !reflect.DeepEqual(*header, bm.headers[3]) { + t.Errorf("get() returned incorrect result, expected: %v, got: %v", header, bm.headers[3]) + } + }) + + t.Run("getSorted", func(t *testing.T) { + t.Parallel() + + sortedBlocks := bm.getSorted() + expectedSortedBlocks := []header{ + {Num: 1, Hash: common.HexToHash("0x123")}, + {Num: 2, Hash: common.HexToHash("0x456")}, + {Num: 3, Hash: common.HexToHash("0x789")}, + } + if !reflect.DeepEqual(sortedBlocks, expectedSortedBlocks) { + t.Errorf("getSorted() returned incorrect result, expected: %v, got: %v", expectedSortedBlocks, sortedBlocks) + } + }) + + t.Run("removeRange", func(t *testing.T) { + t.Parallel() + + bm := newHeadersList( + header{Num: 1, Hash: common.HexToHash("0x123")}, + header{Num: 2, Hash: common.HexToHash("0x456")}, + header{Num: 3, Hash: common.HexToHash("0x789")}, + header{Num: 4, Hash: common.HexToHash("0xabc")}, + header{Num: 5, Hash: common.HexToHash("0xdef")}, + ) + + bm.removeRange(3, 5) + + expectedBlocks := []header{ + {Num: 1, Hash: common.HexToHash("0x123")}, + {Num: 2, Hash: common.HexToHash("0x456")}, + } + + sortedBlocks := bm.getSorted() + + if !reflect.DeepEqual(sortedBlocks, expectedBlocks) { + t.Errorf("removeRange() failed, expected: %v, got: %v", expectedBlocks, sortedBlocks) + } + }) +} diff --git a/rpc/batch.go b/rpc/batch.go new file mode 100644 index 00000000..965266c6 --- /dev/null +++ b/rpc/batch.go @@ -0,0 +1,149 @@ +package rpc + +import ( + "encoding/json" + "errors" + "fmt" + "math/big" + + "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/rpc/types" + "github.com/agglayer/aggkit/state" + "github.com/ethereum/go-ethereum/common" +) + +var ( + // ErrBusy is returned when the witness server is busy + ErrBusy = errors.New("witness server is busy") +) + +const busyResponse = "busy" + +type BatchEndpoints struct { + url string +} + +func NewBatchEndpoints(url string) *BatchEndpoints { + return &BatchEndpoints{url: url} +} + +func (b *BatchEndpoints) GetBatch(batchNumber uint64) (*types.RPCBatch, error) { + type zkEVMBatch struct { + AccInputHash string `json:"accInputHash"` + Blocks []string `json:"blocks"` + BatchL2Data string `json:"batchL2Data"` + Coinbase string `json:"coinbase"` + GlobalExitRoot string `json:"globalExitRoot"` + LocalExitRoot string `json:"localExitRoot"` + StateRoot string `json:"stateRoot"` + Closed bool `json:"closed"` + Timestamp string `json:"timestamp"` + } + + zkEVMBatchData := zkEVMBatch{} + + log.Infof("Getting batch %d from RPC", batchNumber) + + response, err := rpc.JSONRPCCall(b.url, "zkevm_getBatchByNumber", batchNumber) + if err != nil { + return nil, err + } + + // Check if the response is nil + if response.Result == nil { + return nil, state.ErrNotFound + } + + // Check if the response is an error + if response.Error != nil { + return nil, fmt.Errorf("error in the response calling zkevm_getBatchByNumber: %v", response.Error) + } + + // Get the batch number from the response hex string + err = json.Unmarshal(response.Result, &zkEVMBatchData) + if err != nil { + return nil, fmt.Errorf("error unmarshalling the batch from the response calling zkevm_getBatchByNumber: %w", err) + } + + rpcBatch := types.NewRPCBatch(batchNumber, common.HexToHash(zkEVMBatchData.AccInputHash), zkEVMBatchData.Blocks, + common.FromHex(zkEVMBatchData.BatchL2Data), common.HexToHash(zkEVMBatchData.GlobalExitRoot), + common.HexToHash(zkEVMBatchData.LocalExitRoot), common.HexToHash(zkEVMBatchData.StateRoot), + common.HexToAddress(zkEVMBatchData.Coinbase), zkEVMBatchData.Closed) + + if len(zkEVMBatchData.Blocks) > 0 { + lastL2BlockTimestamp, err := b.GetL2BlockTimestamp(zkEVMBatchData.Blocks[len(zkEVMBatchData.Blocks)-1]) + if err != nil { + return nil, fmt.Errorf("error getting the last l2 block timestamp from the rpc: %w", err) + } + rpcBatch.SetLastL2BLockTimestamp(lastL2BlockTimestamp) + } else { + log.Infof("No blocks in the batch, setting the last l2 block timestamp from the batch data") + rpcBatch.SetLastL2BLockTimestamp(new(big.Int).SetBytes(common.FromHex(zkEVMBatchData.Timestamp)).Uint64()) + } + + return rpcBatch, nil +} + +func (b *BatchEndpoints) GetL2BlockTimestamp(blockHash string) (uint64, error) { + type zkeEVML2Block struct { + Timestamp string `json:"timestamp"` + } + + log.Infof("Getting l2 block timestamp from RPC. Block hash: %s", blockHash) + + response, err := rpc.JSONRPCCall(b.url, "eth_getBlockByHash", blockHash, false) + if err != nil { + return 0, err + } + + // Check if the response is an error + if response.Error != nil { + return 0, fmt.Errorf("error in the response calling eth_getBlockByHash: %v", response.Error) + } + + // Get the l2 block from the response + l2Block := zkeEVML2Block{} + err = json.Unmarshal(response.Result, &l2Block) + if err != nil { + return 0, fmt.Errorf("error unmarshalling the l2 block from the response calling eth_getBlockByHash: %w", err) + } + + return new(big.Int).SetBytes(common.FromHex(l2Block.Timestamp)).Uint64(), nil +} + +func (b *BatchEndpoints) GetWitness(batchNumber uint64, fullWitness bool) ([]byte, error) { + var ( + witness string + response rpc.Response + err error + ) + + witnessType := "trimmed" + if fullWitness { + witnessType = "full" + } + + log.Infof("Requesting witness for batch %d of type %s", batchNumber, witnessType) + + response, err = rpc.JSONRPCCall(b.url, "zkevm_getBatchWitness", batchNumber, witnessType) + if err != nil { + return nil, err + } + + // Check if the response is an error + if response.Error != nil { + if response.Error.Message == busyResponse { + return nil, ErrBusy + } + + return nil, fmt.Errorf("error from witness for batch %d: %v", batchNumber, response.Error) + } + + err = json.Unmarshal(response.Result, &witness) + if err != nil { + return nil, err + } + + return common.FromHex(witness), nil +} diff --git a/rpc/batch_test.go b/rpc/batch_test.go new file mode 100644 index 00000000..d6940bf3 --- /dev/null +++ b/rpc/batch_test.go @@ -0,0 +1,265 @@ +package rpc + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "net/http/httptest" + "testing" + + "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func Test_getBatchFromRPC(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + batch uint64 + getBatchByNumberResp string + getBlockByHasResp string + getBatchByNumberErr error + getBlockByHashErr error + expectBlocks int + expectData []byte + expectTimestamp uint64 + expectErr error + }{ + { + name: "successfully fetched", + getBatchByNumberResp: `{"jsonrpc":"2.0","id":1,"result":{"blocks":["1", "2", "3"],"batchL2Data":"0x1234567"}}`, + getBlockByHasResp: `{"jsonrpc":"2.0","id":1,"result":{"timestamp":"0x123456"}}`, + batch: 0, + expectBlocks: 3, + expectData: common.FromHex("0x1234567"), + expectTimestamp: 1193046, + expectErr: nil, + }, + { + name: "invalid json", + getBatchByNumberResp: `{"jsonrpc":"2.0","id":1,"result":{"blocks":invalid,"batchL2Data":"test"}}`, + batch: 0, + expectBlocks: 3, + expectData: nil, + expectErr: errors.New("invalid character 'i' looking for beginning of value"), + }, + { + name: "wrong json", + getBatchByNumberResp: `{"jsonrpc":"2.0","id":1,"result":{"blocks":"invalid","batchL2Data":"test"}}`, + batch: 0, + expectBlocks: 3, + expectData: nil, + expectErr: errors.New("error unmarshalling the batch from the response calling zkevm_getBatchByNumber: json: cannot unmarshal string into Go struct field zkEVMBatch.blocks of type []string"), + }, + { + name: "error in the response", + getBatchByNumberResp: `{"jsonrpc":"2.0","id":1,"result":null,"error":{"code":-32602,"message":"Invalid params"}}`, + batch: 0, + expectBlocks: 0, + expectData: nil, + expectErr: errors.New("error in the response calling zkevm_getBatchByNumber: &{-32602 Invalid params }"), + }, + { + name: "http failed", + getBatchByNumberErr: errors.New("failed to fetch"), + batch: 0, + expectBlocks: 0, + expectData: nil, + expectErr: errors.New("invalid status code, expected: 200, found: 500"), + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var req rpc.Request + err := json.NewDecoder(r.Body).Decode(&req) + require.NoError(t, err) + + switch req.Method { + case "zkevm_getBatchByNumber": + if tt.getBatchByNumberErr != nil { + http.Error(w, tt.getBatchByNumberErr.Error(), http.StatusInternalServerError) + return + } + + _, _ = w.Write([]byte(tt.getBatchByNumberResp)) + case "eth_getBlockByHash": + if tt.getBlockByHashErr != nil { + http.Error(w, tt.getBlockByHashErr.Error(), http.StatusInternalServerError) + return + } + _, _ = w.Write([]byte(tt.getBlockByHasResp)) + default: + http.Error(w, "method not found", http.StatusNotFound) + } + })) + defer srv.Close() + + rcpBatchClient := NewBatchEndpoints(srv.URL) + rpcBatch, err := rcpBatchClient.GetBatch(tt.batch) + if rpcBatch != nil { + copiedrpcBatch := rpcBatch.DeepCopy() + require.NotNil(t, copiedrpcBatch) + str := copiedrpcBatch.String() + require.NotEmpty(t, str) + } + if tt.expectErr != nil { + require.Equal(t, tt.expectErr.Error(), err.Error()) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectTimestamp, rpcBatch.LastL2BLockTimestamp()) + require.Equal(t, tt.expectData, rpcBatch.L2Data()) + } + }) + } +} + +func Test_getBatchWitnessRPC(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + batch uint64 + getBatchWitnessResp string + getBatchWitnessErr error + expectData []byte + expectErr error + full bool + }{ + { + name: "get batch trimmed witness success", + batch: 1, + getBatchWitnessResp: `{"jsonrpc":"2.0","id":1,"result":"0x0123456"}`, + getBatchWitnessErr: nil, + expectData: common.FromHex("0x0123456"), + expectErr: nil, + full: false, + }, + { + name: "get batch full witness success", + batch: 1, + getBatchWitnessResp: `{"jsonrpc":"2.0","id":1,"result":"0x0123456"}`, + getBatchWitnessErr: nil, + expectData: common.FromHex("0x0123456"), + expectErr: nil, + full: true, + }, + { + name: "get batch witness busy", + batch: 1, + getBatchWitnessResp: `{"jsonrpc":"2.0","id":1,"result":"", "error":{"code":-32000,"message":"busy"}}`, + getBatchWitnessErr: nil, + expectData: []byte{}, + expectErr: ErrBusy, + full: false, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var req rpc.Request + err := json.NewDecoder(r.Body).Decode(&req) + require.NoError(t, err) + + switch req.Method { + case "zkevm_getBatchWitness": + if tt.getBatchWitnessErr != nil { + http.Error(w, tt.getBatchWitnessErr.Error(), http.StatusInternalServerError) + return + } + _, _ = w.Write([]byte(tt.getBatchWitnessResp)) + default: + http.Error(w, "method not found", http.StatusNotFound) + } + })) + defer srv.Close() + + rcpBatchClient := NewBatchEndpoints(srv.URL) + witness, err := rcpBatchClient.GetWitness(tt.batch, false) + if tt.expectErr != nil { + require.Equal(t, tt.expectErr.Error(), err.Error()) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectData, witness) + } + }) + } +} + +func Test_getGetL2BlockTimestamp(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + blockHash []byte + response string + error error + expectData uint64 + expectErr error + }{ + { + name: "success", + blockHash: []byte{1}, + response: `{"jsonrpc":"2.0","id":1,"result":{"timestamp":"0x123456"}}`, + error: nil, + expectData: uint64(0x123456), + expectErr: nil, + }, + { + name: "fail", + blockHash: []byte{2}, + response: `{"jsonrpc":"2.0","id":1,"result":{"timestamp":"0x123456"}}`, + error: fmt.Errorf("error"), + expectData: 0, + expectErr: fmt.Errorf("invalid status code, expected: 200, found: 500"), + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var req rpc.Request + err := json.NewDecoder(r.Body).Decode(&req) + require.NoError(t, err) + + switch req.Method { + case "eth_getBlockByHash": + if tt.error != nil { + http.Error(w, tt.error.Error(), http.StatusInternalServerError) + return + } + _, _ = w.Write([]byte(tt.response)) + default: + http.Error(w, "method not found", http.StatusNotFound) + } + })) + defer srv.Close() + + rcpBatchClient := NewBatchEndpoints(srv.URL) + timestamp, err := rcpBatchClient.GetL2BlockTimestamp(string(tt.blockHash)) + if tt.expectErr != nil { + require.Equal(t, tt.expectErr.Error(), err.Error()) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectData, timestamp) + } + }) + } +} diff --git a/rpc/bridge.go b/rpc/bridge.go new file mode 100644 index 00000000..91a36da7 --- /dev/null +++ b/rpc/bridge.go @@ -0,0 +1,364 @@ +package rpc + +import ( + "context" + "errors" + "fmt" + "math/big" + "time" + + "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/agglayer/aggkit/claimsponsor" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/rpc/types" + tree "github.com/agglayer/aggkit/tree/types" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/metric" +) + +const ( + // BRIDGE is the namespace of the bridge service + BRIDGE = "bridge" + meterName = "github.com/agglayer/aggkit/rpc" + + zeroHex = "0x0" + binnarySearchDivider = 2 +) + +var ( + ErrNotOnL1Info = errors.New("this bridge has not been included on the L1 Info Tree yet") +) + +// BridgeEndpoints contains implementations for the "bridge" RPC endpoints +type BridgeEndpoints struct { + logger *log.Logger + meter metric.Meter + readTimeout time.Duration + writeTimeout time.Duration + networkID uint32 + sponsor ClaimSponsorer + l1InfoTree L1InfoTreer + injectedGERs LastGERer + bridgeL1 Bridger + bridgeL2 Bridger +} + +// NewBridgeEndpoints returns InteropEndpoints +func NewBridgeEndpoints( + logger *log.Logger, + writeTimeout time.Duration, + readTimeout time.Duration, + networkID uint32, + sponsor ClaimSponsorer, + l1InfoTree L1InfoTreer, + injectedGERs LastGERer, + bridgeL1 Bridger, + bridgeL2 Bridger, +) *BridgeEndpoints { + meter := otel.Meter(meterName) + return &BridgeEndpoints{ + logger: logger, + meter: meter, + readTimeout: readTimeout, + writeTimeout: writeTimeout, + networkID: networkID, + sponsor: sponsor, + l1InfoTree: l1InfoTree, + injectedGERs: injectedGERs, + bridgeL1: bridgeL1, + bridgeL2: bridgeL2, + } +} + +// L1InfoTreeIndexForBridge returns the first L1 Info Tree index in which the bridge was included. +// networkID represents the origin network. +// This call needs to be done to a client of the same network were the bridge tx was sent +func (b *BridgeEndpoints) L1InfoTreeIndexForBridge(networkID uint32, depositCount uint32) (interface{}, rpc.Error) { + ctx, cancel := context.WithTimeout(context.Background(), b.readTimeout) + defer cancel() + + c, merr := b.meter.Int64Counter("l1_info_tree_index_for_bridge") + if merr != nil { + b.logger.Warnf("failed to create l1_info_tree_index_for_bridge counter: %s", merr) + } + c.Add(ctx, 1) + + if networkID == 0 { + l1InfoTreeIndex, err := b.getFirstL1InfoTreeIndexForL1Bridge(ctx, depositCount) + // TODO: special treatment of the error when not found, + // as it's expected that it will take some time for the L1 Info tree to be updated + if err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf( + "failed to get l1InfoTreeIndex for networkID %d and deposit count %d, error: %s", networkID, depositCount, err), + ) + } + return l1InfoTreeIndex, nil + } + if networkID == b.networkID { + l1InfoTreeIndex, err := b.getFirstL1InfoTreeIndexForL2Bridge(ctx, depositCount) + // TODO: special treatment of the error when not found, + // as it's expected that it will take some time for the L1 Info tree to be updated + if err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf( + "failed to get l1InfoTreeIndex for networkID %d and deposit count %d, error: %s", networkID, depositCount, err), + ) + } + return l1InfoTreeIndex, nil + } + return zeroHex, rpc.NewRPCError( + rpc.DefaultErrorCode, + fmt.Sprintf("this client does not support network %d", networkID), + ) +} + +// InjectedInfoAfterIndex return the first GER injected onto the network that is linked +// to the given index or greater. This call is useful to understand when a bridge is ready to be claimed +// on its destination network +func (b *BridgeEndpoints) InjectedInfoAfterIndex(networkID uint32, l1InfoTreeIndex uint32) (interface{}, rpc.Error) { + ctx, cancel := context.WithTimeout(context.Background(), b.readTimeout) + defer cancel() + + c, merr := b.meter.Int64Counter("injected_info_after_index") + if merr != nil { + b.logger.Warnf("failed to create injected_info_after_index counter: %s", merr) + } + c.Add(ctx, 1) + + if networkID == 0 { + info, err := b.l1InfoTree.GetInfoByIndex(ctx, l1InfoTreeIndex) + if err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get global exit root, error: %s", err)) + } + return info, nil + } + if networkID == b.networkID { + e, err := b.injectedGERs.GetFirstGERAfterL1InfoTreeIndex(ctx, l1InfoTreeIndex) + if err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get global exit root, error: %s", err)) + } + info, err := b.l1InfoTree.GetInfoByIndex(ctx, e.L1InfoTreeIndex) + if err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get global exit root, error: %s", err)) + } + return info, nil + } + return zeroHex, rpc.NewRPCError( + rpc.DefaultErrorCode, + fmt.Sprintf("this client does not support network %d", networkID), + ) +} + +// GetProof returns the proofs needed to claim a bridge. NetworkID and depositCount refere to the bridge origin +// while globalExitRoot should be already injected on the destination network. +// This call needs to be done to a client of the same network were the bridge tx was sent +func (b *BridgeEndpoints) GetProof( + networkID uint32, depositCount uint32, l1InfoTreeIndex uint32, +) (interface{}, rpc.Error) { + ctx, cancel := context.WithTimeout(context.Background(), b.readTimeout) + defer cancel() + + c, merr := b.meter.Int64Counter("claim_proof") + if merr != nil { + b.logger.Warnf("failed to create claim_proof counter: %s", merr) + } + c.Add(ctx, 1) + + info, err := b.l1InfoTree.GetInfoByIndex(ctx, l1InfoTreeIndex) + if err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get info from the tree: %s", err)) + } + proofRollupExitRoot, err := b.l1InfoTree.GetRollupExitTreeMerkleProof(ctx, networkID, info.GlobalExitRoot) + if err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get rollup exit proof, error: %s", err)) + } + var proofLocalExitRoot tree.Proof + switch { + case networkID == 0: + proofLocalExitRoot, err = b.bridgeL1.GetProof(ctx, depositCount, info.MainnetExitRoot) + if err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get local exit proof, error: %s", err)) + } + + case networkID == b.networkID: + localExitRoot, err := b.l1InfoTree.GetLocalExitRoot(ctx, networkID, info.RollupExitRoot) + if err != nil { + return zeroHex, rpc.NewRPCError( + rpc.DefaultErrorCode, + fmt.Sprintf("failed to get local exit root from rollup exit tree, error: %s", err), + ) + } + proofLocalExitRoot, err = b.bridgeL2.GetProof(ctx, depositCount, localExitRoot) + if err != nil { + return zeroHex, rpc.NewRPCError( + rpc.DefaultErrorCode, + fmt.Sprintf("failed to get local exit proof, error: %s", err), + ) + } + + default: + return zeroHex, rpc.NewRPCError( + rpc.DefaultErrorCode, + fmt.Sprintf("this client does not support network %d", networkID), + ) + } + return types.ClaimProof{ + ProofLocalExitRoot: proofLocalExitRoot, + ProofRollupExitRoot: proofRollupExitRoot, + L1InfoTreeLeaf: *info, + }, nil +} + +// SponsorClaim sends a claim tx on behalf of the user. +// This call needs to be done to a client of the same network were the claim is going to be sent (bridge destination) +func (b *BridgeEndpoints) SponsorClaim(claim claimsponsor.Claim) (interface{}, rpc.Error) { + ctx, cancel := context.WithTimeout(context.Background(), b.writeTimeout) + defer cancel() + + c, merr := b.meter.Int64Counter("sponsor_claim") + if merr != nil { + b.logger.Warnf("failed to create sponsor_claim counter: %s", merr) + } + c.Add(ctx, 1) + + if b.sponsor == nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, "this client does not support claim sponsoring") + } + if claim.DestinationNetwork != b.networkID { + return zeroHex, rpc.NewRPCError( + rpc.DefaultErrorCode, + fmt.Sprintf("this client only sponsors claims for network %d", b.networkID), + ) + } + if err := b.sponsor.AddClaimToQueue(&claim); err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("error adding claim to the queue %s", err)) + } + return nil, nil +} + +// GetSponsoredClaimStatus returns the status of a claim that has been previously requested to be sponsored. +// This call needs to be done to the same client were it was requested to be sponsored +func (b *BridgeEndpoints) GetSponsoredClaimStatus(globalIndex *big.Int) (interface{}, rpc.Error) { + ctx, cancel := context.WithTimeout(context.Background(), b.readTimeout) + defer cancel() + + c, merr := b.meter.Int64Counter("get_sponsored_claim_status") + if merr != nil { + b.logger.Warnf("failed to create get_sponsored_claim_status counter: %s", merr) + } + c.Add(ctx, 1) + + if b.sponsor == nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, "this client does not support claim sponsoring") + } + claim, err := b.sponsor.GetClaim(globalIndex) + if err != nil { + return zeroHex, rpc.NewRPCError(rpc.DefaultErrorCode, fmt.Sprintf("failed to get claim status, error: %s", err)) + } + return claim.Status, nil +} + +func (b *BridgeEndpoints) getFirstL1InfoTreeIndexForL1Bridge(ctx context.Context, depositCount uint32) (uint32, error) { + lastInfo, err := b.l1InfoTree.GetLastInfo() + if err != nil { + return 0, err + } + + root, err := b.bridgeL1.GetRootByLER(ctx, lastInfo.MainnetExitRoot) + if err != nil { + return 0, err + } + if root.Index < depositCount { + return 0, ErrNotOnL1Info + } + + firstInfo, err := b.l1InfoTree.GetFirstInfo() + if err != nil { + return 0, err + } + + // Binary search between the first and last blcoks where L1 info tree was updated. + // Find the smallest l1 info tree index that is greater than depositCount and matches with + // a MER that is included on the l1 info tree + bestResult := lastInfo + lowerLimit := firstInfo.BlockNumber + upperLimit := lastInfo.BlockNumber + for lowerLimit <= upperLimit { + targetBlock := lowerLimit + ((upperLimit - lowerLimit) / binnarySearchDivider) + targetInfo, err := b.l1InfoTree.GetFirstInfoAfterBlock(targetBlock) + if err != nil { + return 0, err + } + root, err := b.bridgeL1.GetRootByLER(ctx, targetInfo.MainnetExitRoot) + if err != nil { + return 0, err + } + if root.Index < depositCount { + lowerLimit = targetBlock + 1 + } else if root.Index == depositCount { + bestResult = targetInfo + break + } else { + bestResult = targetInfo + upperLimit = targetBlock - 1 + } + } + + return bestResult.L1InfoTreeIndex, nil +} + +func (b *BridgeEndpoints) getFirstL1InfoTreeIndexForL2Bridge(ctx context.Context, depositCount uint32) (uint32, error) { + // NOTE: this code assumes that all the rollup exit roots + // (produced by the smart contract call verifyBatches / verifyBatchesTrustedAggregator) + // are included in the L1 info tree. As per the current implementation (smart contracts) of the protocol + // this is true. This could change in the future + lastVerified, err := b.l1InfoTree.GetLastVerifiedBatches(b.networkID - 1) + if err != nil { + return 0, err + } + + root, err := b.bridgeL2.GetRootByLER(ctx, lastVerified.ExitRoot) + if err != nil { + return 0, err + } + if root.Index < depositCount { + return 0, ErrNotOnL1Info + } + + firstVerified, err := b.l1InfoTree.GetFirstVerifiedBatches(b.networkID - 1) + if err != nil { + return 0, err + } + + // Binary search between the first and last blcoks where batches were verified. + // Find the smallest deposit count that is greater than depositCount and matches with + // a LER that is verified + bestResult := lastVerified + lowerLimit := firstVerified.BlockNumber + upperLimit := lastVerified.BlockNumber + for lowerLimit <= upperLimit { + targetBlock := lowerLimit + ((upperLimit - lowerLimit) / binnarySearchDivider) + targetVerified, err := b.l1InfoTree.GetFirstVerifiedBatchesAfterBlock(b.networkID-1, targetBlock) + if err != nil { + return 0, err + } + root, err = b.bridgeL2.GetRootByLER(ctx, targetVerified.ExitRoot) + if err != nil { + return 0, err + } + if root.Index < depositCount { + lowerLimit = targetBlock + 1 + } else if root.Index == depositCount { + bestResult = targetVerified + break + } else { + bestResult = targetVerified + upperLimit = targetBlock - 1 + } + } + + info, err := b.l1InfoTree.GetFirstL1InfoWithRollupExitRoot(bestResult.RollupExitRoot) + if err != nil { + return 0, err + } + return info.L1InfoTreeIndex, nil +} diff --git a/rpc/bridge_interfaces.go b/rpc/bridge_interfaces.go new file mode 100644 index 00000000..26184bc6 --- /dev/null +++ b/rpc/bridge_interfaces.go @@ -0,0 +1,41 @@ +package rpc + +import ( + "context" + "math/big" + + "github.com/agglayer/aggkit/claimsponsor" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/lastgersync" + tree "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" +) + +type Bridger interface { + GetProof(ctx context.Context, depositCount uint32, localExitRoot common.Hash) (tree.Proof, error) + GetRootByLER(ctx context.Context, ler common.Hash) (*tree.Root, error) +} + +type LastGERer interface { + GetFirstGERAfterL1InfoTreeIndex( + ctx context.Context, atOrAfterL1InfoTreeIndex uint32, + ) (lastgersync.Event, error) +} + +type L1InfoTreer interface { + GetInfoByIndex(ctx context.Context, index uint32) (*l1infotreesync.L1InfoTreeLeaf, error) + GetRollupExitTreeMerkleProof(ctx context.Context, networkID uint32, root common.Hash) (tree.Proof, error) + GetLocalExitRoot(ctx context.Context, networkID uint32, rollupExitRoot common.Hash) (common.Hash, error) + GetLastInfo() (*l1infotreesync.L1InfoTreeLeaf, error) + GetFirstInfo() (*l1infotreesync.L1InfoTreeLeaf, error) + GetFirstInfoAfterBlock(blockNum uint64) (*l1infotreesync.L1InfoTreeLeaf, error) + GetLastVerifiedBatches(rollupID uint32) (*l1infotreesync.VerifyBatches, error) + GetFirstVerifiedBatches(rollupID uint32) (*l1infotreesync.VerifyBatches, error) + GetFirstVerifiedBatchesAfterBlock(rollupID uint32, blockNum uint64) (*l1infotreesync.VerifyBatches, error) + GetFirstL1InfoWithRollupExitRoot(rollupExitRoot common.Hash) (*l1infotreesync.L1InfoTreeLeaf, error) +} + +type ClaimSponsorer interface { + AddClaimToQueue(claim *claimsponsor.Claim) error + GetClaim(globalIndex *big.Int) (*claimsponsor.Claim, error) +} diff --git a/rpc/bridge_test.go b/rpc/bridge_test.go new file mode 100644 index 00000000..fe46d33d --- /dev/null +++ b/rpc/bridge_test.go @@ -0,0 +1,443 @@ +package rpc + +import ( + "context" + "errors" + "testing" + + aggkitcommon "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + mocks "github.com/agglayer/aggkit/rpc/mocks" + tree "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestGetFirstL1InfoTreeIndexForL1Bridge(t *testing.T) { + type testCase struct { + description string + setupMocks func() + depositCount uint32 + expectedIndex uint32 + expectedErr error + } + ctx := context.Background() + b := newBridgeWithMocks(t) + fooErr := errors.New("foo") + firstL1Info := &l1infotreesync.L1InfoTreeLeaf{ + BlockNumber: 10, + MainnetExitRoot: common.HexToHash("alfa"), + } + lastL1Info := &l1infotreesync.L1InfoTreeLeaf{ + BlockNumber: 1000, + MainnetExitRoot: common.HexToHash("alfa"), + } + mockHappyPath := func() { + // to make this work, assume that block number == l1 info tree index == deposit count + b.l1InfoTree.On("GetLastInfo"). + Return(lastL1Info, nil). + Once() + b.l1InfoTree.On("GetFirstInfo"). + Return(firstL1Info, nil). + Once() + infoAfterBlock := &l1infotreesync.L1InfoTreeLeaf{} + b.l1InfoTree.On("GetFirstInfoAfterBlock", mock.Anything). + Run(func(args mock.Arguments) { + blockNum, ok := args.Get(0).(uint64) + require.True(t, ok) + infoAfterBlock.L1InfoTreeIndex = uint32(blockNum) + infoAfterBlock.BlockNumber = blockNum + infoAfterBlock.MainnetExitRoot = common.BytesToHash(aggkitcommon.Uint32ToBytes(uint32(blockNum))) + }). + Return(infoAfterBlock, nil) + rootByLER := &tree.Root{} + b.bridgeL1.On("GetRootByLER", ctx, mock.Anything). + Run(func(args mock.Arguments) { + ler, ok := args.Get(1).(common.Hash) + require.True(t, ok) + index := aggkitcommon.BytesToUint32(ler.Bytes()[28:]) // hash is 32 bytes, uint32 is just 4 + if ler == common.HexToHash("alfa") { + index = uint32(lastL1Info.BlockNumber) + } + rootByLER.Index = index + }). + Return(rootByLER, nil) + } + testCases := []testCase{ + { + description: "error on GetLastInfo", + setupMocks: func() { + b.l1InfoTree.On("GetLastInfo"). + Return(nil, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "error on first GetRootByLER", + setupMocks: func() { + b.l1InfoTree.On("GetLastInfo"). + Return(lastL1Info, nil). + Once() + b.bridgeL1.On("GetRootByLER", ctx, lastL1Info.MainnetExitRoot). + Return(&tree.Root{}, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "not included yet", + setupMocks: func() { + b.l1InfoTree.On("GetLastInfo"). + Return(lastL1Info, nil). + Once() + b.bridgeL1.On("GetRootByLER", ctx, lastL1Info.MainnetExitRoot). + Return(&tree.Root{Index: 10}, nil). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: ErrNotOnL1Info, + }, + { + description: "error on GetFirstInfo", + setupMocks: func() { + b.l1InfoTree.On("GetLastInfo"). + Return(lastL1Info, nil). + Once() + b.bridgeL1.On("GetRootByLER", ctx, lastL1Info.MainnetExitRoot). + Return(&tree.Root{Index: 13}, nil). + Once() + b.l1InfoTree.On("GetFirstInfo"). + Return(nil, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "error on GetFirstInfoAfterBlock", + setupMocks: func() { + b.l1InfoTree.On("GetLastInfo"). + Return(lastL1Info, nil). + Once() + b.bridgeL1.On("GetRootByLER", ctx, lastL1Info.MainnetExitRoot). + Return(&tree.Root{Index: 13}, nil). + Once() + b.l1InfoTree.On("GetFirstInfo"). + Return(firstL1Info, nil). + Once() + b.l1InfoTree.On("GetFirstInfoAfterBlock", mock.Anything). + Return(nil, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "error on GetRootByLER (inside binnary search)", + setupMocks: func() { + b.l1InfoTree.On("GetLastInfo"). + Return(lastL1Info, nil). + Once() + b.bridgeL1.On("GetRootByLER", ctx, lastL1Info.MainnetExitRoot). + Return(&tree.Root{Index: 13}, nil). + Once() + b.l1InfoTree.On("GetFirstInfo"). + Return(firstL1Info, nil). + Once() + b.l1InfoTree.On("GetFirstInfoAfterBlock", mock.Anything). + Return(firstL1Info, nil). + Once() + b.bridgeL1.On("GetRootByLER", ctx, mock.Anything). + Return(&tree.Root{}, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "happy path 1", + setupMocks: mockHappyPath, + depositCount: 10, + expectedIndex: 10, + expectedErr: nil, + }, + { + description: "happy path 2", + setupMocks: mockHappyPath, + depositCount: 11, + expectedIndex: 11, + expectedErr: nil, + }, + { + description: "happy path 3", + setupMocks: mockHappyPath, + depositCount: 333, + expectedIndex: 333, + expectedErr: nil, + }, + { + description: "happy path 4", + setupMocks: mockHappyPath, + depositCount: 420, + expectedIndex: 420, + expectedErr: nil, + }, + { + description: "happy path 5", + setupMocks: mockHappyPath, + depositCount: 69, + expectedIndex: 69, + expectedErr: nil, + }, + } + + for _, tc := range testCases { + log.Debugf("running test case: %s", tc.description) + tc.setupMocks() + actualIndex, err := b.bridge.getFirstL1InfoTreeIndexForL1Bridge(ctx, tc.depositCount) + require.Equal(t, tc.expectedErr, err) + require.Equal(t, tc.expectedIndex, actualIndex) + } +} + +func TestGetFirstL1InfoTreeIndexForL2Bridge(t *testing.T) { + type testCase struct { + description string + setupMocks func() + depositCount uint32 + expectedIndex uint32 + expectedErr error + } + ctx := context.Background() + b := newBridgeWithMocks(t) + fooErr := errors.New("foo") + firstVerified := &l1infotreesync.VerifyBatches{ + BlockNumber: 10, + ExitRoot: common.HexToHash("alfa"), + } + lastVerified := &l1infotreesync.VerifyBatches{ + BlockNumber: 1000, + ExitRoot: common.HexToHash("alfa"), + } + mockHappyPath := func() { + // to make this work, assume that block number == l1 info tree index == deposit count + b.l1InfoTree.On("GetLastVerifiedBatches", uint32(1)). + Return(lastVerified, nil). + Once() + b.l1InfoTree.On("GetFirstVerifiedBatches", uint32(1)). + Return(firstVerified, nil). + Once() + verifiedAfterBlock := &l1infotreesync.VerifyBatches{} + b.l1InfoTree.On("GetFirstVerifiedBatchesAfterBlock", uint32(1), mock.Anything). + Run(func(args mock.Arguments) { + blockNum, ok := args.Get(1).(uint64) + require.True(t, ok) + verifiedAfterBlock.BlockNumber = blockNum + verifiedAfterBlock.ExitRoot = common.BytesToHash(aggkitcommon.Uint32ToBytes(uint32(blockNum))) + verifiedAfterBlock.RollupExitRoot = common.BytesToHash(aggkitcommon.Uint32ToBytes(uint32(blockNum))) + }). + Return(verifiedAfterBlock, nil) + rootByLER := &tree.Root{} + b.bridgeL2.On("GetRootByLER", ctx, mock.Anything). + Run(func(args mock.Arguments) { + ler, ok := args.Get(1).(common.Hash) + require.True(t, ok) + index := aggkitcommon.BytesToUint32(ler.Bytes()[28:]) // hash is 32 bytes, uint32 is just 4 + if ler == common.HexToHash("alfa") { + index = uint32(lastVerified.BlockNumber) + } + rootByLER.Index = index + }). + Return(rootByLER, nil) + info := &l1infotreesync.L1InfoTreeLeaf{} + b.l1InfoTree.On("GetFirstL1InfoWithRollupExitRoot", mock.Anything). + Run(func(args mock.Arguments) { + exitRoot, ok := args.Get(0).(common.Hash) + require.True(t, ok) + index := aggkitcommon.BytesToUint32(exitRoot.Bytes()[28:]) // hash is 32 bytes, uint32 is just 4 + info.L1InfoTreeIndex = index + }). + Return(info, nil). + Once() + } + testCases := []testCase{ + { + description: "error on GetLastVerified", + setupMocks: func() { + b.l1InfoTree.On("GetLastVerifiedBatches", uint32(1)). + Return(nil, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "error on first GetRootByLER", + setupMocks: func() { + b.l1InfoTree.On("GetLastVerifiedBatches", uint32(1)). + Return(lastVerified, nil). + Once() + b.bridgeL2.On("GetRootByLER", ctx, lastVerified.ExitRoot). + Return(&tree.Root{}, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "not included yet", + setupMocks: func() { + b.l1InfoTree.On("GetLastVerifiedBatches", uint32(1)). + Return(lastVerified, nil). + Once() + b.bridgeL2.On("GetRootByLER", ctx, lastVerified.ExitRoot). + Return(&tree.Root{Index: 10}, nil). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: ErrNotOnL1Info, + }, + { + description: "error on GetFirstVerified", + setupMocks: func() { + b.l1InfoTree.On("GetLastVerifiedBatches", uint32(1)). + Return(lastVerified, nil). + Once() + b.bridgeL2.On("GetRootByLER", ctx, lastVerified.ExitRoot). + Return(&tree.Root{Index: 13}, nil). + Once() + b.l1InfoTree.On("GetFirstVerifiedBatches", uint32(1)). + Return(nil, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "error on GetFirstVerifiedBatchesAfterBlock", + setupMocks: func() { + b.l1InfoTree.On("GetLastVerifiedBatches", uint32(1)). + Return(lastVerified, nil). + Once() + b.bridgeL2.On("GetRootByLER", ctx, lastVerified.ExitRoot). + Return(&tree.Root{Index: 13}, nil). + Once() + b.l1InfoTree.On("GetFirstVerifiedBatches", uint32(1)). + Return(firstVerified, nil). + Once() + b.l1InfoTree.On("GetFirstVerifiedBatchesAfterBlock", uint32(1), mock.Anything). + Return(nil, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "error on GetRootByLER (inside binnary search)", + setupMocks: func() { + b.l1InfoTree.On("GetLastVerifiedBatches", uint32(1)). + Return(lastVerified, nil). + Once() + b.bridgeL2.On("GetRootByLER", ctx, lastVerified.ExitRoot). + Return(&tree.Root{Index: 13}, nil). + Once() + b.l1InfoTree.On("GetFirstVerifiedBatches", uint32(1)). + Return(firstVerified, nil). + Once() + b.l1InfoTree.On("GetFirstVerifiedBatchesAfterBlock", uint32(1), mock.Anything). + Return(firstVerified, nil). + Once() + b.bridgeL2.On("GetRootByLER", ctx, mock.Anything). + Return(&tree.Root{}, fooErr). + Once() + }, + depositCount: 11, + expectedIndex: 0, + expectedErr: fooErr, + }, + { + description: "happy path 1", + setupMocks: mockHappyPath, + depositCount: 10, + expectedIndex: 10, + expectedErr: nil, + }, + { + description: "happy path 2", + setupMocks: mockHappyPath, + depositCount: 11, + expectedIndex: 11, + expectedErr: nil, + }, + { + description: "happy path 3", + setupMocks: mockHappyPath, + depositCount: 333, + expectedIndex: 333, + expectedErr: nil, + }, + { + description: "happy path 4", + setupMocks: mockHappyPath, + depositCount: 420, + expectedIndex: 420, + expectedErr: nil, + }, + { + description: "happy path 5", + setupMocks: mockHappyPath, + depositCount: 69, + expectedIndex: 69, + expectedErr: nil, + }, + } + + for _, tc := range testCases { + log.Debugf("running test case: %s", tc.description) + tc.setupMocks() + actualIndex, err := b.bridge.getFirstL1InfoTreeIndexForL2Bridge(ctx, tc.depositCount) + require.Equal(t, tc.expectedErr, err) + require.Equal(t, tc.expectedIndex, actualIndex) + } +} + +type bridgeWithMocks struct { + bridge *BridgeEndpoints + sponsor *mocks.ClaimSponsorer + l1InfoTree *mocks.L1InfoTreer + injectedGERs *mocks.LastGERer + bridgeL1 *mocks.Bridger + bridgeL2 *mocks.Bridger +} + +func newBridgeWithMocks(t *testing.T) bridgeWithMocks { + t.Helper() + b := bridgeWithMocks{ + sponsor: mocks.NewClaimSponsorer(t), + l1InfoTree: mocks.NewL1InfoTreer(t), + injectedGERs: mocks.NewLastGERer(t), + bridgeL1: mocks.NewBridger(t), + bridgeL2: mocks.NewBridger(t), + } + logger := log.WithFields("module", "bridgerpc") + b.bridge = NewBridgeEndpoints( + logger, 0, 0, 2, b.sponsor, b.l1InfoTree, b.injectedGERs, b.bridgeL1, b.bridgeL2, + ) + return b +} diff --git a/rpc/client/bridge.go b/rpc/client/bridge.go new file mode 100644 index 00000000..8d7288de --- /dev/null +++ b/rpc/client/bridge.go @@ -0,0 +1,94 @@ +package rpc + +import ( + "encoding/json" + "fmt" + "math/big" + + "github.com/0xPolygon/cdk-rpc/rpc" + "github.com/agglayer/aggkit/claimsponsor" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/rpc/types" +) + +type BridgeClientInterface interface { + L1InfoTreeIndexForBridge(networkID uint32, depositCount uint32) (uint32, error) + InjectedInfoAfterIndex(networkID uint32, l1InfoTreeIndex uint32) (*l1infotreesync.L1InfoTreeLeaf, error) + ClaimProof(networkID uint32, depositCount uint32, l1InfoTreeIndex uint32) (*types.ClaimProof, error) + SponsorClaim(claim claimsponsor.Claim) error + GetSponsoredClaimStatus(globalIndex *big.Int) (claimsponsor.ClaimStatus, error) +} + +// L1InfoTreeIndexForBridge returns the first L1 Info Tree index in which the bridge was included. +// networkID represents the origin network. +// This call needs to be done to a client of the same network were the bridge tx was sent +func (c *Client) L1InfoTreeIndexForBridge(networkID uint32, depositCount uint32) (uint32, error) { + response, err := rpc.JSONRPCCall(c.url, "bridge_l1InfoTreeIndexForBridge", networkID, depositCount) + if err != nil { + return 0, err + } + if response.Error != nil { + return 0, fmt.Errorf("%v %v", response.Error.Code, response.Error.Message) + } + var result uint32 + return result, json.Unmarshal(response.Result, &result) +} + +// InjectedInfoAfterIndex return the first GER injected onto the network that is linked +// to the given index or greater. This call is useful to understand when a bridge is ready to be claimed +// on its destination network +func (c *Client) InjectedInfoAfterIndex( + networkID uint32, l1InfoTreeIndex uint32, +) (*l1infotreesync.L1InfoTreeLeaf, error) { + response, err := rpc.JSONRPCCall(c.url, "bridge_injectedInfoAfterIndex", networkID, l1InfoTreeIndex) + if err != nil { + return nil, err + } + if response.Error != nil { + return nil, fmt.Errorf("%v %v", response.Error.Code, response.Error.Message) + } + var result l1infotreesync.L1InfoTreeLeaf + return &result, json.Unmarshal(response.Result, &result) +} + +// ClaimProof returns the proofs needed to claim a bridge. NetworkID and depositCount refere to the bridge origin +// while globalExitRoot should be already injected on the destination network. +// This call needs to be done to a client of the same network were the bridge tx was sent +func (c *Client) ClaimProof(networkID uint32, depositCount uint32, l1InfoTreeIndex uint32) (*types.ClaimProof, error) { + response, err := rpc.JSONRPCCall(c.url, "bridge_claimProof", networkID, depositCount, l1InfoTreeIndex) + if err != nil { + return nil, err + } + if response.Error != nil { + return nil, fmt.Errorf("%v %v", response.Error.Code, response.Error.Message) + } + var result types.ClaimProof + return &result, json.Unmarshal(response.Result, &result) +} + +// SponsorClaim sends a claim tx on behalf of the user. +// This call needs to be done to a client of the same network were the claim is going to be sent (bridge destination) +func (c *Client) SponsorClaim(claim claimsponsor.Claim) error { + response, err := rpc.JSONRPCCall(c.url, "bridge_sponsorClaim", claim) + if err != nil { + return err + } + if response.Error != nil { + return fmt.Errorf("%v %v", response.Error.Code, response.Error.Message) + } + return nil +} + +// GetSponsoredClaimStatus returns the status of a claim that has been previously requested to be sponsored. +// This call needs to be done to the same client were it was requested to be sponsored +func (c *Client) GetSponsoredClaimStatus(globalIndex *big.Int) (claimsponsor.ClaimStatus, error) { + response, err := rpc.JSONRPCCall(c.url, "bridge_getSponsoredClaimStatus", globalIndex) + if err != nil { + return "", err + } + if response.Error != nil { + return "", fmt.Errorf("%v %v", response.Error.Code, response.Error.Message) + } + var result claimsponsor.ClaimStatus + return result, json.Unmarshal(response.Result, &result) +} diff --git a/rpc/client/client.go b/rpc/client/client.go new file mode 100644 index 00000000..b48fca51 --- /dev/null +++ b/rpc/client/client.go @@ -0,0 +1,31 @@ +package rpc + +// ClientInterface is the interface that defines the implementation of all the endpoints +type ClientInterface interface { + BridgeClientInterface +} + +// ClientFactoryInterface interface for the client factory +type ClientFactoryInterface interface { + NewClient(url string) ClientInterface +} + +// ClientFactory is the implementation of the data committee client factory +type ClientFactory struct{} + +// NewClient returns an implementation of the data committee node client +func (f *ClientFactory) NewClient(url string) ClientInterface { + return NewClient(url) +} + +// Client wraps all the available endpoints of the data abailability committee node server +type Client struct { + url string +} + +// NewClient returns a client ready to be used +func NewClient(url string) *Client { + return &Client{ + url: url, + } +} diff --git a/rpc/mocks/bridge_client_interface.go b/rpc/mocks/bridge_client_interface.go new file mode 100644 index 00000000..69b6093a --- /dev/null +++ b/rpc/mocks/bridge_client_interface.go @@ -0,0 +1,319 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + claimsponsor "github.com/agglayer/aggkit/claimsponsor" + l1infotreesync "github.com/agglayer/aggkit/l1infotreesync" + + mock "github.com/stretchr/testify/mock" + + types "github.com/agglayer/aggkit/rpc/types" +) + +// BridgeClientInterface is an autogenerated mock type for the BridgeClientInterface type +type BridgeClientInterface struct { + mock.Mock +} + +type BridgeClientInterface_Expecter struct { + mock *mock.Mock +} + +func (_m *BridgeClientInterface) EXPECT() *BridgeClientInterface_Expecter { + return &BridgeClientInterface_Expecter{mock: &_m.Mock} +} + +// ClaimProof provides a mock function with given fields: networkID, depositCount, l1InfoTreeIndex +func (_m *BridgeClientInterface) ClaimProof(networkID uint32, depositCount uint32, l1InfoTreeIndex uint32) (*types.ClaimProof, error) { + ret := _m.Called(networkID, depositCount, l1InfoTreeIndex) + + if len(ret) == 0 { + panic("no return value specified for ClaimProof") + } + + var r0 *types.ClaimProof + var r1 error + if rf, ok := ret.Get(0).(func(uint32, uint32, uint32) (*types.ClaimProof, error)); ok { + return rf(networkID, depositCount, l1InfoTreeIndex) + } + if rf, ok := ret.Get(0).(func(uint32, uint32, uint32) *types.ClaimProof); ok { + r0 = rf(networkID, depositCount, l1InfoTreeIndex) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ClaimProof) + } + } + + if rf, ok := ret.Get(1).(func(uint32, uint32, uint32) error); ok { + r1 = rf(networkID, depositCount, l1InfoTreeIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BridgeClientInterface_ClaimProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ClaimProof' +type BridgeClientInterface_ClaimProof_Call struct { + *mock.Call +} + +// ClaimProof is a helper method to define mock.On call +// - networkID uint32 +// - depositCount uint32 +// - l1InfoTreeIndex uint32 +func (_e *BridgeClientInterface_Expecter) ClaimProof(networkID interface{}, depositCount interface{}, l1InfoTreeIndex interface{}) *BridgeClientInterface_ClaimProof_Call { + return &BridgeClientInterface_ClaimProof_Call{Call: _e.mock.On("ClaimProof", networkID, depositCount, l1InfoTreeIndex)} +} + +func (_c *BridgeClientInterface_ClaimProof_Call) Run(run func(networkID uint32, depositCount uint32, l1InfoTreeIndex uint32)) *BridgeClientInterface_ClaimProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32), args[1].(uint32), args[2].(uint32)) + }) + return _c +} + +func (_c *BridgeClientInterface_ClaimProof_Call) Return(_a0 *types.ClaimProof, _a1 error) *BridgeClientInterface_ClaimProof_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *BridgeClientInterface_ClaimProof_Call) RunAndReturn(run func(uint32, uint32, uint32) (*types.ClaimProof, error)) *BridgeClientInterface_ClaimProof_Call { + _c.Call.Return(run) + return _c +} + +// GetSponsoredClaimStatus provides a mock function with given fields: globalIndex +func (_m *BridgeClientInterface) GetSponsoredClaimStatus(globalIndex *big.Int) (claimsponsor.ClaimStatus, error) { + ret := _m.Called(globalIndex) + + if len(ret) == 0 { + panic("no return value specified for GetSponsoredClaimStatus") + } + + var r0 claimsponsor.ClaimStatus + var r1 error + if rf, ok := ret.Get(0).(func(*big.Int) (claimsponsor.ClaimStatus, error)); ok { + return rf(globalIndex) + } + if rf, ok := ret.Get(0).(func(*big.Int) claimsponsor.ClaimStatus); ok { + r0 = rf(globalIndex) + } else { + r0 = ret.Get(0).(claimsponsor.ClaimStatus) + } + + if rf, ok := ret.Get(1).(func(*big.Int) error); ok { + r1 = rf(globalIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BridgeClientInterface_GetSponsoredClaimStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSponsoredClaimStatus' +type BridgeClientInterface_GetSponsoredClaimStatus_Call struct { + *mock.Call +} + +// GetSponsoredClaimStatus is a helper method to define mock.On call +// - globalIndex *big.Int +func (_e *BridgeClientInterface_Expecter) GetSponsoredClaimStatus(globalIndex interface{}) *BridgeClientInterface_GetSponsoredClaimStatus_Call { + return &BridgeClientInterface_GetSponsoredClaimStatus_Call{Call: _e.mock.On("GetSponsoredClaimStatus", globalIndex)} +} + +func (_c *BridgeClientInterface_GetSponsoredClaimStatus_Call) Run(run func(globalIndex *big.Int)) *BridgeClientInterface_GetSponsoredClaimStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*big.Int)) + }) + return _c +} + +func (_c *BridgeClientInterface_GetSponsoredClaimStatus_Call) Return(_a0 claimsponsor.ClaimStatus, _a1 error) *BridgeClientInterface_GetSponsoredClaimStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *BridgeClientInterface_GetSponsoredClaimStatus_Call) RunAndReturn(run func(*big.Int) (claimsponsor.ClaimStatus, error)) *BridgeClientInterface_GetSponsoredClaimStatus_Call { + _c.Call.Return(run) + return _c +} + +// InjectedInfoAfterIndex provides a mock function with given fields: networkID, l1InfoTreeIndex +func (_m *BridgeClientInterface) InjectedInfoAfterIndex(networkID uint32, l1InfoTreeIndex uint32) (*l1infotreesync.L1InfoTreeLeaf, error) { + ret := _m.Called(networkID, l1InfoTreeIndex) + + if len(ret) == 0 { + panic("no return value specified for InjectedInfoAfterIndex") + } + + var r0 *l1infotreesync.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func(uint32, uint32) (*l1infotreesync.L1InfoTreeLeaf, error)); ok { + return rf(networkID, l1InfoTreeIndex) + } + if rf, ok := ret.Get(0).(func(uint32, uint32) *l1infotreesync.L1InfoTreeLeaf); ok { + r0 = rf(networkID, l1InfoTreeIndex) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func(uint32, uint32) error); ok { + r1 = rf(networkID, l1InfoTreeIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BridgeClientInterface_InjectedInfoAfterIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InjectedInfoAfterIndex' +type BridgeClientInterface_InjectedInfoAfterIndex_Call struct { + *mock.Call +} + +// InjectedInfoAfterIndex is a helper method to define mock.On call +// - networkID uint32 +// - l1InfoTreeIndex uint32 +func (_e *BridgeClientInterface_Expecter) InjectedInfoAfterIndex(networkID interface{}, l1InfoTreeIndex interface{}) *BridgeClientInterface_InjectedInfoAfterIndex_Call { + return &BridgeClientInterface_InjectedInfoAfterIndex_Call{Call: _e.mock.On("InjectedInfoAfterIndex", networkID, l1InfoTreeIndex)} +} + +func (_c *BridgeClientInterface_InjectedInfoAfterIndex_Call) Run(run func(networkID uint32, l1InfoTreeIndex uint32)) *BridgeClientInterface_InjectedInfoAfterIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32), args[1].(uint32)) + }) + return _c +} + +func (_c *BridgeClientInterface_InjectedInfoAfterIndex_Call) Return(_a0 *l1infotreesync.L1InfoTreeLeaf, _a1 error) *BridgeClientInterface_InjectedInfoAfterIndex_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *BridgeClientInterface_InjectedInfoAfterIndex_Call) RunAndReturn(run func(uint32, uint32) (*l1infotreesync.L1InfoTreeLeaf, error)) *BridgeClientInterface_InjectedInfoAfterIndex_Call { + _c.Call.Return(run) + return _c +} + +// L1InfoTreeIndexForBridge provides a mock function with given fields: networkID, depositCount +func (_m *BridgeClientInterface) L1InfoTreeIndexForBridge(networkID uint32, depositCount uint32) (uint32, error) { + ret := _m.Called(networkID, depositCount) + + if len(ret) == 0 { + panic("no return value specified for L1InfoTreeIndexForBridge") + } + + var r0 uint32 + var r1 error + if rf, ok := ret.Get(0).(func(uint32, uint32) (uint32, error)); ok { + return rf(networkID, depositCount) + } + if rf, ok := ret.Get(0).(func(uint32, uint32) uint32); ok { + r0 = rf(networkID, depositCount) + } else { + r0 = ret.Get(0).(uint32) + } + + if rf, ok := ret.Get(1).(func(uint32, uint32) error); ok { + r1 = rf(networkID, depositCount) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// BridgeClientInterface_L1InfoTreeIndexForBridge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'L1InfoTreeIndexForBridge' +type BridgeClientInterface_L1InfoTreeIndexForBridge_Call struct { + *mock.Call +} + +// L1InfoTreeIndexForBridge is a helper method to define mock.On call +// - networkID uint32 +// - depositCount uint32 +func (_e *BridgeClientInterface_Expecter) L1InfoTreeIndexForBridge(networkID interface{}, depositCount interface{}) *BridgeClientInterface_L1InfoTreeIndexForBridge_Call { + return &BridgeClientInterface_L1InfoTreeIndexForBridge_Call{Call: _e.mock.On("L1InfoTreeIndexForBridge", networkID, depositCount)} +} + +func (_c *BridgeClientInterface_L1InfoTreeIndexForBridge_Call) Run(run func(networkID uint32, depositCount uint32)) *BridgeClientInterface_L1InfoTreeIndexForBridge_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32), args[1].(uint32)) + }) + return _c +} + +func (_c *BridgeClientInterface_L1InfoTreeIndexForBridge_Call) Return(_a0 uint32, _a1 error) *BridgeClientInterface_L1InfoTreeIndexForBridge_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *BridgeClientInterface_L1InfoTreeIndexForBridge_Call) RunAndReturn(run func(uint32, uint32) (uint32, error)) *BridgeClientInterface_L1InfoTreeIndexForBridge_Call { + _c.Call.Return(run) + return _c +} + +// SponsorClaim provides a mock function with given fields: claim +func (_m *BridgeClientInterface) SponsorClaim(claim claimsponsor.Claim) error { + ret := _m.Called(claim) + + if len(ret) == 0 { + panic("no return value specified for SponsorClaim") + } + + var r0 error + if rf, ok := ret.Get(0).(func(claimsponsor.Claim) error); ok { + r0 = rf(claim) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// BridgeClientInterface_SponsorClaim_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SponsorClaim' +type BridgeClientInterface_SponsorClaim_Call struct { + *mock.Call +} + +// SponsorClaim is a helper method to define mock.On call +// - claim claimsponsor.Claim +func (_e *BridgeClientInterface_Expecter) SponsorClaim(claim interface{}) *BridgeClientInterface_SponsorClaim_Call { + return &BridgeClientInterface_SponsorClaim_Call{Call: _e.mock.On("SponsorClaim", claim)} +} + +func (_c *BridgeClientInterface_SponsorClaim_Call) Run(run func(claim claimsponsor.Claim)) *BridgeClientInterface_SponsorClaim_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(claimsponsor.Claim)) + }) + return _c +} + +func (_c *BridgeClientInterface_SponsorClaim_Call) Return(_a0 error) *BridgeClientInterface_SponsorClaim_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *BridgeClientInterface_SponsorClaim_Call) RunAndReturn(run func(claimsponsor.Claim) error) *BridgeClientInterface_SponsorClaim_Call { + _c.Call.Return(run) + return _c +} + +// NewBridgeClientInterface creates a new instance of BridgeClientInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewBridgeClientInterface(t interface { + mock.TestingT + Cleanup(func()) +}) *BridgeClientInterface { + mock := &BridgeClientInterface{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/rpc/mocks/bridger.go b/rpc/mocks/bridger.go new file mode 100644 index 00000000..44c8ab1f --- /dev/null +++ b/rpc/mocks/bridger.go @@ -0,0 +1,159 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + types "github.com/agglayer/aggkit/tree/types" +) + +// Bridger is an autogenerated mock type for the Bridger type +type Bridger struct { + mock.Mock +} + +type Bridger_Expecter struct { + mock *mock.Mock +} + +func (_m *Bridger) EXPECT() *Bridger_Expecter { + return &Bridger_Expecter{mock: &_m.Mock} +} + +// GetProof provides a mock function with given fields: ctx, depositCount, localExitRoot +func (_m *Bridger) GetProof(ctx context.Context, depositCount uint32, localExitRoot common.Hash) (types.Proof, error) { + ret := _m.Called(ctx, depositCount, localExitRoot) + + if len(ret) == 0 { + panic("no return value specified for GetProof") + } + + var r0 types.Proof + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32, common.Hash) (types.Proof, error)); ok { + return rf(ctx, depositCount, localExitRoot) + } + if rf, ok := ret.Get(0).(func(context.Context, uint32, common.Hash) types.Proof); ok { + r0 = rf(ctx, depositCount, localExitRoot) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(types.Proof) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint32, common.Hash) error); ok { + r1 = rf(ctx, depositCount, localExitRoot) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Bridger_GetProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetProof' +type Bridger_GetProof_Call struct { + *mock.Call +} + +// GetProof is a helper method to define mock.On call +// - ctx context.Context +// - depositCount uint32 +// - localExitRoot common.Hash +func (_e *Bridger_Expecter) GetProof(ctx interface{}, depositCount interface{}, localExitRoot interface{}) *Bridger_GetProof_Call { + return &Bridger_GetProof_Call{Call: _e.mock.On("GetProof", ctx, depositCount, localExitRoot)} +} + +func (_c *Bridger_GetProof_Call) Run(run func(ctx context.Context, depositCount uint32, localExitRoot common.Hash)) *Bridger_GetProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint32), args[2].(common.Hash)) + }) + return _c +} + +func (_c *Bridger_GetProof_Call) Return(_a0 types.Proof, _a1 error) *Bridger_GetProof_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *Bridger_GetProof_Call) RunAndReturn(run func(context.Context, uint32, common.Hash) (types.Proof, error)) *Bridger_GetProof_Call { + _c.Call.Return(run) + return _c +} + +// GetRootByLER provides a mock function with given fields: ctx, ler +func (_m *Bridger) GetRootByLER(ctx context.Context, ler common.Hash) (*types.Root, error) { + ret := _m.Called(ctx, ler) + + if len(ret) == 0 { + panic("no return value specified for GetRootByLER") + } + + var r0 *types.Root + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Root, error)); ok { + return rf(ctx, ler) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Root); ok { + r0 = rf(ctx, ler) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Root) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, ler) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Bridger_GetRootByLER_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRootByLER' +type Bridger_GetRootByLER_Call struct { + *mock.Call +} + +// GetRootByLER is a helper method to define mock.On call +// - ctx context.Context +// - ler common.Hash +func (_e *Bridger_Expecter) GetRootByLER(ctx interface{}, ler interface{}) *Bridger_GetRootByLER_Call { + return &Bridger_GetRootByLER_Call{Call: _e.mock.On("GetRootByLER", ctx, ler)} +} + +func (_c *Bridger_GetRootByLER_Call) Run(run func(ctx context.Context, ler common.Hash)) *Bridger_GetRootByLER_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *Bridger_GetRootByLER_Call) Return(_a0 *types.Root, _a1 error) *Bridger_GetRootByLER_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *Bridger_GetRootByLER_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Root, error)) *Bridger_GetRootByLER_Call { + _c.Call.Return(run) + return _c +} + +// NewBridger creates a new instance of Bridger. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewBridger(t interface { + mock.TestingT + Cleanup(func()) +}) *Bridger { + mock := &Bridger{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/rpc/mocks/claim_sponsorer.go b/rpc/mocks/claim_sponsorer.go new file mode 100644 index 00000000..633d1321 --- /dev/null +++ b/rpc/mocks/claim_sponsorer.go @@ -0,0 +1,141 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + claimsponsor "github.com/agglayer/aggkit/claimsponsor" + mock "github.com/stretchr/testify/mock" +) + +// ClaimSponsorer is an autogenerated mock type for the ClaimSponsorer type +type ClaimSponsorer struct { + mock.Mock +} + +type ClaimSponsorer_Expecter struct { + mock *mock.Mock +} + +func (_m *ClaimSponsorer) EXPECT() *ClaimSponsorer_Expecter { + return &ClaimSponsorer_Expecter{mock: &_m.Mock} +} + +// AddClaimToQueue provides a mock function with given fields: claim +func (_m *ClaimSponsorer) AddClaimToQueue(claim *claimsponsor.Claim) error { + ret := _m.Called(claim) + + if len(ret) == 0 { + panic("no return value specified for AddClaimToQueue") + } + + var r0 error + if rf, ok := ret.Get(0).(func(*claimsponsor.Claim) error); ok { + r0 = rf(claim) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ClaimSponsorer_AddClaimToQueue_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddClaimToQueue' +type ClaimSponsorer_AddClaimToQueue_Call struct { + *mock.Call +} + +// AddClaimToQueue is a helper method to define mock.On call +// - claim *claimsponsor.Claim +func (_e *ClaimSponsorer_Expecter) AddClaimToQueue(claim interface{}) *ClaimSponsorer_AddClaimToQueue_Call { + return &ClaimSponsorer_AddClaimToQueue_Call{Call: _e.mock.On("AddClaimToQueue", claim)} +} + +func (_c *ClaimSponsorer_AddClaimToQueue_Call) Run(run func(claim *claimsponsor.Claim)) *ClaimSponsorer_AddClaimToQueue_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*claimsponsor.Claim)) + }) + return _c +} + +func (_c *ClaimSponsorer_AddClaimToQueue_Call) Return(_a0 error) *ClaimSponsorer_AddClaimToQueue_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClaimSponsorer_AddClaimToQueue_Call) RunAndReturn(run func(*claimsponsor.Claim) error) *ClaimSponsorer_AddClaimToQueue_Call { + _c.Call.Return(run) + return _c +} + +// GetClaim provides a mock function with given fields: globalIndex +func (_m *ClaimSponsorer) GetClaim(globalIndex *big.Int) (*claimsponsor.Claim, error) { + ret := _m.Called(globalIndex) + + if len(ret) == 0 { + panic("no return value specified for GetClaim") + } + + var r0 *claimsponsor.Claim + var r1 error + if rf, ok := ret.Get(0).(func(*big.Int) (*claimsponsor.Claim, error)); ok { + return rf(globalIndex) + } + if rf, ok := ret.Get(0).(func(*big.Int) *claimsponsor.Claim); ok { + r0 = rf(globalIndex) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*claimsponsor.Claim) + } + } + + if rf, ok := ret.Get(1).(func(*big.Int) error); ok { + r1 = rf(globalIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClaimSponsorer_GetClaim_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetClaim' +type ClaimSponsorer_GetClaim_Call struct { + *mock.Call +} + +// GetClaim is a helper method to define mock.On call +// - globalIndex *big.Int +func (_e *ClaimSponsorer_Expecter) GetClaim(globalIndex interface{}) *ClaimSponsorer_GetClaim_Call { + return &ClaimSponsorer_GetClaim_Call{Call: _e.mock.On("GetClaim", globalIndex)} +} + +func (_c *ClaimSponsorer_GetClaim_Call) Run(run func(globalIndex *big.Int)) *ClaimSponsorer_GetClaim_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*big.Int)) + }) + return _c +} + +func (_c *ClaimSponsorer_GetClaim_Call) Return(_a0 *claimsponsor.Claim, _a1 error) *ClaimSponsorer_GetClaim_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClaimSponsorer_GetClaim_Call) RunAndReturn(run func(*big.Int) (*claimsponsor.Claim, error)) *ClaimSponsorer_GetClaim_Call { + _c.Call.Return(run) + return _c +} + +// NewClaimSponsorer creates a new instance of ClaimSponsorer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewClaimSponsorer(t interface { + mock.TestingT + Cleanup(func()) +}) *ClaimSponsorer { + mock := &ClaimSponsorer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/rpc/mocks/client_factory_interface.go b/rpc/mocks/client_factory_interface.go new file mode 100644 index 00000000..2a54ac7e --- /dev/null +++ b/rpc/mocks/client_factory_interface.go @@ -0,0 +1,83 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + rpc "github.com/agglayer/aggkit/rpc/client" + mock "github.com/stretchr/testify/mock" +) + +// ClientFactoryInterface is an autogenerated mock type for the ClientFactoryInterface type +type ClientFactoryInterface struct { + mock.Mock +} + +type ClientFactoryInterface_Expecter struct { + mock *mock.Mock +} + +func (_m *ClientFactoryInterface) EXPECT() *ClientFactoryInterface_Expecter { + return &ClientFactoryInterface_Expecter{mock: &_m.Mock} +} + +// NewClient provides a mock function with given fields: url +func (_m *ClientFactoryInterface) NewClient(url string) rpc.ClientInterface { + ret := _m.Called(url) + + if len(ret) == 0 { + panic("no return value specified for NewClient") + } + + var r0 rpc.ClientInterface + if rf, ok := ret.Get(0).(func(string) rpc.ClientInterface); ok { + r0 = rf(url) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(rpc.ClientInterface) + } + } + + return r0 +} + +// ClientFactoryInterface_NewClient_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewClient' +type ClientFactoryInterface_NewClient_Call struct { + *mock.Call +} + +// NewClient is a helper method to define mock.On call +// - url string +func (_e *ClientFactoryInterface_Expecter) NewClient(url interface{}) *ClientFactoryInterface_NewClient_Call { + return &ClientFactoryInterface_NewClient_Call{Call: _e.mock.On("NewClient", url)} +} + +func (_c *ClientFactoryInterface_NewClient_Call) Run(run func(url string)) *ClientFactoryInterface_NewClient_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *ClientFactoryInterface_NewClient_Call) Return(_a0 rpc.ClientInterface) *ClientFactoryInterface_NewClient_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientFactoryInterface_NewClient_Call) RunAndReturn(run func(string) rpc.ClientInterface) *ClientFactoryInterface_NewClient_Call { + _c.Call.Return(run) + return _c +} + +// NewClientFactoryInterface creates a new instance of ClientFactoryInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewClientFactoryInterface(t interface { + mock.TestingT + Cleanup(func()) +}) *ClientFactoryInterface { + mock := &ClientFactoryInterface{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/rpc/mocks/client_interface.go b/rpc/mocks/client_interface.go new file mode 100644 index 00000000..32be99fc --- /dev/null +++ b/rpc/mocks/client_interface.go @@ -0,0 +1,319 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + claimsponsor "github.com/agglayer/aggkit/claimsponsor" + l1infotreesync "github.com/agglayer/aggkit/l1infotreesync" + + mock "github.com/stretchr/testify/mock" + + types "github.com/agglayer/aggkit/rpc/types" +) + +// ClientInterface is an autogenerated mock type for the ClientInterface type +type ClientInterface struct { + mock.Mock +} + +type ClientInterface_Expecter struct { + mock *mock.Mock +} + +func (_m *ClientInterface) EXPECT() *ClientInterface_Expecter { + return &ClientInterface_Expecter{mock: &_m.Mock} +} + +// ClaimProof provides a mock function with given fields: networkID, depositCount, l1InfoTreeIndex +func (_m *ClientInterface) ClaimProof(networkID uint32, depositCount uint32, l1InfoTreeIndex uint32) (*types.ClaimProof, error) { + ret := _m.Called(networkID, depositCount, l1InfoTreeIndex) + + if len(ret) == 0 { + panic("no return value specified for ClaimProof") + } + + var r0 *types.ClaimProof + var r1 error + if rf, ok := ret.Get(0).(func(uint32, uint32, uint32) (*types.ClaimProof, error)); ok { + return rf(networkID, depositCount, l1InfoTreeIndex) + } + if rf, ok := ret.Get(0).(func(uint32, uint32, uint32) *types.ClaimProof); ok { + r0 = rf(networkID, depositCount, l1InfoTreeIndex) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.ClaimProof) + } + } + + if rf, ok := ret.Get(1).(func(uint32, uint32, uint32) error); ok { + r1 = rf(networkID, depositCount, l1InfoTreeIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientInterface_ClaimProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ClaimProof' +type ClientInterface_ClaimProof_Call struct { + *mock.Call +} + +// ClaimProof is a helper method to define mock.On call +// - networkID uint32 +// - depositCount uint32 +// - l1InfoTreeIndex uint32 +func (_e *ClientInterface_Expecter) ClaimProof(networkID interface{}, depositCount interface{}, l1InfoTreeIndex interface{}) *ClientInterface_ClaimProof_Call { + return &ClientInterface_ClaimProof_Call{Call: _e.mock.On("ClaimProof", networkID, depositCount, l1InfoTreeIndex)} +} + +func (_c *ClientInterface_ClaimProof_Call) Run(run func(networkID uint32, depositCount uint32, l1InfoTreeIndex uint32)) *ClientInterface_ClaimProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32), args[1].(uint32), args[2].(uint32)) + }) + return _c +} + +func (_c *ClientInterface_ClaimProof_Call) Return(_a0 *types.ClaimProof, _a1 error) *ClientInterface_ClaimProof_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientInterface_ClaimProof_Call) RunAndReturn(run func(uint32, uint32, uint32) (*types.ClaimProof, error)) *ClientInterface_ClaimProof_Call { + _c.Call.Return(run) + return _c +} + +// GetSponsoredClaimStatus provides a mock function with given fields: globalIndex +func (_m *ClientInterface) GetSponsoredClaimStatus(globalIndex *big.Int) (claimsponsor.ClaimStatus, error) { + ret := _m.Called(globalIndex) + + if len(ret) == 0 { + panic("no return value specified for GetSponsoredClaimStatus") + } + + var r0 claimsponsor.ClaimStatus + var r1 error + if rf, ok := ret.Get(0).(func(*big.Int) (claimsponsor.ClaimStatus, error)); ok { + return rf(globalIndex) + } + if rf, ok := ret.Get(0).(func(*big.Int) claimsponsor.ClaimStatus); ok { + r0 = rf(globalIndex) + } else { + r0 = ret.Get(0).(claimsponsor.ClaimStatus) + } + + if rf, ok := ret.Get(1).(func(*big.Int) error); ok { + r1 = rf(globalIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientInterface_GetSponsoredClaimStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetSponsoredClaimStatus' +type ClientInterface_GetSponsoredClaimStatus_Call struct { + *mock.Call +} + +// GetSponsoredClaimStatus is a helper method to define mock.On call +// - globalIndex *big.Int +func (_e *ClientInterface_Expecter) GetSponsoredClaimStatus(globalIndex interface{}) *ClientInterface_GetSponsoredClaimStatus_Call { + return &ClientInterface_GetSponsoredClaimStatus_Call{Call: _e.mock.On("GetSponsoredClaimStatus", globalIndex)} +} + +func (_c *ClientInterface_GetSponsoredClaimStatus_Call) Run(run func(globalIndex *big.Int)) *ClientInterface_GetSponsoredClaimStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*big.Int)) + }) + return _c +} + +func (_c *ClientInterface_GetSponsoredClaimStatus_Call) Return(_a0 claimsponsor.ClaimStatus, _a1 error) *ClientInterface_GetSponsoredClaimStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientInterface_GetSponsoredClaimStatus_Call) RunAndReturn(run func(*big.Int) (claimsponsor.ClaimStatus, error)) *ClientInterface_GetSponsoredClaimStatus_Call { + _c.Call.Return(run) + return _c +} + +// InjectedInfoAfterIndex provides a mock function with given fields: networkID, l1InfoTreeIndex +func (_m *ClientInterface) InjectedInfoAfterIndex(networkID uint32, l1InfoTreeIndex uint32) (*l1infotreesync.L1InfoTreeLeaf, error) { + ret := _m.Called(networkID, l1InfoTreeIndex) + + if len(ret) == 0 { + panic("no return value specified for InjectedInfoAfterIndex") + } + + var r0 *l1infotreesync.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func(uint32, uint32) (*l1infotreesync.L1InfoTreeLeaf, error)); ok { + return rf(networkID, l1InfoTreeIndex) + } + if rf, ok := ret.Get(0).(func(uint32, uint32) *l1infotreesync.L1InfoTreeLeaf); ok { + r0 = rf(networkID, l1InfoTreeIndex) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func(uint32, uint32) error); ok { + r1 = rf(networkID, l1InfoTreeIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientInterface_InjectedInfoAfterIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'InjectedInfoAfterIndex' +type ClientInterface_InjectedInfoAfterIndex_Call struct { + *mock.Call +} + +// InjectedInfoAfterIndex is a helper method to define mock.On call +// - networkID uint32 +// - l1InfoTreeIndex uint32 +func (_e *ClientInterface_Expecter) InjectedInfoAfterIndex(networkID interface{}, l1InfoTreeIndex interface{}) *ClientInterface_InjectedInfoAfterIndex_Call { + return &ClientInterface_InjectedInfoAfterIndex_Call{Call: _e.mock.On("InjectedInfoAfterIndex", networkID, l1InfoTreeIndex)} +} + +func (_c *ClientInterface_InjectedInfoAfterIndex_Call) Run(run func(networkID uint32, l1InfoTreeIndex uint32)) *ClientInterface_InjectedInfoAfterIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32), args[1].(uint32)) + }) + return _c +} + +func (_c *ClientInterface_InjectedInfoAfterIndex_Call) Return(_a0 *l1infotreesync.L1InfoTreeLeaf, _a1 error) *ClientInterface_InjectedInfoAfterIndex_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientInterface_InjectedInfoAfterIndex_Call) RunAndReturn(run func(uint32, uint32) (*l1infotreesync.L1InfoTreeLeaf, error)) *ClientInterface_InjectedInfoAfterIndex_Call { + _c.Call.Return(run) + return _c +} + +// L1InfoTreeIndexForBridge provides a mock function with given fields: networkID, depositCount +func (_m *ClientInterface) L1InfoTreeIndexForBridge(networkID uint32, depositCount uint32) (uint32, error) { + ret := _m.Called(networkID, depositCount) + + if len(ret) == 0 { + panic("no return value specified for L1InfoTreeIndexForBridge") + } + + var r0 uint32 + var r1 error + if rf, ok := ret.Get(0).(func(uint32, uint32) (uint32, error)); ok { + return rf(networkID, depositCount) + } + if rf, ok := ret.Get(0).(func(uint32, uint32) uint32); ok { + r0 = rf(networkID, depositCount) + } else { + r0 = ret.Get(0).(uint32) + } + + if rf, ok := ret.Get(1).(func(uint32, uint32) error); ok { + r1 = rf(networkID, depositCount) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ClientInterface_L1InfoTreeIndexForBridge_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'L1InfoTreeIndexForBridge' +type ClientInterface_L1InfoTreeIndexForBridge_Call struct { + *mock.Call +} + +// L1InfoTreeIndexForBridge is a helper method to define mock.On call +// - networkID uint32 +// - depositCount uint32 +func (_e *ClientInterface_Expecter) L1InfoTreeIndexForBridge(networkID interface{}, depositCount interface{}) *ClientInterface_L1InfoTreeIndexForBridge_Call { + return &ClientInterface_L1InfoTreeIndexForBridge_Call{Call: _e.mock.On("L1InfoTreeIndexForBridge", networkID, depositCount)} +} + +func (_c *ClientInterface_L1InfoTreeIndexForBridge_Call) Run(run func(networkID uint32, depositCount uint32)) *ClientInterface_L1InfoTreeIndexForBridge_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32), args[1].(uint32)) + }) + return _c +} + +func (_c *ClientInterface_L1InfoTreeIndexForBridge_Call) Return(_a0 uint32, _a1 error) *ClientInterface_L1InfoTreeIndexForBridge_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ClientInterface_L1InfoTreeIndexForBridge_Call) RunAndReturn(run func(uint32, uint32) (uint32, error)) *ClientInterface_L1InfoTreeIndexForBridge_Call { + _c.Call.Return(run) + return _c +} + +// SponsorClaim provides a mock function with given fields: claim +func (_m *ClientInterface) SponsorClaim(claim claimsponsor.Claim) error { + ret := _m.Called(claim) + + if len(ret) == 0 { + panic("no return value specified for SponsorClaim") + } + + var r0 error + if rf, ok := ret.Get(0).(func(claimsponsor.Claim) error); ok { + r0 = rf(claim) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ClientInterface_SponsorClaim_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SponsorClaim' +type ClientInterface_SponsorClaim_Call struct { + *mock.Call +} + +// SponsorClaim is a helper method to define mock.On call +// - claim claimsponsor.Claim +func (_e *ClientInterface_Expecter) SponsorClaim(claim interface{}) *ClientInterface_SponsorClaim_Call { + return &ClientInterface_SponsorClaim_Call{Call: _e.mock.On("SponsorClaim", claim)} +} + +func (_c *ClientInterface_SponsorClaim_Call) Run(run func(claim claimsponsor.Claim)) *ClientInterface_SponsorClaim_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(claimsponsor.Claim)) + }) + return _c +} + +func (_c *ClientInterface_SponsorClaim_Call) Return(_a0 error) *ClientInterface_SponsorClaim_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ClientInterface_SponsorClaim_Call) RunAndReturn(run func(claimsponsor.Claim) error) *ClientInterface_SponsorClaim_Call { + _c.Call.Return(run) + return _c +} + +// NewClientInterface creates a new instance of ClientInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewClientInterface(t interface { + mock.TestingT + Cleanup(func()) +}) *ClientInterface { + mock := &ClientInterface{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/rpc/mocks/l1_info_treer.go b/rpc/mocks/l1_info_treer.go new file mode 100644 index 00000000..e7441155 --- /dev/null +++ b/rpc/mocks/l1_info_treer.go @@ -0,0 +1,626 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + l1infotreesync "github.com/agglayer/aggkit/l1infotreesync" + + mock "github.com/stretchr/testify/mock" + + types "github.com/agglayer/aggkit/tree/types" +) + +// L1InfoTreer is an autogenerated mock type for the L1InfoTreer type +type L1InfoTreer struct { + mock.Mock +} + +type L1InfoTreer_Expecter struct { + mock *mock.Mock +} + +func (_m *L1InfoTreer) EXPECT() *L1InfoTreer_Expecter { + return &L1InfoTreer_Expecter{mock: &_m.Mock} +} + +// GetFirstInfo provides a mock function with given fields: +func (_m *L1InfoTreer) GetFirstInfo() (*l1infotreesync.L1InfoTreeLeaf, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetFirstInfo") + } + + var r0 *l1infotreesync.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func() (*l1infotreesync.L1InfoTreeLeaf, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *l1infotreesync.L1InfoTreeLeaf); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetFirstInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFirstInfo' +type L1InfoTreer_GetFirstInfo_Call struct { + *mock.Call +} + +// GetFirstInfo is a helper method to define mock.On call +func (_e *L1InfoTreer_Expecter) GetFirstInfo() *L1InfoTreer_GetFirstInfo_Call { + return &L1InfoTreer_GetFirstInfo_Call{Call: _e.mock.On("GetFirstInfo")} +} + +func (_c *L1InfoTreer_GetFirstInfo_Call) Run(run func()) *L1InfoTreer_GetFirstInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *L1InfoTreer_GetFirstInfo_Call) Return(_a0 *l1infotreesync.L1InfoTreeLeaf, _a1 error) *L1InfoTreer_GetFirstInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetFirstInfo_Call) RunAndReturn(run func() (*l1infotreesync.L1InfoTreeLeaf, error)) *L1InfoTreer_GetFirstInfo_Call { + _c.Call.Return(run) + return _c +} + +// GetFirstInfoAfterBlock provides a mock function with given fields: blockNum +func (_m *L1InfoTreer) GetFirstInfoAfterBlock(blockNum uint64) (*l1infotreesync.L1InfoTreeLeaf, error) { + ret := _m.Called(blockNum) + + if len(ret) == 0 { + panic("no return value specified for GetFirstInfoAfterBlock") + } + + var r0 *l1infotreesync.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func(uint64) (*l1infotreesync.L1InfoTreeLeaf, error)); ok { + return rf(blockNum) + } + if rf, ok := ret.Get(0).(func(uint64) *l1infotreesync.L1InfoTreeLeaf); ok { + r0 = rf(blockNum) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(blockNum) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetFirstInfoAfterBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFirstInfoAfterBlock' +type L1InfoTreer_GetFirstInfoAfterBlock_Call struct { + *mock.Call +} + +// GetFirstInfoAfterBlock is a helper method to define mock.On call +// - blockNum uint64 +func (_e *L1InfoTreer_Expecter) GetFirstInfoAfterBlock(blockNum interface{}) *L1InfoTreer_GetFirstInfoAfterBlock_Call { + return &L1InfoTreer_GetFirstInfoAfterBlock_Call{Call: _e.mock.On("GetFirstInfoAfterBlock", blockNum)} +} + +func (_c *L1InfoTreer_GetFirstInfoAfterBlock_Call) Run(run func(blockNum uint64)) *L1InfoTreer_GetFirstInfoAfterBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *L1InfoTreer_GetFirstInfoAfterBlock_Call) Return(_a0 *l1infotreesync.L1InfoTreeLeaf, _a1 error) *L1InfoTreer_GetFirstInfoAfterBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetFirstInfoAfterBlock_Call) RunAndReturn(run func(uint64) (*l1infotreesync.L1InfoTreeLeaf, error)) *L1InfoTreer_GetFirstInfoAfterBlock_Call { + _c.Call.Return(run) + return _c +} + +// GetFirstL1InfoWithRollupExitRoot provides a mock function with given fields: rollupExitRoot +func (_m *L1InfoTreer) GetFirstL1InfoWithRollupExitRoot(rollupExitRoot common.Hash) (*l1infotreesync.L1InfoTreeLeaf, error) { + ret := _m.Called(rollupExitRoot) + + if len(ret) == 0 { + panic("no return value specified for GetFirstL1InfoWithRollupExitRoot") + } + + var r0 *l1infotreesync.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func(common.Hash) (*l1infotreesync.L1InfoTreeLeaf, error)); ok { + return rf(rollupExitRoot) + } + if rf, ok := ret.Get(0).(func(common.Hash) *l1infotreesync.L1InfoTreeLeaf); ok { + r0 = rf(rollupExitRoot) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func(common.Hash) error); ok { + r1 = rf(rollupExitRoot) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFirstL1InfoWithRollupExitRoot' +type L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call struct { + *mock.Call +} + +// GetFirstL1InfoWithRollupExitRoot is a helper method to define mock.On call +// - rollupExitRoot common.Hash +func (_e *L1InfoTreer_Expecter) GetFirstL1InfoWithRollupExitRoot(rollupExitRoot interface{}) *L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call { + return &L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call{Call: _e.mock.On("GetFirstL1InfoWithRollupExitRoot", rollupExitRoot)} +} + +func (_c *L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call) Run(run func(rollupExitRoot common.Hash)) *L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(common.Hash)) + }) + return _c +} + +func (_c *L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call) Return(_a0 *l1infotreesync.L1InfoTreeLeaf, _a1 error) *L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call) RunAndReturn(run func(common.Hash) (*l1infotreesync.L1InfoTreeLeaf, error)) *L1InfoTreer_GetFirstL1InfoWithRollupExitRoot_Call { + _c.Call.Return(run) + return _c +} + +// GetFirstVerifiedBatches provides a mock function with given fields: rollupID +func (_m *L1InfoTreer) GetFirstVerifiedBatches(rollupID uint32) (*l1infotreesync.VerifyBatches, error) { + ret := _m.Called(rollupID) + + if len(ret) == 0 { + panic("no return value specified for GetFirstVerifiedBatches") + } + + var r0 *l1infotreesync.VerifyBatches + var r1 error + if rf, ok := ret.Get(0).(func(uint32) (*l1infotreesync.VerifyBatches, error)); ok { + return rf(rollupID) + } + if rf, ok := ret.Get(0).(func(uint32) *l1infotreesync.VerifyBatches); ok { + r0 = rf(rollupID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.VerifyBatches) + } + } + + if rf, ok := ret.Get(1).(func(uint32) error); ok { + r1 = rf(rollupID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetFirstVerifiedBatches_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFirstVerifiedBatches' +type L1InfoTreer_GetFirstVerifiedBatches_Call struct { + *mock.Call +} + +// GetFirstVerifiedBatches is a helper method to define mock.On call +// - rollupID uint32 +func (_e *L1InfoTreer_Expecter) GetFirstVerifiedBatches(rollupID interface{}) *L1InfoTreer_GetFirstVerifiedBatches_Call { + return &L1InfoTreer_GetFirstVerifiedBatches_Call{Call: _e.mock.On("GetFirstVerifiedBatches", rollupID)} +} + +func (_c *L1InfoTreer_GetFirstVerifiedBatches_Call) Run(run func(rollupID uint32)) *L1InfoTreer_GetFirstVerifiedBatches_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32)) + }) + return _c +} + +func (_c *L1InfoTreer_GetFirstVerifiedBatches_Call) Return(_a0 *l1infotreesync.VerifyBatches, _a1 error) *L1InfoTreer_GetFirstVerifiedBatches_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetFirstVerifiedBatches_Call) RunAndReturn(run func(uint32) (*l1infotreesync.VerifyBatches, error)) *L1InfoTreer_GetFirstVerifiedBatches_Call { + _c.Call.Return(run) + return _c +} + +// GetFirstVerifiedBatchesAfterBlock provides a mock function with given fields: rollupID, blockNum +func (_m *L1InfoTreer) GetFirstVerifiedBatchesAfterBlock(rollupID uint32, blockNum uint64) (*l1infotreesync.VerifyBatches, error) { + ret := _m.Called(rollupID, blockNum) + + if len(ret) == 0 { + panic("no return value specified for GetFirstVerifiedBatchesAfterBlock") + } + + var r0 *l1infotreesync.VerifyBatches + var r1 error + if rf, ok := ret.Get(0).(func(uint32, uint64) (*l1infotreesync.VerifyBatches, error)); ok { + return rf(rollupID, blockNum) + } + if rf, ok := ret.Get(0).(func(uint32, uint64) *l1infotreesync.VerifyBatches); ok { + r0 = rf(rollupID, blockNum) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.VerifyBatches) + } + } + + if rf, ok := ret.Get(1).(func(uint32, uint64) error); ok { + r1 = rf(rollupID, blockNum) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFirstVerifiedBatchesAfterBlock' +type L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call struct { + *mock.Call +} + +// GetFirstVerifiedBatchesAfterBlock is a helper method to define mock.On call +// - rollupID uint32 +// - blockNum uint64 +func (_e *L1InfoTreer_Expecter) GetFirstVerifiedBatchesAfterBlock(rollupID interface{}, blockNum interface{}) *L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call { + return &L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call{Call: _e.mock.On("GetFirstVerifiedBatchesAfterBlock", rollupID, blockNum)} +} + +func (_c *L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call) Run(run func(rollupID uint32, blockNum uint64)) *L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32), args[1].(uint64)) + }) + return _c +} + +func (_c *L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call) Return(_a0 *l1infotreesync.VerifyBatches, _a1 error) *L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call) RunAndReturn(run func(uint32, uint64) (*l1infotreesync.VerifyBatches, error)) *L1InfoTreer_GetFirstVerifiedBatchesAfterBlock_Call { + _c.Call.Return(run) + return _c +} + +// GetInfoByIndex provides a mock function with given fields: ctx, index +func (_m *L1InfoTreer) GetInfoByIndex(ctx context.Context, index uint32) (*l1infotreesync.L1InfoTreeLeaf, error) { + ret := _m.Called(ctx, index) + + if len(ret) == 0 { + panic("no return value specified for GetInfoByIndex") + } + + var r0 *l1infotreesync.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32) (*l1infotreesync.L1InfoTreeLeaf, error)); ok { + return rf(ctx, index) + } + if rf, ok := ret.Get(0).(func(context.Context, uint32) *l1infotreesync.L1InfoTreeLeaf); ok { + r0 = rf(ctx, index) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint32) error); ok { + r1 = rf(ctx, index) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetInfoByIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetInfoByIndex' +type L1InfoTreer_GetInfoByIndex_Call struct { + *mock.Call +} + +// GetInfoByIndex is a helper method to define mock.On call +// - ctx context.Context +// - index uint32 +func (_e *L1InfoTreer_Expecter) GetInfoByIndex(ctx interface{}, index interface{}) *L1InfoTreer_GetInfoByIndex_Call { + return &L1InfoTreer_GetInfoByIndex_Call{Call: _e.mock.On("GetInfoByIndex", ctx, index)} +} + +func (_c *L1InfoTreer_GetInfoByIndex_Call) Run(run func(ctx context.Context, index uint32)) *L1InfoTreer_GetInfoByIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint32)) + }) + return _c +} + +func (_c *L1InfoTreer_GetInfoByIndex_Call) Return(_a0 *l1infotreesync.L1InfoTreeLeaf, _a1 error) *L1InfoTreer_GetInfoByIndex_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetInfoByIndex_Call) RunAndReturn(run func(context.Context, uint32) (*l1infotreesync.L1InfoTreeLeaf, error)) *L1InfoTreer_GetInfoByIndex_Call { + _c.Call.Return(run) + return _c +} + +// GetLastInfo provides a mock function with given fields: +func (_m *L1InfoTreer) GetLastInfo() (*l1infotreesync.L1InfoTreeLeaf, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetLastInfo") + } + + var r0 *l1infotreesync.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func() (*l1infotreesync.L1InfoTreeLeaf, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() *l1infotreesync.L1InfoTreeLeaf); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetLastInfo_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLastInfo' +type L1InfoTreer_GetLastInfo_Call struct { + *mock.Call +} + +// GetLastInfo is a helper method to define mock.On call +func (_e *L1InfoTreer_Expecter) GetLastInfo() *L1InfoTreer_GetLastInfo_Call { + return &L1InfoTreer_GetLastInfo_Call{Call: _e.mock.On("GetLastInfo")} +} + +func (_c *L1InfoTreer_GetLastInfo_Call) Run(run func()) *L1InfoTreer_GetLastInfo_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *L1InfoTreer_GetLastInfo_Call) Return(_a0 *l1infotreesync.L1InfoTreeLeaf, _a1 error) *L1InfoTreer_GetLastInfo_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetLastInfo_Call) RunAndReturn(run func() (*l1infotreesync.L1InfoTreeLeaf, error)) *L1InfoTreer_GetLastInfo_Call { + _c.Call.Return(run) + return _c +} + +// GetLastVerifiedBatches provides a mock function with given fields: rollupID +func (_m *L1InfoTreer) GetLastVerifiedBatches(rollupID uint32) (*l1infotreesync.VerifyBatches, error) { + ret := _m.Called(rollupID) + + if len(ret) == 0 { + panic("no return value specified for GetLastVerifiedBatches") + } + + var r0 *l1infotreesync.VerifyBatches + var r1 error + if rf, ok := ret.Get(0).(func(uint32) (*l1infotreesync.VerifyBatches, error)); ok { + return rf(rollupID) + } + if rf, ok := ret.Get(0).(func(uint32) *l1infotreesync.VerifyBatches); ok { + r0 = rf(rollupID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.VerifyBatches) + } + } + + if rf, ok := ret.Get(1).(func(uint32) error); ok { + r1 = rf(rollupID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetLastVerifiedBatches_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLastVerifiedBatches' +type L1InfoTreer_GetLastVerifiedBatches_Call struct { + *mock.Call +} + +// GetLastVerifiedBatches is a helper method to define mock.On call +// - rollupID uint32 +func (_e *L1InfoTreer_Expecter) GetLastVerifiedBatches(rollupID interface{}) *L1InfoTreer_GetLastVerifiedBatches_Call { + return &L1InfoTreer_GetLastVerifiedBatches_Call{Call: _e.mock.On("GetLastVerifiedBatches", rollupID)} +} + +func (_c *L1InfoTreer_GetLastVerifiedBatches_Call) Run(run func(rollupID uint32)) *L1InfoTreer_GetLastVerifiedBatches_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint32)) + }) + return _c +} + +func (_c *L1InfoTreer_GetLastVerifiedBatches_Call) Return(_a0 *l1infotreesync.VerifyBatches, _a1 error) *L1InfoTreer_GetLastVerifiedBatches_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetLastVerifiedBatches_Call) RunAndReturn(run func(uint32) (*l1infotreesync.VerifyBatches, error)) *L1InfoTreer_GetLastVerifiedBatches_Call { + _c.Call.Return(run) + return _c +} + +// GetLocalExitRoot provides a mock function with given fields: ctx, networkID, rollupExitRoot +func (_m *L1InfoTreer) GetLocalExitRoot(ctx context.Context, networkID uint32, rollupExitRoot common.Hash) (common.Hash, error) { + ret := _m.Called(ctx, networkID, rollupExitRoot) + + if len(ret) == 0 { + panic("no return value specified for GetLocalExitRoot") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32, common.Hash) (common.Hash, error)); ok { + return rf(ctx, networkID, rollupExitRoot) + } + if rf, ok := ret.Get(0).(func(context.Context, uint32, common.Hash) common.Hash); ok { + r0 = rf(ctx, networkID, rollupExitRoot) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint32, common.Hash) error); ok { + r1 = rf(ctx, networkID, rollupExitRoot) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetLocalExitRoot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLocalExitRoot' +type L1InfoTreer_GetLocalExitRoot_Call struct { + *mock.Call +} + +// GetLocalExitRoot is a helper method to define mock.On call +// - ctx context.Context +// - networkID uint32 +// - rollupExitRoot common.Hash +func (_e *L1InfoTreer_Expecter) GetLocalExitRoot(ctx interface{}, networkID interface{}, rollupExitRoot interface{}) *L1InfoTreer_GetLocalExitRoot_Call { + return &L1InfoTreer_GetLocalExitRoot_Call{Call: _e.mock.On("GetLocalExitRoot", ctx, networkID, rollupExitRoot)} +} + +func (_c *L1InfoTreer_GetLocalExitRoot_Call) Run(run func(ctx context.Context, networkID uint32, rollupExitRoot common.Hash)) *L1InfoTreer_GetLocalExitRoot_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint32), args[2].(common.Hash)) + }) + return _c +} + +func (_c *L1InfoTreer_GetLocalExitRoot_Call) Return(_a0 common.Hash, _a1 error) *L1InfoTreer_GetLocalExitRoot_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetLocalExitRoot_Call) RunAndReturn(run func(context.Context, uint32, common.Hash) (common.Hash, error)) *L1InfoTreer_GetLocalExitRoot_Call { + _c.Call.Return(run) + return _c +} + +// GetRollupExitTreeMerkleProof provides a mock function with given fields: ctx, networkID, root +func (_m *L1InfoTreer) GetRollupExitTreeMerkleProof(ctx context.Context, networkID uint32, root common.Hash) (types.Proof, error) { + ret := _m.Called(ctx, networkID, root) + + if len(ret) == 0 { + panic("no return value specified for GetRollupExitTreeMerkleProof") + } + + var r0 types.Proof + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32, common.Hash) (types.Proof, error)); ok { + return rf(ctx, networkID, root) + } + if rf, ok := ret.Get(0).(func(context.Context, uint32, common.Hash) types.Proof); ok { + r0 = rf(ctx, networkID, root) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(types.Proof) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint32, common.Hash) error); ok { + r1 = rf(ctx, networkID, root) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoTreer_GetRollupExitTreeMerkleProof_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetRollupExitTreeMerkleProof' +type L1InfoTreer_GetRollupExitTreeMerkleProof_Call struct { + *mock.Call +} + +// GetRollupExitTreeMerkleProof is a helper method to define mock.On call +// - ctx context.Context +// - networkID uint32 +// - root common.Hash +func (_e *L1InfoTreer_Expecter) GetRollupExitTreeMerkleProof(ctx interface{}, networkID interface{}, root interface{}) *L1InfoTreer_GetRollupExitTreeMerkleProof_Call { + return &L1InfoTreer_GetRollupExitTreeMerkleProof_Call{Call: _e.mock.On("GetRollupExitTreeMerkleProof", ctx, networkID, root)} +} + +func (_c *L1InfoTreer_GetRollupExitTreeMerkleProof_Call) Run(run func(ctx context.Context, networkID uint32, root common.Hash)) *L1InfoTreer_GetRollupExitTreeMerkleProof_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint32), args[2].(common.Hash)) + }) + return _c +} + +func (_c *L1InfoTreer_GetRollupExitTreeMerkleProof_Call) Return(_a0 types.Proof, _a1 error) *L1InfoTreer_GetRollupExitTreeMerkleProof_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoTreer_GetRollupExitTreeMerkleProof_Call) RunAndReturn(run func(context.Context, uint32, common.Hash) (types.Proof, error)) *L1InfoTreer_GetRollupExitTreeMerkleProof_Call { + _c.Call.Return(run) + return _c +} + +// NewL1InfoTreer creates a new instance of L1InfoTreer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewL1InfoTreer(t interface { + mock.TestingT + Cleanup(func()) +}) *L1InfoTreer { + mock := &L1InfoTreer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/rpc/mocks/last_ge_rer.go b/rpc/mocks/last_ge_rer.go new file mode 100644 index 00000000..160153f7 --- /dev/null +++ b/rpc/mocks/last_ge_rer.go @@ -0,0 +1,94 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + + lastgersync "github.com/agglayer/aggkit/lastgersync" + mock "github.com/stretchr/testify/mock" +) + +// LastGERer is an autogenerated mock type for the LastGERer type +type LastGERer struct { + mock.Mock +} + +type LastGERer_Expecter struct { + mock *mock.Mock +} + +func (_m *LastGERer) EXPECT() *LastGERer_Expecter { + return &LastGERer_Expecter{mock: &_m.Mock} +} + +// GetFirstGERAfterL1InfoTreeIndex provides a mock function with given fields: ctx, atOrAfterL1InfoTreeIndex +func (_m *LastGERer) GetFirstGERAfterL1InfoTreeIndex(ctx context.Context, atOrAfterL1InfoTreeIndex uint32) (lastgersync.Event, error) { + ret := _m.Called(ctx, atOrAfterL1InfoTreeIndex) + + if len(ret) == 0 { + panic("no return value specified for GetFirstGERAfterL1InfoTreeIndex") + } + + var r0 lastgersync.Event + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint32) (lastgersync.Event, error)); ok { + return rf(ctx, atOrAfterL1InfoTreeIndex) + } + if rf, ok := ret.Get(0).(func(context.Context, uint32) lastgersync.Event); ok { + r0 = rf(ctx, atOrAfterL1InfoTreeIndex) + } else { + r0 = ret.Get(0).(lastgersync.Event) + } + + if rf, ok := ret.Get(1).(func(context.Context, uint32) error); ok { + r1 = rf(ctx, atOrAfterL1InfoTreeIndex) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFirstGERAfterL1InfoTreeIndex' +type LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call struct { + *mock.Call +} + +// GetFirstGERAfterL1InfoTreeIndex is a helper method to define mock.On call +// - ctx context.Context +// - atOrAfterL1InfoTreeIndex uint32 +func (_e *LastGERer_Expecter) GetFirstGERAfterL1InfoTreeIndex(ctx interface{}, atOrAfterL1InfoTreeIndex interface{}) *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call { + return &LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call{Call: _e.mock.On("GetFirstGERAfterL1InfoTreeIndex", ctx, atOrAfterL1InfoTreeIndex)} +} + +func (_c *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call) Run(run func(ctx context.Context, atOrAfterL1InfoTreeIndex uint32)) *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint32)) + }) + return _c +} + +func (_c *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call) Return(_a0 lastgersync.Event, _a1 error) *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call) RunAndReturn(run func(context.Context, uint32) (lastgersync.Event, error)) *LastGERer_GetFirstGERAfterL1InfoTreeIndex_Call { + _c.Call.Return(run) + return _c +} + +// NewLastGERer creates a new instance of LastGERer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewLastGERer(t interface { + mock.TestingT + Cleanup(func()) +}) *LastGERer { + mock := &LastGERer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/rpc/openrpc.json b/rpc/openrpc.json new file mode 100644 index 00000000..4e3a2518 --- /dev/null +++ b/rpc/openrpc.json @@ -0,0 +1,386 @@ +{ + "openrpc": "1.0.0", + "info": { + "title": "CDK Endpoints", + "version": "0.0.1" + }, + "methods": [ + { + "name": "bridge_l1InfoTreeIndexForBridge", + "summary": "Returns the first L1 Info Tree index in which the bridge was included. NetworkID represents the origin network. This call needs to be done to a client of the same network were the bridge tx was sent", + "params": [ + { + "$ref": "#/components/contentDescriptors/NetworkID" + }, + { + "$ref": "#/components/contentDescriptors/DepositCount" + } + ], + "result": { + "$ref": "#/components/contentDescriptors/L1InfoTreeIndex" + }, + "examples": [ + { + "name": "example", + "params": [], + "result": { + "name": "exampleResult", + "value": "0x1" + } + } + ] + }, + { + "name": "bridge_injectedInfoAfterIndex", + "summary": "Return the first GER injected onto the network that is linked to the given index or greater. This call is useful to understand when a bridge is ready to be claimed on its destination network", + "params": [ + { + "$ref": "#/components/contentDescriptors/NetworkID" + }, + { + "$ref": "#/components/contentDescriptors/L1InfoTreeIndex" + } + ], + "result": { + "$ref": "#/components/contentDescriptors/L1InfoTreeLeaf" + }, + "examples": [ ] + }, + { + "name": "bridge_getProof", + "summary": "Gets the proof needed to perform a claim for a given bridge", + "params": [ + { + "$ref": "#/components/contentDescriptors/NetworkID" + }, + { + "$ref": "#/components/contentDescriptors/DepositCount" + }, + { + "$ref": "#/components/contentDescriptors/L1InfoTreeIndex" + } + ], + "result": { + "$ref": "#/components/contentDescriptors/Proof" + }, + "examples": [] + }, + { + "name": "bridge_sponsorClaim", + "summary": "Request to sponsor the claim tx for a given bridge", + "params": [ + { + "$ref": "#/components/contentDescriptors/SponsorClaim" + } + ], + "result": { + "name": "empty", + "schema": {"type": "null"} + }, + "examples": [] + }, + { + "name": "bridge_getSponsoredClaimStatus", + "summary": "Gets the proof needed to perform a claim for a given bridge", + "params": [ + { + "$ref": "#/components/contentDescriptors/GlobalIndex" + } + ], + "result": { + "$ref": "#/components/contentDescriptors/ClaimStatus" + }, + "examples": [] + } + ], + "components": { + "contentDescriptors": { + "NetworkID": { + "name": "networkID", + "required": true, + "schema": { + "$ref": "#/components/schemas/NetworkID" + } + }, + "DepositCount": { + "name": "depositCount", + "required": true, + "schema": { + "$ref": "#/components/schemas/DepositCount" + } + }, + "L1InfoTreeIndex": { + "name": "l1InfoTreeIndex", + "required": true, + "schema": { + "$ref": "#/components/schemas/L1InfoTreeIndex" + } + }, + "L1InfoTreeLeaf": { + "name": "l1InfoTreeLeaf", + "required": true, + "schema": { + "$ref": "#/components/schemas/L1InfoTreeLeaf" + } + }, + "Proof": { + "name": "proof", + "required": true, + "schema": { + "$ref": "#/components/schemas/Proof" + } + }, + "SponsorClaim": { + "name": "sponsorClaim", + "required": true, + "schema": { + "$ref": "#/components/schemas/SponsorClaim" + } + }, + "GlobalIndex": { + "name": "globalIndex", + "required": true, + "schema": { + "$ref": "#/components/schemas/GlobalIndex" + } + }, + "ClaimStatus": { + "name": "claimStatus", + "required": true, + "schema": { + "$ref": "#/components/schemas/ClaimStatus" + } + } + }, + "schemas": { + "Bytes": { + "title": "bytes", + "type": "string", + "description": "Hex representation of a variable length byte array", + "pattern": "^0x([a-fA-F0-9]?)+$" + }, + "Integer": { + "title": "integer", + "type": "string", + "pattern": "^0x[a-fA-F0-9]+$", + "description": "Hex representation of the integer" + }, + "Keccak": { + "title": "keccak", + "type": "string", + "description": "Hex representation of a Keccak 256 hash", + "pattern": "^0x[a-fA-F\\d]{64}$" + }, + "Address": { + "title": "address", + "type": "string", + "pattern": "^0x[a-fA-F\\d]{40}$" + }, + "BlockHash": { + "title": "blockHash", + "type": "string", + "pattern": "^0x[a-fA-F\\d]{64}$", + "description": "The hex representation of the Keccak 256 of the RLP encoded block" + }, + "BlockNumber": { + "title": "blockNumber", + "type": "string", + "description": "The hex representation of the block's height", + "$ref": "#/components/schemas/Integer" + }, + "BlockPosition": { + "title": "blockPosition", + "type": "string", + "description": "The hex representation of the position inside the block", + "$ref": "#/components/schemas/Integer" + }, + "NetworkID": { + "title": "networkID", + "type": "string", + "description": "The hex representation of the network ID", + "$ref": "#/components/schemas/Integer" + }, + "DepositCount": { + "title": "depositCount", + "type": "string", + "description": "The hex representation of the deposit count", + "$ref": "#/components/schemas/Integer" + }, + "L1InfoTreeIndex": { + "title": "l1InfoTreeIndex", + "type": "string", + "description": "The hex representation of the L1 info tree index", + "$ref": "#/components/schemas/Integer" + }, + "L1InfoTreeLeaf": { + "title": "l1InfoTreeLeaf", + "type": "object", + "readOnly": true, + "properties": { + "blockNumber": { + "$ref": "#/components/schemas/BlockNumber" + }, + "blockPosition": { + "$ref": "#/components/schemas/BlockPosition" + }, + "previousBlockHash": { + "$ref": "#/components/schemas/Keccak" + }, + "timestamp": { + "title": "blockTimeStamp", + "type": "string", + "description": "The unix timestamp for when the block was collated" + }, + "l1InfoTreeIndex": { + "$ref": "#/components/schemas/L1InfoTreeIndex" + }, + "mainnetExitRoot": { + "$ref": "#/components/schemas/Keccak" + }, + "rollupExitRoot": { + "$ref": "#/components/schemas/Keccak" + }, + "globalExitRoot": { + "$ref": "#/components/schemas/Keccak" + }, + "hash": { + "$ref": "#/components/schemas/Keccak" + } + } + }, + "MerkleProof": { + "title": "merkleProof", + "type": "array", + "description": "Array of hashes that constitute a merkle proof", + "items": { + "$ref": "#/components/schemas/Keccak" + } + }, + "ProofLocalExitRoot": { + "title": "proofLocalExitRoot", + "description": "Merkle Proof that proofs the existance of a deposit in the local exit tree of a network", + "$ref": "#/components/schemas/MerkleProof" + }, + "ProofRollupExitRoot": { + "title": "proofLocalExitRoot", + "description": "Merkle Proof that proofs the existance of a deposit in the local exit tree of a network", + "$ref": "#/components/schemas/MerkleProof" + }, + "Proof": { + "title": "proof", + "type": "object", + "readOnly": true, + "properties": { + "l1InfoTreeLeaf": { + "$ref": "#/components/schemas/L1InfoTreeLeaf" + }, + "proofLocalExitRoot": { + "$ref": "#/components/schemas/ProofLocalExitRoot" + }, + "proofRollupExitRoot": { + "$ref": "#/components/schemas/ProofRollupExitRoot" + } + } + }, + "LeafType": { + "title": "leafType", + "type": "string", + "description": "The hex representation of the leaf type", + "$ref": "#/components/schemas/Integer" + }, + "GlobalIndex": { + "title": "globalIndex", + "type": "string", + "description": "The hex representation of the global index", + "$ref": "#/components/schemas/Integer" + }, + "OriginNetwork": { + "title": "originNetwork", + "type": "string", + "description": "The hex representation of the origin network ID of the token", + "$ref": "#/components/schemas/Integer" + }, + "OriginTokenAddress": { + "title": "originTokenAddress", + "type": "string", + "description": "address of the token on it's origin network", + "$ref": "#/components/schemas/Address" + }, + "DestinationNetwork": { + "title": "destinationNetwork", + "type": "string", + "description": "The hex representation of the destination network ID", + "$ref": "#/components/schemas/Integer" + }, + "DestinationAddress": { + "title": "destinationAddress", + "type": "string", + "description": "address of the receiver of the bridge", + "$ref": "#/components/schemas/Address" + }, + "Amount": { + "title": "amount", + "description": "Amount of tokens being bridged", + "$ref": "#/components/schemas/Keccak" + }, + "Metadata": { + "title": "metadata", + "description": "Extra data included in the bridge", + "$ref": "#/components/schemas/Bytes" + }, + "SponsorClaim": { + "title": "sponsorClaim", + "type": "object", + "readOnly": true, + "properties": { + "leafType": { + "$ref": "#/components/schemas/LeafType" + }, + "proofLocalExitRoot": { + "$ref": "#/components/schemas/ProofLocalExitRoot" + }, + "proofRollupExitRoot": { + "$ref": "#/components/schemas/ProofRollupExitRoot" + }, + "globalIndex": { + "$ref": "#/components/schemas/GlobalIndex" + }, + "mainnetExitRoot": { + "$ref": "#/components/schemas/Keccak" + }, + "rollupExitRoot": { + "$ref": "#/components/schemas/Keccak" + }, + "originNetwork": { + "$ref": "#/components/schemas/OriginNetwork" + }, + "originTokenAddress": { + "$ref": "#/components/schemas/OriginTokenAddress" + }, + "destinationNetwork": { + "$ref": "#/components/schemas/DestinationNetwork" + }, + "destinationAddress": { + "$ref": "#/components/schemas/DestinationAddress" + }, + "amount": { + "$ref": "#/components/schemas/Amount" + }, + "metadata": { + "$ref": "#/components/schemas/Metadata" + } + } + }, + "ClaimStatus": { + "title": "claimStatus", + "description": "The status of a claim", + "type": "string", + "enum": [ + "pending", + "failed", + "success" + ] + } + } + } +} diff --git a/rpc/types/bridge.go b/rpc/types/bridge.go new file mode 100644 index 00000000..fd2e3324 --- /dev/null +++ b/rpc/types/bridge.go @@ -0,0 +1,12 @@ +package types + +import ( + "github.com/agglayer/aggkit/l1infotreesync" + tree "github.com/agglayer/aggkit/tree/types" +) + +type ClaimProof struct { + ProofLocalExitRoot tree.Proof + ProofRollupExitRoot tree.Proof + L1InfoTreeLeaf l1infotreesync.L1InfoTreeLeaf +} diff --git a/rpc/types/rpcbatch.go b/rpc/types/rpcbatch.go new file mode 100644 index 00000000..41900b9a --- /dev/null +++ b/rpc/types/rpcbatch.go @@ -0,0 +1,157 @@ +package types + +import ( + "fmt" + + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/ethereum/go-ethereum/common" +) + +type RPCBatch struct { + batchNumber uint64 + accInputHash common.Hash + blockHashes []string + batchL2Data []byte + globalExitRoot common.Hash + localExitRoot common.Hash + stateRoot common.Hash + coinbase common.Address + closed bool + lastL2BlockTimestamp uint64 + l1InfoTreeIndex uint32 +} + +func NewRPCBatch(batchNumber uint64, accInputHash common.Hash, blockHashes []string, batchL2Data []byte, + globalExitRoot common.Hash, localExitRoot common.Hash, stateRoot common.Hash, + coinbase common.Address, closed bool) *RPCBatch { + return &RPCBatch{ + batchNumber: batchNumber, + accInputHash: accInputHash, + blockHashes: blockHashes, + batchL2Data: batchL2Data, + globalExitRoot: globalExitRoot, + localExitRoot: localExitRoot, + stateRoot: stateRoot, + coinbase: coinbase, + closed: closed, + } +} + +// DeepCopy +func (b *RPCBatch) DeepCopy() seqsendertypes.Batch { + return &RPCBatch{ + accInputHash: b.accInputHash, + batchNumber: b.batchNumber, + blockHashes: b.blockHashes, + batchL2Data: b.batchL2Data, + globalExitRoot: b.globalExitRoot, + localExitRoot: b.localExitRoot, + stateRoot: b.stateRoot, + coinbase: b.coinbase, + closed: b.closed, + lastL2BlockTimestamp: b.lastL2BlockTimestamp, + l1InfoTreeIndex: b.l1InfoTreeIndex, + } +} + +// LastCoinbase +func (b *RPCBatch) LastCoinbase() common.Address { + return b.coinbase +} + +// ForcedBatchTimestamp +func (b *RPCBatch) ForcedBatchTimestamp() uint64 { + return 0 +} + +// ForcedGlobalExitRoot +func (b *RPCBatch) ForcedGlobalExitRoot() common.Hash { + return common.Hash{} +} + +// ForcedBlockHashL1 +func (b *RPCBatch) ForcedBlockHashL1() common.Hash { + return common.Hash{} +} + +// L2Data +func (b *RPCBatch) L2Data() []byte { + return b.batchL2Data +} + +// LastL2BLockTimestamp +func (b *RPCBatch) LastL2BLockTimestamp() uint64 { + return b.lastL2BlockTimestamp +} + +// BatchNumber +func (b *RPCBatch) BatchNumber() uint64 { + return b.batchNumber +} + +// GlobalExitRoot +func (b *RPCBatch) GlobalExitRoot() common.Hash { + return b.globalExitRoot +} + +// LocalExitRoot +func (b *RPCBatch) LocalExitRoot() common.Hash { + return b.localExitRoot +} + +// StateRoot +func (b *RPCBatch) StateRoot() common.Hash { + return b.stateRoot +} + +// AccInputHash +func (b *RPCBatch) AccInputHash() common.Hash { + return b.accInputHash +} + +// L1InfoTreeIndex +func (b *RPCBatch) L1InfoTreeIndex() uint32 { + return b.l1InfoTreeIndex +} + +// SetL2Data +func (b *RPCBatch) SetL2Data(data []byte) { + b.batchL2Data = data +} + +// SetLastCoinbase +func (b *RPCBatch) SetLastCoinbase(address common.Address) { + b.coinbase = address +} + +// SetLastL2BLockTimestamp +func (b *RPCBatch) SetLastL2BLockTimestamp(ts uint64) { + b.lastL2BlockTimestamp = ts +} + +// SetL1InfoTreeIndex +func (b *RPCBatch) SetL1InfoTreeIndex(index uint32) { + b.l1InfoTreeIndex = index +} + +// String +func (b *RPCBatch) String() string { + return fmt.Sprintf( + "Batch/RPC: LastCoinbase: %s, ForcedBatchTimestamp: %d, ForcedGlobalExitRoot: %x, ForcedBlockHashL1: %x"+ + ", L2Data: %x, LastL2BLockTimestamp: %d, BatchNumber: %d, GlobalExitRoot: %x, L1InfoTreeIndex: %d", + b.LastCoinbase().String(), + b.ForcedBatchTimestamp(), + b.ForcedGlobalExitRoot().String(), + b.ForcedBlockHashL1().String(), + b.L2Data(), + b.LastL2BLockTimestamp(), + b.BatchNumber(), + b.GlobalExitRoot().String(), + b.L1InfoTreeIndex(), + ) +} + +// IsClosed +func (b *RPCBatch) IsClosed() bool { + return b.closed +} diff --git a/scripts/local_config b/scripts/local_config new file mode 100755 index 00000000..fbc0beb5 --- /dev/null +++ b/scripts/local_config @@ -0,0 +1,447 @@ +#!/bin/bash +#Include common varaibles +source $(dirname $0)/../test/scripts/env.sh +############################################################################### +function log_debug() { + echo -e "\033[0;90mDebug: $*" "\033[0m" +} +############################################################################### +function log_error() { + echo -e "\033[0;31mError: $*" "\033[0m" +} +############################################################################### +function log_fatal() { + log_error $* + exit 1 +} +############################################################################### +function ok_or_fatal(){ + if [ $? -ne 0 ]; then + log_fatal $* + fi +} + +############################################################################### +function get_value_from_toml_file(){ + local _FILE="$1" + # KEY = . + local _SECTION="$2" + local _KEY="$3" + local _LINE + local _inside_section=0 + if [ $_SECTION == "." ]; then + _SECTION="" + _inside_section=1 + fi + local _return_next_line=0 + local _TMP_FILE=$(mktemp) + cat $_FILE > $_TMP_FILE + # Maybe the file doesnt end with a new line so we added just in case + echo >> $_TMP_FILE + while read -r _LINE; do + # Clean up line from spaces and tabs + _LINE=$(echo $_LINE | tr -d '[:space:]') + if [ $_inside_section -eq 1 ]; then + if [[ "$_LINE" == [* ]]; then + return 1 + fi + if [ $_return_next_line -eq 1 ]; then + # sed sentence remove quotes + echo $_LINE | sed 's/^[[:space:]]*"//;s/"$//' + + return 0 + fi + #local _key_splitted=(${_LINE//=/ }) + local _key_name=$(echo $_LINE | cut -f 1 -d "=") + local _key_value=$(echo $_LINE | cut -f 2- -d "=") + if [ "$_key_name" == "$_KEY" ]; then + if [ $_key_value == "[" ]; then + _return_next_line=1 + else + rm $_TMP_FILE + # sed sentence remove quotes + echo $_key_value | sed 's/^[[:space:]]*"//;s/"$//' + return 0 + fi + fi + elif [ "$_LINE" == "[${_SECTION}]" ]; then + _inside_section=1 + fi + + + done < "$_TMP_FILE" + rm $_TMP_FILE + return 2 + +} +############################################################################### +function export_key_from_toml_file_or_fatal(){ + export_key_from_toml_file "$1" "$2" "$3" "$4" + if [ $? -ne 0 ]; then + local _EXPORTED_VAR_NAME="$1" + local _FILE="$2" + local _SECTION="$3" + local _KEY="$4" + log_fatal "$FUNCNAME: key [$_KEY] not found in section [$_SECTION] in file [$_FILE]" + fi +} + +############################################################################### +function export_key_from_toml_file(){ + local _EXPORTED_VAR_NAME="$1" + local _FILE="$2" + local _SECTION="$3" + local _KEY="$4" + local _VALUE=$(get_value_from_toml_file $_FILE $_SECTION $_KEY) + if [ -z "$_VALUE" ]; then + log_debug "$FUNCNAME: key [$_KEY] not found in section [$_SECTION] in file [$_FILE]" + return 1 + fi + export $_EXPORTED_VAR_NAME="$_VALUE" + log_debug "$_EXPORTED_VAR_NAME=${!_EXPORTED_VAR_NAME} \t\t\t# file:$_FILE section:$_SECTION key:$_KEY" + return 0 +} +############################################################################### +function export_obj_key_from_toml_file_or_fatal(){ + export_obj_key_from_toml_file $* + if [ $? -ne 0 ]; then + local _EXPORTED_VAR_NAME="$1" + local _FILE="$2" + local _SECTION="$3" + local _KEY="$4" + log_fatal "$FUNCNAME: obj_key [$_KEY] not found in section [$_SECTION] in file [$_FILE]" + fi +} + +############################################################################### +function export_obj_key_from_toml_file(){ + local _EXPORTED_VAR_NAME="$1" + local _FILE="$2" + local _SECTION="$3" + local _KEY="$4" + local _OBJ_KEY="$5" + log_debug "export_obj_key_from_toml_file: $_EXPORTED_VAR_NAME $_FILE $_SECTION $_KEY $_OBJ_KEY" + local _VALUE=$(get_value_from_toml_file $_FILE $_SECTION $_KEY) + if [ -z "$_VALUE" ]; then + log_debug "export_obj_key_from_toml_file: obj_key $_KEY not found in section [$_SECTION]" + return 1 + fi + local _CLEAN_VALUE=$(echo $_VALUE | tr -d '{' | tr -d '}' | tr ',' '\n') + while read -r _LINE; do + local _key_splitted=(${_LINE//=/ }) + + if [ "${_key_splitted[0]}" == "$_OBJ_KEY" ]; then + local _KEY_VALUE=${_key_splitted[1]} + if [ "$_KEY_VALUE" == "[" ]; then + read -r _LINE + _KEY_VALUE=$LINE + echo "zzz $_KEY_VALUE" + fi + local _RES=$(echo $_KEY_VALUE | sed 's/^[[:space:]]*"//;s/"$//') + export $_EXPORTED_VAR_NAME="${_RES}" + log_debug "$_EXPORTED_VAR_NAME=${!_EXPORTED_VAR_NAME} \t\t\t# file:$_FILE section:$_SECTION key:$_KEY obj_key:$_OBJ_KEY" + return 0 + fi + done <<< "$_CLEAN_VALUE" + log_debug "export_obj_key_from_toml_file: obj_key $_OBJ_KEY not found in section $_SECTION/ $_KEY = $_VALUE" + return 1 +} + +############################################################################### +function export_values_of_genesis(){ + local _GENESIS_FILE=$1 + if [ ! -f $_GENESIS_FILE ]; then + log_fatal "Error: genesis file not found: $_GENESIS_FILE" + fi + export l1_chain_id=$(jq -r '.L1Config.chainId' $_GENESIS_FILE | tr -d '"') + export pol_token_address=$(jq -r '.L1Config.polTokenAddress' $_GENESIS_FILE) + export zkevm_rollup_address=$(jq -r '.L1Config.polygonZkEVMAddress' $_GENESIS_FILE) + export zkevm_rollup_manager_address=$(jq -r '.L1Config.polygonRollupManagerAddress' $_GENESIS_FILE) + export zkevm_global_exit_root_address=$(jq -r '.L1Config.polygonZkEVMGlobalExitRootAddress' $_GENESIS_FILE) + export zkevm_rollup_manager_block_number=$(jq -r '.rollupManagerCreationBlockNumber' $_GENESIS_FILE) +} + +############################################################################### +function export_values_of_cdk_node_config(){ + local _CDK_CONFIG_FILE=$1 + export_key_from_toml_file zkevm_l2_sequencer_address $_CDK_CONFIG_FILE SequenceSender L2Coinbase + if [ $? -ne 0 ]; then + export_key_from_toml_file_or_fatal zkevm_l2_sequencer_address $_CDK_CONFIG_FILE "." L2Coinbase + fi + export_obj_key_from_toml_file zkevm_l2_sequencer_keystore_password $_CDK_CONFIG_FILE SequenceSender PrivateKey Password + if [ $? -ne 0 ]; then + export_key_from_toml_file_or_fatal zkevm_l2_sequencer_keystore_password $_CDK_CONFIG_FILE "." SequencerPrivateKeyPassword + fi + export_key_from_toml_file l1_chain_id $_CDK_CONFIG_FILE SequenceSender.EthTxManager.Etherman L1ChainID + if [ $? -ne 0 ]; then + export_key_from_toml_file_or_fatal l1_chain_id $_CDK_CONFIG_FILE L1Config chainId + fi + export_key_from_toml_file zkevm_is_validium $_CDK_CONFIG_FILE Common IsValidiumMode + if [ $? -ne 0 ]; then + export_key_from_toml_file_or_fatal zkevm_is_validium $_CDK_CONFIG_FILE "." IsValidiumMode + fi + export_key_from_toml_file zkevm_contract_versions $_CDK_CONFIG_FILE Common ContractVersions + if [ $? -ne 0 ]; then + export_key_from_toml_file_or_fatal zkevm_contract_versions $_CDK_CONFIG_FILE "." ContractVersions + fi + export_key_from_toml_file l2_chain_id $_CDK_CONFIG_FILE Aggregator ChainID + if [ $? -ne 0 ]; then + log_debug "l2_chain_id not found in Aggregator section, using 0" + export l2_chain_id="0" + fi + export_key_from_toml_file_or_fatal zkevm_aggregator_port $_CDK_CONFIG_FILE Aggregator Port + export_key_from_toml_file zkevm_l2_agglayer_address $_CDK_CONFIG_FILE Aggregator SenderAddress + if [ $? -ne 0 ]; then + export_key_from_toml_file zkevm_l2_agglayer_address $_CDK_CONFIG_FILE "." SenderProofToL1Addr + fi + export_obj_key_from_toml_file zkevm_l2_aggregator_keystore_password $_CDK_CONFIG_FILE Aggregator.EthTxManager PrivateKeys Password + if [ $? -ne 0 ]; then + export_key_from_toml_file zkevm_l2_aggregator_keystore_password $_CDK_CONFIG_FILE "." AggregatorPrivateKeyPassword + fi + export_key_from_toml_file zkevm_rollup_fork_id $_CDK_CONFIG_FILE Aggregator ForkId + if [ $? -ne 0 ]; then + export_key_from_toml_file_or_fatal zkevm_rollup_fork_id $_CDK_CONFIG_FILE "." ForkId + fi + export_key_from_toml_file zkevm_l2_agglayer_keystore_password $_CDK_CONFIG_FILE AggSender.SequencerPrivateKey Password + if [ $? -ne 0 ]; then + export_key_from_toml_file_or_fatal zkevm_l2_agglayer_keystore_password $_CDK_CONFIG_FILE "." SequencerPrivateKeyPassword + fi + export_key_from_toml_file zkevm_bridge_address $_CDK_CONFIG_FILE BridgeL1Sync BridgeAddr + if [ $? -ne 0 ]; then + export_key_from_toml_file_or_fatal zkevm_bridge_address $_CDK_CONFIG_FILE "." polygonBridgeAddr + fi + export is_cdk_validium=$zkevm_is_validium + export zkevm_rollup_chain_id=$l2_chain_id + + if [ "$zkevm_is_validium" == "true" ]; then + log_debug "Validium mode detected... Retrieving the dac_port" + export_value_from_kurtosis_or_fail dac_port zkevm-dac-001 dac + fi + export zkevm_l2_keystore_password=$zkevm_l2_sequencer_keystore_password +} +############################################################################### +# params: +# $1 -> exported variable name +# $2 -> service name +# $3...$n -> endpoint names (will try all of them until one is found) +############################################################################### +function export_value_from_kurtosis_or_fail(){ + local _EXPORTED_VAR_NAME="$1" + shift + local _SERVICE="$1" + shift + local _END_POINT + local _RESULT + log_debug "Trying to get kurtosis value:$_EXPORTED_VAR_NAME = $KURTOSIS_ENCLAVE $_SERVICE $*" + while [ ! -z $1 ]; do + _END_POINT=$1 + shift + log_debug "--- kurtosis value: $KURTOSIS_ENCLAVE $_SERVICE $_END_POINT" + _RESULT=$(kurtosis port print $KURTOSIS_ENCLAVE $_SERVICE $_END_POINT 2>/dev/null) + if [ ! -z $_RESULT ]; then + break + fi + done + export $_EXPORTED_VAR_NAME=$_RESULT + if [ -z $_EXPORTED_VAR_NAME ]; then + log_fatal "Error getting kurtosis port: $KURTOSIS_ENCLAVE $_SERVICE $_END_POINT" + fi + log_debug "$_EXPORTED_VAR_NAME=${!_EXPORTED_VAR_NAME} \t\t\t# Kurtosis $KURTOSIS_ENCLAVE $_SERVICE $_END_POINT" +} +############################################################################### +function export_portnum_from_kurtosis_or_fail(){ + local _EXPORTED_VAR_NAME="$1" + export_value_from_kurtosis_or_fail $* > /dev/null + local _VALUE + eval "_VALUE=\$$1" + # sed sentece eliminate protocol (xyz://) is have it + # kurtosis sometimes include protocol but not always + local _PORT=$(echo "$_VALUE" | sed -E 's|^[a-zA-Z]+://||' | cut -f 2 -d ":") + if [ -z $_PORT ]; then + log_fatal "Error getting port number from kurtosis: $2 $3 -> $_VALUE" + fi + export $_EXPORTED_VAR_NAME=$_PORT + log_debug "$_EXPORTED_VAR_NAME=${!_EXPORTED_VAR_NAME} \t\t\t# Kurtosis $KURTOSIS_ENCLAVE $2 $3" +} +############################################################################### +function export_ports_from_kurtosis(){ + export_portnum_from_kurtosis_or_fail l1_rpc_port el-1-geth-lighthouse rpc + export_portnum_from_kurtosis_or_fail zkevm_rpc_http_port cdk-erigon-rpc-001 http-rpc rpc + export_portnum_from_kurtosis_or_fail zkevm_data_streamer_port cdk-erigon-sequencer-001 data-streamer + export_portnum_from_kurtosis_or_fail aggregator_db_port postgres-001 postgres + export_portnum_from_kurtosis_or_fail agglayer_port agglayer agglayer + export aggregator_db_hostname="127.0.0.1" + export l1_rpc_url="http://localhost:${l1_rpc_port}" + export l2_rpc_url="http://localhost:${zkevm_rpc_http_port}" + export agglayer_url="http://localhost:${agglayer_port}" +} + +############################################################################### +function export_forced_values(){ + export global_log_level="debug" + export l2_rpc_name="localhost" + export sequencer_name="localhost" + export deployment_suffix="" +} +############################################################################### +function check_requirements(){ + which kurtosis > /dev/null + if [ $? -ne 0 ]; then + log_error "kurtosis is not installed. Please install it:" + cat << EOF + echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list + echo "deb [trusted=yes] https://apt.fury.io/kurtosis-tech/ /" | sudo tee /etc/apt/sources.list.d/kurtosis.list + sudo apt install kurtosis-cli + kurtosis version +EOF + exit 1 + + fi + if [ -z $TMP_AGGKIT_FOLDER -o -z $KURTOSIS_ENCLAVE ]; then + log_fatal "TMP_AGGKIT_FOLDER or KURTOSIS_ENCLAVE is not set. Must be set on file env.sh" + fi + kurtosis enclave inspect $KURTOSIS_ENCLAVE > /dev/null + if [ $? -ne 0 ]; then + log_error "Error inspecting enclave $KURTOSIS_ENCLAVE" + echo "You must start kurtosis environment before running this script" + echo "- start kurtosis:" + echo " kurtosis clean --all; kurtosis run --enclave $KURTOSIS_ENCLAVE --args-file params.yml --image-download always ." + + exit 1 + fi +} +############################################################################### +function create_dest_folder(){ + export DEST=${TMP_AGGKIT_FOLDER}/local_config + export zkevm_path_rw_data=${TMP_AGGKIT_FOLDER}/runtime + [ ! -d ${DEST} ] && mkdir -p ${DEST} + rm $DEST/* + mkdir $zkevm_path_rw_data +} +############################################################################### +function download_kurtosis_artifacts(){ + kurtosis files download $KURTOSIS_ENCLAVE genesis $DEST + ok_or_fatal "Error downloading kurtosis artifact genesis to $DEST" + export genesis_file=$DEST/genesis.json + + kurtosis files download $KURTOSIS_ENCLAVE sequencer-keystore $DEST + ok_or_fatal "Error downloading kurtosis artifact sequencer-keystore to $DEST" + export zkevm_l2_sequencer_keystore_file=$DEST/sequencer.keystore + + kurtosis files download $KURTOSIS_ENCLAVE cdk-node-config-artifact $DEST + ok_or_fatal "Error downloading kurtosis artifact cdk-node-config-artifact to $DEST" + + kurtosis files download $KURTOSIS_ENCLAVE aggregator-keystore $DEST + ok_or_fatal "Error downloading kurtosis artifact cdk-node-config-artifact to $DEST" + export zkevm_l2_aggregator_keystore_file=$DEST/aggregator.keystore + + kurtosis files download $KURTOSIS_ENCLAVE agglayer-keystore $DEST + ok_or_fatal "Error downloading kurtosis artifact agglayer to $DEST" + export zkevm_l2_agglayer_keystore_file=$DEST/agglayer.keystore + +} +############################################################################### +function add_translation_rules_for_validium(){ + if [ $is_cdk_validium != "true" ]; then + return + fi + log_debug " For Validium mode, we need to reach the DAC SERVER: adding translation rules" + + echo "[Aggregator.Synchronizer.Etherman.Validium.Translator]" + echo "FullMatchRules = [" + echo " {Old=\"http://zkevm-dac-001:8484\", New=\"http://127.0.0.1:${dac_port}\"}," + echo " ]" +} +############################################################################### +function check_generated_config_file(){ + grep "" $DEST_TEMPLATE_FILE > /dev/null + if [ $? -ne 1 ]; then + log_error "some values are not set, check $ORIG_TEMPLATE_FILE" + echo "" + echo "missing keys in rendered template: $DEST_TEMPLATE_FILE" + echo " " + grep "" $DEST_TEMPLATE_FILE + exit 1 + fi +} +############################################################################### +function parse_command_line_args(){ + while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + echo "Usage: $0" + echo " -h: help" + exit 0 + ;; + -e|--enclave) + KURTOSIS_ENCLAVE=$2 + shift + shift + ;; + -*) + echo "Invalid Option: $1" 1>&2 + exit 1 + ;; + esac + done +} +############################################################################### +# MAIN +############################################################################### +set -o pipefail # enable strict command pipe error detection +parse_command_line_args $* +check_requirements +create_dest_folder + +download_kurtosis_artifacts + +export_values_of_genesis $genesis_file +export_ports_from_kurtosis +export_values_of_cdk_node_config $DEST/cdk-node-config.toml +export_forced_values + +ORIG_TEMPLATE_FILE=test/config/kurtosis-cdk-node-config.toml.template +DEST_TEMPLATE_FILE=$DEST/test.kurtosis.toml + +# Generate config file +go run scripts/run_template.go $ORIG_TEMPLATE_FILE > $DEST_TEMPLATE_FILE +ok_or_fatal "Error generating template" + +check_generated_config_file + +add_translation_rules_for_validium + +echo " " +echo "file generated at:" $DEST/test.kurtosis.toml + +echo "- to restart kurtosis:" +echo " kurtosis clean --all; kurtosis run --enclave aggkit --args-file params.yml --image-download always ." +echo " " +echo "- Stop aggkit:" +echo " kurtosis service stop aggkit cdk-node-001" +echo " " +echo "- Add next configuration to vscode launch.json" +echo " -----------------------------------------------------------" +cat << EOF + { + "name": "Debug aggkit", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "cmd/", + "cwd": "\${workspaceFolder}", + "args":[ + "run", + "-cfg", "$DEST_TEMPLATE_FILE", + "-components", "sequence-sender,aggregator", + ] + }, + + To run AggSender change components to: + "-components", "aggsender", +EOF + +echo " -----------------------------------------------------------" +echo " " +echo " - rembember to clean previous execution data: " +echo " rm -Rf ${zkevm_path_rw_data}/*" diff --git a/scripts/run_template.go b/scripts/run_template.go new file mode 100644 index 00000000..c9ef58a3 --- /dev/null +++ b/scripts/run_template.go @@ -0,0 +1,57 @@ +package main + +import ( + "log" + "os" + "regexp" + "strings" + "text/template" +) + +func main() { + tmpl := template.New("t1") + content, err := readFile(os.Args[1]) + if err != nil { + log.Fatalf("Error loading template: %v", err) + } + content = replaceDotsInTemplateVariables(content) + tmpl = template.Must(tmpl.Parse(content)) + + if err := tmpl.Execute(os.Stdout, environmentToMap()); err != nil { + log.Fatalf("Error executing template: %v", err) + } +} +func replaceDotsInTemplateVariables(template string) string { + re := regexp.MustCompile(`{{\s*\.([^{}]*)\s*}}`) + result := re.ReplaceAllStringFunc(template, func(match string) string { + match = strings.ReplaceAll(match[3:], ".", "_") + return "{{." + match + }) + return result +} + +func readFile(filename string) (string, error) { + content, err := os.ReadFile(filename) + if err != nil { + return "", err + } + return string(content), nil +} + +func environmentToMap() map[string]any { + envVars := make(map[string]any) + for _, e := range os.Environ() { + pair := splitAtFirst(e, '=') + envVars[pair[0]] = pair[1] + } + return envVars +} + +func splitAtFirst(s string, sep rune) [2]string { + for i, c := range s { + if c == sep { + return [2]string{s[:i], s[i+1:]} + } + } + return [2]string{s, ""} +} diff --git a/sequencesender/config.go b/sequencesender/config.go new file mode 100644 index 00000000..20d61142 --- /dev/null +++ b/sequencesender/config.go @@ -0,0 +1,73 @@ +package sequencesender + +import ( + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/common" +) + +// Config represents the configuration of a sequence sender +type Config struct { + // WaitPeriodSendSequence is the time the sequencer waits until + // trying to send a sequence to L1 + WaitPeriodSendSequence types.Duration `mapstructure:"WaitPeriodSendSequence"` + // LastBatchVirtualizationTimeMaxWaitPeriod is time since sequences should be sent + LastBatchVirtualizationTimeMaxWaitPeriod types.Duration `mapstructure:"LastBatchVirtualizationTimeMaxWaitPeriod"` + // L1BlockTimestampMargin is the time difference (margin) that must exists between last L1 block + // and last L2 block in the sequence before sending the sequence to L1. If the difference is + // lower than this value, then sequencesender will wait until the difference is equal or greater + L1BlockTimestampMargin types.Duration `mapstructure:"L1BlockTimestampMargin"` + // MaxTxSizeForL1 is the maximum size a single transaction can have. This field has + // non-trivial consequences: larger transactions than 128KB are significantly harder and + // more expensive to propagate; larger transactions also take more resources + // to validate whether they fit into the pool or not. + MaxTxSizeForL1 uint64 `mapstructure:"MaxTxSizeForL1"` + // SenderAddress defines which private key the eth tx manager needs to use + // to sign the L1 txs + SenderAddress common.Address + // L2Coinbase defines which address is going to receive the fees + L2Coinbase common.Address `mapstructure:"L2Coinbase"` + // PrivateKey defines all the key store files that are going + // to be read in order to provide the private keys to sign the L1 txs + PrivateKey types.KeystoreFileConfig `mapstructure:"PrivateKey"` + // Batch number where there is a forkid change (fork upgrade) + ForkUpgradeBatchNumber uint64 + // GasOffset is the amount of gas to be added to the gas estimation in order + // to provide an amount that is higher than the estimated one. This is used + // to avoid the TX getting reverted in case something has changed in the network + // state after the estimation which can cause the TX to require more gas to be + // executed. + // + // ex: + // gas estimation: 1000 + // gas offset: 100 + // final gas: 1100 + GasOffset uint64 `mapstructure:"GasOffset"` + + // SequencesTxFileName is the file name to store sequences sent to L1 + SequencesTxFileName string + + // WaitPeriodPurgeTxFile is the time to wait before purging from file the finished sent L1 tx + WaitPeriodPurgeTxFile types.Duration `mapstructure:"WaitPeriodPurgeTxFile"` + + // MaxPendingTx is the maximum number of pending transactions (those that are not in a final state) + MaxPendingTx uint64 + + // EthTxManager is the config for the ethtxmanager + EthTxManager ethtxmanager.Config `mapstructure:"EthTxManager"` + + // Log is the log configuration + Log log.Config `mapstructure:"Log"` + + // MaxBatchesForL1 is the maximum amount of batches to be sequenced in a single L1 tx + MaxBatchesForL1 uint64 `mapstructure:"MaxBatchesForL1"` + // BlockFinality indicates the status of the blocks that will be queried in order to sync + BlockFinality string `jsonschema:"enum=LatestBlock, enum=SafeBlock, enum=PendingBlock, enum=FinalizedBlock, enum=EarliestBlock" mapstructure:"BlockFinality"` //nolint:lll + + // RPCURL is the URL of the RPC server + RPCURL string `mapstructure:"RPCURL"` + + // GetBatchWaitInterval is the time to wait to query for a new batch when there are no more batches available + GetBatchWaitInterval types.Duration `mapstructure:"GetBatchWaitInterval"` +} diff --git a/sequencesender/ethtx.go b/sequencesender/ethtx.go new file mode 100644 index 00000000..458ad3d1 --- /dev/null +++ b/sequencesender/ethtx.go @@ -0,0 +1,398 @@ +package sequencesender + +import ( + "context" + "encoding/json" + "errors" + "math" + "math/big" + "os" + "strings" + "sync/atomic" + "time" + + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + "github.com/0xPolygon/zkevm-ethtx-manager/types" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/common" +) + +type ethTxData struct { + Nonce uint64 `json:"nonce"` + Status string `json:"status"` + SentL1Timestamp time.Time `json:"sentL1Timestamp"` + StatusTimestamp time.Time `json:"statusTimestamp"` + FromBatch uint64 `json:"fromBatch"` + ToBatch uint64 `json:"toBatch"` + MinedAtBlock big.Int `json:"minedAtBlock"` + OnMonitor bool `json:"onMonitor"` + To common.Address `json:"to"` + StateHistory []string `json:"stateHistory"` + Txs map[common.Hash]ethTxAdditionalData `json:"txs"` + Gas uint64 `json:"gas"` +} + +type ethTxAdditionalData struct { + GasPrice *big.Int `json:"gasPrice,omitempty"` + RevertMessage string `json:"revertMessage,omitempty"` +} + +// sendTx adds transaction to the ethTxManager to send it to L1 +func (s *SequenceSender) sendTx(ctx context.Context, resend bool, txOldHash *common.Hash, to *common.Address, + fromBatch uint64, toBatch uint64, data []byte, gas uint64) error { + // Params if new tx to send or resend a previous tx + var ( + paramTo *common.Address + paramData []byte + valueFromBatch uint64 + valueToBatch uint64 + valueToAddress common.Address + ) + + if !resend { + paramTo = to + paramData = data + valueFromBatch = fromBatch + valueToBatch = toBatch + } else { + if txOldHash == nil { + log.Errorf("trying to resend a tx with nil hash") + return errors.New("resend tx with nil hash monitor id") + } + oldEthTx := s.ethTransactions[*txOldHash] + paramTo = &oldEthTx.To + paramData = s.ethTxData[*txOldHash] + valueFromBatch = oldEthTx.FromBatch + valueToBatch = oldEthTx.ToBatch + } + if paramTo != nil { + valueToAddress = *paramTo + } + + // Add sequence tx + txHash, err := s.ethTxManager.AddWithGas(ctx, paramTo, big.NewInt(0), paramData, s.cfg.GasOffset, nil, gas) + if err != nil { + log.Errorf("error adding sequence to ethtxmanager: %v", err) + return err + } + + // Add new eth tx + txData := ethTxData{ + SentL1Timestamp: time.Now(), + StatusTimestamp: time.Now(), + Status: "*new", + FromBatch: valueFromBatch, + ToBatch: valueToBatch, + OnMonitor: true, + To: valueToAddress, + Gas: gas, + } + + // Add tx to internal structure + s.mutexEthTx.Lock() + s.ethTransactions[txHash] = &txData + txResults := make(map[common.Hash]types.TxResult, 0) + s.copyTxData(txHash, paramData, txResults) + err = s.getResultAndUpdateEthTx(ctx, txHash) + if err != nil { + log.Errorf("error getting result for tx %v: %v", txHash, err) + } + if !resend { + atomic.StoreUint64(&s.latestSentToL1Batch, valueToBatch) + } else { + s.ethTransactions[*txOldHash].Status = "*resent" + } + s.mutexEthTx.Unlock() + + // Save sent sequences + err = s.saveSentSequencesTransactions(ctx) + if err != nil { + log.Errorf("error saving tx sequence sent, error: %v", err) + } + return nil +} + +// purgeEthTx purges transactions from memory structures +func (s *SequenceSender) purgeEthTx(ctx context.Context) { + // If sequence sending is stopped, do not purge + if s.IsStopped() { + return + } + + // Purge old transactions that are finalized + s.mutexEthTx.Lock() + timePurge := time.Now().Add(-s.cfg.WaitPeriodPurgeTxFile.Duration) + toPurge := make([]common.Hash, 0) + for hash, data := range s.ethTransactions { + if !data.StatusTimestamp.Before(timePurge) { + continue + } + + if !data.OnMonitor || data.Status == types.MonitoredTxStatusFinalized.String() { + toPurge = append(toPurge, hash) + + // Remove from tx monitor + if data.OnMonitor { + err := s.ethTxManager.Remove(ctx, hash) + if err != nil { + log.Warnf("error removing monitor tx %v from ethtxmanager: %v", hash, err) + } else { + log.Infof("removed monitor tx %v from ethtxmanager", hash) + } + } + } + } + + if len(toPurge) > 0 { + var firstPurged uint64 = math.MaxUint64 + var lastPurged uint64 + for i := 0; i < len(toPurge); i++ { + if s.ethTransactions[toPurge[i]].Nonce < firstPurged { + firstPurged = s.ethTransactions[toPurge[i]].Nonce + } + if s.ethTransactions[toPurge[i]].Nonce > lastPurged { + lastPurged = s.ethTransactions[toPurge[i]].Nonce + } + delete(s.ethTransactions, toPurge[i]) + delete(s.ethTxData, toPurge[i]) + } + log.Infof("txs purged count: %d, fromNonce: %d, toNonce: %d", len(toPurge), firstPurged, lastPurged) + } + s.mutexEthTx.Unlock() +} + +// syncEthTxResults syncs results from L1 for transactions in the memory structure +func (s *SequenceSender) syncEthTxResults(ctx context.Context) (uint64, error) { + s.mutexEthTx.Lock() + var ( + txPending uint64 + txSync uint64 + ) + for hash, tx := range s.ethTransactions { + if tx.Status == types.MonitoredTxStatusFinalized.String() { + continue + } + + err := s.getResultAndUpdateEthTx(ctx, hash) + if err != nil { + log.Errorf("error getting result for tx %v: %v", hash, err) + return 0, err + } + + txSync++ + txStatus := types.MonitoredTxStatus(tx.Status) + // Count if it is not in a final state + if tx.OnMonitor && + txStatus != types.MonitoredTxStatusFailed && + txStatus != types.MonitoredTxStatusSafe && + txStatus != types.MonitoredTxStatusFinalized { + txPending++ + } + } + s.mutexEthTx.Unlock() + + // Save updated sequences transactions + err := s.saveSentSequencesTransactions(ctx) + if err != nil { + log.Errorf("error saving tx sequence, error: %v", err) + return 0, err + } + + log.Infof("%d tx results synchronized (%d in pending state)", txSync, txPending) + return txPending, nil +} + +// syncAllEthTxResults syncs all tx results from L1 +func (s *SequenceSender) syncAllEthTxResults(ctx context.Context) error { + // Get all results + results, err := s.ethTxManager.ResultsByStatus(ctx, nil) + if err != nil { + log.Warnf("error getting results for all tx: %v", err) + return err + } + + // Check and update tx status + numResults := len(results) + s.mutexEthTx.Lock() + for _, result := range results { + txSequence, exists := s.ethTransactions[result.ID] + if !exists { + log.Debugf("transaction %v missing in memory structure. Adding it", result.ID) + // No info: from/to batch and the sent timestamp + s.ethTransactions[result.ID] = ðTxData{ + SentL1Timestamp: time.Time{}, + StatusTimestamp: time.Now(), + OnMonitor: true, + Status: "*missing", + } + txSequence = s.ethTransactions[result.ID] + } + + s.updateEthTxResult(txSequence, result) + } + s.mutexEthTx.Unlock() + + // Save updated sequences transactions + err = s.saveSentSequencesTransactions(ctx) + if err != nil { + log.Errorf("error saving tx sequence, error: %v", err) + } + + log.Infof("%d tx results synchronized", numResults) + return nil +} + +// copyTxData copies tx data in the internal structure +func (s *SequenceSender) copyTxData( + txHash common.Hash, txData []byte, txsResults map[common.Hash]types.TxResult, +) { + s.ethTxData[txHash] = make([]byte, len(txData)) + copy(s.ethTxData[txHash], txData) + + s.ethTransactions[txHash].Txs = make(map[common.Hash]ethTxAdditionalData, 0) + for hash, result := range txsResults { + var gasPrice *big.Int + if result.Tx != nil { + gasPrice = result.Tx.GasPrice() + } + + add := ethTxAdditionalData{ + GasPrice: gasPrice, + RevertMessage: result.RevertMessage, + } + s.ethTransactions[txHash].Txs[hash] = add + } +} + +// updateEthTxResult handles updating transaction state +func (s *SequenceSender) updateEthTxResult(txData *ethTxData, txResult types.MonitoredTxResult) { + if txData.Status != txResult.Status.String() { + log.Infof("update transaction %v to state %s", txResult.ID, txResult.Status.String()) + txData.StatusTimestamp = time.Now() + stTrans := txData.StatusTimestamp.Format("2006-01-02T15:04:05.000-07:00") + + ", " + txData.Status + ", " + txResult.Status.String() + txData.Status = txResult.Status.String() + txData.StateHistory = append(txData.StateHistory, stTrans) + + // Manage according to the state + statusConsolidated := txData.Status == types.MonitoredTxStatusSafe.String() || + txData.Status == types.MonitoredTxStatusFinalized.String() + if txData.Status == types.MonitoredTxStatusFailed.String() { + s.logFatalf("transaction %v result failed!") + } else if statusConsolidated && txData.ToBatch >= atomic.LoadUint64(&s.latestVirtualBatchNumber) { + s.latestVirtualTime = txData.StatusTimestamp + } + } + + // Update info received from L1 + txData.Nonce = txResult.Nonce + if txResult.To != nil { + txData.To = *txResult.To + } + if txResult.MinedAtBlockNumber != nil { + txData.MinedAtBlock = *txResult.MinedAtBlockNumber + } + s.copyTxData(txResult.ID, txResult.Data, txResult.Txs) +} + +// getResultAndUpdateEthTx updates the tx status from the ethTxManager +func (s *SequenceSender) getResultAndUpdateEthTx(ctx context.Context, txHash common.Hash) error { + txData, exists := s.ethTransactions[txHash] + if !exists { + s.logger.Errorf("transaction %v not found in memory", txHash) + return errors.New("transaction not found in memory structure") + } + + txResult, err := s.ethTxManager.Result(ctx, txHash) + switch { + case errors.Is(err, ethtxmanager.ErrNotFound): + s.logger.Infof("transaction %v does not exist in ethtxmanager. Marking it", txHash) + txData.OnMonitor = false + // Resend tx + errSend := s.sendTx(ctx, true, &txHash, nil, 0, 0, nil, txData.Gas) + if errSend == nil { + txData.OnMonitor = false + } + + case err != nil: + s.logger.Errorf("error getting result for tx %v: %v", txHash, err) + return err + + default: + s.updateEthTxResult(txData, txResult) + } + + return nil +} + +// loadSentSequencesTransactions loads the file into the memory structure +func (s *SequenceSender) loadSentSequencesTransactions() error { + // Check if file exists + if _, err := os.Stat(s.cfg.SequencesTxFileName); os.IsNotExist(err) { + log.Infof("file not found %s: %v", s.cfg.SequencesTxFileName, err) + return nil + } else if err != nil { + log.Errorf("error opening file %s: %v", s.cfg.SequencesTxFileName, err) + return err + } + + // Read file + data, err := os.ReadFile(s.cfg.SequencesTxFileName) + if err != nil { + log.Errorf("error reading file %s: %v", s.cfg.SequencesTxFileName, err) + return err + } + + // Restore memory structure + s.mutexEthTx.Lock() + err = json.Unmarshal(data, &s.ethTransactions) + s.mutexEthTx.Unlock() + if err != nil { + log.Errorf("error decoding data from %s: %v", s.cfg.SequencesTxFileName, err) + return err + } + + return nil +} + +// saveSentSequencesTransactions saves memory structure into persistent file +func (s *SequenceSender) saveSentSequencesTransactions(ctx context.Context) error { + var err error + + // Purge tx + s.purgeEthTx(ctx) + + // Create file + fileName := s.cfg.SequencesTxFileName[0:strings.IndexRune(s.cfg.SequencesTxFileName, '.')] + ".tmp" + s.sequencesTxFile, err = os.Create(fileName) + if err != nil { + log.Errorf("error creating file %s: %v", fileName, err) + return err + } + defer s.sequencesTxFile.Close() + + // Write data JSON encoded + encoder := json.NewEncoder(s.sequencesTxFile) + encoder.SetIndent("", " ") + s.mutexEthTx.Lock() + err = encoder.Encode(s.ethTransactions) + s.mutexEthTx.Unlock() + if err != nil { + log.Errorf("error writing file %s: %v", fileName, err) + return err + } + + // Rename the new file + err = os.Rename(fileName, s.cfg.SequencesTxFileName) + if err != nil { + log.Errorf("error renaming file %s to %s: %v", fileName, s.cfg.SequencesTxFileName, err) + return err + } + + return nil +} + +// IsStopped returns true in case seqSendingStopped is set to 1, otherwise false +func (s *SequenceSender) IsStopped() bool { + return atomic.LoadUint32(&s.seqSendingStopped) == 1 +} diff --git a/sequencesender/ethtx_test.go b/sequencesender/ethtx_test.go new file mode 100644 index 00000000..e890a4b9 --- /dev/null +++ b/sequencesender/ethtx_test.go @@ -0,0 +1,786 @@ +package sequencesender + +import ( + "context" + "encoding/json" + "errors" + "math/big" + "os" + "testing" + "time" + + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + ethtxtypes "github.com/0xPolygon/zkevm-ethtx-manager/types" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/mocks" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func Test_sendTx(t *testing.T) { + t.Parallel() + + addr := common.BytesToAddress([]byte{1, 2, 3}) + hash := common.HexToHash("0x1") + oldHash := common.HexToHash("0x2") + + type args struct { + resend bool + txOldHash *common.Hash + to *common.Address + fromBatch uint64 + toBatch uint64 + data []byte + gas uint64 + } + + type state struct { + currentNonce uint64 + ethTxData map[common.Hash][]byte + ethTransactions map[common.Hash]*ethTxData + latestSentToL1Batch uint64 + } + + tests := []struct { + name string + args args + state state + getEthTxManager func(t *testing.T) *mocks.EthTxManagerMock + expectedState state + expectedErr error + }{ + { + name: "successfully sent", + args: args{ + resend: false, + txOldHash: nil, + to: &addr, + fromBatch: 1, + toBatch: 2, + data: []byte("test"), + gas: 100500, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("AddWithGas", mock.Anything, &addr, big.NewInt(0), []byte("test"), uint64(0), mock.Anything, uint64(100500)).Return(hash, nil) + mngr.On("Result", mock.Anything, hash).Return(ethtxtypes.MonitoredTxResult{ + ID: hash, + Data: []byte{1, 2, 3}, + }, nil) + return mngr + }, + state: state{ + currentNonce: 10, + ethTxData: map[common.Hash][]byte{ + hash: {}, + }, + ethTransactions: map[common.Hash]*ethTxData{ + hash: {}, + }, + latestSentToL1Batch: 0, + }, + expectedState: state{ + currentNonce: 11, + ethTxData: map[common.Hash][]byte{ + hash: {1, 2, 3}, + }, + ethTransactions: map[common.Hash]*ethTxData{ + hash: { + SentL1Timestamp: now, + StatusTimestamp: now, + FromBatch: 1, + ToBatch: 2, + OnMonitor: true, + To: addr, + Gas: 100500, + StateHistory: []string{now.Format("2006-01-02T15:04:05.000-07:00") + ", *new, "}, + Txs: map[common.Hash]ethTxAdditionalData{}, + }, + }, + latestSentToL1Batch: 2, + }, + expectedErr: nil, + }, + { + name: "successfully sent with resend", + args: args{ + resend: true, + txOldHash: &oldHash, + gas: 100500, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("AddWithGas", mock.Anything, &addr, big.NewInt(0), []byte(nil), uint64(0), mock.Anything, uint64(100500)).Return(hash, nil) + mngr.On("Result", mock.Anything, hash).Return(ethtxtypes.MonitoredTxResult{ + ID: hash, + Data: []byte{1, 2, 3}, + }, nil) + return mngr + }, + state: state{ + ethTxData: map[common.Hash][]byte{ + hash: []byte("test"), + }, + ethTransactions: map[common.Hash]*ethTxData{ + oldHash: { + To: addr, + Nonce: 10, + FromBatch: 1, + ToBatch: 2, + }, + }, + latestSentToL1Batch: 0, + }, + expectedState: state{ + currentNonce: 0, + ethTxData: map[common.Hash][]byte{ + hash: {1, 2, 3}, + }, + ethTransactions: map[common.Hash]*ethTxData{ + hash: { + SentL1Timestamp: now, + StatusTimestamp: now, + FromBatch: 1, + ToBatch: 2, + OnMonitor: true, + To: addr, + Gas: 100500, + StateHistory: []string{now.Format("2006-01-02T15:04:05.000-07:00") + ", *new, "}, + Txs: map[common.Hash]ethTxAdditionalData{}, + }, + }, + latestSentToL1Batch: 0, + }, + expectedErr: nil, + }, + { + name: "add with gas returns error", + args: args{ + resend: true, + txOldHash: &oldHash, + gas: 100500, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("AddWithGas", mock.Anything, &addr, big.NewInt(0), []byte(nil), uint64(0), mock.Anything, uint64(100500)).Return(nil, errors.New("failed to add with gas")) + return mngr + }, + state: state{ + ethTxData: map[common.Hash][]byte{ + hash: []byte("test"), + }, + ethTransactions: map[common.Hash]*ethTxData{ + oldHash: { + To: addr, + Nonce: 10, + FromBatch: 1, + ToBatch: 2, + }, + }, + latestSentToL1Batch: 0, + }, + expectedErr: errors.New("failed to add with gas"), + }, + { + name: "empty old hash", + args: args{ + resend: true, + gas: 100500, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + return mngr + }, + state: state{ + ethTxData: map[common.Hash][]byte{ + hash: []byte("test"), + }, + ethTransactions: map[common.Hash]*ethTxData{ + oldHash: { + To: addr, + Nonce: 10, + FromBatch: 1, + ToBatch: 2, + }, + }, + latestSentToL1Batch: 0, + }, + expectedErr: errors.New("resend tx with nil hash monitor id"), + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + tmpFile, err := os.CreateTemp(os.TempDir(), tt.name+".tmp") + require.NoError(t, err) + defer os.RemoveAll(tmpFile.Name() + ".tmp") + + ss := SequenceSender{ + ethTxData: tt.state.ethTxData, + ethTransactions: tt.state.ethTransactions, + ethTxManager: tt.getEthTxManager(t), + latestSentToL1Batch: tt.state.latestSentToL1Batch, + cfg: Config{ + SequencesTxFileName: tmpFile.Name() + ".tmp", + }, + logger: log.GetDefaultLogger(), + } + + err = ss.sendTx(context.Background(), tt.args.resend, tt.args.txOldHash, tt.args.to, tt.args.fromBatch, tt.args.toBatch, tt.args.data, tt.args.gas) + if tt.expectedErr != nil { + require.Equal(t, tt.expectedErr, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedState.ethTxData, ss.ethTxData) + require.Equal(t, len(tt.expectedState.ethTransactions), len(ss.ethTransactions)) + for k, v := range tt.expectedState.ethTransactions { + require.Equal(t, v.Gas, ss.ethTransactions[k].Gas) + require.Equal(t, v.To, ss.ethTransactions[k].To) + require.Equal(t, v.Nonce, ss.ethTransactions[k].Nonce) + require.Equal(t, v.Status, ss.ethTransactions[k].Status) + require.Equal(t, v.FromBatch, ss.ethTransactions[k].FromBatch) + require.Equal(t, v.ToBatch, ss.ethTransactions[k].ToBatch) + require.Equal(t, v.OnMonitor, ss.ethTransactions[k].OnMonitor) + } + require.Equal(t, tt.expectedState.latestSentToL1Batch, ss.latestSentToL1Batch) + } + }) + } +} + +func Test_purgeEthTx(t *testing.T) { + t.Parallel() + + firstTimestamp := time.Now().Add(-time.Hour) + secondTimestamp := time.Now().Add(time.Hour) + + tests := []struct { + name string + seqSendingStopped uint32 + ethTransactions map[common.Hash]*ethTxData + ethTxData map[common.Hash][]byte + getEthTxManager func(t *testing.T) *mocks.EthTxManagerMock + sequenceList []uint64 + expectedEthTransactions map[common.Hash]*ethTxData + expectedEthTxData map[common.Hash][]byte + }{ + { + name: "sequence sender stopped", + seqSendingStopped: 1, + ethTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): { + StatusTimestamp: firstTimestamp, + OnMonitor: true, + Status: ethtxtypes.MonitoredTxStatusFinalized.String(), + }, + }, + ethTxData: map[common.Hash][]byte{ + common.HexToHash("0x1"): {1, 2, 3}, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + return mocks.NewEthTxManagerMock(t) + }, + sequenceList: []uint64{1, 2}, + expectedEthTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): { + StatusTimestamp: firstTimestamp, + OnMonitor: true, + Status: ethtxtypes.MonitoredTxStatusFinalized.String(), + }, + }, + expectedEthTxData: map[common.Hash][]byte{ + common.HexToHash("0x1"): {1, 2, 3}, + }, + }, + { + name: "transactions purged", + ethTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): { + StatusTimestamp: firstTimestamp, + OnMonitor: true, + Status: ethtxtypes.MonitoredTxStatusFinalized.String(), + }, + common.HexToHash("0x2"): { + StatusTimestamp: secondTimestamp, + }, + }, + ethTxData: map[common.Hash][]byte{ + common.HexToHash("0x1"): {1, 2, 3}, + common.HexToHash("0x2"): {4, 5, 6}, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("Remove", mock.Anything, common.HexToHash("0x1")).Return(nil) + return mngr + }, + sequenceList: []uint64{1, 2}, + expectedEthTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x2"): { + StatusTimestamp: secondTimestamp, + }, + }, + expectedEthTxData: map[common.Hash][]byte{ + common.HexToHash("0x2"): {4, 5, 6}, + }, + }, + { + name: "removed with error", + ethTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): { + StatusTimestamp: firstTimestamp, + OnMonitor: true, + Status: ethtxtypes.MonitoredTxStatusFinalized.String(), + }, + common.HexToHash("0x2"): { + StatusTimestamp: secondTimestamp, + }, + }, + ethTxData: map[common.Hash][]byte{ + common.HexToHash("0x1"): {1, 2, 3}, + common.HexToHash("0x2"): {4, 5, 6}, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("Remove", mock.Anything, common.HexToHash("0x1")).Return(errors.New("test err")) + return mngr + }, + sequenceList: []uint64{1, 2}, + expectedEthTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x2"): { + StatusTimestamp: secondTimestamp, + }, + }, + expectedEthTxData: map[common.Hash][]byte{ + common.HexToHash("0x2"): {4, 5, 6}, + }, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + mngr := tt.getEthTxManager(t) + ss := SequenceSender{ + seqSendingStopped: tt.seqSendingStopped, + ethTransactions: tt.ethTransactions, + ethTxData: tt.ethTxData, + ethTxManager: mngr, + logger: log.GetDefaultLogger(), + } + + ss.purgeEthTx(context.Background()) + + mngr.AssertExpectations(t) + require.Equal(t, tt.expectedEthTransactions, ss.ethTransactions) + require.Equal(t, tt.expectedEthTxData, ss.ethTxData) + }) + } +} + +func Test_syncEthTxResults(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + ethTransactions map[common.Hash]*ethTxData + getEthTxManager func(t *testing.T) *mocks.EthTxManagerMock + + expectErr error + expectPendingTxs uint64 + }{ + { + name: "successfully synced", + ethTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): { + StatusTimestamp: time.Now(), + OnMonitor: true, + Status: ethtxtypes.MonitoredTxStatusCreated.String(), + }, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("Result", mock.Anything, common.HexToHash("0x1")).Return(ethtxtypes.MonitoredTxResult{ + ID: common.HexToHash("0x1"), + Data: []byte{1, 2, 3}, + }, nil) + return mngr + }, + expectPendingTxs: 1, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + tmpFile, err := os.CreateTemp(os.TempDir(), tt.name) + require.NoError(t, err) + + mngr := tt.getEthTxManager(t) + ss := SequenceSender{ + ethTransactions: tt.ethTransactions, + ethTxManager: mngr, + ethTxData: make(map[common.Hash][]byte), + cfg: Config{ + SequencesTxFileName: tmpFile.Name() + ".tmp", + }, + logger: log.GetDefaultLogger(), + } + + pendingTxs, err := ss.syncEthTxResults(context.Background()) + if tt.expectErr != nil { + require.Equal(t, tt.expectErr, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectPendingTxs, pendingTxs) + } + + mngr.AssertExpectations(t) + + err = os.RemoveAll(tmpFile.Name() + ".tmp") + require.NoError(t, err) + }) + } +} + +func Test_syncAllEthTxResults(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + ethTransactions map[common.Hash]*ethTxData + getEthTxManager func(t *testing.T) *mocks.EthTxManagerMock + + expectErr error + expectPendingTxs uint64 + }{ + { + name: "successfully synced", + ethTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): { + StatusTimestamp: time.Now(), + OnMonitor: true, + Status: ethtxtypes.MonitoredTxStatusCreated.String(), + }, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("ResultsByStatus", mock.Anything, []ethtxtypes.MonitoredTxStatus(nil)).Return([]ethtxtypes.MonitoredTxResult{ + { + ID: common.HexToHash("0x1"), + Data: []byte{1, 2, 3}, + }, + }, nil) + return mngr + }, + expectPendingTxs: 1, + }, + { + name: "successfully synced with missing tx", + ethTransactions: map[common.Hash]*ethTxData{}, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("ResultsByStatus", mock.Anything, []ethtxtypes.MonitoredTxStatus(nil)).Return([]ethtxtypes.MonitoredTxResult{ + { + ID: common.HexToHash("0x1"), + Data: []byte{1, 2, 3}, + }, + }, nil) + return mngr + }, + expectPendingTxs: 1, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + tmpFile, err := os.CreateTemp(os.TempDir(), tt.name) + require.NoError(t, err) + + mngr := tt.getEthTxManager(t) + ss := SequenceSender{ + ethTransactions: tt.ethTransactions, + ethTxManager: mngr, + ethTxData: make(map[common.Hash][]byte), + cfg: Config{ + SequencesTxFileName: tmpFile.Name() + ".tmp", + }, + logger: log.GetDefaultLogger(), + } + + err = ss.syncAllEthTxResults(context.Background()) + if tt.expectErr != nil { + require.Equal(t, tt.expectErr, err) + } else { + require.NoError(t, err) + } + + mngr.AssertExpectations(t) + + err = os.RemoveAll(tmpFile.Name() + ".tmp") + require.NoError(t, err) + }) + } +} + +func Test_copyTxData(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + txHash common.Hash + txData []byte + txsResults map[common.Hash]ethtxtypes.TxResult + ethTxData map[common.Hash][]byte + ethTransactions map[common.Hash]*ethTxData + expectedRthTxData map[common.Hash][]byte + expectedEthTransactions map[common.Hash]*ethTxData + }{ + { + name: "successfully copied", + txHash: common.HexToHash("0x1"), + txData: []byte{1, 2, 3}, + txsResults: map[common.Hash]ethtxtypes.TxResult{ + common.HexToHash("0x1"): {}, + }, + ethTxData: map[common.Hash][]byte{ + common.HexToHash("0x1"): {0, 2, 3}, + }, + ethTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): {}, + }, + expectedRthTxData: map[common.Hash][]byte{ + common.HexToHash("0x1"): {1, 2, 3}, + }, + expectedEthTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): { + Txs: map[common.Hash]ethTxAdditionalData{ + common.HexToHash("0x1"): {}, + }, + }, + }, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + s := SequenceSender{ + ethTxData: tt.ethTxData, + ethTransactions: tt.ethTransactions, + } + + s.copyTxData(tt.txHash, tt.txData, tt.txsResults) + require.Equal(t, tt.expectedRthTxData, s.ethTxData) + require.Equal(t, tt.expectedEthTransactions, s.ethTransactions) + }) + } +} + +func Test_getResultAndUpdateEthTx(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + hash common.Hash + ethTransactions map[common.Hash]*ethTxData + ethTxData map[common.Hash][]byte + getEthTxManager func(t *testing.T) *mocks.EthTxManagerMock + expectedErr error + }{ + { + name: "successfully updated", + hash: common.HexToHash("0x1"), + ethTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): {}, + }, + ethTxData: map[common.Hash][]byte{ + common.HexToHash("0x1"): {}, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("Result", mock.Anything, common.HexToHash("0x1")).Return(ethtxtypes.MonitoredTxResult{ + ID: common.HexToHash("0x1"), + Data: []byte{1, 2, 3}, + }, nil) + return mngr + }, + expectedErr: nil, + }, + { + name: "not found", + hash: common.HexToHash("0x1"), + ethTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): { + Gas: 100500, + }, + }, + ethTxData: map[common.Hash][]byte{ + common.HexToHash("0x1"): {}, + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("Result", mock.Anything, common.HexToHash("0x1")).Return(ethtxtypes.MonitoredTxResult{}, ethtxmanager.ErrNotFound) + mngr.On("AddWithGas", mock.Anything, mock.Anything, big.NewInt(0), mock.Anything, mock.Anything, mock.Anything, uint64(100500)).Return(common.Hash{}, nil) + mngr.On("Result", mock.Anything, common.Hash{}).Return(ethtxtypes.MonitoredTxResult{ + ID: common.HexToHash("0x1"), + Data: []byte{1, 2, 3}, + }, nil) + return mngr + }, + expectedErr: nil, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + tmpFile, err := os.CreateTemp(os.TempDir(), tt.name+".tmp") + require.NoError(t, err) + defer os.RemoveAll(tmpFile.Name() + ".tmp") + + ss := SequenceSender{ + ethTransactions: tt.ethTransactions, + ethTxData: tt.ethTxData, + ethTxManager: tt.getEthTxManager(t), + cfg: Config{ + SequencesTxFileName: tmpFile.Name() + ".tmp", + }, + logger: log.GetDefaultLogger(), + } + + err = ss.getResultAndUpdateEthTx(context.Background(), tt.hash) + if tt.expectedErr != nil { + require.Equal(t, tt.expectedErr, err) + } else { + require.NoError(t, err) + } + }) + } +} + +func Test_loadSentSequencesTransactions(t *testing.T) { + t.Parallel() + + tx := ðTxData{ + FromBatch: 1, + ToBatch: 2, + OnMonitor: true, + To: common.BytesToAddress([]byte{1, 2, 3}), + Gas: 100500, + StateHistory: []string{"2021-09-01T15:04:05.000-07:00, *new, "}, + Txs: map[common.Hash]ethTxAdditionalData{}, + } + + tests := []struct { + name string + getFilename func(t *testing.T) string + expectEthTransactions map[common.Hash]*ethTxData + expectErr error + }{ + { + name: "successfully loaded", + getFilename: func(t *testing.T) string { + t.Helper() + + tmpFile, err := os.CreateTemp(os.TempDir(), "test") + require.NoError(t, err) + + ethTxDataBytes, err := json.Marshal(map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): tx, + }) + require.NoError(t, err) + + _, err = tmpFile.Write(ethTxDataBytes) + require.NoError(t, err) + + t.Cleanup(func() { + err := os.Remove(tmpFile.Name()) + require.NoError(t, err) + }) + + return tmpFile.Name() + }, + expectEthTransactions: map[common.Hash]*ethTxData{ + common.HexToHash("0x1"): tx, + }, + }, + { + name: "file does not exist", + getFilename: func(t *testing.T) string { + t.Helper() + + return "does not exist.tmp" + }, + expectEthTransactions: map[common.Hash]*ethTxData{}, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + s := SequenceSender{ + cfg: Config{ + SequencesTxFileName: tt.getFilename(t), + }, + ethTransactions: map[common.Hash]*ethTxData{}, + logger: log.GetDefaultLogger(), + } + + err := s.loadSentSequencesTransactions() + if tt.expectErr != nil { + require.Equal(t, tt.expectErr, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectEthTransactions, s.ethTransactions) + } + }) + } +} diff --git a/sequencesender/mocks/mock_etherman.go b/sequencesender/mocks/mock_etherman.go new file mode 100644 index 00000000..298d96c3 --- /dev/null +++ b/sequencesender/mocks/mock_etherman.go @@ -0,0 +1,271 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// EthermanMock is an autogenerated mock type for the Etherman type +type EthermanMock struct { + mock.Mock +} + +type EthermanMock_Expecter struct { + mock *mock.Mock +} + +func (_m *EthermanMock) EXPECT() *EthermanMock_Expecter { + return &EthermanMock_Expecter{mock: &_m.Mock} +} + +// CurrentNonce provides a mock function with given fields: ctx, address +func (_m *EthermanMock) CurrentNonce(ctx context.Context, address common.Address) (uint64, error) { + ret := _m.Called(ctx, address) + + if len(ret) == 0 { + panic("no return value specified for CurrentNonce") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) (uint64, error)); ok { + return rf(ctx, address) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) uint64); ok { + r0 = rf(ctx, address) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, address) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthermanMock_CurrentNonce_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CurrentNonce' +type EthermanMock_CurrentNonce_Call struct { + *mock.Call +} + +// CurrentNonce is a helper method to define mock.On call +// - ctx context.Context +// - address common.Address +func (_e *EthermanMock_Expecter) CurrentNonce(ctx interface{}, address interface{}) *EthermanMock_CurrentNonce_Call { + return &EthermanMock_CurrentNonce_Call{Call: _e.mock.On("CurrentNonce", ctx, address)} +} + +func (_c *EthermanMock_CurrentNonce_Call) Run(run func(ctx context.Context, address common.Address)) *EthermanMock_CurrentNonce_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *EthermanMock_CurrentNonce_Call) Return(_a0 uint64, _a1 error) *EthermanMock_CurrentNonce_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthermanMock_CurrentNonce_Call) RunAndReturn(run func(context.Context, common.Address) (uint64, error)) *EthermanMock_CurrentNonce_Call { + _c.Call.Return(run) + return _c +} + +// EstimateGas provides a mock function with given fields: ctx, from, to, value, data +func (_m *EthermanMock) EstimateGas(ctx context.Context, from common.Address, to *common.Address, value *big.Int, data []byte) (uint64, error) { + ret := _m.Called(ctx, from, to, value, data) + + if len(ret) == 0 { + panic("no return value specified for EstimateGas") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *common.Address, *big.Int, []byte) (uint64, error)); ok { + return rf(ctx, from, to, value, data) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *common.Address, *big.Int, []byte) uint64); ok { + r0 = rf(ctx, from, to, value, data) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, *common.Address, *big.Int, []byte) error); ok { + r1 = rf(ctx, from, to, value, data) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthermanMock_EstimateGas_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateGas' +type EthermanMock_EstimateGas_Call struct { + *mock.Call +} + +// EstimateGas is a helper method to define mock.On call +// - ctx context.Context +// - from common.Address +// - to *common.Address +// - value *big.Int +// - data []byte +func (_e *EthermanMock_Expecter) EstimateGas(ctx interface{}, from interface{}, to interface{}, value interface{}, data interface{}) *EthermanMock_EstimateGas_Call { + return &EthermanMock_EstimateGas_Call{Call: _e.mock.On("EstimateGas", ctx, from, to, value, data)} +} + +func (_c *EthermanMock_EstimateGas_Call) Run(run func(ctx context.Context, from common.Address, to *common.Address, value *big.Int, data []byte)) *EthermanMock_EstimateGas_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address), args[2].(*common.Address), args[3].(*big.Int), args[4].([]byte)) + }) + return _c +} + +func (_c *EthermanMock_EstimateGas_Call) Return(_a0 uint64, _a1 error) *EthermanMock_EstimateGas_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthermanMock_EstimateGas_Call) RunAndReturn(run func(context.Context, common.Address, *common.Address, *big.Int, []byte) (uint64, error)) *EthermanMock_EstimateGas_Call { + _c.Call.Return(run) + return _c +} + +// GetLatestBatchNumber provides a mock function with no fields +func (_m *EthermanMock) GetLatestBatchNumber() (uint64, error) { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for GetLatestBatchNumber") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func() (uint64, error)); ok { + return rf() + } + if rf, ok := ret.Get(0).(func() uint64); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func() error); ok { + r1 = rf() + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthermanMock_GetLatestBatchNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLatestBatchNumber' +type EthermanMock_GetLatestBatchNumber_Call struct { + *mock.Call +} + +// GetLatestBatchNumber is a helper method to define mock.On call +func (_e *EthermanMock_Expecter) GetLatestBatchNumber() *EthermanMock_GetLatestBatchNumber_Call { + return &EthermanMock_GetLatestBatchNumber_Call{Call: _e.mock.On("GetLatestBatchNumber")} +} + +func (_c *EthermanMock_GetLatestBatchNumber_Call) Run(run func()) *EthermanMock_GetLatestBatchNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EthermanMock_GetLatestBatchNumber_Call) Return(_a0 uint64, _a1 error) *EthermanMock_GetLatestBatchNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthermanMock_GetLatestBatchNumber_Call) RunAndReturn(run func() (uint64, error)) *EthermanMock_GetLatestBatchNumber_Call { + _c.Call.Return(run) + return _c +} + +// GetLatestBlockHeader provides a mock function with given fields: ctx +func (_m *EthermanMock) GetLatestBlockHeader(ctx context.Context) (*types.Header, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetLatestBlockHeader") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*types.Header, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *types.Header); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthermanMock_GetLatestBlockHeader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLatestBlockHeader' +type EthermanMock_GetLatestBlockHeader_Call struct { + *mock.Call +} + +// GetLatestBlockHeader is a helper method to define mock.On call +// - ctx context.Context +func (_e *EthermanMock_Expecter) GetLatestBlockHeader(ctx interface{}) *EthermanMock_GetLatestBlockHeader_Call { + return &EthermanMock_GetLatestBlockHeader_Call{Call: _e.mock.On("GetLatestBlockHeader", ctx)} +} + +func (_c *EthermanMock_GetLatestBlockHeader_Call) Run(run func(ctx context.Context)) *EthermanMock_GetLatestBlockHeader_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *EthermanMock_GetLatestBlockHeader_Call) Return(_a0 *types.Header, _a1 error) *EthermanMock_GetLatestBlockHeader_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthermanMock_GetLatestBlockHeader_Call) RunAndReturn(run func(context.Context) (*types.Header, error)) *EthermanMock_GetLatestBlockHeader_Call { + _c.Call.Return(run) + return _c +} + +// NewEthermanMock creates a new instance of EthermanMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthermanMock(t interface { + mock.TestingT + Cleanup(func()) +}) *EthermanMock { + mock := &EthermanMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/mocks/mock_ethtxmanager.go b/sequencesender/mocks/mock_ethtxmanager.go new file mode 100644 index 00000000..b8a58d0d --- /dev/null +++ b/sequencesender/mocks/mock_ethtxmanager.go @@ -0,0 +1,302 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" + + zkevm_ethtx_managertypes "github.com/0xPolygon/zkevm-ethtx-manager/types" +) + +// EthTxManagerMock is an autogenerated mock type for the EthTxManager type +type EthTxManagerMock struct { + mock.Mock +} + +type EthTxManagerMock_Expecter struct { + mock *mock.Mock +} + +func (_m *EthTxManagerMock) EXPECT() *EthTxManagerMock_Expecter { + return &EthTxManagerMock_Expecter{mock: &_m.Mock} +} + +// AddWithGas provides a mock function with given fields: ctx, to, value, data, gasOffset, sidecar, gas +func (_m *EthTxManagerMock) AddWithGas(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar, gas uint64) (common.Hash, error) { + ret := _m.Called(ctx, to, value, data, gasOffset, sidecar, gas) + + if len(ret) == 0 { + panic("no return value specified for AddWithGas") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar, uint64) (common.Hash, error)); ok { + return rf(ctx, to, value, data, gasOffset, sidecar, gas) + } + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar, uint64) common.Hash); ok { + r0 = rf(ctx, to, value, data, gasOffset, sidecar, gas) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar, uint64) error); ok { + r1 = rf(ctx, to, value, data, gasOffset, sidecar, gas) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerMock_AddWithGas_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddWithGas' +type EthTxManagerMock_AddWithGas_Call struct { + *mock.Call +} + +// AddWithGas is a helper method to define mock.On call +// - ctx context.Context +// - to *common.Address +// - value *big.Int +// - data []byte +// - gasOffset uint64 +// - sidecar *types.BlobTxSidecar +// - gas uint64 +func (_e *EthTxManagerMock_Expecter) AddWithGas(ctx interface{}, to interface{}, value interface{}, data interface{}, gasOffset interface{}, sidecar interface{}, gas interface{}) *EthTxManagerMock_AddWithGas_Call { + return &EthTxManagerMock_AddWithGas_Call{Call: _e.mock.On("AddWithGas", ctx, to, value, data, gasOffset, sidecar, gas)} +} + +func (_c *EthTxManagerMock_AddWithGas_Call) Run(run func(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar, gas uint64)) *EthTxManagerMock_AddWithGas_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*common.Address), args[2].(*big.Int), args[3].([]byte), args[4].(uint64), args[5].(*types.BlobTxSidecar), args[6].(uint64)) + }) + return _c +} + +func (_c *EthTxManagerMock_AddWithGas_Call) Return(_a0 common.Hash, _a1 error) *EthTxManagerMock_AddWithGas_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerMock_AddWithGas_Call) RunAndReturn(run func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar, uint64) (common.Hash, error)) *EthTxManagerMock_AddWithGas_Call { + _c.Call.Return(run) + return _c +} + +// Remove provides a mock function with given fields: ctx, hash +func (_m *EthTxManagerMock) Remove(ctx context.Context, hash common.Hash) error { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for Remove") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) error); ok { + r0 = rf(ctx, hash) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EthTxManagerMock_Remove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Remove' +type EthTxManagerMock_Remove_Call struct { + *mock.Call +} + +// Remove is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *EthTxManagerMock_Expecter) Remove(ctx interface{}, hash interface{}) *EthTxManagerMock_Remove_Call { + return &EthTxManagerMock_Remove_Call{Call: _e.mock.On("Remove", ctx, hash)} +} + +func (_c *EthTxManagerMock_Remove_Call) Run(run func(ctx context.Context, hash common.Hash)) *EthTxManagerMock_Remove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthTxManagerMock_Remove_Call) Return(_a0 error) *EthTxManagerMock_Remove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthTxManagerMock_Remove_Call) RunAndReturn(run func(context.Context, common.Hash) error) *EthTxManagerMock_Remove_Call { + _c.Call.Return(run) + return _c +} + +// Result provides a mock function with given fields: ctx, hash +func (_m *EthTxManagerMock) Result(ctx context.Context, hash common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for Result") + } + + var r0 zkevm_ethtx_managertypes.MonitoredTxResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) zkevm_ethtx_managertypes.MonitoredTxResult); ok { + r0 = rf(ctx, hash) + } else { + r0 = ret.Get(0).(zkevm_ethtx_managertypes.MonitoredTxResult) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerMock_Result_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Result' +type EthTxManagerMock_Result_Call struct { + *mock.Call +} + +// Result is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *EthTxManagerMock_Expecter) Result(ctx interface{}, hash interface{}) *EthTxManagerMock_Result_Call { + return &EthTxManagerMock_Result_Call{Call: _e.mock.On("Result", ctx, hash)} +} + +func (_c *EthTxManagerMock_Result_Call) Run(run func(ctx context.Context, hash common.Hash)) *EthTxManagerMock_Result_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthTxManagerMock_Result_Call) Return(_a0 zkevm_ethtx_managertypes.MonitoredTxResult, _a1 error) *EthTxManagerMock_Result_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerMock_Result_Call) RunAndReturn(run func(context.Context, common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error)) *EthTxManagerMock_Result_Call { + _c.Call.Return(run) + return _c +} + +// ResultsByStatus provides a mock function with given fields: ctx, status +func (_m *EthTxManagerMock) ResultsByStatus(ctx context.Context, status []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error) { + ret := _m.Called(ctx, status) + + if len(ret) == 0 { + panic("no return value specified for ResultsByStatus") + } + + var r0 []zkevm_ethtx_managertypes.MonitoredTxResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error)); ok { + return rf(ctx, status) + } + if rf, ok := ret.Get(0).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) []zkevm_ethtx_managertypes.MonitoredTxResult); ok { + r0 = rf(ctx, status) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]zkevm_ethtx_managertypes.MonitoredTxResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) error); ok { + r1 = rf(ctx, status) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerMock_ResultsByStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ResultsByStatus' +type EthTxManagerMock_ResultsByStatus_Call struct { + *mock.Call +} + +// ResultsByStatus is a helper method to define mock.On call +// - ctx context.Context +// - status []zkevm_ethtx_managertypes.MonitoredTxStatus +func (_e *EthTxManagerMock_Expecter) ResultsByStatus(ctx interface{}, status interface{}) *EthTxManagerMock_ResultsByStatus_Call { + return &EthTxManagerMock_ResultsByStatus_Call{Call: _e.mock.On("ResultsByStatus", ctx, status)} +} + +func (_c *EthTxManagerMock_ResultsByStatus_Call) Run(run func(ctx context.Context, status []zkevm_ethtx_managertypes.MonitoredTxStatus)) *EthTxManagerMock_ResultsByStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]zkevm_ethtx_managertypes.MonitoredTxStatus)) + }) + return _c +} + +func (_c *EthTxManagerMock_ResultsByStatus_Call) Return(_a0 []zkevm_ethtx_managertypes.MonitoredTxResult, _a1 error) *EthTxManagerMock_ResultsByStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerMock_ResultsByStatus_Call) RunAndReturn(run func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error)) *EthTxManagerMock_ResultsByStatus_Call { + _c.Call.Return(run) + return _c +} + +// Start provides a mock function with no fields +func (_m *EthTxManagerMock) Start() { + _m.Called() +} + +// EthTxManagerMock_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +type EthTxManagerMock_Start_Call struct { + *mock.Call +} + +// Start is a helper method to define mock.On call +func (_e *EthTxManagerMock_Expecter) Start() *EthTxManagerMock_Start_Call { + return &EthTxManagerMock_Start_Call{Call: _e.mock.On("Start")} +} + +func (_c *EthTxManagerMock_Start_Call) Run(run func()) *EthTxManagerMock_Start_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *EthTxManagerMock_Start_Call) Return() *EthTxManagerMock_Start_Call { + _c.Call.Return() + return _c +} + +func (_c *EthTxManagerMock_Start_Call) RunAndReturn(run func()) *EthTxManagerMock_Start_Call { + _c.Run(run) + return _c +} + +// NewEthTxManagerMock creates a new instance of EthTxManagerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthTxManagerMock(t interface { + mock.TestingT + Cleanup(func()) +}) *EthTxManagerMock { + mock := &EthTxManagerMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/mocks/mock_rpc.go b/sequencesender/mocks/mock_rpc.go new file mode 100644 index 00000000..8dd60588 --- /dev/null +++ b/sequencesender/mocks/mock_rpc.go @@ -0,0 +1,153 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks + +import ( + mock "github.com/stretchr/testify/mock" + + types "github.com/agglayer/aggkit/rpc/types" +) + +// RPCInterfaceMock is an autogenerated mock type for the RPCInterface type +type RPCInterfaceMock struct { + mock.Mock +} + +type RPCInterfaceMock_Expecter struct { + mock *mock.Mock +} + +func (_m *RPCInterfaceMock) EXPECT() *RPCInterfaceMock_Expecter { + return &RPCInterfaceMock_Expecter{mock: &_m.Mock} +} + +// GetBatch provides a mock function with given fields: batchNumber +func (_m *RPCInterfaceMock) GetBatch(batchNumber uint64) (*types.RPCBatch, error) { + ret := _m.Called(batchNumber) + + if len(ret) == 0 { + panic("no return value specified for GetBatch") + } + + var r0 *types.RPCBatch + var r1 error + if rf, ok := ret.Get(0).(func(uint64) (*types.RPCBatch, error)); ok { + return rf(batchNumber) + } + if rf, ok := ret.Get(0).(func(uint64) *types.RPCBatch); ok { + r0 = rf(batchNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.RPCBatch) + } + } + + if rf, ok := ret.Get(1).(func(uint64) error); ok { + r1 = rf(batchNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCInterfaceMock_GetBatch_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBatch' +type RPCInterfaceMock_GetBatch_Call struct { + *mock.Call +} + +// GetBatch is a helper method to define mock.On call +// - batchNumber uint64 +func (_e *RPCInterfaceMock_Expecter) GetBatch(batchNumber interface{}) *RPCInterfaceMock_GetBatch_Call { + return &RPCInterfaceMock_GetBatch_Call{Call: _e.mock.On("GetBatch", batchNumber)} +} + +func (_c *RPCInterfaceMock_GetBatch_Call) Run(run func(batchNumber uint64)) *RPCInterfaceMock_GetBatch_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64)) + }) + return _c +} + +func (_c *RPCInterfaceMock_GetBatch_Call) Return(_a0 *types.RPCBatch, _a1 error) *RPCInterfaceMock_GetBatch_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RPCInterfaceMock_GetBatch_Call) RunAndReturn(run func(uint64) (*types.RPCBatch, error)) *RPCInterfaceMock_GetBatch_Call { + _c.Call.Return(run) + return _c +} + +// GetWitness provides a mock function with given fields: batchNumber, fullWitness +func (_m *RPCInterfaceMock) GetWitness(batchNumber uint64, fullWitness bool) ([]byte, error) { + ret := _m.Called(batchNumber, fullWitness) + + if len(ret) == 0 { + panic("no return value specified for GetWitness") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(uint64, bool) ([]byte, error)); ok { + return rf(batchNumber, fullWitness) + } + if rf, ok := ret.Get(0).(func(uint64, bool) []byte); ok { + r0 = rf(batchNumber, fullWitness) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(uint64, bool) error); ok { + r1 = rf(batchNumber, fullWitness) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RPCInterfaceMock_GetWitness_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWitness' +type RPCInterfaceMock_GetWitness_Call struct { + *mock.Call +} + +// GetWitness is a helper method to define mock.On call +// - batchNumber uint64 +// - fullWitness bool +func (_e *RPCInterfaceMock_Expecter) GetWitness(batchNumber interface{}, fullWitness interface{}) *RPCInterfaceMock_GetWitness_Call { + return &RPCInterfaceMock_GetWitness_Call{Call: _e.mock.On("GetWitness", batchNumber, fullWitness)} +} + +func (_c *RPCInterfaceMock_GetWitness_Call) Run(run func(batchNumber uint64, fullWitness bool)) *RPCInterfaceMock_GetWitness_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(uint64), args[1].(bool)) + }) + return _c +} + +func (_c *RPCInterfaceMock_GetWitness_Call) Return(_a0 []byte, _a1 error) *RPCInterfaceMock_GetWitness_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RPCInterfaceMock_GetWitness_Call) RunAndReturn(run func(uint64, bool) ([]byte, error)) *RPCInterfaceMock_GetWitness_Call { + _c.Call.Return(run) + return _c +} + +// NewRPCInterfaceMock creates a new instance of RPCInterfaceMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRPCInterfaceMock(t interface { + mock.TestingT + Cleanup(func()) +}) *RPCInterfaceMock { + mock := &RPCInterfaceMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/mocks/mock_txbuilder.go b/sequencesender/mocks/mock_txbuilder.go new file mode 100644 index 00000000..5bb152b8 --- /dev/null +++ b/sequencesender/mocks/mock_txbuilder.go @@ -0,0 +1,367 @@ +// Code generated by mockery v2.40.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + datastream "github.com/agglayer/aggkit/state/datastream" + + mock "github.com/stretchr/testify/mock" + + seqsendertypes "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + + txbuilder "github.com/agglayer/aggkit/sequencesender/txbuilder" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// TxBuilderMock is an autogenerated mock type for the TxBuilder type +type TxBuilderMock struct { + mock.Mock +} + +type TxBuilderMock_Expecter struct { + mock *mock.Mock +} + +func (_m *TxBuilderMock) EXPECT() *TxBuilderMock_Expecter { + return &TxBuilderMock_Expecter{mock: &_m.Mock} +} + +// BuildSequenceBatchesTx provides a mock function with given fields: ctx, sequences +func (_m *TxBuilderMock) BuildSequenceBatchesTx(ctx context.Context, sequences seqsendertypes.Sequence) (*types.Transaction, error) { + ret := _m.Called(ctx, sequences) + + if len(ret) == 0 { + panic("no return value specified for BuildSequenceBatchesTx") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, seqsendertypes.Sequence) (*types.Transaction, error)); ok { + return rf(ctx, sequences) + } + if rf, ok := ret.Get(0).(func(context.Context, seqsendertypes.Sequence) *types.Transaction); ok { + r0 = rf(ctx, sequences) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, seqsendertypes.Sequence) error); ok { + r1 = rf(ctx, sequences) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxBuilderMock_BuildSequenceBatchesTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BuildSequenceBatchesTx' +type TxBuilderMock_BuildSequenceBatchesTx_Call struct { + *mock.Call +} + +// BuildSequenceBatchesTx is a helper method to define mock.On call +// - ctx context.Context +// - sequences seqsendertypes.Sequence +func (_e *TxBuilderMock_Expecter) BuildSequenceBatchesTx(ctx interface{}, sequences interface{}) *TxBuilderMock_BuildSequenceBatchesTx_Call { + return &TxBuilderMock_BuildSequenceBatchesTx_Call{Call: _e.mock.On("BuildSequenceBatchesTx", ctx, sequences)} +} + +func (_c *TxBuilderMock_BuildSequenceBatchesTx_Call) Run(run func(ctx context.Context, sequences seqsendertypes.Sequence)) *TxBuilderMock_BuildSequenceBatchesTx_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(seqsendertypes.Sequence)) + }) + return _c +} + +func (_c *TxBuilderMock_BuildSequenceBatchesTx_Call) Return(_a0 *types.Transaction, _a1 error) *TxBuilderMock_BuildSequenceBatchesTx_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxBuilderMock_BuildSequenceBatchesTx_Call) RunAndReturn(run func(context.Context, seqsendertypes.Sequence) (*types.Transaction, error)) *TxBuilderMock_BuildSequenceBatchesTx_Call { + _c.Call.Return(run) + return _c +} + +// NewBatchFromL2Block provides a mock function with given fields: l2Block +func (_m *TxBuilderMock) NewBatchFromL2Block(l2Block *datastream.L2Block) seqsendertypes.Batch { + ret := _m.Called(l2Block) + + if len(ret) == 0 { + panic("no return value specified for NewBatchFromL2Block") + } + + var r0 seqsendertypes.Batch + if rf, ok := ret.Get(0).(func(*datastream.L2Block) seqsendertypes.Batch); ok { + r0 = rf(l2Block) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(seqsendertypes.Batch) + } + } + + return r0 +} + +// TxBuilderMock_NewBatchFromL2Block_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewBatchFromL2Block' +type TxBuilderMock_NewBatchFromL2Block_Call struct { + *mock.Call +} + +// NewBatchFromL2Block is a helper method to define mock.On call +// - l2Block *datastream.L2Block +func (_e *TxBuilderMock_Expecter) NewBatchFromL2Block(l2Block interface{}) *TxBuilderMock_NewBatchFromL2Block_Call { + return &TxBuilderMock_NewBatchFromL2Block_Call{Call: _e.mock.On("NewBatchFromL2Block", l2Block)} +} + +func (_c *TxBuilderMock_NewBatchFromL2Block_Call) Run(run func(l2Block *datastream.L2Block)) *TxBuilderMock_NewBatchFromL2Block_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*datastream.L2Block)) + }) + return _c +} + +func (_c *TxBuilderMock_NewBatchFromL2Block_Call) Return(_a0 seqsendertypes.Batch) *TxBuilderMock_NewBatchFromL2Block_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxBuilderMock_NewBatchFromL2Block_Call) RunAndReturn(run func(*datastream.L2Block) seqsendertypes.Batch) *TxBuilderMock_NewBatchFromL2Block_Call { + _c.Call.Return(run) + return _c +} + +// NewSequence provides a mock function with given fields: ctx, batches, coinbase +func (_m *TxBuilderMock) NewSequence(ctx context.Context, batches []seqsendertypes.Batch, coinbase common.Address) (seqsendertypes.Sequence, error) { + ret := _m.Called(ctx, batches, coinbase) + + if len(ret) == 0 { + panic("no return value specified for NewSequence") + } + + var r0 seqsendertypes.Sequence + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []seqsendertypes.Batch, common.Address) (seqsendertypes.Sequence, error)); ok { + return rf(ctx, batches, coinbase) + } + if rf, ok := ret.Get(0).(func(context.Context, []seqsendertypes.Batch, common.Address) seqsendertypes.Sequence); ok { + r0 = rf(ctx, batches, coinbase) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(seqsendertypes.Sequence) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []seqsendertypes.Batch, common.Address) error); ok { + r1 = rf(ctx, batches, coinbase) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxBuilderMock_NewSequence_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewSequence' +type TxBuilderMock_NewSequence_Call struct { + *mock.Call +} + +// NewSequence is a helper method to define mock.On call +// - ctx context.Context +// - batches []seqsendertypes.Batch +// - coinbase common.Address +func (_e *TxBuilderMock_Expecter) NewSequence(ctx interface{}, batches interface{}, coinbase interface{}) *TxBuilderMock_NewSequence_Call { + return &TxBuilderMock_NewSequence_Call{Call: _e.mock.On("NewSequence", ctx, batches, coinbase)} +} + +func (_c *TxBuilderMock_NewSequence_Call) Run(run func(ctx context.Context, batches []seqsendertypes.Batch, coinbase common.Address)) *TxBuilderMock_NewSequence_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]seqsendertypes.Batch), args[2].(common.Address)) + }) + return _c +} + +func (_c *TxBuilderMock_NewSequence_Call) Return(_a0 seqsendertypes.Sequence, _a1 error) *TxBuilderMock_NewSequence_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxBuilderMock_NewSequence_Call) RunAndReturn(run func(context.Context, []seqsendertypes.Batch, common.Address) (seqsendertypes.Sequence, error)) *TxBuilderMock_NewSequence_Call { + _c.Call.Return(run) + return _c +} + +// NewSequenceIfWorthToSend provides a mock function with given fields: ctx, sequenceBatches, l2Coinbase, batchNumber +func (_m *TxBuilderMock) NewSequenceIfWorthToSend(ctx context.Context, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, batchNumber uint64) (seqsendertypes.Sequence, error) { + ret := _m.Called(ctx, sequenceBatches, l2Coinbase, batchNumber) + + if len(ret) == 0 { + panic("no return value specified for NewSequenceIfWorthToSend") + } + + var r0 seqsendertypes.Sequence + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []seqsendertypes.Batch, common.Address, uint64) (seqsendertypes.Sequence, error)); ok { + return rf(ctx, sequenceBatches, l2Coinbase, batchNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, []seqsendertypes.Batch, common.Address, uint64) seqsendertypes.Sequence); ok { + r0 = rf(ctx, sequenceBatches, l2Coinbase, batchNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(seqsendertypes.Sequence) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []seqsendertypes.Batch, common.Address, uint64) error); ok { + r1 = rf(ctx, sequenceBatches, l2Coinbase, batchNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxBuilderMock_NewSequenceIfWorthToSend_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewSequenceIfWorthToSend' +type TxBuilderMock_NewSequenceIfWorthToSend_Call struct { + *mock.Call +} + +// NewSequenceIfWorthToSend is a helper method to define mock.On call +// - ctx context.Context +// - sequenceBatches []seqsendertypes.Batch +// - l2Coinbase common.Address +// - batchNumber uint64 +func (_e *TxBuilderMock_Expecter) NewSequenceIfWorthToSend(ctx interface{}, sequenceBatches interface{}, l2Coinbase interface{}, batchNumber interface{}) *TxBuilderMock_NewSequenceIfWorthToSend_Call { + return &TxBuilderMock_NewSequenceIfWorthToSend_Call{Call: _e.mock.On("NewSequenceIfWorthToSend", ctx, sequenceBatches, l2Coinbase, batchNumber)} +} + +func (_c *TxBuilderMock_NewSequenceIfWorthToSend_Call) Run(run func(ctx context.Context, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, batchNumber uint64)) *TxBuilderMock_NewSequenceIfWorthToSend_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]seqsendertypes.Batch), args[2].(common.Address), args[3].(uint64)) + }) + return _c +} + +func (_c *TxBuilderMock_NewSequenceIfWorthToSend_Call) Return(_a0 seqsendertypes.Sequence, _a1 error) *TxBuilderMock_NewSequenceIfWorthToSend_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxBuilderMock_NewSequenceIfWorthToSend_Call) RunAndReturn(run func(context.Context, []seqsendertypes.Batch, common.Address, uint64) (seqsendertypes.Sequence, error)) *TxBuilderMock_NewSequenceIfWorthToSend_Call { + _c.Call.Return(run) + return _c +} + +// SetCondNewSeq provides a mock function with given fields: cond +func (_m *TxBuilderMock) SetCondNewSeq(cond txbuilder.CondNewSequence) txbuilder.CondNewSequence { + ret := _m.Called(cond) + + if len(ret) == 0 { + panic("no return value specified for SetCondNewSeq") + } + + var r0 txbuilder.CondNewSequence + if rf, ok := ret.Get(0).(func(txbuilder.CondNewSequence) txbuilder.CondNewSequence); ok { + r0 = rf(cond) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(txbuilder.CondNewSequence) + } + } + + return r0 +} + +// TxBuilderMock_SetCondNewSeq_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCondNewSeq' +type TxBuilderMock_SetCondNewSeq_Call struct { + *mock.Call +} + +// SetCondNewSeq is a helper method to define mock.On call +// - cond txbuilder.CondNewSequence +func (_e *TxBuilderMock_Expecter) SetCondNewSeq(cond interface{}) *TxBuilderMock_SetCondNewSeq_Call { + return &TxBuilderMock_SetCondNewSeq_Call{Call: _e.mock.On("SetCondNewSeq", cond)} +} + +func (_c *TxBuilderMock_SetCondNewSeq_Call) Run(run func(cond txbuilder.CondNewSequence)) *TxBuilderMock_SetCondNewSeq_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(txbuilder.CondNewSequence)) + }) + return _c +} + +func (_c *TxBuilderMock_SetCondNewSeq_Call) Return(_a0 txbuilder.CondNewSequence) *TxBuilderMock_SetCondNewSeq_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxBuilderMock_SetCondNewSeq_Call) RunAndReturn(run func(txbuilder.CondNewSequence) txbuilder.CondNewSequence) *TxBuilderMock_SetCondNewSeq_Call { + _c.Call.Return(run) + return _c +} + +// String provides a mock function with given fields: +func (_m *TxBuilderMock) String() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for String") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// TxBuilderMock_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String' +type TxBuilderMock_String_Call struct { + *mock.Call +} + +// String is a helper method to define mock.On call +func (_e *TxBuilderMock_Expecter) String() *TxBuilderMock_String_Call { + return &TxBuilderMock_String_Call{Call: _e.mock.On("String")} +} + +func (_c *TxBuilderMock_String_Call) Run(run func()) *TxBuilderMock_String_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *TxBuilderMock_String_Call) Return(_a0 string) *TxBuilderMock_String_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxBuilderMock_String_Call) RunAndReturn(run func() string) *TxBuilderMock_String_Call { + _c.Call.Return(run) + return _c +} + +// NewTxBuilderMock creates a new instance of TxBuilderMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTxBuilderMock(t interface { + mock.TestingT + Cleanup(func()) +}) *TxBuilderMock { + mock := &TxBuilderMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/seqsendertypes/types.go b/sequencesender/seqsendertypes/types.go new file mode 100644 index 00000000..5d903dc5 --- /dev/null +++ b/sequencesender/seqsendertypes/types.go @@ -0,0 +1,43 @@ +package seqsendertypes + +import ( + "github.com/ethereum/go-ethereum/common" +) + +type Batch interface { + // underlyingType *ethmantypes.Batch + DeepCopy() Batch + LastCoinbase() common.Address + ForcedBatchTimestamp() uint64 + ForcedGlobalExitRoot() common.Hash + ForcedBlockHashL1() common.Hash + L2Data() []byte + LastL2BLockTimestamp() uint64 + BatchNumber() uint64 + GlobalExitRoot() common.Hash + L1InfoTreeIndex() uint32 + + String() string + + // WRITE + SetL2Data(data []byte) + SetLastCoinbase(address common.Address) + SetLastL2BLockTimestamp(ts uint64) + SetL1InfoTreeIndex(index uint32) +} + +type Sequence interface { + IndexL1InfoRoot() uint32 + MaxSequenceTimestamp() uint64 + L1InfoRoot() common.Hash + Batches() []Batch + FirstBatch() Batch + LastBatch() Batch + Len() int + L2Coinbase() common.Address + LastVirtualBatchNumber() uint64 + + String() string + // WRITE + SetLastVirtualBatchNumber(batchNumber uint64) +} diff --git a/sequencesender/sequencesender.go b/sequencesender/sequencesender.go new file mode 100644 index 00000000..e6644121 --- /dev/null +++ b/sequencesender/sequencesender.go @@ -0,0 +1,556 @@ +package sequencesender + +import ( + "context" + "errors" + "fmt" + "math/big" + "os" + "sync" + "sync/atomic" + "time" + + "github.com/0xPolygon/zkevm-ethtx-manager/ethtxmanager" + ethtxlog "github.com/0xPolygon/zkevm-ethtx-manager/log" + ethtxtypes "github.com/0xPolygon/zkevm-ethtx-manager/types" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/rpc" + "github.com/agglayer/aggkit/rpc/types" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/state" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" +) + +const ten = 10 + +// EthTxManager represents the eth tx manager interface +type EthTxManager interface { + Start() + AddWithGas( + ctx context.Context, + to *common.Address, + value *big.Int, + data []byte, + gasOffset uint64, + sidecar *ethtypes.BlobTxSidecar, + gas uint64, + ) (common.Hash, error) + Remove(ctx context.Context, hash common.Hash) error + ResultsByStatus(ctx context.Context, status []ethtxtypes.MonitoredTxStatus) ([]ethtxtypes.MonitoredTxResult, error) + Result(ctx context.Context, hash common.Hash) (ethtxtypes.MonitoredTxResult, error) +} + +// Etherman represents the etherman behaviour +type Etherman interface { + CurrentNonce(ctx context.Context, address common.Address) (uint64, error) + GetLatestBlockHeader(ctx context.Context) (*ethtypes.Header, error) + EstimateGas(ctx context.Context, from common.Address, to *common.Address, value *big.Int, data []byte) (uint64, error) + GetLatestBatchNumber() (uint64, error) +} + +// RPCInterface represents the RPC interface +type RPCInterface interface { + GetBatch(batchNumber uint64) (*types.RPCBatch, error) + GetWitness(batchNumber uint64, fullWitness bool) ([]byte, error) +} + +// SequenceSender represents a sequence sender +type SequenceSender struct { + cfg Config + logger *log.Logger + ethTxManager EthTxManager + etherman Etherman + latestVirtualBatchNumber uint64 // Latest virtualized batch obtained from L1 + latestVirtualTime time.Time // Latest virtual batch timestamp + latestSentToL1Batch uint64 // Latest batch sent to L1 + sequenceList []uint64 // Sequence of batch number to be send to L1 + sequenceData map[uint64]*sequenceData // All the batch data indexed by batch number + mutexSequence sync.Mutex // Mutex to access sequenceData and sequenceList + ethTransactions map[common.Hash]*ethTxData // All the eth tx sent to L1 indexed by hash + ethTxData map[common.Hash][]byte // Tx data send to or received from L1 + mutexEthTx sync.Mutex // Mutex to access ethTransactions + sequencesTxFile *os.File // Persistence of sent transactions + validStream bool // Not valid while receiving data before the desired batch + seqSendingStopped uint32 // If there is a critical error + TxBuilder txbuilder.TxBuilder + rpcClient RPCInterface +} + +type sequenceData struct { + batchClosed bool + batch seqsendertypes.Batch + batchRaw *state.BatchRawV2 +} + +// New inits sequence sender +func New(cfg Config, logger *log.Logger, + etherman *etherman.Client, txBuilder txbuilder.TxBuilder) (*SequenceSender, error) { + // Create sequencesender + s := SequenceSender{ + cfg: cfg, + logger: logger, + etherman: etherman, + ethTransactions: make(map[common.Hash]*ethTxData), + ethTxData: make(map[common.Hash][]byte), + sequenceData: make(map[uint64]*sequenceData), + validStream: false, + TxBuilder: txBuilder, + rpcClient: rpc.NewBatchEndpoints(cfg.RPCURL), + } + + logger.Infof("TxBuilder configuration: %s", txBuilder.String()) + + // Restore pending sent sequences + err := s.loadSentSequencesTransactions() + if err != nil { + s.logger.Fatalf("error restoring sent sequences from file", err) + return nil, err + } + + // Create ethtxmanager client + cfg.EthTxManager.Log = ethtxlog.Config{ + Environment: ethtxlog.LogEnvironment(cfg.Log.Environment), + Level: cfg.Log.Level, + Outputs: cfg.Log.Outputs, + } + + s.ethTxManager, err = ethtxmanager.New(cfg.EthTxManager) + if err != nil { + s.logger.Fatalf("error creating ethtxmanager client: %v", err) + return nil, err + } + + return &s, nil +} + +// Start starts the sequence sender +func (s *SequenceSender) Start(ctx context.Context) { + // Start ethtxmanager client + go s.ethTxManager.Start() + + // Get latest virtual state batch from L1 + err := s.updateLatestVirtualBatch() + if err != nil { + s.logger.Fatalf("error getting latest sequenced batch, error: %v", err) + } + + // Sync all monitored sent L1 tx + err = s.syncAllEthTxResults(ctx) + if err != nil { + s.logger.Fatalf("failed to sync monitored tx results, error: %v", err) + } + + // Current batch to sequence + atomic.StoreUint64(&s.latestSentToL1Batch, atomic.LoadUint64(&s.latestVirtualBatchNumber)) + + // Start retrieving batches from RPC + go func() { + err := s.batchRetrieval(ctx) + if err != nil { + s.logFatalf("error retrieving batches from RPC: %v", err) + } + }() + + // Start sequence sending + go s.sequenceSending(ctx) +} + +// batchRetrieval keeps reading batches from the RPC +func (s *SequenceSender) batchRetrieval(ctx context.Context) error { + ticker := time.NewTicker(s.cfg.GetBatchWaitInterval.Duration) + defer ticker.Stop() + + currentBatchNumber := atomic.LoadUint64(&s.latestVirtualBatchNumber) + 1 + for { + select { + case <-ctx.Done(): + s.logger.Info("context cancelled, stopping batch retrieval") + return ctx.Err() + default: + // Try to retrieve batch from RPC + rpcBatch, err := s.rpcClient.GetBatch(currentBatchNumber) + if err != nil { + if errors.Is(err, ethtxmanager.ErrNotFound) { + s.logger.Infof("batch %d not found in RPC", currentBatchNumber) + } else { + s.logger.Errorf("error getting batch %d from RPC: %v", currentBatchNumber, err) + } + <-ticker.C + continue + } + + // Check if the batch is closed + if !rpcBatch.IsClosed() { + s.logger.Infof("batch %d is not closed yet", currentBatchNumber) + <-ticker.C + continue + } + + // Process and decode the batch + if err := s.populateSequenceData(rpcBatch, currentBatchNumber); err != nil { + return err + } + + // Increment the batch number for the next iteration + currentBatchNumber++ + } + } +} + +func (s *SequenceSender) populateSequenceData(rpcBatch *types.RPCBatch, batchNumber uint64) error { + s.mutexSequence.Lock() + defer s.mutexSequence.Unlock() + + s.sequenceList = append(s.sequenceList, batchNumber) + + // Decode batch to retrieve the l1 info tree index + batchRaw, err := state.DecodeBatchV2(rpcBatch.L2Data()) + if err != nil { + s.logger.Errorf("Failed to decode batch data for batch %d, err: %v", batchNumber, err) + return err + } + + if len(batchRaw.Blocks) > 0 { + rpcBatch.SetL1InfoTreeIndex(batchRaw.Blocks[len(batchRaw.Blocks)-1].IndexL1InfoTree) + } + + s.sequenceData[batchNumber] = &sequenceData{ + batchClosed: rpcBatch.IsClosed(), + batch: rpcBatch, + batchRaw: batchRaw, + } + + return nil +} + +// sequenceSending starts loop to check if there are sequences to send and sends them if it's convenient +func (s *SequenceSender) sequenceSending(ctx context.Context) { + // Create a ticker that fires every WaitPeriodSendSequence + ticker := time.NewTicker(s.cfg.WaitPeriodSendSequence.Duration) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + s.logger.Info("context canceled, stopping sequence sending") + return + + case <-ticker.C: + // Trigger the sequence sending when the ticker fires + s.tryToSendSequence(ctx) + } + } +} + +// purgeSequences purges batches from memory structures +func (s *SequenceSender) purgeSequences() { + // If sequence sending is stopped, do not purge + if s.IsStopped() { + return + } + + // Purge the information of batches that are already virtualized + s.mutexSequence.Lock() + defer s.mutexSequence.Unlock() + truncateUntil := 0 + toPurge := make([]uint64, 0) + for i, batchNumber := range s.sequenceList { + if batchNumber <= atomic.LoadUint64(&s.latestVirtualBatchNumber) { + truncateUntil = i + 1 + toPurge = append(toPurge, batchNumber) + } + } + + if len(toPurge) > 0 { + s.sequenceList = s.sequenceList[truncateUntil:] + + firstPurged := toPurge[0] + lastPurged := toPurge[len(toPurge)-1] + for _, batchNum := range toPurge { + delete(s.sequenceData, batchNum) + } + s.logger.Infof("batches purged count: %d, fromBatch: %d, toBatch: %d", len(toPurge), firstPurged, lastPurged) + } +} + +// tryToSendSequence checks if there is a sequence and it's worth it to send to L1 +func (s *SequenceSender) tryToSendSequence(ctx context.Context) { + // Update latest virtual batch + s.logger.Infof("updating virtual batch") + err := s.updateLatestVirtualBatch() + if err != nil { + return + } + + // Check if the sequence sending is stopped + if s.IsStopped() { + s.logger.Warnf("sending is stopped!") + return + } + + // Update state of transactions + s.logger.Infof("updating tx results") + pendingTxsCount, err := s.syncEthTxResults(ctx) + if err != nil { + return + } + + // Check if reached the maximum number of pending transactions + if pendingTxsCount >= s.cfg.MaxPendingTx { + s.logger.Infof("max number of pending txs (%d) reached. Waiting for some to be completed", pendingTxsCount) + return + } + + // Check if should send sequence to L1 + s.logger.Infof("getting sequences to send") + sequence, err := s.getSequencesToSend(ctx) + if err != nil || sequence == nil || sequence.Len() == 0 { + if err != nil { + s.logger.Errorf("error getting sequences: %v", err) + } + return + } + + // Send sequences to L1 + firstBatch := sequence.FirstBatch() + lastBatch := sequence.LastBatch() + + s.logger.Debugf(sequence.String()) + s.logger.Infof("sending sequences to L1. From batch %d to batch %d", firstBatch.BatchNumber(), lastBatch.BatchNumber()) + + // Wait until last L1 block timestamp is L1BlockTimestampMargin seconds above the timestamp + // of the last L2 block in the sequence + timeMargin := int64(s.cfg.L1BlockTimestampMargin.Seconds()) + + err = s.waitForMargin(ctx, lastBatch, timeMargin, "L1 block block timestamp", + func() (uint64, error) { + lastL1BlockHeader, err := s.etherman.GetLatestBlockHeader(ctx) + if err != nil { + return 0, err + } + + return lastL1BlockHeader.Time, nil + }) + if err != nil { + s.logger.Errorf("error waiting for L1 block time margin: %v", err) + return + } + + // Sanity check: Wait until the current time is also L1BlockTimestampMargin seconds above the last L2 block timestamp + err = s.waitForMargin(ctx, lastBatch, timeMargin, "current time", + func() (uint64, error) { return uint64(time.Now().Unix()), nil }) + if err != nil { + s.logger.Errorf("error waiting for current time margin: %v", err) + return + } + + // Send sequences to L1 + s.logger.Debugf(sequence.String()) + s.logger.Infof("sending sequences to L1. From batch %d to batch %d", firstBatch.BatchNumber(), lastBatch.BatchNumber()) + + tx, err := s.TxBuilder.BuildSequenceBatchesTx(ctx, sequence) + if err != nil { + s.logger.Errorf("error building sequenceBatches tx: %v", err) + return + } + + // Get latest virtual state batch from L1 + err = s.updateLatestVirtualBatch() + if err != nil { + s.logger.Fatalf("error getting latest sequenced batch, error: %v", err) + } + + sequence.SetLastVirtualBatchNumber(atomic.LoadUint64(&s.latestVirtualBatchNumber)) + + gas, err := s.etherman.EstimateGas(ctx, s.cfg.SenderAddress, tx.To(), nil, tx.Data()) + if err != nil { + s.logger.Errorf("error estimating gas: ", err) + return + } + + // Add sequence tx + err = s.sendTx(ctx, false, nil, tx.To(), firstBatch.BatchNumber(), lastBatch.BatchNumber(), tx.Data(), gas) + if err != nil { + return + } + + // Purge sequences data from memory + s.purgeSequences() +} + +// waitForMargin ensures that the time difference between the last L2 block and the current +// timestamp exceeds the time margin before proceeding. It checks immediately, and if not +// satisfied, it waits using a ticker and rechecks periodically. +// +// Params: +// - ctx: Context to handle cancellation. +// - lastBatch: The last batch in the sequence. +// - timeMargin: Required time difference in seconds. +// - description: A description for logging purposes. +// - getTimeFn: Function to get the current time (e.g., L1 block time or current time). +func (s *SequenceSender) waitForMargin(ctx context.Context, lastBatch seqsendertypes.Batch, + timeMargin int64, description string, getTimeFn func() (uint64, error)) error { + referentTime, err := getTimeFn() + if err != nil { + return err + } + + lastL2BlockTimestamp := lastBatch.LastL2BLockTimestamp() + elapsed, waitTime := marginTimeElapsed(lastL2BlockTimestamp, referentTime, timeMargin) + if elapsed { + s.logger.Infof("time difference for %s exceeds %d seconds, proceeding (batch number: %d, last l2 block ts: %d)", + description, timeMargin, lastBatch.BatchNumber(), lastL2BlockTimestamp) + return nil + } + + s.logger.Infof("waiting %d seconds for %s, margin less than %d seconds (batch number: %d, last l2 block ts: %d)", + waitTime, description, timeMargin, lastBatch.BatchNumber(), lastL2BlockTimestamp) + ticker := time.NewTicker(time.Duration(waitTime) * time.Second) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + s.logger.Infof("context canceled during %s wait (batch number: %d, last l2 block ts: %d)", + description, lastBatch.BatchNumber(), lastL2BlockTimestamp) + return ctx.Err() + + case <-ticker.C: + referentTime, err = getTimeFn() + if err != nil { + return err + } + + elapsed, waitTime = marginTimeElapsed(lastL2BlockTimestamp, referentTime, timeMargin) + if elapsed { + s.logger.Infof("time margin for %s now exceeds %d seconds, proceeding (batch number: %d, last l2 block ts: %d)", + description, timeMargin, lastBatch.BatchNumber(), lastL2BlockTimestamp) + return nil + } + + s.logger.Infof( + "waiting another %d seconds for %s, margin still less than %d seconds (batch number: %d, last l2 block ts: %d)", + waitTime, description, timeMargin, lastBatch.BatchNumber(), lastL2BlockTimestamp) + ticker.Reset(time.Duration(waitTime) * time.Second) + } + } +} + +func (s *SequenceSender) getSequencesToSend(ctx context.Context) (seqsendertypes.Sequence, error) { + // Add sequences until too big for a single L1 tx or last batch is reached + s.mutexSequence.Lock() + defer s.mutexSequence.Unlock() + var prevCoinbase common.Address + sequenceBatches := make([]seqsendertypes.Batch, 0) + for _, batchNumber := range s.sequenceList { + if batchNumber <= atomic.LoadUint64(&s.latestVirtualBatchNumber) || + batchNumber <= atomic.LoadUint64(&s.latestSentToL1Batch) { + continue + } + + // Check if the next batch belongs to a new forkid, in this case we need to stop sequencing as we need to + // wait the upgrade of forkid is completed and s.cfg.NumBatchForkIdUpgrade is disabled (=0) again + if s.cfg.ForkUpgradeBatchNumber != 0 && batchNumber == (s.cfg.ForkUpgradeBatchNumber+1) { + return nil, fmt.Errorf( + "aborting sequencing process as we reached the batch %d where a new forkid is applied (upgrade)", + s.cfg.ForkUpgradeBatchNumber+1, + ) + } + + // New potential batch to add to the sequence + batch := s.sequenceData[batchNumber].batch.DeepCopy() + + // If the coinbase changes, the sequence ends here + if len(sequenceBatches) > 0 && batch.LastCoinbase() != prevCoinbase { + s.logger.Infof( + "batch with different coinbase (batch %v, sequence %v), sequence will be sent to this point", + prevCoinbase, batch.LastCoinbase, + ) + return s.TxBuilder.NewSequence(ctx, sequenceBatches, s.cfg.L2Coinbase) + } + prevCoinbase = batch.LastCoinbase() + + // Add new sequence batch + sequenceBatches = append(sequenceBatches, batch) + + newSeq, err := s.TxBuilder.NewSequenceIfWorthToSend(ctx, sequenceBatches, s.cfg.L2Coinbase, batchNumber) + if err != nil { + return nil, err + } + if newSeq != nil { + return newSeq, nil + } + + // Check if the current batch is the last before a change to a new forkid + // In this case we need to close and send the sequence to L1 + if s.cfg.ForkUpgradeBatchNumber != 0 && batchNumber == s.cfg.ForkUpgradeBatchNumber { + s.logger.Infof("sequence should be sent to L1, as we have reached the batch %d "+ + "from which a new forkid is applied (upgrade)", + s.cfg.ForkUpgradeBatchNumber, + ) + return s.TxBuilder.NewSequence(ctx, sequenceBatches, s.cfg.L2Coinbase) + } + } + + // Reached the latest batch. Decide if it's worth to send the sequence, or wait for new batches + if len(sequenceBatches) == 0 { + s.logger.Infof("no batches to be sequenced") + return nil, nil + } + + if s.latestVirtualTime.Before(time.Now().Add(-s.cfg.LastBatchVirtualizationTimeMaxWaitPeriod.Duration)) { + s.logger.Infof("sequence should be sent, too much time without sending anything to L1") + return s.TxBuilder.NewSequence(ctx, sequenceBatches, s.cfg.L2Coinbase) + } + + s.logger.Infof("not enough time has passed since last batch was virtualized and the sequence could be bigger") + return nil, nil +} + +// updateLatestVirtualBatch queries the value in L1 and updates the latest virtual batch field +func (s *SequenceSender) updateLatestVirtualBatch() error { + // Get latest virtual state batch from L1 + latestVirtualBatchNumber, err := s.etherman.GetLatestBatchNumber() + if err != nil { + s.logger.Errorf("error getting latest virtual batch, error: %v", err) + return errors.New("fail to get latest virtual batch") + } + + atomic.StoreUint64(&s.latestVirtualBatchNumber, latestVirtualBatchNumber) + s.logger.Infof("latest virtual batch is %d", latestVirtualBatchNumber) + + return nil +} + +// logFatalf logs error, activates flag to stop sequencing, and remains in an infinite loop +func (s *SequenceSender) logFatalf(template string, args ...interface{}) { + atomic.StoreUint32(&s.seqSendingStopped, 1) + for { + s.logger.Errorf(template, args...) + s.logger.Errorf("sequence sending stopped.") + time.Sleep(ten * time.Second) + } +} + +// marginTimeElapsed checks if the time between currentTime and l2BlockTimestamp is greater than timeMargin. +// If it's greater returns true, otherwise it returns false and the waitTime needed to achieve this timeMargin +func marginTimeElapsed(l2BlockTimestamp uint64, currentTime uint64, timeMargin int64) (bool, int64) { + if int64(l2BlockTimestamp)-timeMargin > int64(currentTime) { + return true, 0 + } + + timeDiff := int64(currentTime) - int64(l2BlockTimestamp) + + // If the difference is less than the required margin, return false and calculate the remaining wait time + if timeDiff < timeMargin { + // Calculate the wait time needed to reach the timeMargin + waitTime := timeMargin - timeDiff + return false, waitTime + } + + // Time difference is greater than or equal to timeMargin, no need to wait + return true, 0 +} diff --git a/sequencesender/sequencesender_test.go b/sequencesender/sequencesender_test.go new file mode 100644 index 00000000..27072b1d --- /dev/null +++ b/sequencesender/sequencesender_test.go @@ -0,0 +1,619 @@ +package sequencesender + +import ( + "errors" + "math/big" + "os" + "testing" + "time" + + ethtxtypes "github.com/0xPolygon/zkevm-ethtx-manager/types" + types2 "github.com/agglayer/aggkit/config/types" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + rpctypes "github.com/agglayer/aggkit/rpc/types" + "github.com/agglayer/aggkit/sequencesender/mocks" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/state" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + "golang.org/x/net/context" +) + +const ( + txStreamEncoded1 = "f86508843b9aca0082520894617b3a3528f9cdd6630fd3301b9c8911f7bf063d0a808207f5a0579b72a1c1ffdd845fba45317540982109298e2ec8d67ddf2cdaf22e80903677a01831e9a01291c7ea246742a5b5a543ca6938bfc3f6958c22be06fad99274e4ac" + txStreamEncoded2 = "f86509843b9aca0082520894617b3a3528f9cdd6630fd3301b9c8911f7bf063d0a808207f5a0908a522075e09485166ffa7630cd2b7013897fa1f1238013677d6f0a86efb3d2a0068b12435fcdc8ee254f3b1df8c5b29ed691eeee6065704f061130935976ca99" + txStreamEncoded3 = "b8b402f8b101268505d21dba0085076c363d8982dc60941929761e87667283f087ea9ab8370c174681b4e980b844095ea7b300000000000000000000000080a64c6d7f12c47b7c66c5b4e20e72bc1fcd5d9effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc001a0dd4db494969139a120e8721842455ec13f82757a4fc49b66d447c7d32d095a1da06ef54068a9aa67ecc4f52d885299a04feb6f3531cdfc771f1412cd3331d1ba4c" +) + +var ( + now = time.Now() +) + +func TestMain(t *testing.M) { + t.Run() +} + +func Test_encoding(t *testing.T) { + tx1, err := state.DecodeTx(txStreamEncoded1) + require.NoError(t, err) + tx2, err := state.DecodeTx(txStreamEncoded2) + require.NoError(t, err) + tx3, err := state.DecodeTx(txStreamEncoded3) + require.NoError(t, err) + + txTest := state.L2TxRaw{ + EfficiencyPercentage: 129, + TxAlreadyEncoded: false, + Tx: tx1, + } + txTestEncoded := make([]byte, 0) + txTestEncoded, err = txTest.Encode(txTestEncoded) + require.NoError(t, err) + log.Debugf("%s", common.Bytes2Hex(txTestEncoded)) + + batch := state.BatchRawV2{ + Blocks: []state.L2BlockRaw{ + { + ChangeL2BlockHeader: state.ChangeL2BlockHeader{ + DeltaTimestamp: 3633752, + IndexL1InfoTree: 0, + }, + Transactions: []state.L2TxRaw{ + { + EfficiencyPercentage: 129, + TxAlreadyEncoded: false, + Tx: tx1, + }, + { + EfficiencyPercentage: 97, + TxAlreadyEncoded: false, + Tx: tx2, + }, + { + EfficiencyPercentage: 97, + TxAlreadyEncoded: false, + Tx: tx3, + }, + }, + }, + }, + } + + encodedBatch, err := state.EncodeBatchV2(&batch) + require.NoError(t, err) + + decodedBatch, err := state.DecodeBatchV2(encodedBatch) + require.NoError(t, err) + + require.Equal(t, batch.String(), decodedBatch.String()) +} + +func Test_Start(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + getEthTxManager func(t *testing.T) *mocks.EthTxManagerMock + getEtherman func(t *testing.T) *mocks.EthermanMock + getRPC func(t *testing.T) *mocks.RPCInterfaceMock + batchWaitDuration types2.Duration + expectNonce uint64 + expectLastVirtualBatch uint64 + expectFromStreamBatch uint64 + expectWipBatch uint64 + expectLatestSentToL1Batch uint64 + }{ + { + name: "successfully started", + getEtherman: func(t *testing.T) *mocks.EthermanMock { + t.Helper() + + mngr := mocks.NewEthermanMock(t) + mngr.On("GetLatestBatchNumber").Return(uint64(1), nil) + return mngr + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("Start").Return(nil) + mngr.On("ResultsByStatus", mock.Anything, []ethtxtypes.MonitoredTxStatus(nil)).Return(nil, nil) + return mngr + }, + getRPC: func(t *testing.T) *mocks.RPCInterfaceMock { + t.Helper() + + mngr := mocks.NewRPCInterfaceMock(t) + mngr.On("GetBatch", mock.Anything).Return(&rpctypes.RPCBatch{}, nil) + return mngr + }, + + batchWaitDuration: types2.NewDuration(time.Millisecond), + expectNonce: 3, + expectLastVirtualBatch: 1, + expectFromStreamBatch: 1, + expectWipBatch: 2, + expectLatestSentToL1Batch: 1, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + tmpFile, err := os.CreateTemp(os.TempDir(), tt.name+".tmp") + require.NoError(t, err) + defer os.RemoveAll(tmpFile.Name() + ".tmp") + + s := SequenceSender{ + etherman: tt.getEtherman(t), + ethTxManager: tt.getEthTxManager(t), + cfg: Config{ + SequencesTxFileName: tmpFile.Name() + ".tmp", + GetBatchWaitInterval: tt.batchWaitDuration, + WaitPeriodSendSequence: types2.NewDuration(1 * time.Millisecond), + }, + logger: log.GetDefaultLogger(), + rpcClient: tt.getRPC(t), + } + + ctx, cancel := context.WithCancel(context.Background()) + s.Start(ctx) + time.Sleep(time.Second) + cancel() + time.Sleep(time.Second) + + require.Equal(t, tt.expectLatestSentToL1Batch, s.latestSentToL1Batch) + }) + } +} + +func Test_purgeSequences(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + seqSendingStopped uint32 + sequenceList []uint64 + sequenceData map[uint64]*sequenceData + latestVirtualBatchNumber uint64 + expectedSequenceList []uint64 + expectedSequenceData map[uint64]*sequenceData + }{ + { + name: "sequences purged when seqSendingStopped", + seqSendingStopped: 1, + sequenceList: []uint64{1, 2}, + sequenceData: map[uint64]*sequenceData{ + 1: {}, + 2: {}, + }, + expectedSequenceList: []uint64{1, 2}, + expectedSequenceData: map[uint64]*sequenceData{ + 1: {}, + 2: {}, + }, + }, + { + name: "no sequences purged", + seqSendingStopped: 0, + sequenceList: []uint64{4, 5}, + sequenceData: map[uint64]*sequenceData{ + 4: {}, + 5: {}, + }, + expectedSequenceList: []uint64{4, 5}, + expectedSequenceData: map[uint64]*sequenceData{ + 4: {}, + 5: {}, + }, + }, + { + name: "sequences purged", + seqSendingStopped: 0, + sequenceList: []uint64{4, 5, 6}, + sequenceData: map[uint64]*sequenceData{ + 4: {}, + 5: {}, + 6: {}, + }, + latestVirtualBatchNumber: 5, + expectedSequenceList: []uint64{6}, + expectedSequenceData: map[uint64]*sequenceData{ + 6: {}, + }, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ss := SequenceSender{ + seqSendingStopped: tt.seqSendingStopped, + sequenceList: tt.sequenceList, + sequenceData: tt.sequenceData, + latestVirtualBatchNumber: tt.latestVirtualBatchNumber, + logger: log.GetDefaultLogger(), + } + + ss.purgeSequences() + + require.Equal(t, tt.expectedSequenceList, ss.sequenceList) + require.Equal(t, tt.expectedSequenceData, ss.sequenceData) + }) + } +} + +func Test_tryToSendSequence(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + getEthTxManager func(t *testing.T) *mocks.EthTxManagerMock + getEtherman func(t *testing.T) *mocks.EthermanMock + getTxBuilder func(t *testing.T) *mocks.TxBuilderMock + maxPendingTxn uint64 + sequenceList []uint64 + latestSentToL1Batch uint64 + sequenceData map[uint64]*sequenceData + ethTransactions map[common.Hash]*ethTxData + ethTxData map[common.Hash][]byte + + expectErr error + }{ + { + name: "successfully sent", + getEtherman: func(t *testing.T) *mocks.EthermanMock { + t.Helper() + + mngr := mocks.NewEthermanMock(t) + mngr.On("GetLatestBatchNumber").Return(uint64(1), nil) + return mngr + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + return mngr + }, + getTxBuilder: func(t *testing.T) *mocks.TxBuilderMock { + t.Helper() + + mngr := mocks.NewTxBuilderMock(t) + mngr.On("NewSequenceIfWorthToSend", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(txbuilder.NewBananaSequence(etherman.SequenceBanana{}), nil) + return mngr + }, + maxPendingTxn: 10, + sequenceList: []uint64{2}, + latestSentToL1Batch: 1, + sequenceData: map[uint64]*sequenceData{ + 2: { + batchClosed: true, + batch: txbuilder.NewBananaBatch(ðerman.Batch{}), + }, + }, + }, + { + name: "successfully sent new sequence", + getEtherman: func(t *testing.T) *mocks.EthermanMock { + t.Helper() + + mngr := mocks.NewEthermanMock(t) + mngr.On("GetLatestBatchNumber").Return(uint64(1), nil) + mngr.On("GetLatestBlockHeader", mock.Anything).Return(&types.Header{ + Number: big.NewInt(1), + }, nil) + mngr.On("EstimateGas", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(uint64(100500), nil) + return mngr + }, + getEthTxManager: func(t *testing.T) *mocks.EthTxManagerMock { + t.Helper() + + mngr := mocks.NewEthTxManagerMock(t) + mngr.On("AddWithGas", mock.Anything, mock.Anything, big.NewInt(0), mock.Anything, mock.Anything, mock.Anything, uint64(100500)).Return(common.Hash{}, nil) + mngr.On("Result", mock.Anything, common.Hash{}).Return(ethtxtypes.MonitoredTxResult{ + ID: common.Hash{}, + Data: []byte{1, 2, 3}, + }, nil) + return mngr + }, + getTxBuilder: func(t *testing.T) *mocks.TxBuilderMock { + t.Helper() + + mngr := mocks.NewTxBuilderMock(t) + mngr.On("NewSequenceIfWorthToSend", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil) + mngr.On("NewSequence", mock.Anything, mock.Anything, mock.Anything).Return(txbuilder.NewBananaSequence(etherman.SequenceBanana{ + Batches: []etherman.Batch{{ + BatchNumber: 2, + }}, + }), nil) + mngr.On("BuildSequenceBatchesTx", mock.Anything, mock.Anything).Return(types.NewTx(&types.LegacyTx{}), nil) + return mngr + }, + maxPendingTxn: 10, + sequenceList: []uint64{2}, + latestSentToL1Batch: 1, + sequenceData: map[uint64]*sequenceData{ + 2: { + batchClosed: true, + batch: txbuilder.NewBananaBatch(ðerman.Batch{}), + }, + }, + ethTransactions: map[common.Hash]*ethTxData{}, + ethTxData: map[common.Hash][]byte{}, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + tmpFile, err := os.CreateTemp(os.TempDir(), tt.name+".tmp") + require.NoError(t, err) + defer os.RemoveAll(tmpFile.Name() + ".tmp") + + s := SequenceSender{ + ethTxManager: tt.getEthTxManager(t), + etherman: tt.getEtherman(t), + TxBuilder: tt.getTxBuilder(t), + cfg: Config{ + SequencesTxFileName: tmpFile.Name() + ".tmp", + MaxPendingTx: tt.maxPendingTxn, + WaitPeriodSendSequence: types2.NewDuration(time.Millisecond), + }, + sequenceList: tt.sequenceList, + latestSentToL1Batch: tt.latestSentToL1Batch, + sequenceData: tt.sequenceData, + ethTransactions: tt.ethTransactions, + ethTxData: tt.ethTxData, + logger: log.GetDefaultLogger(), + } + + s.tryToSendSequence(context.Background()) + }) + } +} + +func Test_getSequencesToSend(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + sequenceList []uint64 + latestSentToL1Batch uint64 + forkUpgradeBatchNumber uint64 + sequenceData map[uint64]*sequenceData + getTxBuilder func(t *testing.T) *mocks.TxBuilderMock + expectedSequence seqsendertypes.Sequence + expectedErr error + }{ + { + name: "successfully get sequence", + sequenceList: []uint64{2}, + latestSentToL1Batch: 1, + sequenceData: map[uint64]*sequenceData{ + 2: { + batchClosed: true, + batch: txbuilder.NewBananaBatch(ðerman.Batch{}), + }, + }, + getTxBuilder: func(t *testing.T) *mocks.TxBuilderMock { + t.Helper() + + mngr := mocks.NewTxBuilderMock(t) + mngr.On("NewSequenceIfWorthToSend", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(txbuilder.NewBananaSequence(etherman.SequenceBanana{ + Batches: []etherman.Batch{{ + BatchNumber: 2, + }}, + }), nil) + return mngr + }, + expectedSequence: txbuilder.NewBananaSequence(etherman.SequenceBanana{ + Batches: []etherman.Batch{{ + BatchNumber: 2, + }}, + }), + expectedErr: nil, + }, + { + name: "different coinbase", + sequenceList: []uint64{2, 3}, + latestSentToL1Batch: 1, + sequenceData: map[uint64]*sequenceData{ + 2: { + batchClosed: true, + batch: txbuilder.NewBananaBatch(ðerman.Batch{}), + }, + 3: { + batchClosed: true, + batch: txbuilder.NewBananaBatch(ðerman.Batch{ + LastCoinbase: common.HexToAddress("0x2"), + }), + }, + }, + getTxBuilder: func(t *testing.T) *mocks.TxBuilderMock { + t.Helper() + + mngr := mocks.NewTxBuilderMock(t) + mngr.On("NewSequenceIfWorthToSend", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil) + mngr.On("NewSequence", mock.Anything, mock.Anything, mock.Anything).Return(txbuilder.NewBananaSequence(etherman.SequenceBanana{ + Batches: []etherman.Batch{{ + BatchNumber: 2, + }}, + }), nil) + return mngr + }, + expectedSequence: txbuilder.NewBananaSequence(etherman.SequenceBanana{ + Batches: []etherman.Batch{{ + BatchNumber: 2, + }}, + }), + expectedErr: nil, + }, + { + name: "NewSequenceIfWorthToSend return error", + sequenceList: []uint64{2}, + latestSentToL1Batch: 1, + sequenceData: map[uint64]*sequenceData{ + 2: { + batchClosed: true, + batch: txbuilder.NewBananaBatch(ðerman.Batch{}), + }, + }, + getTxBuilder: func(t *testing.T) *mocks.TxBuilderMock { + t.Helper() + + mngr := mocks.NewTxBuilderMock(t) + mngr.On("NewSequenceIfWorthToSend", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("test error")) + return mngr + }, + expectedErr: errors.New("test error"), + }, + { + name: "fork upgrade", + sequenceList: []uint64{2}, + latestSentToL1Batch: 1, + forkUpgradeBatchNumber: 2, + sequenceData: map[uint64]*sequenceData{ + 2: { + batchClosed: true, + batch: txbuilder.NewBananaBatch(ðerman.Batch{}), + }, + }, + getTxBuilder: func(t *testing.T) *mocks.TxBuilderMock { + t.Helper() + + mngr := mocks.NewTxBuilderMock(t) + mngr.On("NewSequenceIfWorthToSend", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil) + mngr.On("NewSequence", mock.Anything, mock.Anything, mock.Anything).Return(txbuilder.NewBananaSequence(etherman.SequenceBanana{ + Batches: []etherman.Batch{{ + BatchNumber: 2, + }}, + }), nil) + return mngr + }, + expectedSequence: txbuilder.NewBananaSequence(etherman.SequenceBanana{ + Batches: []etherman.Batch{{ + BatchNumber: 2, + }}, + }), + expectedErr: nil, + }, + { + name: "fork upgrade passed", + sequenceList: []uint64{2}, + latestSentToL1Batch: 1, + forkUpgradeBatchNumber: 1, + sequenceData: map[uint64]*sequenceData{ + 2: { + batchClosed: true, + batch: txbuilder.NewBananaBatch(ðerman.Batch{}), + }, + }, + getTxBuilder: func(t *testing.T) *mocks.TxBuilderMock { + t.Helper() + + mngr := mocks.NewTxBuilderMock(t) + return mngr + }, + expectedErr: errors.New("aborting sequencing process as we reached the batch 2 where a new forkid is applied (upgrade)"), + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + ss := SequenceSender{ + sequenceList: tt.sequenceList, + latestSentToL1Batch: tt.latestSentToL1Batch, + cfg: Config{ + ForkUpgradeBatchNumber: tt.forkUpgradeBatchNumber, + }, + sequenceData: tt.sequenceData, + TxBuilder: tt.getTxBuilder(t), + logger: log.GetDefaultLogger(), + } + + sequence, err := ss.getSequencesToSend(context.Background()) + if tt.expectedErr != nil { + require.Equal(t, tt.expectedErr, err) + } else { + require.NoError(t, err) + require.Equal(t, tt.expectedSequence, sequence) + } + }) + } +} + +func Test_marginTimeElapsed(t *testing.T) { + t.Parallel() + + type args struct { + l2BlockTimestamp uint64 + currentTime uint64 + timeMargin int64 + } + tests := []struct { + name string + args args + expectedIsElapsed bool + expectedWaitTime int64 + }{ + { + name: "time elapsed", + args: args{ + l2BlockTimestamp: 100, + currentTime: 200, + timeMargin: 50, + }, + expectedIsElapsed: true, + expectedWaitTime: 0, + }, + { + name: "time not elapsed", + args: args{ + l2BlockTimestamp: 100, + currentTime: 200, + timeMargin: 150, + }, + expectedIsElapsed: false, + expectedWaitTime: 50, + }, + { + name: "l2 block in the future (time margin not enough)", + args: args{ + l2BlockTimestamp: 300, + currentTime: 200, + timeMargin: 50, + }, + expectedIsElapsed: true, + expectedWaitTime: 0, + }, + } + + for _, tt := range tests { + tt := tt + + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + isElapsed, waitTime := marginTimeElapsed(tt.args.l2BlockTimestamp, tt.args.currentTime, tt.args.timeMargin) + require.Equal(t, tt.expectedIsElapsed, isElapsed, "marginTimeElapsed() isElapsed = %t, want %t", isElapsed, tt.expectedIsElapsed) + require.Equal(t, tt.expectedWaitTime, waitTime, "marginTimeElapsed() got1 = %v, want %v", waitTime, tt.expectedWaitTime) + }) + } +} diff --git a/sequencesender/txbuilder/banana_base.go b/sequencesender/txbuilder/banana_base.go new file mode 100644 index 00000000..67374415 --- /dev/null +++ b/sequencesender/txbuilder/banana_base.go @@ -0,0 +1,247 @@ +package txbuilder + +import ( + "context" + "errors" + "fmt" + "math/big" + + aggkitcommon "github.com/agglayer/aggkit/common" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +type rollupBananaBaseContractor interface { + LastAccInputHash(opts *bind.CallOpts) ([32]byte, error) +} + +type globalExitRootBananaContractor interface { + L1InfoRootMap(opts *bind.CallOpts, index uint32) ([32]byte, error) + String() string +} + +type l1InfoSyncer interface { + GetLatestInfoUntilBlock(ctx context.Context, blockNum uint64) (*l1infotreesync.L1InfoTreeLeaf, error) + GetInitL1InfoRootMap(ctx context.Context) (*l1infotreesync.L1InfoTreeInitial, error) +} + +type l1Client interface { + HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) +} + +type TxBuilderBananaBase struct { + logger *log.Logger + rollupContract rollupBananaBaseContractor + globalExitRootContract globalExitRootBananaContractor + l1InfoTree l1InfoSyncer + ethClient l1Client + blockFinality *big.Int + opts bind.TransactOpts +} + +func NewTxBuilderBananaBase( + logger *log.Logger, + rollupContract rollupBananaBaseContractor, + gerContract globalExitRootBananaContractor, + l1InfoTree l1InfoSyncer, + ethClient l1Client, + blockFinality *big.Int, + opts bind.TransactOpts, +) *TxBuilderBananaBase { + return &TxBuilderBananaBase{ + logger: logger, + rollupContract: rollupContract, + globalExitRootContract: gerContract, + l1InfoTree: l1InfoTree, + ethClient: ethClient, + blockFinality: blockFinality, + opts: opts, + } +} + +func (t *TxBuilderBananaBase) NewBatchFromL2Block(l2Block *datastream.L2Block) seqsendertypes.Batch { + batch := ðerman.Batch{ + LastL2BLockTimestamp: l2Block.Timestamp, + BatchNumber: l2Block.BatchNumber, + L1InfoTreeIndex: l2Block.L1InfotreeIndex, + LastCoinbase: common.BytesToAddress(l2Block.Coinbase), + GlobalExitRoot: common.BytesToHash(l2Block.GlobalExitRoot), + } + return NewBananaBatch(batch) +} + +func getHighestL1InfoIndex(batches []etherman.Batch) uint32 { + var highestL1Index uint32 + for _, b := range batches { + if highestL1Index < b.L1InfoTreeIndex { + highestL1Index = b.L1InfoTreeIndex + } + } + return highestL1Index +} + +// Returns CounterL1InfoRoot to use for this batch +func (t *TxBuilderBananaBase) GetCounterL1InfoRoot(ctx context.Context, highestL1IndexInBatch uint32) (uint32, error) { + header, err := t.ethClient.HeaderByNumber(ctx, t.blockFinality) + if err != nil { + return 0, fmt.Errorf("error calling HeaderByNumber, with block finality %d: %w", t.blockFinality.Int64(), err) + } + var resL1InfoCounter uint32 + + info, err := t.l1InfoTree.GetLatestInfoUntilBlock(ctx, header.Number.Uint64()) + if err == nil { + resL1InfoCounter = info.L1InfoTreeIndex + 1 + } + if errors.Is(err, l1infotreesync.ErrNotFound) { + // There are no L1 Info tree leaves yet, so we can try to use L1InfoRootMap event + l1infotreeInitial, err := t.l1InfoTree.GetInitL1InfoRootMap(ctx) + if l1infotreeInitial == nil || err != nil { + return 0, fmt.Errorf("error no leaves on L1InfoTree yet and GetInitL1InfoRootMap fails: %w", err) + } + // We use this leaf as first one + resL1InfoCounter = l1infotreeInitial.LeafCount + } else if err != nil { + return 0, fmt.Errorf("error calling GetLatestInfoUntilBlock with block num %d: %w", header.Number.Uint64(), err) + } + // special case: there are no leaves in L1InfoTree yet + if resL1InfoCounter == 0 && highestL1IndexInBatch == 0 { + log.Infof("No L1 Info tree leaves yet, batch use no leaf") + return resL1InfoCounter, nil + } + if resL1InfoCounter > highestL1IndexInBatch { + return resL1InfoCounter, nil + } + + return 0, fmt.Errorf( + "sequence contained an L1 Info tree index (%d) that is greater than the one synced with the desired finality (%d)", + highestL1IndexInBatch, resL1InfoCounter, + ) +} + +func (t *TxBuilderBananaBase) CheckL1InfoTreeLeafCounterVsInitL1InfoMap(ctx context.Context, leafCounter uint32) error { + l1infotreeInitial, err := t.l1InfoTree.GetInitL1InfoRootMap(ctx) + if err != nil { + return fmt.Errorf("l1InfoTree.GetInitL1InfoRootMap fails: %w", err) + } + if l1infotreeInitial == nil { + log.Warnf("No InitL1InfoRootMap found, skipping check") + return nil + } + if leafCounter < l1infotreeInitial.LeafCount { + return fmt.Errorf("cant use this leafCounter because is previous to first value on contract Map"+ + "leafCounter(%d) < l1infotreeInitial.LeafCount(%d)", leafCounter, l1infotreeInitial.LeafCount) + } + return nil +} + +func (t *TxBuilderBananaBase) NewSequence( + ctx context.Context, batches []seqsendertypes.Batch, coinbase common.Address, +) (seqsendertypes.Sequence, error) { + ethBatches := toEthermanBatches(batches) + sequence := etherman.NewSequenceBanana(ethBatches, coinbase) + greatestL1Index := getHighestL1InfoIndex(sequence.Batches) + + counterL1InfoRoot, err := t.GetCounterL1InfoRoot(ctx, greatestL1Index) + if err != nil { + log.Errorf("error getting CounterL1InfoRoot: %s", err) + return nil, err + } + sequence.CounterL1InfoRoot = counterL1InfoRoot + l1InfoRoot, err := t.getL1InfoRoot(sequence.CounterL1InfoRoot) + if err != nil { + log.Errorf("error getting L1InfoRootMap: %s", err) + return nil, err + } + err = t.CheckL1InfoTreeLeafCounterVsInitL1InfoMap(ctx, sequence.CounterL1InfoRoot) + if err != nil { + log.Errorf("error checking L1InfoTreeLeafCounterVsInitL1InfoMap: %s", err) + return nil, err + } + sequence.L1InfoRoot = l1InfoRoot + + accInputHash, err := t.rollupContract.LastAccInputHash(&bind.CallOpts{Pending: false}) + if err != nil { + log.Errorf("error getting LastAccInputHash: %s", err) + return nil, err + } + + oldAccInputHash := common.BytesToHash(accInputHash[:]) // copy it + + for _, batch := range sequence.Batches { + infoRootHash := sequence.L1InfoRoot + timestamp := sequence.MaxSequenceTimestamp + blockHash := common.Hash{} + + if batch.ForcedBatchTimestamp > 0 { + infoRootHash = batch.ForcedGlobalExitRoot + timestamp = batch.ForcedBatchTimestamp + blockHash = batch.ForcedBlockHashL1 + } + + accInputHash = aggkitcommon.CalculateAccInputHash( + t.logger, accInputHash, batch.L2Data, infoRootHash, timestamp, batch.LastCoinbase, blockHash, + ) + } + + sequence.OldAccInputHash = oldAccInputHash + sequence.AccInputHash = accInputHash + res := NewBananaSequence(*sequence) + return res, nil +} + +func (t *TxBuilderBananaBase) getL1InfoRoot(counterL1InfoRoot uint32) (common.Hash, error) { + return t.globalExitRootContract.L1InfoRootMap(&bind.CallOpts{Pending: false}, counterL1InfoRoot) +} + +func convertToSequenceBanana(sequences seqsendertypes.Sequence) (etherman.SequenceBanana, error) { + seqEth, ok := sequences.(*BananaSequence) + if !ok { + log.Error("sequences is not a BananaSequence") + return etherman.SequenceBanana{}, fmt.Errorf("sequences is not a BananaSequence") + } + + ethermanSequence := etherman.SequenceBanana{ + OldAccInputHash: seqEth.SequenceBanana.OldAccInputHash, + AccInputHash: seqEth.SequenceBanana.AccInputHash, + L1InfoRoot: seqEth.SequenceBanana.L1InfoRoot, + MaxSequenceTimestamp: seqEth.SequenceBanana.MaxSequenceTimestamp, + CounterL1InfoRoot: seqEth.SequenceBanana.CounterL1InfoRoot, + L2Coinbase: seqEth.SequenceBanana.L2Coinbase, + } + + for _, batch := range sequences.Batches() { + ethBatch := toEthermanBatch(batch) + ethermanSequence.Batches = append(ethermanSequence.Batches, ethBatch) + } + + return ethermanSequence, nil +} + +func toEthermanBatch(batch seqsendertypes.Batch) etherman.Batch { + return etherman.Batch{ + L2Data: batch.L2Data(), + LastCoinbase: batch.LastCoinbase(), + ForcedGlobalExitRoot: batch.ForcedGlobalExitRoot(), + ForcedBlockHashL1: batch.ForcedBlockHashL1(), + ForcedBatchTimestamp: batch.ForcedBatchTimestamp(), + BatchNumber: batch.BatchNumber(), + L1InfoTreeIndex: batch.L1InfoTreeIndex(), + LastL2BLockTimestamp: batch.LastL2BLockTimestamp(), + GlobalExitRoot: batch.GlobalExitRoot(), + } +} + +func toEthermanBatches(batch []seqsendertypes.Batch) []etherman.Batch { + result := make([]etherman.Batch, len(batch)) + for i, b := range batch { + result[i] = toEthermanBatch(b) + } + + return result +} diff --git a/sequencesender/txbuilder/banana_base_test.go b/sequencesender/txbuilder/banana_base_test.go new file mode 100644 index 00000000..fdf208f1 --- /dev/null +++ b/sequencesender/txbuilder/banana_base_test.go @@ -0,0 +1,162 @@ +package txbuilder_test + +import ( + "context" + "fmt" + "math/big" + "testing" + + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/sequencesender/txbuilder/mocks_txbuilder" + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestBananaBaseNewSequenceEmpty(t *testing.T) { + testData := newBananaBaseTestData(t) + testData.l1Client.On("HeaderByNumber", mock.Anything, mock.Anything). + Return(&types.Header{Number: big.NewInt(69)}, nil) + testData.getContract.On("L1InfoRootMap", mock.Anything, uint32(70)). + Return([32]byte{}, nil) + testData.l1InfoTreeSync.On("GetLatestInfoUntilBlock", mock.Anything, mock.Anything). + Return(&l1infotreesync.L1InfoTreeLeaf{L1InfoTreeIndex: 69}, nil) + lastAcc := common.HexToHash("0x8aca9664752dbae36135fd0956c956fc4a370feeac67485b49bcd4b99608ae41") + testData.rollupContract.EXPECT().LastAccInputHash(mock.Anything).Return(lastAcc, nil) + testData.l1InfoTreeSync.EXPECT().GetInitL1InfoRootMap(mock.Anything).Return(nil, nil) + seq, err := testData.sut.NewSequence(context.TODO(), nil, common.Address{}) + require.NotNil(t, seq) + require.NoError(t, err) +} + +func TestBananaBaseNewSequenceErrorHeaderByNumber(t *testing.T) { + testData := newBananaBaseTestData(t) + testData.l1Client.On("HeaderByNumber", mock.Anything, mock.Anything). + Return(nil, fmt.Errorf("error")) + seq, err := testData.sut.NewSequence(context.TODO(), nil, common.Address{}) + require.Nil(t, seq) + require.Error(t, err) +} + +func TestBananaBaseNewBatchFromL2Block(t *testing.T) { + testData := newBananaBaseTestData(t) + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 2, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batch := testData.sut.NewBatchFromL2Block(l2Block) + require.NotNil(t, batch) + require.Equal(t, l2Block.Timestamp, batch.LastL2BLockTimestamp()) + require.Equal(t, l2Block.BatchNumber, batch.BatchNumber()) + require.Equal(t, l2Block.L1InfotreeIndex, batch.L1InfoTreeIndex()) + require.Equal(t, common.BytesToAddress(l2Block.Coinbase), batch.LastCoinbase()) + require.Equal(t, common.BytesToHash(l2Block.GlobalExitRoot), batch.GlobalExitRoot()) +} + +func TestBananaBaseNewSequenceBatch(t *testing.T) { + testData := newBananaBaseTestData(t) + testData.l1Client.On("HeaderByNumber", mock.Anything, mock.Anything). + Return(&types.Header{Number: big.NewInt(69)}, nil) + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 2, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + testData.l1InfoTreeSync.EXPECT().GetInitL1InfoRootMap(mock.Anything).Return(nil, nil).Once() + + batch := testData.sut.NewBatchFromL2Block(l2Block) + batches := []seqsendertypes.Batch{batch} + lastAcc := common.HexToHash("0x8aca9664752dbae36135fd0956c956fc4a370feeac67485b49bcd4b99608ae41") + testData.rollupContract.EXPECT().LastAccInputHash(mock.Anything).Return(lastAcc, nil) + l1infoRoot := common.HexToHash("0x66ca9664752dbae36135fd0956c956fc4a370feeac67485b49bcd4b99608ae41") + testData.l1InfoTreeSync.On("GetLatestInfoUntilBlock", mock.Anything, mock.Anything). + Return(&l1infotreesync.L1InfoTreeLeaf{L1InfoTreeIndex: 7}, nil) + testData.getContract.EXPECT().L1InfoRootMap(mock.Anything, uint32(8)).Return(l1infoRoot, nil) + + seq, err := testData.sut.NewSequence(context.TODO(), batches, common.Address{}) + require.NotNil(t, seq) + require.NoError(t, err) + // TODO: check that the seq have the right values +} + +func TestBananaEmptyL1InfoTree(t *testing.T) { + testData := newBananaBaseTestData(t) + + testData.l1Client.On("HeaderByNumber", mock.Anything, mock.Anything). + Return(&types.Header{Number: big.NewInt(69)}, nil) + testData.l1InfoTreeSync.EXPECT().GetLatestInfoUntilBlock(testData.ctx, uint64(69)).Return(nil, l1infotreesync.ErrNotFound) + testData.l1InfoTreeSync.EXPECT().GetInitL1InfoRootMap(testData.ctx).Return(&l1infotreesync.L1InfoTreeInitial{LeafCount: 10}, nil) + + leafCounter, err := testData.sut.GetCounterL1InfoRoot(testData.ctx, 0) + require.NoError(t, err) + require.Equal(t, uint32(10), leafCounter) +} + +func TestCheckL1InfoTreeLeafCounterVsInitL1InfoMap(t *testing.T) { + testData := newBananaBaseTestData(t) + + testData.l1InfoTreeSync.EXPECT().GetInitL1InfoRootMap(testData.ctx).Return(&l1infotreesync.L1InfoTreeInitial{LeafCount: 10}, nil) + err := testData.sut.CheckL1InfoTreeLeafCounterVsInitL1InfoMap(testData.ctx, 10) + require.NoError(t, err, "10 == 10 so is accepted") + + err = testData.sut.CheckL1InfoTreeLeafCounterVsInitL1InfoMap(testData.ctx, 9) + require.Error(t, err, "9 < 10 so is rejected") + + err = testData.sut.CheckL1InfoTreeLeafCounterVsInitL1InfoMap(testData.ctx, 11) + require.NoError(t, err, "11 > 10 so is accepted") +} + +func TestCheckL1InfoTreeLeafCounterVsInitL1InfoMapNotFound(t *testing.T) { + testData := newBananaBaseTestData(t) + + testData.l1InfoTreeSync.EXPECT().GetInitL1InfoRootMap(testData.ctx).Return(nil, nil) + err := testData.sut.CheckL1InfoTreeLeafCounterVsInitL1InfoMap(testData.ctx, 10) + require.NoError(t, err, "10 == 10 so is accepted") +} + +type testDataBananaBase struct { + rollupContract *mocks_txbuilder.RollupBananaBaseContractor + getContract *mocks_txbuilder.GlobalExitRootBananaContractor + opts bind.TransactOpts + sut *txbuilder.TxBuilderBananaBase + l1InfoTreeSync *mocks_txbuilder.L1InfoSyncer + l1Client *mocks_txbuilder.L1Client + ctx context.Context +} + +func newBananaBaseTestData(t *testing.T) *testDataBananaBase { + t.Helper() + + zkevmContractMock := mocks_txbuilder.NewRollupBananaBaseContractor(t) + gerContractMock := mocks_txbuilder.NewGlobalExitRootBananaContractor(t) + opts := bind.TransactOpts{} + l1Client := mocks_txbuilder.NewL1Client(t) + l1InfoSyncer := mocks_txbuilder.NewL1InfoSyncer(t) + sut := txbuilder.NewTxBuilderBananaBase( + log.GetDefaultLogger(), + zkevmContractMock, + gerContractMock, + l1InfoSyncer, l1Client, big.NewInt(0), opts, + ) + require.NotNil(t, sut) + return &testDataBananaBase{ + rollupContract: zkevmContractMock, + getContract: gerContractMock, + opts: opts, + sut: sut, + l1InfoTreeSync: l1InfoSyncer, + l1Client: l1Client, + ctx: context.TODO(), + } +} diff --git a/sequencesender/txbuilder/banana_types.go b/sequencesender/txbuilder/banana_types.go new file mode 100644 index 00000000..8b0cf5c8 --- /dev/null +++ b/sequencesender/txbuilder/banana_types.go @@ -0,0 +1,184 @@ +package txbuilder + +import ( + "fmt" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/state" + "github.com/ethereum/go-ethereum/common" +) + +type BananaBatch struct { + etherman.Batch +} + +type BananaSequence struct { + etherman.SequenceBanana +} + +func NewBananaBatch(batch *etherman.Batch) *BananaBatch { + return &BananaBatch{*batch} +} + +func NewBananaSequence(ult etherman.SequenceBanana) *BananaSequence { + return &BananaSequence{ult} +} + +func (b *BananaSequence) IndexL1InfoRoot() uint32 { + return b.SequenceBanana.CounterL1InfoRoot +} + +func (b *BananaSequence) MaxSequenceTimestamp() uint64 { + return b.SequenceBanana.MaxSequenceTimestamp +} + +func (b *BananaSequence) L1InfoRoot() common.Hash { + return b.SequenceBanana.L1InfoRoot +} + +func (b *BananaSequence) Batches() []seqsendertypes.Batch { + res := make([]seqsendertypes.Batch, len(b.SequenceBanana.Batches)) + for i, batch := range b.SequenceBanana.Batches { + res[i] = &BananaBatch{batch} + } + return res +} + +func (b *BananaSequence) FirstBatch() seqsendertypes.Batch { + return &BananaBatch{b.SequenceBanana.Batches[0]} +} + +func (b *BananaSequence) LastBatch() seqsendertypes.Batch { + return &BananaBatch{b.SequenceBanana.Batches[b.Len()-1]} +} + +func (b *BananaSequence) Len() int { + return len(b.SequenceBanana.Batches) +} + +func (b *BananaSequence) String() string { + res := fmt.Sprintf( + "Seq/Banana: L2Coinbase: %s, OldAccInputHash: %x, AccInputHash: %x, L1InfoRoot: %x, "+ + "MaxSequenceTimestamp: %d, IndexL1InfoRoot: %d", + b.L2Coinbase().String(), b.OldAccInputHash.String(), b.AccInputHash.String(), b.L1InfoRoot().String(), + b.MaxSequenceTimestamp(), b.IndexL1InfoRoot(), + ) + + for i, batch := range b.Batches() { + res += fmt.Sprintf("\n\tBatch %d: %s", i, batch.String()) + } + return res +} + +func (b *BananaSequence) L2Coinbase() common.Address { + return b.SequenceBanana.L2Coinbase +} + +func (b *BananaBatch) LastCoinbase() common.Address { + return b.Batch.LastCoinbase +} + +func (b *BananaBatch) ForcedBatchTimestamp() uint64 { + return b.Batch.ForcedBatchTimestamp +} + +func (b *BananaBatch) ForcedGlobalExitRoot() common.Hash { + return b.Batch.ForcedGlobalExitRoot +} + +func (b *BananaBatch) ForcedBlockHashL1() common.Hash { + return b.Batch.ForcedBlockHashL1 +} + +func (b *BananaBatch) L2Data() []byte { + return b.Batch.L2Data +} + +func (b *BananaBatch) LastL2BLockTimestamp() uint64 { + return b.Batch.LastL2BLockTimestamp +} + +func (b *BananaBatch) BatchNumber() uint64 { + return b.Batch.BatchNumber +} + +func (b BananaBatch) DeepCopy() seqsendertypes.Batch { + return &BananaBatch{b.Batch} +} + +func (b *BananaBatch) SetL2Data(data []byte) { + b.Batch.L2Data = data +} + +func (b *BananaBatch) SetLastCoinbase(address common.Address) { + b.Batch.LastCoinbase = address +} + +func (b *BananaBatch) SetLastL2BLockTimestamp(ts uint64) { + b.Batch.LastL2BLockTimestamp = ts +} + +func (b *BananaBatch) SetL1InfoTreeIndex(index uint32) { + b.Batch.L1InfoTreeIndex = index +} + +func (b *BananaBatch) GlobalExitRoot() common.Hash { + return b.Batch.GlobalExitRoot +} + +func (b *BananaBatch) L1InfoTreeIndex() uint32 { + return b.Batch.L1InfoTreeIndex +} + +func (b *BananaBatch) String() string { + return fmt.Sprintf("Batch/Banana: LastCoinbase: %s, ForcedBatchTimestamp: %d, ForcedGlobalExitRoot: %x, "+ + "ForcedBlockHashL1: %x, L2Data: %x, LastL2BLockTimestamp: %d, BatchNumber: %d, "+ + "GlobalExitRoot: %x, L1InfoTreeIndex: %d", + b.LastCoinbase().String(), b.ForcedBatchTimestamp(), b.ForcedGlobalExitRoot().String(), + b.ForcedBlockHashL1().String(), b.L2Data(), b.LastL2BLockTimestamp(), b.BatchNumber(), + b.GlobalExitRoot().String(), b.L1InfoTreeIndex(), + ) +} + +func (b *BananaSequence) LastVirtualBatchNumber() uint64 { + return b.SequenceBanana.LastVirtualBatchNumber +} + +func (b *BananaSequence) SetLastVirtualBatchNumber(batchNumber uint64) { + b.SequenceBanana.LastVirtualBatchNumber = batchNumber +} + +func calculateMaxL1InfoTreeIndexInsideL2Data(l2data []byte) (uint32, error) { + batchRawV2, err := state.DecodeBatchV2(l2data) + if err != nil { + return 0, fmt.Errorf("calculateMaxL1InfoTreeIndexInsideL2Data: error decoding batchL2Data, err:%w", err) + } + if batchRawV2 == nil { + return 0, fmt.Errorf("calculateMaxL1InfoTreeIndexInsideL2Data: batchRawV2 is nil") + } + maxIndex := uint32(0) + for _, block := range batchRawV2.Blocks { + if block.IndexL1InfoTree > maxIndex { + maxIndex = block.IndexL1InfoTree + } + } + return maxIndex, nil +} + +func calculateMaxL1InfoTreeIndexInsideSequence(seq *etherman.SequenceBanana) (uint32, error) { + if seq == nil { + return 0, fmt.Errorf("calculateMaxL1InfoTreeIndexInsideSequence: seq is nil") + } + maxIndex := uint32(0) + for _, batch := range seq.Batches { + index, err := calculateMaxL1InfoTreeIndexInsideL2Data(batch.L2Data) + if err != nil { + return 0, fmt.Errorf("calculateMaxL1InfoTreeIndexInsideBatches: error getting batch L1InfoTree , err:%w", err) + } + if index > maxIndex { + maxIndex = index + } + } + return maxIndex, nil +} diff --git a/sequencesender/txbuilder/banana_validium.go b/sequencesender/txbuilder/banana_validium.go new file mode 100644 index 00000000..69a94536 --- /dev/null +++ b/sequencesender/txbuilder/banana_validium.go @@ -0,0 +1,153 @@ +package txbuilder + +import ( + "context" + "fmt" + "math/big" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygonvalidiumetrog" + "github.com/agglayer/aggkit/dataavailability" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +type TxBuilderBananaValidium struct { + TxBuilderBananaBase + da dataavailability.SequenceSenderBanana + condNewSeq CondNewSequence + rollupContract rollupBananaValidiumContractor +} + +type rollupBananaValidiumContractor interface { + rollupBananaBaseContractor + SequenceBatchesValidium( + opts *bind.TransactOpts, + batches []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, + indexL1InfoRoot uint32, + maxSequenceTimestamp uint64, + expectedFinalAccInputHash [32]byte, + l2Coinbase common.Address, + dataAvailabilityMessage []byte, + ) (*types.Transaction, error) +} + +func NewTxBuilderBananaValidium( + logger *log.Logger, + rollupContract rollupBananaValidiumContractor, + gerContract globalExitRootBananaContractor, + da dataavailability.SequenceSenderBanana, opts bind.TransactOpts, maxBatchesForL1 uint64, + l1InfoTree l1InfoSyncer, + ethClient l1Client, + blockFinality *big.Int, +) *TxBuilderBananaValidium { + txBuilderBase := *NewTxBuilderBananaBase(logger, rollupContract, + gerContract, l1InfoTree, ethClient, blockFinality, opts) + + return &TxBuilderBananaValidium{ + TxBuilderBananaBase: txBuilderBase, + da: da, + condNewSeq: NewConditionalNewSequenceNumBatches(maxBatchesForL1), + rollupContract: rollupContract, + } +} + +func (t *TxBuilderBananaValidium) NewSequenceIfWorthToSend( + ctx context.Context, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, batchNumber uint64, +) (seqsendertypes.Sequence, error) { + return t.condNewSeq.NewSequenceIfWorthToSend(ctx, t, sequenceBatches, l2Coinbase) +} + +// SetCondNewSeq allow to override the default conditional for new sequence +func (t *TxBuilderBananaValidium) SetCondNewSeq(cond CondNewSequence) CondNewSequence { + previous := t.condNewSeq + t.condNewSeq = cond + return previous +} + +func (t *TxBuilderBananaValidium) BuildSequenceBatchesTx( + ctx context.Context, sequences seqsendertypes.Sequence, +) (*types.Transaction, error) { + // TODO: param sender + // Post sequences to DA backend + var dataAvailabilityMessage []byte + var err error + ethseq, err := convertToSequenceBanana(sequences) + if err != nil { + t.logger.Error("error converting sequences to etherman: ", err) + return nil, err + } + + dataAvailabilityMessage, err = t.da.PostSequenceBanana(ctx, ethseq) + if err != nil { + t.logger.Error("error posting sequences to the data availability protocol: ", err) + return nil, err + } + if dataAvailabilityMessage == nil { + err := fmt.Errorf("data availability message is nil") + t.logger.Error("error posting sequences to the data availability protocol: ", err.Error()) + return nil, err + } + + // Build sequence data + tx, err := t.internalBuildSequenceBatchesTx(ethseq, dataAvailabilityMessage) + if err != nil { + t.logger.Errorf("error estimating new sequenceBatches to add to ethtxmanager: ", err) + return nil, err + } + return tx, nil +} + +// BuildSequenceBatchesTx builds a tx to be sent to the PoE SC method SequenceBatches. +func (t *TxBuilderBananaValidium) internalBuildSequenceBatchesTx(sequence etherman.SequenceBanana, + dataAvailabilityMessage []byte) (*types.Transaction, error) { + newopts := t.opts + newopts.NoSend = true + + // force nonce, gas limit and gas price to avoid querying it from the chain + newopts.Nonce = big.NewInt(1) + newopts.GasLimit = uint64(1) + newopts.GasPrice = big.NewInt(1) + + return t.sequenceBatchesValidium(newopts, sequence, dataAvailabilityMessage) +} + +func (t *TxBuilderBananaValidium) sequenceBatchesValidium( + opts bind.TransactOpts, sequence etherman.SequenceBanana, dataAvailabilityMessage []byte, +) (*types.Transaction, error) { + batches := make([]polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, len(sequence.Batches)) + for i, batch := range sequence.Batches { + var ger common.Hash + if batch.ForcedBatchTimestamp > 0 { + ger = batch.ForcedGlobalExitRoot + } + + batches[i] = polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData{ + TransactionsHash: crypto.Keccak256Hash(batch.L2Data), + ForcedGlobalExitRoot: ger, + ForcedTimestamp: batch.ForcedBatchTimestamp, + ForcedBlockHashL1: batch.ForcedBlockHashL1, + } + } + + t.logger.Infof("building banana sequence tx. AccInputHash: %s", sequence.AccInputHash.Hex()) + tx, err := t.rollupContract.SequenceBatchesValidium( + &opts, batches, sequence.CounterL1InfoRoot, sequence.MaxSequenceTimestamp, + sequence.AccInputHash, sequence.L2Coinbase, dataAvailabilityMessage, + ) + if err != nil { + t.logger.Debugf("Batches to send: %+v", batches) + t.logger.Debug("l2CoinBase: ", sequence.L2Coinbase) + t.logger.Debug("Sequencer address: ", opts.From) + } + + return tx, err +} + +func (t *TxBuilderBananaValidium) String() string { + return "Banana/Validium" +} diff --git a/sequencesender/txbuilder/banana_validium_test.go b/sequencesender/txbuilder/banana_validium_test.go new file mode 100644 index 00000000..390522a2 --- /dev/null +++ b/sequencesender/txbuilder/banana_validium_test.go @@ -0,0 +1,139 @@ +package txbuilder_test + +import ( + "context" + "fmt" + "math/big" + "strings" + "testing" + + "github.com/agglayer/aggkit/dataavailability/mocks_da" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/sequencesender/txbuilder/mocks_txbuilder" + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestBananaValidiumName(t *testing.T) { + testData := newBananaValidiumTestData(t, txbuilder.MaxBatchesForL1Disabled) + require.NotNil(t, testData.sut) + require.True(t, strings.Contains(testData.sut.String(), "Banana")) + require.True(t, strings.Contains(testData.sut.String(), "Validium")) +} + +func TestBananaValidiumBuildSequenceBatchesTxSequenceErrorsFromDA(t *testing.T) { + testData := newBananaValidiumTestData(t, txbuilder.MaxBatchesForL1Disabled) + testData.l1Client.On("HeaderByNumber", mock.Anything, mock.Anything). + Return(&types.Header{Number: big.NewInt(69)}, nil) + testData.l1InfoTreeSync.On("GetLatestInfoUntilBlock", mock.Anything, mock.Anything). + Return(&l1infotreesync.L1InfoTreeLeaf{L1InfoTreeIndex: 7}, nil) + testData.l1InfoTreeSync.EXPECT().GetInitL1InfoRootMap(mock.Anything).Return(nil, nil) + + seq, err := newSequenceBananaValidiumForTest(testData) + require.NoError(t, err) + ctx := context.TODO() + testData.da.EXPECT().PostSequenceBanana(ctx, mock.Anything).Return(nil, nil).Once() + + _, err = testData.sut.BuildSequenceBatchesTx(ctx, seq) + require.Error(t, err, "data availability message is nil") + + testData.da.EXPECT().PostSequenceBanana(ctx, mock.Anything).Return(nil, fmt.Errorf("test error")) + _, err = testData.sut.BuildSequenceBatchesTx(ctx, seq) + require.Error(t, err, "error posting sequences to the data availability protocol: test error") +} + +func TestBananaValidiumBuildSequenceBatchesTxSequenceDAOk(t *testing.T) { + testData := newBananaValidiumTestData(t, txbuilder.MaxBatchesForL1Disabled) + testData.l1Client.On("HeaderByNumber", mock.Anything, mock.Anything). + Return(&types.Header{Number: big.NewInt(69)}, nil) + testData.l1InfoTreeSync.On("GetLatestInfoUntilBlock", mock.Anything, mock.Anything). + Return(&l1infotreesync.L1InfoTreeLeaf{L1InfoTreeIndex: 7}, nil) + testData.l1InfoTreeSync.EXPECT().GetInitL1InfoRootMap(mock.Anything).Return(nil, nil) + + seq, err := newSequenceBananaValidiumForTest(testData) + require.NoError(t, err) + ctx := context.TODO() + daMessage := []byte{1} + testData.da.EXPECT().PostSequenceBanana(ctx, mock.Anything).Return(daMessage, nil) + inner := &types.LegacyTx{} + seqBatchesTx := types.NewTx(inner) + testData.rollupContract.EXPECT().SequenceBatchesValidium(mock.MatchedBy(func(opts *bind.TransactOpts) bool { + return opts.NoSend == true + }), mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, daMessage).Return(seqBatchesTx, nil).Once() + tx, err := testData.sut.BuildSequenceBatchesTx(ctx, seq) + require.NoError(t, err) + require.Equal(t, seqBatchesTx, tx) +} + +type testDataBananaValidium struct { + rollupContract *mocks_txbuilder.RollupBananaValidiumContractor + getContract *mocks_txbuilder.GlobalExitRootBananaContractor + cond *mocks_txbuilder.CondNewSequence + da *mocks_da.SequenceSenderBanana + opts bind.TransactOpts + sut *txbuilder.TxBuilderBananaValidium + l1InfoTreeSync *mocks_txbuilder.L1InfoSyncer + l1Client *mocks_txbuilder.L1Client +} + +func newBananaValidiumTestData(t *testing.T, maxBatchesForL1 uint64) *testDataBananaValidium { + t.Helper() + + zkevmContractMock := mocks_txbuilder.NewRollupBananaValidiumContractor(t) + gerContractMock := mocks_txbuilder.NewGlobalExitRootBananaContractor(t) + condMock := mocks_txbuilder.NewCondNewSequence(t) + daMock := mocks_da.NewSequenceSenderBanana(t) + l1Client := mocks_txbuilder.NewL1Client(t) + l1InfoSyncer := mocks_txbuilder.NewL1InfoSyncer(t) + + opts := bind.TransactOpts{} + sut := txbuilder.NewTxBuilderBananaValidium( + log.GetDefaultLogger(), + zkevmContractMock, + gerContractMock, + daMock, + opts, + maxBatchesForL1, + l1InfoSyncer, + l1Client, + big.NewInt(0), + ) + require.NotNil(t, sut) + sut.SetCondNewSeq(condMock) + return &testDataBananaValidium{ + rollupContract: zkevmContractMock, + getContract: gerContractMock, + cond: condMock, + da: daMock, + opts: opts, + sut: sut, + l1InfoTreeSync: l1InfoSyncer, + l1Client: l1Client, + } +} + +func newSequenceBananaValidiumForTest(testData *testDataBananaValidium) (seqsendertypes.Sequence, error) { + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 1, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batch := testData.sut.NewBatchFromL2Block(l2Block) + batches := []seqsendertypes.Batch{ + batch, + } + lastAcc := common.HexToHash("0x8aca9664752dbae36135fd0956c956fc4a370feeac67485b49bcd4b99608ae41") + testData.rollupContract.EXPECT().LastAccInputHash(mock.Anything).Return(lastAcc, nil).Once() + l1infoRoot := common.HexToHash("0x66ca9664752dbae36135fd0956c956fc4a370feeac67485b49bcd4b99608ae41") + testData.getContract.EXPECT().L1InfoRootMap(mock.Anything, uint32(8)).Return(l1infoRoot, nil).Once() + return testData.sut.NewSequence(context.TODO(), batches, common.Address{}) +} diff --git a/sequencesender/txbuilder/banana_zkevm.go b/sequencesender/txbuilder/banana_zkevm.go new file mode 100644 index 00000000..1151fcdf --- /dev/null +++ b/sequencesender/txbuilder/banana_zkevm.go @@ -0,0 +1,128 @@ +package txbuilder + +import ( + "context" + "math/big" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygonvalidiumetrog" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +type TxBuilderBananaZKEVM struct { + TxBuilderBananaBase + condNewSeq CondNewSequence + rollupContract rollupBananaZKEVMContractor +} + +type rollupBananaZKEVMContractor interface { + rollupBananaBaseContractor + SequenceBatches( + opts *bind.TransactOpts, + batches []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, + indexL1InfoRoot uint32, + maxSequenceTimestamp uint64, + expectedFinalAccInputHash [32]byte, + l2Coinbase common.Address, + ) (*types.Transaction, error) +} + +type globalExitRootBananaZKEVMContractor interface { + globalExitRootBananaContractor +} + +func NewTxBuilderBananaZKEVM( + logger *log.Logger, + rollupContract rollupBananaZKEVMContractor, + gerContract globalExitRootBananaZKEVMContractor, + opts bind.TransactOpts, + maxTxSizeForL1 uint64, + l1InfoTree l1InfoSyncer, + ethClient l1Client, + blockFinality *big.Int, +) *TxBuilderBananaZKEVM { + txBuilderBase := *NewTxBuilderBananaBase(logger, rollupContract, + gerContract, l1InfoTree, ethClient, blockFinality, opts) + + return &TxBuilderBananaZKEVM{ + TxBuilderBananaBase: txBuilderBase, + condNewSeq: NewConditionalNewSequenceMaxSize(maxTxSizeForL1), + rollupContract: rollupContract, + } +} + +func (t *TxBuilderBananaZKEVM) NewSequenceIfWorthToSend( + ctx context.Context, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, batchNumber uint64, +) (seqsendertypes.Sequence, error) { + return t.condNewSeq.NewSequenceIfWorthToSend(ctx, t, sequenceBatches, l2Coinbase) +} + +// SetCondNewSeq allow to override the default conditional for new sequence +func (t *TxBuilderBananaZKEVM) SetCondNewSeq(cond CondNewSequence) CondNewSequence { + previous := t.condNewSeq + t.condNewSeq = cond + return previous +} + +func (t *TxBuilderBananaZKEVM) BuildSequenceBatchesTx( + ctx context.Context, sequences seqsendertypes.Sequence, +) (*types.Transaction, error) { + var err error + ethseq, err := convertToSequenceBanana(sequences) + if err != nil { + t.logger.Error("error converting sequences to etherman: ", err) + return nil, err + } + newopts := t.opts + newopts.NoSend = true + + // force nonce, gas limit and gas price to avoid querying it from the chain + newopts.Nonce = big.NewInt(1) + newopts.GasLimit = uint64(1) + newopts.GasPrice = big.NewInt(1) + // Build sequence data + tx, err := t.sequenceBatchesRollup(newopts, ethseq) + if err != nil { + t.logger.Errorf("error estimating new sequenceBatches to add to ethtxmanager: ", err) + return nil, err + } + return tx, nil +} + +func (t *TxBuilderBananaZKEVM) sequenceBatchesRollup( + opts bind.TransactOpts, sequence etherman.SequenceBanana, +) (*types.Transaction, error) { + batches := make([]polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, len(sequence.Batches)) + for i, batch := range sequence.Batches { + var ger common.Hash + if batch.ForcedBatchTimestamp > 0 { + ger = batch.ForcedGlobalExitRoot + } + + batches[i] = polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData{ + Transactions: batch.L2Data, + ForcedGlobalExitRoot: ger, + ForcedTimestamp: batch.ForcedBatchTimestamp, + ForcedBlockHashL1: batch.ForcedBlockHashL1, + } + } + + tx, err := t.rollupContract.SequenceBatches( + &opts, batches, sequence.CounterL1InfoRoot, sequence.MaxSequenceTimestamp, sequence.AccInputHash, sequence.L2Coinbase, + ) + if err != nil { + t.logger.Debugf("Batches to send: %+v", batches) + t.logger.Debug("l2CoinBase: ", sequence.L2Coinbase) + t.logger.Debug("Sequencer address: ", opts.From) + } + + return tx, err +} + +func (t *TxBuilderBananaZKEVM) String() string { + return "Banana/ZKEVM" +} diff --git a/sequencesender/txbuilder/banana_zkevm_test.go b/sequencesender/txbuilder/banana_zkevm_test.go new file mode 100644 index 00000000..a05d23c4 --- /dev/null +++ b/sequencesender/txbuilder/banana_zkevm_test.go @@ -0,0 +1,137 @@ +package txbuilder_test + +import ( + "context" + "fmt" + "math/big" + "strings" + "testing" + + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/sequencesender/txbuilder/mocks_txbuilder" + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestBananaZkevmName(t *testing.T) { + testData := newBananaZKEVMTestData(t, txbuilder.MaxTxSizeForL1Disabled) + require.True(t, strings.Contains(testData.sut.String(), "Banana")) + require.True(t, strings.Contains(testData.sut.String(), "ZKEVM")) +} + +func TestBananaZkevmNewSequenceIfWorthToSend(t *testing.T) { + testData := newBananaZKEVMTestData(t, txbuilder.MaxTxSizeForL1Disabled) + + testSequenceIfWorthToSendNoNewSeq(t, testData.sut) + testSequenceIfWorthToSendErr(t, testData.sut) + testSetCondNewSeq(t, testData.sut) +} + +func TestBananaZkevmBuildSequenceBatchesTxOk(t *testing.T) { + testData := newBananaZKEVMTestData(t, txbuilder.MaxTxSizeForL1Disabled) + testData.l1Client.On("HeaderByNumber", mock.Anything, mock.Anything). + Return(&types.Header{Number: big.NewInt(69)}, nil) + testData.l1InfoTreeSync.On("GetLatestInfoUntilBlock", mock.Anything, mock.Anything). + Return(&l1infotreesync.L1InfoTreeLeaf{L1InfoTreeIndex: 7}, nil) + testData.l1InfoTreeSync.EXPECT().GetInitL1InfoRootMap(mock.Anything).Return(nil, nil) + + seq, err := newSequenceBananaZKEVMForTest(testData) + require.NoError(t, err) + + inner := &types.LegacyTx{} + tx := types.NewTx(inner) + + // It check that SequenceBatches is not going to be send + testData.rollupContract.EXPECT().SequenceBatches(mock.MatchedBy(func(opts *bind.TransactOpts) bool { + return opts.NoSend == true + }), mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tx, nil).Once() + returnTx, err := testData.sut.BuildSequenceBatchesTx(context.TODO(), seq) + require.NoError(t, err) + require.Equal(t, tx, returnTx) +} + +func TestBananaZkevmBuildSequenceBatchesTxErr(t *testing.T) { + testData := newBananaZKEVMTestData(t, txbuilder.MaxTxSizeForL1Disabled) + testData.l1Client.On("HeaderByNumber", mock.Anything, mock.Anything). + Return(&types.Header{Number: big.NewInt(69)}, nil) + testData.l1InfoTreeSync.On("GetLatestInfoUntilBlock", mock.Anything, mock.Anything). + Return(&l1infotreesync.L1InfoTreeLeaf{L1InfoTreeIndex: 7}, nil) + testData.l1InfoTreeSync.EXPECT().GetInitL1InfoRootMap(mock.Anything).Return(nil, nil) + + seq, err := newSequenceBananaZKEVMForTest(testData) + require.NoError(t, err) + + err = fmt.Errorf("test-error") + testData.rollupContract.EXPECT().SequenceBatches(mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, err).Once() + returnedTx, returnedErr := testData.sut.BuildSequenceBatchesTx(context.TODO(), seq) + require.ErrorContains(t, returnedErr, err.Error()) + require.Nil(t, returnedTx) +} + +type testDataBananaZKEVM struct { + rollupContract *mocks_txbuilder.RollupBananaZKEVMContractor + getContract *mocks_txbuilder.GlobalExitRootBananaContractor + cond *mocks_txbuilder.CondNewSequence + opts bind.TransactOpts + sut *txbuilder.TxBuilderBananaZKEVM + l1InfoTreeSync *mocks_txbuilder.L1InfoSyncer + l1Client *mocks_txbuilder.L1Client +} + +func newBananaZKEVMTestData(t *testing.T, maxTxSizeForL1 uint64) *testDataBananaZKEVM { + t.Helper() + + zkevmContractMock := mocks_txbuilder.NewRollupBananaZKEVMContractor(t) + gerContractMock := mocks_txbuilder.NewGlobalExitRootBananaContractor(t) + condMock := mocks_txbuilder.NewCondNewSequence(t) + opts := bind.TransactOpts{} + l1Client := mocks_txbuilder.NewL1Client(t) + l1InfoSyncer := mocks_txbuilder.NewL1InfoSyncer(t) + sut := txbuilder.NewTxBuilderBananaZKEVM( + log.GetDefaultLogger(), + zkevmContractMock, + gerContractMock, + opts, + maxTxSizeForL1, + l1InfoSyncer, + l1Client, + big.NewInt(0), + ) + require.NotNil(t, sut) + sut.SetCondNewSeq(condMock) + return &testDataBananaZKEVM{ + rollupContract: zkevmContractMock, + getContract: gerContractMock, + cond: condMock, + opts: opts, + sut: sut, + l1InfoTreeSync: l1InfoSyncer, + l1Client: l1Client, + } +} + +func newSequenceBananaZKEVMForTest(testData *testDataBananaZKEVM) (seqsendertypes.Sequence, error) { + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 1, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batch := testData.sut.NewBatchFromL2Block(l2Block) + batches := []seqsendertypes.Batch{ + batch, + } + lastAcc := common.HexToHash("0x8aca9664752dbae36135fd0956c956fc4a370feeac67485b49bcd4b99608ae41") + testData.rollupContract.EXPECT().LastAccInputHash(mock.Anything).Return(lastAcc, nil).Once() + l1infoRoot := common.HexToHash("0x66ca9664752dbae36135fd0956c956fc4a370feeac67485b49bcd4b99608ae41") + testData.getContract.EXPECT().L1InfoRootMap(mock.Anything, uint32(8)).Return(l1infoRoot, nil).Once() + return testData.sut.NewSequence(context.TODO(), batches, common.Address{}) +} diff --git a/sequencesender/txbuilder/elderberry_base.go b/sequencesender/txbuilder/elderberry_base.go new file mode 100644 index 00000000..f8d8b307 --- /dev/null +++ b/sequencesender/txbuilder/elderberry_base.go @@ -0,0 +1,63 @@ +package txbuilder + +import ( + "context" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" +) + +type TxBuilderElderberryBase struct { + logger *log.Logger + opts bind.TransactOpts +} + +func NewTxBuilderElderberryBase(logger *log.Logger, opts bind.TransactOpts) *TxBuilderElderberryBase { + return &TxBuilderElderberryBase{ + logger: logger, + opts: opts, + } +} + +// SetAuth sets the auth for the tx builder +func (t *TxBuilderElderberryBase) SetAuth(auth *bind.TransactOpts) { + t.opts = *auth +} + +func (t *TxBuilderElderberryBase) NewSequence( + ctx context.Context, batches []seqsendertypes.Batch, coinbase common.Address, +) (seqsendertypes.Sequence, error) { + seq := ElderberrySequence{ + l2Coinbase: coinbase, + batches: batches, + } + return &seq, nil +} + +func (t *TxBuilderElderberryBase) NewBatchFromL2Block(l2Block *datastream.L2Block) seqsendertypes.Batch { + batch := ðerman.Batch{ + LastL2BLockTimestamp: l2Block.Timestamp, + BatchNumber: l2Block.BatchNumber, + L1InfoTreeIndex: l2Block.L1InfotreeIndex, + LastCoinbase: common.BytesToAddress(l2Block.Coinbase), + GlobalExitRoot: common.BytesToHash(l2Block.GlobalExitRoot), + } + return NewBananaBatch(batch) +} + +func getLastSequencedBatchNumber(sequences seqsendertypes.Sequence) uint64 { + if sequences.Len() == 0 { + return 0 + } + if sequences.FirstBatch().BatchNumber() == 0 { + panic("First batch number is 0, that is not allowed!") + } + if sequences.LastVirtualBatchNumber() != 0 { + return sequences.LastVirtualBatchNumber() + } + return sequences.FirstBatch().BatchNumber() - 1 +} diff --git a/sequencesender/txbuilder/elderberry_base_test.go b/sequencesender/txbuilder/elderberry_base_test.go new file mode 100644 index 00000000..46a16148 --- /dev/null +++ b/sequencesender/txbuilder/elderberry_base_test.go @@ -0,0 +1,101 @@ +package txbuilder + +import ( + "context" + "testing" + + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestElderberryBaseNewSequence(t *testing.T) { + opts := bind.TransactOpts{} + sut := NewTxBuilderElderberryBase(log.GetDefaultLogger(), opts) + require.NotNil(t, sut) + seq, err := sut.NewSequence(context.TODO(), nil, common.Address{}) + require.NotNil(t, seq) + require.NoError(t, err) +} + +func TestElderberryBaseNewBatchFromL2Block(t *testing.T) { + sut := newElderberryBaseSUT(t) + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 2, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batch := sut.NewBatchFromL2Block(l2Block) + require.NotNil(t, batch) + require.Equal(t, l2Block.Timestamp, batch.LastL2BLockTimestamp()) + require.Equal(t, l2Block.BatchNumber, batch.BatchNumber()) + require.Equal(t, l2Block.L1InfotreeIndex, batch.L1InfoTreeIndex()) + require.Equal(t, common.BytesToAddress(l2Block.Coinbase), batch.LastCoinbase()) + require.Equal(t, common.BytesToHash(l2Block.GlobalExitRoot), batch.GlobalExitRoot()) +} + +func TestElderberryBasegetLastSequencedBatchNumberEmpty(t *testing.T) { + sut := newElderberryBaseSUT(t) + seq, err := sut.NewSequence(context.TODO(), nil, common.Address{}) + require.NoError(t, err) + + require.Equal(t, uint64(0), getLastSequencedBatchNumber(seq)) +} + +func TestElderberryBasegetLastSequencedBatch1Batch(t *testing.T) { + sut := newElderberryBaseSUT(t) + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 2, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batchElder := sut.NewBatchFromL2Block(l2Block) + batches := []seqsendertypes.Batch{ + batchElder, + } + + seq, err := sut.NewSequence(context.TODO(), batches, common.Address{}) + require.NoError(t, err) + + require.Equal(t, l2Block.BatchNumber-1, getLastSequencedBatchNumber(seq)) +} + +func TestElderberryBaseGetLastSequencedBatchFirstBatchIsZeroThrowAPanic(t *testing.T) { + sut := newElderberryBaseSUT(t) + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 0, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batchElder := sut.NewBatchFromL2Block(l2Block) + batches := []seqsendertypes.Batch{ + batchElder, + } + + seq, err := sut.NewSequence(context.TODO(), batches, common.Address{}) + require.NoError(t, err) + defer func() { + if r := recover(); r == nil { + t.Errorf("The code did not panic") + } + }() + getLastSequencedBatchNumber(seq) +} + +func newElderberryBaseSUT(t *testing.T) *TxBuilderElderberryBase { + t.Helper() + + opts := bind.TransactOpts{} + sut := NewTxBuilderElderberryBase(log.GetDefaultLogger(), opts) + require.NotNil(t, sut) + return sut +} diff --git a/sequencesender/txbuilder/elderberry_types.go b/sequencesender/txbuilder/elderberry_types.go new file mode 100644 index 00000000..8800ab21 --- /dev/null +++ b/sequencesender/txbuilder/elderberry_types.go @@ -0,0 +1,72 @@ +package txbuilder + +import ( + "fmt" + "log" + + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/ethereum/go-ethereum/common" +) + +type ElderberrySequence struct { + l2Coinbase common.Address + batches []seqsendertypes.Batch + lastVirtualBatchNumber uint64 +} + +func NewElderberrySequence(batches []seqsendertypes.Batch, l2Coinbase common.Address) *ElderberrySequence { + return &ElderberrySequence{ + l2Coinbase: l2Coinbase, + batches: batches, + } +} + +func (b *ElderberrySequence) IndexL1InfoRoot() uint32 { + log.Fatal("Elderberry Sequence does not have IndexL1InfoRoot") + return 0 +} + +func (b *ElderberrySequence) MaxSequenceTimestamp() uint64 { + return b.LastBatch().LastL2BLockTimestamp() +} + +func (b *ElderberrySequence) L1InfoRoot() common.Hash { + log.Fatal("Elderberry Sequence does not have L1InfoRoot") + return common.Hash{} +} + +func (b *ElderberrySequence) Batches() []seqsendertypes.Batch { + return b.batches +} + +func (b *ElderberrySequence) FirstBatch() seqsendertypes.Batch { + return b.batches[0] +} + +func (b *ElderberrySequence) LastBatch() seqsendertypes.Batch { + return b.batches[b.Len()-1] +} + +func (b *ElderberrySequence) Len() int { + return len(b.batches) +} + +func (b *ElderberrySequence) L2Coinbase() common.Address { + return b.l2Coinbase +} + +func (b *ElderberrySequence) String() string { + res := fmt.Sprintf("Seq/Elderberry: L2Coinbase: %s, Batches: %d", b.l2Coinbase.String(), len(b.batches)) + for i, batch := range b.Batches() { + res += fmt.Sprintf("\n\tBatch %d: %s", i, batch.String()) + } + return res +} + +func (b *ElderberrySequence) SetLastVirtualBatchNumber(batchNumber uint64) { + b.lastVirtualBatchNumber = batchNumber +} + +func (b *ElderberrySequence) LastVirtualBatchNumber() uint64 { + return b.lastVirtualBatchNumber +} diff --git a/sequencesender/txbuilder/elderberry_validium.go b/sequencesender/txbuilder/elderberry_validium.go new file mode 100644 index 00000000..ff0cf693 --- /dev/null +++ b/sequencesender/txbuilder/elderberry_validium.go @@ -0,0 +1,134 @@ +package txbuilder + +import ( + "context" + "encoding/hex" + "fmt" + "math/big" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonvalidiumetrog" + "github.com/agglayer/aggkit/dataavailability" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/etherman/contracts" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +type TxBuilderElderberryValidium struct { + TxBuilderElderberryBase + da dataavailability.SequenceSenderElderberry + condNewSeq CondNewSequence + rollupContract rollupElderberryValidiumContractor +} + +type rollupElderberryValidiumContractor interface { + SequenceBatchesValidium( + opts *bind.TransactOpts, + batches []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, + maxSequenceTimestamp uint64, + initSequencedBatch uint64, + l2Coinbase common.Address, + dataAvailabilityMessage []byte, + ) (*types.Transaction, error) +} + +func NewTxBuilderElderberryValidium( + logger *log.Logger, + zkevm contracts.RollupElderberryType, + da dataavailability.SequenceSenderElderberry, + opts bind.TransactOpts, maxBatchesForL1 uint64) *TxBuilderElderberryValidium { + return &TxBuilderElderberryValidium{ + da: da, + TxBuilderElderberryBase: *NewTxBuilderElderberryBase(logger, opts), + condNewSeq: NewConditionalNewSequenceNumBatches(maxBatchesForL1), + rollupContract: zkevm, + } +} +func (t *TxBuilderElderberryValidium) NewSequenceIfWorthToSend( + ctx context.Context, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, batchNumber uint64, +) (seqsendertypes.Sequence, error) { + return t.condNewSeq.NewSequenceIfWorthToSend(ctx, t, sequenceBatches, l2Coinbase) +} + +// SetCondNewSeq allow to override the default conditional for new sequence +func (t *TxBuilderElderberryValidium) SetCondNewSeq(cond CondNewSequence) CondNewSequence { + previous := t.condNewSeq + t.condNewSeq = cond + return previous +} + +func (t *TxBuilderElderberryValidium) BuildSequenceBatchesTx( + ctx context.Context, sequences seqsendertypes.Sequence, +) (*types.Transaction, error) { + if sequences == nil || sequences.Len() == 0 { + return nil, fmt.Errorf("can't sequence an empty sequence") + } + batchesData := convertToBatchesData(sequences) + dataAvailabilityMessage, err := t.da.PostSequenceElderberry(ctx, batchesData) + if err != nil { + t.logger.Error("error posting sequences to the data availability protocol: ", err) + return nil, err + } + if dataAvailabilityMessage == nil { + err := fmt.Errorf("data availability message is nil") + t.logger.Error("error posting sequences to the data availability protocol: ", err.Error()) + return nil, err + } + newopts := t.opts + newopts.NoSend = true + + // force nonce, gas limit and gas price to avoid querying it from the chain + newopts.Nonce = big.NewInt(1) + newopts.GasLimit = uint64(1) + newopts.GasPrice = big.NewInt(1) + + return t.buildSequenceBatchesTxValidium(&newopts, sequences, dataAvailabilityMessage) +} + +func (t *TxBuilderElderberryValidium) buildSequenceBatchesTxValidium(opts *bind.TransactOpts, + sequences seqsendertypes.Sequence, dataAvailabilityMessage []byte) (*types.Transaction, error) { + batches := make([]polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, sequences.Len()) + for i, seq := range sequences.Batches() { + var ger common.Hash + if seq.ForcedBatchTimestamp() > 0 { + ger = seq.GlobalExitRoot() + } + batches[i] = polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData{ + TransactionsHash: crypto.Keccak256Hash(seq.L2Data()), + ForcedGlobalExitRoot: ger, + ForcedTimestamp: seq.ForcedBatchTimestamp(), + ForcedBlockHashL1: seq.ForcedBlockHashL1(), + } + } + lastSequencedBatchNumber := getLastSequencedBatchNumber(sequences) + t.logger.Infof("SequenceBatchesValidium(from=%s, len(batches)=%d, MaxSequenceTimestamp=%d, "+ + "lastSequencedBatchNumber=%d, L2Coinbase=%s, dataAvailabilityMessage=%s)", + t.opts.From.String(), len(batches), sequences.MaxSequenceTimestamp(), lastSequencedBatchNumber, + sequences.L2Coinbase().String(), hex.EncodeToString(dataAvailabilityMessage), + ) + tx, err := t.rollupContract.SequenceBatchesValidium(opts, batches, sequences.MaxSequenceTimestamp(), + lastSequencedBatchNumber, sequences.L2Coinbase(), dataAvailabilityMessage) + if err != nil { + if parsedErr, ok := etherman.TryParseError(err); ok { + err = parsedErr + } + } + + return tx, err +} + +func (t *TxBuilderElderberryValidium) String() string { + return "Elderberry/Validium" +} + +func convertToBatchesData(sequences seqsendertypes.Sequence) [][]byte { + batches := make([][]byte, sequences.Len()) + for i, batch := range sequences.Batches() { + batches[i] = batch.L2Data() + } + return batches +} diff --git a/sequencesender/txbuilder/elderberry_validium_test.go b/sequencesender/txbuilder/elderberry_validium_test.go new file mode 100644 index 00000000..ee6b10f8 --- /dev/null +++ b/sequencesender/txbuilder/elderberry_validium_test.go @@ -0,0 +1,119 @@ +package txbuilder_test + +import ( + "context" + "fmt" + "math/big" + "strings" + "testing" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonvalidiumetrog" + "github.com/agglayer/aggkit/dataavailability/mocks_da" + "github.com/agglayer/aggkit/etherman/contracts" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestElderberryValidiumName(t *testing.T) { + testData := newElderberryValidiumSUT(t) + require.NotNil(t, testData.sut) + require.True(t, strings.Contains(testData.sut.String(), "Elderberry")) + require.True(t, strings.Contains(testData.sut.String(), "Validium")) +} + +func TestElderberryValidiumBuildSequenceBatchesTxEmtpySequence(t *testing.T) { + testData := newElderberryValidiumSUT(t) + ctx := context.TODO() + _, err := testData.sut.BuildSequenceBatchesTx(ctx, nil) + require.Error(t, err) + + seq, err := testData.sut.NewSequence(context.TODO(), nil, common.Address{}) + require.NoError(t, err) + _, err = testData.sut.BuildSequenceBatchesTx(ctx, seq) + require.Error(t, err) +} + +func TestElderberryValidiumBuildSequenceBatchesTxSequenceErrorsFromDA(t *testing.T) { + testData := newElderberryValidiumSUT(t) + ctx := context.TODO() + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 1, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batchElder := testData.sut.NewBatchFromL2Block(l2Block) + batches := []seqsendertypes.Batch{ + batchElder, + } + seq, err := testData.sut.NewSequence(context.TODO(), batches, common.Address{}) + require.NoError(t, err) + testData.mockDA.EXPECT().PostSequenceElderberry(ctx, mock.Anything).Return(nil, nil) + _, err = testData.sut.BuildSequenceBatchesTx(ctx, seq) + require.Error(t, err, "data availability message is nil") + testData.mockDA.EXPECT().PostSequenceElderberry(ctx, mock.Anything).Return(nil, fmt.Errorf("test error")) + _, err = testData.sut.BuildSequenceBatchesTx(ctx, seq) + require.Error(t, err, "error posting sequences to the data availability protocol: test error") +} + +func TestElderberryValidiumBuildSequenceBatchesTxSequenceDAOk(t *testing.T) { + testData := newElderberryValidiumSUT(t) + ctx := context.TODO() + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 1, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batchElder := testData.sut.NewBatchFromL2Block(l2Block) + batches := []seqsendertypes.Batch{ + batchElder, + } + seq, err := testData.sut.NewSequence(context.TODO(), batches, common.Address{}) + require.NoError(t, err) + testData.mockDA.EXPECT().PostSequenceElderberry(ctx, mock.Anything).Return([]byte{1}, nil) + tx, err := testData.sut.BuildSequenceBatchesTx(ctx, seq) + require.NoError(t, err) + require.NotNil(t, tx) +} + +func TestElderberryValidiumNewSequenceIfWorthToSend(t *testing.T) { + testData := newElderberryValidiumSUT(t) + testSequenceIfWorthToSendNoNewSeq(t, testData.sut) + testSequenceIfWorthToSendErr(t, testData.sut) + testSetCondNewSeq(t, testData.sut) +} + +type testDataElderberryValidium struct { + mockDA *mocks_da.SequenceSenderElderberry + sut *txbuilder.TxBuilderElderberryValidium +} + +func newElderberryValidiumSUT(t *testing.T) *testDataElderberryValidium { + t.Helper() + + zkevmContract, err := contracts.NewContractMagic[contracts.RollupElderberryType](polygonvalidiumetrog.NewPolygonvalidiumetrog, common.Address{}, nil, contracts.ContractNameRollup, contracts.VersionElderberry) + require.NoError(t, err) + privateKey, err := crypto.HexToECDSA("64e679029f5032046955d41713dcc4b565de77ab891748d31bcf38864b54c175") + require.NoError(t, err) + opts, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(1)) + require.NoError(t, err) + + da := mocks_da.NewSequenceSenderElderberry(t) + + sut := txbuilder.NewTxBuilderElderberryValidium(log.GetDefaultLogger(), *zkevmContract, da, *opts, uint64(100)) + require.NotNil(t, sut) + return &testDataElderberryValidium{ + mockDA: da, + sut: sut, + } +} diff --git a/sequencesender/txbuilder/elderberry_zkevm.go b/sequencesender/txbuilder/elderberry_zkevm.go new file mode 100644 index 00000000..53b22f58 --- /dev/null +++ b/sequencesender/txbuilder/elderberry_zkevm.go @@ -0,0 +1,113 @@ +package txbuilder + +import ( + "context" + "fmt" + "math/big" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonvalidiumetrog" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +type TxBuilderElderberryZKEVM struct { + TxBuilderElderberryBase + condNewSeq CondNewSequence + rollupContract rollupElderberryZKEVMContractor +} + +type rollupElderberryZKEVMContractor interface { + SequenceBatches( + opts *bind.TransactOpts, + batches []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, + maxSequenceTimestamp uint64, + initSequencedBatch uint64, + l2Coinbase common.Address, + ) (*types.Transaction, error) +} + +func NewTxBuilderElderberryZKEVM( + logger *log.Logger, zkevm rollupElderberryZKEVMContractor, + opts bind.TransactOpts, maxTxSizeForL1 uint64, +) *TxBuilderElderberryZKEVM { + return &TxBuilderElderberryZKEVM{ + TxBuilderElderberryBase: *NewTxBuilderElderberryBase(logger, opts), + condNewSeq: NewConditionalNewSequenceMaxSize(maxTxSizeForL1), + rollupContract: zkevm, + } +} + +func (t *TxBuilderElderberryZKEVM) NewSequenceIfWorthToSend( + ctx context.Context, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, batchNumber uint64, +) (seqsendertypes.Sequence, error) { + return t.condNewSeq.NewSequenceIfWorthToSend(ctx, t, sequenceBatches, l2Coinbase) +} + +// SetCondNewSeq allow to override the default conditional for new sequence +func (t *TxBuilderElderberryZKEVM) SetCondNewSeq(cond CondNewSequence) CondNewSequence { + previous := t.condNewSeq + t.condNewSeq = cond + return previous +} + +func (t *TxBuilderElderberryZKEVM) BuildSequenceBatchesTx( + ctx context.Context, sequences seqsendertypes.Sequence, +) (*types.Transaction, error) { + newopts := t.opts + newopts.NoSend = true + + // force nonce, gas limit and gas price to avoid querying it from the chain + newopts.Nonce = big.NewInt(1) + newopts.GasLimit = uint64(1) + newopts.GasPrice = big.NewInt(1) + + return t.sequenceBatchesRollup(newopts, sequences) +} + +func (t *TxBuilderElderberryZKEVM) sequenceBatchesRollup( + opts bind.TransactOpts, sequences seqsendertypes.Sequence, +) (*types.Transaction, error) { + if sequences == nil || sequences.Len() == 0 { + return nil, fmt.Errorf("can't sequence an empty sequence") + } + batches := make([]polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, sequences.Len()) + for i, seq := range sequences.Batches() { + var ger common.Hash + if seq.ForcedBatchTimestamp() > 0 { + ger = seq.GlobalExitRoot() + } + + batches[i] = polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData{ + Transactions: seq.L2Data(), + ForcedGlobalExitRoot: ger, + ForcedTimestamp: seq.ForcedBatchTimestamp(), + // TODO: Check that is ok to use ForcedBlockHashL1 instead PrevBlockHash + ForcedBlockHashL1: seq.ForcedBlockHashL1(), + } + } + lastSequencedBatchNumber := getLastSequencedBatchNumber(sequences) + tx, err := t.rollupContract.SequenceBatches( + &opts, batches, sequences.MaxSequenceTimestamp(), lastSequencedBatchNumber, sequences.L2Coinbase(), + ) + if err != nil { + t.warningMessage(batches, sequences.L2Coinbase(), &opts) + if parsedErr, ok := etherman.TryParseError(err); ok { + err = parsedErr + } + } + + return tx, err +} + +func (t *TxBuilderElderberryZKEVM) warningMessage( + batches []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, l2Coinbase common.Address, opts *bind.TransactOpts) { + t.logger.Warnf("Sequencer address: ", opts.From, "l2CoinBase: ", l2Coinbase, " Batches to send: %+v", batches) +} + +func (t *TxBuilderElderberryZKEVM) String() string { + return "Elderberry/ZKEVM" +} diff --git a/sequencesender/txbuilder/elderberry_zkevm_test.go b/sequencesender/txbuilder/elderberry_zkevm_test.go new file mode 100644 index 00000000..fdc8e40e --- /dev/null +++ b/sequencesender/txbuilder/elderberry_zkevm_test.go @@ -0,0 +1,113 @@ +package txbuilder_test + +import ( + "context" + "math/big" + "strings" + "testing" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonvalidiumetrog" + "github.com/agglayer/aggkit/etherman/contracts" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/require" +) + +func TestElderberryZkevmName(t *testing.T) { + zkevmContract := contracts.RollupElderberryType{} + opts := bind.TransactOpts{} + sut := txbuilder.NewTxBuilderElderberryZKEVM(log.GetDefaultLogger(), zkevmContract, opts, 100) + require.NotNil(t, sut) + require.True(t, strings.Contains(sut.String(), "Elderberry")) + require.True(t, strings.Contains(sut.String(), "ZKEVM")) +} + +func TestElderberryZkevmNewSequence(t *testing.T) { + zkevmContract := contracts.RollupElderberryType{} + opts := bind.TransactOpts{} + sut := txbuilder.NewTxBuilderElderberryZKEVM(log.GetDefaultLogger(), zkevmContract, opts, 100) + require.NotNil(t, sut) + seq, err := sut.NewSequence(context.TODO(), nil, common.Address{}) + require.NoError(t, err) + require.NotNil(t, seq) +} + +func TestElderberryZkevmBuildSequenceBatchesTxEmtpySequence(t *testing.T) { + sut := newElderberryZkevmSUT(t) + ctx := context.TODO() + _, err := sut.BuildSequenceBatchesTx(ctx, nil) + require.Error(t, err) + + seq, err := sut.NewSequence(context.TODO(), nil, common.Address{}) + require.NoError(t, err) + _, err = sut.BuildSequenceBatchesTx(ctx, seq) + require.Error(t, err) +} + +func TestElderberryZkevmBuildSequenceBatchesTxSequence1Batch(t *testing.T) { + sut := newElderberryZkevmSUT(t) + ctx := context.TODO() + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 1, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batchElder := sut.NewBatchFromL2Block(l2Block) + batches := []seqsendertypes.Batch{ + batchElder, + } + seq, err := sut.NewSequence(context.TODO(), batches, common.Address{}) + require.NoError(t, err) + _, err = sut.BuildSequenceBatchesTx(ctx, seq) + require.NoError(t, err) +} + +// This have to signer so produce an error +func TestElderberryZkevmBuildSequenceBatchesTxSequence1BatchError(t *testing.T) { + sut := newElderberryZkevmSUT(t) + sut.SetAuth(&bind.TransactOpts{}) + ctx := context.TODO() + l2Block := &datastream.L2Block{ + Timestamp: 1, + BatchNumber: 1, + L1InfotreeIndex: 3, + Coinbase: []byte{1, 2, 3}, + GlobalExitRoot: []byte{4, 5, 6}, + } + batchElder := sut.NewBatchFromL2Block(l2Block) + batches := []seqsendertypes.Batch{ + batchElder, + } + seq, err := sut.NewSequence(context.TODO(), batches, common.Address{}) + require.NoError(t, err) + _, err = sut.BuildSequenceBatchesTx(ctx, seq) + require.Error(t, err) +} + +func TestElderberryZkevmNewSequenceIfWorthToSend(t *testing.T) { + sut := newElderberryZkevmSUT(t) + testSequenceIfWorthToSendNoNewSeq(t, sut) + testSequenceIfWorthToSendErr(t, sut) + testSetCondNewSeq(t, sut) +} + +func newElderberryZkevmSUT(t *testing.T) *txbuilder.TxBuilderElderberryZKEVM { + t.Helper() + + zkevmContract, err := contracts.NewContractMagic[contracts.RollupElderberryType](polygonvalidiumetrog.NewPolygonvalidiumetrog, common.Address{}, nil, contracts.ContractNameRollup, contracts.VersionElderberry) + require.NoError(t, err) + privateKey, err := crypto.HexToECDSA("64e679029f5032046955d41713dcc4b565de77ab891748d31bcf38864b54c175") + require.NoError(t, err) + opts, err := bind.NewKeyedTransactorWithChainID(privateKey, big.NewInt(1)) + require.NoError(t, err) + sut := txbuilder.NewTxBuilderElderberryZKEVM(log.GetDefaultLogger(), *zkevmContract, *opts, 100) + require.NotNil(t, sut) + return sut +} diff --git a/sequencesender/txbuilder/interface.go b/sequencesender/txbuilder/interface.go new file mode 100644 index 00000000..1d018cdb --- /dev/null +++ b/sequencesender/txbuilder/interface.go @@ -0,0 +1,38 @@ +package txbuilder + +import ( + "context" + "fmt" + + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" +) + +type TxBuilder interface { + // Stringer interface + fmt.Stringer + + // BuildSequenceBatchesTx Builds a sequence of batches transaction + BuildSequenceBatchesTx(ctx context.Context, sequences seqsendertypes.Sequence) (*ethtypes.Transaction, error) + // NewSequence Creates a new sequence + NewSequence( + ctx context.Context, batches []seqsendertypes.Batch, coinbase common.Address, + ) (seqsendertypes.Sequence, error) + // NewSequenceIfWorthToSend Creates a new sequence if it is worth sending + NewSequenceIfWorthToSend( + ctx context.Context, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, batchNumber uint64, + ) (seqsendertypes.Sequence, error) + // NewBatchFromL2Block Creates a new batch from the L2 block from a datastream + NewBatchFromL2Block(l2Block *datastream.L2Block) seqsendertypes.Batch + // SetCondNewSeq Allows to override the condition to send a new sequence, returns previous one + SetCondNewSeq(cond CondNewSequence) CondNewSequence +} + +type CondNewSequence interface { + // NewSequenceIfWorthToSend Return nil, nil if the sequence is not worth sending + NewSequenceIfWorthToSend( + ctx context.Context, txBuilder TxBuilder, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, + ) (seqsendertypes.Sequence, error) +} diff --git a/sequencesender/txbuilder/interface_test.go b/sequencesender/txbuilder/interface_test.go new file mode 100644 index 00000000..8ad3157d --- /dev/null +++ b/sequencesender/txbuilder/interface_test.go @@ -0,0 +1,50 @@ +package txbuilder_test + +import ( + "context" + "fmt" + "testing" + + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/sequencesender/txbuilder/mocks_txbuilder" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +/* +This test ara auxiliars function based on the common behaviour of the interfaces +*/ + +func testSequenceIfWorthToSendNoNewSeq(t *testing.T, sut txbuilder.TxBuilder) { + t.Helper() + + cond := mocks_txbuilder.NewCondNewSequence(t) + sut.SetCondNewSeq(cond) + cond.EXPECT().NewSequenceIfWorthToSend(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Once() + seq, err := sut.NewSequenceIfWorthToSend(context.TODO(), nil, common.Address{}, 0) + require.NoError(t, err) + require.Nil(t, seq) +} + +func testSequenceIfWorthToSendErr(t *testing.T, sut txbuilder.TxBuilder) { + t.Helper() + + cond := mocks_txbuilder.NewCondNewSequence(t) + sut.SetCondNewSeq(cond) + returnErr := fmt.Errorf("test-error") + cond.EXPECT().NewSequenceIfWorthToSend(mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, returnErr).Once() + seq, err := sut.NewSequenceIfWorthToSend(context.TODO(), nil, common.Address{}, 0) + require.ErrorIs(t, returnErr, err) + require.Nil(t, seq) +} + +func testSetCondNewSeq(t *testing.T, sut txbuilder.TxBuilder) { + t.Helper() + + cond := mocks_txbuilder.NewCondNewSequence(t) + sut.SetCondNewSeq(cond) + cond2 := mocks_txbuilder.NewCondNewSequence(t) + previous := sut.SetCondNewSeq(cond2) + require.Equal(t, cond, previous) +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/cond_new_sequence.go b/sequencesender/txbuilder/mocks_txbuilder/cond_new_sequence.go new file mode 100644 index 00000000..e80ddd3d --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/cond_new_sequence.go @@ -0,0 +1,103 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + seqsendertypes "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + + txbuilder "github.com/agglayer/aggkit/sequencesender/txbuilder" +) + +// CondNewSequence is an autogenerated mock type for the CondNewSequence type +type CondNewSequence struct { + mock.Mock +} + +type CondNewSequence_Expecter struct { + mock *mock.Mock +} + +func (_m *CondNewSequence) EXPECT() *CondNewSequence_Expecter { + return &CondNewSequence_Expecter{mock: &_m.Mock} +} + +// NewSequenceIfWorthToSend provides a mock function with given fields: ctx, txBuilder, sequenceBatches, l2Coinbase +func (_m *CondNewSequence) NewSequenceIfWorthToSend(ctx context.Context, txBuilder txbuilder.TxBuilder, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address) (seqsendertypes.Sequence, error) { + ret := _m.Called(ctx, txBuilder, sequenceBatches, l2Coinbase) + + if len(ret) == 0 { + panic("no return value specified for NewSequenceIfWorthToSend") + } + + var r0 seqsendertypes.Sequence + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, txbuilder.TxBuilder, []seqsendertypes.Batch, common.Address) (seqsendertypes.Sequence, error)); ok { + return rf(ctx, txBuilder, sequenceBatches, l2Coinbase) + } + if rf, ok := ret.Get(0).(func(context.Context, txbuilder.TxBuilder, []seqsendertypes.Batch, common.Address) seqsendertypes.Sequence); ok { + r0 = rf(ctx, txBuilder, sequenceBatches, l2Coinbase) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(seqsendertypes.Sequence) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, txbuilder.TxBuilder, []seqsendertypes.Batch, common.Address) error); ok { + r1 = rf(ctx, txBuilder, sequenceBatches, l2Coinbase) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CondNewSequence_NewSequenceIfWorthToSend_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewSequenceIfWorthToSend' +type CondNewSequence_NewSequenceIfWorthToSend_Call struct { + *mock.Call +} + +// NewSequenceIfWorthToSend is a helper method to define mock.On call +// - ctx context.Context +// - txBuilder txbuilder.TxBuilder +// - sequenceBatches []seqsendertypes.Batch +// - l2Coinbase common.Address +func (_e *CondNewSequence_Expecter) NewSequenceIfWorthToSend(ctx interface{}, txBuilder interface{}, sequenceBatches interface{}, l2Coinbase interface{}) *CondNewSequence_NewSequenceIfWorthToSend_Call { + return &CondNewSequence_NewSequenceIfWorthToSend_Call{Call: _e.mock.On("NewSequenceIfWorthToSend", ctx, txBuilder, sequenceBatches, l2Coinbase)} +} + +func (_c *CondNewSequence_NewSequenceIfWorthToSend_Call) Run(run func(ctx context.Context, txBuilder txbuilder.TxBuilder, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address)) *CondNewSequence_NewSequenceIfWorthToSend_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(txbuilder.TxBuilder), args[2].([]seqsendertypes.Batch), args[3].(common.Address)) + }) + return _c +} + +func (_c *CondNewSequence_NewSequenceIfWorthToSend_Call) Return(_a0 seqsendertypes.Sequence, _a1 error) *CondNewSequence_NewSequenceIfWorthToSend_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *CondNewSequence_NewSequenceIfWorthToSend_Call) RunAndReturn(run func(context.Context, txbuilder.TxBuilder, []seqsendertypes.Batch, common.Address) (seqsendertypes.Sequence, error)) *CondNewSequence_NewSequenceIfWorthToSend_Call { + _c.Call.Return(run) + return _c +} + +// NewCondNewSequence creates a new instance of CondNewSequence. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewCondNewSequence(t interface { + mock.TestingT + Cleanup(func()) +}) *CondNewSequence { + mock := &CondNewSequence{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/global_exit_root_banana_contractor.go b/sequencesender/txbuilder/mocks_txbuilder/global_exit_root_banana_contractor.go new file mode 100644 index 00000000..86fd4366 --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/global_exit_root_banana_contractor.go @@ -0,0 +1,139 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + mock "github.com/stretchr/testify/mock" +) + +// GlobalExitRootBananaContractor is an autogenerated mock type for the globalExitRootBananaContractor type +type GlobalExitRootBananaContractor struct { + mock.Mock +} + +type GlobalExitRootBananaContractor_Expecter struct { + mock *mock.Mock +} + +func (_m *GlobalExitRootBananaContractor) EXPECT() *GlobalExitRootBananaContractor_Expecter { + return &GlobalExitRootBananaContractor_Expecter{mock: &_m.Mock} +} + +// L1InfoRootMap provides a mock function with given fields: opts, index +func (_m *GlobalExitRootBananaContractor) L1InfoRootMap(opts *bind.CallOpts, index uint32) ([32]byte, error) { + ret := _m.Called(opts, index) + + if len(ret) == 0 { + panic("no return value specified for L1InfoRootMap") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint32) ([32]byte, error)); ok { + return rf(opts, index) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint32) [32]byte); ok { + r0 = rf(opts, index) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint32) error); ok { + r1 = rf(opts, index) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GlobalExitRootBananaContractor_L1InfoRootMap_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'L1InfoRootMap' +type GlobalExitRootBananaContractor_L1InfoRootMap_Call struct { + *mock.Call +} + +// L1InfoRootMap is a helper method to define mock.On call +// - opts *bind.CallOpts +// - index uint32 +func (_e *GlobalExitRootBananaContractor_Expecter) L1InfoRootMap(opts interface{}, index interface{}) *GlobalExitRootBananaContractor_L1InfoRootMap_Call { + return &GlobalExitRootBananaContractor_L1InfoRootMap_Call{Call: _e.mock.On("L1InfoRootMap", opts, index)} +} + +func (_c *GlobalExitRootBananaContractor_L1InfoRootMap_Call) Run(run func(opts *bind.CallOpts, index uint32)) *GlobalExitRootBananaContractor_L1InfoRootMap_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(uint32)) + }) + return _c +} + +func (_c *GlobalExitRootBananaContractor_L1InfoRootMap_Call) Return(_a0 [32]byte, _a1 error) *GlobalExitRootBananaContractor_L1InfoRootMap_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *GlobalExitRootBananaContractor_L1InfoRootMap_Call) RunAndReturn(run func(*bind.CallOpts, uint32) ([32]byte, error)) *GlobalExitRootBananaContractor_L1InfoRootMap_Call { + _c.Call.Return(run) + return _c +} + +// String provides a mock function with no fields +func (_m *GlobalExitRootBananaContractor) String() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for String") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// GlobalExitRootBananaContractor_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String' +type GlobalExitRootBananaContractor_String_Call struct { + *mock.Call +} + +// String is a helper method to define mock.On call +func (_e *GlobalExitRootBananaContractor_Expecter) String() *GlobalExitRootBananaContractor_String_Call { + return &GlobalExitRootBananaContractor_String_Call{Call: _e.mock.On("String")} +} + +func (_c *GlobalExitRootBananaContractor_String_Call) Run(run func()) *GlobalExitRootBananaContractor_String_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *GlobalExitRootBananaContractor_String_Call) Return(_a0 string) *GlobalExitRootBananaContractor_String_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GlobalExitRootBananaContractor_String_Call) RunAndReturn(run func() string) *GlobalExitRootBananaContractor_String_Call { + _c.Call.Return(run) + return _c +} + +// NewGlobalExitRootBananaContractor creates a new instance of GlobalExitRootBananaContractor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewGlobalExitRootBananaContractor(t interface { + mock.TestingT + Cleanup(func()) +}) *GlobalExitRootBananaContractor { + mock := &GlobalExitRootBananaContractor{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/global_exit_root_banana_zkevm_contractor.go b/sequencesender/txbuilder/mocks_txbuilder/global_exit_root_banana_zkevm_contractor.go new file mode 100644 index 00000000..57c6c157 --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/global_exit_root_banana_zkevm_contractor.go @@ -0,0 +1,139 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + mock "github.com/stretchr/testify/mock" +) + +// GlobalExitRootBananaZKEVMContractor is an autogenerated mock type for the globalExitRootBananaZKEVMContractor type +type GlobalExitRootBananaZKEVMContractor struct { + mock.Mock +} + +type GlobalExitRootBananaZKEVMContractor_Expecter struct { + mock *mock.Mock +} + +func (_m *GlobalExitRootBananaZKEVMContractor) EXPECT() *GlobalExitRootBananaZKEVMContractor_Expecter { + return &GlobalExitRootBananaZKEVMContractor_Expecter{mock: &_m.Mock} +} + +// L1InfoRootMap provides a mock function with given fields: opts, index +func (_m *GlobalExitRootBananaZKEVMContractor) L1InfoRootMap(opts *bind.CallOpts, index uint32) ([32]byte, error) { + ret := _m.Called(opts, index) + + if len(ret) == 0 { + panic("no return value specified for L1InfoRootMap") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint32) ([32]byte, error)); ok { + return rf(opts, index) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint32) [32]byte); ok { + r0 = rf(opts, index) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint32) error); ok { + r1 = rf(opts, index) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'L1InfoRootMap' +type GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call struct { + *mock.Call +} + +// L1InfoRootMap is a helper method to define mock.On call +// - opts *bind.CallOpts +// - index uint32 +func (_e *GlobalExitRootBananaZKEVMContractor_Expecter) L1InfoRootMap(opts interface{}, index interface{}) *GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call { + return &GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call{Call: _e.mock.On("L1InfoRootMap", opts, index)} +} + +func (_c *GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call) Run(run func(opts *bind.CallOpts, index uint32)) *GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(uint32)) + }) + return _c +} + +func (_c *GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call) Return(_a0 [32]byte, _a1 error) *GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call) RunAndReturn(run func(*bind.CallOpts, uint32) ([32]byte, error)) *GlobalExitRootBananaZKEVMContractor_L1InfoRootMap_Call { + _c.Call.Return(run) + return _c +} + +// String provides a mock function with no fields +func (_m *GlobalExitRootBananaZKEVMContractor) String() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for String") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// GlobalExitRootBananaZKEVMContractor_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String' +type GlobalExitRootBananaZKEVMContractor_String_Call struct { + *mock.Call +} + +// String is a helper method to define mock.On call +func (_e *GlobalExitRootBananaZKEVMContractor_Expecter) String() *GlobalExitRootBananaZKEVMContractor_String_Call { + return &GlobalExitRootBananaZKEVMContractor_String_Call{Call: _e.mock.On("String")} +} + +func (_c *GlobalExitRootBananaZKEVMContractor_String_Call) Run(run func()) *GlobalExitRootBananaZKEVMContractor_String_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *GlobalExitRootBananaZKEVMContractor_String_Call) Return(_a0 string) *GlobalExitRootBananaZKEVMContractor_String_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *GlobalExitRootBananaZKEVMContractor_String_Call) RunAndReturn(run func() string) *GlobalExitRootBananaZKEVMContractor_String_Call { + _c.Call.Return(run) + return _c +} + +// NewGlobalExitRootBananaZKEVMContractor creates a new instance of GlobalExitRootBananaZKEVMContractor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewGlobalExitRootBananaZKEVMContractor(t interface { + mock.TestingT + Cleanup(func()) +}) *GlobalExitRootBananaZKEVMContractor { + mock := &GlobalExitRootBananaZKEVMContractor{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/l1_client.go b/sequencesender/txbuilder/mocks_txbuilder/l1_client.go new file mode 100644 index 00000000..853494f9 --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/l1_client.go @@ -0,0 +1,98 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + context "context" + big "math/big" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// L1Client is an autogenerated mock type for the l1Client type +type L1Client struct { + mock.Mock +} + +type L1Client_Expecter struct { + mock *mock.Mock +} + +func (_m *L1Client) EXPECT() *L1Client_Expecter { + return &L1Client_Expecter{mock: &_m.Mock} +} + +// HeaderByNumber provides a mock function with given fields: ctx, number +func (_m *L1Client) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for HeaderByNumber") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Header, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Header); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1Client_HeaderByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByNumber' +type L1Client_HeaderByNumber_Call struct { + *mock.Call +} + +// HeaderByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *L1Client_Expecter) HeaderByNumber(ctx interface{}, number interface{}) *L1Client_HeaderByNumber_Call { + return &L1Client_HeaderByNumber_Call{Call: _e.mock.On("HeaderByNumber", ctx, number)} +} + +func (_c *L1Client_HeaderByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *L1Client_HeaderByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *L1Client_HeaderByNumber_Call) Return(_a0 *types.Header, _a1 error) *L1Client_HeaderByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1Client_HeaderByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*types.Header, error)) *L1Client_HeaderByNumber_Call { + _c.Call.Return(run) + return _c +} + +// NewL1Client creates a new instance of L1Client. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewL1Client(t interface { + mock.TestingT + Cleanup(func()) +}) *L1Client { + mock := &L1Client{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/l1_info_syncer.go b/sequencesender/txbuilder/mocks_txbuilder/l1_info_syncer.go new file mode 100644 index 00000000..1ff380d5 --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/l1_info_syncer.go @@ -0,0 +1,154 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + context "context" + + l1infotreesync "github.com/agglayer/aggkit/l1infotreesync" + mock "github.com/stretchr/testify/mock" +) + +// L1InfoSyncer is an autogenerated mock type for the l1InfoSyncer type +type L1InfoSyncer struct { + mock.Mock +} + +type L1InfoSyncer_Expecter struct { + mock *mock.Mock +} + +func (_m *L1InfoSyncer) EXPECT() *L1InfoSyncer_Expecter { + return &L1InfoSyncer_Expecter{mock: &_m.Mock} +} + +// GetInitL1InfoRootMap provides a mock function with given fields: ctx +func (_m *L1InfoSyncer) GetInitL1InfoRootMap(ctx context.Context) (*l1infotreesync.L1InfoTreeInitial, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetInitL1InfoRootMap") + } + + var r0 *l1infotreesync.L1InfoTreeInitial + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*l1infotreesync.L1InfoTreeInitial, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *l1infotreesync.L1InfoTreeInitial); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeInitial) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoSyncer_GetInitL1InfoRootMap_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetInitL1InfoRootMap' +type L1InfoSyncer_GetInitL1InfoRootMap_Call struct { + *mock.Call +} + +// GetInitL1InfoRootMap is a helper method to define mock.On call +// - ctx context.Context +func (_e *L1InfoSyncer_Expecter) GetInitL1InfoRootMap(ctx interface{}) *L1InfoSyncer_GetInitL1InfoRootMap_Call { + return &L1InfoSyncer_GetInitL1InfoRootMap_Call{Call: _e.mock.On("GetInitL1InfoRootMap", ctx)} +} + +func (_c *L1InfoSyncer_GetInitL1InfoRootMap_Call) Run(run func(ctx context.Context)) *L1InfoSyncer_GetInitL1InfoRootMap_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *L1InfoSyncer_GetInitL1InfoRootMap_Call) Return(_a0 *l1infotreesync.L1InfoTreeInitial, _a1 error) *L1InfoSyncer_GetInitL1InfoRootMap_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoSyncer_GetInitL1InfoRootMap_Call) RunAndReturn(run func(context.Context) (*l1infotreesync.L1InfoTreeInitial, error)) *L1InfoSyncer_GetInitL1InfoRootMap_Call { + _c.Call.Return(run) + return _c +} + +// GetLatestInfoUntilBlock provides a mock function with given fields: ctx, blockNum +func (_m *L1InfoSyncer) GetLatestInfoUntilBlock(ctx context.Context, blockNum uint64) (*l1infotreesync.L1InfoTreeLeaf, error) { + ret := _m.Called(ctx, blockNum) + + if len(ret) == 0 { + panic("no return value specified for GetLatestInfoUntilBlock") + } + + var r0 *l1infotreesync.L1InfoTreeLeaf + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, uint64) (*l1infotreesync.L1InfoTreeLeaf, error)); ok { + return rf(ctx, blockNum) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64) *l1infotreesync.L1InfoTreeLeaf); ok { + r0 = rf(ctx, blockNum) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*l1infotreesync.L1InfoTreeLeaf) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok { + r1 = rf(ctx, blockNum) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L1InfoSyncer_GetLatestInfoUntilBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLatestInfoUntilBlock' +type L1InfoSyncer_GetLatestInfoUntilBlock_Call struct { + *mock.Call +} + +// GetLatestInfoUntilBlock is a helper method to define mock.On call +// - ctx context.Context +// - blockNum uint64 +func (_e *L1InfoSyncer_Expecter) GetLatestInfoUntilBlock(ctx interface{}, blockNum interface{}) *L1InfoSyncer_GetLatestInfoUntilBlock_Call { + return &L1InfoSyncer_GetLatestInfoUntilBlock_Call{Call: _e.mock.On("GetLatestInfoUntilBlock", ctx, blockNum)} +} + +func (_c *L1InfoSyncer_GetLatestInfoUntilBlock_Call) Run(run func(ctx context.Context, blockNum uint64)) *L1InfoSyncer_GetLatestInfoUntilBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64)) + }) + return _c +} + +func (_c *L1InfoSyncer_GetLatestInfoUntilBlock_Call) Return(_a0 *l1infotreesync.L1InfoTreeLeaf, _a1 error) *L1InfoSyncer_GetLatestInfoUntilBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L1InfoSyncer_GetLatestInfoUntilBlock_Call) RunAndReturn(run func(context.Context, uint64) (*l1infotreesync.L1InfoTreeLeaf, error)) *L1InfoSyncer_GetLatestInfoUntilBlock_Call { + _c.Call.Return(run) + return _c +} + +// NewL1InfoSyncer creates a new instance of L1InfoSyncer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewL1InfoSyncer(t interface { + mock.TestingT + Cleanup(func()) +}) *L1InfoSyncer { + mock := &L1InfoSyncer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/rollup_banana_base_contractor.go b/sequencesender/txbuilder/mocks_txbuilder/rollup_banana_base_contractor.go new file mode 100644 index 00000000..acd82a4e --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/rollup_banana_base_contractor.go @@ -0,0 +1,93 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + mock "github.com/stretchr/testify/mock" +) + +// RollupBananaBaseContractor is an autogenerated mock type for the rollupBananaBaseContractor type +type RollupBananaBaseContractor struct { + mock.Mock +} + +type RollupBananaBaseContractor_Expecter struct { + mock *mock.Mock +} + +func (_m *RollupBananaBaseContractor) EXPECT() *RollupBananaBaseContractor_Expecter { + return &RollupBananaBaseContractor_Expecter{mock: &_m.Mock} +} + +// LastAccInputHash provides a mock function with given fields: opts +func (_m *RollupBananaBaseContractor) LastAccInputHash(opts *bind.CallOpts) ([32]byte, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for LastAccInputHash") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) ([32]byte, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) [32]byte); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RollupBananaBaseContractor_LastAccInputHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LastAccInputHash' +type RollupBananaBaseContractor_LastAccInputHash_Call struct { + *mock.Call +} + +// LastAccInputHash is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *RollupBananaBaseContractor_Expecter) LastAccInputHash(opts interface{}) *RollupBananaBaseContractor_LastAccInputHash_Call { + return &RollupBananaBaseContractor_LastAccInputHash_Call{Call: _e.mock.On("LastAccInputHash", opts)} +} + +func (_c *RollupBananaBaseContractor_LastAccInputHash_Call) Run(run func(opts *bind.CallOpts)) *RollupBananaBaseContractor_LastAccInputHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *RollupBananaBaseContractor_LastAccInputHash_Call) Return(_a0 [32]byte, _a1 error) *RollupBananaBaseContractor_LastAccInputHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RollupBananaBaseContractor_LastAccInputHash_Call) RunAndReturn(run func(*bind.CallOpts) ([32]byte, error)) *RollupBananaBaseContractor_LastAccInputHash_Call { + _c.Call.Return(run) + return _c +} + +// NewRollupBananaBaseContractor creates a new instance of RollupBananaBaseContractor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRollupBananaBaseContractor(t interface { + mock.TestingT + Cleanup(func()) +}) *RollupBananaBaseContractor { + mock := &RollupBananaBaseContractor{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/rollup_banana_validium_contractor.go b/sequencesender/txbuilder/mocks_txbuilder/rollup_banana_validium_contractor.go new file mode 100644 index 00000000..a59b88dd --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/rollup_banana_validium_contractor.go @@ -0,0 +1,163 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + polygonvalidiumetrog "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygonvalidiumetrog" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// RollupBananaValidiumContractor is an autogenerated mock type for the rollupBananaValidiumContractor type +type RollupBananaValidiumContractor struct { + mock.Mock +} + +type RollupBananaValidiumContractor_Expecter struct { + mock *mock.Mock +} + +func (_m *RollupBananaValidiumContractor) EXPECT() *RollupBananaValidiumContractor_Expecter { + return &RollupBananaValidiumContractor_Expecter{mock: &_m.Mock} +} + +// LastAccInputHash provides a mock function with given fields: opts +func (_m *RollupBananaValidiumContractor) LastAccInputHash(opts *bind.CallOpts) ([32]byte, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for LastAccInputHash") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) ([32]byte, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) [32]byte); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RollupBananaValidiumContractor_LastAccInputHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LastAccInputHash' +type RollupBananaValidiumContractor_LastAccInputHash_Call struct { + *mock.Call +} + +// LastAccInputHash is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *RollupBananaValidiumContractor_Expecter) LastAccInputHash(opts interface{}) *RollupBananaValidiumContractor_LastAccInputHash_Call { + return &RollupBananaValidiumContractor_LastAccInputHash_Call{Call: _e.mock.On("LastAccInputHash", opts)} +} + +func (_c *RollupBananaValidiumContractor_LastAccInputHash_Call) Run(run func(opts *bind.CallOpts)) *RollupBananaValidiumContractor_LastAccInputHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *RollupBananaValidiumContractor_LastAccInputHash_Call) Return(_a0 [32]byte, _a1 error) *RollupBananaValidiumContractor_LastAccInputHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RollupBananaValidiumContractor_LastAccInputHash_Call) RunAndReturn(run func(*bind.CallOpts) ([32]byte, error)) *RollupBananaValidiumContractor_LastAccInputHash_Call { + _c.Call.Return(run) + return _c +} + +// SequenceBatchesValidium provides a mock function with given fields: opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase, dataAvailabilityMessage +func (_m *RollupBananaValidiumContractor) SequenceBatchesValidium(opts *bind.TransactOpts, batches []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, indexL1InfoRoot uint32, maxSequenceTimestamp uint64, expectedFinalAccInputHash [32]byte, l2Coinbase common.Address, dataAvailabilityMessage []byte) (*types.Transaction, error) { + ret := _m.Called(opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase, dataAvailabilityMessage) + + if len(ret) == 0 { + panic("no return value specified for SequenceBatchesValidium") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, uint32, uint64, [32]byte, common.Address, []byte) (*types.Transaction, error)); ok { + return rf(opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase, dataAvailabilityMessage) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, uint32, uint64, [32]byte, common.Address, []byte) *types.Transaction); ok { + r0 = rf(opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase, dataAvailabilityMessage) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, uint32, uint64, [32]byte, common.Address, []byte) error); ok { + r1 = rf(opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase, dataAvailabilityMessage) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RollupBananaValidiumContractor_SequenceBatchesValidium_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SequenceBatchesValidium' +type RollupBananaValidiumContractor_SequenceBatchesValidium_Call struct { + *mock.Call +} + +// SequenceBatchesValidium is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - batches []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData +// - indexL1InfoRoot uint32 +// - maxSequenceTimestamp uint64 +// - expectedFinalAccInputHash [32]byte +// - l2Coinbase common.Address +// - dataAvailabilityMessage []byte +func (_e *RollupBananaValidiumContractor_Expecter) SequenceBatchesValidium(opts interface{}, batches interface{}, indexL1InfoRoot interface{}, maxSequenceTimestamp interface{}, expectedFinalAccInputHash interface{}, l2Coinbase interface{}, dataAvailabilityMessage interface{}) *RollupBananaValidiumContractor_SequenceBatchesValidium_Call { + return &RollupBananaValidiumContractor_SequenceBatchesValidium_Call{Call: _e.mock.On("SequenceBatchesValidium", opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase, dataAvailabilityMessage)} +} + +func (_c *RollupBananaValidiumContractor_SequenceBatchesValidium_Call) Run(run func(opts *bind.TransactOpts, batches []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, indexL1InfoRoot uint32, maxSequenceTimestamp uint64, expectedFinalAccInputHash [32]byte, l2Coinbase common.Address, dataAvailabilityMessage []byte)) *RollupBananaValidiumContractor_SequenceBatchesValidium_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([]polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData), args[2].(uint32), args[3].(uint64), args[4].([32]byte), args[5].(common.Address), args[6].([]byte)) + }) + return _c +} + +func (_c *RollupBananaValidiumContractor_SequenceBatchesValidium_Call) Return(_a0 *types.Transaction, _a1 error) *RollupBananaValidiumContractor_SequenceBatchesValidium_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RollupBananaValidiumContractor_SequenceBatchesValidium_Call) RunAndReturn(run func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, uint32, uint64, [32]byte, common.Address, []byte) (*types.Transaction, error)) *RollupBananaValidiumContractor_SequenceBatchesValidium_Call { + _c.Call.Return(run) + return _c +} + +// NewRollupBananaValidiumContractor creates a new instance of RollupBananaValidiumContractor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRollupBananaValidiumContractor(t interface { + mock.TestingT + Cleanup(func()) +}) *RollupBananaValidiumContractor { + mock := &RollupBananaValidiumContractor{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/rollup_banana_zkevm_contractor.go b/sequencesender/txbuilder/mocks_txbuilder/rollup_banana_zkevm_contractor.go new file mode 100644 index 00000000..e29e3252 --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/rollup_banana_zkevm_contractor.go @@ -0,0 +1,162 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + polygonvalidiumetrog "github.com/0xPolygon/cdk-contracts-tooling/contracts/banana/polygonvalidiumetrog" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// RollupBananaZKEVMContractor is an autogenerated mock type for the rollupBananaZKEVMContractor type +type RollupBananaZKEVMContractor struct { + mock.Mock +} + +type RollupBananaZKEVMContractor_Expecter struct { + mock *mock.Mock +} + +func (_m *RollupBananaZKEVMContractor) EXPECT() *RollupBananaZKEVMContractor_Expecter { + return &RollupBananaZKEVMContractor_Expecter{mock: &_m.Mock} +} + +// LastAccInputHash provides a mock function with given fields: opts +func (_m *RollupBananaZKEVMContractor) LastAccInputHash(opts *bind.CallOpts) ([32]byte, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for LastAccInputHash") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) ([32]byte, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) [32]byte); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RollupBananaZKEVMContractor_LastAccInputHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LastAccInputHash' +type RollupBananaZKEVMContractor_LastAccInputHash_Call struct { + *mock.Call +} + +// LastAccInputHash is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *RollupBananaZKEVMContractor_Expecter) LastAccInputHash(opts interface{}) *RollupBananaZKEVMContractor_LastAccInputHash_Call { + return &RollupBananaZKEVMContractor_LastAccInputHash_Call{Call: _e.mock.On("LastAccInputHash", opts)} +} + +func (_c *RollupBananaZKEVMContractor_LastAccInputHash_Call) Run(run func(opts *bind.CallOpts)) *RollupBananaZKEVMContractor_LastAccInputHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *RollupBananaZKEVMContractor_LastAccInputHash_Call) Return(_a0 [32]byte, _a1 error) *RollupBananaZKEVMContractor_LastAccInputHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RollupBananaZKEVMContractor_LastAccInputHash_Call) RunAndReturn(run func(*bind.CallOpts) ([32]byte, error)) *RollupBananaZKEVMContractor_LastAccInputHash_Call { + _c.Call.Return(run) + return _c +} + +// SequenceBatches provides a mock function with given fields: opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase +func (_m *RollupBananaZKEVMContractor) SequenceBatches(opts *bind.TransactOpts, batches []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, indexL1InfoRoot uint32, maxSequenceTimestamp uint64, expectedFinalAccInputHash [32]byte, l2Coinbase common.Address) (*types.Transaction, error) { + ret := _m.Called(opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase) + + if len(ret) == 0 { + panic("no return value specified for SequenceBatches") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, uint32, uint64, [32]byte, common.Address) (*types.Transaction, error)); ok { + return rf(opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, uint32, uint64, [32]byte, common.Address) *types.Transaction); ok { + r0 = rf(opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, uint32, uint64, [32]byte, common.Address) error); ok { + r1 = rf(opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RollupBananaZKEVMContractor_SequenceBatches_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SequenceBatches' +type RollupBananaZKEVMContractor_SequenceBatches_Call struct { + *mock.Call +} + +// SequenceBatches is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - batches []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData +// - indexL1InfoRoot uint32 +// - maxSequenceTimestamp uint64 +// - expectedFinalAccInputHash [32]byte +// - l2Coinbase common.Address +func (_e *RollupBananaZKEVMContractor_Expecter) SequenceBatches(opts interface{}, batches interface{}, indexL1InfoRoot interface{}, maxSequenceTimestamp interface{}, expectedFinalAccInputHash interface{}, l2Coinbase interface{}) *RollupBananaZKEVMContractor_SequenceBatches_Call { + return &RollupBananaZKEVMContractor_SequenceBatches_Call{Call: _e.mock.On("SequenceBatches", opts, batches, indexL1InfoRoot, maxSequenceTimestamp, expectedFinalAccInputHash, l2Coinbase)} +} + +func (_c *RollupBananaZKEVMContractor_SequenceBatches_Call) Run(run func(opts *bind.TransactOpts, batches []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, indexL1InfoRoot uint32, maxSequenceTimestamp uint64, expectedFinalAccInputHash [32]byte, l2Coinbase common.Address)) *RollupBananaZKEVMContractor_SequenceBatches_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([]polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData), args[2].(uint32), args[3].(uint64), args[4].([32]byte), args[5].(common.Address)) + }) + return _c +} + +func (_c *RollupBananaZKEVMContractor_SequenceBatches_Call) Return(_a0 *types.Transaction, _a1 error) *RollupBananaZKEVMContractor_SequenceBatches_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RollupBananaZKEVMContractor_SequenceBatches_Call) RunAndReturn(run func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, uint32, uint64, [32]byte, common.Address) (*types.Transaction, error)) *RollupBananaZKEVMContractor_SequenceBatches_Call { + _c.Call.Return(run) + return _c +} + +// NewRollupBananaZKEVMContractor creates a new instance of RollupBananaZKEVMContractor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRollupBananaZKEVMContractor(t interface { + mock.TestingT + Cleanup(func()) +}) *RollupBananaZKEVMContractor { + mock := &RollupBananaZKEVMContractor{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/rollup_elderberry_validium_contractor.go b/sequencesender/txbuilder/mocks_txbuilder/rollup_elderberry_validium_contractor.go new file mode 100644 index 00000000..0d94c081 --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/rollup_elderberry_validium_contractor.go @@ -0,0 +1,104 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + polygonvalidiumetrog "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonvalidiumetrog" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// RollupElderberryValidiumContractor is an autogenerated mock type for the rollupElderberryValidiumContractor type +type RollupElderberryValidiumContractor struct { + mock.Mock +} + +type RollupElderberryValidiumContractor_Expecter struct { + mock *mock.Mock +} + +func (_m *RollupElderberryValidiumContractor) EXPECT() *RollupElderberryValidiumContractor_Expecter { + return &RollupElderberryValidiumContractor_Expecter{mock: &_m.Mock} +} + +// SequenceBatchesValidium provides a mock function with given fields: opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase, dataAvailabilityMessage +func (_m *RollupElderberryValidiumContractor) SequenceBatchesValidium(opts *bind.TransactOpts, batches []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, maxSequenceTimestamp uint64, initSequencedBatch uint64, l2Coinbase common.Address, dataAvailabilityMessage []byte) (*types.Transaction, error) { + ret := _m.Called(opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase, dataAvailabilityMessage) + + if len(ret) == 0 { + panic("no return value specified for SequenceBatchesValidium") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, uint64, uint64, common.Address, []byte) (*types.Transaction, error)); ok { + return rf(opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase, dataAvailabilityMessage) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, uint64, uint64, common.Address, []byte) *types.Transaction); ok { + r0 = rf(opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase, dataAvailabilityMessage) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, uint64, uint64, common.Address, []byte) error); ok { + r1 = rf(opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase, dataAvailabilityMessage) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RollupElderberryValidiumContractor_SequenceBatchesValidium_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SequenceBatchesValidium' +type RollupElderberryValidiumContractor_SequenceBatchesValidium_Call struct { + *mock.Call +} + +// SequenceBatchesValidium is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - batches []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData +// - maxSequenceTimestamp uint64 +// - initSequencedBatch uint64 +// - l2Coinbase common.Address +// - dataAvailabilityMessage []byte +func (_e *RollupElderberryValidiumContractor_Expecter) SequenceBatchesValidium(opts interface{}, batches interface{}, maxSequenceTimestamp interface{}, initSequencedBatch interface{}, l2Coinbase interface{}, dataAvailabilityMessage interface{}) *RollupElderberryValidiumContractor_SequenceBatchesValidium_Call { + return &RollupElderberryValidiumContractor_SequenceBatchesValidium_Call{Call: _e.mock.On("SequenceBatchesValidium", opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase, dataAvailabilityMessage)} +} + +func (_c *RollupElderberryValidiumContractor_SequenceBatchesValidium_Call) Run(run func(opts *bind.TransactOpts, batches []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, maxSequenceTimestamp uint64, initSequencedBatch uint64, l2Coinbase common.Address, dataAvailabilityMessage []byte)) *RollupElderberryValidiumContractor_SequenceBatchesValidium_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([]polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData), args[2].(uint64), args[3].(uint64), args[4].(common.Address), args[5].([]byte)) + }) + return _c +} + +func (_c *RollupElderberryValidiumContractor_SequenceBatchesValidium_Call) Return(_a0 *types.Transaction, _a1 error) *RollupElderberryValidiumContractor_SequenceBatchesValidium_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RollupElderberryValidiumContractor_SequenceBatchesValidium_Call) RunAndReturn(run func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonValidiumEtrogValidiumBatchData, uint64, uint64, common.Address, []byte) (*types.Transaction, error)) *RollupElderberryValidiumContractor_SequenceBatchesValidium_Call { + _c.Call.Return(run) + return _c +} + +// NewRollupElderberryValidiumContractor creates a new instance of RollupElderberryValidiumContractor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRollupElderberryValidiumContractor(t interface { + mock.TestingT + Cleanup(func()) +}) *RollupElderberryValidiumContractor { + mock := &RollupElderberryValidiumContractor{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/rollup_elderberry_zkevm_contractor.go b/sequencesender/txbuilder/mocks_txbuilder/rollup_elderberry_zkevm_contractor.go new file mode 100644 index 00000000..1ed208ab --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/rollup_elderberry_zkevm_contractor.go @@ -0,0 +1,103 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + polygonvalidiumetrog "github.com/0xPolygon/cdk-contracts-tooling/contracts/elderberry/polygonvalidiumetrog" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// RollupElderberryZKEVMContractor is an autogenerated mock type for the rollupElderberryZKEVMContractor type +type RollupElderberryZKEVMContractor struct { + mock.Mock +} + +type RollupElderberryZKEVMContractor_Expecter struct { + mock *mock.Mock +} + +func (_m *RollupElderberryZKEVMContractor) EXPECT() *RollupElderberryZKEVMContractor_Expecter { + return &RollupElderberryZKEVMContractor_Expecter{mock: &_m.Mock} +} + +// SequenceBatches provides a mock function with given fields: opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase +func (_m *RollupElderberryZKEVMContractor) SequenceBatches(opts *bind.TransactOpts, batches []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, maxSequenceTimestamp uint64, initSequencedBatch uint64, l2Coinbase common.Address) (*types.Transaction, error) { + ret := _m.Called(opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase) + + if len(ret) == 0 { + panic("no return value specified for SequenceBatches") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, uint64, uint64, common.Address) (*types.Transaction, error)); ok { + return rf(opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, uint64, uint64, common.Address) *types.Transaction); ok { + r0 = rf(opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, uint64, uint64, common.Address) error); ok { + r1 = rf(opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// RollupElderberryZKEVMContractor_SequenceBatches_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SequenceBatches' +type RollupElderberryZKEVMContractor_SequenceBatches_Call struct { + *mock.Call +} + +// SequenceBatches is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - batches []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData +// - maxSequenceTimestamp uint64 +// - initSequencedBatch uint64 +// - l2Coinbase common.Address +func (_e *RollupElderberryZKEVMContractor_Expecter) SequenceBatches(opts interface{}, batches interface{}, maxSequenceTimestamp interface{}, initSequencedBatch interface{}, l2Coinbase interface{}) *RollupElderberryZKEVMContractor_SequenceBatches_Call { + return &RollupElderberryZKEVMContractor_SequenceBatches_Call{Call: _e.mock.On("SequenceBatches", opts, batches, maxSequenceTimestamp, initSequencedBatch, l2Coinbase)} +} + +func (_c *RollupElderberryZKEVMContractor_SequenceBatches_Call) Run(run func(opts *bind.TransactOpts, batches []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, maxSequenceTimestamp uint64, initSequencedBatch uint64, l2Coinbase common.Address)) *RollupElderberryZKEVMContractor_SequenceBatches_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([]polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData), args[2].(uint64), args[3].(uint64), args[4].(common.Address)) + }) + return _c +} + +func (_c *RollupElderberryZKEVMContractor_SequenceBatches_Call) Return(_a0 *types.Transaction, _a1 error) *RollupElderberryZKEVMContractor_SequenceBatches_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *RollupElderberryZKEVMContractor_SequenceBatches_Call) RunAndReturn(run func(*bind.TransactOpts, []polygonvalidiumetrog.PolygonRollupBaseEtrogBatchData, uint64, uint64, common.Address) (*types.Transaction, error)) *RollupElderberryZKEVMContractor_SequenceBatches_Call { + _c.Call.Return(run) + return _c +} + +// NewRollupElderberryZKEVMContractor creates a new instance of RollupElderberryZKEVMContractor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewRollupElderberryZKEVMContractor(t interface { + mock.TestingT + Cleanup(func()) +}) *RollupElderberryZKEVMContractor { + mock := &RollupElderberryZKEVMContractor{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/mocks_txbuilder/tx_builder.go b/sequencesender/txbuilder/mocks_txbuilder/tx_builder.go new file mode 100644 index 00000000..bebb7dd2 --- /dev/null +++ b/sequencesender/txbuilder/mocks_txbuilder/tx_builder.go @@ -0,0 +1,367 @@ +// Code generated by mockery. DO NOT EDIT. + +package mocks_txbuilder + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + datastream "github.com/agglayer/aggkit/state/datastream" + + mock "github.com/stretchr/testify/mock" + + seqsendertypes "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + + txbuilder "github.com/agglayer/aggkit/sequencesender/txbuilder" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// TxBuilder is an autogenerated mock type for the TxBuilder type +type TxBuilder struct { + mock.Mock +} + +type TxBuilder_Expecter struct { + mock *mock.Mock +} + +func (_m *TxBuilder) EXPECT() *TxBuilder_Expecter { + return &TxBuilder_Expecter{mock: &_m.Mock} +} + +// BuildSequenceBatchesTx provides a mock function with given fields: ctx, sequences +func (_m *TxBuilder) BuildSequenceBatchesTx(ctx context.Context, sequences seqsendertypes.Sequence) (*types.Transaction, error) { + ret := _m.Called(ctx, sequences) + + if len(ret) == 0 { + panic("no return value specified for BuildSequenceBatchesTx") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, seqsendertypes.Sequence) (*types.Transaction, error)); ok { + return rf(ctx, sequences) + } + if rf, ok := ret.Get(0).(func(context.Context, seqsendertypes.Sequence) *types.Transaction); ok { + r0 = rf(ctx, sequences) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, seqsendertypes.Sequence) error); ok { + r1 = rf(ctx, sequences) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxBuilder_BuildSequenceBatchesTx_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BuildSequenceBatchesTx' +type TxBuilder_BuildSequenceBatchesTx_Call struct { + *mock.Call +} + +// BuildSequenceBatchesTx is a helper method to define mock.On call +// - ctx context.Context +// - sequences seqsendertypes.Sequence +func (_e *TxBuilder_Expecter) BuildSequenceBatchesTx(ctx interface{}, sequences interface{}) *TxBuilder_BuildSequenceBatchesTx_Call { + return &TxBuilder_BuildSequenceBatchesTx_Call{Call: _e.mock.On("BuildSequenceBatchesTx", ctx, sequences)} +} + +func (_c *TxBuilder_BuildSequenceBatchesTx_Call) Run(run func(ctx context.Context, sequences seqsendertypes.Sequence)) *TxBuilder_BuildSequenceBatchesTx_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(seqsendertypes.Sequence)) + }) + return _c +} + +func (_c *TxBuilder_BuildSequenceBatchesTx_Call) Return(_a0 *types.Transaction, _a1 error) *TxBuilder_BuildSequenceBatchesTx_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxBuilder_BuildSequenceBatchesTx_Call) RunAndReturn(run func(context.Context, seqsendertypes.Sequence) (*types.Transaction, error)) *TxBuilder_BuildSequenceBatchesTx_Call { + _c.Call.Return(run) + return _c +} + +// NewBatchFromL2Block provides a mock function with given fields: l2Block +func (_m *TxBuilder) NewBatchFromL2Block(l2Block *datastream.L2Block) seqsendertypes.Batch { + ret := _m.Called(l2Block) + + if len(ret) == 0 { + panic("no return value specified for NewBatchFromL2Block") + } + + var r0 seqsendertypes.Batch + if rf, ok := ret.Get(0).(func(*datastream.L2Block) seqsendertypes.Batch); ok { + r0 = rf(l2Block) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(seqsendertypes.Batch) + } + } + + return r0 +} + +// TxBuilder_NewBatchFromL2Block_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewBatchFromL2Block' +type TxBuilder_NewBatchFromL2Block_Call struct { + *mock.Call +} + +// NewBatchFromL2Block is a helper method to define mock.On call +// - l2Block *datastream.L2Block +func (_e *TxBuilder_Expecter) NewBatchFromL2Block(l2Block interface{}) *TxBuilder_NewBatchFromL2Block_Call { + return &TxBuilder_NewBatchFromL2Block_Call{Call: _e.mock.On("NewBatchFromL2Block", l2Block)} +} + +func (_c *TxBuilder_NewBatchFromL2Block_Call) Run(run func(l2Block *datastream.L2Block)) *TxBuilder_NewBatchFromL2Block_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*datastream.L2Block)) + }) + return _c +} + +func (_c *TxBuilder_NewBatchFromL2Block_Call) Return(_a0 seqsendertypes.Batch) *TxBuilder_NewBatchFromL2Block_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxBuilder_NewBatchFromL2Block_Call) RunAndReturn(run func(*datastream.L2Block) seqsendertypes.Batch) *TxBuilder_NewBatchFromL2Block_Call { + _c.Call.Return(run) + return _c +} + +// NewSequence provides a mock function with given fields: ctx, batches, coinbase +func (_m *TxBuilder) NewSequence(ctx context.Context, batches []seqsendertypes.Batch, coinbase common.Address) (seqsendertypes.Sequence, error) { + ret := _m.Called(ctx, batches, coinbase) + + if len(ret) == 0 { + panic("no return value specified for NewSequence") + } + + var r0 seqsendertypes.Sequence + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []seqsendertypes.Batch, common.Address) (seqsendertypes.Sequence, error)); ok { + return rf(ctx, batches, coinbase) + } + if rf, ok := ret.Get(0).(func(context.Context, []seqsendertypes.Batch, common.Address) seqsendertypes.Sequence); ok { + r0 = rf(ctx, batches, coinbase) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(seqsendertypes.Sequence) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []seqsendertypes.Batch, common.Address) error); ok { + r1 = rf(ctx, batches, coinbase) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxBuilder_NewSequence_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewSequence' +type TxBuilder_NewSequence_Call struct { + *mock.Call +} + +// NewSequence is a helper method to define mock.On call +// - ctx context.Context +// - batches []seqsendertypes.Batch +// - coinbase common.Address +func (_e *TxBuilder_Expecter) NewSequence(ctx interface{}, batches interface{}, coinbase interface{}) *TxBuilder_NewSequence_Call { + return &TxBuilder_NewSequence_Call{Call: _e.mock.On("NewSequence", ctx, batches, coinbase)} +} + +func (_c *TxBuilder_NewSequence_Call) Run(run func(ctx context.Context, batches []seqsendertypes.Batch, coinbase common.Address)) *TxBuilder_NewSequence_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]seqsendertypes.Batch), args[2].(common.Address)) + }) + return _c +} + +func (_c *TxBuilder_NewSequence_Call) Return(_a0 seqsendertypes.Sequence, _a1 error) *TxBuilder_NewSequence_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxBuilder_NewSequence_Call) RunAndReturn(run func(context.Context, []seqsendertypes.Batch, common.Address) (seqsendertypes.Sequence, error)) *TxBuilder_NewSequence_Call { + _c.Call.Return(run) + return _c +} + +// NewSequenceIfWorthToSend provides a mock function with given fields: ctx, sequenceBatches, l2Coinbase, batchNumber +func (_m *TxBuilder) NewSequenceIfWorthToSend(ctx context.Context, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, batchNumber uint64) (seqsendertypes.Sequence, error) { + ret := _m.Called(ctx, sequenceBatches, l2Coinbase, batchNumber) + + if len(ret) == 0 { + panic("no return value specified for NewSequenceIfWorthToSend") + } + + var r0 seqsendertypes.Sequence + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []seqsendertypes.Batch, common.Address, uint64) (seqsendertypes.Sequence, error)); ok { + return rf(ctx, sequenceBatches, l2Coinbase, batchNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, []seqsendertypes.Batch, common.Address, uint64) seqsendertypes.Sequence); ok { + r0 = rf(ctx, sequenceBatches, l2Coinbase, batchNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(seqsendertypes.Sequence) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []seqsendertypes.Batch, common.Address, uint64) error); ok { + r1 = rf(ctx, sequenceBatches, l2Coinbase, batchNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// TxBuilder_NewSequenceIfWorthToSend_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'NewSequenceIfWorthToSend' +type TxBuilder_NewSequenceIfWorthToSend_Call struct { + *mock.Call +} + +// NewSequenceIfWorthToSend is a helper method to define mock.On call +// - ctx context.Context +// - sequenceBatches []seqsendertypes.Batch +// - l2Coinbase common.Address +// - batchNumber uint64 +func (_e *TxBuilder_Expecter) NewSequenceIfWorthToSend(ctx interface{}, sequenceBatches interface{}, l2Coinbase interface{}, batchNumber interface{}) *TxBuilder_NewSequenceIfWorthToSend_Call { + return &TxBuilder_NewSequenceIfWorthToSend_Call{Call: _e.mock.On("NewSequenceIfWorthToSend", ctx, sequenceBatches, l2Coinbase, batchNumber)} +} + +func (_c *TxBuilder_NewSequenceIfWorthToSend_Call) Run(run func(ctx context.Context, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, batchNumber uint64)) *TxBuilder_NewSequenceIfWorthToSend_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]seqsendertypes.Batch), args[2].(common.Address), args[3].(uint64)) + }) + return _c +} + +func (_c *TxBuilder_NewSequenceIfWorthToSend_Call) Return(_a0 seqsendertypes.Sequence, _a1 error) *TxBuilder_NewSequenceIfWorthToSend_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *TxBuilder_NewSequenceIfWorthToSend_Call) RunAndReturn(run func(context.Context, []seqsendertypes.Batch, common.Address, uint64) (seqsendertypes.Sequence, error)) *TxBuilder_NewSequenceIfWorthToSend_Call { + _c.Call.Return(run) + return _c +} + +// SetCondNewSeq provides a mock function with given fields: cond +func (_m *TxBuilder) SetCondNewSeq(cond txbuilder.CondNewSequence) txbuilder.CondNewSequence { + ret := _m.Called(cond) + + if len(ret) == 0 { + panic("no return value specified for SetCondNewSeq") + } + + var r0 txbuilder.CondNewSequence + if rf, ok := ret.Get(0).(func(txbuilder.CondNewSequence) txbuilder.CondNewSequence); ok { + r0 = rf(cond) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(txbuilder.CondNewSequence) + } + } + + return r0 +} + +// TxBuilder_SetCondNewSeq_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetCondNewSeq' +type TxBuilder_SetCondNewSeq_Call struct { + *mock.Call +} + +// SetCondNewSeq is a helper method to define mock.On call +// - cond txbuilder.CondNewSequence +func (_e *TxBuilder_Expecter) SetCondNewSeq(cond interface{}) *TxBuilder_SetCondNewSeq_Call { + return &TxBuilder_SetCondNewSeq_Call{Call: _e.mock.On("SetCondNewSeq", cond)} +} + +func (_c *TxBuilder_SetCondNewSeq_Call) Run(run func(cond txbuilder.CondNewSequence)) *TxBuilder_SetCondNewSeq_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(txbuilder.CondNewSequence)) + }) + return _c +} + +func (_c *TxBuilder_SetCondNewSeq_Call) Return(_a0 txbuilder.CondNewSequence) *TxBuilder_SetCondNewSeq_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxBuilder_SetCondNewSeq_Call) RunAndReturn(run func(txbuilder.CondNewSequence) txbuilder.CondNewSequence) *TxBuilder_SetCondNewSeq_Call { + _c.Call.Return(run) + return _c +} + +// String provides a mock function with no fields +func (_m *TxBuilder) String() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for String") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// TxBuilder_String_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'String' +type TxBuilder_String_Call struct { + *mock.Call +} + +// String is a helper method to define mock.On call +func (_e *TxBuilder_Expecter) String() *TxBuilder_String_Call { + return &TxBuilder_String_Call{Call: _e.mock.On("String")} +} + +func (_c *TxBuilder_String_Call) Run(run func()) *TxBuilder_String_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *TxBuilder_String_Call) Return(_a0 string) *TxBuilder_String_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *TxBuilder_String_Call) RunAndReturn(run func() string) *TxBuilder_String_Call { + _c.Call.Return(run) + return _c +} + +// NewTxBuilder creates a new instance of TxBuilder. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTxBuilder(t interface { + mock.TestingT + Cleanup(func()) +}) *TxBuilder { + mock := &TxBuilder{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sequencesender/txbuilder/validium_cond_num_batches.go b/sequencesender/txbuilder/validium_cond_num_batches.go new file mode 100644 index 00000000..947551bd --- /dev/null +++ b/sequencesender/txbuilder/validium_cond_num_batches.go @@ -0,0 +1,34 @@ +package txbuilder + +import ( + "context" + + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/ethereum/go-ethereum/common" +) + +var MaxBatchesForL1Disabled = uint64(0) + +type ConditionalNewSequenceNumBatches struct { + maxBatchesForL1 uint64 // cfg.MaxBatchesForL1 +} + +func NewConditionalNewSequenceNumBatches(maxBatchesForL1 uint64) *ConditionalNewSequenceNumBatches { + return &ConditionalNewSequenceNumBatches{ + maxBatchesForL1: maxBatchesForL1, + } +} + +func (c *ConditionalNewSequenceNumBatches) NewSequenceIfWorthToSend( + ctx context.Context, txBuilder TxBuilder, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, +) (seqsendertypes.Sequence, error) { + if c.maxBatchesForL1 != MaxBatchesForL1Disabled && uint64(len(sequenceBatches)) >= c.maxBatchesForL1 { + log.Infof( + "sequence should be sent to L1, because MaxBatchesForL1 (%d) has been reached", + c.maxBatchesForL1, + ) + return txBuilder.NewSequence(ctx, sequenceBatches, l2Coinbase) + } + return nil, nil +} diff --git a/sequencesender/txbuilder/validium_cond_num_batches_test.go b/sequencesender/txbuilder/validium_cond_num_batches_test.go new file mode 100644 index 00000000..882dbe77 --- /dev/null +++ b/sequencesender/txbuilder/validium_cond_num_batches_test.go @@ -0,0 +1,46 @@ +package txbuilder_test + +import ( + "context" + "testing" + + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/sequencesender/txbuilder/mocks_txbuilder" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestConditionalNumBatchesDisabled(t *testing.T) { + mockTxBuilder := mocks_txbuilder.NewTxBuilder(t) + sut := txbuilder.NewConditionalNewSequenceNumBatches(0) + + tx, err := sut.NewSequenceIfWorthToSend(context.TODO(), mockTxBuilder, nil, common.Address{}) + require.NoError(t, err) + require.Nil(t, tx) +} + +// It have 1 batch and minium are 2, so no new sequence +func TestConditionalNumBatchesDontFulfillCondition(t *testing.T) { + mockTxBuilder := mocks_txbuilder.NewTxBuilder(t) + sut := txbuilder.NewConditionalNewSequenceNumBatches(2) + var sequenceBatches []seqsendertypes.Batch + sequenceBatches = append(sequenceBatches, &txbuilder.BananaBatch{}) + tx, err := sut.NewSequenceIfWorthToSend(context.TODO(), mockTxBuilder, sequenceBatches, common.Address{}) + require.NoError(t, err) + require.Nil(t, tx) +} + +// It have 2 batch and minium are 2, so new sequence +func TestConditionalNumBatchesFulfillCondition(t *testing.T) { + mockTxBuilder := mocks_txbuilder.NewTxBuilder(t) + sut := txbuilder.NewConditionalNewSequenceNumBatches(2) + var sequenceBatches []seqsendertypes.Batch + sequenceBatches = append(sequenceBatches, &txbuilder.BananaBatch{}) + sequenceBatches = append(sequenceBatches, &txbuilder.BananaBatch{}) + mockTxBuilder.EXPECT().NewSequence(context.TODO(), mock.Anything, mock.Anything).Return(nil, nil) + tx, err := sut.NewSequenceIfWorthToSend(context.TODO(), mockTxBuilder, sequenceBatches, common.Address{}) + require.NoError(t, err) + require.Nil(t, tx) +} diff --git a/sequencesender/txbuilder/zkevm_cond_max_size.go b/sequencesender/txbuilder/zkevm_cond_max_size.go new file mode 100644 index 00000000..d07077d7 --- /dev/null +++ b/sequencesender/txbuilder/zkevm_cond_max_size.go @@ -0,0 +1,124 @@ +package txbuilder + +import ( + "context" + "errors" + "fmt" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/ethereum/go-ethereum/common" +) + +var ( + // ErrOversizedData when transaction input data is greater than a limit (DOS protection) + ErrOversizedData = errors.New("oversized data") + MaxTxSizeForL1Disabled = uint64(0) +) + +type ConditionalNewSequenceMaxSize struct { + maxTxSizeForL1 uint64 // cfg.MaxTxSizeForL1 +} + +func NewConditionalNewSequenceMaxSize(maxTxSizeForL1 uint64) *ConditionalNewSequenceMaxSize { + return &ConditionalNewSequenceMaxSize{ + maxTxSizeForL1: maxTxSizeForL1, + } +} + +func (c *ConditionalNewSequenceMaxSize) NewSequenceIfWorthToSend( + ctx context.Context, txBuilder TxBuilder, sequenceBatches []seqsendertypes.Batch, l2Coinbase common.Address, +) (seqsendertypes.Sequence, error) { + if c.maxTxSizeForL1 == MaxTxSizeForL1Disabled { + log.Debugf("maxTxSizeForL1 is %d, so is disabled", MaxTxSizeForL1Disabled) + return nil, nil + } + sequence, err := txBuilder.NewSequence(ctx, sequenceBatches, l2Coinbase) + if err != nil { + return nil, err + } + if sequence == nil { + err = fmt.Errorf("error txBuilder.NewSequence, returns sequence=nil and err==nil, is not expected") + log.Errorf(err.Error()) + return nil, err + } + + // Check if can be sent + tx, err := txBuilder.BuildSequenceBatchesTx(ctx, sequence) + if tx == nil && err == nil { + err = fmt.Errorf("error txBuilder.BuildSequenceBatchesTx, returns tx=nil and err==nil, is not expected") + log.Errorf(err.Error()) + return nil, err + } + if err == nil && tx != nil && tx.Size() > c.maxTxSizeForL1 { + log.Infof("Oversized Data on TX oldHash %s (txSize %d > %d)", tx.Hash(), tx.Size(), c.maxTxSizeForL1) + err = ErrOversizedData + } + + if err != nil { + log.Debugf("Handling estimate gas send sequence error: %v", err) + sequenceBatches, err = handleEstimateGasSendSequenceErr(sequence.Batches(), err) + if sequenceBatches != nil { + // Handling the error gracefully, re-processing the sequence as a sanity check + sequence, err = txBuilder.NewSequence(ctx, sequenceBatches, l2Coinbase) + if err != nil { + return nil, err + } + + txReduced, err := txBuilder.BuildSequenceBatchesTx(ctx, sequence) + log.Debugf("After reducing batches: (txSize %d -> %d)", tx.Size(), txReduced.Size()) + if err == nil && txReduced != nil && txReduced.Size() > c.maxTxSizeForL1 { + log.Warnf("After reducing batches: (txSize %d -> %d) is still too big > %d", + tx.Size(), txReduced.Size(), c.maxTxSizeForL1, + ) + } + return sequence, err + } + + return sequence, err + } + log.Debugf( + "Current size:%d < max_size:%d num_batches: %d, no sequence promoted yet", + tx.Size(), c.maxTxSizeForL1, sequence.Len(), + ) + return nil, nil +} + +// handleEstimateGasSendSequenceErr handles an error on the estimate gas. +// Results: (nil,nil)=requires waiting, (nil,error)=no handled gracefully, (seq,nil) handled gracefully +func handleEstimateGasSendSequenceErr( + sequenceBatches []seqsendertypes.Batch, err error, +) ([]seqsendertypes.Batch, error) { + // Insufficient allowance + if errors.Is(err, etherman.ErrInsufficientAllowance) { + return nil, err + } + errMsg := fmt.Sprintf("due to unknown error: %v", err) + if isDataForEthTxTooBig(err) { + errMsg = fmt.Sprintf("caused the L1 tx to be too big: %v", err) + } + var adjustMsg string + if len(sequenceBatches) > 1 { + lastPrevious := sequenceBatches[len(sequenceBatches)-1].BatchNumber() + sequenceBatches = sequenceBatches[:len(sequenceBatches)-1] + lastCurrent := sequenceBatches[len(sequenceBatches)-1].BatchNumber() + adjustMsg = fmt.Sprintf( + "removing last batch: old BatchNumber:%d -> %d, new length: %d", + lastPrevious, lastCurrent, len(sequenceBatches), + ) + } else { + sequenceBatches = nil + adjustMsg = "removing all batches" + log.Warnf("No more batches to remove, sequence is empty... it could be a deadlock situation") + } + log.Infof("Adjusted sequence, %s, because %s", adjustMsg, errMsg) + return sequenceBatches, nil +} + +// isDataForEthTxTooBig checks if tx oversize error +func isDataForEthTxTooBig(err error) bool { + return errors.Is(err, etherman.ErrGasRequiredExceedsAllowance) || + errors.Is(err, ErrOversizedData) || + errors.Is(err, etherman.ErrContentLengthTooLarge) +} diff --git a/sequencesender/txbuilder/zkevm_cond_max_size_test.go b/sequencesender/txbuilder/zkevm_cond_max_size_test.go new file mode 100644 index 00000000..541ef661 --- /dev/null +++ b/sequencesender/txbuilder/zkevm_cond_max_size_test.go @@ -0,0 +1,95 @@ +package txbuilder_test + +import ( + "context" + "testing" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/sequencesender/seqsendertypes" + "github.com/agglayer/aggkit/sequencesender/txbuilder" + "github.com/agglayer/aggkit/sequencesender/txbuilder/mocks_txbuilder" + "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +func TestConditionalMaxSizeDisabled(t *testing.T) { + mockTxBuilder := mocks_txbuilder.NewTxBuilder(t) + sut := txbuilder.NewConditionalNewSequenceMaxSize(txbuilder.MaxTxSizeForL1Disabled) + + tx, err := sut.NewSequenceIfWorthToSend(context.TODO(), mockTxBuilder, nil, common.Address{}) + require.NoError(t, err) + require.Nil(t, tx) +} + +func TestConditionalMaxSizeTxBuilderNewSequenceReturnsNil(t *testing.T) { + mockTxBuilder := mocks_txbuilder.NewTxBuilder(t) + sut := txbuilder.NewConditionalNewSequenceMaxSize(1024) + var sequenceBatches []seqsendertypes.Batch + sequenceBatches = append(sequenceBatches, &txbuilder.BananaBatch{}) + mockTxBuilder.EXPECT().NewSequence(context.TODO(), sequenceBatches, common.Address{}).Return(nil, nil) + _, err := sut.NewSequenceIfWorthToSend(context.TODO(), mockTxBuilder, sequenceBatches, common.Address{}) + require.Error(t, err) +} + +func TestConditionalMaxSizeTxBuilderBuildSequenceBatchesTxReturnsNil(t *testing.T) { + mockTxBuilder := mocks_txbuilder.NewTxBuilder(t) + sut := txbuilder.NewConditionalNewSequenceMaxSize(1024) + var sequenceBatches []seqsendertypes.Batch + sequenceBatches = append(sequenceBatches, &txbuilder.BananaBatch{}) + seq := &txbuilder.ElderberrySequence{} + mockTxBuilder.EXPECT().NewSequence(context.TODO(), sequenceBatches, common.Address{}).Return(seq, nil) + mockTxBuilder.EXPECT().BuildSequenceBatchesTx(mock.Anything, mock.Anything).Return(nil, nil) + _, err := sut.NewSequenceIfWorthToSend(context.TODO(), mockTxBuilder, sequenceBatches, common.Address{}) + require.Error(t, err) +} + +func TestConditionalMaxSizeTxBuilderDontFulFill(t *testing.T) { + mockTxBuilder := mocks_txbuilder.NewTxBuilder(t) + sut := txbuilder.NewConditionalNewSequenceMaxSize(1024) + var sequenceBatches []seqsendertypes.Batch + sequenceBatches = append(sequenceBatches, &txbuilder.BananaBatch{}) + seq := &txbuilder.ElderberrySequence{} + mockTxBuilder.EXPECT().NewSequence(context.TODO(), sequenceBatches, common.Address{}).Return(seq, nil) + inner := ðtypes.LegacyTx{} + tx := ethtypes.NewTx(inner) + mockTxBuilder.EXPECT().BuildSequenceBatchesTx(mock.Anything, mock.Anything).Return(tx, nil) + + res, err := sut.NewSequenceIfWorthToSend(context.TODO(), mockTxBuilder, sequenceBatches, common.Address{}) + + require.NoError(t, err) + require.Nil(t, res) +} + +func TestConditionalMaxSizeTxBuilderFulFill(t *testing.T) { + mockTxBuilder := mocks_txbuilder.NewTxBuilder(t) + sut := txbuilder.NewConditionalNewSequenceMaxSize(10) + l2coinbase := common.Address{} + ctx := context.TODO() + + newSeq := newTestSeq(3, 100, l2coinbase) + mockTxBuilder.EXPECT().NewSequence(context.TODO(), newSeq.Batches(), l2coinbase).Return(newSeq, nil) + inner := ðtypes.LegacyTx{ + Data: []byte{0x01, 0x02, 0x03, 0x04}, + } + tx := ethtypes.NewTx(inner) + mockTxBuilder.EXPECT().BuildSequenceBatchesTx(ctx, newSeq).Return(tx, nil) + // The size of result Tx is 14 that is > 10, so it reduce 1 batch + newSeqReduced := newTestSeq(2, 100, l2coinbase) + mockTxBuilder.EXPECT().NewSequence(context.TODO(), newSeqReduced.Batches(), l2coinbase).Return(newSeqReduced, nil) + mockTxBuilder.EXPECT().BuildSequenceBatchesTx(ctx, newSeqReduced).Return(tx, nil) + + res, err := sut.NewSequenceIfWorthToSend(ctx, mockTxBuilder, newSeq.Batches(), l2coinbase) + + require.NoError(t, err) + require.NotNil(t, res) +} + +func newTestSeq(numBatches int, firstBatch uint64, l2coinbase common.Address) *txbuilder.ElderberrySequence { + var sequenceBatches []seqsendertypes.Batch + for i := 0; i < numBatches; i++ { + sequenceBatches = append(sequenceBatches, txbuilder.NewBananaBatch(ðerman.Batch{BatchNumber: firstBatch + uint64(i)})) + } + return txbuilder.NewElderberrySequence(sequenceBatches, l2coinbase) +} diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 00000000..93fc3294 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,30 @@ +# ===================================================== +# Standard properties +# ===================================================== + +sonar.projectKey=agglayer_aggkit +sonar.projectName=aggkit +sonar.organization=agglayer + +sonar.sources=. +sonar.exclusions=**/test/**,**/vendor/**,**/mocks/**,**/build/**,**/target/**,**/proto/include/**,**/*.pb.go,**/docs/**,**/*.sql,**/mocks_*/*,scripts/**,**/mock_*.go,**/cmd/**,tools/** + +sonar.tests=. +sonar.test.inclusions=**/*_test.go +sonar.test.exclusions=test/contracts/**,**/vendor/**,**/docs/**,**/mocks/**,**/*.pb.go,**/*.yml,**/*.yaml,**/*.json,**/*.xml,**/*.toml,**/mocks_*/*,**/mock_*.go,**/cmd/** +sonar.issue.enforceSemantic=true + +# ===================================================== +# Meta-data for the project +# ===================================================== + +sonar.links.homepage=https://github.com/agglayer/aggkit +sonar.links.ci=https://github.com/agglayer/aggkit/actions +sonar.links.scm=https://github.com/agglayer/aggkit +sonar.links.issue=https://github.com/agglayer/aggkit/issues + +# ===================================================== +# Properties specific to Go +# ===================================================== + +sonar.go.coverage.reportPaths=coverage.out diff --git a/state/batch.go b/state/batch.go new file mode 100644 index 00000000..d092942f --- /dev/null +++ b/state/batch.go @@ -0,0 +1,33 @@ +package state + +import ( + "time" + + "github.com/agglayer/aggkit/state/datastream" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// Batch struct +type Batch struct { + BatchNumber uint64 + Coinbase common.Address + BatchL2Data []byte + StateRoot common.Hash + LocalExitRoot common.Hash + AccInputHash common.Hash + L1InfoTreeIndex uint32 + L1InfoRoot common.Hash + // Timestamp (<=incaberry) -> batch time + // (>incaberry) -> minTimestamp used in batch creation, real timestamp is in virtual_batch.batch_timestamp + Timestamp time.Time + Transactions []types.Transaction + GlobalExitRoot common.Hash + ForcedBatchNum *uint64 + Resources BatchResources + // WIP: if WIP == true is a openBatch + WIP bool + ChainID uint64 + ForkID uint64 + Type datastream.BatchType +} diff --git a/state/datastream/datastream.pb.go b/state/datastream/datastream.pb.go new file mode 100644 index 00000000..e600a4fd --- /dev/null +++ b/state/datastream/datastream.pb.go @@ -0,0 +1,1069 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.1 +// protoc v5.27.0 +// source: datastream.proto + +package datastream + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type BookmarkType int32 + +const ( + BookmarkType_BOOKMARK_TYPE_UNSPECIFIED BookmarkType = 0 + BookmarkType_BOOKMARK_TYPE_BATCH BookmarkType = 1 + BookmarkType_BOOKMARK_TYPE_L2_BLOCK BookmarkType = 2 +) + +// Enum value maps for BookmarkType. +var ( + BookmarkType_name = map[int32]string{ + 0: "BOOKMARK_TYPE_UNSPECIFIED", + 1: "BOOKMARK_TYPE_BATCH", + 2: "BOOKMARK_TYPE_L2_BLOCK", + } + BookmarkType_value = map[string]int32{ + "BOOKMARK_TYPE_UNSPECIFIED": 0, + "BOOKMARK_TYPE_BATCH": 1, + "BOOKMARK_TYPE_L2_BLOCK": 2, + } +) + +func (x BookmarkType) Enum() *BookmarkType { + p := new(BookmarkType) + *p = x + return p +} + +func (x BookmarkType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BookmarkType) Descriptor() protoreflect.EnumDescriptor { + return file_datastream_proto_enumTypes[0].Descriptor() +} + +func (BookmarkType) Type() protoreflect.EnumType { + return &file_datastream_proto_enumTypes[0] +} + +func (x BookmarkType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BookmarkType.Descriptor instead. +func (BookmarkType) EnumDescriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{0} +} + +type EntryType int32 + +const ( + EntryType_ENTRY_TYPE_UNSPECIFIED EntryType = 0 + EntryType_ENTRY_TYPE_BATCH_START EntryType = 1 + EntryType_ENTRY_TYPE_L2_BLOCK EntryType = 2 + EntryType_ENTRY_TYPE_TRANSACTION EntryType = 3 + EntryType_ENTRY_TYPE_BATCH_END EntryType = 4 + EntryType_ENTRY_TYPE_UPDATE_GER EntryType = 5 +) + +// Enum value maps for EntryType. +var ( + EntryType_name = map[int32]string{ + 0: "ENTRY_TYPE_UNSPECIFIED", + 1: "ENTRY_TYPE_BATCH_START", + 2: "ENTRY_TYPE_L2_BLOCK", + 3: "ENTRY_TYPE_TRANSACTION", + 4: "ENTRY_TYPE_BATCH_END", + 5: "ENTRY_TYPE_UPDATE_GER", + } + EntryType_value = map[string]int32{ + "ENTRY_TYPE_UNSPECIFIED": 0, + "ENTRY_TYPE_BATCH_START": 1, + "ENTRY_TYPE_L2_BLOCK": 2, + "ENTRY_TYPE_TRANSACTION": 3, + "ENTRY_TYPE_BATCH_END": 4, + "ENTRY_TYPE_UPDATE_GER": 5, + } +) + +func (x EntryType) Enum() *EntryType { + p := new(EntryType) + *p = x + return p +} + +func (x EntryType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EntryType) Descriptor() protoreflect.EnumDescriptor { + return file_datastream_proto_enumTypes[1].Descriptor() +} + +func (EntryType) Type() protoreflect.EnumType { + return &file_datastream_proto_enumTypes[1] +} + +func (x EntryType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EntryType.Descriptor instead. +func (EntryType) EnumDescriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{1} +} + +type BatchType int32 + +const ( + BatchType_BATCH_TYPE_UNSPECIFIED BatchType = 0 + BatchType_BATCH_TYPE_REGULAR BatchType = 1 + BatchType_BATCH_TYPE_FORCED BatchType = 2 + BatchType_BATCH_TYPE_INJECTED BatchType = 3 + BatchType_BATCH_TYPE_INVALID BatchType = 4 +) + +// Enum value maps for BatchType. +var ( + BatchType_name = map[int32]string{ + 0: "BATCH_TYPE_UNSPECIFIED", + 1: "BATCH_TYPE_REGULAR", + 2: "BATCH_TYPE_FORCED", + 3: "BATCH_TYPE_INJECTED", + 4: "BATCH_TYPE_INVALID", + } + BatchType_value = map[string]int32{ + "BATCH_TYPE_UNSPECIFIED": 0, + "BATCH_TYPE_REGULAR": 1, + "BATCH_TYPE_FORCED": 2, + "BATCH_TYPE_INJECTED": 3, + "BATCH_TYPE_INVALID": 4, + } +) + +func (x BatchType) Enum() *BatchType { + p := new(BatchType) + *p = x + return p +} + +func (x BatchType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BatchType) Descriptor() protoreflect.EnumDescriptor { + return file_datastream_proto_enumTypes[2].Descriptor() +} + +func (BatchType) Type() protoreflect.EnumType { + return &file_datastream_proto_enumTypes[2] +} + +func (x BatchType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BatchType.Descriptor instead. +func (BatchType) EnumDescriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{2} +} + +type BatchStart struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Number uint64 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` + Type BatchType `protobuf:"varint,2,opt,name=type,proto3,enum=datastream.v1.BatchType" json:"type,omitempty"` + ForkId uint64 `protobuf:"varint,3,opt,name=fork_id,json=forkId,proto3" json:"fork_id,omitempty"` + ChainId uint64 `protobuf:"varint,4,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + Debug *Debug `protobuf:"bytes,5,opt,name=debug,proto3" json:"debug,omitempty"` +} + +func (x *BatchStart) Reset() { + *x = BatchStart{} + if protoimpl.UnsafeEnabled { + mi := &file_datastream_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchStart) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchStart) ProtoMessage() {} + +func (x *BatchStart) ProtoReflect() protoreflect.Message { + mi := &file_datastream_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchStart.ProtoReflect.Descriptor instead. +func (*BatchStart) Descriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{0} +} + +func (x *BatchStart) GetNumber() uint64 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *BatchStart) GetType() BatchType { + if x != nil { + return x.Type + } + return BatchType_BATCH_TYPE_UNSPECIFIED +} + +func (x *BatchStart) GetForkId() uint64 { + if x != nil { + return x.ForkId + } + return 0 +} + +func (x *BatchStart) GetChainId() uint64 { + if x != nil { + return x.ChainId + } + return 0 +} + +func (x *BatchStart) GetDebug() *Debug { + if x != nil { + return x.Debug + } + return nil +} + +type BatchEnd struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Number uint64 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` + LocalExitRoot []byte `protobuf:"bytes,2,opt,name=local_exit_root,json=localExitRoot,proto3" json:"local_exit_root,omitempty"` + StateRoot []byte `protobuf:"bytes,3,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` + Debug *Debug `protobuf:"bytes,4,opt,name=debug,proto3" json:"debug,omitempty"` +} + +func (x *BatchEnd) Reset() { + *x = BatchEnd{} + if protoimpl.UnsafeEnabled { + mi := &file_datastream_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchEnd) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchEnd) ProtoMessage() {} + +func (x *BatchEnd) ProtoReflect() protoreflect.Message { + mi := &file_datastream_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchEnd.ProtoReflect.Descriptor instead. +func (*BatchEnd) Descriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{1} +} + +func (x *BatchEnd) GetNumber() uint64 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *BatchEnd) GetLocalExitRoot() []byte { + if x != nil { + return x.LocalExitRoot + } + return nil +} + +func (x *BatchEnd) GetStateRoot() []byte { + if x != nil { + return x.StateRoot + } + return nil +} + +func (x *BatchEnd) GetDebug() *Debug { + if x != nil { + return x.Debug + } + return nil +} + +type L2Block struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Number uint64 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` + BatchNumber uint64 `protobuf:"varint,2,opt,name=batch_number,json=batchNumber,proto3" json:"batch_number,omitempty"` + Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + DeltaTimestamp uint32 `protobuf:"varint,4,opt,name=delta_timestamp,json=deltaTimestamp,proto3" json:"delta_timestamp,omitempty"` + MinTimestamp uint64 `protobuf:"varint,5,opt,name=min_timestamp,json=minTimestamp,proto3" json:"min_timestamp,omitempty"` + L1Blockhash []byte `protobuf:"bytes,6,opt,name=l1_blockhash,json=l1Blockhash,proto3" json:"l1_blockhash,omitempty"` + L1InfotreeIndex uint32 `protobuf:"varint,7,opt,name=l1_infotree_index,json=l1InfotreeIndex,proto3" json:"l1_infotree_index,omitempty"` + Hash []byte `protobuf:"bytes,8,opt,name=hash,proto3" json:"hash,omitempty"` + StateRoot []byte `protobuf:"bytes,9,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` + GlobalExitRoot []byte `protobuf:"bytes,10,opt,name=global_exit_root,json=globalExitRoot,proto3" json:"global_exit_root,omitempty"` + Coinbase []byte `protobuf:"bytes,11,opt,name=coinbase,proto3" json:"coinbase,omitempty"` + BlockGasLimit uint64 `protobuf:"varint,12,opt,name=block_gas_limit,json=blockGasLimit,proto3" json:"block_gas_limit,omitempty"` + BlockInfoRoot []byte `protobuf:"bytes,13,opt,name=block_info_root,json=blockInfoRoot,proto3" json:"block_info_root,omitempty"` + Debug *Debug `protobuf:"bytes,14,opt,name=debug,proto3" json:"debug,omitempty"` +} + +func (x *L2Block) Reset() { + *x = L2Block{} + if protoimpl.UnsafeEnabled { + mi := &file_datastream_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *L2Block) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*L2Block) ProtoMessage() {} + +func (x *L2Block) ProtoReflect() protoreflect.Message { + mi := &file_datastream_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use L2Block.ProtoReflect.Descriptor instead. +func (*L2Block) Descriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{2} +} + +func (x *L2Block) GetNumber() uint64 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *L2Block) GetBatchNumber() uint64 { + if x != nil { + return x.BatchNumber + } + return 0 +} + +func (x *L2Block) GetTimestamp() uint64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *L2Block) GetDeltaTimestamp() uint32 { + if x != nil { + return x.DeltaTimestamp + } + return 0 +} + +func (x *L2Block) GetMinTimestamp() uint64 { + if x != nil { + return x.MinTimestamp + } + return 0 +} + +func (x *L2Block) GetL1Blockhash() []byte { + if x != nil { + return x.L1Blockhash + } + return nil +} + +func (x *L2Block) GetL1InfotreeIndex() uint32 { + if x != nil { + return x.L1InfotreeIndex + } + return 0 +} + +func (x *L2Block) GetHash() []byte { + if x != nil { + return x.Hash + } + return nil +} + +func (x *L2Block) GetStateRoot() []byte { + if x != nil { + return x.StateRoot + } + return nil +} + +func (x *L2Block) GetGlobalExitRoot() []byte { + if x != nil { + return x.GlobalExitRoot + } + return nil +} + +func (x *L2Block) GetCoinbase() []byte { + if x != nil { + return x.Coinbase + } + return nil +} + +func (x *L2Block) GetBlockGasLimit() uint64 { + if x != nil { + return x.BlockGasLimit + } + return 0 +} + +func (x *L2Block) GetBlockInfoRoot() []byte { + if x != nil { + return x.BlockInfoRoot + } + return nil +} + +func (x *L2Block) GetDebug() *Debug { + if x != nil { + return x.Debug + } + return nil +} + +type Transaction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + L2BlockNumber uint64 `protobuf:"varint,1,opt,name=l2block_number,json=l2blockNumber,proto3" json:"l2block_number,omitempty"` + Index uint64 `protobuf:"varint,2,opt,name=index,proto3" json:"index,omitempty"` + IsValid bool `protobuf:"varint,3,opt,name=is_valid,json=isValid,proto3" json:"is_valid,omitempty"` + Encoded []byte `protobuf:"bytes,4,opt,name=encoded,proto3" json:"encoded,omitempty"` + EffectiveGasPricePercentage uint32 `protobuf:"varint,5,opt,name=effective_gas_price_percentage,json=effectiveGasPricePercentage,proto3" json:"effective_gas_price_percentage,omitempty"` + ImStateRoot []byte `protobuf:"bytes,6,opt,name=im_state_root,json=imStateRoot,proto3" json:"im_state_root,omitempty"` + Debug *Debug `protobuf:"bytes,7,opt,name=debug,proto3" json:"debug,omitempty"` +} + +func (x *Transaction) Reset() { + *x = Transaction{} + if protoimpl.UnsafeEnabled { + mi := &file_datastream_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Transaction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Transaction) ProtoMessage() {} + +func (x *Transaction) ProtoReflect() protoreflect.Message { + mi := &file_datastream_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Transaction.ProtoReflect.Descriptor instead. +func (*Transaction) Descriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{3} +} + +func (x *Transaction) GetL2BlockNumber() uint64 { + if x != nil { + return x.L2BlockNumber + } + return 0 +} + +func (x *Transaction) GetIndex() uint64 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *Transaction) GetIsValid() bool { + if x != nil { + return x.IsValid + } + return false +} + +func (x *Transaction) GetEncoded() []byte { + if x != nil { + return x.Encoded + } + return nil +} + +func (x *Transaction) GetEffectiveGasPricePercentage() uint32 { + if x != nil { + return x.EffectiveGasPricePercentage + } + return 0 +} + +func (x *Transaction) GetImStateRoot() []byte { + if x != nil { + return x.ImStateRoot + } + return nil +} + +func (x *Transaction) GetDebug() *Debug { + if x != nil { + return x.Debug + } + return nil +} + +type UpdateGER struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BatchNumber uint64 `protobuf:"varint,1,opt,name=batch_number,json=batchNumber,proto3" json:"batch_number,omitempty"` + Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + GlobalExitRoot []byte `protobuf:"bytes,3,opt,name=global_exit_root,json=globalExitRoot,proto3" json:"global_exit_root,omitempty"` + Coinbase []byte `protobuf:"bytes,4,opt,name=coinbase,proto3" json:"coinbase,omitempty"` + ForkId uint64 `protobuf:"varint,5,opt,name=fork_id,json=forkId,proto3" json:"fork_id,omitempty"` + ChainId uint64 `protobuf:"varint,6,opt,name=chain_id,json=chainId,proto3" json:"chain_id,omitempty"` + StateRoot []byte `protobuf:"bytes,7,opt,name=state_root,json=stateRoot,proto3" json:"state_root,omitempty"` + Debug *Debug `protobuf:"bytes,8,opt,name=debug,proto3" json:"debug,omitempty"` +} + +func (x *UpdateGER) Reset() { + *x = UpdateGER{} + if protoimpl.UnsafeEnabled { + mi := &file_datastream_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateGER) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGER) ProtoMessage() {} + +func (x *UpdateGER) ProtoReflect() protoreflect.Message { + mi := &file_datastream_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateGER.ProtoReflect.Descriptor instead. +func (*UpdateGER) Descriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{4} +} + +func (x *UpdateGER) GetBatchNumber() uint64 { + if x != nil { + return x.BatchNumber + } + return 0 +} + +func (x *UpdateGER) GetTimestamp() uint64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *UpdateGER) GetGlobalExitRoot() []byte { + if x != nil { + return x.GlobalExitRoot + } + return nil +} + +func (x *UpdateGER) GetCoinbase() []byte { + if x != nil { + return x.Coinbase + } + return nil +} + +func (x *UpdateGER) GetForkId() uint64 { + if x != nil { + return x.ForkId + } + return 0 +} + +func (x *UpdateGER) GetChainId() uint64 { + if x != nil { + return x.ChainId + } + return 0 +} + +func (x *UpdateGER) GetStateRoot() []byte { + if x != nil { + return x.StateRoot + } + return nil +} + +func (x *UpdateGER) GetDebug() *Debug { + if x != nil { + return x.Debug + } + return nil +} + +type BookMark struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type BookmarkType `protobuf:"varint,1,opt,name=type,proto3,enum=datastream.v1.BookmarkType" json:"type,omitempty"` + Value uint64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *BookMark) Reset() { + *x = BookMark{} + if protoimpl.UnsafeEnabled { + mi := &file_datastream_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BookMark) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BookMark) ProtoMessage() {} + +func (x *BookMark) ProtoReflect() protoreflect.Message { + mi := &file_datastream_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BookMark.ProtoReflect.Descriptor instead. +func (*BookMark) Descriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{5} +} + +func (x *BookMark) GetType() BookmarkType { + if x != nil { + return x.Type + } + return BookmarkType_BOOKMARK_TYPE_UNSPECIFIED +} + +func (x *BookMark) GetValue() uint64 { + if x != nil { + return x.Value + } + return 0 +} + +type Debug struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *Debug) Reset() { + *x = Debug{} + if protoimpl.UnsafeEnabled { + mi := &file_datastream_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Debug) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Debug) ProtoMessage() {} + +func (x *Debug) ProtoReflect() protoreflect.Message { + mi := &file_datastream_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Debug.ProtoReflect.Descriptor instead. +func (*Debug) Descriptor() ([]byte, []int) { + return file_datastream_proto_rawDescGZIP(), []int{6} +} + +func (x *Debug) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +var File_datastream_proto protoreflect.FileDescriptor + +var file_datastream_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, + 0x31, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x42, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x05, 0x64, 0x65, + 0x62, 0x75, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x52, + 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x22, 0x95, 0x01, 0x0a, 0x08, 0x42, 0x61, 0x74, 0x63, 0x68, + 0x45, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x45, 0x78, 0x69, 0x74, 0x52, + 0x6f, 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, + 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x52, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x22, 0xf4, + 0x03, 0x0a, 0x07, 0x4c, 0x32, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, + 0x6d, 0x69, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x21, 0x0a, 0x0c, 0x6c, 0x31, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x6c, 0x31, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x68, 0x61, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x31, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x74, + 0x72, 0x65, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0f, 0x6c, 0x31, 0x49, 0x6e, 0x66, 0x6f, 0x74, 0x72, 0x65, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, + 0x6f, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x6f, 0x6f, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x65, 0x78, + 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x45, 0x78, 0x69, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x47, 0x61, 0x73, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, + 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x64, 0x65, 0x62, + 0x75, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x52, 0x05, + 0x64, 0x65, 0x62, 0x75, 0x67, 0x22, 0x94, 0x02, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x32, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6c, + 0x32, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x1e, 0x65, 0x66, 0x66, 0x65, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x67, 0x61, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x1b, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x47, 0x61, 0x73, 0x50, 0x72, 0x69, + 0x63, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0d, + 0x69, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x69, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, + 0x12, 0x2a, 0x0a, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x52, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x22, 0x91, 0x02, 0x0a, + 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x45, 0x52, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0b, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x28, 0x0a, 0x10, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x45, 0x78, 0x69, + 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x69, 0x6e, 0x62, 0x61, 0x73, + 0x65, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x52, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, + 0x22, 0x51, 0x0a, 0x08, 0x42, 0x6f, 0x6f, 0x6b, 0x4d, 0x61, 0x72, 0x6b, 0x12, 0x2f, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, + 0x61, 0x72, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x21, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2a, 0x62, 0x0a, 0x0c, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, + 0x72, 0x6b, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x42, 0x4f, 0x4f, 0x4b, 0x4d, 0x41, + 0x52, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x4f, 0x4f, 0x4b, 0x4d, 0x41, 0x52, + 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x10, 0x01, 0x12, 0x1a, + 0x0a, 0x16, 0x42, 0x4f, 0x4f, 0x4b, 0x4d, 0x41, 0x52, 0x4b, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4c, 0x32, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x02, 0x2a, 0xad, 0x01, 0x0a, 0x09, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x4e, 0x54, 0x52, + 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x01, + 0x12, 0x17, 0x0a, 0x13, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, + 0x32, 0x5f, 0x42, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x4e, 0x54, + 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x45, 0x4e, 0x44, 0x10, 0x04, 0x12, + 0x19, 0x0a, 0x15, 0x45, 0x4e, 0x54, 0x52, 0x59, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x50, + 0x44, 0x41, 0x54, 0x45, 0x5f, 0x47, 0x45, 0x52, 0x10, 0x05, 0x2a, 0x87, 0x01, 0x0a, 0x09, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x41, 0x54, 0x43, + 0x48, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x52, 0x45, 0x47, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, + 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x43, 0x45, + 0x44, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x16, 0x0a, 0x12, + 0x42, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x10, 0x04, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x30, 0x78, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x48, 0x65, 0x72, 0x6d, + 0x65, 0x7a, 0x2f, 0x7a, 0x6b, 0x65, 0x76, 0x6d, 0x2d, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, + 0x74, 0x6f, 0x72, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_datastream_proto_rawDescOnce sync.Once + file_datastream_proto_rawDescData = file_datastream_proto_rawDesc +) + +func file_datastream_proto_rawDescGZIP() []byte { + file_datastream_proto_rawDescOnce.Do(func() { + file_datastream_proto_rawDescData = protoimpl.X.CompressGZIP(file_datastream_proto_rawDescData) + }) + return file_datastream_proto_rawDescData +} + +var file_datastream_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_datastream_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_datastream_proto_goTypes = []interface{}{ + (BookmarkType)(0), // 0: datastream.v1.BookmarkType + (EntryType)(0), // 1: datastream.v1.EntryType + (BatchType)(0), // 2: datastream.v1.BatchType + (*BatchStart)(nil), // 3: datastream.v1.BatchStart + (*BatchEnd)(nil), // 4: datastream.v1.BatchEnd + (*L2Block)(nil), // 5: datastream.v1.L2Block + (*Transaction)(nil), // 6: datastream.v1.Transaction + (*UpdateGER)(nil), // 7: datastream.v1.UpdateGER + (*BookMark)(nil), // 8: datastream.v1.BookMark + (*Debug)(nil), // 9: datastream.v1.Debug +} +var file_datastream_proto_depIdxs = []int32{ + 2, // 0: datastream.v1.BatchStart.type:type_name -> datastream.v1.BatchType + 9, // 1: datastream.v1.BatchStart.debug:type_name -> datastream.v1.Debug + 9, // 2: datastream.v1.BatchEnd.debug:type_name -> datastream.v1.Debug + 9, // 3: datastream.v1.L2Block.debug:type_name -> datastream.v1.Debug + 9, // 4: datastream.v1.Transaction.debug:type_name -> datastream.v1.Debug + 9, // 5: datastream.v1.UpdateGER.debug:type_name -> datastream.v1.Debug + 0, // 6: datastream.v1.BookMark.type:type_name -> datastream.v1.BookmarkType + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_datastream_proto_init() } +func file_datastream_proto_init() { + if File_datastream_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_datastream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchStart); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_datastream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchEnd); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_datastream_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*L2Block); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_datastream_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Transaction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_datastream_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateGER); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_datastream_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BookMark); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_datastream_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Debug); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_datastream_proto_rawDesc, + NumEnums: 3, + NumMessages: 7, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_datastream_proto_goTypes, + DependencyIndexes: file_datastream_proto_depIdxs, + EnumInfos: file_datastream_proto_enumTypes, + MessageInfos: file_datastream_proto_msgTypes, + }.Build() + File_datastream_proto = out.File + file_datastream_proto_rawDesc = nil + file_datastream_proto_goTypes = nil + file_datastream_proto_depIdxs = nil +} diff --git a/state/encoding_batch_v2.go b/state/encoding_batch_v2.go new file mode 100644 index 00000000..947825ed --- /dev/null +++ b/state/encoding_batch_v2.go @@ -0,0 +1,396 @@ +/* +This file provide functions to work with ETROG batches: +- EncodeBatchV2 (equivalent to EncodeTransactions) +- DecodeBatchV2 (equivalent to DecodeTxs) +- DecodeForcedBatchV2 + +Also provide a builder class to create batches (BatchV2Encoder): + This method doesnt check anything, so is more flexible but you need to know what you are doing + - `builder := NewBatchV2Encoder()` : Create a new `BatchV2Encoder`` + - You can call to `AddBlockHeader` or `AddTransaction` to add a block header or a transaction as you wish + - You can call to `GetResult` to get the batch data + + +// batch data format: +// 0xb | 1 | changeL2Block +// --------- L2 block Header --------------------------------- +// 0x73e6af6f | 4 | deltaTimestamp +// 0x00000012 | 4 | indexL1InfoTree +// -------- Transaction --------------------------------------- +// 0x00...0x00 | n | transaction RLP coded +// 0x00...0x00 | 32 | R +// 0x00...0x00 | 32 | S +// 0x00 | 32 | V +// 0x00 | 1 | efficiencyPercentage +// Repeat Transaction or changeL2Block +// Note: RLP codification: https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/ + +/ forced batch data format: +// -------- Transaction --------------------------------------- +// 0x00...0x00 | n | transaction RLP coded +// 0x00...0x00 | 32 | R +// 0x00...0x00 | 32 | S +// 0x00 | 32 | V +// 0x00 | 1 | efficiencyPercentage +// Repeat Transaction +// +// Usage: +// There are 2 ways of use this module, direct calls or a builder class: +// 1) Direct calls: +// - EncodeBatchV2: Encode a batch of transactions +// - DecodeBatchV2: Decode a batch of transactions +// +// 2) Builder class: +// This method doesnt check anything, so is more flexible but you need to know what you are doing +// - builder := NewBatchV2Encoder(): Create a new BatchV2Encoder +// - You can call to `AddBlockHeader` or `AddTransaction` to add a block header or a transaction as you wish +// - You can call to `GetResult` to get the batch data + +*/ + +package state + +import ( + "encoding/binary" + "errors" + "fmt" + "strconv" + + "github.com/agglayer/aggkit/hex" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" +) + +// ChangeL2BlockHeader is the header of a L2 block. +type ChangeL2BlockHeader struct { + DeltaTimestamp uint32 + IndexL1InfoTree uint32 +} + +// L2BlockRaw is the raw representation of a L2 block. +type L2BlockRaw struct { + BlockNumber uint64 + ChangeL2BlockHeader + Transactions []L2TxRaw +} + +// BatchRawV2 is the representation of a batch of transactions. +type BatchRawV2 struct { + Blocks []L2BlockRaw +} + +// ForcedBatchRawV2 is the representation of a forced batch of transactions. +type ForcedBatchRawV2 struct { + Transactions []L2TxRaw +} + +// L2TxRaw is the raw representation of a L2 transaction inside a L2 block. +type L2TxRaw struct { + EfficiencyPercentage uint8 // valid always + TxAlreadyEncoded bool // If true the tx is already encoded (data field is used) + Tx *types.Transaction // valid if TxAlreadyEncoded == false + Data []byte // valid if TxAlreadyEncoded == true +} + +const ( + changeL2Block = uint8(0x0b) + sizeUInt32 = 4 +) + +var ( + // ErrBatchV2DontStartWithChangeL2Block is returned when the batch start directly + // with a trsansaction (without a preceding changeL2Block) + ErrBatchV2DontStartWithChangeL2Block = errors.New( + "batch v2 must start with changeL2Block before Tx (suspect a V1 Batch or a ForcedBatch?)", + ) + // ErrInvalidBatchV2 is returned when the batch is invalid. + ErrInvalidBatchV2 = errors.New("invalid batch v2") + // ErrInvalidRLP is returned when the rlp is invalid. + ErrInvalidRLP = errors.New("invalid rlp codification") +) + +func (b *BatchRawV2) String() string { + res := "" + nTxs := 0 + for i, block := range b.Blocks { + res += fmt.Sprintf("Block[%d/%d]: deltaTimestamp: %d, indexL1InfoTree: %d nTxs: %d\n", i, len(b.Blocks), + block.DeltaTimestamp, block.IndexL1InfoTree, len(block.Transactions)) + nTxs += len(block.Transactions) + } + res = fmt.Sprintf("BATCHv2, nBlocks: %d nTxs:%d \n", len(b.Blocks), nTxs) + res + return res +} + +// EncodeBatchV2 encodes a batch of transactions into a byte slice. +func EncodeBatchV2(batch *BatchRawV2) ([]byte, error) { + if batch == nil { + return nil, fmt.Errorf("batch is nil: %w", ErrInvalidBatchV2) + } + if len(batch.Blocks) == 0 { + return nil, fmt.Errorf("a batch need minimum a L2Block: %w", ErrInvalidBatchV2) + } + + encoder := NewBatchV2Encoder() + for _, block := range batch.Blocks { + encoder.AddBlockHeader(block.ChangeL2BlockHeader) + err := encoder.AddTransactions(block.Transactions) + if err != nil { + return nil, fmt.Errorf("can't encode tx: %w", err) + } + } + return encoder.GetResult(), nil +} + +// BatchV2Encoder is a builder of the batchl2data used by EncodeBatchV2 +type BatchV2Encoder struct { + batchData []byte +} + +// NewBatchV2Encoder creates a new BatchV2Encoder. +func NewBatchV2Encoder() *BatchV2Encoder { + return &BatchV2Encoder{} +} + +// AddBlockHeader adds a block header to the batch. +func (b *BatchV2Encoder) AddBlockHeader(l2BlockHeader ChangeL2BlockHeader) { + b.batchData = l2BlockHeader.Encode(b.batchData) +} + +// AddTransactions adds a set of transactions to the batch. +func (b *BatchV2Encoder) AddTransactions(transactions []L2TxRaw) error { + for i := range transactions { + tx := transactions[i] + err := b.AddTransaction(&tx) + if err != nil { + return fmt.Errorf("can't encode tx: %w", err) + } + } + return nil +} + +// AddTransaction adds a transaction to the batch. +func (b *BatchV2Encoder) AddTransaction(transaction *L2TxRaw) error { + var err error + b.batchData, err = transaction.Encode(b.batchData) + if err != nil { + return fmt.Errorf("can't encode tx: %w", err) + } + return nil +} + +// GetResult returns the batch data. +func (b *BatchV2Encoder) GetResult() []byte { + return b.batchData +} + +// Encode encodes a batch of l2blocks header into a byte slice. +func (c ChangeL2BlockHeader) Encode(batchData []byte) []byte { + batchData = append(batchData, changeL2Block) + batchData = append(batchData, encodeUint32(c.DeltaTimestamp)...) + batchData = append(batchData, encodeUint32(c.IndexL1InfoTree)...) + return batchData +} + +// Encode encodes a transaction into a byte slice. +func (tx L2TxRaw) Encode(batchData []byte) ([]byte, error) { + if tx.TxAlreadyEncoded { + batchData = append(batchData, tx.Data...) + } else { + rlpTx, err := prepareRLPTxData(tx.Tx) + if err != nil { + return nil, fmt.Errorf("can't encode tx to RLP: %w", err) + } + batchData = append(batchData, rlpTx...) + } + batchData = append(batchData, tx.EfficiencyPercentage) + return batchData, nil +} + +// DecodeBatchV2 decodes a batch of transactions from a byte slice. +func DecodeBatchV2(txsData []byte) (*BatchRawV2, error) { + // The transactions are not RLP encoded. They are in raw byte format as follows: + // 1 byte for the transaction type (always 0b for changeL2Block) + // 4 bytes for deltaTimestamp + // 4 bytes for indexL1InfoTree. + var err error + var blocks []L2BlockRaw + var currentBlock *L2BlockRaw + pos := int(0) + for pos < len(txsData) { + switch txsData[pos] { + case changeL2Block: + if currentBlock != nil { + blocks = append(blocks, *currentBlock) + } + pos, currentBlock, err = decodeBlockHeader(txsData, pos+1) + if err != nil { + return nil, fmt.Errorf("pos: %d can't decode new BlockHeader: %w", pos, err) + } + // by RLP definition a tx never starts with a 0x0b. So, if is not a changeL2Block + // is a tx + default: + if currentBlock == nil { + _, _, err := DecodeTxRLP(txsData, pos) + if err == nil { + // There is no changeL2Block but have a valid RLP transaction + return nil, ErrBatchV2DontStartWithChangeL2Block + } else { + // No changeL2Block and no valid RLP transaction + return nil, fmt.Errorf("no ChangeL2Block neither valid Tx, batch malformed : %w", ErrInvalidBatchV2) + } + } + var tx *L2TxRaw + pos, tx, err = DecodeTxRLP(txsData, pos) + if err != nil { + return nil, fmt.Errorf("can't decode transactions: %w", err) + } + + currentBlock.Transactions = append(currentBlock.Transactions, *tx) + } + } + if currentBlock != nil { + blocks = append(blocks, *currentBlock) + } + return &BatchRawV2{blocks}, nil +} + +// DecodeForcedBatchV2 decodes a forced batch V2 (Etrog) +// Is forbidden changeL2Block, so are just the set of transactions +func DecodeForcedBatchV2(txsData []byte) (*ForcedBatchRawV2, error) { + txs, _, efficiencyPercentages, err := DecodeTxs(txsData, FORKID_ETROG) + if err != nil { + return nil, err + } + // Sanity check, this should never happen + if len(efficiencyPercentages) != len(txs) { + return nil, fmt.Errorf( + "error decoding len(efficiencyPercentages) != len(txs). len(efficiencyPercentages)=%d, len(txs)=%d : %w", + len(efficiencyPercentages), len(txs), ErrInvalidRLP, + ) + } + forcedBatch := ForcedBatchRawV2{} + for i := range txs { + tx := txs[i] + forcedBatch.Transactions = append(forcedBatch.Transactions, L2TxRaw{ + Tx: tx, + EfficiencyPercentage: efficiencyPercentages[i], + }) + } + return &forcedBatch, nil +} + +// decodeBlockHeader decodes a block header from a byte slice. +// +// Extract: 4 bytes for deltaTimestamp + 4 bytes for indexL1InfoTree +func decodeBlockHeader(txsData []byte, pos int) (int, *L2BlockRaw, error) { + var err error + currentBlock := &L2BlockRaw{} + pos, currentBlock.DeltaTimestamp, err = decodeUint32(txsData, pos) + if err != nil { + return 0, nil, fmt.Errorf("can't get deltaTimestamp: %w", err) + } + pos, currentBlock.IndexL1InfoTree, err = decodeUint32(txsData, pos) + if err != nil { + return 0, nil, fmt.Errorf("can't get leafIndex: %w", err) + } + + return pos, currentBlock, nil +} + +// DecodeTxRLP decodes a transaction from a byte slice. +func DecodeTxRLP(txsData []byte, offset int) (int, *L2TxRaw, error) { + var err error + length, err := decodeRLPListLengthFromOffset(txsData, offset) + if err != nil { + return 0, nil, fmt.Errorf("can't get RLP length (offset=%d): %w", offset, err) + } + endPos := uint64(offset) + length + rLength + sLength + vLength + EfficiencyPercentageByteLength + if endPos > uint64(len(txsData)) { + return 0, nil, fmt.Errorf("can't get tx because not enough data (endPos=%d lenData=%d): %w", + endPos, len(txsData), ErrInvalidBatchV2) + } + fullDataTx := txsData[offset:endPos] + dataStart := uint64(offset) + length + txInfo := txsData[offset:dataStart] + rData := txsData[dataStart : dataStart+rLength] + sData := txsData[dataStart+rLength : dataStart+rLength+sLength] + vData := txsData[dataStart+rLength+sLength : dataStart+rLength+sLength+vLength] + efficiencyPercentage := txsData[dataStart+rLength+sLength+vLength] + var rlpFields [][]byte + err = rlp.DecodeBytes(txInfo, &rlpFields) + if err != nil { + log.Error( + "error decoding tx Bytes: ", err, + ". fullDataTx: ", hex.EncodeToString(fullDataTx), + "\n tx: ", hex.EncodeToString(txInfo), + "\n Txs received: ", hex.EncodeToString(txsData), + ) + return 0, nil, err + } + legacyTx, err := RlpFieldsToLegacyTx(rlpFields, vData, rData, sData) + if err != nil { + log.Debug( + "error creating tx from rlp fields: ", err, + ". fullDataTx: ", hex.EncodeToString(fullDataTx), + "\n tx: ", hex.EncodeToString(txInfo), + "\n Txs received: ", hex.EncodeToString(txsData), + ) + return 0, nil, err + } + + l2Tx := &L2TxRaw{ + Tx: types.NewTx(legacyTx), + EfficiencyPercentage: efficiencyPercentage, + } + + return int(endPos), l2Tx, err +} + +// It returns the length of data from the param offset +// ex: +// 0xc0 -> empty data -> 1 byte because it include the 0xc0 +func decodeRLPListLengthFromOffset(txsData []byte, offset int) (uint64, error) { + txDataLength := uint64(len(txsData)) + num := uint64(txsData[offset]) + if num < c0 { // c0 -> is a empty data + log.Debugf("error num < c0 : %d, %d", num, c0) + return 0, fmt.Errorf("first byte of tx (%x) is < 0xc0: %w", num, ErrInvalidRLP) + } + length := num - c0 + if length > shortRlp { // If rlp is bigger than length 55 + // n is the length of the rlp data without the header (1 byte) for example "0xf7" + pos64 := uint64(offset) + lengthInByteOfSize := num - f7 + if (pos64 + headerByteLength + lengthInByteOfSize) > txDataLength { + log.Debug("error not enough data: ") + return 0, fmt.Errorf("not enough data to get length: %w", ErrInvalidRLP) + } + + n, err := strconv.ParseUint( + hex.EncodeToString(txsData[pos64+1:pos64+1+lengthInByteOfSize]), // +1 is the header. For example 0xf7 + hex.Base, + hex.BitSize64, + ) + if err != nil { + log.Debug("error parsing length: ", err) + return 0, fmt.Errorf("error parsing length value: %w", err) + } + // TODO: RLP specifications says length = n ??? that is wrong?? + length = n + num - f7 // num - f7 is the header. For example 0xf7 + } + return length + headerByteLength, nil +} + +func encodeUint32(value uint32) []byte { + data := make([]byte, sizeUInt32) + binary.BigEndian.PutUint32(data, value) + return data +} + +func decodeUint32(txsData []byte, pos int) (int, uint32, error) { + if len(txsData)-pos < sizeUInt32 { + return 0, 0, fmt.Errorf("can't get u32 because not enough data: %w", ErrInvalidBatchV2) + } + return pos + sizeUInt32, binary.BigEndian.Uint32(txsData[pos : pos+sizeUInt32]), nil +} diff --git a/state/encoding_batch_v2_test.go b/state/encoding_batch_v2_test.go new file mode 100644 index 00000000..e8eb9454 --- /dev/null +++ b/state/encoding_batch_v2_test.go @@ -0,0 +1,245 @@ +package state + +import ( + "testing" + + "github.com/agglayer/aggkit/hex" + "github.com/agglayer/aggkit/log" + "github.com/stretchr/testify/require" +) + +const ( + // changeL2Block + deltaTimeStamp + indexL1InfoTree + codedL2BlockHeader = "0b73e6af6f00000000" + // 2 x [ tx coded in RLP + r,s,v,efficiencyPercentage] + codedRLP2Txs1 = "ee02843b9aca00830186a0944d5cf5032b2a844602278b01199ed191a86c93ff88016345785d8a0000808203e88080bff0e780ba7db409339fd3f71969fa2cbf1b8535f6c725a1499d3318d3ef9c2b6340ddfab84add2c188f9efddb99771db1fe621c981846394ea4f035c85bcdd51bffee03843b9aca00830186a0944d5cf5032b2a844602278b01199ed191a86c93ff88016345785d8a0000808203e880805b346aa02230b22e62f73608de9ff39a162a6c24be9822209c770e3685b92d0756d5316ef954eefc58b068231ccea001fb7ac763ebe03afd009ad71cab36861e1bff" + // 2 x [ tx coded in RLP + r,s,v,efficiencyPercentage] + codedRLP2Txs2 = "ee80843b9aca00830186a0944d5cf5032b2a844602278b01199ed191a86c93ff88016345785d8a0000808203e880801cee7e01dc62f69a12c3510c6d64de04ee6346d84b6a017f3e786c7d87f963e75d8cc91fa983cd6d9cf55fff80d73bd26cd333b0f098acc1e58edb1fd484ad731bffee01843b9aca00830186a0944d5cf5032b2a844602278b01199ed191a86c93ff88016345785d8a0000808203e880803ee20a0764440b016c4a2ee4e7e4eb3a5a97f1e6a6c9f40bf5ecf50f95ff636d63878ddb3e997e519826c7bb26fb7c5950a208e1ec722a9f1c568c4e479b40341cff" + codedL2Block1 = codedL2BlockHeader + codedRLP2Txs1 + codedL2Block2 = codedL2BlockHeader + codedRLP2Txs2 + // Batch 420.000 (Incaberry) from Testnet + realBatchIncaberry = "ee8307c4848402faf08082520894417a7ba2d8d0060ae6c54fd098590db854b9c1d58609184e72a000808205a28080e8c76f8b8ec579362a4ef92dc1c8c372ad4ef6372a20903b3997408743e86239394ad6decc3bc080960b6c62ad78bc09913cba88fd98d595457b3462ed1494b91cffee8307c4858402faf08082520894417a7ba2d8d0060ae6c54fd098590db854b9c1d58609184e72a000808205a28080ed0de9758ff75ae777821e45178da0163c719341188220050cc4ad33048cd9cb272951662ae72269cf611528d591fcf682c8bad4402d98dbac4abc1b2be1ca431cffee8307c4868402faf08082520894417a7ba2d8d0060ae6c54fd098590db854b9c1d58609184e72a000808205a280807c94882ecf48d65b6240e7355c32e7d1a56366fd9571471cb664463ad2afecdd564d24abbea5b38b74dda029cdac3109f199f5e3e683acfbe43e7f27fe23b60b1cffee8307c4878402faf08082520894417a7ba2d8d0060ae6c54fd098590db854b9c1d58609184e72a000808205a280801b5e85cc1b402403a625610d4319558632cffd2b14a15bc031b9ba644ecc48a332bcc608e894b9ede61220767558e1d9e02780b53dbdd9bcc01de0ab2b1742951bffee8307c4888402faf08082520894417a7ba2d8d0060ae6c54fd098590db854b9c1d58609184e72a000808205a2808089eee14afeead54c815953a328ec52d441128e71d08ff75b4e5cd23db6fa67e774ca24e8878368eee5ad4562340edebcfb595395d40f8a5b0301e19ced92af5f1cffee8307c4898402faf08082520894417a7ba2d8d0060ae6c54fd098590db854b9c1d58609184e72a000808205a280807b672107c41caf91cff9061241686dd37e8d1e013d81f7f383b76afa93b7ff85413d4fc4c7e9613340b8fc29aefd0c42a3db6d75340b1bec0b895d324bcfa02e1cffee8307c48a8402faf08082520894417a7ba2d8d0060ae6c54fd098590db854b9c1d58609184e72a000808205a28080efadeca94da405cf44881670bc8b2464d006af41f20517e82339c72d73543c5c4e1e546eea07b4b751e3e2f909bd4026f742684c923bf666985f9a5a1cd91cde1bffee8307c48b8402faf08082520894417a7ba2d8d0060ae6c54fd098590db854b9c1d58609184e72a000808205a2808092ac34e2d6a38c7df5df96c78f9d837daaa7f74352d8c42fe671ef8ba6565ae350648c7e736a0017bf90370e766720c410441f6506765c70fad91ce046c1fad61bfff86c8206838402faf08082803194828f7ceca102de66a6ed4f4b6abee0bd1bd4f9dc80b844095ea7b3000000000000000000000000e907ec70b4efbb28efbf6f4ffb3ae0d34012eaa00000000000000000000000000000000000000000000000011a8297a4dca080008205a28080579cfefee3fa664c8b59190de80454da9642b7647a46b929c9fcc89105b2d5575d28665bef2bb1052db0d36ec1e92bc7503efaa74798fe3630b8867318c20d4e1cff" + realBatchConvertedEtrog = codedL2BlockHeader + realBatchIncaberry +) + +func TestDecodeEmptyBatchV2(t *testing.T) { + batchL2Data, err := hex.DecodeString("") + require.NoError(t, err) + + batch, err := DecodeBatchV2(batchL2Data) + require.NoError(t, err) + require.Equal(t, 0, len(batch.Blocks)) +} + +func TestDecodeBatches(t *testing.T) { + type testCase struct { + name string + batchL2Data string + expectedError error + } + testCases := []testCase{ + { + name: "batch dont start with 0x0b (changeL2Block)", + batchL2Data: "0c", + expectedError: ErrInvalidBatchV2, + }, + { + name: "batch no enough data to decode block.deltaTimestamp", + batchL2Data: "0b010203", + expectedError: ErrInvalidBatchV2, + }, + { + name: "batch no enough data to decode block.index", + batchL2Data: "0b01020304010203", + expectedError: ErrInvalidBatchV2, + }, + { + name: "batch no enough data to decode block.index", + batchL2Data: "0b01020304010203", + expectedError: ErrInvalidBatchV2, + }, + { + name: "valid batch no trx, just L2Block", + batchL2Data: "0b0102030401020304", + expectedError: nil, + }, + { + name: "invalid batch bad RLP codification", + batchL2Data: "0b" + "01020304" + "01020304" + "7f", + expectedError: ErrInvalidRLP, + }, + { + name: "1 block + 2 txs", + batchL2Data: "0b" + "73e6af6f" + "00000000" + codedRLP2Txs1 + codedRLP2Txs2, + expectedError: nil, + }, + { + name: "1 block + 1 txs", + batchL2Data: "0b" + "73e6af6f" + "00000000" + codedRLP2Txs1, + expectedError: nil, + }, + { + name: "1 block + 1 txs, missiging efficiencyPercentage", + batchL2Data: "0b" + "73e6af6f" + "00000000" + codedRLP2Txs1[0:len(codedRLP2Txs1)-2], + expectedError: ErrInvalidBatchV2, + }, + { + name: "real batch converted to etrog", + batchL2Data: realBatchConvertedEtrog, + expectedError: nil, + }, + { + name: "pass a V1 batch(incaberry) must fail", + batchL2Data: realBatchIncaberry, + expectedError: ErrBatchV2DontStartWithChangeL2Block, + }, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + log.Debug("************************ ", tc.name, " ************************") + data, err := hex.DecodeString(tc.batchL2Data) + require.NoError(t, err) + _, err = DecodeBatchV2(data) + if err != nil { + log.Debugf("[%s] %v", tc.name, err) + } + if tc.expectedError != nil { + require.ErrorIs(t, err, tc.expectedError) + } else { + require.NoError(t, err) + } + }) + } +} + +func TestDecodeBatchV2(t *testing.T) { + batchL2Data, err := hex.DecodeString(codedL2Block1) + require.NoError(t, err) + batchL2Data2, err := hex.DecodeString(codedL2Block2) + require.NoError(t, err) + batchL2Data = append(batchL2Data, batchL2Data2...) + decodedBatch, err := DecodeBatchV2(batchL2Data) + require.NoError(t, err) + require.Equal(t, 2, len(decodedBatch.Blocks)) + require.Equal(t, uint32(0x73e6af6f), decodedBatch.Blocks[0].DeltaTimestamp) + require.Equal(t, uint32(0x00000000), decodedBatch.Blocks[0].IndexL1InfoTree) +} + +func TestDecodeRLPLength(t *testing.T) { + type testCase struct { + name string + data string + expectedError error + expectedResult uint64 + } + testCases := []testCase{ + { + name: "must start >= 0xc0", + data: "bf", + expectedError: ErrInvalidRLP, + }, + { + name: "shortRLP: c0 -> len=0", + data: "c0", + expectedResult: 1, + }, + { + name: "shortRLP: c1 -> len=1", + data: "c1", + expectedResult: 2, // 1 byte header + 1 byte of data + }, + { + name: "shortRLP: byte>0xf7", + data: "f7", + expectedResult: 56, // 1 byte header + 55 bytes of data + }, + { + name: "longRLP: f8: 1 extra byte, missing data", + data: "f8", + expectedError: ErrInvalidRLP, + }, + { + name: "longRLP: f8:size is stored in next byte ->0x01 (code add the length of bytes of the size??)", + data: "f8" + "01", + expectedResult: 3, // 2 bytes of header + 1 byte of data + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + log.Debug("************************ ", tc.name, " ************************") + data, err := hex.DecodeString(tc.data) + require.NoError(t, err) + length, err := decodeRLPListLengthFromOffset(data, 0) + if err != nil { + log.Debugf("[%s] %v", tc.name, err) + } + if tc.expectedError != nil { + require.ErrorIs(t, err, tc.expectedError) + } else { + require.NoError(t, err) + require.Equal(t, tc.expectedResult, length) + } + }) + } +} + +func TestEncodeBatchV2(t *testing.T) { + block1 := L2BlockRaw{ + ChangeL2BlockHeader: ChangeL2BlockHeader{ + DeltaTimestamp: 123, + IndexL1InfoTree: 456, + }, + Transactions: []L2TxRaw{}, + } + block2 := L2BlockRaw{ + ChangeL2BlockHeader: ChangeL2BlockHeader{ + DeltaTimestamp: 789, + IndexL1InfoTree: 101112, + }, + Transactions: []L2TxRaw{}, + } + blocks := []L2BlockRaw{block1, block2} + + expectedBatchData := []byte{ + 0xb, 0x0, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x1, 0xc8, 0xb, 0x0, 0x0, 0x3, 0x15, 0x0, 0x1, 0x8a, 0xf8, + } + + batchData, err := EncodeBatchV2(&BatchRawV2{Blocks: blocks}) + require.NoError(t, err) + require.Equal(t, expectedBatchData, batchData) +} + +func TestDecodeEncodeBatchV2(t *testing.T) { + batchL2Data, err := hex.DecodeString(codedL2Block1 + codedL2Block2) + require.NoError(t, err) + decodedBatch, err := DecodeBatchV2(batchL2Data) + require.NoError(t, err) + require.Equal(t, 2, len(decodedBatch.Blocks)) + encoded, err := EncodeBatchV2(decodedBatch) + require.NoError(t, err) + require.Equal(t, batchL2Data, encoded) +} + +func TestEncodeEmptyBatchV2Fails(t *testing.T) { + l2Batch := BatchRawV2{} + _, err := EncodeBatchV2(&l2Batch) + require.ErrorIs(t, err, ErrInvalidBatchV2) + _, err = EncodeBatchV2(nil) + require.ErrorIs(t, err, ErrInvalidBatchV2) +} + +func TestDecodeForcedBatchV2(t *testing.T) { + batchL2Data, err := hex.DecodeString(codedRLP2Txs1) + require.NoError(t, err) + decodedBatch, err := DecodeForcedBatchV2(batchL2Data) + require.NoError(t, err) + require.Equal(t, 2, len(decodedBatch.Transactions)) +} + +func TestDecodeForcedBatchV2WithRegularBatch(t *testing.T) { + batchL2Data, err := hex.DecodeString(codedL2Block1) + require.NoError(t, err) + _, err = DecodeForcedBatchV2(batchL2Data) + require.Error(t, err) +} diff --git a/state/errors.go b/state/errors.go new file mode 100644 index 00000000..4bd68605 --- /dev/null +++ b/state/errors.go @@ -0,0 +1,72 @@ +package state + +import ( + "errors" + "fmt" +) + +var ( + // ErrInvalidBatchHeader indicates the batch header is invalid + ErrInvalidBatchHeader = errors.New("invalid batch header") + // ErrUnexpectedBatch indicates that the batch is unexpected + ErrUnexpectedBatch = errors.New("unexpected batch") + // ErrStateNotSynchronized indicates the state database may be empty + ErrStateNotSynchronized = errors.New("state not synchronized") + // ErrNotFound indicates an object has not been found for the search criteria used + ErrNotFound = errors.New("object not found") + // ErrNilDBTransaction indicates the db transaction has not been properly initialized + ErrNilDBTransaction = errors.New("database transaction not properly initialized") + // ErrAlreadyInitializedDBTransaction indicates the db transaction was already initialized + ErrAlreadyInitializedDBTransaction = errors.New("database transaction already initialized") + // ErrNotEnoughIntrinsicGas indicates the gas is not enough to cover the intrinsic gas cost + ErrNotEnoughIntrinsicGas = fmt.Errorf("not enough gas supplied for intrinsic gas costs") + // ErrParsingExecutorTrace indicates an error occurred while parsing the executor trace + ErrParsingExecutorTrace = fmt.Errorf("error while parsing executor trace") + // ErrInvalidBatchNumber indicates the provided batch number is not the latest in db + ErrInvalidBatchNumber = errors.New("provided batch number is not latest") + // ErrLastBatchShouldBeClosed indicates that last batch needs to be closed before adding a new one + ErrLastBatchShouldBeClosed = errors.New("last batch needs to be closed before adding a new one") + // ErrBatchAlreadyClosed indicates that batch is already closed + ErrBatchAlreadyClosed = errors.New("batch is already closed") + // ErrClosingBatchWithoutTxs indicates that the batch attempted to close does not have txs. + ErrClosingBatchWithoutTxs = errors.New("can not close a batch without transactions") + // ErrTimestampGE indicates that timestamp needs to be greater or equal + ErrTimestampGE = errors.New("timestamp needs to be greater or equal") + // ErrDBTxNil indicates that the method requires a dbTx that is not nil + ErrDBTxNil = errors.New("the method requires a dbTx that is not nil") + // ErrExistingTxGreaterThanProcessedTx indicates that we have more txs stored + // in db than the txs we want to process. + ErrExistingTxGreaterThanProcessedTx = errors.New( + "there are more transactions in the database than in the processed transaction set", + ) + // ErrOutOfOrderProcessedTx indicates the the processed transactions of an + // ongoing batch are not in the same order as the transactions stored in the + // database for the same batch. + ErrOutOfOrderProcessedTx = errors.New( + "the processed transactions are not in the same order as the stored transactions", + ) + // ErrInsufficientFundsForTransfer is returned if the transaction sender doesn't + // have enough funds for transfer(topmost call only). + ErrInsufficientFundsForTransfer = errors.New("insufficient funds for transfer") + // ErrExecutorNil indicates that the method requires an executor that is not nil + ErrExecutorNil = errors.New("the method requires an executor that is not nil") + // ErrStateTreeNil indicates that the method requires a state tree that is not nil + ErrStateTreeNil = errors.New("the method requires a state tree that is not nil") + // ErrUnsupportedDuration is returned if the provided unit for a time + // interval is not supported by our conversion mechanism. + ErrUnsupportedDuration = errors.New("unsupported time duration") + // ErrInvalidData is the error when the raw txs is unexpected + ErrInvalidData = errors.New("invalid data") + // ErrInvalidBlockRange returned when the selected block range is invalid, generally + // because the toBlock is bigger than the fromBlock + ErrInvalidBlockRange = errors.New("invalid block range") + // ErrMaxLogsCountLimitExceeded returned when the number of logs is bigger than the + // configured limit + ErrMaxLogsCountLimitExceeded = errors.New("query returned more than %v results") + // ErrMaxLogsBlockRangeLimitExceeded returned when the range between block number range + // to filter logs is bigger than the configured limit + ErrMaxLogsBlockRangeLimitExceeded = errors.New("logs are limited to a %v block range") + // ErrMaxNativeBlockHashBlockRangeLimitExceeded returned when the range between block number range + // to filter native block hashes is bigger than the configured limit + ErrMaxNativeBlockHashBlockRangeLimitExceeded = errors.New("native block hashes are limited to a %v block range") +) diff --git a/state/forkid.go b/state/forkid.go new file mode 100644 index 00000000..13fec671 --- /dev/null +++ b/state/forkid.go @@ -0,0 +1,12 @@ +package state + +const ( + // FORKID_BLUEBERRY is the fork id 4 + FORKID_BLUEBERRY = 4 //nolint:stylecheck + // FORKID_DRAGONFRUIT is the fork id 5 + FORKID_DRAGONFRUIT = 5 //nolint:stylecheck + // FORKID_INCABERRY is the fork id 6 + FORKID_INCABERRY = 6 //nolint:stylecheck + // FORKID_ETROG is the fork id 7 + FORKID_ETROG = 7 //nolint:stylecheck +) diff --git a/state/genesis.go b/state/genesis.go new file mode 100644 index 00000000..368a56eb --- /dev/null +++ b/state/genesis.go @@ -0,0 +1,26 @@ +package state + +import ( + "github.com/ethereum/go-ethereum/common" +) + +// Genesis contains the information to populate state on creation +type Genesis struct { + // BlockNumber is the block number where the polygonZKEVM smc was deployed on L1 + BlockNumber uint64 + // Root hash of the genesis block + Root common.Hash + // Actions is the data to populate into the state trie + Actions []*GenesisAction +} + +// GenesisAction represents one of the values set on the SMT during genesis. +type GenesisAction struct { + Address string `json:"address"` + Type int `json:"type"` + StoragePosition string `json:"storagePosition"` + Bytecode string `json:"bytecode"` + Key string `json:"key"` + Value string `json:"value"` + Root string `json:"root"` +} diff --git a/state/helper.go b/state/helper.go new file mode 100644 index 00000000..4ddd0dfc --- /dev/null +++ b/state/helper.go @@ -0,0 +1,208 @@ +package state + +import ( + "bytes" + "fmt" + "math/big" + "strconv" + + "github.com/agglayer/aggkit/hex" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" +) + +const ( + double = 2 + ether155V = 27 + etherPre155V = 35 + // MaxEffectivePercentage is the maximum value that can be used as effective percentage + MaxEffectivePercentage = uint8(255) + // Decoding constants + headerByteLength uint64 = 1 + sLength uint64 = 32 + rLength uint64 = 32 + vLength uint64 = 1 + c0 uint64 = 192 // 192 is c0. This value is defined by the rlp protocol + ff uint64 = 255 // max value of rlp header + shortRlp uint64 = 55 // length of the short rlp codification + f7 uint64 = 247 // 192 + 55 = c0 + shortRlp + + // EfficiencyPercentageByteLength is the length of the effective percentage in bytes + EfficiencyPercentageByteLength uint64 = 1 +) + +func prepareRLPTxData(tx *types.Transaction) ([]byte, error) { + v, r, s := tx.RawSignatureValues() + sign := 1 - (v.Uint64() & 1) + + rlpFieldsToEncode := []interface{}{ + tx.Nonce(), + } + + if tx.Type() == types.DynamicFeeTxType { + rlpFieldsToEncode = append(rlpFieldsToEncode, tx.GasTipCap()) + rlpFieldsToEncode = append(rlpFieldsToEncode, tx.GasFeeCap()) + } else { + rlpFieldsToEncode = append(rlpFieldsToEncode, tx.GasPrice()) + } + + rlpFieldsToEncode = append(rlpFieldsToEncode, tx.Gas()) + rlpFieldsToEncode = append(rlpFieldsToEncode, tx.To()) + rlpFieldsToEncode = append(rlpFieldsToEncode, tx.Value()) + rlpFieldsToEncode = append(rlpFieldsToEncode, tx.Data()) + + if !isPreEIP155Tx(tx) { + rlpFieldsToEncode = append(rlpFieldsToEncode, tx.ChainId()) + rlpFieldsToEncode = append(rlpFieldsToEncode, uint(0)) + rlpFieldsToEncode = append(rlpFieldsToEncode, uint(0)) + } + + txCodedRlp, err := rlp.EncodeToBytes(rlpFieldsToEncode) + if err != nil { + return nil, err + } + + newV := new(big.Int).Add(big.NewInt(ether155V), new(big.Int).SetUint64(sign)) + newRPadded := fmt.Sprintf("%064s", r.Text(hex.Base)) + newSPadded := fmt.Sprintf("%064s", s.Text(hex.Base)) + newVPadded := fmt.Sprintf("%02s", newV.Text(hex.Base)) + + return hex.DecodeString(hex.EncodeToString(txCodedRlp) + newRPadded + newSPadded + newVPadded) +} + +// DecodeTxs extracts Transactions for its encoded form +func DecodeTxs(txsData []byte, forkID uint64) ([]*types.Transaction, []byte, []uint8, error) { + // Process coded txs + var pos uint64 + var txs []*types.Transaction + var efficiencyPercentages []uint8 + txDataLength := uint64(len(txsData)) + if txDataLength == 0 { + return txs, txsData, nil, nil + } + for pos < txDataLength { + num, err := strconv.ParseUint(hex.EncodeToString(txsData[pos:pos+1]), hex.Base, hex.BitSize64) + if err != nil { + log.Debug("error parsing header length: ", err) + return []*types.Transaction{}, txsData, []uint8{}, err + } + // First byte is the length and must be ignored + if num < c0 { + log.Debugf("error num < c0 : %d, %d", num, c0) + return []*types.Transaction{}, txsData, []uint8{}, ErrInvalidData + } + length := num - c0 + if length > shortRlp { // If rlp is bigger than length 55 + // n is the length of the rlp data without the header (1 byte) for example "0xf7" + if (pos + 1 + num - f7) > txDataLength { + log.Debug("error parsing length: ", err) + return []*types.Transaction{}, txsData, []uint8{}, err + } + n, err := strconv.ParseUint( + hex.EncodeToString(txsData[pos+1:pos+1+num-f7]), // +1 is the header. For example 0xf7 + hex.Base, + hex.BitSize64, + ) + if err != nil { + log.Debug("error parsing length: ", err) + return []*types.Transaction{}, txsData, []uint8{}, err + } + if n+num < f7 { + log.Debug("error n + num < f7: ", err) + return []*types.Transaction{}, txsData, []uint8{}, ErrInvalidData + } + length = n + num - f7 // num - f7 is the header. For example 0xf7 + } + + endPos := pos + length + rLength + sLength + vLength + headerByteLength + + if forkID >= FORKID_DRAGONFRUIT { + endPos += EfficiencyPercentageByteLength + } + + if endPos > txDataLength { + err := fmt.Errorf("endPos %d is bigger than txDataLength %d", endPos, txDataLength) + log.Debug("error parsing header: ", err) + return []*types.Transaction{}, txsData, []uint8{}, ErrInvalidData + } + + if endPos < pos { + err := fmt.Errorf("endPos %d is smaller than pos %d", endPos, pos) + log.Debug("error parsing header: ", err) + return []*types.Transaction{}, txsData, []uint8{}, ErrInvalidData + } + + if endPos < pos { + err := fmt.Errorf("endPos %d is smaller than pos %d", endPos, pos) + log.Debug("error parsing header: ", err) + return []*types.Transaction{}, txsData, []uint8{}, ErrInvalidData + } + + fullDataTx := txsData[pos:endPos] + dataStart := pos + length + headerByteLength + txInfo := txsData[pos:dataStart] + rData := txsData[dataStart : dataStart+rLength] + sData := txsData[dataStart+rLength : dataStart+rLength+sLength] + vData := txsData[dataStart+rLength+sLength : dataStart+rLength+sLength+vLength] + + if forkID >= FORKID_DRAGONFRUIT { + efficiencyPercentage := txsData[dataStart+rLength+sLength+vLength : endPos] + efficiencyPercentages = append(efficiencyPercentages, efficiencyPercentage[0]) + } + + pos = endPos + + // Decode rlpFields + var rlpFields [][]byte + err = rlp.DecodeBytes(txInfo, &rlpFields) + if err != nil { + log.Error( + "error decoding tx Bytes: ", err, + ". fullDataTx: ", hex.EncodeToString(fullDataTx), + "\n tx: ", hex.EncodeToString(txInfo), + "\n Txs received: ", hex.EncodeToString(txsData), + ) + return []*types.Transaction{}, txsData, []uint8{}, ErrInvalidData + } + + legacyTx, err := RlpFieldsToLegacyTx(rlpFields, vData, rData, sData) + if err != nil { + log.Debug( + "error creating tx from rlp fields: ", err, ". fullDataTx: ", + hex.EncodeToString(fullDataTx), + "\n tx: ", hex.EncodeToString(txInfo), + "\n Txs received: ", hex.EncodeToString(txsData), + ) + return []*types.Transaction{}, txsData, []uint8{}, err + } + + tx := types.NewTx(legacyTx) + txs = append(txs, tx) + } + return txs, txsData, efficiencyPercentages, nil +} + +// DecodeTx decodes a string rlp tx representation into a types.Transaction instance +func DecodeTx(encodedTx string) (*types.Transaction, error) { + b, err := hex.DecodeHex(encodedTx) + if err != nil { + return nil, err + } + + reader := bytes.NewReader(b) + stream := rlp.NewStream(reader, 0) + + tx := new(types.Transaction) + if err := tx.DecodeRLP(stream); err != nil { + return nil, err + } + return tx, nil +} + +// isPreEIP155Tx checks if the tx is a tx that has a chainID as zero and +// V field is either 27 or 28 +func isPreEIP155Tx(tx *types.Transaction) bool { + v, _, _ := tx.RawSignatureValues() + return tx.ChainId().Uint64() == 0 && (v.Uint64() == 27 || v.Uint64() == 28) +} diff --git a/state/transaction.go b/state/transaction.go new file mode 100644 index 00000000..14ec84a6 --- /dev/null +++ b/state/transaction.go @@ -0,0 +1,88 @@ +package state + +import ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +// GetSender gets the sender from the transaction's signature +func GetSender(tx *types.Transaction) (common.Address, error) { + signer := types.NewEIP155Signer(tx.ChainId()) + sender, err := signer.Sender(tx) + if err != nil { + return common.Address{}, err + } + return sender, nil +} + +// RlpFieldsToLegacyTx parses the rlp fields slice into a type.LegacyTx +// in this specific order: +// +// required fields: +// [0] Nonce uint64 +// [1] GasPrice *big.Int +// [2] Gas uint64 +// [3] To *common.Address +// [4] Value *big.Int +// [5] Data []byte +// +// optional fields: +// [6] V *big.Int +// [7] R *big.Int +// [8] S *big.Int +func RlpFieldsToLegacyTx(fields [][]byte, v, r, s []byte) (tx *types.LegacyTx, err error) { + const ( + fieldsSizeWithoutChainID = 6 + fieldsSizeWithChainID = 7 + ) + + if len(fields) < fieldsSizeWithoutChainID { + return nil, types.ErrTxTypeNotSupported + } + + nonce := big.NewInt(0).SetBytes(fields[0]).Uint64() + gasPrice := big.NewInt(0).SetBytes(fields[1]) + gas := big.NewInt(0).SetBytes(fields[2]).Uint64() + var to *common.Address + + if fields[3] != nil && len(fields[3]) != 0 { + tmp := common.BytesToAddress(fields[3]) + to = &tmp + } + value := big.NewInt(0).SetBytes(fields[4]) + data := fields[5] + + txV := big.NewInt(0).SetBytes(v) + if len(fields) >= fieldsSizeWithChainID { + chainID := big.NewInt(0).SetBytes(fields[6]) + + // a = chainId * 2 + // b = v - 27 + // c = a + 35 + // v = b + c + // + // same as: + // v = v-27+chainId*2+35 + a := new(big.Int).Mul(chainID, big.NewInt(double)) + b := new(big.Int).Sub(new(big.Int).SetBytes(v), big.NewInt(ether155V)) + c := new(big.Int).Add(a, big.NewInt(etherPre155V)) + txV = new(big.Int).Add(b, c) + } + + txR := big.NewInt(0).SetBytes(r) + txS := big.NewInt(0).SetBytes(s) + + return &types.LegacyTx{ + Nonce: nonce, + GasPrice: gasPrice, + Gas: gas, + To: to, + Value: value, + Data: data, + V: txV, + R: txR, + S: txS, + }, nil +} diff --git a/state/types.go b/state/types.go new file mode 100644 index 00000000..62c0f502 --- /dev/null +++ b/state/types.go @@ -0,0 +1,56 @@ +package state + +import ( + "time" +) + +// ZKCounters counters for the tx +type ZKCounters struct { + GasUsed uint64 + UsedKeccakHashes uint32 + UsedPoseidonHashes uint32 + UsedPoseidonPaddings uint32 + UsedMemAligns uint32 + UsedArithmetics uint32 + UsedBinaries uint32 + UsedSteps uint32 + UsedSha256Hashes_V2 uint32 //nolint:stylecheck +} + +// BatchResources is a struct that contains the ZKEVM resources used by a batch/tx +type BatchResources struct { + ZKCounters ZKCounters + Bytes uint64 +} + +// Proof struct +type Proof struct { + BatchNumber uint64 + BatchNumberFinal uint64 + Proof string + InputProver string + ProofID *string + // Prover name, unique identifier across prover reboots. + Prover *string + // ProverID prover process identifier. + ProverID *string + // GeneratingSince holds the timestamp for the moment in which the + // proof generation has started by a prover. Nil if the proof is not + // currently generating. + GeneratingSince *time.Time + CreatedAt time.Time + UpdatedAt time.Time +} + +// Sequence represents the sequence interval +type Sequence struct { + FromBatchNumber uint64 + ToBatchNumber uint64 +} + +// DBBatch struct is a wrapper for the state.Batch and its metadata +type DBBatch struct { + Batch Batch + Datastream []byte + Witness []byte +} diff --git a/sync/common.go b/sync/common.go new file mode 100644 index 00000000..9e112969 --- /dev/null +++ b/sync/common.go @@ -0,0 +1,31 @@ +package sync + +import ( + "log" + "sync" + "time" +) + +type RetryHandler struct { + RetryAfterErrorPeriod time.Duration + MaxRetryAttemptsAfterError int +} + +func (h *RetryHandler) Handle(funcName string, attempts int) { + if h.MaxRetryAttemptsAfterError > -1 && attempts >= h.MaxRetryAttemptsAfterError { + log.Fatalf( + "%s failed too many times (%d)", + funcName, h.MaxRetryAttemptsAfterError, + ) + } + time.Sleep(h.RetryAfterErrorPeriod) +} + +func UnhaltIfAffectedRows(halted *bool, haltedReason *string, mu *sync.RWMutex, rowsAffected int64) { + if rowsAffected > 0 { + mu.Lock() + defer mu.Unlock() + *halted = false + *haltedReason = "" + } +} diff --git a/sync/driver.go b/sync/driver.go new file mode 100644 index 00000000..f85c04fb --- /dev/null +++ b/sync/driver.go @@ -0,0 +1,19 @@ +package sync + +import ( + "context" + "errors" +) + +var ErrInconsistentState = errors.New("state is inconsistent, try again later once the state is consolidated") + +type Block struct { + Num uint64 + Events []interface{} +} + +type ProcessorInterface interface { + GetLastProcessedBlock(ctx context.Context) (uint64, error) + ProcessBlock(block Block) error + Reorg(firstReorgedBlock uint64) error +} diff --git a/sync/evmdownloader.go b/sync/evmdownloader.go new file mode 100644 index 00000000..54cda3c6 --- /dev/null +++ b/sync/evmdownloader.go @@ -0,0 +1,316 @@ +package sync + +import ( + "context" + "errors" + "fmt" + "math/big" + "time" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" +) + +const ( + DefaultWaitPeriodBlockNotFound = time.Millisecond * 100 +) + +type EthClienter interface { + ethereum.LogFilterer + ethereum.BlockNumberReader + ethereum.ChainReader + bind.ContractBackend +} + +type EVMDownloaderInterface interface { + WaitForNewBlocks(ctx context.Context, lastBlockSeen uint64) (newLastBlock uint64) + GetEventsByBlockRange(ctx context.Context, fromBlock, toBlock uint64) []EVMBlock + GetLogs(ctx context.Context, fromBlock, toBlock uint64) []types.Log + GetBlockHeader(ctx context.Context, blockNum uint64) (EVMBlockHeader, bool) +} + +type LogAppenderMap map[common.Hash]func(b *EVMBlock, l types.Log) error + +type EVMDownloader struct { + syncBlockChunkSize uint64 + EVMDownloaderInterface + log *log.Logger +} + +func NewEVMDownloader( + syncerID string, + ethClient EthClienter, + syncBlockChunkSize uint64, + blockFinalityType etherman.BlockNumberFinality, + waitForNewBlocksPeriod time.Duration, + appender LogAppenderMap, + adressessToQuery []common.Address, + rh *RetryHandler, +) (*EVMDownloader, error) { + logger := log.WithFields("syncer", syncerID) + finality, err := blockFinalityType.ToBlockNum() + if err != nil { + return nil, err + } + topicsToQuery := make([]common.Hash, 0, len(appender)) + for topic := range appender { + topicsToQuery = append(topicsToQuery, topic) + } + return &EVMDownloader{ + syncBlockChunkSize: syncBlockChunkSize, + log: logger, + EVMDownloaderInterface: &EVMDownloaderImplementation{ + ethClient: ethClient, + blockFinality: finality, + waitForNewBlocksPeriod: waitForNewBlocksPeriod, + appender: appender, + topicsToQuery: topicsToQuery, + adressessToQuery: adressessToQuery, + rh: rh, + log: logger, + }, + }, nil +} + +func (d *EVMDownloader) Download(ctx context.Context, fromBlock uint64, downloadedCh chan EVMBlock) { + lastBlock := d.WaitForNewBlocks(ctx, 0) + for { + select { + case <-ctx.Done(): + d.log.Debug("closing channel") + close(downloadedCh) + return + default: + } + toBlock := fromBlock + d.syncBlockChunkSize + if toBlock > lastBlock { + toBlock = lastBlock + } + if fromBlock > toBlock { + d.log.Debugf( + "waiting for new blocks, last block processed: %d, last block seen on L1: %d", + fromBlock-1, lastBlock, + ) + lastBlock = d.WaitForNewBlocks(ctx, fromBlock-1) + continue + } + d.log.Debugf("getting events from block %d to %d", fromBlock, toBlock) + blocks := d.GetEventsByBlockRange(ctx, fromBlock, toBlock) + for _, b := range blocks { + d.log.Debugf("sending block %d to the driver (with events)", b.Num) + downloadedCh <- b + } + if len(blocks) == 0 || blocks[len(blocks)-1].Num < toBlock { + // Indicate the last downloaded block if there are not events on it + d.log.Debugf("sending block %d to the driver (without events)", toBlock) + header, isCanceled := d.GetBlockHeader(ctx, toBlock) + if isCanceled { + return + } + + downloadedCh <- EVMBlock{ + EVMBlockHeader: header, + } + } + fromBlock = toBlock + 1 + } +} + +type EVMDownloaderImplementation struct { + ethClient EthClienter + blockFinality *big.Int + waitForNewBlocksPeriod time.Duration + appender LogAppenderMap + topicsToQuery []common.Hash + adressessToQuery []common.Address + rh *RetryHandler + log *log.Logger +} + +func NewEVMDownloaderImplementation( + syncerID string, + ethClient EthClienter, + blockFinality *big.Int, + waitForNewBlocksPeriod time.Duration, + appender LogAppenderMap, + topicsToQuery []common.Hash, + adressessToQuery []common.Address, + rh *RetryHandler, +) *EVMDownloaderImplementation { + logger := log.WithFields("syncer", syncerID) + return &EVMDownloaderImplementation{ + ethClient: ethClient, + blockFinality: blockFinality, + waitForNewBlocksPeriod: waitForNewBlocksPeriod, + appender: appender, + topicsToQuery: topicsToQuery, + adressessToQuery: adressessToQuery, + rh: rh, + log: logger, + } +} + +func (d *EVMDownloaderImplementation) WaitForNewBlocks( + ctx context.Context, lastBlockSeen uint64, +) (newLastBlock uint64) { + attempts := 0 + ticker := time.NewTicker(d.waitForNewBlocksPeriod) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + d.log.Info("context cancelled") + return lastBlockSeen + case <-ticker.C: + header, err := d.ethClient.HeaderByNumber(ctx, d.blockFinality) + if err != nil { + if ctx.Err() == nil { + attempts++ + d.log.Error("error getting last block num from eth client: ", err) + d.rh.Handle("waitForNewBlocks", attempts) + } else { + d.log.Warn("context has been canceled while trying to get header by number") + } + continue + } + if header.Number.Uint64() > lastBlockSeen { + return header.Number.Uint64() + } + } + } +} + +func (d *EVMDownloaderImplementation) GetEventsByBlockRange(ctx context.Context, fromBlock, toBlock uint64) []EVMBlock { + select { + case <-ctx.Done(): + return nil + default: + blocks := []EVMBlock{} + logs := d.GetLogs(ctx, fromBlock, toBlock) + for _, l := range logs { + if len(blocks) == 0 || blocks[len(blocks)-1].Num < l.BlockNumber { + b, canceled := d.GetBlockHeader(ctx, l.BlockNumber) + if canceled { + return nil + } + + if b.Hash != l.BlockHash { + d.log.Infof( + "there has been a block hash change between the event query and the block query "+ + "for block %d: %s vs %s. Retrying.", + l.BlockNumber, b.Hash, l.BlockHash, + ) + return d.GetEventsByBlockRange(ctx, fromBlock, toBlock) + } + blocks = append(blocks, EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: l.BlockNumber, + Hash: l.BlockHash, + Timestamp: b.Timestamp, + ParentHash: b.ParentHash, + }, + Events: []interface{}{}, + }) + } + + for { + attempts := 0 + err := d.appender[l.Topics[0]](&blocks[len(blocks)-1], l) + if err != nil { + attempts++ + d.log.Error("error trying to append log: ", err) + d.rh.Handle("getLogs", attempts) + continue + } + break + } + } + + return blocks + } +} + +func filterQueryToString(query ethereum.FilterQuery) string { + return fmt.Sprintf("FromBlock: %s, ToBlock: %s, Addresses: %s, Topics: %s", + query.FromBlock.String(), query.ToBlock.String(), query.Addresses, query.Topics) +} + +func (d *EVMDownloaderImplementation) GetLogs(ctx context.Context, fromBlock, toBlock uint64) []types.Log { + query := ethereum.FilterQuery{ + FromBlock: new(big.Int).SetUint64(fromBlock), + Addresses: d.adressessToQuery, + ToBlock: new(big.Int).SetUint64(toBlock), + } + var ( + attempts = 0 + unfilteredLogs []types.Log + err error + ) + for { + unfilteredLogs, err = d.ethClient.FilterLogs(ctx, query) + if err != nil { + if errors.Is(err, context.Canceled) { + // context is canceled, we don't want to fatal on max attempts in this case + return nil + } + + attempts++ + d.log.Errorf("error calling FilterLogs to eth client: filter: %s err:%w ", + filterQueryToString(query), + err, + ) + d.rh.Handle("getLogs", attempts) + continue + } + break + } + logs := make([]types.Log, 0, len(unfilteredLogs)) + for _, l := range unfilteredLogs { + for _, topic := range d.topicsToQuery { + if l.Topics[0] == topic { + logs = append(logs, l) + break + } + } + } + return logs +} + +func (d *EVMDownloaderImplementation) GetBlockHeader(ctx context.Context, blockNum uint64) (EVMBlockHeader, bool) { + attempts := 0 + for { + header, err := d.ethClient.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNum)) + if err != nil { + if errors.Is(err, context.Canceled) { + // context is canceled, we don't want to fatal on max attempts in this case + return EVMBlockHeader{}, true + } + if errors.Is(err, ethereum.NotFound) { + // block num can temporary disappear from the execution client due to a reorg, + // in this case, we want to wait and not panic + log.Warnf("block %d not found on the ethereum client: %v", blockNum, err) + if d.rh.RetryAfterErrorPeriod != 0 { + time.Sleep(d.rh.RetryAfterErrorPeriod) + } else { + time.Sleep(DefaultWaitPeriodBlockNotFound) + } + continue + } + + attempts++ + d.log.Errorf("error getting block header for block %d, err: %v", blockNum, err) + d.rh.Handle("getBlockHeader", attempts) + continue + } + return EVMBlockHeader{ + Num: header.Number.Uint64(), + Hash: header.Hash(), + ParentHash: header.ParentHash, + Timestamp: header.Time, + }, false + } +} diff --git a/sync/evmdownloader_test.go b/sync/evmdownloader_test.go new file mode 100644 index 00000000..d36eb2eb --- /dev/null +++ b/sync/evmdownloader_test.go @@ -0,0 +1,457 @@ +package sync + +import ( + "context" + "errors" + "math/big" + "strconv" + "testing" + "time" + + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +var ( + contractAddr = common.HexToAddress("f00") + eventSignature = crypto.Keccak256Hash([]byte("foo")) +) + +const ( + syncBlockChunck = uint64(10) +) + +type testEvent common.Hash + +func TestGetEventsByBlockRange(t *testing.T) { + type testCase struct { + description string + inputLogs []types.Log + fromBlock, toBlock uint64 + expectedBlocks []EVMBlock + } + testCases := []testCase{} + ctx := context.Background() + d, clientMock := NewTestDownloader(t, time.Millisecond*100) + + // case 0: single block, no events + case0 := testCase{ + description: "case 0: single block, no events", + inputLogs: []types.Log{}, + fromBlock: 1, + toBlock: 3, + expectedBlocks: []EVMBlock{}, + } + testCases = append(testCases, case0) + + // case 1: single block, single event + logC1, updateC1 := generateEvent(3) + logsC1 := []types.Log{ + *logC1, + } + blocksC1 := []EVMBlock{ + { + EVMBlockHeader: EVMBlockHeader{ + Num: logC1.BlockNumber, + Hash: logC1.BlockHash, + ParentHash: common.HexToHash("foo"), + }, + Events: []interface{}{updateC1}, + }, + } + case1 := testCase{ + description: "case 1: single block, single event", + inputLogs: logsC1, + fromBlock: 3, + toBlock: 3, + expectedBlocks: blocksC1, + } + testCases = append(testCases, case1) + + // case 2: single block, multiple events + logC2_1, updateC2_1 := generateEvent(5) + logC2_2, updateC2_2 := generateEvent(5) + logC2_3, updateC2_3 := generateEvent(5) + logC2_4, updateC2_4 := generateEvent(5) + logsC2 := []types.Log{ + *logC2_1, + *logC2_2, + *logC2_3, + *logC2_4, + } + blocksC2 := []EVMBlock{ + { + EVMBlockHeader: EVMBlockHeader{ + Num: logC2_1.BlockNumber, + Hash: logC2_1.BlockHash, + ParentHash: common.HexToHash("foo"), + }, + Events: []interface{}{ + updateC2_1, + updateC2_2, + updateC2_3, + updateC2_4, + }, + }, + } + case2 := testCase{ + description: "case 2: single block, multiple events", + inputLogs: logsC2, + fromBlock: 5, + toBlock: 5, + expectedBlocks: blocksC2, + } + testCases = append(testCases, case2) + + // case 3: multiple blocks, some events + logC3_1, updateC3_1 := generateEvent(7) + logC3_2, updateC3_2 := generateEvent(7) + logC3_3, updateC3_3 := generateEvent(8) + logC3_4, updateC3_4 := generateEvent(8) + logsC3 := []types.Log{ + *logC3_1, + *logC3_2, + *logC3_3, + *logC3_4, + } + blocksC3 := []EVMBlock{ + { + EVMBlockHeader: EVMBlockHeader{ + Num: logC3_1.BlockNumber, + Hash: logC3_1.BlockHash, + ParentHash: common.HexToHash("foo"), + }, + Events: []interface{}{ + updateC3_1, + updateC3_2, + }, + }, + { + EVMBlockHeader: EVMBlockHeader{ + Num: logC3_3.BlockNumber, + Hash: logC3_3.BlockHash, + ParentHash: common.HexToHash("foo"), + }, + Events: []interface{}{ + updateC3_3, + updateC3_4, + }, + }, + } + case3 := testCase{ + description: "case 3: multiple blocks, some events", + inputLogs: logsC3, + fromBlock: 7, + toBlock: 8, + expectedBlocks: blocksC3, + } + testCases = append(testCases, case3) + + for _, tc := range testCases { + query := ethereum.FilterQuery{ + FromBlock: new(big.Int).SetUint64(tc.fromBlock), + Addresses: []common.Address{contractAddr}, + ToBlock: new(big.Int).SetUint64(tc.toBlock), + } + clientMock. + On("FilterLogs", mock.Anything, query). + Return(tc.inputLogs, nil) + for _, b := range tc.expectedBlocks { + clientMock. + On("HeaderByNumber", mock.Anything, big.NewInt(int64(b.Num))). + Return(&types.Header{ + Number: big.NewInt(int64(b.Num)), + ParentHash: common.HexToHash("foo"), + }, nil) + } + + actualBlocks := d.GetEventsByBlockRange(ctx, tc.fromBlock, tc.toBlock) + require.Equal(t, tc.expectedBlocks, actualBlocks, tc.description) + } +} + +func generateEvent(blockNum uint32) (*types.Log, testEvent) { + h := common.HexToHash(strconv.Itoa(int(blockNum))) + header := types.Header{ + Number: big.NewInt(int64(blockNum)), + ParentHash: common.HexToHash("foo"), + } + blockHash := header.Hash() + log := &types.Log{ + Address: contractAddr, + BlockNumber: uint64(blockNum), + Topics: []common.Hash{ + eventSignature, + h, + }, + BlockHash: blockHash, + Data: nil, + } + return log, testEvent(h) +} + +func TestDownload(t *testing.T) { + /* + NOTE: due to the concurrent nature of this test (the function being tested runs through a goroutine) + if the mock doesn't match, the goroutine will get stuck and the test will timeout + */ + d := NewEVMDownloaderMock(t) + downloadCh := make(chan EVMBlock, 1) + ctx := context.Background() + ctx1, cancel := context.WithCancel(ctx) + expectedBlocks := []EVMBlock{} + dwnldr, _ := NewTestDownloader(t, time.Millisecond*100) + dwnldr.EVMDownloaderInterface = d + + d.On("WaitForNewBlocks", mock.Anything, uint64(0)). + Return(uint64(1)) + // iteratiion 0: + // last block is 1, download that block (no events and wait) + b1 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 1, + Hash: common.HexToHash("01"), + }, + } + expectedBlocks = append(expectedBlocks, b1) + d.On("GetEventsByBlockRange", mock.Anything, uint64(0), uint64(1)). + Return([]EVMBlock{}, false) + d.On("GetBlockHeader", mock.Anything, uint64(1)). + Return(b1.EVMBlockHeader, false) + + // iteration 1: wait for next block to be created + d.On("WaitForNewBlocks", mock.Anything, uint64(1)). + After(time.Millisecond * 100). + Return(uint64(2)).Once() + + // iteration 2: block 2 has events + b2 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 2, + Hash: common.HexToHash("02"), + }, + } + expectedBlocks = append(expectedBlocks, b2) + d.On("GetEventsByBlockRange", mock.Anything, uint64(2), uint64(2)). + Return([]EVMBlock{b2}, false) + + // iteration 3: wait for next block to be created (jump to block 8) + d.On("WaitForNewBlocks", mock.Anything, uint64(2)). + After(time.Millisecond * 100). + Return(uint64(8)).Once() + + // iteration 4: blocks 6 and 7 have events + b6 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 6, + Hash: common.HexToHash("06"), + }, + Events: []interface{}{"06"}, + } + b7 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 7, + Hash: common.HexToHash("07"), + }, + Events: []interface{}{"07"}, + } + b8 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 8, + Hash: common.HexToHash("08"), + }, + } + expectedBlocks = append(expectedBlocks, b6, b7, b8) + d.On("GetEventsByBlockRange", mock.Anything, uint64(3), uint64(8)). + Return([]EVMBlock{b6, b7}, false) + d.On("GetBlockHeader", mock.Anything, uint64(8)). + Return(b8.EVMBlockHeader, false) + + // iteration 5: wait for next block to be created (jump to block 30) + d.On("WaitForNewBlocks", mock.Anything, uint64(8)). + After(time.Millisecond * 100). + Return(uint64(30)).Once() + + // iteration 6: from block 9 to 19, no events + b19 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 19, + Hash: common.HexToHash("19"), + }, + } + expectedBlocks = append(expectedBlocks, b19) + d.On("GetEventsByBlockRange", mock.Anything, uint64(9), uint64(19)). + Return([]EVMBlock{}, false) + d.On("GetBlockHeader", mock.Anything, uint64(19)). + Return(b19.EVMBlockHeader, false) + + // iteration 7: from block 20 to 30, events on last block + b30 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 30, + Hash: common.HexToHash("30"), + }, + Events: []interface{}{testEvent(common.HexToHash("30"))}, + } + expectedBlocks = append(expectedBlocks, b30) + d.On("GetEventsByBlockRange", mock.Anything, uint64(20), uint64(30)). + Return([]EVMBlock{b30}, false) + + // iteration 8: wait for next block to be created (jump to block 35) + d.On("WaitForNewBlocks", mock.Anything, uint64(30)). + After(time.Millisecond * 100). + Return(uint64(35)).Once() + + go dwnldr.Download(ctx1, 0, downloadCh) + for _, expectedBlock := range expectedBlocks { + actualBlock := <-downloadCh + log.Debugf("block %d received!", actualBlock.Num) + require.Equal(t, expectedBlock, actualBlock) + } + log.Debug("canceling") + cancel() + _, ok := <-downloadCh + require.False(t, ok) +} + +func TestWaitForNewBlocks(t *testing.T) { + ctx := context.Background() + d, clientMock := NewTestDownloader(t, time.Millisecond*100) + + // at first attempt + currentBlock := uint64(5) + expectedBlock := uint64(6) + clientMock.On("HeaderByNumber", ctx, mock.Anything).Return(&types.Header{ + Number: big.NewInt(6), + }, nil).Once() + actualBlock := d.WaitForNewBlocks(ctx, currentBlock) + assert.Equal(t, expectedBlock, actualBlock) + + // 2 iterations + clientMock.On("HeaderByNumber", ctx, mock.Anything).Return(&types.Header{ + Number: big.NewInt(5), + }, nil).Once() + clientMock.On("HeaderByNumber", ctx, mock.Anything).Return(&types.Header{ + Number: big.NewInt(6), + }, nil).Once() + actualBlock = d.WaitForNewBlocks(ctx, currentBlock) + assert.Equal(t, expectedBlock, actualBlock) + + // after error from client + clientMock.On("HeaderByNumber", ctx, mock.Anything).Return(nil, errors.New("foo")).Once() + clientMock.On("HeaderByNumber", ctx, mock.Anything).Return(&types.Header{ + Number: big.NewInt(6), + }, nil).Once() + actualBlock = d.WaitForNewBlocks(ctx, currentBlock) + assert.Equal(t, expectedBlock, actualBlock) +} + +func TestGetBlockHeader(t *testing.T) { + ctx := context.Background() + d, clientMock := NewTestDownloader(t, time.Millisecond) + + blockNum := uint64(5) + blockNumBig := big.NewInt(5) + returnedBlock := &types.Header{ + Number: blockNumBig, + } + expectedBlock := EVMBlockHeader{ + Num: 5, + Hash: returnedBlock.Hash(), + } + + // at first attempt + clientMock.On("HeaderByNumber", ctx, blockNumBig).Return(returnedBlock, nil).Once() + actualBlock, isCanceled := d.GetBlockHeader(ctx, blockNum) + assert.Equal(t, expectedBlock, actualBlock) + assert.False(t, isCanceled) + + // after error from client + clientMock.On("HeaderByNumber", ctx, blockNumBig).Return(nil, errors.New("foo")).Once() + clientMock.On("HeaderByNumber", ctx, blockNumBig).Return(returnedBlock, nil).Once() + actualBlock, isCanceled = d.GetBlockHeader(ctx, blockNum) + assert.Equal(t, expectedBlock, actualBlock) + assert.False(t, isCanceled) + + // header not found default + clientMock.On("HeaderByNumber", ctx, blockNumBig).Return(nil, ethereum.NotFound).Once() + clientMock.On("HeaderByNumber", ctx, blockNumBig).Return(returnedBlock, nil).Once() + actualBlock, isCanceled = d.GetBlockHeader(ctx, 5) + assert.Equal(t, expectedBlock, actualBlock) + assert.False(t, isCanceled) + + // header not found default TO + d, clientMock = NewTestDownloader(t, 0) + clientMock.On("HeaderByNumber", ctx, blockNumBig).Return(nil, ethereum.NotFound).Once() + clientMock.On("HeaderByNumber", ctx, blockNumBig).Return(returnedBlock, nil).Once() + actualBlock, isCanceled = d.GetBlockHeader(ctx, 5) + assert.Equal(t, expectedBlock, actualBlock) + assert.False(t, isCanceled) +} + +func TestFilterQueryToString(t *testing.T) { + addr1 := common.HexToAddress("0xf000") + addr2 := common.HexToAddress("0xabcd") + query := ethereum.FilterQuery{ + FromBlock: new(big.Int).SetUint64(1000), + Addresses: []common.Address{addr1, addr2}, + ToBlock: new(big.Int).SetUint64(1100), + } + + assert.Equal(t, "FromBlock: 1000, ToBlock: 1100, Addresses: [0x000000000000000000000000000000000000f000 0x000000000000000000000000000000000000ABcD], Topics: []", filterQueryToString(query)) + + query = ethereum.FilterQuery{ + FromBlock: new(big.Int).SetUint64(1000), + Addresses: []common.Address{addr1, addr2}, + ToBlock: new(big.Int).SetUint64(1100), + Topics: [][]common.Hash{{common.HexToHash("0x1234"), common.HexToHash("0x5678")}}, + } + assert.Equal(t, "FromBlock: 1000, ToBlock: 1100, Addresses: [0x000000000000000000000000000000000000f000 0x000000000000000000000000000000000000ABcD], Topics: [[0x0000000000000000000000000000000000000000000000000000000000001234 0x0000000000000000000000000000000000000000000000000000000000005678]]", filterQueryToString(query)) +} + +func TestGetLogs(t *testing.T) { + mockEthClient := NewL2Mock(t) + sut := EVMDownloaderImplementation{ + ethClient: mockEthClient, + adressessToQuery: []common.Address{contractAddr}, + log: log.WithFields("test", "EVMDownloaderImplementation"), + rh: &RetryHandler{ + RetryAfterErrorPeriod: time.Millisecond, + MaxRetryAttemptsAfterError: 5, + }, + } + ctx := context.TODO() + mockEthClient.EXPECT().FilterLogs(ctx, mock.Anything).Return(nil, errors.New("foo")).Once() + mockEthClient.EXPECT().FilterLogs(ctx, mock.Anything).Return(nil, nil).Once() + logs := sut.GetLogs(ctx, 0, 1) + require.Equal(t, []types.Log{}, logs) +} + +func buildAppender() LogAppenderMap { + appender := make(LogAppenderMap) + appender[eventSignature] = func(b *EVMBlock, l types.Log) error { + b.Events = append(b.Events, testEvent(l.Topics[1])) + return nil + } + return appender +} + +func NewTestDownloader(t *testing.T, retryPeriod time.Duration) (*EVMDownloader, *L2Mock) { + t.Helper() + + rh := &RetryHandler{ + MaxRetryAttemptsAfterError: 5, + RetryAfterErrorPeriod: retryPeriod, + } + clientMock := NewL2Mock(t) + d, err := NewEVMDownloader("test", clientMock, syncBlockChunck, etherman.LatestBlock, time.Millisecond, buildAppender(), []common.Address{contractAddr}, rh) + require.NoError(t, err) + return d, clientMock +} diff --git a/sync/evmdriver.go b/sync/evmdriver.go new file mode 100644 index 00000000..72476cef --- /dev/null +++ b/sync/evmdriver.go @@ -0,0 +1,187 @@ +package sync + +import ( + "context" + "errors" + + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/reorgdetector" + "github.com/ethereum/go-ethereum/common" +) + +type evmDownloaderFull interface { + EVMDownloaderInterface + downloader +} + +type downloader interface { + Download(ctx context.Context, fromBlock uint64, downloadedCh chan EVMBlock) +} + +type EVMDriver struct { + reorgDetector ReorgDetector + reorgSub *reorgdetector.Subscription + processor processorInterface + downloader downloader + reorgDetectorID string + downloadBufferSize int + rh *RetryHandler + log *log.Logger +} + +type processorInterface interface { + GetLastProcessedBlock(ctx context.Context) (uint64, error) + ProcessBlock(ctx context.Context, block Block) error + Reorg(ctx context.Context, firstReorgedBlock uint64) error +} + +type ReorgDetector interface { + Subscribe(id string) (*reorgdetector.Subscription, error) + AddBlockToTrack(ctx context.Context, id string, blockNum uint64, blockHash common.Hash) error +} + +func NewEVMDriver( + reorgDetector ReorgDetector, + processor processorInterface, + downloader downloader, + reorgDetectorID string, + downloadBufferSize int, + rh *RetryHandler, +) (*EVMDriver, error) { + logger := log.WithFields("syncer", reorgDetectorID) + reorgSub, err := reorgDetector.Subscribe(reorgDetectorID) + if err != nil { + return nil, err + } + return &EVMDriver{ + reorgDetector: reorgDetector, + reorgSub: reorgSub, + processor: processor, + downloader: downloader, + reorgDetectorID: reorgDetectorID, + downloadBufferSize: downloadBufferSize, + rh: rh, + log: logger, + }, nil +} + +func (d *EVMDriver) Sync(ctx context.Context) { +reset: + var ( + lastProcessedBlock uint64 + attempts int + err error + ) + + for { + lastProcessedBlock, err = d.processor.GetLastProcessedBlock(ctx) + if err != nil { + attempts++ + d.log.Error("error getting last processed block: ", err) + d.rh.Handle("Sync", attempts) + continue + } + break + } + cancellableCtx, cancel := context.WithCancel(ctx) + defer cancel() + + d.log.Infof("Starting sync... lastProcessedBlock %d", lastProcessedBlock) + // start downloading + downloadCh := make(chan EVMBlock, d.downloadBufferSize) + go d.downloader.Download(cancellableCtx, lastProcessedBlock+1, downloadCh) + + for { + select { + case <-ctx.Done(): + d.log.Info("sync stopped due to context done") + cancel() + return + case b := <-downloadCh: + d.log.Debugf("handleNewBlock, blockNum: %d, blockHash: %s", b.Num, b.Hash) + d.handleNewBlock(ctx, cancel, b) + case firstReorgedBlock := <-d.reorgSub.ReorgedBlock: + d.log.Debug("handleReorg from block: ", firstReorgedBlock) + d.handleReorg(ctx, cancel, firstReorgedBlock) + goto reset + } + } +} + +func (d *EVMDriver) handleNewBlock(ctx context.Context, cancel context.CancelFunc, b EVMBlock) { + attempts := 0 + succeed := false + for { + select { + case <-ctx.Done(): + // If the context is canceled, exit the function + d.log.Warnf("context canceled while adding block %d to tracker", b.Num) + return + default: + err := d.reorgDetector.AddBlockToTrack(ctx, d.reorgDetectorID, b.Num, b.Hash) + if err != nil { + attempts++ + d.log.Errorf("error adding block %d to tracker: %v", b.Num, err) + d.rh.Handle("handleNewBlock", attempts) + } else { + succeed = true + } + } + if succeed { + break + } + } + attempts = 0 + succeed = false + for { + select { + case <-ctx.Done(): + // If the context is canceled, exit the function + d.log.Warnf("context canceled while processing block %d", b.Num) + return + default: + blockToProcess := Block{ + Num: b.Num, + Events: b.Events, + } + err := d.processor.ProcessBlock(ctx, blockToProcess) + if err != nil { + if errors.Is(err, ErrInconsistentState) { + d.log.Warn("state got inconsistent after processing this block. Stopping downloader until there is a reorg") + cancel() + return + } + attempts++ + d.log.Errorf("error processing events for block %d, err: %v", b.Num, err) + d.rh.Handle("handleNewBlock", attempts) + } else { + succeed = true + } + } + if succeed { + break + } + } +} + +func (d *EVMDriver) handleReorg(ctx context.Context, cancel context.CancelFunc, firstReorgedBlock uint64) { + // stop downloader + cancel() + + // handle reorg + attempts := 0 + for { + err := d.processor.Reorg(ctx, firstReorgedBlock) + if err != nil { + attempts++ + d.log.Errorf( + "error processing reorg, last valid Block %d, err: %v", + firstReorgedBlock, err, + ) + d.rh.Handle("handleReorg", attempts) + continue + } + break + } + d.reorgSub.ReorgProcessed <- true +} diff --git a/sync/evmdriver_test.go b/sync/evmdriver_test.go new file mode 100644 index 00000000..71498669 --- /dev/null +++ b/sync/evmdriver_test.go @@ -0,0 +1,235 @@ +package sync + +import ( + "context" + "errors" + "sync" + "testing" + "time" + + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/reorgdetector" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" +) + +var ( + reorgDetectorID = "foo" +) + +func TestSync(t *testing.T) { + rh := &RetryHandler{ + MaxRetryAttemptsAfterError: 5, + RetryAfterErrorPeriod: time.Millisecond * 100, + } + rdm := NewReorgDetectorMock(t) + pm := NewProcessorMock(t) + dm := NewEVMDownloaderMock(t) + firstReorgedBlock := make(chan uint64) + reorgProcessed := make(chan bool) + rdm.On("Subscribe", reorgDetectorID).Return(&reorgdetector.Subscription{ + ReorgedBlock: firstReorgedBlock, + ReorgProcessed: reorgProcessed, + }, nil) + driver, err := NewEVMDriver(rdm, pm, dm, reorgDetectorID, 10, rh) + require.NoError(t, err) + ctx := context.Background() + expectedBlock1 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 3, + Hash: common.HexToHash("03"), + }, + } + expectedBlock2 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 9, + Hash: common.HexToHash("09"), + }, + } + type reorgSemaphore struct { + mu sync.Mutex + green bool + } + reorg1Completed := reorgSemaphore{} + dm.On("Download", mock.Anything, mock.Anything, mock.Anything).Run(func(args mock.Arguments) { + ctx, ok := args.Get(0).(context.Context) + if !ok { + log.Error("failed to assert type for context") + return + } + + downloadedCh, ok := args.Get(2).(chan EVMBlock) + if !ok { + log.Error("failed to assert type for downloadedCh") + return + } + + log.Info("entering mock loop") + for { + select { + case <-ctx.Done(): + log.Info("closing channel") + close(downloadedCh) + return + default: + } + reorg1Completed.mu.Lock() + green := reorg1Completed.green + reorg1Completed.mu.Unlock() + if green { + downloadedCh <- expectedBlock2 + } else { + downloadedCh <- expectedBlock1 + } + time.Sleep(100 * time.Millisecond) + } + }) + + // Mocking this actions, the driver should "store" all the blocks from the downloader + pm.On("GetLastProcessedBlock", ctx). + Return(uint64(3), nil) + rdm.On("AddBlockToTrack", ctx, reorgDetectorID, expectedBlock1.Num, expectedBlock1.Hash). + Return(nil) + pm.On("ProcessBlock", ctx, Block{Num: expectedBlock1.Num, Events: expectedBlock1.Events}). + Return(nil) + rdm.On("AddBlockToTrack", ctx, reorgDetectorID, expectedBlock2.Num, expectedBlock2.Hash). + Return(nil) + pm.On("ProcessBlock", ctx, Block{Num: expectedBlock2.Num, Events: expectedBlock2.Events}). + Return(nil) + go driver.Sync(ctx) + time.Sleep(time.Millisecond * 200) // time to download expectedBlock1 + + // Trigger reorg 1 + reorgedBlock1 := uint64(5) + pm.On("Reorg", ctx, reorgedBlock1).Return(nil) + firstReorgedBlock <- reorgedBlock1 + ok := <-reorgProcessed + require.True(t, ok) + reorg1Completed.mu.Lock() + reorg1Completed.green = true + reorg1Completed.mu.Unlock() + time.Sleep(time.Millisecond * 200) // time to download expectedBlock2 + + // Trigger reorg 2: syncer restarts the porcess + reorgedBlock2 := uint64(7) + pm.On("Reorg", ctx, reorgedBlock2).Return(nil) + firstReorgedBlock <- reorgedBlock2 + ok = <-reorgProcessed + require.True(t, ok) +} + +func TestHandleNewBlock(t *testing.T) { + rh := &RetryHandler{ + MaxRetryAttemptsAfterError: 5, + RetryAfterErrorPeriod: time.Millisecond * 100, + } + rdm := NewReorgDetectorMock(t) + pm := NewProcessorMock(t) + dm := NewEVMDownloaderMock(t) + rdm.On("Subscribe", reorgDetectorID).Return(&reorgdetector.Subscription{}, nil) + driver, err := NewEVMDriver(rdm, pm, dm, reorgDetectorID, 10, rh) + require.NoError(t, err) + ctx := context.Background() + + // happy path + b1 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 1, + Hash: common.HexToHash("f00"), + }, + } + rdm. + On("AddBlockToTrack", ctx, reorgDetectorID, b1.Num, b1.Hash). + Return(nil) + pm.On("ProcessBlock", ctx, Block{Num: b1.Num, Events: b1.Events}). + Return(nil) + driver.handleNewBlock(ctx, nil, b1) + + // reorg deteector fails once + b2 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 2, + Hash: common.HexToHash("f00"), + }, + } + rdm. + On("AddBlockToTrack", ctx, reorgDetectorID, b2.Num, b2.Hash). + Return(errors.New("foo")).Once() + rdm. + On("AddBlockToTrack", ctx, reorgDetectorID, b2.Num, b2.Hash). + Return(nil).Once() + pm.On("ProcessBlock", ctx, Block{Num: b2.Num, Events: b2.Events}). + Return(nil) + driver.handleNewBlock(ctx, nil, b2) + + // processor fails once + b3 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 3, + Hash: common.HexToHash("f00"), + }, + } + rdm. + On("AddBlockToTrack", ctx, reorgDetectorID, b3.Num, b3.Hash). + Return(nil) + pm.On("ProcessBlock", ctx, Block{Num: b3.Num, Events: b3.Events}). + Return(errors.New("foo")).Once() + pm.On("ProcessBlock", ctx, Block{Num: b3.Num, Events: b3.Events}). + Return(nil).Once() + driver.handleNewBlock(ctx, nil, b3) + + // inconsistent state error + b4 := EVMBlock{ + EVMBlockHeader: EVMBlockHeader{ + Num: 4, + Hash: common.HexToHash("f00"), + }, + } + rdm. + On("AddBlockToTrack", ctx, reorgDetectorID, b4.Num, b4.Hash). + Return(nil) + pm.On("ProcessBlock", ctx, Block{Num: b4.Num, Events: b4.Events}). + Return(ErrInconsistentState) + cancelIsCalled := false + cancel := func() { + cancelIsCalled = true + } + driver.handleNewBlock(ctx, cancel, b4) + require.True(t, cancelIsCalled) +} + +func TestHandleReorg(t *testing.T) { + rh := &RetryHandler{ + MaxRetryAttemptsAfterError: 5, + RetryAfterErrorPeriod: time.Millisecond * 100, + } + rdm := NewReorgDetectorMock(t) + pm := NewProcessorMock(t) + dm := NewEVMDownloaderMock(t) + reorgProcessed := make(chan bool) + rdm.On("Subscribe", reorgDetectorID).Return(&reorgdetector.Subscription{ + ReorgProcessed: reorgProcessed, + }, nil) + driver, err := NewEVMDriver(rdm, pm, dm, reorgDetectorID, 10, rh) + require.NoError(t, err) + ctx := context.Background() + + // happy path + _, cancel := context.WithCancel(ctx) + firstReorgedBlock := uint64(5) + pm.On("Reorg", ctx, firstReorgedBlock).Return(nil) + go driver.handleReorg(ctx, cancel, firstReorgedBlock) + done := <-reorgProcessed + require.True(t, done) + + // processor fails 2 times + _, cancel = context.WithCancel(ctx) + firstReorgedBlock = uint64(7) + pm.On("Reorg", ctx, firstReorgedBlock).Return(errors.New("foo")).Once() + pm.On("Reorg", ctx, firstReorgedBlock).Return(errors.New("foo")).Once() + pm.On("Reorg", ctx, firstReorgedBlock).Return(nil).Once() + go driver.handleReorg(ctx, cancel, firstReorgedBlock) + done = <-reorgProcessed + require.True(t, done) +} diff --git a/sync/evmtypes.go b/sync/evmtypes.go new file mode 100644 index 00000000..d242dbc4 --- /dev/null +++ b/sync/evmtypes.go @@ -0,0 +1,15 @@ +package sync + +import "github.com/ethereum/go-ethereum/common" + +type EVMBlock struct { + EVMBlockHeader + Events []interface{} +} + +type EVMBlockHeader struct { + Num uint64 + Hash common.Hash + ParentHash common.Hash + Timestamp uint64 +} diff --git a/sync/mock_downloader_test.go b/sync/mock_downloader_test.go new file mode 100644 index 00000000..662f49f7 --- /dev/null +++ b/sync/mock_downloader_test.go @@ -0,0 +1,276 @@ +// Code generated by mockery. DO NOT EDIT. + +package sync + +import ( + context "context" + + types "github.com/ethereum/go-ethereum/core/types" + mock "github.com/stretchr/testify/mock" +) + +// EVMDownloaderMock is an autogenerated mock type for the evmDownloaderFull type +type EVMDownloaderMock struct { + mock.Mock +} + +type EVMDownloaderMock_Expecter struct { + mock *mock.Mock +} + +func (_m *EVMDownloaderMock) EXPECT() *EVMDownloaderMock_Expecter { + return &EVMDownloaderMock_Expecter{mock: &_m.Mock} +} + +// Download provides a mock function with given fields: ctx, fromBlock, downloadedCh +func (_m *EVMDownloaderMock) Download(ctx context.Context, fromBlock uint64, downloadedCh chan EVMBlock) { + _m.Called(ctx, fromBlock, downloadedCh) +} + +// EVMDownloaderMock_Download_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Download' +type EVMDownloaderMock_Download_Call struct { + *mock.Call +} + +// Download is a helper method to define mock.On call +// - ctx context.Context +// - fromBlock uint64 +// - downloadedCh chan EVMBlock +func (_e *EVMDownloaderMock_Expecter) Download(ctx interface{}, fromBlock interface{}, downloadedCh interface{}) *EVMDownloaderMock_Download_Call { + return &EVMDownloaderMock_Download_Call{Call: _e.mock.On("Download", ctx, fromBlock, downloadedCh)} +} + +func (_c *EVMDownloaderMock_Download_Call) Run(run func(ctx context.Context, fromBlock uint64, downloadedCh chan EVMBlock)) *EVMDownloaderMock_Download_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(chan EVMBlock)) + }) + return _c +} + +func (_c *EVMDownloaderMock_Download_Call) Return() *EVMDownloaderMock_Download_Call { + _c.Call.Return() + return _c +} + +func (_c *EVMDownloaderMock_Download_Call) RunAndReturn(run func(context.Context, uint64, chan EVMBlock)) *EVMDownloaderMock_Download_Call { + _c.Run(run) + return _c +} + +// GetBlockHeader provides a mock function with given fields: ctx, blockNum +func (_m *EVMDownloaderMock) GetBlockHeader(ctx context.Context, blockNum uint64) (EVMBlockHeader, bool) { + ret := _m.Called(ctx, blockNum) + + if len(ret) == 0 { + panic("no return value specified for GetBlockHeader") + } + + var r0 EVMBlockHeader + var r1 bool + if rf, ok := ret.Get(0).(func(context.Context, uint64) (EVMBlockHeader, bool)); ok { + return rf(ctx, blockNum) + } + if rf, ok := ret.Get(0).(func(context.Context, uint64) EVMBlockHeader); ok { + r0 = rf(ctx, blockNum) + } else { + r0 = ret.Get(0).(EVMBlockHeader) + } + + if rf, ok := ret.Get(1).(func(context.Context, uint64) bool); ok { + r1 = rf(ctx, blockNum) + } else { + r1 = ret.Get(1).(bool) + } + + return r0, r1 +} + +// EVMDownloaderMock_GetBlockHeader_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBlockHeader' +type EVMDownloaderMock_GetBlockHeader_Call struct { + *mock.Call +} + +// GetBlockHeader is a helper method to define mock.On call +// - ctx context.Context +// - blockNum uint64 +func (_e *EVMDownloaderMock_Expecter) GetBlockHeader(ctx interface{}, blockNum interface{}) *EVMDownloaderMock_GetBlockHeader_Call { + return &EVMDownloaderMock_GetBlockHeader_Call{Call: _e.mock.On("GetBlockHeader", ctx, blockNum)} +} + +func (_c *EVMDownloaderMock_GetBlockHeader_Call) Run(run func(ctx context.Context, blockNum uint64)) *EVMDownloaderMock_GetBlockHeader_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64)) + }) + return _c +} + +func (_c *EVMDownloaderMock_GetBlockHeader_Call) Return(_a0 EVMBlockHeader, _a1 bool) *EVMDownloaderMock_GetBlockHeader_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EVMDownloaderMock_GetBlockHeader_Call) RunAndReturn(run func(context.Context, uint64) (EVMBlockHeader, bool)) *EVMDownloaderMock_GetBlockHeader_Call { + _c.Call.Return(run) + return _c +} + +// GetEventsByBlockRange provides a mock function with given fields: ctx, fromBlock, toBlock +func (_m *EVMDownloaderMock) GetEventsByBlockRange(ctx context.Context, fromBlock uint64, toBlock uint64) []EVMBlock { + ret := _m.Called(ctx, fromBlock, toBlock) + + if len(ret) == 0 { + panic("no return value specified for GetEventsByBlockRange") + } + + var r0 []EVMBlock + if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64) []EVMBlock); ok { + r0 = rf(ctx, fromBlock, toBlock) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]EVMBlock) + } + } + + return r0 +} + +// EVMDownloaderMock_GetEventsByBlockRange_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetEventsByBlockRange' +type EVMDownloaderMock_GetEventsByBlockRange_Call struct { + *mock.Call +} + +// GetEventsByBlockRange is a helper method to define mock.On call +// - ctx context.Context +// - fromBlock uint64 +// - toBlock uint64 +func (_e *EVMDownloaderMock_Expecter) GetEventsByBlockRange(ctx interface{}, fromBlock interface{}, toBlock interface{}) *EVMDownloaderMock_GetEventsByBlockRange_Call { + return &EVMDownloaderMock_GetEventsByBlockRange_Call{Call: _e.mock.On("GetEventsByBlockRange", ctx, fromBlock, toBlock)} +} + +func (_c *EVMDownloaderMock_GetEventsByBlockRange_Call) Run(run func(ctx context.Context, fromBlock uint64, toBlock uint64)) *EVMDownloaderMock_GetEventsByBlockRange_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(uint64)) + }) + return _c +} + +func (_c *EVMDownloaderMock_GetEventsByBlockRange_Call) Return(_a0 []EVMBlock) *EVMDownloaderMock_GetEventsByBlockRange_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EVMDownloaderMock_GetEventsByBlockRange_Call) RunAndReturn(run func(context.Context, uint64, uint64) []EVMBlock) *EVMDownloaderMock_GetEventsByBlockRange_Call { + _c.Call.Return(run) + return _c +} + +// GetLogs provides a mock function with given fields: ctx, fromBlock, toBlock +func (_m *EVMDownloaderMock) GetLogs(ctx context.Context, fromBlock uint64, toBlock uint64) []types.Log { + ret := _m.Called(ctx, fromBlock, toBlock) + + if len(ret) == 0 { + panic("no return value specified for GetLogs") + } + + var r0 []types.Log + if rf, ok := ret.Get(0).(func(context.Context, uint64, uint64) []types.Log); ok { + r0 = rf(ctx, fromBlock, toBlock) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.Log) + } + } + + return r0 +} + +// EVMDownloaderMock_GetLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLogs' +type EVMDownloaderMock_GetLogs_Call struct { + *mock.Call +} + +// GetLogs is a helper method to define mock.On call +// - ctx context.Context +// - fromBlock uint64 +// - toBlock uint64 +func (_e *EVMDownloaderMock_Expecter) GetLogs(ctx interface{}, fromBlock interface{}, toBlock interface{}) *EVMDownloaderMock_GetLogs_Call { + return &EVMDownloaderMock_GetLogs_Call{Call: _e.mock.On("GetLogs", ctx, fromBlock, toBlock)} +} + +func (_c *EVMDownloaderMock_GetLogs_Call) Run(run func(ctx context.Context, fromBlock uint64, toBlock uint64)) *EVMDownloaderMock_GetLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64), args[2].(uint64)) + }) + return _c +} + +func (_c *EVMDownloaderMock_GetLogs_Call) Return(_a0 []types.Log) *EVMDownloaderMock_GetLogs_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EVMDownloaderMock_GetLogs_Call) RunAndReturn(run func(context.Context, uint64, uint64) []types.Log) *EVMDownloaderMock_GetLogs_Call { + _c.Call.Return(run) + return _c +} + +// WaitForNewBlocks provides a mock function with given fields: ctx, lastBlockSeen +func (_m *EVMDownloaderMock) WaitForNewBlocks(ctx context.Context, lastBlockSeen uint64) uint64 { + ret := _m.Called(ctx, lastBlockSeen) + + if len(ret) == 0 { + panic("no return value specified for WaitForNewBlocks") + } + + var r0 uint64 + if rf, ok := ret.Get(0).(func(context.Context, uint64) uint64); ok { + r0 = rf(ctx, lastBlockSeen) + } else { + r0 = ret.Get(0).(uint64) + } + + return r0 +} + +// EVMDownloaderMock_WaitForNewBlocks_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WaitForNewBlocks' +type EVMDownloaderMock_WaitForNewBlocks_Call struct { + *mock.Call +} + +// WaitForNewBlocks is a helper method to define mock.On call +// - ctx context.Context +// - lastBlockSeen uint64 +func (_e *EVMDownloaderMock_Expecter) WaitForNewBlocks(ctx interface{}, lastBlockSeen interface{}) *EVMDownloaderMock_WaitForNewBlocks_Call { + return &EVMDownloaderMock_WaitForNewBlocks_Call{Call: _e.mock.On("WaitForNewBlocks", ctx, lastBlockSeen)} +} + +func (_c *EVMDownloaderMock_WaitForNewBlocks_Call) Run(run func(ctx context.Context, lastBlockSeen uint64)) *EVMDownloaderMock_WaitForNewBlocks_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64)) + }) + return _c +} + +func (_c *EVMDownloaderMock_WaitForNewBlocks_Call) Return(newLastBlock uint64) *EVMDownloaderMock_WaitForNewBlocks_Call { + _c.Call.Return(newLastBlock) + return _c +} + +func (_c *EVMDownloaderMock_WaitForNewBlocks_Call) RunAndReturn(run func(context.Context, uint64) uint64) *EVMDownloaderMock_WaitForNewBlocks_Call { + _c.Call.Return(run) + return _c +} + +// NewEVMDownloaderMock creates a new instance of EVMDownloaderMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEVMDownloaderMock(t interface { + mock.TestingT + Cleanup(func()) +}) *EVMDownloaderMock { + mock := &EVMDownloaderMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sync/mock_l2_test.go b/sync/mock_l2_test.go new file mode 100644 index 00000000..955af0db --- /dev/null +++ b/sync/mock_l2_test.go @@ -0,0 +1,1086 @@ +// Code generated by mockery. DO NOT EDIT. + +package sync + +import ( + context "context" + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + ethereum "github.com/ethereum/go-ethereum" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" +) + +// L2Mock is an autogenerated mock type for the EthClienter type +type L2Mock struct { + mock.Mock +} + +type L2Mock_Expecter struct { + mock *mock.Mock +} + +func (_m *L2Mock) EXPECT() *L2Mock_Expecter { + return &L2Mock_Expecter{mock: &_m.Mock} +} + +// BlockByHash provides a mock function with given fields: ctx, hash +func (_m *L2Mock) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for BlockByHash") + } + + var r0 *types.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Block, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Block); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_BlockByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockByHash' +type L2Mock_BlockByHash_Call struct { + *mock.Call +} + +// BlockByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *L2Mock_Expecter) BlockByHash(ctx interface{}, hash interface{}) *L2Mock_BlockByHash_Call { + return &L2Mock_BlockByHash_Call{Call: _e.mock.On("BlockByHash", ctx, hash)} +} + +func (_c *L2Mock_BlockByHash_Call) Run(run func(ctx context.Context, hash common.Hash)) *L2Mock_BlockByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *L2Mock_BlockByHash_Call) Return(_a0 *types.Block, _a1 error) *L2Mock_BlockByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_BlockByHash_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Block, error)) *L2Mock_BlockByHash_Call { + _c.Call.Return(run) + return _c +} + +// BlockByNumber provides a mock function with given fields: ctx, number +func (_m *L2Mock) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for BlockByNumber") + } + + var r0 *types.Block + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Block, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Block); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Block) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_BlockByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockByNumber' +type L2Mock_BlockByNumber_Call struct { + *mock.Call +} + +// BlockByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *L2Mock_Expecter) BlockByNumber(ctx interface{}, number interface{}) *L2Mock_BlockByNumber_Call { + return &L2Mock_BlockByNumber_Call{Call: _e.mock.On("BlockByNumber", ctx, number)} +} + +func (_c *L2Mock_BlockByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *L2Mock_BlockByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *L2Mock_BlockByNumber_Call) Return(_a0 *types.Block, _a1 error) *L2Mock_BlockByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_BlockByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*types.Block, error)) *L2Mock_BlockByNumber_Call { + _c.Call.Return(run) + return _c +} + +// BlockNumber provides a mock function with given fields: ctx +func (_m *L2Mock) BlockNumber(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for BlockNumber") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_BlockNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BlockNumber' +type L2Mock_BlockNumber_Call struct { + *mock.Call +} + +// BlockNumber is a helper method to define mock.On call +// - ctx context.Context +func (_e *L2Mock_Expecter) BlockNumber(ctx interface{}) *L2Mock_BlockNumber_Call { + return &L2Mock_BlockNumber_Call{Call: _e.mock.On("BlockNumber", ctx)} +} + +func (_c *L2Mock_BlockNumber_Call) Run(run func(ctx context.Context)) *L2Mock_BlockNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *L2Mock_BlockNumber_Call) Return(_a0 uint64, _a1 error) *L2Mock_BlockNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_BlockNumber_Call) RunAndReturn(run func(context.Context) (uint64, error)) *L2Mock_BlockNumber_Call { + _c.Call.Return(run) + return _c +} + +// CallContract provides a mock function with given fields: ctx, call, blockNumber +func (_m *L2Mock) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + ret := _m.Called(ctx, call, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for CallContract") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg, *big.Int) ([]byte, error)); ok { + return rf(ctx, call, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg, *big.Int) []byte); ok { + r0 = rf(ctx, call, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg, *big.Int) error); ok { + r1 = rf(ctx, call, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_CallContract_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CallContract' +type L2Mock_CallContract_Call struct { + *mock.Call +} + +// CallContract is a helper method to define mock.On call +// - ctx context.Context +// - call ethereum.CallMsg +// - blockNumber *big.Int +func (_e *L2Mock_Expecter) CallContract(ctx interface{}, call interface{}, blockNumber interface{}) *L2Mock_CallContract_Call { + return &L2Mock_CallContract_Call{Call: _e.mock.On("CallContract", ctx, call, blockNumber)} +} + +func (_c *L2Mock_CallContract_Call) Run(run func(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int)) *L2Mock_CallContract_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.CallMsg), args[2].(*big.Int)) + }) + return _c +} + +func (_c *L2Mock_CallContract_Call) Return(_a0 []byte, _a1 error) *L2Mock_CallContract_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_CallContract_Call) RunAndReturn(run func(context.Context, ethereum.CallMsg, *big.Int) ([]byte, error)) *L2Mock_CallContract_Call { + _c.Call.Return(run) + return _c +} + +// CodeAt provides a mock function with given fields: ctx, contract, blockNumber +func (_m *L2Mock) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { + ret := _m.Called(ctx, contract, blockNumber) + + if len(ret) == 0 { + panic("no return value specified for CodeAt") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) ([]byte, error)); ok { + return rf(ctx, contract, blockNumber) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address, *big.Int) []byte); ok { + r0 = rf(ctx, contract, blockNumber) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address, *big.Int) error); ok { + r1 = rf(ctx, contract, blockNumber) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_CodeAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CodeAt' +type L2Mock_CodeAt_Call struct { + *mock.Call +} + +// CodeAt is a helper method to define mock.On call +// - ctx context.Context +// - contract common.Address +// - blockNumber *big.Int +func (_e *L2Mock_Expecter) CodeAt(ctx interface{}, contract interface{}, blockNumber interface{}) *L2Mock_CodeAt_Call { + return &L2Mock_CodeAt_Call{Call: _e.mock.On("CodeAt", ctx, contract, blockNumber)} +} + +func (_c *L2Mock_CodeAt_Call) Run(run func(ctx context.Context, contract common.Address, blockNumber *big.Int)) *L2Mock_CodeAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address), args[2].(*big.Int)) + }) + return _c +} + +func (_c *L2Mock_CodeAt_Call) Return(_a0 []byte, _a1 error) *L2Mock_CodeAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_CodeAt_Call) RunAndReturn(run func(context.Context, common.Address, *big.Int) ([]byte, error)) *L2Mock_CodeAt_Call { + _c.Call.Return(run) + return _c +} + +// EstimateGas provides a mock function with given fields: ctx, call +func (_m *L2Mock) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error) { + ret := _m.Called(ctx, call) + + if len(ret) == 0 { + panic("no return value specified for EstimateGas") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) (uint64, error)); ok { + return rf(ctx, call) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) uint64); ok { + r0 = rf(ctx, call) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg) error); ok { + r1 = rf(ctx, call) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_EstimateGas_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'EstimateGas' +type L2Mock_EstimateGas_Call struct { + *mock.Call +} + +// EstimateGas is a helper method to define mock.On call +// - ctx context.Context +// - call ethereum.CallMsg +func (_e *L2Mock_Expecter) EstimateGas(ctx interface{}, call interface{}) *L2Mock_EstimateGas_Call { + return &L2Mock_EstimateGas_Call{Call: _e.mock.On("EstimateGas", ctx, call)} +} + +func (_c *L2Mock_EstimateGas_Call) Run(run func(ctx context.Context, call ethereum.CallMsg)) *L2Mock_EstimateGas_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.CallMsg)) + }) + return _c +} + +func (_c *L2Mock_EstimateGas_Call) Return(_a0 uint64, _a1 error) *L2Mock_EstimateGas_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_EstimateGas_Call) RunAndReturn(run func(context.Context, ethereum.CallMsg) (uint64, error)) *L2Mock_EstimateGas_Call { + _c.Call.Return(run) + return _c +} + +// FilterLogs provides a mock function with given fields: ctx, q +func (_m *L2Mock) FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) { + ret := _m.Called(ctx, q) + + if len(ret) == 0 { + panic("no return value specified for FilterLogs") + } + + var r0 []types.Log + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery) ([]types.Log, error)); ok { + return rf(ctx, q) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery) []types.Log); ok { + r0 = rf(ctx, q) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]types.Log) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.FilterQuery) error); ok { + r1 = rf(ctx, q) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_FilterLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterLogs' +type L2Mock_FilterLogs_Call struct { + *mock.Call +} + +// FilterLogs is a helper method to define mock.On call +// - ctx context.Context +// - q ethereum.FilterQuery +func (_e *L2Mock_Expecter) FilterLogs(ctx interface{}, q interface{}) *L2Mock_FilterLogs_Call { + return &L2Mock_FilterLogs_Call{Call: _e.mock.On("FilterLogs", ctx, q)} +} + +func (_c *L2Mock_FilterLogs_Call) Run(run func(ctx context.Context, q ethereum.FilterQuery)) *L2Mock_FilterLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.FilterQuery)) + }) + return _c +} + +func (_c *L2Mock_FilterLogs_Call) Return(_a0 []types.Log, _a1 error) *L2Mock_FilterLogs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_FilterLogs_Call) RunAndReturn(run func(context.Context, ethereum.FilterQuery) ([]types.Log, error)) *L2Mock_FilterLogs_Call { + _c.Call.Return(run) + return _c +} + +// HeaderByHash provides a mock function with given fields: ctx, hash +func (_m *L2Mock) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { + ret := _m.Called(ctx, hash) + + if len(ret) == 0 { + panic("no return value specified for HeaderByHash") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (*types.Header, error)); ok { + return rf(ctx, hash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) *types.Header); ok { + r0 = rf(ctx, hash) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, hash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_HeaderByHash_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByHash' +type L2Mock_HeaderByHash_Call struct { + *mock.Call +} + +// HeaderByHash is a helper method to define mock.On call +// - ctx context.Context +// - hash common.Hash +func (_e *L2Mock_Expecter) HeaderByHash(ctx interface{}, hash interface{}) *L2Mock_HeaderByHash_Call { + return &L2Mock_HeaderByHash_Call{Call: _e.mock.On("HeaderByHash", ctx, hash)} +} + +func (_c *L2Mock_HeaderByHash_Call) Run(run func(ctx context.Context, hash common.Hash)) *L2Mock_HeaderByHash_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *L2Mock_HeaderByHash_Call) Return(_a0 *types.Header, _a1 error) *L2Mock_HeaderByHash_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_HeaderByHash_Call) RunAndReturn(run func(context.Context, common.Hash) (*types.Header, error)) *L2Mock_HeaderByHash_Call { + _c.Call.Return(run) + return _c +} + +// HeaderByNumber provides a mock function with given fields: ctx, number +func (_m *L2Mock) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + ret := _m.Called(ctx, number) + + if len(ret) == 0 { + panic("no return value specified for HeaderByNumber") + } + + var r0 *types.Header + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*types.Header, error)); ok { + return rf(ctx, number) + } + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *types.Header); ok { + r0 = rf(ctx, number) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Header) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *big.Int) error); ok { + r1 = rf(ctx, number) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_HeaderByNumber_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HeaderByNumber' +type L2Mock_HeaderByNumber_Call struct { + *mock.Call +} + +// HeaderByNumber is a helper method to define mock.On call +// - ctx context.Context +// - number *big.Int +func (_e *L2Mock_Expecter) HeaderByNumber(ctx interface{}, number interface{}) *L2Mock_HeaderByNumber_Call { + return &L2Mock_HeaderByNumber_Call{Call: _e.mock.On("HeaderByNumber", ctx, number)} +} + +func (_c *L2Mock_HeaderByNumber_Call) Run(run func(ctx context.Context, number *big.Int)) *L2Mock_HeaderByNumber_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*big.Int)) + }) + return _c +} + +func (_c *L2Mock_HeaderByNumber_Call) Return(_a0 *types.Header, _a1 error) *L2Mock_HeaderByNumber_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_HeaderByNumber_Call) RunAndReturn(run func(context.Context, *big.Int) (*types.Header, error)) *L2Mock_HeaderByNumber_Call { + _c.Call.Return(run) + return _c +} + +// PendingCodeAt provides a mock function with given fields: ctx, account +func (_m *L2Mock) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { + ret := _m.Called(ctx, account) + + if len(ret) == 0 { + panic("no return value specified for PendingCodeAt") + } + + var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) ([]byte, error)); ok { + return rf(ctx, account) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) []byte); ok { + r0 = rf(ctx, account) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]byte) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, account) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_PendingCodeAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PendingCodeAt' +type L2Mock_PendingCodeAt_Call struct { + *mock.Call +} + +// PendingCodeAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +func (_e *L2Mock_Expecter) PendingCodeAt(ctx interface{}, account interface{}) *L2Mock_PendingCodeAt_Call { + return &L2Mock_PendingCodeAt_Call{Call: _e.mock.On("PendingCodeAt", ctx, account)} +} + +func (_c *L2Mock_PendingCodeAt_Call) Run(run func(ctx context.Context, account common.Address)) *L2Mock_PendingCodeAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *L2Mock_PendingCodeAt_Call) Return(_a0 []byte, _a1 error) *L2Mock_PendingCodeAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_PendingCodeAt_Call) RunAndReturn(run func(context.Context, common.Address) ([]byte, error)) *L2Mock_PendingCodeAt_Call { + _c.Call.Return(run) + return _c +} + +// PendingNonceAt provides a mock function with given fields: ctx, account +func (_m *L2Mock) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { + ret := _m.Called(ctx, account) + + if len(ret) == 0 { + panic("no return value specified for PendingNonceAt") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Address) (uint64, error)); ok { + return rf(ctx, account) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Address) uint64); ok { + r0 = rf(ctx, account) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Address) error); ok { + r1 = rf(ctx, account) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_PendingNonceAt_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PendingNonceAt' +type L2Mock_PendingNonceAt_Call struct { + *mock.Call +} + +// PendingNonceAt is a helper method to define mock.On call +// - ctx context.Context +// - account common.Address +func (_e *L2Mock_Expecter) PendingNonceAt(ctx interface{}, account interface{}) *L2Mock_PendingNonceAt_Call { + return &L2Mock_PendingNonceAt_Call{Call: _e.mock.On("PendingNonceAt", ctx, account)} +} + +func (_c *L2Mock_PendingNonceAt_Call) Run(run func(ctx context.Context, account common.Address)) *L2Mock_PendingNonceAt_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Address)) + }) + return _c +} + +func (_c *L2Mock_PendingNonceAt_Call) Return(_a0 uint64, _a1 error) *L2Mock_PendingNonceAt_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_PendingNonceAt_Call) RunAndReturn(run func(context.Context, common.Address) (uint64, error)) *L2Mock_PendingNonceAt_Call { + _c.Call.Return(run) + return _c +} + +// SendTransaction provides a mock function with given fields: ctx, tx +func (_m *L2Mock) SendTransaction(ctx context.Context, tx *types.Transaction) error { + ret := _m.Called(ctx, tx) + + if len(ret) == 0 { + panic("no return value specified for SendTransaction") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *types.Transaction) error); ok { + r0 = rf(ctx, tx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// L2Mock_SendTransaction_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SendTransaction' +type L2Mock_SendTransaction_Call struct { + *mock.Call +} + +// SendTransaction is a helper method to define mock.On call +// - ctx context.Context +// - tx *types.Transaction +func (_e *L2Mock_Expecter) SendTransaction(ctx interface{}, tx interface{}) *L2Mock_SendTransaction_Call { + return &L2Mock_SendTransaction_Call{Call: _e.mock.On("SendTransaction", ctx, tx)} +} + +func (_c *L2Mock_SendTransaction_Call) Run(run func(ctx context.Context, tx *types.Transaction)) *L2Mock_SendTransaction_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*types.Transaction)) + }) + return _c +} + +func (_c *L2Mock_SendTransaction_Call) Return(_a0 error) *L2Mock_SendTransaction_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *L2Mock_SendTransaction_Call) RunAndReturn(run func(context.Context, *types.Transaction) error) *L2Mock_SendTransaction_Call { + _c.Call.Return(run) + return _c +} + +// SubscribeFilterLogs provides a mock function with given fields: ctx, q, ch +func (_m *L2Mock) SubscribeFilterLogs(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { + ret := _m.Called(ctx, q, ch) + + if len(ret) == 0 { + panic("no return value specified for SubscribeFilterLogs") + } + + var r0 ethereum.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) (ethereum.Subscription, error)); ok { + return rf(ctx, q, ch) + } + if rf, ok := ret.Get(0).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) ethereum.Subscription); ok { + r0 = rf(ctx, q, ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ethereum.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, ethereum.FilterQuery, chan<- types.Log) error); ok { + r1 = rf(ctx, q, ch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_SubscribeFilterLogs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeFilterLogs' +type L2Mock_SubscribeFilterLogs_Call struct { + *mock.Call +} + +// SubscribeFilterLogs is a helper method to define mock.On call +// - ctx context.Context +// - q ethereum.FilterQuery +// - ch chan<- types.Log +func (_e *L2Mock_Expecter) SubscribeFilterLogs(ctx interface{}, q interface{}, ch interface{}) *L2Mock_SubscribeFilterLogs_Call { + return &L2Mock_SubscribeFilterLogs_Call{Call: _e.mock.On("SubscribeFilterLogs", ctx, q, ch)} +} + +func (_c *L2Mock_SubscribeFilterLogs_Call) Run(run func(ctx context.Context, q ethereum.FilterQuery, ch chan<- types.Log)) *L2Mock_SubscribeFilterLogs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(ethereum.FilterQuery), args[2].(chan<- types.Log)) + }) + return _c +} + +func (_c *L2Mock_SubscribeFilterLogs_Call) Return(_a0 ethereum.Subscription, _a1 error) *L2Mock_SubscribeFilterLogs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_SubscribeFilterLogs_Call) RunAndReturn(run func(context.Context, ethereum.FilterQuery, chan<- types.Log) (ethereum.Subscription, error)) *L2Mock_SubscribeFilterLogs_Call { + _c.Call.Return(run) + return _c +} + +// SubscribeNewHead provides a mock function with given fields: ctx, ch +func (_m *L2Mock) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) { + ret := _m.Called(ctx, ch) + + if len(ret) == 0 { + panic("no return value specified for SubscribeNewHead") + } + + var r0 ethereum.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) (ethereum.Subscription, error)); ok { + return rf(ctx, ch) + } + if rf, ok := ret.Get(0).(func(context.Context, chan<- *types.Header) ethereum.Subscription); ok { + r0 = rf(ctx, ch) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(ethereum.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, chan<- *types.Header) error); ok { + r1 = rf(ctx, ch) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_SubscribeNewHead_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SubscribeNewHead' +type L2Mock_SubscribeNewHead_Call struct { + *mock.Call +} + +// SubscribeNewHead is a helper method to define mock.On call +// - ctx context.Context +// - ch chan<- *types.Header +func (_e *L2Mock_Expecter) SubscribeNewHead(ctx interface{}, ch interface{}) *L2Mock_SubscribeNewHead_Call { + return &L2Mock_SubscribeNewHead_Call{Call: _e.mock.On("SubscribeNewHead", ctx, ch)} +} + +func (_c *L2Mock_SubscribeNewHead_Call) Run(run func(ctx context.Context, ch chan<- *types.Header)) *L2Mock_SubscribeNewHead_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(chan<- *types.Header)) + }) + return _c +} + +func (_c *L2Mock_SubscribeNewHead_Call) Return(_a0 ethereum.Subscription, _a1 error) *L2Mock_SubscribeNewHead_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_SubscribeNewHead_Call) RunAndReturn(run func(context.Context, chan<- *types.Header) (ethereum.Subscription, error)) *L2Mock_SubscribeNewHead_Call { + _c.Call.Return(run) + return _c +} + +// SuggestGasPrice provides a mock function with given fields: ctx +func (_m *L2Mock) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for SuggestGasPrice") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_SuggestGasPrice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SuggestGasPrice' +type L2Mock_SuggestGasPrice_Call struct { + *mock.Call +} + +// SuggestGasPrice is a helper method to define mock.On call +// - ctx context.Context +func (_e *L2Mock_Expecter) SuggestGasPrice(ctx interface{}) *L2Mock_SuggestGasPrice_Call { + return &L2Mock_SuggestGasPrice_Call{Call: _e.mock.On("SuggestGasPrice", ctx)} +} + +func (_c *L2Mock_SuggestGasPrice_Call) Run(run func(ctx context.Context)) *L2Mock_SuggestGasPrice_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *L2Mock_SuggestGasPrice_Call) Return(_a0 *big.Int, _a1 error) *L2Mock_SuggestGasPrice_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_SuggestGasPrice_Call) RunAndReturn(run func(context.Context) (*big.Int, error)) *L2Mock_SuggestGasPrice_Call { + _c.Call.Return(run) + return _c +} + +// SuggestGasTipCap provides a mock function with given fields: ctx +func (_m *L2Mock) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for SuggestGasTipCap") + } + + var r0 *big.Int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*big.Int, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) *big.Int); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*big.Int) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_SuggestGasTipCap_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SuggestGasTipCap' +type L2Mock_SuggestGasTipCap_Call struct { + *mock.Call +} + +// SuggestGasTipCap is a helper method to define mock.On call +// - ctx context.Context +func (_e *L2Mock_Expecter) SuggestGasTipCap(ctx interface{}) *L2Mock_SuggestGasTipCap_Call { + return &L2Mock_SuggestGasTipCap_Call{Call: _e.mock.On("SuggestGasTipCap", ctx)} +} + +func (_c *L2Mock_SuggestGasTipCap_Call) Run(run func(ctx context.Context)) *L2Mock_SuggestGasTipCap_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *L2Mock_SuggestGasTipCap_Call) Return(_a0 *big.Int, _a1 error) *L2Mock_SuggestGasTipCap_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_SuggestGasTipCap_Call) RunAndReturn(run func(context.Context) (*big.Int, error)) *L2Mock_SuggestGasTipCap_Call { + _c.Call.Return(run) + return _c +} + +// TransactionCount provides a mock function with given fields: ctx, blockHash +func (_m *L2Mock) TransactionCount(ctx context.Context, blockHash common.Hash) (uint, error) { + ret := _m.Called(ctx, blockHash) + + if len(ret) == 0 { + panic("no return value specified for TransactionCount") + } + + var r0 uint + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (uint, error)); ok { + return rf(ctx, blockHash) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) uint); ok { + r0 = rf(ctx, blockHash) + } else { + r0 = ret.Get(0).(uint) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, blockHash) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_TransactionCount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransactionCount' +type L2Mock_TransactionCount_Call struct { + *mock.Call +} + +// TransactionCount is a helper method to define mock.On call +// - ctx context.Context +// - blockHash common.Hash +func (_e *L2Mock_Expecter) TransactionCount(ctx interface{}, blockHash interface{}) *L2Mock_TransactionCount_Call { + return &L2Mock_TransactionCount_Call{Call: _e.mock.On("TransactionCount", ctx, blockHash)} +} + +func (_c *L2Mock_TransactionCount_Call) Run(run func(ctx context.Context, blockHash common.Hash)) *L2Mock_TransactionCount_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *L2Mock_TransactionCount_Call) Return(_a0 uint, _a1 error) *L2Mock_TransactionCount_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_TransactionCount_Call) RunAndReturn(run func(context.Context, common.Hash) (uint, error)) *L2Mock_TransactionCount_Call { + _c.Call.Return(run) + return _c +} + +// TransactionInBlock provides a mock function with given fields: ctx, blockHash, index +func (_m *L2Mock) TransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error) { + ret := _m.Called(ctx, blockHash, index) + + if len(ret) == 0 { + panic("no return value specified for TransactionInBlock") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash, uint) (*types.Transaction, error)); ok { + return rf(ctx, blockHash, index) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash, uint) *types.Transaction); ok { + r0 = rf(ctx, blockHash, index) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash, uint) error); ok { + r1 = rf(ctx, blockHash, index) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// L2Mock_TransactionInBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransactionInBlock' +type L2Mock_TransactionInBlock_Call struct { + *mock.Call +} + +// TransactionInBlock is a helper method to define mock.On call +// - ctx context.Context +// - blockHash common.Hash +// - index uint +func (_e *L2Mock_Expecter) TransactionInBlock(ctx interface{}, blockHash interface{}, index interface{}) *L2Mock_TransactionInBlock_Call { + return &L2Mock_TransactionInBlock_Call{Call: _e.mock.On("TransactionInBlock", ctx, blockHash, index)} +} + +func (_c *L2Mock_TransactionInBlock_Call) Run(run func(ctx context.Context, blockHash common.Hash, index uint)) *L2Mock_TransactionInBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash), args[2].(uint)) + }) + return _c +} + +func (_c *L2Mock_TransactionInBlock_Call) Return(_a0 *types.Transaction, _a1 error) *L2Mock_TransactionInBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *L2Mock_TransactionInBlock_Call) RunAndReturn(run func(context.Context, common.Hash, uint) (*types.Transaction, error)) *L2Mock_TransactionInBlock_Call { + _c.Call.Return(run) + return _c +} + +// NewL2Mock creates a new instance of L2Mock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewL2Mock(t interface { + mock.TestingT + Cleanup(func()) +}) *L2Mock { + mock := &L2Mock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sync/mock_processor_test.go b/sync/mock_processor_test.go new file mode 100644 index 00000000..96ece8d4 --- /dev/null +++ b/sync/mock_processor_test.go @@ -0,0 +1,186 @@ +// Code generated by mockery. DO NOT EDIT. + +package sync + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" +) + +// ProcessorMock is an autogenerated mock type for the processorInterface type +type ProcessorMock struct { + mock.Mock +} + +type ProcessorMock_Expecter struct { + mock *mock.Mock +} + +func (_m *ProcessorMock) EXPECT() *ProcessorMock_Expecter { + return &ProcessorMock_Expecter{mock: &_m.Mock} +} + +// GetLastProcessedBlock provides a mock function with given fields: ctx +func (_m *ProcessorMock) GetLastProcessedBlock(ctx context.Context) (uint64, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for GetLastProcessedBlock") + } + + var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (uint64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) uint64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(uint64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ProcessorMock_GetLastProcessedBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetLastProcessedBlock' +type ProcessorMock_GetLastProcessedBlock_Call struct { + *mock.Call +} + +// GetLastProcessedBlock is a helper method to define mock.On call +// - ctx context.Context +func (_e *ProcessorMock_Expecter) GetLastProcessedBlock(ctx interface{}) *ProcessorMock_GetLastProcessedBlock_Call { + return &ProcessorMock_GetLastProcessedBlock_Call{Call: _e.mock.On("GetLastProcessedBlock", ctx)} +} + +func (_c *ProcessorMock_GetLastProcessedBlock_Call) Run(run func(ctx context.Context)) *ProcessorMock_GetLastProcessedBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *ProcessorMock_GetLastProcessedBlock_Call) Return(_a0 uint64, _a1 error) *ProcessorMock_GetLastProcessedBlock_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ProcessorMock_GetLastProcessedBlock_Call) RunAndReturn(run func(context.Context) (uint64, error)) *ProcessorMock_GetLastProcessedBlock_Call { + _c.Call.Return(run) + return _c +} + +// ProcessBlock provides a mock function with given fields: ctx, block +func (_m *ProcessorMock) ProcessBlock(ctx context.Context, block Block) error { + ret := _m.Called(ctx, block) + + if len(ret) == 0 { + panic("no return value specified for ProcessBlock") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, Block) error); ok { + r0 = rf(ctx, block) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ProcessorMock_ProcessBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessBlock' +type ProcessorMock_ProcessBlock_Call struct { + *mock.Call +} + +// ProcessBlock is a helper method to define mock.On call +// - ctx context.Context +// - block Block +func (_e *ProcessorMock_Expecter) ProcessBlock(ctx interface{}, block interface{}) *ProcessorMock_ProcessBlock_Call { + return &ProcessorMock_ProcessBlock_Call{Call: _e.mock.On("ProcessBlock", ctx, block)} +} + +func (_c *ProcessorMock_ProcessBlock_Call) Run(run func(ctx context.Context, block Block)) *ProcessorMock_ProcessBlock_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(Block)) + }) + return _c +} + +func (_c *ProcessorMock_ProcessBlock_Call) Return(_a0 error) *ProcessorMock_ProcessBlock_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ProcessorMock_ProcessBlock_Call) RunAndReturn(run func(context.Context, Block) error) *ProcessorMock_ProcessBlock_Call { + _c.Call.Return(run) + return _c +} + +// Reorg provides a mock function with given fields: ctx, firstReorgedBlock +func (_m *ProcessorMock) Reorg(ctx context.Context, firstReorgedBlock uint64) error { + ret := _m.Called(ctx, firstReorgedBlock) + + if len(ret) == 0 { + panic("no return value specified for Reorg") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, uint64) error); ok { + r0 = rf(ctx, firstReorgedBlock) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ProcessorMock_Reorg_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Reorg' +type ProcessorMock_Reorg_Call struct { + *mock.Call +} + +// Reorg is a helper method to define mock.On call +// - ctx context.Context +// - firstReorgedBlock uint64 +func (_e *ProcessorMock_Expecter) Reorg(ctx interface{}, firstReorgedBlock interface{}) *ProcessorMock_Reorg_Call { + return &ProcessorMock_Reorg_Call{Call: _e.mock.On("Reorg", ctx, firstReorgedBlock)} +} + +func (_c *ProcessorMock_Reorg_Call) Run(run func(ctx context.Context, firstReorgedBlock uint64)) *ProcessorMock_Reorg_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(uint64)) + }) + return _c +} + +func (_c *ProcessorMock_Reorg_Call) Return(_a0 error) *ProcessorMock_Reorg_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ProcessorMock_Reorg_Call) RunAndReturn(run func(context.Context, uint64) error) *ProcessorMock_Reorg_Call { + _c.Call.Return(run) + return _c +} + +// NewProcessorMock creates a new instance of ProcessorMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewProcessorMock(t interface { + mock.TestingT + Cleanup(func()) +}) *ProcessorMock { + mock := &ProcessorMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/sync/mock_reorgdetector_test.go b/sync/mock_reorgdetector_test.go new file mode 100644 index 00000000..9faaadb9 --- /dev/null +++ b/sync/mock_reorgdetector_test.go @@ -0,0 +1,147 @@ +// Code generated by mockery. DO NOT EDIT. + +package sync + +import ( + context "context" + + common "github.com/ethereum/go-ethereum/common" + + mock "github.com/stretchr/testify/mock" + + reorgdetector "github.com/agglayer/aggkit/reorgdetector" +) + +// ReorgDetectorMock is an autogenerated mock type for the ReorgDetector type +type ReorgDetectorMock struct { + mock.Mock +} + +type ReorgDetectorMock_Expecter struct { + mock *mock.Mock +} + +func (_m *ReorgDetectorMock) EXPECT() *ReorgDetectorMock_Expecter { + return &ReorgDetectorMock_Expecter{mock: &_m.Mock} +} + +// AddBlockToTrack provides a mock function with given fields: ctx, id, blockNum, blockHash +func (_m *ReorgDetectorMock) AddBlockToTrack(ctx context.Context, id string, blockNum uint64, blockHash common.Hash) error { + ret := _m.Called(ctx, id, blockNum, blockHash) + + if len(ret) == 0 { + panic("no return value specified for AddBlockToTrack") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, uint64, common.Hash) error); ok { + r0 = rf(ctx, id, blockNum, blockHash) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// ReorgDetectorMock_AddBlockToTrack_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddBlockToTrack' +type ReorgDetectorMock_AddBlockToTrack_Call struct { + *mock.Call +} + +// AddBlockToTrack is a helper method to define mock.On call +// - ctx context.Context +// - id string +// - blockNum uint64 +// - blockHash common.Hash +func (_e *ReorgDetectorMock_Expecter) AddBlockToTrack(ctx interface{}, id interface{}, blockNum interface{}, blockHash interface{}) *ReorgDetectorMock_AddBlockToTrack_Call { + return &ReorgDetectorMock_AddBlockToTrack_Call{Call: _e.mock.On("AddBlockToTrack", ctx, id, blockNum, blockHash)} +} + +func (_c *ReorgDetectorMock_AddBlockToTrack_Call) Run(run func(ctx context.Context, id string, blockNum uint64, blockHash common.Hash)) *ReorgDetectorMock_AddBlockToTrack_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(string), args[2].(uint64), args[3].(common.Hash)) + }) + return _c +} + +func (_c *ReorgDetectorMock_AddBlockToTrack_Call) Return(_a0 error) *ReorgDetectorMock_AddBlockToTrack_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *ReorgDetectorMock_AddBlockToTrack_Call) RunAndReturn(run func(context.Context, string, uint64, common.Hash) error) *ReorgDetectorMock_AddBlockToTrack_Call { + _c.Call.Return(run) + return _c +} + +// Subscribe provides a mock function with given fields: id +func (_m *ReorgDetectorMock) Subscribe(id string) (*reorgdetector.Subscription, error) { + ret := _m.Called(id) + + if len(ret) == 0 { + panic("no return value specified for Subscribe") + } + + var r0 *reorgdetector.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(string) (*reorgdetector.Subscription, error)); ok { + return rf(id) + } + if rf, ok := ret.Get(0).(func(string) *reorgdetector.Subscription); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*reorgdetector.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ReorgDetectorMock_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' +type ReorgDetectorMock_Subscribe_Call struct { + *mock.Call +} + +// Subscribe is a helper method to define mock.On call +// - id string +func (_e *ReorgDetectorMock_Expecter) Subscribe(id interface{}) *ReorgDetectorMock_Subscribe_Call { + return &ReorgDetectorMock_Subscribe_Call{Call: _e.mock.On("Subscribe", id)} +} + +func (_c *ReorgDetectorMock_Subscribe_Call) Run(run func(id string)) *ReorgDetectorMock_Subscribe_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(string)) + }) + return _c +} + +func (_c *ReorgDetectorMock_Subscribe_Call) Return(_a0 *reorgdetector.Subscription, _a1 error) *ReorgDetectorMock_Subscribe_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ReorgDetectorMock_Subscribe_Call) RunAndReturn(run func(string) (*reorgdetector.Subscription, error)) *ReorgDetectorMock_Subscribe_Call { + _c.Call.Return(run) + return _c +} + +// NewReorgDetectorMock creates a new instance of ReorgDetectorMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewReorgDetectorMock(t interface { + mock.TestingT + Cleanup(func()) +}) *ReorgDetectorMock { + mock := &ReorgDetectorMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 00000000..46492f87 --- /dev/null +++ b/test/Makefile @@ -0,0 +1,124 @@ +.PHONY: generate-mocks +generate-mocks: generate-mocks-bridgesync generate-mocks-reorgdetector \ + generate-mocks-sequencesender generate-mocks-da \ + generate-mocks-l1infotreesync generate-mocks-helpers \ + generate-mocks-sync generate-mocks-aggregator \ + generate-mocks-aggsender generate-mocks-agglayer + +.PHONY: generate-mocks-bridgesync +generate-mocks-bridgesync: ## Generates mocks for bridgesync, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --all --case snake --dir ../bridgesync --output ../bridgesync/mocks --outpkg mocks_bridgesync ${COMMON_MOCKERY_PARAMS} + +.PHONY: generate-mocks-reorgdetector +generate-mocks-reorgdetector: ## Generates mocks for reorgdetector, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=EthClient --dir=../reorgdetector --output=../reorgdetector --outpkg=reorgdetector --inpackage --structname=EthClientMock --filename=mock_eth_client.go ${COMMON_MOCKERY_PARAMS} + +COMMON_MOCKERY_PARAMS=--disable-version-string --with-expecter --exported +.PHONY: generate-mocks-sequencesender +generate-mocks-sequencesender: ## Generates mocks for sequencesender, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --all --case snake --dir ../sequencesender/txbuilder --output ../sequencesender/txbuilder/mocks_txbuilder --outpkg mocks_txbuilder ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=EthTxManager --dir=../sequencesender --output=../sequencesender/mocks --outpkg=mocks --structname=EthTxManagerMock --filename=mock_ethtxmanager.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=Etherman --dir=../sequencesender --output=../sequencesender/mocks --outpkg=mocks --structname=EthermanMock --filename=mock_etherman.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=RPCInterface --dir=../sequencesender --output=../sequencesender/mocks --outpkg=mocks --structname=RPCInterfaceMock --filename=mock_rpc.go ${COMMON_MOCKERY_PARAMS} + +.PHONY: generate-mocks-da +generate-mocks-da: ## Generates mocks for dataavailability, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --all --case snake --dir ../dataavailability --output ../dataavailability/mocks_da --outpkg mocks_da ${COMMON_MOCKERY_PARAMS} + +.PHONY: generate-mocks-rpc +generate-mocks-rpc: ## Generates mocks for rpc, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --all --case snake --dir ../rpc --output ../rpc/mocks --outpkg mocks ${COMMON_MOCKERY_PARAMS} + +.PHONY: generate-mocks-l1infotreesync +generate-mocks-l1infotreesync: ## Generates mocks for l1infotreesync, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --all --case snake --dir ../l1infotreesync --output ../l1infotreesync/mocks --outpkg mocks_l1infotreesync ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=ReorgDetector --dir=../sync --output=../l1infotreesync/mocks --outpkg=mocks_l1infotreesync --structname=ReorgDetectorMock --filename=mock_reorgdetector.go ${COMMON_MOCKERY_PARAMS} + +.PHONY: generate-mocks-helpers +generate-mocks-helpers: ## Generates mocks for helpers, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=EthTxManager --dir=../aggoracle/chaingersender --output=./helpers --outpkg=helpers --structname=EthTxManagerMock --filename=mock_ethtxmanager.go ${COMMON_MOCKERY_PARAMS} + +.PHONY: generate-mocks-aggoracle +generate-mocks-aggoracle: ## Generates mocks for aggoracle, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=EthTxManager --dir ../aggoracle/chaingersender --output ../aggoracle/mocks --outpkg mocks --structname=EthTxManagerMock --filename=mock_ethtxmanager.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=L2GERManager --dir ../aggoracle/chaingersender --output ../aggoracle/mocks --outpkg mocks --structname=L2GERManagerMock --filename=mock_l2germanager.go ${COMMON_MOCKERY_PARAMS} + +.PHONY: generate-mocks-sync +generate-mocks-sync: ## Generates mocks for sync, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=EthClienter --dir=../sync --output=../sync --outpkg=sync --inpackage --structname=L2Mock --filename=mock_l2_test.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=evmDownloaderFull --dir=../sync --output=../sync --outpkg=sync --inpackage --structname=EVMDownloaderMock --filename=mock_downloader_test.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=processorInterface --dir=../sync --output=../sync --outpkg=sync --inpackage --structname=ProcessorMock --filename=mock_processor_test.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=ReorgDetector --dir=../sync --output=../sync --outpkg=sync --inpackage --structname=ReorgDetectorMock --filename=mock_reorgdetector_test.go ${COMMON_MOCKERY_PARAMS} + + +.PHONY: generate-mocks-aggregator +generate-mocks-aggregator: ## Generates mocks for aggregator, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=ProverInterface --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=ProverInterfaceMock --filename=mock_prover.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=Etherman --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=EthermanMock --filename=mock_etherman.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=StorageInterface --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=StorageInterfaceMock --filename=mock_storage.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=Synchronizer --srcpkg=github.com/0xPolygonHermez/zkevm-synchronizer-l1/synchronizer --output=../aggregator/mocks --outpkg=mocks --structname=SynchronizerInterfaceMock --filename=mock_synchronizer.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=EthTxManagerClient --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=EthTxManagerClientMock --filename=mock_eth_tx_manager.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=Txer --dir=../db --output=../aggregator/mocks --outpkg=mocks --structname=TxerMock --filename=mock_txer.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=RPCInterface --dir=../aggregator --output=../aggregator/mocks --outpkg=mocks --structname=RPCInterfaceMock --filename=mock_rpc.go ${COMMON_MOCKERY_PARAMS} + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=AggregatorService_ChannelServer --dir=../aggregator/prover --output=../aggregator/prover/mocks --outpkg=mocks --structname=ChannelMock --filename=mock_channel.go ${COMMON_MOCKERY_PARAMS} + + +.PHONY: generate-mocks-aggsender +generate-mocks-aggsender: ## Generates mocks for aggsender, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --all --case snake --dir ../aggsender --output ../aggsender/mocks --outpkg mocks ${COMMON_MOCKERY_PARAMS} + +.PHONY: generate-mocks-agglayer +generate-mocks-agglayer: ## Generates mocks for agglayer, using mockery tool + export "GOROOT=$$(go env GOROOT)" && $$(go env GOPATH)/bin/mockery --name=AgglayerClientInterface --dir=../agglayer --output=../agglayer --outpkg=agglayer --inpackage --structname=AgglayerClientMock --filename=mock_agglayer_client.go ${COMMON_MOCKERY_PARAMS} + +.PHONY: test-e2e-fork9-validium +test-e2e-fork9-validium: stop + ./run-e2e.sh fork9 cdk-validium + export BATS_TEST_TIMEOUT=1800 + bats bats/fep/ + +.PHONY: test-e2e-fork11-rollup +test-e2e-fork11-rollup: stop + ./run-e2e.sh fork11 rollup + export BATS_TEST_TIMEOUT=1800 + bats bats/fep/ + +.PHONY: test-e2e-fork12-validium +test-e2e-fork12-validium: stop + ./run-e2e.sh fork12 cdk-validium + export BATS_TEST_TIMEOUT=1800 + bats bats/fep/ + +.PHONY: test-e2e-fork12-rollup +test-e2e-fork12-rollup: stop + ./run-e2e.sh fork12 rollup + export BATS_TEST_TIMEOUT=1800 + bats bats/fep/ + +.PHONY: test-e2e-fork12-pessimistic +test-e2e-fork12-pessimistic: stop + ./run-e2e.sh fork12 pessimistic + export BATS_TEST_TIMEOUT=1800 + bats bats/pp/bridge-e2e.bats bats/pp/e2e-pp.bats + +.PHONY: test-e2e-fork12-multi-pessimistic +test-e2e-fork12-multi-pessimistic: stop + ./run-e2e-multi_pp.sh + export BATS_TEST_TIMEOUT=1800 + bats bats/pp-multi + +.PHONY: stop +stop: + kurtosis clean --all + + +## Help display. +## Pulls comments from beside commands and prints a nicely formatted +## display with the commands and their usage information. +.DEFAULT_GOAL := help + +.PHONY: help +help: ## Prints this help + @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \ + | sort \ + | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/test/aggregator.keystore b/test/aggregator.keystore new file mode 100644 index 00000000..36adf8bc --- /dev/null +++ b/test/aggregator.keystore @@ -0,0 +1 @@ +{"version":3,"id":"71b028b6-9b1d-4f4c-9e66-31c94a6eb679","address":"70997970c51812dc3a010c7d01b50e0d17dc79c8","crypto":{"ciphertext":"985d5dc5f7750fc4ad0ad0d370486870016bb97e00ef1f7b146d6ad95d456861","cipherparams":{"iv":"f51b18b9f45872f71c3578513fca6cb0"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"6253e2d8a71e4808dd11143329cfea467cabb37ac1e1e55dbc0dd90ff22524a7","n":8192,"r":8,"p":1},"mac":"922f741e84201fc7c17bbf9fae5dba6c04a2a99a7268998b5a0268aa690004be"}} \ No newline at end of file diff --git a/test/bats/fep/access-list-e2e.bats b/test/bats/fep/access-list-e2e.bats new file mode 100644 index 00000000..cc621c10 --- /dev/null +++ b/test/bats/fep/access-list-e2e.bats @@ -0,0 +1,119 @@ +setup() { + load '../helpers/common-setup' + load '../helpers/common' + + _common_setup + + readonly erigon_sequencer_node=${KURTOSIS_ERIGON_SEQUENCER:-cdk-erigon-sequencer-001} + readonly kurtosis_sequencer_wrapper=${KURTOSIS_SEQUENCER_WRAPPER:-"kurtosis service exec $enclave $erigon_sequencer_node"} + readonly key=${SENDER_PRIVATE_KEY:-"12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625"} + readonly receiver=${RECEIVER:-"0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6"} + readonly data_dir=${ACL_DATA_DIR:-"/home/erigon/data/dynamic-kurtosis-sequencer/txpool/acls"} +} + +teardown() { + run set_acl_mode "disabled" +} + +# Helper function to add address to acl dynamically +add_to_access_list() { + local acl_type="$1" + local policy="$2" + local sender=$(cast wallet address "$key") + + run $kurtosis_sequencer_wrapper "acl add --datadir $data_dir --address $sender --type $acl_type --policy $policy" +} + +# Helper function to set the acl mode command dynamically +set_acl_mode() { + local mode="$1" + + run $kurtosis_sequencer_wrapper "acl mode --datadir $data_dir --mode $mode" +} + +@test "Test Block List - Sending regular transaction when address not in block list" { + local value="10ether" + run set_acl_mode "blocklist" + run send_tx $l2_rpc_url $key $receiver $value + + assert_success + assert_output --regexp "Transaction successful \(transaction hash: 0x[a-fA-F0-9]{64}\)" +} + +@test "Test Block List - Sending contracts deploy transaction when address not in block list" { + local contract_artifact="./contracts/erc20mock/ERC20Mock.json" + run set_acl_mode "blocklist" + run deploy_contract $l2_rpc_url $key $contract_artifact + + assert_success + + contract_addr=$(echo "$output" | tail -n 1) + assert_output --regexp "0x[a-fA-F0-9]{40}" +} + +@test "Test Block List - Sending regular transaction when address is in block list" { + local value="10ether" + + run set_acl_mode "blocklist" + run add_to_access_list "blocklist" "sendTx" + + run send_tx $l2_rpc_url $key $receiver $value + + assert_failure + assert_output --partial "sender disallowed to send tx by ACL policy" +} + +@test "Test Block List - Sending contracts deploy transaction when address is in block list" { + local contract_artifact="./contracts/erc20mock/ERC20Mock.json" + + run set_acl_mode "blocklist" + run add_to_access_list "blocklist" "deploy" + run deploy_contract $l2_rpc_url $key $contract_artifact + + assert_failure + assert_output --partial "sender disallowed to deploy contract by ACL policy" +} + +@test "Test Allow List - Sending regular transaction when address not in allow list" { + local value="10ether" + + run set_acl_mode "allowlist" + run send_tx $l2_rpc_url $key $receiver $value + + assert_failure + assert_output --partial "sender disallowed to send tx by ACL policy" +} + +@test "Test Allow List - Sending contracts deploy transaction when address not in allow list" { + local contract_artifact="./contracts/erc20mock/ERC20Mock.json" + + run set_acl_mode "allowlist" + run deploy_contract $l2_rpc_url $key $contract_artifact + + assert_failure + assert_output --partial "sender disallowed to deploy contract by ACL policy" +} + +@test "Test Allow List - Sending regular transaction when address is in allow list" { + local value="10ether" + + run set_acl_mode "allowlist" + run add_to_access_list "allowlist" "sendTx" + run send_tx $l2_rpc_url $key $receiver $value + + assert_success + assert_output --regexp "Transaction successful \(transaction hash: 0x[a-fA-F0-9]{64}\)" +} + +@test "Test Allow List - Sending contracts deploy transaction when address is in allow list" { + local contract_artifact="./contracts/erc20mock/ERC20Mock.json" + + run set_acl_mode "allowlist" + run add_to_access_list "allowlist" "deploy" + run deploy_contract $l2_rpc_url $key $contract_artifact + + assert_success + + contract_addr=$(echo "$output" | tail -n 1) + assert_output --regexp "0x[a-fA-F0-9]{40}" +} diff --git a/test/bats/fep/basic-e2e.bats b/test/bats/fep/basic-e2e.bats new file mode 100644 index 00000000..d977f4bc --- /dev/null +++ b/test/bats/fep/basic-e2e.bats @@ -0,0 +1,196 @@ +setup() { + load '../helpers/common-setup' + load '../helpers/common' + + _common_setup + + readonly sender_private_key=${SENDER_PRIVATE_KEY:-"12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625"} + readonly receiver=${RECEIVER:-"0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6"} +} + +@test "Send EOA transaction" { + local sender_addr=$(cast wallet address --private-key "$sender_private_key") + local initial_nonce=$(cast nonce "$sender_addr" --rpc-url "$l2_rpc_url") || { + echo "Failed to retrieve nonce for sender: $sender_addr using RPC URL: $l2_rpc_url" + return 1 + } + local value="10ether" + + # case 1: Transaction successful sender has sufficient balance + run send_tx "$l2_rpc_url" "$sender_private_key" "$receiver" "$value" + assert_success + assert_output --regexp "Transaction successful \(transaction hash: 0x[a-fA-F0-9]{64}\)" + + # case 2: Transaction rejected as sender attempts to transfer more than it has in its wallet. + # Transaction will fail pre-validation check on the node and will be dropped subsequently from the pool + # without recording it on the chain and hence nonce will not change + local sender_balance=$(cast balance "$sender_addr" --ether --rpc-url "$l2_rpc_url") || { + echo "Failed to retrieve balance for sender: $sender_addr using RPC URL: $l2_rpc_url" + return 1 + } + local excessive_value=$(echo "$sender_balance + 1" | bc)"ether" + run send_tx "$l2_rpc_url" "$sender_private_key" "$receiver" "$excessive_value" + assert_failure + + # Check whether the sender's nonce was updated correctly + local final_nonce=$(cast nonce "$sender_addr" --rpc-url "$l2_rpc_url") || { + echo "Failed to retrieve nonce for sender: $sender_addr using RPC URL: $l2_rpc_url" + return 1 + } + assert_equal "$final_nonce" "$(echo "$initial_nonce + 1" | bc)" +} + +@test "Test ERC20Mock contract" { + local contract_artifact="./contracts/erc20mock/ERC20Mock.json" + wallet_A_output=$(cast wallet new) + address_A=$(echo "$wallet_A_output" | grep "Address" | awk '{print $2}') + address_A_private_key=$(echo "$wallet_A_output" | grep "Private key" | awk '{print $3}') + address_B=$(cast wallet new | grep "Address" | awk '{print $2}') + + # Deploy ERC20Mock + run deploy_contract "$l2_rpc_url" "$sender_private_key" "$contract_artifact" + assert_success + contract_addr=$(echo "$output" | tail -n 1) + + # Mint ERC20 tokens + local amount="5" + + run send_tx "$l2_rpc_url" "$sender_private_key" "$contract_addr" "$mint_fn_sig" "$address_A" "$amount" + assert_success + assert_output --regexp "Transaction successful \(transaction hash: 0x[a-fA-F0-9]{64}\)" + + ## Case 2: Insufficient gas scenario => Transactions fails + # nonce would not increase since transaction fails at the node's pre-validation check + # Get bytecode from the contract artifact + local bytecode=$(jq -r .bytecode "$contract_artifact") + if [[ -z "$bytecode" || "$bytecode" == "null" ]]; then + echo "Error: Failed to read bytecode from $contract_artifact" + return 1 + fi + + # Estimate gas, gas price and gas cost + local gas_units=$(cast estimate --rpc-url "$l2_rpc_url" --create "$bytecode") + gas_units=$(echo "scale=0; $gas_units / 2" | bc) + local gas_price=$(cast gas-price --rpc-url "$l2_rpc_url") + local value=$(echo "$gas_units * $gas_price" | bc) + local value_ether=$(cast to-unit "$value" ether)"ether" + + # Transfer only half amount of tokens needed for contract deployment fees + cast_output=$(cast send --rpc-url "$l2_rpc_url" --private-key "$sender_private_key" "$address_A" --value "$value_ether" --legacy 2>&1) + if [[ $? -ne 0 ]]; then + echo "Error: Failed to send transaction. Output:" + echo "$cast_output" + return 1 + fi + + # Fetch initial nonce for address_A + local address_A_initial_nonce=$(cast nonce "$address_A" --rpc-url "$l2_rpc_url") || return 1 + # Attempt to deploy contract with insufficient gas + run deploy_contract "$l2_rpc_url" "$address_A_private_key" "$contract_artifact" + assert_failure + + ## Case 3: Transaction should fail as address_A tries to transfer more tokens than it has + # nonce would not increase + # Transfer funds for gas fees to address_A + value_ether="4ether" + cast_output=$(cast send --rpc-url "$l2_rpc_url" --private-key "$sender_private_key" "$address_A" --value "$value_ether" --legacy 2>&1) + if [[ $? -ne 0 ]]; then + echo "Error: Failed to send transaction. Output:" + echo "$cast_output" + return 1 + fi + + # Fetch balance of address_A to simulate excessive transfer + run query_contract "$l2_rpc_url" "$contract_addr" "$balance_of_fn_sig" "$address_A" + assert_success + local address_A_Balance=$(echo "$output" | tail -n 1) + address_A_Balance=$(echo "$address_A_Balance" | xargs) + + # Set excessive amount for transfer + local excessive_amount=$(echo "$address_A_Balance + 1" | bc) + + # Attempt transfer of excessive amount from address_A to address_B + local tranferFnSig="transfer(address,uint256)" + run send_tx "$l2_rpc_url" "$address_A_private_key" "$contract_addr" "$tranferFnSig" "$address_B" "$excessive_amount" + assert_failure + + # Verify balance of address_A after failed transaction + run query_contract "$l2_rpc_url" "$contract_addr" "$balance_of_fn_sig" "$address_A" + assert_success + address_A_BalanceAfterFailedTx=$(echo "$output" | tail -n 1) + address_A_BalanceAfterFailedTx=$(echo "$address_A_BalanceAfterFailedTx" | xargs) + + # Ensure balance is unchanged + assert_equal "$address_A_BalanceAfterFailedTx" "$address_A_Balance" + + # Verify balance of address_B is still zero + run query_contract "$l2_rpc_url" "$contract_addr" "$balance_of_fn_sig" "$address_B" + assert_success + local address_B_Balance=$(echo "$output" | tail -n 1) + address_B_Balance=$(echo "$address_B_Balance" | xargs) + + assert_equal "$address_B_Balance" "0" + + # Nonce should not increase + local address_A_final_nonce=$(cast nonce "$address_A" --rpc-url "$l2_rpc_url") || { + echo "Failed to retrieve nonce for sender: $address_A using RPC URL: $l2_rpc_url" + return 1 + } + assert_equal "$address_A_final_nonce" "$address_A_initial_nonce" +} + + +@test "Deploy and test UniswapV3 contract" { + # Generate new key pair + wallet_A_output=$(cast wallet new) + address_A=$(echo "$wallet_A_output" | grep "Address" | awk '{print $2}') + address_A_private_key=$(echo "$wallet_A_output" | grep "Private key" | awk '{print $3}') + + # Transfer funds for gas + local value_ether="50ether" + cast_output=$(cast send --rpc-url "$l2_rpc_url" --private-key "$sender_private_key" "$address_A" --value "$value_ether" --legacy 2>&1) + if [[ $? -ne 0 ]]; then + echo "Error: Failed to send transaction. Output:" + echo "$cast_output" + return 1 + fi + + run polycli loadtest uniswapv3 --legacy -v 600 --rpc-url $l2_rpc_url --private-key $address_A_private_key + assert_success + + # Remove ANSI escape codes from the output + output=$(echo "$output" | sed -r "s/\x1B\[[0-9;]*[mGKH]//g") + + # Check if all required Uniswap contracts were deployed + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=WETH9" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=UniswapV3Factory" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=UniswapInterfaceMulticall" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=ProxyAdmin" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=TickLens" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=NFTDescriptor" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=NonfungibleTokenPositionDescriptor" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=TransparentUpgradeableProxy" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=NonfungiblePositionManager" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=V3Migrator" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=UniswapV3Staker" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=QuoterV2" + assert_output --regexp "Contract deployed address=0x[a-fA-F0-9]{40} name=SwapRouter02" + + # Check if ERC20 tokens were minted + assert_output --regexp "Minted tokens amount=[0-9]+ recipient=0x[a-fA-F0-9]{40} token=SwapperA" + assert_output --regexp "Minted tokens amount=[0-9]+ recipient=0x[a-fA-F0-9]{40} token=SwapperB" + + # Check if liquidity pool was created and initialized + assert_output --regexp "Pool created and initialized fees=[0-9]+" + + # Check if liquidity was provided to the pool + assert_output --regexp "Liquidity provided to the pool liquidity=[0-9]+" + + # Check if transaction got executed successfully + assert_output --regexp "Starting main load test loop currentNonce=[0-9]+" + assert_output --regexp "Finished main load test loop lastNonce=[0-9]+ startNonce=[0-9]+" + assert_output --regexp "Got final block number currentNonce=[0-9]+ final block number=[0-9]+" + assert_output --regexp "Num errors numErrors=0" + assert_output --regexp "Finished" +} + diff --git a/test/bats/fep/bridge-e2e.bats b/test/bats/fep/bridge-e2e.bats new file mode 100644 index 00000000..d9203297 --- /dev/null +++ b/test/bats/fep/bridge-e2e.bats @@ -0,0 +1,193 @@ +setup() { + load '../helpers/common-setup' + load '../helpers/common' + load '../helpers/lxly-bridge' + + _common_setup + + if [ -z "$BRIDGE_ADDRESS" ]; then + local combined_json_file="/opt/zkevm/combined.json" + echo "BRIDGE_ADDRESS env variable is not provided, resolving the bridge address from the Kurtosis CDK '$combined_json_file'" >&3 + + # Fetching the combined JSON output and filtering to get polygonZkEVMBridgeAddress + combined_json_output=$($contracts_service_wrapper "cat $combined_json_file" | tail -n +2) + bridge_default_address=$(echo "$combined_json_output" | jq -r .polygonZkEVMBridgeAddress) + BRIDGE_ADDRESS=$bridge_default_address + fi + echo "Bridge address=$BRIDGE_ADDRESS" >&3 + + readonly sender_private_key=${SENDER_PRIVATE_KEY:-"12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625"} + readonly sender_addr="$(cast wallet address --private-key $sender_private_key)" + destination_net=${DESTINATION_NET:-"1"} + destination_addr=${DESTINATION_ADDRESS:-"0x0bb7AA0b4FdC2D2862c088424260e99ed6299148"} + ether_value=${ETHER_VALUE:-"0.0200000054"} + amount=$(cast to-wei $ether_value ether) + readonly native_token_addr=${NATIVE_TOKEN_ADDRESS:-"0x0000000000000000000000000000000000000000"} + if [[ -n "$GAS_TOKEN_ADDR" ]]; then + echo "Using provided GAS_TOKEN_ADDR: $GAS_TOKEN_ADDR" >&3 + gas_token_addr="$GAS_TOKEN_ADDR" + else + echo "GAS_TOKEN_ADDR not provided, retrieving from rollup parameters file." >&3 + readonly rollup_params_file=/opt/zkevm/create_rollup_parameters.json + run bash -c "$contracts_service_wrapper 'cat $rollup_params_file' | tail -n +2 | jq -r '.gasTokenAddress'" + assert_success + assert_output --regexp "0x[a-fA-F0-9]{40}" + gas_token_addr=$output + fi + readonly is_forced=${IS_FORCED:-"true"} + readonly bridge_addr=$BRIDGE_ADDRESS + readonly meta_bytes=${META_BYTES:-"0x"} + + readonly l1_rpc_url=${L1_ETH_RPC_URL:-"$(kurtosis port print $enclave el-1-geth-lighthouse rpc)"} + readonly bridge_api_url=${BRIDGE_API_URL:-"$(kurtosis port print $enclave zkevm-bridge-service-001 rpc)"} + + readonly dry_run=${DRY_RUN:-"false"} + readonly l1_rpc_network_id=$(cast call --rpc-url $l1_rpc_url $bridge_addr 'networkID() (uint32)') + readonly l2_rpc_network_id=$(cast call --rpc-url $l2_rpc_url $bridge_addr 'networkID() (uint32)') + gas_price=$(cast gas-price --rpc-url "$l2_rpc_url") + readonly weth_token_addr=$(cast call --rpc-url $l2_rpc_url $bridge_addr 'WETHToken()' | cast parse-bytes32-address) +} + +# Helper function to run native gas token deposit to WETH +native_gas_token_deposit_to_WETH() { + local bridge_type="$1" + + echo "Bridge_type: $bridge_type" >&3 + + destination_addr=$sender_addr + local initial_receiver_balance=$(cast call --rpc-url "$l2_rpc_url" "$weth_token_addr" "$balance_of_fn_sig" "$destination_addr" | awk '{print $1}') + echo "Initial receiver balance of native token on L2 $initial_receiver_balance" >&3 + + echo "=== Running LxLy deposit $bridge_type on L1 to network: $l2_rpc_network_id native_token: $native_token_addr" >&3 + + destination_net=$l2_rpc_network_id + + if [[ $bridge_type == "bridgeMessage" ]]; then + run bridge_message "$native_token_addr" "$l1_rpc_url" + else + run bridge_asset "$native_token_addr" "$l1_rpc_url" + fi + assert_success + + echo "=== Claiming on L2..." >&3 + timeout="120" + claim_frequency="10" + run wait_for_claim "$timeout" "$claim_frequency" "$l2_rpc_url" "$bridge_type" + assert_success + + run verify_balance "$l2_rpc_url" "$weth_token_addr" "$destination_addr" "$initial_receiver_balance" "$ether_value" + assert_success + + echo "=== $bridge_type L2 WETH: $weth_token_addr to L1 ETH" >&3 + destination_addr=$sender_addr + destination_net=0 + + if [[ $bridge_type == "bridgeMessage" ]]; then + run bridge_message "$weth_token_addr" "$l2_rpc_url" + else + run bridge_asset "$weth_token_addr" "$l2_rpc_url" + fi + assert_success + + echo "=== Claiming on L1..." >&3 + timeout="400" + claim_frequency="60" + run wait_for_claim "$timeout" "$claim_frequency" "$l1_rpc_url" "$bridge_type" + assert_success +} + +@test "Native gas token deposit to WETH - BridgeAsset" { + run native_gas_token_deposit_to_WETH "bridgeAsset" +} + +@test "Native gas token deposit to WETH - BridgeMessage" { + run native_gas_token_deposit_to_WETH "bridgeMessage" +} + +@test "Custom gas token deposit" { + echo "Gas token addr $gas_token_addr, L1 RPC: $l1_rpc_url" >&3 + + # Set receiver address and query for its initial native token balance on the L2 + receiver=${RECEIVER:-"0x85dA99c8a7C2C95964c8EfD687E95E632Fc533D6"} + local initial_receiver_balance=$(cast balance "$receiver" --rpc-url "$l2_rpc_url") + echo "Initial receiver balance of native token on L2 $initial_receiver_balance" >&3 + + local l1_minter_balance=$(cast balance "0x8943545177806ED17B9F23F0a21ee5948eCaa776" --rpc-url "$l1_rpc_url") + echo "Initial minter balance on L1 $l1_minter_balance" >&3 + + # Query for initial sender balance + run query_contract "$l1_rpc_url" "$gas_token_addr" "$balance_of_fn_sig" "$sender_addr" + assert_success + local gas_token_init_sender_balance=$(echo "$output" | tail -n 1 | awk '{print $1}') + echo "Initial sender balance $gas_token_init_sender_balance" of gas token on L1 >&3 + + # Mint gas token on L1 + local tokens_amount="0.1ether" + local wei_amount=$(cast --to-unit $tokens_amount wei) + local minter_key=${MINTER_KEY:-"bcdf20249abf0ed6d944c0288fad489e33f66b3960d9e6229c1cd214ed3bbe31"} + run mint_erc20_tokens "$l1_rpc_url" "$gas_token_addr" "$minter_key" "$sender_addr" "$tokens_amount" + assert_success + + # Assert that balance of gas token (on the L1) is correct + run query_contract "$l1_rpc_url" "$gas_token_addr" "$balance_of_fn_sig" "$sender_addr" + assert_success + local gas_token_final_sender_balance=$(echo "$output" | + tail -n 1 | + awk '{print $1}') + local expected_balance=$(echo "$gas_token_init_sender_balance + $wei_amount" | + bc | + awk '{print $1}') + + echo "Sender balance ($sender_addr) (gas token L1): $gas_token_final_sender_balance" >&3 + assert_equal "$gas_token_final_sender_balance" "$expected_balance" + + # Send approve transaction to the gas token on L1 + deposit_ether_value="0.1ether" + run send_tx "$l1_rpc_url" "$sender_private_key" "$gas_token_addr" "$approve_fn_sig" "$bridge_addr" "$deposit_ether_value" + assert_success + assert_output --regexp "Transaction successful \(transaction hash: 0x[a-fA-F0-9]{64}\)" + + # Deposit + destination_addr=$receiver + destination_net=$l2_rpc_network_id + amount=$wei_amount + run bridge_asset "$gas_token_addr" "$l1_rpc_url" + assert_success + + # Claim deposits (settle them on the L2) + timeout="120" + claim_frequency="10" + run wait_for_claim "$timeout" "$claim_frequency" "$l2_rpc_url" "bridgeAsset" + assert_success + + # Validate that the native token of receiver on L2 has increased by the bridge tokens amount + run verify_balance "$l2_rpc_url" "$native_token_addr" "$receiver" "$initial_receiver_balance" "$tokens_amount" + assert_success +} + +@test "Custom gas token withdrawal" { + echo "Running LxLy withdrawal" >&3 + echo "Gas token addr $gas_token_addr, L1 RPC: $l1_rpc_url" >&3 + + local initial_receiver_balance=$(cast call --rpc-url "$l1_rpc_url" "$gas_token_addr" "$balance_of_fn_sig" "$destination_addr" | awk '{print $1}') + assert_success + echo "Receiver balance of gas token on L1 $initial_receiver_balance" >&3 + + destination_net=$l1_rpc_network_id + run bridge_asset "$native_token_addr" "$l2_rpc_url" + assert_success + + # Claim withdrawals (settle them on the L1) + timeout="360" + claim_frequency="10" + destination_net=$l1_rpc_network_id + run wait_for_claim "$timeout" "$claim_frequency" "$l1_rpc_url" "bridgeAsset" + assert_success + + # Validate that the token of receiver on L1 has increased by the bridge tokens amount + run verify_balance "$l1_rpc_url" "$gas_token_addr" "$destination_addr" "$initial_receiver_balance" "$ether_value" + if [ $status -eq 0 ]; then + break + fi + assert_success +} diff --git a/test/bats/fep/e2e.bats b/test/bats/fep/e2e.bats new file mode 100644 index 00000000..a468e7aa --- /dev/null +++ b/test/bats/fep/e2e.bats @@ -0,0 +1,11 @@ +setup() { + load '../helpers/common-setup' + + _common_setup +} + +@test "Verify batches" { + echo "Waiting 10 minutes to get some verified batch...." + run $PROJECT_ROOT/../scripts/batch_verification_monitor.sh 0 600 + assert_success +} diff --git a/test/bats/helpers/aggsender.bash b/test/bats/helpers/aggsender.bash new file mode 100644 index 00000000..6a7399a9 --- /dev/null +++ b/test/bats/helpers/aggsender.bash @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +function wait_to_settled_certificate_containing_global_index(){ + local _l2_pp1_cdk_node_url=$1 + local _global_index=$2 + local _check_frequency=${3:-30} + local _timeout=${4:-300} + echo "... waiting for certificate with global index $_global_index" >&3 + run_with_timeout "settle cert for $_global_index" $_check_frequency $_timeout $aggsender_find_imported_bridge $_l2_pp1_cdk_node_url $_global_index +} \ No newline at end of file diff --git a/test/bats/helpers/common-multi_cdk-setup.bash b/test/bats/helpers/common-multi_cdk-setup.bash new file mode 100644 index 00000000..2758c9f7 --- /dev/null +++ b/test/bats/helpers/common-multi_cdk-setup.bash @@ -0,0 +1,81 @@ +#!/usr/bin/env bash + +_common_multi_setup() { + load '../helpers/common-setup' + _common_setup + # generated with cast wallet new + readonly target_address=0xbecE3a31343c6019CDE0D5a4dF2AF8Df17ebcB0f + readonly target_private_key=0x51caa196504216b1730280feb63ddd8c5ae194d13e57e58d559f1f1dc3eda7c9 + + kurtosis service exec $enclave contracts-001 "cat /opt/zkevm/combined-001.json" | tail -n +2 | jq '.' > combined-001.json + kurtosis service exec $enclave contracts-002 "cat /opt/zkevm/combined-002.json" | tail -n +2 | jq '.' > combined-002.json + kurtosis service exec $enclave contracts-002 "cat /opt/zkevm-contracts/deployment/v2/create_rollup_parameters.json" | tail -n +2 | jq -r '.gasTokenAddress' > gas-token-address.json + + readonly private_key="0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625" + readonly eth_address=$(cast wallet address --private-key $private_key) + readonly l1_rpc_url=http://$(kurtosis port print $enclave el-1-geth-lighthouse rpc) + readonly l2_pp1_url=$(kurtosis port print $enclave cdk-erigon-rpc-001 rpc) + readonly l2_pp2_url=$(kurtosis port print $enclave cdk-erigon-rpc-002 rpc) + readonly bridge_address=$(cat combined-001.json | jq -r .polygonZkEVMBridgeAddress) + readonly pol_address=$(cat combined-001.json | jq -r .polTokenAddress) + readonly gas_token_address=$(&3 + echo "=== POL address=$pol_address ===" >&3 + echo "=== Gas token address=$gas_token_address ===" >&3 + echo "=== L1 network id=$l1_rpc_network_id ===" >&3 + echo "=== L2 PP1 network id=$l2_pp1b_network_id ===" >&3 + echo "=== L2 PP2 network id=$l2_pp2b_network_id ===" >&3 + echo "=== L1 RPC URL=$l1_rpc_url ===" >&3 + echo "=== L2 PP1 URL=$l2_pp1_url ===" >&3 + echo "=== L2 PP2 URL=$l2_pp2_url ===" >&3 + echo "=== L2 PP1B URL=$l2_pp1b_url ===" >&3 + echo "=== L2 PP2B URL=$l2_pp2b_url ===" >&3 + +} + +add_cdk_network2_to_agglayer(){ + echo "=== Checking if network 2 is in agglayer ===" >&3 + local _prev=$(kurtosis service exec $enclave agglayer "grep \"2 = \" /etc/zkevm/agglayer-config.toml || true" | tail -n +2) + if [ ! -z "$_prev" ]; then + echo "Network 2 already added to agglayer" >&3 + return + fi + echo "=== Adding network 2 to agglayer === ($_prev)" >&3 + kurtosis service exec $enclave agglayer "sed -i 's/\[proof\-signers\]/2 = \"http:\/\/cdk-erigon-rpc-002:8123\"\n\[proof-signers\]/i' /etc/zkevm/agglayer-config.toml" + kurtosis service stop $enclave agglayer + kurtosis service start $enclave agglayer +} + +fund_claim_tx_manager(){ + echo "=== Funding bridge auto-claim ===" >&3 + cast send --legacy --value 100ether --rpc-url $l2_pp1_url --private-key $private_key 0x5f5dB0D4D58310F53713eF4Df80ba6717868A9f8 + cast send --legacy --value 100ether --rpc-url $l2_pp2_url --private-key $private_key 0x93F63c24735f45Cd0266E87353071B64dd86bc05 +} + + +mint_pol_token(){ + echo "=== Minting POL ===" >&3 + cast send \ + --rpc-url $l1_rpc_url \ + --private-key $private_key \ + $pol_address \ + "$mint_fn_sig" \ + $eth_address 10000000000000000000000 + # Allow bridge to spend it + cast send \ + --rpc-url $l1_rpc_url \ + --private-key $private_key \ + $pol_address \ + "$approve_fn_sig" \ + $bridge_address 10000000000000000000000 +} diff --git a/test/bats/helpers/common-setup.bash b/test/bats/helpers/common-setup.bash new file mode 100644 index 00000000..485d2337 --- /dev/null +++ b/test/bats/helpers/common-setup.bash @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +_common_setup() { + bats_load_library 'bats-support' + bats_load_library 'bats-assert' + + # get the containing directory of this file + # use $BATS_TEST_FILENAME instead of ${BASH_SOURCE[0]} or $0, + # as those will point to the bats executable's location or the preprocessed file respectively + PROJECT_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." >/dev/null 2>&1 && pwd)" + # make executables in src/ visible to PATH + PATH="$PROJECT_ROOT/src:$PATH" + + # ERC20 contracts function signatures + readonly mint_fn_sig="function mint(address,uint256)" + readonly balance_of_fn_sig="function balanceOf(address) (uint256)" + readonly approve_fn_sig="function approve(address,uint256)" + + + # Kurtosis enclave and service identifiers + readonly enclave=${KURTOSIS_ENCLAVE:-aggkit} + readonly contracts_container=${KURTOSIS_CONTRACTS:-contracts-001} + readonly contracts_service_wrapper=${KURTOSIS_CONTRACTS_WRAPPER:-"kurtosis service exec $enclave $contracts_container"} + readonly erigon_rpc_node=${KURTOSIS_ERIGON_RPC:-cdk-erigon-rpc-001} + readonly l2_rpc_url=${L2_ETH_RPC_URL:-"$(kurtosis port print $enclave $erigon_rpc_node rpc)"} +} diff --git a/test/bats/helpers/common.bash b/test/bats/helpers/common.bash new file mode 100644 index 00000000..fa56ee0b --- /dev/null +++ b/test/bats/helpers/common.bash @@ -0,0 +1,377 @@ +#!/usr/bin/env bash + +function deploy_contract() { + local rpc_url="$1" + local private_key="$2" + local contract_artifact="$3" + + # Check if rpc_url is available + if [[ -z "$rpc_url" ]]; then + echo "Error: rpc_url parameter is not set." + return 1 + fi + + if [[ ! -f "$contract_artifact" ]]; then + echo "Error: Contract artifact '$contract_artifact' does not exist." + return 1 + fi + + # Get the sender address + local sender=$(cast wallet address "$private_key") + if [[ $? -ne 0 ]]; then + echo "Error: Failed to retrieve sender address." + return 1 + fi + + echo "Attempting to deploy contract artifact '$contract_artifact' to $rpc_url (sender: $sender)" >&3 + + # Get bytecode from the contract artifact + local bytecode=$(jq -r .bytecode "$contract_artifact") + if [[ -z "$bytecode" || "$bytecode" == "null" ]]; then + echo "Error: Failed to read bytecode from $contract_artifact" + return 1 + fi + + # Send the transaction and capture the output + gas_price=$(cast gas-price --rpc-url "$rpc_url") + local comp_gas_price=$(bc -l <<< "$gas_price * 1.5" | sed 's/\..*//') + if [[ $? -ne 0 ]]; then + echo "Failed to calculate gas price" >&3 + exit 1 + fi + local cast_output=$(cast send --rpc-url "$rpc_url" \ + --private-key "$private_key" \ + --gas-price $comp_gas_price \ + --legacy \ + --create "$bytecode" \ + 2>&1) + + # Check if cast send was successful + if [[ $? -ne 0 ]]; then + echo "Error: Failed to send transaction." + echo "$cast_output" + return 1 + fi + + echo "Deploy contract output:" >&3 + echo "$cast_output" >&3 + + # Extract the contract address from the output + local deployed_contract_address=$(echo "$cast_output" | grep 'contractAddress' | sed 's/contractAddress\s\+//') + echo "Deployed contract address: $deployed_contract_address" >&3 + + if [[ -z "$deployed_contract_address" ]]; then + echo "Error: Failed to extract deployed contract address" + echo "$cast_output" + return 1 + fi + + if [[ ! "$deployed_contract_address" =~ ^0x[a-fA-F0-9]{40}$ ]]; then + echo "Error: Invalid contract address $deployed_contract_address" + return 1 + fi + + # Print contract address for return + echo "$deployed_contract_address" + + return 0 +} + +function send_tx() { + # Check if at least 4 arguments are provided + if [[ $# -lt 4 ]]; then + echo "Usage: send_tx [ ...]" + return 1 + fi + + local rpc_url="$1" # RPC URL + local private_key="$2" # Sender private key + local receiver_addr="$3" # Receiver address + local value_or_function_sig="$4" # Value or function signature + + # Error handling: Ensure the receiver is a valid Ethereum address + if [[ ! "$receiver_addr" =~ ^0x[a-fA-F0-9]{40}$ ]]; then + echo "Error: Invalid receiver address '$receiver_addr'." + return 1 + fi + + shift 4 # Shift the first 4 arguments (rpc_url, private_key, receiver_addr, value_or_function_sig) + local params=("$@") # Collect all remaining arguments as function parameters + + # Get sender address from private key + local sender + sender=$(cast wallet address "$private_key") || { + echo "Error: Failed to extract the sender address." + return 1 + } + + # Check if the value_or_function_sig is a numeric value (Ether to be transferred) + if [[ "$value_or_function_sig" =~ ^[0-9]+(\.[0-9]+)?(ether)?$ ]]; then + # Case: Ether transfer (EOA transaction) + # Get initial ether balances of sender and receiver + local sender_addr=$(cast wallet address --private-key "$private_key") + local sender_initial_balance receiver_initial_balance + sender_initial_balance=$(cast balance "$sender_addr" --ether --rpc-url "$rpc_url") || return 1 + receiver_initial_balance=$(cast balance "$receiver_addr" --ether --rpc-url "$rpc_url") || return 1 + + send_eoa_transaction "$private_key" "$receiver_addr" "$value_or_function_sig" "$sender_addr" "$sender_initial_balance" "$receiver_initial_balance" + else + # Case: Smart contract interaction (contract interaction with function signature and parameters) + send_smart_contract_transaction "$private_key" "$receiver_addr" "$value_or_function_sig" "${params[@]}" + fi +} + +function send_eoa_transaction() { + local private_key="$1" + local receiver_addr="$2" + local value="$3" + local sender="$4" + local sender_initial_balance="$5" + local receiver_initial_balance="$6" + + echo "Sending EOA transaction (from: $sender, rpc url: $rpc_url) to: $receiver_addr with value: $value" >&3 + + # Send transaction via cast + local cast_output tx_hash + gas_price=$(cast gas-price --rpc-url "$rpc_url") + local comp_gas_price=$(bc -l <<< "$gas_price * 1.5" | sed 's/\..*//') + if [[ $? -ne 0 ]]; then + echo "Failed to calculate gas price" >&3 + exit 1 + fi + echo "cast send --gas-price $comp_gas_price --rpc-url $rpc_url --private-key $private_key $receiver_addr --value $value --legacy" >&3 + cast_output=$(cast send --gas-price $comp_gas_price --rpc-url "$rpc_url" --private-key "$private_key" "$receiver_addr" --value "$value" --legacy 2>&1) + if [[ $? -ne 0 ]]; then + echo "Error: Failed to send transaction. Output:" + echo "$cast_output" + return 1 + fi + + tx_hash=$(extract_tx_hash "$cast_output") + [[ -z "$tx_hash" ]] && { + echo "Error: Failed to extract transaction hash." + return 1 + } + + check_balances "$sender" "$receiver_addr" "$value" "$tx_hash" "$sender_initial_balance" "$receiver_initial_balance" + if [[ $? -ne 0 ]]; then + echo "Error: Balance not updated correctly." + return 1 + fi + + echo "Transaction successful (transaction hash: $tx_hash)" +} + +function send_smart_contract_transaction() { + local private_key="$1" + local receiver_addr="$2" + local function_sig="$3" + shift 3 + local params=("$@") + + echo "Sending smart contract transaction to $receiver_addr with function signature: '$function_sig' and params: ${params[*]}" >&3 + + # Send the smart contract interaction using cast + local cast_output tx_hash + gas_price=$(cast gas-price --rpc-url "$rpc_url") + local comp_gas_price=$(bc -l <<< "$gas_price * 1.5" | sed 's/\..*//') + if [[ $? -ne 0 ]]; then + echo "Failed to calculate gas price" >&3 + exit 1 + fi + cast_output=$(cast send "$receiver_addr" --rpc-url "$rpc_url" --private-key "$private_key" --gas-price $comp_gas_price --legacy "$function_sig" "${params[@]}" 2>&1) + if [[ $? -ne 0 ]]; then + echo "Error: Failed to send transaction. Output:" + echo "$cast_output" + return 1 + fi + + tx_hash=$(extract_tx_hash "$cast_output") + [[ -z "$tx_hash" ]] && { + echo "Error: Failed to extract transaction hash." + return 1 + } + + echo "Transaction successful (transaction hash: $tx_hash)" +} + +function extract_tx_hash() { + local cast_output="$1" + echo "$cast_output" | grep 'transactionHash' | awk '{print $2}' | tail -n 1 +} + +function query_contract() { + local rpc_url="$1" # RPC URL + local addr="$2" # Contract address + local funcSignature="$3" # Function signature + shift 3 # Shift past the first 3 arguments + local params=("$@") # Collect remaining arguments as parameters array + + echo "Querying state of $addr account (RPC URL: $rpc_url) with function signature: '$funcSignature' and params: ${params[*]}" >&3 + + # Check if rpc url is available + if [[ -z "$rpc_url" ]]; then + echo "Error: rpc_url parameter is not provided." + return 1 + fi + + # Check if the contract address is valid + if [[ ! "$addr" =~ ^0x[a-fA-F0-9]{40}$ ]]; then + echo "Error: Invalid contract address '$addr'." + return 1 + fi + + # Call the contract using `cast call` + local result + result=$(cast call --rpc-url "$rpc_url" "$addr" "$funcSignature" "${params[@]}" 2>&1) + + # Check if the call was successful + if [[ $? -ne 0 ]]; then + echo "Error: Failed to query contract." + echo "$result" + return 1 + fi + + # Return the result (contract query response) + echo "$result" + + return 0 +} + +function check_balances() { + local sender="$1" + local receiver="$2" + local amount="$3" + local tx_hash="$4" + local sender_initial_balance="$5" + local receiver_initial_balance="$6" + + # Ethereum address regex: 0x followed by 40 hexadecimal characters + if [[ ! "$sender" =~ ^0x[a-fA-F0-9]{40}$ ]]; then + echo "Error: Invalid sender address '$sender'." + return 1 + fi + + if [[ ! "$receiver" =~ ^0x[a-fA-F0-9]{40}$ ]]; then + echo "Error: Invalid receiver address '$receiver'." + return 1 + fi + + # Transaction hash regex: 0x followed by 64 hexadecimal characters + if [[ ! "$tx_hash" =~ ^0x[a-fA-F0-9]{64}$ ]]; then + echo "Error: Invalid transaction hash: $tx_hash". + return 1 + fi + + local sender_final_balance=$(cast balance "$sender" --ether --rpc-url "$rpc_url") || return 1 + local tx_output=$(cast tx "$tx_hash" --rpc-url "$rpc_url") + local gas_used=$(tx_output | grep '^gas ' | awk '{print $2}') + local gas_price=$(tx_output | grep '^gasPrice' | awk '{print $2}') + local gas_fee=$(echo "$gas_used * $gas_price" | bc) + local gas_fee_in_ether=$(cast to-unit "$gas_fee" ether) + + local sender_balance_change=$(echo "$sender_initial_balance - $sender_final_balance" | bc) + echo "Sender balance changed by: '$sender_balance_change' wei" + echo "Gas fee paid: '$gas_fee_in_ether' ether" + + local receiver_final_balance=$(cast balance "$receiver" --ether --rpc-url "$rpc_url") || return 1 + local receiver_balance_change=$(echo "$receiver_final_balance - $receiver_initial_balance" | bc) + echo "Receiver balance changed by: '$receiver_balance_change' wei" + + # Trim 'ether' suffix from amount to get the numeric part + local value_in_ether=$(echo "$amount" | sed 's/ether$//') + + if ! echo "$receiver_balance_change == $value_in_ether" | bc -l; then + echo "Error: receiver balance updated incorrectly. Expected: $value_in_ether, Actual: $receiver_balance_change" + return 1 + fi + + # Calculate expected sender balance change + local expected_sender_change=$(echo "$value_in_ether + $gas_fee_in_ether" | bc) + if ! echo "$sender_balance_change == $expected_sender_change" | bc -l; then + echo "Error: sender balance updated incorrectly. Expected: $expected_sender_change, Actual: $sender_balance_change" + return 1 + fi +} + +function verify_balance() { + local rpc_url="$1" # RPC URL + local token_addr="$2" # gas token contract address + local account="$3" # account address + local initial_balance_wei="$4" # initial balance in Wei (decimal) + local ether_amount="$5" # amount to be added (in Ether, decimal) + + # Trim 'ether' from ether_amount if it exists + ether_amount=$(echo "$ether_amount" | sed 's/ether//') + local amount_wei=$(cast --to-wei "$ether_amount") + + # Get final balance in wei (after the operation) + local final_balance_wei + if [[ $token_addr == "0x0000000000000000000000000000000000000000" ]]; then + final_balance_wei=$(cast balance "$account" --rpc-url "$rpc_url" | awk '{print $1}') + else + final_balance_wei=$(cast call --rpc-url "$rpc_url" "$token_addr" "$balance_of_fn_sig" "$destination_addr" | awk '{print $1}') + fi + echo "Final balance of $account in $rpc_url: $final_balance_wei wei" >&3 + + # Calculate expected final balance (initial_balance + amount) + local expected_final_balance_wei=$(echo "$initial_balance_wei + $amount_wei" | bc) + + # Check if final_balance matches the expected final balance + if [ "$(echo "$final_balance_wei == $expected_final_balance_wei" | bc)" -eq 1 ]; then + echo "✅ Balance verification successful: final balance is correct." + else + echo "❌ Balance verification failed: expected $expected_final_balance_wei but got $final_balance_wei." >&3 + exit 1 + fi +} + +function mint_erc20_tokens() { + local rpc_url="$1" # The L1 RPC URL + local erc20_token_addr="$2" # The gas token contract address + local minter_private_key="$3" # The minter private key + local receiver="$4" # The receiver address (for minted tokens) + local tokens_amount="$5" # The amount of tokens to transfer (e.g., "0.1ether") + + # Query the erc20 token balance of the sender + run query_contract "$rpc_url" "$erc20_token_addr" "$balance_of_fn_sig" "$sender_addr" + assert_success + local erc20_token_balance=$(echo "$output" | tail -n 1) + + # Log the account's current gas token balance + echo "Initial account balance: $erc20_token_balance wei" >&3 + + # Convert tokens_amount to Wei for comparison + local wei_amount=$(cast --to-unit "$tokens_amount" wei) + + # Mint the required tokens by sending a transaction + run send_tx "$rpc_url" "$minter_private_key" "$erc20_token_addr" "$mint_fn_sig" "$receiver" "$tokens_amount" + assert_success +} + +function run_with_timeout(){ + local name="$1" + local run_frequency=$2 + local timeout=$3 + shift 3 + local start_time=$(date +%s) + local end_time=$((start_time + timeout)) + while true; do + local current_time=$(date +%s) + if ((current_time > end_time)); then + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Exiting [$name]... Timeout reached!" >&3 + exit 1 + fi + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] ⏳Running [$name] ..." >&3 + echo "executing: $*" + run $* + echo "output: $output" + echo "result: $status" + if [ $status -eq 0 ]; then + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] ✅ successful [$name] " >&3 + break + fi + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] ⏳ Sleep [$name] time: $run_frequency" >&3 + sleep "$run_frequency" + done +} \ No newline at end of file diff --git a/test/bats/helpers/lxly-bridge.bash b/test/bats/helpers/lxly-bridge.bash new file mode 100644 index 00000000..a8180f9d --- /dev/null +++ b/test/bats/helpers/lxly-bridge.bash @@ -0,0 +1,328 @@ +#!/usr/bin/env bash +# Error code reference https://hackmd.io/WwahVBZERJKdfK3BbKxzQQ +function bridge_message() { + local token_addr="$1" + local rpc_url="$2" + local bridge_sig='bridgeMessage(uint32,address,bool,bytes)' + + if [[ $token_addr == "0x0000000000000000000000000000000000000000" ]]; then + echo "The ETH balance for sender "$sender_addr":" >&3 + cast balance -e --rpc-url $rpc_url $sender_addr >&3 + else + echo "The "$token_addr" token balance for sender "$sender_addr":" >&3 + echo "cast call --rpc-url $rpc_url $token_addr \"$balance_of_fn_sig\" $sender_addr" >&3 + balance_wei=$(cast call --rpc-url "$rpc_url" "$token_addr" "$balance_of_fn_sig" "$sender_addr" | awk '{print $1}') + echo "$(cast --from-wei "$balance_wei")" >&3 + fi + + echo "Attempting to deposit $amount [wei] using bridgeMessage to $destination_addr, token $token_addr (sender=$sender_addr, network id=$destination_net, rpc url=$rpc_url)" >&3 + + if [[ $dry_run == "true" ]]; then + cast calldata $bridge_sig $destination_net $destination_addr $amount $token_addr $is_forced $meta_bytes + else + if [[ $token_addr == "0x0000000000000000000000000000000000000000" ]]; then + echo "cast send --legacy --private-key $sender_private_key --value $amount --rpc-url $rpc_url $bridge_addr $bridge_sig $destination_net $destination_addr $is_forced $meta_bytes" + cast send --legacy --private-key $sender_private_key --value $amount --rpc-url $rpc_url $bridge_addr $bridge_sig $destination_net $destination_addr $is_forced $meta_bytes + else + echo "cast send --legacy --private-key $sender_private_key --rpc-url $rpc_url $bridge_addr $bridge_sig $destination_net $destination_addr $is_forced $meta_bytes" + cast send --legacy --private-key $sender_private_key --rpc-url $rpc_url $bridge_addr $bridge_sig $destination_net $destination_addr $is_forced $meta_bytes + fi + fi +} + +# returns: +# - bridge_tx_hash +function bridge_asset() { + local token_addr="$1" + local rpc_url="$2" + local bridge_sig='bridgeAsset(uint32,address,uint256,address,bool,bytes)' + + if [[ $token_addr == "0x0000000000000000000000000000000000000000" ]]; then + echo "...The ETH balance for sender "$sender_addr":" $(cast balance -e --rpc-url $rpc_url $sender_addr) >&3 + else + echo "The "$token_addr" token balance for sender "$sender_addr":" >&3 + echo "cast call --rpc-url $rpc_url $token_addr \"$balance_of_fn_sig\" $sender_addr" + balance_wei=$(cast call --rpc-url "$rpc_url" "$token_addr" "$balance_of_fn_sig" "$sender_addr" | awk '{print $1}') + echo "$(cast --from-wei "$balance_wei")" >&3 + fi + + echo "....Attempting to deposit $amount [wei] using bridgeAsset to $destination_addr, token $token_addr (sender=$sender_addr, network id=$destination_net, rpc url=$rpc_url)" >&3 + + if [[ $dry_run == "true" ]]; then + cast calldata $bridge_sig $destination_net $destination_addr $amount $token_addr $is_forced $meta_bytes + else + local tmp_response_file=$(mktemp) + if [[ $token_addr == "0x0000000000000000000000000000000000000000" ]]; then + echo "cast send --legacy --private-key $sender_private_key --value $amount --rpc-url $rpc_url $bridge_addr $bridge_sig $destination_net $destination_addr $amount $token_addr $is_forced $meta_bytes" + cast send --legacy --private-key $sender_private_key --value $amount --rpc-url $rpc_url $bridge_addr $bridge_sig $destination_net $destination_addr $amount $token_addr $is_forced $meta_bytes > $tmp_response_file + else + echo "cast send --legacy --private-key $sender_private_key --rpc-url $rpc_url $bridge_addr $bridge_sig $destination_net $destination_addr $amount $token_addr $is_forced $meta_bytes" + + cast send --legacy --private-key $sender_private_key --rpc-url $rpc_url $bridge_addr $bridge_sig $destination_net $destination_addr $amount $token_addr $is_forced $meta_bytes > $tmp_response_file + fi + export bridge_tx_hash=$(grep "^transactionHash" $tmp_response_file | cut -f 2- -d ' ' | sed 's/ //g') + echo "bridge_tx_hash=$bridge_tx_hash" + fi +} + +function claim() { + local destination_rpc_url="$1" + local bridge_type="$2" + local claim_sig="claimAsset(bytes32[32],bytes32[32],uint256,bytes32,bytes32,uint32,address,uint32,address,uint256,bytes)" + if [[ $bridge_type == "bridgeMessage" ]]; then + claim_sig="claimMessage(bytes32[32],bytes32[32],uint256,bytes32,bytes32,uint32,address,uint32,address,uint256,bytes)" + fi + + readonly bridge_deposit_file=$(mktemp) + readonly claimable_deposit_file=$(mktemp) + echo "Getting full list of deposits" >&3 + echo " curl -s \"$bridge_api_url/bridges/$destination_addr?limit=100&offset=0\"" >&3 + curl -s "$bridge_api_url/bridges/$destination_addr?limit=100&offset=0" | jq '.' | tee $bridge_deposit_file + + echo "Looking for claimable deposits" >&3 + jq '[.deposits[] | select(.ready_for_claim == true and .claim_tx_hash == "" and .dest_net == '$destination_net')]' $bridge_deposit_file | tee $claimable_deposit_file + readonly claimable_count=$(jq '. | length' $claimable_deposit_file) + echo "Found $claimable_count claimable deposits" >&3 + + if [[ $claimable_count == 0 ]]; then + echo "We have no claimable deposits at this time" >&3 + exit 1 + fi + + echo "We have $claimable_count claimable deposits on network $destination_net. Let's get this party started." >&3 + readonly current_deposit=$(mktemp) + readonly current_proof=$(mktemp) + local gas_price_factor=1 + while read deposit_idx; do + echo "Starting claim for tx index: "$deposit_idx >&3 + echo "Deposit info:" >&3 + jq --arg idx $deposit_idx '.[($idx | tonumber)]' $claimable_deposit_file | tee $current_deposit >&3 + + curr_deposit_cnt=$(jq -r '.deposit_cnt' $current_deposit) + curr_network_id=$(jq -r '.network_id' $current_deposit) + curl -s "$bridge_api_url/merkle-proof?deposit_cnt=$curr_deposit_cnt&net_id=$curr_network_id" | jq '.' | tee $current_proof + + in_merkle_proof="$(jq -r -c '.proof.merkle_proof' $current_proof | tr -d '"')" + in_rollup_merkle_proof="$(jq -r -c '.proof.rollup_merkle_proof' $current_proof | tr -d '"')" + in_global_index=$(jq -r '.global_index' $current_deposit) + in_main_exit_root=$(jq -r '.proof.main_exit_root' $current_proof) + in_rollup_exit_root=$(jq -r '.proof.rollup_exit_root' $current_proof) + in_orig_net=$(jq -r '.orig_net' $current_deposit) + in_orig_addr=$(jq -r '.orig_addr' $current_deposit) + in_dest_net=$(jq -r '.dest_net' $current_deposit) + in_dest_addr=$(jq -r '.dest_addr' $current_deposit) + in_amount=$(jq -r '.amount' $current_deposit) + in_metadata=$(jq -r '.metadata' $current_deposit) + + if [[ $dry_run == "true" ]]; then + cast calldata $claim_sig "$in_merkle_proof" "$in_rollup_merkle_proof" $in_global_index $in_main_exit_root $in_rollup_exit_root $in_orig_net $in_orig_addr $in_dest_net $in_dest_addr $in_amount $in_metadata + else + local comp_gas_price=$(bc -l <<< "$gas_price * 1.5" | sed 's/\..*//') + if [[ $? -ne 0 ]]; then + echo "Failed to calculate gas price" >&3 + exit 1 + fi + + echo "cast send --legacy --gas-price $comp_gas_price --rpc-url $destination_rpc_url --private-key $sender_private_key $bridge_addr \"$claim_sig\" \"$in_merkle_proof\" \"$in_rollup_merkle_proof\" $in_global_index $in_main_exit_root $in_rollup_exit_root $in_orig_net $in_orig_addr $in_dest_net $in_dest_addr $in_amount $in_metadata" >&3 + cast send --legacy --gas-price $comp_gas_price --rpc-url $destination_rpc_url --private-key $sender_private_key $bridge_addr "$claim_sig" "$in_merkle_proof" "$in_rollup_merkle_proof" $in_global_index $in_main_exit_root $in_rollup_exit_root $in_orig_net $in_orig_addr $in_dest_net $in_dest_addr $in_amount $in_metadata + fi + + done < <(seq 0 $((claimable_count - 1))) +} + +# This function is used to claim a concrete tx hash +# global vars: +# - destination_addr +# export: +# - global_index + +function claim_tx_hash() { + local timeout="$1" + tx_hash="$2" + local destination_addr="$3" + local destination_rpc_url="$4" + local bridge_merkle_proof_url="$5" + + readonly bridge_deposit_file=$(mktemp) + local ready_for_claim="false" + local start_time=$(date +%s) + local current_time=$(date +%s) + local end_time=$((current_time + timeout)) + while true; do + current_time=$(date +%s) + elpased_time=$((current_time - start_time)) + if ((current_time > end_time)); then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Exiting... Timeout reached waiting for tx_hash [$tx_hash] timeout: $timeout! (elapsed: $elpased_time)" + echo " $current_time > $end_time" >&3 + exit 1 + fi + curl -s "$bridge_merkle_proof_url/bridges/$destination_addr?limit=100&offset=0" | jq "[.deposits[] | select(.tx_hash == \"$tx_hash\" )]" > $bridge_deposit_file + deposit_count=$(jq '. | length' $bridge_deposit_file) + if [[ $deposit_count == 0 ]]; then + echo "...[$(date '+%Y-%m-%d %H:%M:%S')] ❌ the tx_hash [$tx_hash] not found (elapsed: $elpased_time / timeout:$timeout)" >&3 + sleep "$claim_frequency" + continue + fi + local ready_for_claim=$(jq '.[0].ready_for_claim' $bridge_deposit_file) + if [ $ready_for_claim != "true" ]; then + echo ".... [$(date '+%Y-%m-%d %H:%M:%S')] ⏳ the tx_hash $tx_hash is not ready for claim yet (elapsed: $elpased_time / timeout:$timeout)" >&3 + sleep "$claim_frequency" + continue + else + break + fi + done + # Deposit is ready for claim + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] 🎉 the tx_hash $tx_hash is ready for claim! (elapsed: $elpased_time)" >&3 + local curr_claim_tx_hash=$(jq '.[0].claim_tx_hash' $bridge_deposit_file) + if [ $curr_claim_tx_hash != "\"\"" ]; then + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] 🎉 the tx_hash $tx_hash is already claimed" >&3 + exit 0 + fi + local curr_deposit_cnt=$(jq '.[0].deposit_cnt' $bridge_deposit_file) + local curr_network_id=$(jq '.[0].network_id' $bridge_deposit_file) + readonly current_deposit=$(mktemp) + jq '.[(0|tonumber)]' $bridge_deposit_file | tee $current_deposit + readonly current_proof=$(mktemp) + echo ".... requesting merkel proof for $tx_hash deposit_cnt=$curr_deposit_cnt network_id: $curr_network_id" >&3 + request_merkle_proof "$curr_deposit_cnt" "$curr_network_id" "$bridge_merkle_proof_url" "$current_proof" + echo "FILE current_deposit=$current_deposit" + echo "FILE bridge_deposit_file=$bridge_deposit_file" + echo "FILE current_proof=$current_proof" + + while true; do + echo ".... requesting claim for $tx_hash" >&3 + run request_claim $current_deposit $current_proof $destination_rpc_url + request_result=$status + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] 🎉 request_claim returns $request_result" >&3 + if [ $request_result -eq 0 ]; then + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] 🎉 claim successful" >&3 + break + fi + if [ $request_result -eq 2 ]; then + # GlobalExitRootInvalid() let's retry + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] ❌ claim failed, let's retry" >&3 + current_time=$(date +%s) + elpased_time=$((current_time - start_time)) + if ((current_time > end_time)); then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Exiting... Timeout reached waiting for tx_hash [$tx_hash] timeout: $timeout! (elapsed: $elpased_time)" + echo " $current_time > $end_time" >&3 + exit 1 + fi + sleep $claim_frequency + continue + fi + if [ $request_result -ne 0 ]; then + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] ✅ claim successful tx_hash [$tx_hash]" >&3 + exit 1 + fi + done + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] claimed" >&3 + export global_index=$(jq '.global_index' $current_deposit | sed -e 's/\x1b\[[0-9;]*m//g' | tr -d '"') + # clean up temp files + rm $current_deposit + rm $current_proof + rm $bridge_deposit_file + +} +function request_merkle_proof(){ + local curr_deposit_cnt="$1" + local curr_network_id="$2" + local bridge_merkle_proof_url="$3" + local result_proof_file="$4" + curl -s "$bridge_merkle_proof_url/merkle-proof?deposit_cnt=$curr_deposit_cnt&net_id=$curr_network_id" | jq '.' > $result_proof_file + echo "request_merkle_proof: $result_proof_file" +} + +# This function is used to claim a concrete tx hash +# global vars: +# -dry_run +# -gas_price +# -sender_private_key +# -bridge_addr +function request_claim(){ + local deposit_file="$1" + local proof_file="$2" + local destination_rpc_url="$3" + + local leaf_type=$(jq -r '.leaf_type' $deposit_file) + local claim_sig="claimAsset(bytes32[32],bytes32[32],uint256,bytes32,bytes32,uint32,address,uint32,address,uint256,bytes)" + + if [[ $leaf_type != "0" ]]; then + claim_sig="claimMessage(bytes32[32],bytes32[32],uint256,bytes32,bytes32,uint32,address,uint32,address,uint256,bytes)" + fi + + local in_merkle_proof="$(jq -r -c '.proof.merkle_proof' $proof_file | tr -d '"')" + local in_rollup_merkle_proof="$(jq -r -c '.proof.rollup_merkle_proof' $proof_file | tr -d '"')" + local in_global_index=$(jq -r '.global_index' $deposit_file) + local in_main_exit_root=$(jq -r '.proof.main_exit_root' $proof_file) + local in_rollup_exit_root=$(jq -r '.proof.rollup_exit_root' $proof_file) + local in_orig_net=$(jq -r '.orig_net' $deposit_file) + local in_orig_addr=$(jq -r '.orig_addr' $deposit_file) + local in_dest_net=$(jq -r '.dest_net' $deposit_file) + local in_dest_addr=$(jq -r '.dest_addr' $deposit_file) + local in_amount=$(jq -r '.amount' $deposit_file) + local in_metadata=$(jq -r '.metadata' $deposit_file) + if [[ $dry_run == "true" ]]; then + echo "... Not real cleaim (dry_run mode)" >&3 + cast calldata $claim_sig "$in_merkle_proof" "$in_rollup_merkle_proof" $in_global_index $in_main_exit_root $in_rollup_exit_root $in_orig_net $in_orig_addr $in_dest_net $in_dest_addr $in_amount $in_metadata + else + local comp_gas_price=$(bc -l <<< "$gas_price * 1.5" | sed 's/\..*//') + if [[ $? -ne 0 ]]; then + echo "Failed to calculate gas price" >&3 + exit 1 + fi + echo "... Claiming deposit: global_index: $in_global_index orig_net: $in_orig_net dest_net: $in_dest_net amount:$in_amount" >&3 + echo "claim: mainnetExitRoot=$in_main_exit_root rollupExitRoot=$in_rollup_exit_root" + echo "cast send --legacy --gas-price $comp_gas_price --rpc-url $destination_rpc_url --private-key $sender_private_key $bridge_addr \"$claim_sig\" \"$in_merkle_proof\" \"$in_rollup_merkle_proof\" $in_global_index $in_main_exit_root $in_rollup_exit_root $in_orig_net $in_orig_addr $in_dest_net $in_dest_addr $in_amount $in_metadata" + local tmp_response=$(mktemp) + cast send --legacy --gas-price $comp_gas_price \ + --rpc-url $destination_rpc_url \ + --private-key $sender_private_key \ + $bridge_addr "$claim_sig" "$in_merkle_proof" "$in_rollup_merkle_proof" $in_global_index $in_main_exit_root $in_rollup_exit_root $in_orig_net $in_orig_addr $in_dest_net $in_dest_addr $in_amount $in_metadata 2> $tmp_response || check_claim_revert_code $tmp_response + fi +} + +function check_claim_revert_code(){ + local file_curl_reponse="$1" + # 0x646cf558 -> AlreadyClaimed() + echo "check revert " + cat $file_curl_reponse + cat $file_curl_reponse | grep "0x646cf558" > /dev/null + if [ $? -eq 0 ]; then + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] 🎉 deposit is already claimed (revert code 0x646cf558)" >&3 + return 0 + fi + cat $file_curl_reponse | grep "0x002f6fad" > /dev/null + if [ $? -eq 0 ]; then + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] 🎉 GlobalExitRootInvalid()(revert code 0x002f6fad)" >&3 + return 2 + fi + echo "....[$(date '+%Y-%m-%d %H:%M:%S')] ❌ claim failed" >&3 + cat $file_curl_reponse >&3 + return 1 +} + +function wait_for_claim() { + local timeout="$1" # timeout (in seconds) + local claim_frequency="$2" # claim frequency (in seconds) + local destination_rpc_url="$3" # destination rpc url + local bridge_type="$4" # bridgeAsset or bridgeMessage + local start_time=$(date +%s) + local end_time=$((start_time + timeout)) + + while true; do + local current_time=$(date +%s) + if ((current_time > end_time)); then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Exiting... Timeout reached!" + exit 1 + fi + + run claim $destination_rpc_url $bridge_type + if [ $status -eq 0 ]; then + break + fi + + sleep "$claim_frequency" + done +} diff --git a/test/bats/pp-multi/bridge-l2_to_l2-e2e.bats b/test/bats/pp-multi/bridge-l2_to_l2-e2e.bats new file mode 100644 index 00000000..a9a904b6 --- /dev/null +++ b/test/bats/pp-multi/bridge-l2_to_l2-e2e.bats @@ -0,0 +1,82 @@ +# based on: https://github.com/0xPolygon/kurtosis-cdk/blob/jhilliard/multi-pp-testing/multi-pp-test.sh.md + +setup() { + load '../helpers/common-multi_cdk-setup' + _common_multi_setup + load '../helpers/common' + load '../helpers/lxly-bridge' + load '../helpers/aggsender' + + if [ ! -f $aggsender_find_imported_bridge ]; then + echo "missing required tool: $aggsender_find_imported_bridge" >&3 + return 1 + fi + + add_cdk_network2_to_agglayer + fund_claim_tx_manager + mint_pol_token + + ether_value=${ETHER_VALUE:-"0.0200000054"} + amount=$(cast to-wei $ether_value ether) + native_token_addr="0x0000000000000000000000000000000000000000" + readonly sender_private_key=${SENDER_PRIVATE_KEY:-"12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625"} + readonly sender_addr="$(cast wallet address --private-key $sender_private_key)" + # Params for lxly-bridge functions + is_forced=${IS_FORCED:-"true"} + bridge_addr=$bridge_address + meta_bytes=${META_BYTES:-"0x1234"} + destination_addr=$target_address + timeout="600" + claim_frequency="30" + + gas_price=$(cast gas-price --rpc-url "$l2_rpc_url") +} + +@test "Test L2 to L2 bridge" { + echo "=== Running LxLy bridge eth L1 to L2(PP1) amount:$amount" >&3 + destination_net=$l2_pp1b_network_id + bridge_asset "$native_token_addr" "$l1_rpc_url" + bridge_tx_hash_pp1=$bridge_tx_hash + + echo "=== Running LxLy bridge eth L1 to L2(PP2) amount:$amount" >&3 + destination_net=$l2_pp2b_network_id + bridge_asset "$native_token_addr" "$l1_rpc_url" + bridge_tx_hash_pp2=$bridge_tx_hash + + echo "=== Running LxLy claim L1 to L2(PP1) for $bridge_tx_hash_pp1" >&3 + run claim_tx_hash "$timeout" "$bridge_tx_hash_pp1" "$destination_addr" "$l2_pp1_url" "$l2_pp1b_url" + assert_success + + echo "=== Running LxLy claim L1 to L2(PP2) for $bridge_tx_hash_pp2" >&3 + run claim_tx_hash "$timeout" "$bridge_tx_hash_pp2" "$destination_addr" "$l2_pp2_url" "$l2_pp2b_url" + assert_success + + + # reduce eth amount + amount=1234567 + echo "=== Running LxLy bridge L2(PP2) to L2(PP1) amount:$amount" >&3 + destination_net=$l2_pp1b_network_id + meta_bytes="0xbeef" + bridge_asset "$native_token_addr" "$l2_pp2_url" + + echo "=== Running LxLy claim L2(PP2) to L2(PP1) for: $bridge_tx_hash" >&3 + claim_tx_hash "$timeout" "$bridge_tx_hash" "$destination_addr" "$l2_pp1_url" "$l2_pp2b_url" + echo "... deposit [$global_index]" + global_index_pp2_to_pp1="$global_index" + + # Now we need to do a bridge on L2(PP1) to trigger a certificate: + ether_value=${ETHER_VALUE:-"0.0100000054"} + amount=$(cast to-wei $ether_value ether) + echo "=== Running LxLy bridge eth L2(PP1) to L1 (trigger a certificate on PP1) amount:$amount" >&3 + destination_net=$l1_rpc_network_id + meta_bytes="0xabcd" + bridge_asset "$native_token_addr" "$l2_pp1_url" + + echo "=== Running LxLy claim L2(PP1) to L1 for $bridge_tx_hash" >&3 + run claim_tx_hash "$timeout" "$bridge_tx_hash" "$destination_addr" "$l1_rpc_url" "$l2_pp1b_url" + assert_success + + echo "=== Waiting to settled certificate with imported bridge for global_index: $global_index_pp2_to_pp1" + wait_to_settled_certificate_containing_global_index $l2_pp1_cdk_node_url $global_index_pp2_to_pp1 + +} diff --git a/test/bats/pp/bridge-e2e-msg.bats b/test/bats/pp/bridge-e2e-msg.bats new file mode 100644 index 00000000..b5525915 --- /dev/null +++ b/test/bats/pp/bridge-e2e-msg.bats @@ -0,0 +1,68 @@ +setup() { + load '../../helpers/common-setup' + _common_setup + load '../../helpers/common' + load '../../helpers/lxly-bridge-test' + + if [ -z "$BRIDGE_ADDRESS" ]; then + local combined_json_file="/opt/zkevm/combined.json" + echo "BRIDGE_ADDRESS env variable is not provided, resolving the bridge address from the Kurtosis CDK '$combined_json_file'" >&3 + + # Fetching the combined JSON output and filtering to get polygonZkEVMBridgeAddress + combined_json_output=$($contracts_service_wrapper "cat $combined_json_file" | tail -n +2) + bridge_default_address=$(echo "$combined_json_output" | jq -r .polygonZkEVMBridgeAddress) + BRIDGE_ADDRESS=$bridge_default_address + fi + echo "Bridge address=$BRIDGE_ADDRESS" >&3 + + readonly sender_private_key=${SENDER_PRIVATE_KEY:-"12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625"} + readonly sender_addr="$(cast wallet address --private-key $sender_private_key)" + destination_net=${DESTINATION_NET:-"1"} + destination_addr=${DESTINATION_ADDRESS:-"0x0bb7AA0b4FdC2D2862c088424260e99ed6299148"} + ether_value=${ETHER_VALUE:-"0.0200000054"} + amount=$(cast to-wei $ether_value ether) + readonly native_token_addr=${NATIVE_TOKEN_ADDRESS:-"0x0000000000000000000000000000000000000000"} + if [[ -n "$GAS_TOKEN_ADDR" ]]; then + echo "Using provided GAS_TOKEN_ADDR: $GAS_TOKEN_ADDR" >&3 + gas_token_addr="$GAS_TOKEN_ADDR" + else + echo "GAS_TOKEN_ADDR not provided, retrieving from rollup parameters file." >&3 + readonly rollup_params_file=/opt/zkevm/create_rollup_parameters.json + run bash -c "$contracts_service_wrapper 'cat $rollup_params_file' | tail -n +2 | jq -r '.gasTokenAddress'" + assert_success + assert_output --regexp "0x[a-fA-F0-9]{40}" + gas_token_addr=$output + fi + readonly is_forced=${IS_FORCED:-"true"} + readonly bridge_addr=$BRIDGE_ADDRESS + readonly meta_bytes=${META_BYTES:-"0x1234"} + + readonly l1_rpc_url=${L1_ETH_RPC_URL:-"$(kurtosis port print $enclave el-1-geth-lighthouse rpc)"} + readonly bridge_api_url=${BRIDGE_API_URL:-"$(kurtosis port print $enclave zkevm-bridge-service-001 rpc)"} + + readonly dry_run=${DRY_RUN:-"false"} + readonly l1_rpc_network_id=$(cast call --rpc-url $l1_rpc_url $bridge_addr 'networkID() (uint32)') + readonly l2_rpc_network_id=$(cast call --rpc-url $l2_rpc_url $bridge_addr 'networkID() (uint32)') + gas_price=$(cast gas-price --rpc-url "$l2_rpc_url") + readonly weth_token_addr=$(cast call --rpc-url $l2_rpc_url $bridge_addr 'WETHToken()' | cast parse-bytes32-address) +} + + +@test "transfer message" { + echo "====== bridgeMessage L1 -> L2" >&3 + destination_addr=$sender_addr + destination_net=$l2_rpc_network_id + run bridge_message "$native_token_addr" "$l1_rpc_url" + assert_success + + echo "====== Claim in L2" >&3 + timeout="120" + claim_frequency="10" + run wait_for_claim "$timeout" "$claim_frequency" "$l2_rpc_url" "bridgeMessage" + assert_success + + echo "====== bridgeMessage L2->L1" >&3 + destination_net=0 + run bridge_message "$destination_addr" "$l2_rpc_url" + assert_success +} \ No newline at end of file diff --git a/test/bats/pp/bridge-e2e.bats b/test/bats/pp/bridge-e2e.bats new file mode 100644 index 00000000..1f358315 --- /dev/null +++ b/test/bats/pp/bridge-e2e.bats @@ -0,0 +1,73 @@ +setup() { + load '../helpers/common-setup' + load '../helpers/common' + load '../helpers/lxly-bridge' + + _common_setup + + if [ -z "$BRIDGE_ADDRESS" ]; then + local combined_json_file="/opt/zkevm/combined.json" + echo "BRIDGE_ADDRESS env variable is not provided, resolving the bridge address from the Kurtosis CDK '$combined_json_file'" >&3 + + # Fetching the combined JSON output and filtering to get polygonZkEVMBridgeAddress + combined_json_output=$($contracts_service_wrapper "cat $combined_json_file" | tail -n +2) + bridge_default_address=$(echo "$combined_json_output" | jq -r .polygonZkEVMBridgeAddress) + BRIDGE_ADDRESS=$bridge_default_address + fi + echo "Bridge address=$BRIDGE_ADDRESS" >&3 + + readonly sender_private_key=${SENDER_PRIVATE_KEY:-"12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625"} + readonly sender_addr="$(cast wallet address --private-key $sender_private_key)" + destination_net=${DESTINATION_NET:-"1"} + destination_addr=${DESTINATION_ADDRESS:-"0x0bb7AA0b4FdC2D2862c088424260e99ed6299148"} + ether_value=${ETHER_VALUE:-"0.0200000054"} + amount=$(cast to-wei $ether_value ether) + readonly native_token_addr=${NATIVE_TOKEN_ADDRESS:-"0x0000000000000000000000000000000000000000"} + if [[ -n "$GAS_TOKEN_ADDR" ]]; then + echo "Using provided GAS_TOKEN_ADDR: $GAS_TOKEN_ADDR" >&3 + gas_token_addr="$GAS_TOKEN_ADDR" + else + echo "GAS_TOKEN_ADDR not provided, retrieving from rollup parameters file." >&3 + readonly rollup_params_file=/opt/zkevm/create_rollup_parameters.json + run bash -c "$contracts_service_wrapper 'cat $rollup_params_file' | tail -n +2 | jq -r '.gasTokenAddress'" + assert_success + assert_output --regexp "0x[a-fA-F0-9]{40}" + gas_token_addr=$output + fi + readonly is_forced=${IS_FORCED:-"true"} + readonly bridge_addr=$BRIDGE_ADDRESS + readonly meta_bytes=${META_BYTES:-"0x1234"} + + readonly l1_rpc_url=${L1_ETH_RPC_URL:-"$(kurtosis port print $enclave el-1-geth-lighthouse rpc)"} + readonly bridge_api_url=${BRIDGE_API_URL:-"$(kurtosis port print $enclave zkevm-bridge-service-001 rpc)"} + + readonly dry_run=${DRY_RUN:-"false"} + readonly l1_rpc_network_id=$(cast call --rpc-url $l1_rpc_url $bridge_addr 'networkID() (uint32)') + readonly l2_rpc_network_id=$(cast call --rpc-url $l2_rpc_url $bridge_addr 'networkID() (uint32)') + gas_price=$(cast gas-price --rpc-url "$l2_rpc_url") + readonly weth_token_addr=$(cast call --rpc-url $l2_rpc_url $bridge_addr 'WETHToken()' | cast parse-bytes32-address) +} + +@test "Native gas token deposit to WETH" { + destination_addr=$sender_addr + local initial_receiver_balance=$(cast call --rpc-url "$l2_rpc_url" "$weth_token_addr" "$balance_of_fn_sig" "$destination_addr" | awk '{print $1}') + echo "Initial receiver balance of native token on L2 $initial_receiver_balance" >&3 + + echo "=== Running LxLy deposit on L1 to network: $l2_rpc_network_id native_token: $native_token_addr" >&3 + + destination_net=$l2_rpc_network_id + run bridge_asset "$native_token_addr" "$l1_rpc_url" + assert_success + + echo "=== Running LxLy claim on L2" >&3 + timeout="120" + claim_frequency="10" + run wait_for_claim "$timeout" "$claim_frequency" "$l2_rpc_url" + assert_success + + echo "=== bridgeAsset L2 WETH: $weth_token_addr to L1 ETH" >&3 + destination_addr=$sender_addr + destination_net=0 + run bridge_asset "$weth_token_addr" "$l2_rpc_url" + assert_success +} diff --git a/test/bats/pp/e2e-pp.bats b/test/bats/pp/e2e-pp.bats new file mode 100644 index 00000000..4ef831e7 --- /dev/null +++ b/test/bats/pp/e2e-pp.bats @@ -0,0 +1,26 @@ +setup() { + load '../helpers/common-setup' + + _common_setup + + if [ -z "$BRIDGE_ADDRESS" ]; then + local combined_json_file="/opt/zkevm/combined.json" + echo "BRIDGE_ADDRESS env variable is not provided, resolving the bridge address from the Kurtosis CDK '$combined_json_file'" >&3 + + # Fetching the combined JSON output and filtering to get polygonZkEVMBridgeAddress + combined_json_output=$($contracts_service_wrapper "cat $combined_json_file" | tail -n +2) + bridge_default_address=$(echo "$combined_json_output" | jq -r .polygonZkEVMBridgeAddress) + BRIDGE_ADDRESS=$bridge_default_address + fi + echo "Bridge address=$BRIDGE_ADDRESS" >&3 +} + +@test "Verify certificate settlement" { + echo "Waiting 10 minutes to get some settle certificate...." >&3 + + readonly bridge_addr=$BRIDGE_ADDRESS + readonly l2_rpc_network_id=$(cast call --rpc-url $l2_rpc_url $bridge_addr 'networkID() (uint32)') + + run $PROJECT_ROOT/../scripts/agglayer_certificates_monitor.sh 1 600 $l2_rpc_network_id + assert_success +} diff --git a/test/combinations/fork11-rollup.yml b/test/combinations/fork11-rollup.yml new file mode 100644 index 00000000..a1fd027e --- /dev/null +++ b/test/combinations/fork11-rollup.yml @@ -0,0 +1,9 @@ +args: + zkevm_contracts_image: leovct/zkevm-contracts:v7.0.0-rc.2-fork.11-patch.1 + zkevm_prover_image: hermeznetwork/zkevm-prover:v7.0.2-fork.11 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 + zkevm_node_image: hermeznetwork/zkevm-node:v0.7.0-fork11-RC1 + cdk_node_image: aggkit:latest + gas_token_enabled: true + data_availability_mode: rollup + sequencer_type: erigon diff --git a/test/combinations/fork12-cdk-validium.yml b/test/combinations/fork12-cdk-validium.yml new file mode 100644 index 00000000..7982192e --- /dev/null +++ b/test/combinations/fork12-cdk-validium.yml @@ -0,0 +1,8 @@ +args: + zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-rc.4-fork.12-patch.1 + zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC12-fork.12 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 + cdk_node_image: aggkit:latest + gas_token_enabled: true + data_availability_mode: cdk-validium + sequencer_type: erigon diff --git a/test/combinations/fork12-pessimistic-multi-attach-second-cdk.yml b/test/combinations/fork12-pessimistic-multi-attach-second-cdk.yml new file mode 100644 index 00000000..3bb16646 --- /dev/null +++ b/test/combinations/fork12-pessimistic-multi-attach-second-cdk.yml @@ -0,0 +1,40 @@ +deployment_stages: + deploy_l1: false + deploy_agglayer: false + +args: + deployment_suffix: "-002" + zkevm_rollup_chain_id: 20202 + zkevm_rollup_id: 2 + + # The following accounts have been generated using the following command: + # polycli wallet inspect --mnemonic 'bless share truly shadow primary sun relief border van gallery stairs edit reflect gentle athlete main device smile response rescue mirror floor say people' --addresses 9 | tee keys.txt | jq -r '.Addresses[] | [.ETHAddress, .HexPrivateKey] | @tsv' | awk 'BEGIN{split("sequencer,aggregator,claimtxmanager,timelock,admin,loadtest,agglayer,dac,proofsigner",roles,",")} {print "zkevm_l2_" roles[NR] "_address: \"" $1 "\""; print "zkevm_l2_" roles[NR] "_private_key: \"0x" $2 "\"\n"}' + # Note that admin and agglayer accounts have been removed since we're using the default accounts. + zkevm_l2_sequencer_address: "0xA670342930242407b9984e467353044f8472055e" + zkevm_l2_sequencer_private_key: "0x902ed4ce26b536617a4f26da5e0cd0ef61b514a076b4bd766d6ab8b97efbb8c1" + zkevm_l2_aggregator_address: "0xfC419a9d9Fe0DfA4Cf9971AcD1Fbcd356DD768FD" + zkevm_l2_aggregator_private_key: "0xa70db9fb4b84a6ba18c03cd2266116dd110538d6c4c88e67ca35a29b910da25d" + zkevm_l2_claimtxmanager_address: "0x93F63c24735f45Cd0266E87353071B64dd86bc05" + zkevm_l2_claimtxmanager_private_key: "0x38718f22097afba13be48d818964326c9c5c48133f51e3c3bfd6faf05f813b34" + zkevm_l2_timelock_address: "0xDB22C6f61A82d6AA6d3607289fC93774AC09413a" + zkevm_l2_timelock_private_key: "0xae4a69010583a09709baa563fa66f9e6f2dacf9e9c84b89932406b9a0521b561" + zkevm_l2_loadtest_address: "0xD5278fC3Dc72A226d5C04c3d2C85fd397A46fA08" + zkevm_l2_loadtest_private_key: "0xef4db4f97684b8307adc332ed6c1bc82d66d160f08e7427d082d66a23889625e" + zkevm_l2_dac_address: "0xDa07AAD7226B136bc24157Dc4Ff5A813490E20D0" + zkevm_l2_dac_private_key: "0x992c9ab11d5eab6b6c2634b8bb0b85f3d8d1acf25024dc99c359cb2afd9b40a7" + zkevm_l2_proofsigner_address: "0xf1a661D7b601Ec46a040f57193cC99aB8c4132FA" + zkevm_l2_proofsigner_private_key: "0xc7fe3a006d75ba9326d9792523385abb49057c66aee0b8b4248821a89713f975" + + + cdk_node_image: aggkit:latest + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.60.0 + zkevm_contracts_image: leovct/zkevm-contracts:v9.0.0-rc.3-pp-fork.12-patch.1 + additional_services: [] + consensus_contract_type: pessimistic + sequencer_type: erigon + erigon_strict_mode: false + gas_token_enabled: false + zkevm_use_real_verifier: true + enable_normalcy: true + verifier_program_vkey: 0x00766aa16a6efe4ac05c0fe21d4b50f9631dbd1a2663a982da861427085ea2ea + diff --git a/test/combinations/fork12-pessimistic-multi.yml b/test/combinations/fork12-pessimistic-multi.yml new file mode 100644 index 00000000..d8ffead6 --- /dev/null +++ b/test/combinations/fork12-pessimistic-multi.yml @@ -0,0 +1,15 @@ +args: + cdk_node_image: aggkit:latest + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.20 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.60.0 + zkevm_contracts_image: leovct/zkevm-contracts:v9.0.0-rc.3-pp-fork.12-patch.1 + additional_services: [] + consensus_contract_type: pessimistic + sequencer_type: erigon + erigon_strict_mode: false + gas_token_enabled: false + zkevm_use_real_verifier: true + enable_normalcy: true + verifier_program_vkey: 0x00766aa16a6efe4ac05c0fe21d4b50f9631dbd1a2663a982da861427085ea2ea + agglayer_prover_sp1_key: {{.agglayer_prover_sp1_key}} + diff --git a/test/combinations/fork12-pessimistic.yml b/test/combinations/fork12-pessimistic.yml new file mode 100644 index 00000000..f4b17eb4 --- /dev/null +++ b/test/combinations/fork12-pessimistic.yml @@ -0,0 +1,15 @@ +args: + agglayer_image: ghcr.io/agglayer/agglayer:0.2.0-rc.20 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.60.0-beta8 + cdk_node_image: aggkit:latest + zkevm_bridge_proxy_image: haproxy:3.0-bookworm + zkevm_bridge_service_image: hermeznetwork/zkevm-bridge-service:v0.6.0-RC1 + zkevm_bridge_ui_image: leovct/zkevm-bridge-ui:multi-network + zkevm_contracts_image: leovct/zkevm-contracts:v9.0.0-rc.3-pp-fork.12-patch.1 + additional_services: [] + consensus_contract_type: pessimistic + sequencer_type: erigon + erigon_strict_mode: false + gas_token_enabled: true + agglayer_prover_sp1_key: {{.agglayer_prover_sp1_key}} + enable_normalcy: true diff --git a/test/combinations/fork12-rollup.yml b/test/combinations/fork12-rollup.yml new file mode 100644 index 00000000..a16f0311 --- /dev/null +++ b/test/combinations/fork12-rollup.yml @@ -0,0 +1,8 @@ +args: + zkevm_contracts_image: leovct/zkevm-contracts:v8.0.0-rc.4-fork.12-patch.1 + zkevm_prover_image: hermeznetwork/zkevm-prover:v8.0.0-RC12-fork.12 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 + cdk_node_image: aggkit:latest + gas_token_enabled: true + data_availability_mode: rollup + sequencer_type: erigon diff --git a/test/combinations/fork9-cdk-validium.yml b/test/combinations/fork9-cdk-validium.yml new file mode 100644 index 00000000..dda3d6ed --- /dev/null +++ b/test/combinations/fork9-cdk-validium.yml @@ -0,0 +1,12 @@ +args: + zkevm_contracts_image: leovct/zkevm-contracts:v6.0.0-rc.1-fork.9-patch.1 + zkevm_prover_image: hermeznetwork/zkevm-prover:v6.0.6 + cdk_erigon_node_image: hermeznetwork/cdk-erigon:v2.1.2 + zkevm_node_image: hermeznetwork/zkevm-node:v0.7.3-RC1 + cdk_validium_node_image: 0xpolygon/cdk-validium-node:0.7.0-cdk + cdk_node_image: aggkit:latest + gas_token_enabled: true + additional_services: + - pless_zkevm_node + data_availability_mode: cdk-validium + sequencer_type: erigon diff --git a/test/config/kurtosis-cdk-node-config.toml.template b/test/config/kurtosis-cdk-node-config.toml.template new file mode 100644 index 00000000..45b938a2 --- /dev/null +++ b/test/config/kurtosis-cdk-node-config.toml.template @@ -0,0 +1,60 @@ +PathRWData = "{{.zkevm_path_rw_data}}/" +L1URL="{{.l1_rpc_url}}" +L2URL="http://{{.l2_rpc_name}}{{.deployment_suffix}}:{{.zkevm_rpc_http_port}}" +AggLayerURL="{{.agglayer_url}}" + +ForkId = {{.zkevm_rollup_fork_id}} +IsValidiumMode = {{.is_cdk_validium}} + +{{if eq .zkevm_rollup_fork_id "12"}} +ContractVersions = "banana" +{{else if eq .zkevm_rollup_fork_id "13"}} +# Doesn't look like this is needed at the moment, but soon perhaps? +# ContractVersions = "durian" +ContractVersions = "banana" +{{else}} +ContractVersions = "elderberry" +{{end}} + +L2Coinbase = "{{.zkevm_l2_sequencer_address}}" +SequencerPrivateKeyPath = "{{or .zkevm_l2_sequencer_keystore_file "/etc/cdk/sequencer.keystore"}}" +SequencerPrivateKeyPassword = "{{.zkevm_l2_keystore_password}}" + +AggregatorPrivateKeyPath = "{{or .zkevm_l2_aggregator_keystore_file "/etc/cdk/aggregator.keystore"}}" +AggregatorPrivateKeyPassword = "{{.zkevm_l2_keystore_password}}" +SenderProofToL1Addr = "{{.zkevm_l2_agglayer_address}}" +polygonBridgeAddr = "{{.zkevm_bridge_address}}" + +WitnessURL = "http://{{.l2_rpc_name}}{{.deployment_suffix}}:{{.zkevm_rpc_http_port}}" + + +# This values can be override directly from genesis.json +rollupCreationBlockNumber = "{{.zkevm_rollup_manager_block_number}}" +rollupManagerCreationBlockNumber = "{{.zkevm_rollup_manager_block_number}}" +genesisBlockNumber = "{{.zkevm_rollup_manager_block_number}}" +[L1Config] + chainId = "{{.l1_chain_id}}" + polygonZkEVMGlobalExitRootAddress = "{{.zkevm_global_exit_root_address}}" + polygonRollupManagerAddress = "{{.zkevm_rollup_manager_address}}" + polTokenAddress = "{{.pol_token_address}}" + polygonZkEVMAddress = "{{.zkevm_rollup_address}}" + +[L2Config] + GlobalExitRootAddr = "{{.zkevm_global_exit_root_address}}" + +[Log] +Environment = "development" # "production" or "development" +Level = "{{.global_log_level}}" +Outputs = ["stderr"] + +[Aggregator] + Port = "{{.zkevm_aggregator_port}}" + RetryTime = "30s" + VerifyProofInterval = "10s" + GasOffset = 150000 + SettlementBackend = "agglayer" + +[AggSender] +SaveCertificatesToFilesPath = "{{.zkevm_path_rw_data}}/" + + diff --git a/test/config/test.config.toml b/test/config/test.config.toml new file mode 100644 index 00000000..7ed0e7b0 --- /dev/null +++ b/test/config/test.config.toml @@ -0,0 +1,105 @@ +[Common] +IsValidiumMode = false +ContractVersions = "banana" + +[SequenceSender] +WaitPeriodSendSequence = "15s" +LastBatchVirtualizationTimeMaxWaitPeriod = "10s" +L1BlockTimestampMargin = "30s" +MaxTxSizeForL1 = 131072 +L2Coinbase = "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" +PrivateKey = {Path = "./test/sequencer.keystore", Password = "testonly"} +SequencesTxFileName = "sequencesender.json" +GasOffset = 80000 +WaitPeriodPurgeTxFile = "60m" +MaxPendingTx = 1 +RPCURL = "http://127.0.0.1:8123" +GetBatchWaitInterval = "10s" + [SequenceSender.EthTxManager] + FrequencyToMonitorTxs = "1s" + WaitTxToBeMined = "2m" + GetReceiptMaxTime = "250ms" + GetReceiptWaitInterval = "1s" + PrivateKeys = [ + {Path = "./test/sequencer.keystore", Password = "testonly"}, + ] + ForcedGas = 0 + GasPriceMarginFactor = 1 + MaxGasPriceLimit = 0 + StoragePath = "ethtxmanager.db" + ReadPendingL1Txs = false + SafeStatusL1NumberOfBlocks = 5 + FinalizedStatusL1NumberOfBlocks = 10 + [SequenceSender.EthTxManager.Etherman] + URL = "http://127.0.0.1:8545" + MultiGasProvider = false + L1ChainID = 1337 + HTTPHeaders = [] + +[Aggregator] +Host = "0.0.0.0" +Port = 50081 +RetryTime = "5s" +VerifyProofInterval = "10s" +TxProfitabilityCheckerType = "acceptall" +TxProfitabilityMinReward = "1.1" +ProofStatePollingInterval = "5s" +SenderAddress = "0x3f2963d678442c4af27a797453b64ef6ce9443e9" +CleanupLockedProofsInterval = "2m" +GeneratingProofCleanupThreshold = "10m" +BatchProofSanityCheckEnabled = true +ForkId = 9 +GasOffset = 0 +RPCURL = "http://127.0.0.1:8123" +WitnessURL = "http://127.0.0.1:8123" +SettlementBackend = "l1" +AggLayerTxTimeout = "5m" +AggLayerURL = "" +SyncModeOnlyEnabled = false +UseFullWitness = false +SequencerPrivateKey = {} + [Aggregator.Log] + Environment = "development" # "production" or "development" + Level = "info" + Outputs = ["stderr"] + [Aggregator.EthTxManager] + FrequencyToMonitorTxs = "1s" + WaitTxToBeMined = "2m" + GetReceiptMaxTime = "250ms" + GetReceiptWaitInterval = "1s" + PrivateKeys = [ + {Path = "/pk/aggregator.keystore", Password = "testonly"}, + ] + ForcedGas = 0 + GasPriceMarginFactor = 1 + MaxGasPriceLimit = 0 + StoragePath = "" + ReadPendingL1Txs = false + SafeStatusL1NumberOfBlocks = 0 + FinalizedStatusL1NumberOfBlocks = 0 + [Aggregator.EthTxManager.Etherman] + URL = "" + L1ChainID = 11155111 + HTTPHeaders = [] + [Aggregator.Synchronizer] + [Aggregator.Synchronizer.DB] + Name = "sync_db" + User = "sync_user" + Password = "sync_password" + Host = "aggkit-l1-sync-db" + Port = "5432" + EnableLog = false + MaxConns = 10 + [Aggregator.Synchronizer.Synchronizer] + SyncInterval = "10s" + SyncChunkSize = 1000 + GenesisBlockNumber = 5511080 + SyncUpToBlock = "finalized" + BlockFinality = "finalized" + [Aggregator.Synchronizer.Etherman] + [Aggregator.Synchronizer.Etherman.Validium] + Enabled = false + TrustedSequencerURL = "" + DataSourcePriority = ["trusted", "external"] + [Aggregator.Synchronizer.Etherman.Validium.Translator] + FullMatchRules = [] diff --git a/test/config/test.genesis.json b/test/config/test.genesis.json new file mode 100644 index 00000000..9744f7b9 --- /dev/null +++ b/test/config/test.genesis.json @@ -0,0 +1,100 @@ +{ + "l1Config": { + "chainId": 1337, + "polygonZkEVMAddress": "0x8dAF17A20c9DBA35f005b6324F493785D239719d", + "polygonRollupManagerAddress": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", + "polTokenAddress": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "polygonZkEVMGlobalExitRootAddress": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" + }, + "genesisBlockNumber": 67, + "root": "0xcc9ec17819f4ac7f282949ca8c379c4d3ee1b8b7908c51b9b405b6319af67b32", + "genesis": [ + { + "contractName": "PolygonZkEVMDeployer", + "balance": "0", + "nonce": "4", + "address": "0x51dbd54FCCb6b3A07738fd3E156D588e71f79973", + "bytecode": "0x6080604052600436106100705760003560e01c8063715018a61161004e578063715018a6146100e65780638da5cb5b146100fb578063e11ae6cb14610126578063f2fde38b1461013957600080fd5b80632b79805a146100755780634a94d4871461008a5780636d07dbf81461009d575b600080fd5b610088610083366004610927565b610159565b005b6100886100983660046109c7565b6101cb565b3480156100a957600080fd5b506100bd6100b8366004610a1e565b61020d565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b50610088610220565b34801561010757600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100bd565b610088610134366004610a40565b610234565b34801561014557600080fd5b50610088610154366004610a90565b61029b565b610161610357565b600061016e8585856103d8565b905061017a8183610537565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a15050505050565b6101d3610357565b6101de83838361057b565b506040517f25adb19089b6a549831a273acdf7908cff8b7ee5f551f8d1d37996cf01c5df5b90600090a1505050565b600061021983836105a9565b9392505050565b610228610357565b61023260006105b6565b565b61023c610357565b60006102498484846103d8565b60405173ffffffffffffffffffffffffffffffffffffffff821681529091507fba82f25fed02cd2a23d9f5d11c2ef588d22af5437cbf23bfe61d87257c480e4c9060200160405180910390a150505050565b6102a3610357565b73ffffffffffffffffffffffffffffffffffffffff811661034b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610354816105b6565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610232576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610342565b600083471015610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610342565b81516000036104af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610342565b8282516020840186f5905073ffffffffffffffffffffffffffffffffffffffff8116610219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610342565b6060610219838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061062b565b60606105a1848484604051806060016040528060298152602001610b3d6029913961062b565b949350505050565b6000610219838330610744565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060824710156106bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610342565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516106e69190610acf565b60006040518083038185875af1925050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b50915091506107398783838761076e565b979650505050505050565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b606083156108045782516000036107fd5773ffffffffffffffffffffffffffffffffffffffff85163b6107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610342565b50816105a1565b6105a183838151156108195781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103429190610aeb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261088d57600080fd5b813567ffffffffffffffff808211156108a8576108a861084d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156108ee576108ee61084d565b8160405283815286602085880101111561090757600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806080858703121561093d57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561096357600080fd5b61096f8883890161087c565b9350606087013591508082111561098557600080fd5b506109928782880161087c565b91505092959194509250565b803573ffffffffffffffffffffffffffffffffffffffff811681146109c257600080fd5b919050565b6000806000606084860312156109dc57600080fd5b6109e58461099e565b9250602084013567ffffffffffffffff811115610a0157600080fd5b610a0d8682870161087c565b925050604084013590509250925092565b60008060408385031215610a3157600080fd5b50508035926020909101359150565b600080600060608486031215610a5557600080fd5b8335925060208401359150604084013567ffffffffffffffff811115610a7a57600080fd5b610a868682870161087c565b9150509250925092565b600060208284031215610aa257600080fd5b6102198261099e565b60005b83811015610ac6578181015183820152602001610aae565b50506000910152565b60008251610ae1818460208701610aab565b9190910192915050565b6020815260008251806020840152610b0a816040850160208701610aab565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564a2646970667358221220964619cee0e0baf94c6f8763f013be157da5d54c89e5cff4a8caf4266e13f13a64736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + } + }, + { + "contractName": "ProxyAdmin", + "balance": "0", + "nonce": "1", + "address": "0xe34Fe58DDa5b8c6D547E4857E987633aa86a5e90", + "bytecode": "0x60806040526004361061007b5760003560e01c80639623609d1161004e5780639623609d1461012b57806399a88ec41461013e578063f2fde38b1461015e578063f3b7dead1461017e57600080fd5b8063204e1c7a14610080578063715018a6146100c95780637eff275e146100e05780638da5cb5b14610100575b600080fd5b34801561008c57600080fd5b506100a061009b366004610608565b61019e565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100d557600080fd5b506100de610255565b005b3480156100ec57600080fd5b506100de6100fb36600461062c565b610269565b34801561010c57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166100a0565b6100de610139366004610694565b6102f7565b34801561014a57600080fd5b506100de61015936600461062c565b61038c565b34801561016a57600080fd5b506100de610179366004610608565b6103e8565b34801561018a57600080fd5b506100a0610199366004610608565b6104a4565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907f5c60da1b00000000000000000000000000000000000000000000000000000000815260040190565b600060405180830381855afa9150503d8060008114610225576040519150601f19603f3d011682016040523d82523d6000602084013e61022a565b606091505b50915091508161023957600080fd5b8080602001905181019061024d9190610788565b949350505050565b61025d6104f0565b6102676000610571565b565b6102716104f0565b6040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690638f283970906024015b600060405180830381600087803b1580156102db57600080fd5b505af11580156102ef573d6000803e3d6000fd5b505050505050565b6102ff6104f0565b6040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690634f1ef28690349061035590869086906004016107a5565b6000604051808303818588803b15801561036e57600080fd5b505af1158015610382573d6000803e3d6000fd5b5050505050505050565b6103946104f0565b6040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152831690633659cfe6906024016102c1565b6103f06104f0565b73ffffffffffffffffffffffffffffffffffffffff8116610498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6104a181610571565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff166040516101ea907ff851a44000000000000000000000000000000000000000000000000000000000815260040190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048f565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b73ffffffffffffffffffffffffffffffffffffffff811681146104a157600080fd5b60006020828403121561061a57600080fd5b8135610625816105e6565b9392505050565b6000806040838503121561063f57600080fd5b823561064a816105e6565b9150602083013561065a816105e6565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000606084860312156106a957600080fd5b83356106b4816105e6565b925060208401356106c4816105e6565b9150604084013567ffffffffffffffff808211156106e157600080fd5b818601915086601f8301126106f557600080fd5b81358181111561070757610707610665565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561074d5761074d610665565b8160405282815289602084870101111561076657600080fd5b8260208601602083013760006020848301015280955050505050509250925092565b60006020828403121561079a57600080fd5b8151610625816105e6565b73ffffffffffffffffffffffffffffffffffffffff8316815260006020604081840152835180604085015260005b818110156107ef578581018301518582016060015282016107d3565b5060006060828601015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010192505050939250505056fea2646970667358221220c9867ffac53151bdb1305d8f5e3e883cd83e5270c7ec09cdc24e837b2e65239064736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "0x0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f" + } + }, + { + "contractName": "PolygonZkEVMBridge implementation", + "balance": "0", + "nonce": "1", + "address": "0x493732fB136a380920C390a85fc27d79C7b70756", + "bytecode": "0x6080604052600436106101a35760003560e01c806383f24403116100e2578063ccaa2d1111610085578063ccaa2d1114610511578063cd58657914610531578063d02103ca14610544578063dbc169761461056b578063ee25560b14610580578063f5efcd79146105ad578063f811bff7146105cd578063fb570834146105ed57600080fd5b806383f244031461040b5780638ed7e3f21461042b578063aaa13cc21461044b578063b8b284d01461046b578063bab161bf1461048b578063be5831c7146104ad578063c00f14ab146104d1578063cc461632146104f157600080fd5b80633cbc795b1161014a5780633cbc795b146102fd5780633e197043146103365780634b2f336d146103565780635ca1e165146103765780637843298b1461038b57806379e2cf97146103ab57806381b1c174146103c057806383c43a55146103f657600080fd5b806315064c96146101a85780632072f6c5146101d757806322e95f2c146101ee578063240ff3781461021b57806327aef4e81461022e5780632dfdf0b514610250578063318aee3d146102745780633c351e10146102dd575b600080fd5b3480156101b457600080fd5b506068546101c29060ff1681565b60405190151581526020015b60405180910390f35b3480156101e357600080fd5b506101ec61060d565b005b3480156101fa57600080fd5b5061020e610209366004612b65565b610642565b6040516101ce9190612b9c565b6101ec610229366004612c06565b610693565b34801561023a57600080fd5b50610243610703565b6040516101ce9190612ccf565b34801561025c57600080fd5b5061026660535481565b6040519081526020016101ce565b34801561028057600080fd5b506102b961028f366004612ce9565b606b6020526000908152604090205463ffffffff811690600160201b90046001600160a01b031682565b6040805163ffffffff90931683526001600160a01b039091166020830152016101ce565b3480156102e957600080fd5b50606d5461020e906001600160a01b031681565b34801561030957600080fd5b50606d5461032190600160a01b900463ffffffff1681565b60405163ffffffff90911681526020016101ce565b34801561034257600080fd5b50610266610351366004612d15565b610791565b34801561036257600080fd5b50606f5461020e906001600160a01b031681565b34801561038257600080fd5b5061026661081e565b34801561039757600080fd5b5061020e6103a6366004612d94565b6108fb565b3480156103b757600080fd5b506101ec610925565b3480156103cc57600080fd5b5061020e6103db366004612ddd565b606a602052600090815260409020546001600160a01b031681565b34801561040257600080fd5b50610243610946565b34801561041757600080fd5b50610266610426366004612e08565b610965565b34801561043757600080fd5b50606c5461020e906001600160a01b031681565b34801561045757600080fd5b5061020e610466366004612f12565b610a3b565b34801561047757600080fd5b506101ec610486366004612fad565b610b3d565b34801561049757600080fd5b5060685461032190610100900463ffffffff1681565b3480156104b957600080fd5b5060685461032190600160c81b900463ffffffff1681565b3480156104dd57600080fd5b506102436104ec366004612ce9565b610c04565b3480156104fd57600080fd5b506101c261050c36600461302f565b610c49565b34801561051d57600080fd5b506101ec61052c366004613062565b610cd2565b6101ec61053f36600461314d565b6111c7565b34801561055057600080fd5b5060685461020e90600160281b90046001600160a01b031681565b34801561057757600080fd5b506101ec611621565b34801561058c57600080fd5b5061026661059b366004612ddd565b60696020526000908152604090205481565b3480156105b957600080fd5b506101ec6105c8366004613062565b611654565b3480156105d957600080fd5b506101ec6105e83660046131e2565b6118ef565b3480156105f957600080fd5b506101c261060836600461328a565b611b62565b606c546001600160a01b0316331461063857604051631736745960e31b815260040160405180910390fd5b610640611b7a565b565b6000606a6000848460405160200161065b9291906132d2565b60408051601f19818403018152918152815160209283012083529082019290925201600020546001600160a01b031690505b92915050565b60685460ff16156106b757604051630bc011ff60e21b815260040160405180910390fd5b34158015906106d05750606f546001600160a01b031615155b156106ee576040516301bd897160e61b815260040160405180910390fd5b6106fc858534868686611bd6565b5050505050565b606e8054610710906132fc565b80601f016020809104026020016040519081016040528092919081815260200182805461073c906132fc565b80156107895780601f1061075e57610100808354040283529160200191610789565b820191906000526020600020905b81548152906001019060200180831161076c57829003601f168201915b505050505081565b6040516001600160f81b031960f889901b1660208201526001600160e01b031960e088811b821660218401526001600160601b0319606089811b821660258601529188901b909216603984015285901b16603d8201526051810183905260718101829052600090609101604051602081830303815290604052805190602001209050979650505050505050565b605354600090819081805b60208110156108f2578083901c600116600103610886576033816020811061085357610853613336565b015460408051602081019290925281018590526060016040516020818303038152906040528051906020012093506108b3565b60408051602081018690529081018390526060016040516020818303038152906040528051906020012093505b604080516020810184905290810183905260600160405160208183030381529060405280519060200120915080806108ea90613362565b915050610829565b50919392505050565b600061091d848461090b85611ca0565b61091486611d5f565b61046687611e17565b949350505050565b605354606854600160c81b900463ffffffff16101561064057610640611ecf565b60405180611ba00160405280611b668152602001613a7a611b66913981565b600083815b6020811015610a3257600163ffffffff8516821c811690036109d55784816020811061099857610998613336565b6020020135826040516020016109b8929190918252602082015260400190565b604051602081830303815290604052805190602001209150610a20565b818582602081106109e8576109e8613336565b6020020135604051602001610a07929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b80610a2a81613362565b91505061096a565b50949350505050565b6000808686604051602001610a519291906132d2565b604051602081830303815290604052805190602001209050600060ff60f81b308360405180611ba00160405280611b668152602001613a7a611b669139898989604051602001610aa39392919061337b565b60408051601f1981840301815290829052610ac192916020016133b4565b60405160208183030381529060405280519060200120604051602001610b1994939291906001600160f81b031994909416845260609290921b6001600160601b03191660018401526015830152603582015260550190565b60408051808303601f19018152919052805160209091012098975050505050505050565b60685460ff1615610b6157604051630bc011ff60e21b815260040160405180910390fd5b606f546001600160a01b0316610b8a5760405163dde3cda760e01b815260040160405180910390fd5b606f54604051632770a7eb60e21b81526001600160a01b0390911690639dc29fac90610bbc90339088906004016133e3565b600060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b50505050610bfc868686868686611bd6565b505050505050565b6060610c0f82611ca0565b610c1883611d5f565b610c2184611e17565b604051602001610c339392919061337b565b6040516020818303038152906040529050919050565b6068546000908190610100900463ffffffff16158015610c6f575063ffffffff83166001145b15610c81575063ffffffff8316610ca8565b610c95600160201b63ffffffff85166133fc565b610ca59063ffffffff8616613413565b90505b600881901c600090815260696020526040902054600160ff9092169190911b908116149392505050565b60685460ff1615610cf657604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff8681166101009092041614610d26576040516302caf51760e11b815260040160405180910390fd5b610d5a8c8c8c8c8c610d5560008e8e8e8e8e8e8e604051610d48929190613426565b6040518091039020610791565b611f68565b6001600160a01b038616610e9257606f546001600160a01b0316610e295760006001600160a01b03851684825b6040519080825280601f01601f191660200182016040528015610db1576020820181803683370190505b50604051610dbf9190613436565b60006040518083038185875af1925050503d8060008114610dfc576040519150601f19603f3d011682016040523d82523d6000602084013e610e01565b606091505b5050905080610e2357604051630ce8f45160e31b815260040160405180910390fd5b5061117a565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f1990610e5b90879087906004016133e3565b600060405180830381600087803b158015610e7557600080fd5b505af1158015610e89573d6000803e3d6000fd5b5050505061117a565b606d546001600160a01b038781169116148015610ec05750606d5463ffffffff888116600160a01b90920416145b15610ed85760006001600160a01b0385168482610d87565b60685463ffffffff610100909104811690881603610f0957610f046001600160a01b03871685856120c7565b61117a565b60008787604051602001610f1e9291906132d2565b60408051601f1981840301815291815281516020928301206000818152606a9093529120549091506001600160a01b031680611116576000610f968386868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061212292505050565b6040516340c10f1960e01b81529091506001600160a01b038216906340c10f1990610fc7908a908a906004016133e3565b600060405180830381600087803b158015610fe157600080fd5b505af1158015610ff5573d6000803e3d6000fd5b5050505080606a600085815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060405180604001604052808b63ffffffff1681526020018a6001600160a01b0316815250606b6000836001600160a01b03166001600160a01b0316815260200190815260200160002060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154816001600160a01b0302191690836001600160a01b031602179055509050507f490e59a1701b938786ac72570a1efeac994a3dbe96e2e883e19e902ace6e6a398a8a83888860405161110895949392919061347b565b60405180910390a150611177565b6040516340c10f1960e01b81526001600160a01b038216906340c10f199061114490899089906004016133e3565b600060405180830381600087803b15801561115e57600080fd5b505af1158015611172573d6000803e3d6000fd5b505050505b50505b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8a888887876040516111b19594939291906134b4565b60405180910390a1505050505050505050505050565b60685460ff16156111eb57604051630bc011ff60e21b815260040160405180910390fd5b6111f361219e565b60685463ffffffff610100909104811690881603611224576040516302caf51760e11b815260040160405180910390fd5b6000806060876001600160a01b03881661130a578834146112585760405163b89240f560e01b815260040160405180910390fd5b606d54606e80546001600160a01b0383169650600160a01b90920463ffffffff16945090611285906132fc565b80601f01602080910402602001604051908101604052809291908181526020018280546112b1906132fc565b80156112fe5780601f106112d3576101008083540402835291602001916112fe565b820191906000526020600020905b8154815290600101906020018083116112e157829003601f168201915b50505050509150611596565b34156113295760405163798ee6f160e01b815260040160405180910390fd5b606f546001600160a01b03908116908916036113a457604051632770a7eb60e21b81526001600160a01b03891690639dc29fac9061136d9033908d906004016133e3565b600060405180830381600087803b15801561138757600080fd5b505af115801561139b573d6000803e3d6000fd5b50505050611596565b6001600160a01b038089166000908152606b602090815260409182902082518084019093525463ffffffff81168352600160201b9004909216918101829052901561145c57604051632770a7eb60e21b81526001600160a01b038a1690639dc29fac906114179033908e906004016133e3565b600060405180830381600087803b15801561143157600080fd5b505af1158015611445573d6000803e3d6000fd5b505050508060200151945080600001519350611589565b851561146e5761146e898b89896121f7565b6040516370a0823160e01b81526000906001600160a01b038b16906370a082319061149d903090600401612b9c565b602060405180830381865afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114de91906134e6565b90506114f56001600160a01b038b1633308e61253d565b6040516370a0823160e01b81526000906001600160a01b038c16906370a0823190611524903090600401612b9c565b602060405180830381865afa158015611541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156591906134e6565b905061157182826134ff565b6068548c9850610100900463ffffffff169650935050505b61159289610c04565b9250505b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b600084868e8e86886053546040516115d6989796959493929190613512565b60405180910390a16115fd6115f8600085878f8f878980519060200120610791565b612575565b861561160b5761160b611ecf565b5050505061161860018055565b50505050505050565b606c546001600160a01b0316331461164c57604051631736745960e31b815260040160405180910390fd5b610640612660565b60685460ff161561167857604051630bc011ff60e21b815260040160405180910390fd5b60685463ffffffff86811661010090920416146116a8576040516302caf51760e11b815260040160405180910390fd5b6116ca8c8c8c8c8c610d5560018e8e8e8e8e8e8e604051610d48929190613426565b606f546000906001600160a01b031661178157846001600160a01b031684888a86866040516024016116ff949392919061357d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b179052516117349190613436565b60006040518083038185875af1925050503d8060008114611771576040519150601f19603f3d011682016040523d82523d6000602084013e611776565b606091505b505080915050611883565b606f546040516340c10f1960e01b81526001600160a01b03909116906340c10f19906117b390889088906004016133e3565b600060405180830381600087803b1580156117cd57600080fd5b505af11580156117e1573d6000803e3d6000fd5b50505050846001600160a01b031687898585604051602401611806949392919061357d565b60408051601f198184030181529181526020820180516001600160e01b0316630c035af960e11b1790525161183b9190613436565b6000604051808303816000865af19150503d8060008114611878576040519150601f19603f3d011682016040523d82523d6000602084013e61187d565b606091505b50909150505b806118a1576040516337e391c360e01b815260040160405180910390fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d8b898988886040516118d89594939291906134b4565b60405180910390a150505050505050505050505050565b600054610100900460ff161580801561190f5750600054600160ff909116105b806119295750303b158015611929575060005460ff166001145b6119915760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156119b4576000805461ff0019166101001790555b60688054610100600160c81b03191661010063ffffffff8a160265010000000000600160c81b03191617600160281b6001600160a01b038781169190910291909117909155606c80546001600160a01b0319168583161790558616611a3d5763ffffffff851615611a3857604051630d43a60960e11b815260040160405180910390fd5b611b0c565b606d805463ffffffff8716600160a01b026001600160c01b03199091166001600160a01b03891617179055606e611a7483826135fe565b50611aeb6000801b6012604051602001611ad791906060808252600d908201526c2bb930b83832b21022ba3432b960991b608082015260a060208201819052600490820152630ae8aa8960e31b60c082015260ff91909116604082015260e00190565b604051602081830303815290604052612122565b606f80546001600160a01b0319166001600160a01b03929092169190911790555b611b146126b8565b8015611618576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050505050565b600081611b70868686610965565b1495945050505050565b60685460ff1615611b9e57604051630bc011ff60e21b815260040160405180910390fd5b6068805460ff191660011790556040517f2261efe5aef6fedc1fd1550b25facc9181745623049c7901287030b9ad1a549790600090a1565b60685463ffffffff610100909104811690871603611c07576040516302caf51760e11b815260040160405180910390fd5b7f501781209a1f8899323b96b4ef08b168df93e0a90c673d1e4cce39366cb62f9b6001606860019054906101000a900463ffffffff16338989898888605354604051611c5b999897969594939291906136bd565b60405180910390a1611c926115f86001606860019054906101000a900463ffffffff16338a8a8a8989604051610d48929190613426565b8215610bfc57610bfc611ecf565b60408051600481526024810182526020810180516001600160e01b03166306fdde0360e01b179052905160609160009182916001600160a01b03861691611ce79190613436565b600060405180830381855afa9150503d8060008114611d22576040519150601f19603f3d011682016040523d82523d6000602084013e611d27565b606091505b509150915081611d5657604051806040016040528060078152602001664e4f5f4e414d4560c81b81525061091d565b61091d816126e7565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b03861691611da69190613436565b600060405180830381855afa9150503d8060008114611de1576040519150601f19603f3d011682016040523d82523d6000602084013e611de6565b606091505b509150915081611d5657604051806040016040528060098152602001681393d7d4d6535093d360ba1b81525061091d565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691611e5d9190613436565b600060405180830381855afa9150503d8060008114611e98576040519150601f19603f3d011682016040523d82523d6000602084013e611e9d565b606091505b5091509150818015611eb0575080516020145b611ebb57601261091d565b8080602001905181019061091d919061372a565b6053546068805463ffffffff909216600160c81b0263ffffffff60c81b1990921691909117908190556001600160a01b03600160281b909104166333d6247d611f1661081e565b6040518263ffffffff1660e01b8152600401611f3491815260200190565b600060405180830381600087803b158015611f4e57600080fd5b505af1158015611f62573d6000803e3d6000fd5b50505050565b606854604080516020808201879052818301869052825180830384018152606083019384905280519101206312bd9b1960e11b9092526064810191909152600091600160281b90046001600160a01b03169063257b3632906084016020604051808303816000875af1158015611fe2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200691906134e6565b90508060000361202857604051622f6fad60e01b815260040160405180910390fd5b600080600160401b87161561206857869150612046848a8489611b62565b612063576040516338105f3b60e21b815260040160405180910390fd5b6120b2565b602087901c612078816001613747565b915087925061209361208b868c86610965565b8a8389611b62565b6120b0576040516338105f3b60e21b815260040160405180910390fd5b505b6120bc8282612875565b505050505050505050565b61211d8363a9059cbb60e01b84846040516024016120e69291906133e3565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261291d565b505050565b60008060405180611ba00160405280611b668152602001613a7a611b669139836040516020016121539291906133b4565b6040516020818303038152906040529050838151602083016000f591506001600160a01b038216612197576040516305f7d84960e51b815260040160405180910390fd5b5092915050565b6002600154036121f05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611988565b6002600155565b60006122066004828486613764565b61220f9161378e565b9050632afa533160e01b6001600160e01b03198216016123a357600080808080808061223e896004818d613764565b81019061224b91906137be565b9650965096509650965096509650336001600160a01b0316876001600160a01b03161461228b5760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03861630146122b45760405163750643af60e01b815260040160405180910390fd5b8a85146122d4576040516303fffc4b60e01b815260040160405180910390fd5b604080516001600160a01b0389811660248301528881166044830152606482018890526084820187905260ff861660a483015260c4820185905260e48083018590528351808403909101815261010490920183526020820180516001600160e01b031663d505accf60e01b1790529151918e16916123529190613436565b6000604051808303816000865af19150503d806000811461238f576040519150601f19603f3d011682016040523d82523d6000602084013e612394565b606091505b505050505050505050506106fc565b6001600160e01b031981166323f2ebc360e21b146123d457604051637141605d60e11b815260040160405180910390fd5b6000808080808080806123ea8a6004818e613764565b8101906123f79190613812565b97509750975097509750975097509750336001600160a01b0316886001600160a01b0316146124395760405163912ecce760e01b815260040160405180910390fd5b6001600160a01b03871630146124625760405163750643af60e01b815260040160405180910390fd5b604080516001600160a01b038a811660248301528981166044830152606482018990526084820188905286151560a483015260ff861660c483015260e482018590526101048083018590528351808403909101815261012490920183526020820180516001600160e01b03166323f2ebc360e21b1790529151918f16916124e99190613436565b6000604051808303816000865af19150503d8060008114612526576040519150601f19603f3d011682016040523d82523d6000602084013e61252b565b606091505b50505050505050505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052611f629085906323b872dd60e01b906084016120e6565b80600161258460206002613979565b61258e91906134ff565b605354106125af576040516377ae67b360e11b815260040160405180910390fd5b60006053600081546125c090613362565b9182905550905060005b6020811015612651578082901c6001166001036125fd5782603382602081106125f5576125f5613336565b015550505050565b6033816020811061261057612610613336565b01546040805160208101929092528101849052606001604051602081830303815290604052805190602001209250808061264990613362565b9150506125ca565b5061211d613985565b60018055565b60685460ff1661268357604051635386698160e01b815260040160405180910390fd5b6068805460ff191690556040517f1e5e34eea33501aecf2ebec9fe0e884a40804275ea7fe10b2ba084c8374308b390600090a1565b600054610100900460ff166126df5760405162461bcd60e51b81526004016119889061399b565b6106406129ef565b60606040825110612706578180602001905181019061068d91906139e6565b81516020036128425760005b602081108015612741575082818151811061272f5761272f613336565b01602001516001600160f81b03191615155b15612758578061275081613362565b915050612712565b806000036127905750506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b6020820152919050565b6000816001600160401b038111156127aa576127aa612e47565b6040519080825280601f01601f1916602001820160405280156127d4576020820181803683370190505b50905060005b8281101561283a578481815181106127f4576127f4613336565b602001015160f81c60f81b82828151811061281157612811613336565b60200101906001600160f81b031916908160001a9053508061283281613362565b9150506127da565b509392505050565b50506040805180820190915260128152714e4f545f56414c49445f454e434f44494e4760701b602082015290565b919050565b606854600090610100900463ffffffff16158015612899575063ffffffff82166001145b156128ab575063ffffffff82166128d2565b6128bf600160201b63ffffffff84166133fc565b6128cf9063ffffffff8516613413565b90505b600881901c60008181526069602052604081208054600160ff861690811b9182189283905592909190818316900361161857604051630c8d9eab60e31b815260040160405180910390fd5b6000612972826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a169092919063ffffffff16565b80519091501561211d57808060200190518101906129909190613a5c565b61211d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611988565b600054610100900460ff1661265a5760405162461bcd60e51b81526004016119889061399b565b606061091d848460008585600080866001600160a01b03168587604051612a3d9190613436565b60006040518083038185875af1925050503d8060008114612a7a576040519150601f19603f3d011682016040523d82523d6000602084013e612a7f565b606091505b5091509150612a9087838387612a9b565b979650505050505050565b60608315612b0a578251600003612b03576001600160a01b0385163b612b035760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611988565b508161091d565b61091d8383815115612b1f5781518083602001fd5b8060405162461bcd60e51b81526004016119889190612ccf565b803563ffffffff8116811461287057600080fd5b6001600160a01b0381168114612b6257600080fd5b50565b60008060408385031215612b7857600080fd5b612b8183612b39565b91506020830135612b9181612b4d565b809150509250929050565b6001600160a01b0391909116815260200190565b8015158114612b6257600080fd5b60008083601f840112612bd057600080fd5b5081356001600160401b03811115612be757600080fd5b602083019150836020828501011115612bff57600080fd5b9250929050565b600080600080600060808688031215612c1e57600080fd5b612c2786612b39565b94506020860135612c3781612b4d565b93506040860135612c4781612bb0565b925060608601356001600160401b03811115612c6257600080fd5b612c6e88828901612bbe565b969995985093965092949392505050565b60005b83811015612c9a578181015183820152602001612c82565b50506000910152565b60008151808452612cbb816020860160208601612c7f565b601f01601f19169290920160200192915050565b602081526000612ce26020830184612ca3565b9392505050565b600060208284031215612cfb57600080fd5b8135612ce281612b4d565b60ff81168114612b6257600080fd5b600080600080600080600060e0888a031215612d3057600080fd5b8735612d3b81612d06565b9650612d4960208901612b39565b95506040880135612d5981612b4d565b9450612d6760608901612b39565b93506080880135612d7781612b4d565b9699959850939692959460a0840135945060c09093013592915050565b600080600060608486031215612da957600080fd5b612db284612b39565b92506020840135612dc281612b4d565b91506040840135612dd281612b4d565b809150509250925092565b600060208284031215612def57600080fd5b5035919050565b80610400810183101561068d57600080fd5b60008060006104408486031215612e1e57600080fd5b83359250612e2f8560208601612df6565b9150612e3e6104208501612b39565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612e8557612e85612e47565b604052919050565b60006001600160401b03821115612ea657612ea6612e47565b50601f01601f191660200190565b6000612ec7612ec284612e8d565b612e5d565b9050828152838383011115612edb57600080fd5b828260208301376000602084830101529392505050565b600082601f830112612f0357600080fd5b612ce283833560208501612eb4565b600080600080600060a08688031215612f2a57600080fd5b612f3386612b39565b94506020860135612f4381612b4d565b935060408601356001600160401b0380821115612f5f57600080fd5b612f6b89838a01612ef2565b94506060880135915080821115612f8157600080fd5b50612f8e88828901612ef2565b9250506080860135612f9f81612d06565b809150509295509295909350565b60008060008060008060a08789031215612fc657600080fd5b612fcf87612b39565b95506020870135612fdf81612b4d565b9450604087013593506060870135612ff681612bb0565b925060808701356001600160401b0381111561301157600080fd5b61301d89828a01612bbe565b979a9699509497509295939492505050565b6000806040838503121561304257600080fd5b61304b83612b39565b915061305960208401612b39565b90509250929050565b6000806000806000806000806000806000806109208d8f03121561308557600080fd5b61308f8e8e612df6565b9b5061309f8e6104008f01612df6565b9a506108008d013599506108208d013598506108408d013597506130c66108608e01612b39565b96506130d66108808e0135612b4d565b6108808d013595506130eb6108a08e01612b39565b94506130fb6108c08e0135612b4d565b6108c08d013593506108e08d013592506001600160401b036109008e0135111561312457600080fd5b6131358e6109008f01358f01612bbe565b81935080925050509295989b509295989b509295989b565b600080600080600080600060c0888a03121561316857600080fd5b61317188612b39565b9650602088013561318181612b4d565b955060408801359450606088013561319881612b4d565b935060808801356131a881612bb0565b925060a08801356001600160401b038111156131c357600080fd5b6131cf8a828b01612bbe565b989b979a50959850939692959293505050565b60008060008060008060c087890312156131fb57600080fd5b61320487612b39565b9550602087013561321481612b4d565b945061322260408801612b39565b9350606087013561323281612b4d565b9250608087013561324281612b4d565b915060a08701356001600160401b0381111561325d57600080fd5b8701601f8101891361326e57600080fd5b61327d89823560208401612eb4565b9150509295509295509295565b60008060008061046085870312156132a157600080fd5b843593506132b28660208701612df6565b92506132c16104208601612b39565b939692955092936104400135925050565b60e09290921b6001600160e01b031916825260601b6001600160601b031916600482015260180190565b600181811c9082168061331057607f821691505b60208210810361333057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016133745761337461334c565b5060010190565b60608152600061338e6060830186612ca3565b82810360208401526133a08186612ca3565b91505060ff83166040830152949350505050565b600083516133c6818460208801612c7f565b8351908301906133da818360208801612c7f565b01949350505050565b6001600160a01b03929092168252602082015260400190565b808202811582820484141761068d5761068d61334c565b8082018082111561068d5761068d61334c565b8183823760009101908152919050565b60008251613448818460208701612c7f565b9190910192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b63ffffffff861681526001600160a01b03858116602083015284166040820152608060608201819052600090612a909083018486613452565b94855263ffffffff9390931660208501526001600160a01b039182166040850152166060830152608082015260a00190565b6000602082840312156134f857600080fd5b5051919050565b8181038181111561068d5761068d61334c565b60ff8916815263ffffffff88811660208301526001600160a01b03888116604084015287821660608401528616608083015260a0820185905261010060c0830181905260009161356484830187612ca3565b925080851660e085015250509998505050505050505050565b6001600160a01b038516815263ffffffff841660208201526060604082018190526000906135ae9083018486613452565b9695505050505050565b601f82111561211d57600081815260208120601f850160051c810160208610156135df5750805b601f850160051c820191505b81811015610bfc578281556001016135eb565b81516001600160401b0381111561361757613617612e47565b61362b8161362584546132fc565b846135b8565b602080601f83116001811461366057600084156136485750858301515b600019600386901b1c1916600185901b178555610bfc565b600085815260208120601f198616915b8281101561368f57888601518255948401946001909101908401613670565b50858210156136ad5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60ff8a16815263ffffffff89811660208301526001600160a01b03898116604084015288821660608401528716608083015260a0820186905261010060c083018190526000916137108483018789613452565b925080851660e085015250509a9950505050505050505050565b60006020828403121561373c57600080fd5b8151612ce281612d06565b63ffffffff8181168382160190808211156121975761219761334c565b6000808585111561377457600080fd5b8386111561378157600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156137b65780818660040360031b1b83161692505b505092915050565b600080600080600080600060e0888a0312156137d957600080fd5b87356137e481612b4d565b965060208801356137f481612b4d565b955060408801359450606088013593506080880135612d7781612d06565b600080600080600080600080610100898b03121561382f57600080fd5b883561383a81612b4d565b9750602089013561384a81612b4d565b96506040890135955060608901359450608089013561386881612bb0565b935060a089013561387881612d06565b979a969950949793969295929450505060c08201359160e0013590565b600181815b808511156138d05781600019048211156138b6576138b661334c565b808516156138c357918102915b93841c939080029061389a565b509250929050565b6000826138e75750600161068d565b816138f45750600061068d565b816001811461390a576002811461391457613930565b600191505061068d565b60ff8411156139255761392561334c565b50506001821b61068d565b5060208310610133831016604e8410600b8410161715613953575081810a61068d565b61395d8383613895565b80600019048211156139715761397161334c565b029392505050565b6000612ce283836138d8565b634e487b7160e01b600052600160045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6000602082840312156139f857600080fd5b81516001600160401b03811115613a0e57600080fd5b8201601f81018413613a1f57600080fd5b8051613a2d612ec282612e8d565b818152856020838501011115613a4257600080fd5b613a53826020830160208601612c7f565b95945050505050565b600060208284031215613a6e57600080fd5b8151612ce281612bb056fe6101006040523480156200001257600080fd5b5060405162001b6638038062001b6683398101604081905262000035916200028d565b82826003620000458382620003a1565b506004620000548282620003a1565b50503360c0525060ff811660e052466080819052620000739062000080565b60a052506200046d915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000ad6200012e565b805160209182012060408051808201825260018152603160f81b90840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b6060600380546200013f9062000312565b80601f01602080910402602001604051908101604052809291908181526020018280546200016d9062000312565b8015620001be5780601f106200019257610100808354040283529160200191620001be565b820191906000526020600020905b815481529060010190602001808311620001a057829003601f168201915b5050505050905090565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001f057600080fd5b81516001600160401b03808211156200020d576200020d620001c8565b604051601f8301601f19908116603f01168101908282118183101715620002385762000238620001c8565b816040528381526020925086838588010111156200025557600080fd5b600091505b838210156200027957858201830151818301840152908201906200025a565b600093810190920192909252949350505050565b600080600060608486031215620002a357600080fd5b83516001600160401b0380821115620002bb57600080fd5b620002c987838801620001de565b94506020860151915080821115620002e057600080fd5b50620002ef86828701620001de565b925050604084015160ff811681146200030757600080fd5b809150509250925092565b600181811c908216806200032757607f821691505b6020821081036200034857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200039c57600081815260208120601f850160051c81016020861015620003775750805b601f850160051c820191505b81811015620003985782815560010162000383565b5050505b505050565b81516001600160401b03811115620003bd57620003bd620001c8565b620003d581620003ce845462000312565b846200034e565b602080601f8311600181146200040d5760008415620003f45750858301515b600019600386901b1c1916600185901b17855562000398565b600085815260208120601f198616915b828110156200043e578886015182559484019460019091019084016200041d565b50858210156200045d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a05160c05160e0516116aa620004bc6000396000610237015260008181610307015281816105c001526106a70152600061053a015260008181610379015261050401526116aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806370a08231116100d8578063a457c2d71161008c578063d505accf11610066578063d505accf1461039b578063dd62ed3e146103ae578063ffa1ad74146103f457600080fd5b8063a457c2d71461034e578063a9059cbb14610361578063cd0d00961461037457600080fd5b806395d89b41116100bd57806395d89b41146102e75780639dc29fac146102ef578063a3c573eb1461030257600080fd5b806370a08231146102915780637ecebe00146102c757600080fd5b806330adf81f1161012f5780633644e515116101145780633644e51514610261578063395093511461026957806340c10f191461027c57600080fd5b806330adf81f14610209578063313ce5671461023057600080fd5b806318160ddd1161016057806318160ddd146101bd57806320606b70146101cf57806323b872dd146101f657600080fd5b806306fdde031461017c578063095ea7b31461019a575b600080fd5b610184610430565b60405161019191906113e4565b60405180910390f35b6101ad6101a8366004611479565b6104c2565b6040519015158152602001610191565b6002545b604051908152602001610191565b6101c17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b6101ad6102043660046114a3565b6104dc565b6101c17f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152602001610191565b6101c1610500565b6101ad610277366004611479565b61055c565b61028f61028a366004611479565b6105a8565b005b6101c161029f3660046114df565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6101c16102d53660046114df565b60056020526000908152604090205481565b610184610680565b61028f6102fd366004611479565b61068f565b6103297f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610191565b6101ad61035c366004611479565b61075e565b6101ad61036f366004611479565b61082f565b6101c17f000000000000000000000000000000000000000000000000000000000000000081565b61028f6103a9366004611501565b61083d565b6101c16103bc366004611574565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101846040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60606003805461043f906115a7565b80601f016020809104026020016040519081016040528092919081815260200182805461046b906115a7565b80156104b85780601f1061048d576101008083540402835291602001916104b8565b820191906000526020600020905b81548152906001019060200180831161049b57829003601f168201915b5050505050905090565b6000336104d0818585610b73565b60019150505b92915050565b6000336104ea858285610d27565b6104f5858585610dfe565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610537576105324661106d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906104d090829086906105a3908790611629565b610b73565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d4272696467650000000000000000000000000000000060648201526084015b60405180910390fd5b61067c8282611135565b5050565b60606004805461043f906115a7565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f546f6b656e577261707065643a3a6f6e6c794272696467653a204e6f7420506f60448201527f6c79676f6e5a6b45564d427269646765000000000000000000000000000000006064820152608401610669565b61067c8282611228565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610669565b6104f58286868403610b73565b6000336104d0818585610dfe565b834211156108cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f546f6b656e577261707065643a3a7065726d69743a204578706972656420706560448201527f726d6974000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260056020526040812080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918a918a918a9190866109268361163c565b9091555060408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610991610500565b6040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281019190915260428101839052606201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610a55573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff811615801590610ad057508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f546f6b656e577261707065643a3a7065726d69743a20496e76616c696420736960448201527f676e6174757265000000000000000000000000000000000000000000000000006064820152608401610669565b610b678a8a8a610b73565b50505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610cb8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df85781811015610deb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610669565b610df88484848403610b73565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff8216610f44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610df8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611098610430565b8051602091820120604080518082018252600181527f310000000000000000000000000000000000000000000000000000000000000090840152805192830193909352918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66060820152608081018390523060a082015260c001604051602081830303815290604052805190602001209050919050565b73ffffffffffffffffffffffffffffffffffffffff82166111b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610669565b80600260008282546111c49190611629565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82166112cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015611381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610669565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d1a565b600060208083528351808285015260005b81811015611411578581018301518582016040015282016113f5565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461147457600080fd5b919050565b6000806040838503121561148c57600080fd5b61149583611450565b946020939093013593505050565b6000806000606084860312156114b857600080fd5b6114c184611450565b92506114cf60208501611450565b9150604084013590509250925092565b6000602082840312156114f157600080fd5b6114fa82611450565b9392505050565b600080600080600080600060e0888a03121561151c57600080fd5b61152588611450565b965061153360208901611450565b95506040880135945060608801359350608088013560ff8116811461155757600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561158757600080fd5b61159083611450565b915061159e60208401611450565b90509250929050565b600181811c908216806115bb57607f821691505b6020821081036115f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104d6576104d66115fa565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361166d5761166d6115fa565b506001019056fea26469706673582212208d88fee561cff7120d381c345cfc534cef8229a272dc5809d4bbb685ad67141164736f6c63430008110033a2646970667358221220914f18d5b241f0d10b2ebc814aadeee338ad60bad704683e414dad415cb2e14d64736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMBridge proxy", + "balance": "340282366920938463463374607431768211455", + "nonce": "1", + "address": "0xB7098a13a48EcE087d3DA15b2D28eCE0f89819B8", + "bytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100a85780638f283970146100e6578063f851a440146101065761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61011b565b005b61006b61011b565b34801561008157600080fd5b5061006b61009036600461086f565b610135565b61006b6100a336600461088a565b61017f565b3480156100b457600080fd5b506100bd6101f3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100f257600080fd5b5061006b61010136600461086f565b610231565b34801561011257600080fd5b506100bd61025e565b61012361028c565b61013361012e610363565b61036d565b565b61013d610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816040518060200160405280600081525060006103d1565b50565b61017461011b565b610187610391565b73ffffffffffffffffffffffffffffffffffffffff1633036101eb576101e68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250600192506103d1915050565b505050565b6101e661011b565b60006101fd610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610363565b905090565b61022e61011b565b90565b610239610391565b73ffffffffffffffffffffffffffffffffffffffff16330361017757610174816103fc565b6000610268610391565b73ffffffffffffffffffffffffffffffffffffffff16330361022657610221610391565b610294610391565b73ffffffffffffffffffffffffffffffffffffffff163303610133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b600061022161045d565b3660008037600080366000845af43d6000803e80801561038c573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103da83610485565b6000825111806103e75750805b156101e6576103f683836104d2565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610425610391565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a1610174816104fe565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103b5565b61048e8161060a565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606104f7838360405180606001604052806027815260200161099f602791396106d5565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161035a565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b6106ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e747261637400000000000000000000000000000000000000606482015260840161035a565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105c4565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516106ff9190610931565b600060405180830381855af49150503d806000811461073a576040519150601f19603f3d011682016040523d82523d6000602084013e61073f565b606091505b50915091506107508683838761075a565b9695505050505050565b606083156107f05782516000036107e95773ffffffffffffffffffffffffffffffffffffffff85163b6107e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161035a565b50816107fa565b6107fa8383610802565b949350505050565b8151156108125781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161035a919061094d565b803573ffffffffffffffffffffffffffffffffffffffff8116811461086a57600080fd5b919050565b60006020828403121561088157600080fd5b6104f782610846565b60008060006040848603121561089f57600080fd5b6108a884610846565b9250602084013567ffffffffffffffff808211156108c557600080fd5b818601915086601f8301126108d957600080fd5b8135818111156108e857600080fd5b8760208285010111156108fa57600080fd5b6020830194508093505050509250925092565b60005b83811015610928578181015183820152602001610910565b50506000910152565b6000825161094381846020870161090d565b9190910192915050565b602081526000825180602084015261096c81604085016020870161090d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220701a0c26bdd76686e63fc3c65e4f28a20ba3ecc8a60246733c0627e679c9804e64736f6c63430008140033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000e34fe58dda5b8c6d547e4857e987633aa86a5e90", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000493732fb136a380920c390a85fc27d79c7b70756" + } + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 implementation", + "balance": "0", + "nonce": "1", + "address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + "bytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806301fd904414610051578063257b36321461006d57806333d6247d1461008d578063a3c573eb146100a2575b600080fd5b61005a60015481565b6040519081526020015b60405180910390f35b61005a61007b366004610162565b60006020819052908152604090205481565b6100a061009b366004610162565b6100ee565b005b6100c97f000000000000000000000000b7098a13a48ece087d3da15b2d28ece0f89819b881565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610064565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b7098a13a48ece087d3da15b2d28ece0f89819b8161461015d576040517fb49365dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600155565b60006020828403121561017457600080fd5b503591905056fea2646970667358221220ea2171e2c85c8bff947affc409ef6fc6a8fe82fb8c174ddeda988651e595d66564736f6c63430008140033" + }, + { + "contractName": "PolygonZkEVMGlobalExitRootL2 proxy", + "balance": "0", + "nonce": "1", + "address": "0xa40d5f56745a118d0906a34e69aec8c0db1cb8fa", + "bytecode": "0x60806040523661001357610011610017565b005b6100115b61001f6101b7565b6001600160a01b0316336001600160a01b0316141561016f5760606001600160e01b031960003516631b2ce7f360e11b8114156100655761005e6101ea565b9150610167565b6001600160e01b0319811663278f794360e11b14156100865761005e610241565b6001600160e01b031981166308f2839760e41b14156100a75761005e610287565b6001600160e01b031981166303e1469160e61b14156100c85761005e6102b8565b6001600160e01b03198116635c60da1b60e01b14156100e95761005e6102f8565b60405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b815160208301f35b61017761030c565b565b606061019e83836040518060600160405280602781526020016108576027913961031c565b9392505050565b90565b6001600160a01b03163b151590565b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b60606101f4610394565b600061020336600481846106a2565b81019061021091906106e8565b905061022d8160405180602001604052806000815250600061039f565b505060408051602081019091526000815290565b606060008061025336600481846106a2565b8101906102609190610719565b915091506102708282600161039f565b604051806020016040528060008152509250505090565b6060610291610394565b60006102a036600481846106a2565b8101906102ad91906106e8565b905061022d816103cb565b60606102c2610394565b60006102cc6101b7565b604080516001600160a01b03831660208201529192500160405160208183030381529060405291505090565b6060610302610394565b60006102cc610422565b610177610317610422565b610431565b6060600080856001600160a01b0316856040516103399190610807565b600060405180830381855af49150503d8060008114610374576040519150601f19603f3d011682016040523d82523d6000602084013e610379565b606091505b509150915061038a86838387610455565b9695505050505050565b341561017757600080fd5b6103a8836104d3565b6000825111806103b55750805b156103c6576103c48383610179565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103f46101b7565b604080516001600160a01b03928316815291841660208301520160405180910390a161041f81610513565b50565b600061042c6105bc565b905090565b3660008037600080366000845af43d6000803e808015610450573d6000f35b3d6000fd5b606083156104c15782516104ba576001600160a01b0385163b6104ba5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161015e565b50816104cb565b6104cb83836105e4565b949350505050565b6104dc8161060e565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b0381166105785760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b606482015260840161015e565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6101db565b8151156105f45781518083602001fd5b8060405162461bcd60e51b815260040161015e9190610823565b6001600160a01b0381163b61067b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b606482015260840161015e565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61059b565b600080858511156106b257600080fd5b838611156106bf57600080fd5b5050820193919092039150565b80356001600160a01b03811681146106e357600080fd5b919050565b6000602082840312156106fa57600080fd5b61019e826106cc565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561072c57600080fd5b610735836106cc565b9150602083013567ffffffffffffffff8082111561075257600080fd5b818501915085601f83011261076657600080fd5b81358181111561077857610778610703565b604051601f8201601f19908116603f011681019083821181831017156107a0576107a0610703565b816040528281528860208487010111156107b957600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156107f65781810151838201526020016107de565b838111156103c45750506000910152565b600082516108198184602087016107db565b9190910192915050565b60208152600082518060208401526108428160408501602087016107db565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122012bb4f564f73959a03513dc74fc3c6e40e8386e6f02c16b78d6db00ce0aa16af64736f6c63430008090033", + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000e34fe58dda5b8c6d547e4857e987633aa86a5e90", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9" + } + }, + { + "contractName": "PolygonZkEVMTimelock", + "balance": "0", + "nonce": "1", + "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F", + "bytecode": "0x6080604052600436106101c65760003560e01c806364d62353116100f7578063b1c5f42711610095578063d547741f11610064578063d547741f14610661578063e38335e514610681578063f23a6e6114610694578063f27a0c92146106d957600080fd5b8063b1c5f427146105af578063bc197c81146105cf578063c4d252f514610614578063d45c44351461063457600080fd5b80638f61f4f5116100d15780638f61f4f5146104e157806391d1485414610515578063a217fddf14610566578063b08e51c01461057b57600080fd5b806364d62353146104815780638065657f146104a15780638f2a0bb0146104c157600080fd5b8063248a9ca31161016457806331d507501161013e57806331d50750146103c857806336568abe146103e85780633a6aae7214610408578063584b153e1461046157600080fd5b8063248a9ca3146103475780632ab0f529146103775780632f2ff15d146103a857600080fd5b80630d3cf6fc116101a05780630d3cf6fc1461026b578063134008d31461029f57806313bc9f20146102b2578063150b7a02146102d257600080fd5b806301d5062a146101d257806301ffc9a7146101f457806307bd02651461022957600080fd5b366101cd57005b600080fd5b3480156101de57600080fd5b506101f26101ed366004611c52565b6106ee565b005b34801561020057600080fd5b5061021461020f366004611cc7565b610783565b60405190151581526020015b60405180910390f35b34801561023557600080fd5b5061025d7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b604051908152602001610220565b34801561027757600080fd5b5061025d7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101f26102ad366004611d09565b6107df565b3480156102be57600080fd5b506102146102cd366004611d75565b6108d7565b3480156102de57600080fd5b506103166102ed366004611e9a565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610220565b34801561035357600080fd5b5061025d610362366004611d75565b60009081526020819052604090206001015490565b34801561038357600080fd5b50610214610392366004611d75565b6000908152600160208190526040909120541490565b3480156103b457600080fd5b506101f26103c3366004611f02565b6108fd565b3480156103d457600080fd5b506102146103e3366004611d75565b610927565b3480156103f457600080fd5b506101f2610403366004611f02565b610940565b34801561041457600080fd5b5061043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610220565b34801561046d57600080fd5b5061021461047c366004611d75565b6109f8565b34801561048d57600080fd5b506101f261049c366004611d75565b610a0e565b3480156104ad57600080fd5b5061025d6104bc366004611d09565b610ade565b3480156104cd57600080fd5b506101f26104dc366004611f73565b610b1d565b3480156104ed57600080fd5b5061025d7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052157600080fd5b50610214610530366004611f02565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057257600080fd5b5061025d600081565b34801561058757600080fd5b5061025d7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105bb57600080fd5b5061025d6105ca366004612025565b610d4f565b3480156105db57600080fd5b506103166105ea36600461214e565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062057600080fd5b506101f261062f366004611d75565b610d94565b34801561064057600080fd5b5061025d61064f366004611d75565b60009081526001602052604090205490565b34801561066d57600080fd5b506101f261067c366004611f02565b610e8f565b6101f261068f366004612025565b610eb4565b3480156106a057600080fd5b506103166106af3660046121f8565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b3480156106e557600080fd5b5061025d611161565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc161071881611244565b6000610728898989898989610ade565b90506107348184611251565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610770969594939291906122a6565b60405180910390a3505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107d957506107d98261139e565b92915050565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff1661085c5761085c8133611435565b600061086c888888888888610ade565b905061087881856114ed565b6108848888888861162a565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516108bc94939291906122f1565b60405180910390a36108cd8161172e565b5050505050505050565b6000818152600160205260408120546001811180156108f65750428111155b9392505050565b60008281526020819052604090206001015461091881611244565b61092283836117d7565b505050565b60008181526001602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff811633146109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b6109f482826118c7565b5050565b6000818152600160208190526040822054610939565b333014610a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b00000000000000000000000000000000000000000060648201526084016109e1565b60025460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1600255565b6000868686868686604051602001610afb969594939291906122a6565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b4781611244565b888714610bd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b888514610c65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b6000610c778b8b8b8b8b8b8b8b610d4f565b9050610c838184611251565b60005b8a811015610d415780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc357610cc3612331565b9050602002016020810190610cd89190612360565b8d8d86818110610cea57610cea612331565b905060200201358c8c87818110610d0357610d03612331565b9050602002810190610d15919061237b565b8c8b604051610d29969594939291906122a6565b60405180910390a3610d3a8161240f565b9050610c86565b505050505050505050505050565b60008888888888888888604051602001610d709897969594939291906124f7565b60405160208183030381529060405280519060200120905098975050505050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610dbe81611244565b610dc7826109f8565b610e53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c656400000000000000000000000000000060648201526084016109e1565b6000828152600160205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260208190526040902060010154610eaa81611244565b61092283836118c7565b600080527fdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d70696020527f5ba6852781629bcdcd4bdaa6de76d786f1c64b16acdac474e55bebc0ea157951547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff16610f3157610f318133611435565b878614610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b87841461104f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f746368000000000000000000000000000000000000000000000000000000000060648201526084016109e1565b60006110618a8a8a8a8a8a8a8a610d4f565b905061106d81856114ed565b60005b8981101561114b5760008b8b8381811061108c5761108c612331565b90506020020160208101906110a19190612360565b905060008a8a848181106110b7576110b7612331565b9050602002013590503660008a8a868181106110d5576110d5612331565b90506020028101906110e7919061237b565b915091506110f78484848461162a565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588686868660405161112e94939291906122f1565b60405180910390a350505050806111449061240f565b9050611070565b506111558161172e565b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161580159061123257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166315064c966040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123291906125be565b1561123d5750600090565b5060025490565b61124e8133611435565b50565b61125a82610927565b156112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c6564000000000000000000000000000000000060648201526084016109e1565b6112ef611161565b81101561137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c6179000000000000000000000000000000000000000000000000000060648201526084016109e1565b61138881426125e0565b6000928352600160205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806107d957507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146107d9565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f4576114738161197e565b61147e83602061199d565b60405160200161148f929190612617565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526109e191600401612698565b6114f6826108d7565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b80158061159e5750600081815260016020819052604090912054145b6109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e6379000000000000000000000000000000000000000000000000000060648201526084016109e1565b60008473ffffffffffffffffffffffffffffffffffffffff168484846040516116549291906126e9565b60006040518083038185875af1925050503d8060008114611691576040519150601f19603f3d011682016040523d82523d6000602084013e611696565b606091505b5050905080611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e2072657665727465640000000000000000000000000060648201526084016109e1565b5050505050565b611737816108d7565b6117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f742072656164790000000000000000000000000000000000000000000060648201526084016109e1565b600090815260016020819052604090912055565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556118693390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156109f45760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60606107d973ffffffffffffffffffffffffffffffffffffffff831660145b606060006119ac8360026126f9565b6119b79060026125e0565b67ffffffffffffffff8111156119cf576119cf611d8e565b6040519080825280601f01601f1916602001820160405280156119f9576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a3057611a30612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611a9357611a93612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611acf8460026126f9565b611ada9060016125e0565b90505b6001811115611b77577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b1b57611b1b612331565b1a60f81b828281518110611b3157611b31612331565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611b7081612710565b9050611add565b5083156108f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109e1565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c0457600080fd5b919050565b60008083601f840112611c1b57600080fd5b50813567ffffffffffffffff811115611c3357600080fd5b602083019150836020828501011115611c4b57600080fd5b9250929050565b600080600080600080600060c0888a031215611c6d57600080fd5b611c7688611be0565b965060208801359550604088013567ffffffffffffffff811115611c9957600080fd5b611ca58a828b01611c09565b989b979a50986060810135976080820135975060a09091013595509350505050565b600060208284031215611cd957600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146108f657600080fd5b60008060008060008060a08789031215611d2257600080fd5b611d2b87611be0565b955060208701359450604087013567ffffffffffffffff811115611d4e57600080fd5b611d5a89828a01611c09565b979a9699509760608101359660809091013595509350505050565b600060208284031215611d8757600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e0457611e04611d8e565b604052919050565b600082601f830112611e1d57600080fd5b813567ffffffffffffffff811115611e3757611e37611d8e565b611e6860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611dbd565b818152846020838601011115611e7d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611eb057600080fd5b611eb985611be0565b9350611ec760208601611be0565b925060408501359150606085013567ffffffffffffffff811115611eea57600080fd5b611ef687828801611e0c565b91505092959194509250565b60008060408385031215611f1557600080fd5b82359150611f2560208401611be0565b90509250929050565b60008083601f840112611f4057600080fd5b50813567ffffffffffffffff811115611f5857600080fd5b6020830191508360208260051b8501011115611c4b57600080fd5b600080600080600080600080600060c08a8c031215611f9157600080fd5b893567ffffffffffffffff80821115611fa957600080fd5b611fb58d838e01611f2e565b909b50995060208c0135915080821115611fce57600080fd5b611fda8d838e01611f2e565b909950975060408c0135915080821115611ff357600080fd5b506120008c828d01611f2e565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561204157600080fd5b883567ffffffffffffffff8082111561205957600080fd5b6120658c838d01611f2e565b909a50985060208b013591508082111561207e57600080fd5b61208a8c838d01611f2e565b909850965060408b01359150808211156120a357600080fd5b506120b08b828c01611f2e565b999c989b509699959896976060870135966080013595509350505050565b600082601f8301126120df57600080fd5b8135602067ffffffffffffffff8211156120fb576120fb611d8e565b8160051b61210a828201611dbd565b928352848101820192828101908785111561212457600080fd5b83870192505b848310156121435782358252918301919083019061212a565b979650505050505050565b600080600080600060a0868803121561216657600080fd5b61216f86611be0565b945061217d60208701611be0565b9350604086013567ffffffffffffffff8082111561219a57600080fd5b6121a689838a016120ce565b945060608801359150808211156121bc57600080fd5b6121c889838a016120ce565b935060808801359150808211156121de57600080fd5b506121eb88828901611e0c565b9150509295509295909350565b600080600080600060a0868803121561221057600080fd5b61221986611be0565b945061222760208701611be0565b93506040860135925060608601359150608086013567ffffffffffffffff81111561225157600080fd5b6121eb88828901611e0c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a0604082015260006122dc60a08301868861225d565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061232760608301848661225d565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561237257600080fd5b6108f682611be0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126123b057600080fd5b83018035915067ffffffffffffffff8211156123cb57600080fd5b602001915036819003821315611c4b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612440576124406123e0565b5060010190565b81835260006020808501808196508560051b810191508460005b878110156124ea57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126124a057600080fd5b8701858101903567ffffffffffffffff8111156124bc57600080fd5b8036038213156124cb57600080fd5b6124d686828461225d565b9a87019a9550505090840190600101612461565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b8110156125455773ffffffffffffffffffffffffffffffffffffffff61253084611be0565b1682526020928301929091019060010161250a565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff89111561257e57600080fd5b8860051b9150818a602083013701828103602090810160408501526125a69082018789612447565b60608401959095525050608001529695505050505050565b6000602082840312156125d057600080fd5b815180151581146108f657600080fd5b808201808211156107d9576107d96123e0565b60005b8381101561260e5781810151838201526020016125f6565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161264f8160178501602088016125f3565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161268c8160288401602088016125f3565b01602801949350505050565b60208152600082518060208401526126b78160408501602087016125f3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b8183823760009101908152919050565b80820281158282048414176107d9576107d96123e0565b60008161271f5761271f6123e0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea2646970667358221220c474c39da3523b28ebfa5fd66c05b42d6ddcc4a57055483bdda32888b366016164736f6c63430008140033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000002": "0x0000000000000000000000000000000000000000000000000000000000000e10", + "0xaedcc9e7897c0d335bdc5d92fe3a8b4f23727fe558cd1c19f332b28716a30559": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xf5e61edb9c9cc6bfbae4463e9a2b1dd6ac3b44ddef38f18016e56ba0363910d9": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x64494413541ff93b31aa309254e3fed72a7456e9845988b915b4c7a7ceba8814": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x60b9d94c75b7b3f721925089391e4644cd890cb5e6466f9596dfbd2c54e0b280": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x3412d5605ac6cd444957cedb533e5dacad6378b4bc819ebe3652188a665066d6": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x4b63b79f1e338a49559dcd3193ac9eecc50d0f275d24e97cc8c319e5a31a8bd0": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xdae2aa361dfd1ca020a396615627d436107c35eff9fe7738a3512819782d706a": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5", + "0x800d5dfe4bba53eedee06cd4546a27da8de00f12db83f56062976d4493fda899": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0xc3ad33e20b0c56a223ad5104fff154aa010f8715b9c981fd38fdc60a4d1a52fc": "0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5" + } + }, + { + "accountName": "keyless Deployer", + "balance": "0", + "nonce": "1", + "address": "0x28BB4e66addE1f042B77E04cf7D3784C1dcDBbA3" + }, + { + "accountName": "deployer", + "balance": "100000000000000000000000", + "nonce": "8", + "address": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + } + ] + } \ No newline at end of file diff --git a/test/config/test.prover.config.json b/test/config/test.prover.config.json new file mode 100644 index 00000000..810ddce6 --- /dev/null +++ b/test/config/test.prover.config.json @@ -0,0 +1,93 @@ +{ + "runExecutorServer": false, + "runExecutorClient": false, + "runExecutorClientMultithread": false, + + "runHashDBServer": false, + "runHashDBTest": false, + + "runAggregatorServer": false, + "runAggregatorClient": true, + "runAggregatorClientMock": false, + "aggregatorClientMockTimeout": 1, + "proverName": "stateless-prover-test", + + "runFileGenBatchProof": false, + "runFileGenAggregatedProof": false, + "runFileGenFinalProof": false, + "runFileProcessBatch": false, + "runFileProcessBatchMultithread": false, + + "runKeccakScriptGenerator": false, + "runKeccakTest": false, + "runStorageSMTest": false, + "runBinarySMTest": false, + "runMemAlignSMTest": false, + "runSHA256Test": false, + "runBlakeTest": false, + + "executeInParallel": true, + "useMainExecGenerated": true, + "saveRequestToFile": false, + "saveInputToFile": false, + "saveDbReadsToFile": false, + "saveDbReadsToFileOnChange": false, + "saveOutputToFile": true, + "saveProofToFile": true, + "saveResponseToFile": false, + "loadDBToMemCache": true, + "opcodeTracer": false, + "logRemoteDbReads": false, + "logExecutorServerResponses": false, + + "proverServerPort": 50051, + "proverServerMockPort": 50052, + "proverServerMockTimeout": 10000000, + "proverClientPort": 50051, + "proverClientHost": "127.0.0.1", + + "executorServerPort": 50071, + "executorROMLineTraces": false, + "executorClientPort": 50071, + "executorClientHost": "127.0.0.1", + + "hashDBServerPort": 50061, + "hashDBURL": "local", + + "aggregatorServerPort": 50081, + "aggregatorClientPort": 50081, + "aggregatorClientHost": "zkevm-aggregator", + "aggregatorClientWatchdogTimeout": 120000000, + + "mapConstPolsFile": false, + "mapConstantsTreeFile": false, + + "inputFile": "input_executor_0.json", + "inputFile2": "input_executor_1.json", + + "keccakScriptFile": "config/scripts/keccak_script.json", + "storageRomFile": "config/scripts/storage_sm_rom.json", + + "outputPath": "output", + "configPath": "config", + + "databaseURL": "local", + "dbNodesTableName": "state.nodes", + "dbProgramTableName": "state.program", + "dbMultiWrite": true, + "dbFlushInParallel": false, + "dbMTCacheSize": 1024, + "dbProgramCacheSize": 512, + "dbNumberOfPoolConnections": 30, + "dbGetTree": true, + "cleanerPollingPeriod": 600, + "requestsPersistence": 3600, + "maxExecutorThreads": 256, + "maxProverThreads": 8, + "maxHashDBThreads": 256, + "ECRecoverPrecalc": false, + "ECRecoverPrecalcNThreads": 32, + "stateManager": true, + "useAssociativeCache" : false, + "jsonLogs": false +} \ No newline at end of file diff --git a/test/contracts/abi/claimmock.abi b/test/contracts/abi/claimmock.abi new file mode 100644 index 00000000..0fd2ea8e --- /dev/null +++ b/test/contracts/abi/claimmock.abi @@ -0,0 +1 @@ +[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"globalIndex","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"originNetwork","type":"uint32"},{"indexed":false,"internalType":"address","name":"originAddress","type":"address"},{"indexed":false,"internalType":"address","name":"destinationAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimEvent","type":"event"},{"inputs":[{"internalType":"bytes32[32]","name":"smtProofLocalExitRoot","type":"bytes32[32]"},{"internalType":"bytes32[32]","name":"smtProofRollupExitRoot","type":"bytes32[32]"},{"internalType":"uint256","name":"globalIndex","type":"uint256"},{"internalType":"bytes32","name":"mainnetExitRoot","type":"bytes32"},{"internalType":"bytes32","name":"rollupExitRoot","type":"bytes32"},{"internalType":"uint32","name":"originNetwork","type":"uint32"},{"internalType":"address","name":"originTokenAddress","type":"address"},{"internalType":"uint32","name":"destinationNetwork","type":"uint32"},{"internalType":"address","name":"destinationAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"claimAsset","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[32]","name":"smtProofLocalExitRoot","type":"bytes32[32]"},{"internalType":"bytes32[32]","name":"smtProofRollupExitRoot","type":"bytes32[32]"},{"internalType":"uint256","name":"globalIndex","type":"uint256"},{"internalType":"bytes32","name":"mainnetExitRoot","type":"bytes32"},{"internalType":"bytes32","name":"rollupExitRoot","type":"bytes32"},{"internalType":"uint32","name":"originNetwork","type":"uint32"},{"internalType":"address","name":"originAddress","type":"address"},{"internalType":"uint32","name":"destinationNetwork","type":"uint32"},{"internalType":"address","name":"destinationAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"claimMessage","outputs":[],"stateMutability":"payable","type":"function"}] \ No newline at end of file diff --git a/test/contracts/abi/claimmockcaller.abi b/test/contracts/abi/claimmockcaller.abi new file mode 100644 index 00000000..21bf6ebc --- /dev/null +++ b/test/contracts/abi/claimmockcaller.abi @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"contract IClaimMock","name":"_claimMock","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes","name":"claim1","type":"bytes"},{"internalType":"bytes","name":"claim2","type":"bytes"},{"internalType":"bool[2]","name":"reverted","type":"bool[2]"}],"name":"claim2Bytes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[32]","name":"smtProofLocalExitRoot","type":"bytes32[32]"},{"internalType":"bytes32[32]","name":"smtProofRollupExitRoot","type":"bytes32[32]"},{"internalType":"uint256","name":"globalIndex","type":"uint256"},{"internalType":"bytes32","name":"mainnetExitRoot","type":"bytes32"},{"internalType":"bytes32","name":"rollupExitRoot","type":"bytes32"},{"internalType":"uint32","name":"originNetwork","type":"uint32"},{"internalType":"address","name":"originTokenAddress","type":"address"},{"internalType":"uint32","name":"destinationNetwork","type":"uint32"},{"internalType":"address","name":"destinationAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bool","name":"reverted","type":"bool"}],"name":"claimAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claim","type":"bytes"},{"internalType":"bool","name":"reverted","type":"bool"}],"name":"claimBytes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[32]","name":"smtProofLocalExitRoot","type":"bytes32[32]"},{"internalType":"bytes32[32]","name":"smtProofRollupExitRoot","type":"bytes32[32]"},{"internalType":"uint256","name":"globalIndex","type":"uint256"},{"internalType":"bytes32","name":"mainnetExitRoot","type":"bytes32"},{"internalType":"bytes32","name":"rollupExitRoot","type":"bytes32"},{"internalType":"uint32","name":"originNetwork","type":"uint32"},{"internalType":"address","name":"originAddress","type":"address"},{"internalType":"uint32","name":"destinationNetwork","type":"uint32"},{"internalType":"address","name":"destinationAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bool","name":"reverted","type":"bool"}],"name":"claimMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimMock","outputs":[{"internalType":"contract IClaimMock","name":"","type":"address"}],"stateMutability":"view","type":"function"}] \ No newline at end of file diff --git a/test/contracts/abi/claimmocktest.abi b/test/contracts/abi/claimmocktest.abi new file mode 100644 index 00000000..14e67686 --- /dev/null +++ b/test/contracts/abi/claimmocktest.abi @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"contract IClaimMock","name":"_claimMock","type":"address"},{"internalType":"contract IClaimMockCaller","name":"_claimMockCaller","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes","name":"claim1","type":"bytes"},{"internalType":"bytes","name":"claim2","type":"bytes"},{"internalType":"bool[2]","name":"reverted","type":"bool[2]"}],"name":"claim2TestInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"claim1","type":"bytes"},{"internalType":"bytes","name":"claim2","type":"bytes"},{"internalType":"bytes","name":"claim3","type":"bytes"},{"internalType":"bool[3]","name":"reverted","type":"bool[3]"}],"name":"claim3TestInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimMock","outputs":[{"internalType":"contract IClaimMock","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimMockCaller","outputs":[{"internalType":"contract IClaimMockCaller","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"claim","type":"bytes"},{"internalType":"bool","name":"reverted","type":"bool"}],"name":"claimTestInternal","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/test/contracts/abi/erc1967proxy.abi b/test/contracts/abi/erc1967proxy.abi new file mode 100644 index 00000000..f676814a --- /dev/null +++ b/test/contracts/abi/erc1967proxy.abi @@ -0,0 +1,71 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] \ No newline at end of file diff --git a/test/contracts/abi/verifybatchesmock.abi b/test/contracts/abi/verifybatchesmock.abi new file mode 100644 index 00000000..176fb78b --- /dev/null +++ b/test/contracts/abi/verifybatchesmock.abi @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"contract IPolygonZkEVMGlobalExitRootV2","name":"_globalExitRootManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"rollupID","type":"uint32"},{"indexed":false,"internalType":"uint64","name":"numBatch","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"exitRoot","type":"bytes32"},{"indexed":true,"internalType":"address","name":"aggregator","type":"address"}],"name":"VerifyBatches","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"rollupID","type":"uint32"},{"indexed":false,"internalType":"uint64","name":"numBatch","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"exitRoot","type":"bytes32"},{"indexed":true,"internalType":"address","name":"aggregator","type":"address"}],"name":"VerifyBatchesTrustedAggregator","type":"event"},{"inputs":[],"name":"getRollupExitRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalExitRootManager","outputs":[{"internalType":"contract IPolygonZkEVMGlobalExitRootV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rollupCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"rollupID","type":"uint32"}],"name":"rollupIDToLastExitRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"rollupID","type":"uint32"},{"internalType":"uint64","name":"finalNewBatch","type":"uint64"},{"internalType":"bytes32","name":"newLocalExitRoot","type":"bytes32"},{"internalType":"bytes32","name":"newStateRoot","type":"bytes32"},{"internalType":"bool","name":"updateGER","type":"bool"}],"name":"verifyBatches","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"rollupID","type":"uint32"},{"internalType":"uint64","name":"finalNewBatch","type":"uint64"},{"internalType":"bytes32","name":"newLocalExitRoot","type":"bytes32"},{"internalType":"bytes32","name":"newStateRoot","type":"bytes32"},{"internalType":"bool","name":"updateGER","type":"bool"}],"name":"verifyBatchesTrustedAggregator","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file diff --git a/test/contracts/bin/claimmock.bin b/test/contracts/bin/claimmock.bin new file mode 100644 index 00000000..006fd65c --- /dev/null +++ b/test/contracts/bin/claimmock.bin @@ -0,0 +1 @@ +6080806040523461001657610227908161001c8239f35b600080fdfe608080604052600436101561001357600080fd5b600090813560e01c908163ccaa2d11146100b5575063f5efcd791461003757600080fd5b6100403661012f565b5050945097505092509350600134146100b1576040805193845263ffffffff9490941660208401526001600160a01b039182169383019390935292909216606083015260808201527f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9060a090a180f35b8580fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d91508061011e6100e53661012f565b5050968b5263ffffffff90931660208b0152506001600160a01b0390811660408a015216606088015250506080850152505060a0820190565b0390a16001341461012c5780f35b80fd5b906109206003198301126101ec57610404908282116101ec57600492610804928184116101ec579235916108243591610844359163ffffffff906108643582811681036101ec57926001600160a01b03916108843583811681036101ec57936108a43590811681036101ec57926108c43590811681036101ec57916108e435916109043567ffffffffffffffff928382116101ec57806023830112156101ec57818e01359384116101ec57602484830101116101ec576024019190565b600080fdfea2646970667358221220360ea7019315ab59618e13d469f48b1816436744772ab76ff89153af49fb746a64736f6c63430008120033 \ No newline at end of file diff --git a/test/contracts/bin/claimmockcaller.bin b/test/contracts/bin/claimmockcaller.bin new file mode 100644 index 00000000..47d3dcdd --- /dev/null +++ b/test/contracts/bin/claimmockcaller.bin @@ -0,0 +1 @@ +60a03461008557601f61063738819003918201601f19168301916001600160401b0383118484101761008a5780849260209460405283398101031261008557516001600160a01b03811681036100855760805260405161059690816100a1823960805181818160d4015281816103bc01528181610407015281816104b701526104f80152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c90816301beea651461006a575080631cf865cf1461006557806327e358431461006057806383f5b0061461005b5763a51061701461005657600080fd5b610436565b6103f1565b61036a565b6102d0565b3461010b57806020610aac608083610081366101a0565b929b939a949995989697969594939291506101029050575b63f5efcd7960e01b8c5260a00135610124528a013561050452610884526108a4526108c4526108e452610904526109245261094452610964527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af15080f35b60019a50610099565b80fd5b6108a4359063ffffffff8216820361012257565b600080fd5b61088435906001600160a01b038216820361012257565b6108c435906001600160a01b038216820361012257565b9181601f840112156101225782359167ffffffffffffffff8311610122576020838186019501011161012257565b6109243590811515820361012257565b3590811515820361012257565b906109406003198301126101225761040490828211610122576004926108049281841161012257923591610824359161084435916108643563ffffffff8116810361012257916101ee610127565b916101f761010e565b9161020061013e565b916108e43591610904359067ffffffffffffffff821161012257610225918d01610155565b909161022f610183565b90565b634e487b7160e01b600052604160045260246000fd5b604051906040820182811067ffffffffffffffff82111761026857604052565b610232565b81601f820112156101225780359067ffffffffffffffff928383116102685760405193601f8401601f19908116603f0116850190811185821017610268576040528284526020838301011161012257816000926020809301838601378301015290565b346101225760803660031901126101225767ffffffffffffffff6004358181116101225761030290369060040161026d565b906024359081116101225761031b90369060040161026d565b9036606312156101225761032d610248565b9182916084368111610122576044945b81861061035257505061035093506104ec565b005b6020809161035f88610193565b81520195019461033d565b346101225760403660031901126101225760043567ffffffffffffffff81116101225761039b90369060040161026d565b602435801515810361012257610aac60209160009384916103e8575b8301907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1005b600191506103b7565b34610122576000366003190112610122576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101225760006020610aac61044b366101a0565b9a9150508d989198979297969396959495996104e3575b60405163ccaa2d1160e01b815260a09b909b013560a48c0152608001356104848b01526108048a01526108248901526108448801526108648701526108848601526108a48501526108c48401526108e48301527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1005b60019950610462565b825160009360209384937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316938793929190610557575b858893015161054e575b858891819495610aac9889920190885af15001915af150565b60019250610535565b6001935061052b56fea2646970667358221220bbde05c8a8245c4319ff8aa0ce8d95e6c5dd5c5828fe085ba1491ea451b390ba64736f6c63430008120033 \ No newline at end of file diff --git a/test/contracts/bin/claimmocktest.bin b/test/contracts/bin/claimmocktest.bin new file mode 100644 index 00000000..6bb6d170 --- /dev/null +++ b/test/contracts/bin/claimmocktest.bin @@ -0,0 +1 @@ +60c0346100a157601f61072e38819003918201601f19168301916001600160401b038311848410176100a65780849260409485528339810103126100a15780516001600160a01b039182821682036100a1576020015191821682036100a15760a05260805260405161067190816100bd82396080518181816102d5015281816103870152818161046a015261054e015260a05181818161031a01526105c20152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c90816348f0c6801461006a575080636e53085414610065578063837a84701461006057806383f5b0061461005b57639bee34681461005657600080fd5b610349565b610304565b6102bf565b610217565b346100f45760c03660031901126100f45767ffffffffffffffff6004358181116100f05761009c903690600401610142565b6024358281116100ec576100b4903690600401610142565b916044359081116100ec576100cd903690600401610142565b36608312156100ec576100e9926100e3366101c6565b92610533565b80f35b8380fd5b8280fd5b80fd5b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff811161012157604052565b6100f7565b6040810190811067ffffffffffffffff82111761012157604052565b81601f820112156101a55780359067ffffffffffffffff928383116101215760405193601f8401601f19908116603f011685019081118582101761012157604052828452602083830101116101a557816000926020809301838601378301015290565b600080fd5b6024359081151582036101a557565b359081151582036101a557565b90604051916060830183811067ffffffffffffffff821117610121576040528260c49182116101a5576064905b8282106101ff57505050565b6020809161020c846101b9565b8152019101906101f3565b346101a55760803660031901126101a55767ffffffffffffffff6004358181116101a557610249903690600401610142565b906024359081116101a557610262903690600401610142565b36606312156101a5576040519061027882610126565b819260843681116101a5576044945b81861061029c57505061029a9350610467565b005b602080916102a9886101b9565b815201950194610287565b60009103126101a557565b346101a55760003660031901126101a5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101a55760003660031901126101a5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101a557600060403660031901126100f45760043567ffffffffffffffff81116103f75761037c903690600401610142565b816103856101aa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156100f0576103d793836040518096819582946327e3584360e01b84526004840161043b565b03925af180156103f2576103e9575080f35b6100e99061010d565b61045b565b5080fd5b919082519283825260005b848110610427575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610406565b906104536020919493946040845260408401906103fb565b931515910152565b6040513d6000823e3d90fd5b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b156101a557604051631cf865cf60e01b815260806004820152938492916104d6916104c49060848601906103fb565b848103600319016024860152906103fb565b90600090604484015b60028310610517575050509181600081819503925af180156103f2576105025750565b8061050f6105159261010d565b806102b4565b565b81511515815286945060019290920191602091820191016104df565b91926000906020810151610632575b80516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169490911515853b156101a557600061059d91604051809381926327e3584360e01b9b8c84526004840161043b565b0381838a5af19283156103f25760409560208094610aac9460009761061f575b5001917f0000000000000000000000000000000000000000000000000000000000000000165af1500151151590803b156101a55761060e93600080946040519687958694859384526004840161043b565b03925af180156103f2576105025750565b8061050f61062c9261010d565b386105bd565b6001915061054256fea264697066735822122091357ca0b4807d5579dc633a7d2a9263efbfe31944c644c21b7ccf83594a9e2c64736f6c63430008120033 \ No newline at end of file diff --git a/test/contracts/bin/erc1967proxy.bin b/test/contracts/bin/erc1967proxy.bin new file mode 100644 index 00000000..d81a2e24 --- /dev/null +++ b/test/contracts/bin/erc1967proxy.bin @@ -0,0 +1 @@ +60806040526040516104ee3803806104ee833981016040819052610022916102de565b61002e82826000610035565b50506103fb565b61003e83610061565b60008251118061004b5750805b1561005c5761005a83836100a1565b505b505050565b61006a816100cd565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100c683836040518060600160405280602781526020016104c760279139610180565b9392505050565b6001600160a01b0381163b61013f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080856001600160a01b03168560405161019d91906103ac565b600060405180830381855af49150503d80600081146101d8576040519150601f19603f3d011682016040523d82523d6000602084013e6101dd565b606091505b5090925090506101ef868383876101f9565b9695505050505050565b60608315610268578251600003610261576001600160a01b0385163b6102615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610136565b5081610272565b610272838361027a565b949350505050565b81511561028a5781518083602001fd5b8060405162461bcd60e51b815260040161013691906103c8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156102d55781810151838201526020016102bd565b50506000910152565b600080604083850312156102f157600080fd5b82516001600160a01b038116811461030857600080fd5b60208401519092506001600160401b038082111561032557600080fd5b818501915085601f83011261033957600080fd5b81518181111561034b5761034b6102a4565b604051601f8201601f19908116603f01168101908382118183101715610373576103736102a4565b8160405282815288602084870101111561038c57600080fd5b61039d8360208301602088016102ba565b80955050505050509250929050565b600082516103be8184602087016102ba565b9190910192915050565b60208152600082518060208401526103e78160408501602087016102ba565b601f01601f19169190910160400192915050565b60be806104096000396000f3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6065565b565b600060607f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156083573d6000f35b3d6000fdfea2646970667358221220ffbfbaa210c1b5f5ca62a5eba67b7d993e0bdf919f51500f790fb7acf2fd784c64736f6c63430008140033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564 \ No newline at end of file diff --git a/test/contracts/bin/verifybatchesmock.bin b/test/contracts/bin/verifybatchesmock.bin new file mode 100644 index 00000000..fd4e6d15 --- /dev/null +++ b/test/contracts/bin/verifybatchesmock.bin @@ -0,0 +1 @@ +60a060405234801561001057600080fd5b5060405161097138038061097183398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516108d96100986000396000818160bc01528181610178015261062e01526108d96000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80630680cf5c1461006757806343955dd31461009a578063a2967d99146100af578063d02103ca146100b7578063db3abdb9146100f6578063f4e9267514610109575b600080fd5b61008761007536600461071f565b60016020526000908152604090205481565b6040519081526020015b60405180910390f35b6100ad6100a8366004610741565b61012e565b005b61008761025b565b6100de7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610091565b6100ad610104366004610741565b6105e4565b6000546101199063ffffffff1681565b60405163ffffffff9091168152602001610091565b60005463ffffffff9081169086161115610158576000805463ffffffff191663ffffffff87161790555b63ffffffff8516600090815260016020526040902083905580156101fe577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6101ad61025b565b6040518263ffffffff1660e01b81526004016101cb91815260200190565b600060405180830381600087803b1580156101e557600080fd5b505af11580156101f9573d6000803e3d6000fd5b505050505b6040805167ffffffffffffffff8616815260208101849052908101849052339063ffffffff8716907fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3906060015b60405180910390a35050505050565b6000805463ffffffff1680820361027457506000919050565b60008167ffffffffffffffff81111561028f5761028f6107b0565b6040519080825280602002602001820160405280156102b8578160200160208202803683370190505b50905060005b8281101561031e57600160006102d483836107dc565b63ffffffff1663ffffffff16815260200190815260200160002054828281518110610301576103016107f5565b6020908102919091010152806103168161080b565b9150506102be565b50600060205b8360011461054857600061033960028661083a565b61034460028761084e565b61034e91906107dc565b905060008167ffffffffffffffff81111561036b5761036b6107b0565b604051908082528060200260200182016040528015610394578160200160208202803683370190505b50905060005b828110156104f8576103ad600184610862565b811480156103c557506103c160028861083a565b6001145b1561044257856103d6826002610875565b815181106103e6576103e66107f5565b602002602001015185604051602001610409929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110610431576104316107f5565b6020026020010181815250506104e6565b8561044e826002610875565b8151811061045e5761045e6107f5565b6020026020010151868260026104749190610875565b61047f9060016107dc565b8151811061048f5761048f6107f5565b60200260200101516040516020016104b1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106104d9576104d96107f5565b6020026020010181815250505b806104f08161080b565b91505061039a565b50809450819550838460405160200161051b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828061053e9061088c565b9350505050610324565b60008360008151811061055d5761055d6107f5565b6020026020010151905060005b828110156105da57604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806105d29061080b565b91505061056a565b5095945050505050565b60005463ffffffff908116908616111561060e576000805463ffffffff191663ffffffff87161790555b63ffffffff8516600090815260016020526040902083905580156106b4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d61066361025b565b6040518263ffffffff1660e01b815260040161068191815260200190565b600060405180830381600087803b15801561069b57600080fd5b505af11580156106af573d6000803e3d6000fd5b505050505b6040805167ffffffffffffffff8616815260208101849052908101849052339063ffffffff8716907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600161024c565b803563ffffffff8116811461071a57600080fd5b919050565b60006020828403121561073157600080fd5b61073a82610706565b9392505050565b600080600080600060a0868803121561075957600080fd5b61076286610706565b9450602086013567ffffffffffffffff8116811461077f57600080fd5b93506040860135925060608601359150608086013580151581146107a257600080fd5b809150509295509295909350565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156107ef576107ef6107c6565b92915050565b634e487b7160e01b600052603260045260246000fd5b60006001820161081d5761081d6107c6565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261084957610849610824565b500690565b60008261085d5761085d610824565b500490565b818103818111156107ef576107ef6107c6565b80820281158282048414176107ef576107ef6107c6565b60008161089b5761089b6107c6565b50600019019056fea26469706673582212204b504ae2d3686f35f611e3ef5bc38d1f2d64ce4fea28c7a2a657dbe4ba6178ce64736f6c63430008120033 \ No newline at end of file diff --git a/test/contracts/bind.sh b/test/contracts/bind.sh new file mode 100755 index 00000000..25ddd782 --- /dev/null +++ b/test/contracts/bind.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e + +gen() { + local package=$1 + + abigen --bin bin/${package}.bin --abi abi/${package}.abi --pkg=${package} --out=${package}/${package}.go +} + +gen verifybatchesmock +gen claimmock +gen claimmockcaller +gen claimmocktest \ No newline at end of file diff --git a/test/contracts/claimmock/ClaimMock.sol b/test/contracts/claimmock/ClaimMock.sol new file mode 100644 index 00000000..adcea4fe --- /dev/null +++ b/test/contracts/claimmock/ClaimMock.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.18; + +contract ClaimMock { + uint8 constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; + + event ClaimEvent( + uint256 globalIndex, + uint32 originNetwork, + address originAddress, + address destinationAddress, + uint256 amount + ); + + function claimAsset( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external payable { + emit ClaimEvent( + globalIndex, + originNetwork, + originTokenAddress, + destinationAddress, + amount + ); + if(msg.value == 1) { + revert(); + } + } + + function claimMessage( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata + ) external payable { + if(msg.value == 1) { + revert(); + } + emit ClaimEvent( + globalIndex, + originNetwork, + originAddress, + destinationAddress, + amount + ); + } +} \ No newline at end of file diff --git a/test/contracts/claimmock/claimmock.go b/test/contracts/claimmock/claimmock.go new file mode 100644 index 00000000..49a38546 --- /dev/null +++ b/test/contracts/claimmock/claimmock.go @@ -0,0 +1,383 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package claimmock + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ClaimmockMetaData contains all meta data concerning the Claimmock contract. +var ClaimmockMetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ClaimEvent\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimAsset\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}],\"name\":\"claimMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}]", + Bin: "0x6080806040523461001657610227908161001c8239f35b600080fdfe608080604052600436101561001357600080fd5b600090813560e01c908163ccaa2d11146100b5575063f5efcd791461003757600080fd5b6100403661012f565b5050945097505092509350600134146100b1576040805193845263ffffffff9490941660208401526001600160a01b039182169383019390935292909216606083015260808201527f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d9060a090a180f35b8580fd5b7f1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d91508061011e6100e53661012f565b5050968b5263ffffffff90931660208b0152506001600160a01b0390811660408a015216606088015250506080850152505060a0820190565b0390a16001341461012c5780f35b80fd5b906109206003198301126101ec57610404908282116101ec57600492610804928184116101ec579235916108243591610844359163ffffffff906108643582811681036101ec57926001600160a01b03916108843583811681036101ec57936108a43590811681036101ec57926108c43590811681036101ec57916108e435916109043567ffffffffffffffff928382116101ec57806023830112156101ec57818e01359384116101ec57602484830101116101ec576024019190565b600080fdfea2646970667358221220360ea7019315ab59618e13d469f48b1816436744772ab76ff89153af49fb746a64736f6c63430008120033", +} + +// ClaimmockABI is the input ABI used to generate the binding from. +// Deprecated: Use ClaimmockMetaData.ABI instead. +var ClaimmockABI = ClaimmockMetaData.ABI + +// ClaimmockBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ClaimmockMetaData.Bin instead. +var ClaimmockBin = ClaimmockMetaData.Bin + +// DeployClaimmock deploys a new Ethereum contract, binding an instance of Claimmock to it. +func DeployClaimmock(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Claimmock, error) { + parsed, err := ClaimmockMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ClaimmockBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Claimmock{ClaimmockCaller: ClaimmockCaller{contract: contract}, ClaimmockTransactor: ClaimmockTransactor{contract: contract}, ClaimmockFilterer: ClaimmockFilterer{contract: contract}}, nil +} + +// Claimmock is an auto generated Go binding around an Ethereum contract. +type Claimmock struct { + ClaimmockCaller // Read-only binding to the contract + ClaimmockTransactor // Write-only binding to the contract + ClaimmockFilterer // Log filterer for contract events +} + +// ClaimmockCaller is an auto generated read-only Go binding around an Ethereum contract. +type ClaimmockCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ClaimmockTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ClaimmockTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ClaimmockFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ClaimmockFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ClaimmockSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ClaimmockSession struct { + Contract *Claimmock // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ClaimmockCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ClaimmockCallerSession struct { + Contract *ClaimmockCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ClaimmockTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ClaimmockTransactorSession struct { + Contract *ClaimmockTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ClaimmockRaw is an auto generated low-level Go binding around an Ethereum contract. +type ClaimmockRaw struct { + Contract *Claimmock // Generic contract binding to access the raw methods on +} + +// ClaimmockCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ClaimmockCallerRaw struct { + Contract *ClaimmockCaller // Generic read-only contract binding to access the raw methods on +} + +// ClaimmockTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ClaimmockTransactorRaw struct { + Contract *ClaimmockTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewClaimmock creates a new instance of Claimmock, bound to a specific deployed contract. +func NewClaimmock(address common.Address, backend bind.ContractBackend) (*Claimmock, error) { + contract, err := bindClaimmock(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Claimmock{ClaimmockCaller: ClaimmockCaller{contract: contract}, ClaimmockTransactor: ClaimmockTransactor{contract: contract}, ClaimmockFilterer: ClaimmockFilterer{contract: contract}}, nil +} + +// NewClaimmockCaller creates a new read-only instance of Claimmock, bound to a specific deployed contract. +func NewClaimmockCaller(address common.Address, caller bind.ContractCaller) (*ClaimmockCaller, error) { + contract, err := bindClaimmock(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ClaimmockCaller{contract: contract}, nil +} + +// NewClaimmockTransactor creates a new write-only instance of Claimmock, bound to a specific deployed contract. +func NewClaimmockTransactor(address common.Address, transactor bind.ContractTransactor) (*ClaimmockTransactor, error) { + contract, err := bindClaimmock(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ClaimmockTransactor{contract: contract}, nil +} + +// NewClaimmockFilterer creates a new log filterer instance of Claimmock, bound to a specific deployed contract. +func NewClaimmockFilterer(address common.Address, filterer bind.ContractFilterer) (*ClaimmockFilterer, error) { + contract, err := bindClaimmock(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ClaimmockFilterer{contract: contract}, nil +} + +// bindClaimmock binds a generic wrapper to an already deployed contract. +func bindClaimmock(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ClaimmockMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Claimmock *ClaimmockRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Claimmock.Contract.ClaimmockCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Claimmock *ClaimmockRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Claimmock.Contract.ClaimmockTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Claimmock *ClaimmockRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Claimmock.Contract.ClaimmockTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Claimmock *ClaimmockCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Claimmock.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Claimmock *ClaimmockTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Claimmock.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Claimmock *ClaimmockTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Claimmock.Contract.contract.Transact(opts, method, params...) +} + +// ClaimAsset is a paid mutator transaction binding the contract method 0xccaa2d11. +// +// Solidity: function claimAsset(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) payable returns() +func (_Claimmock *ClaimmockTransactor) ClaimAsset(opts *bind.TransactOpts, smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Claimmock.contract.Transact(opts, "claimAsset", smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimAsset is a paid mutator transaction binding the contract method 0xccaa2d11. +// +// Solidity: function claimAsset(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) payable returns() +func (_Claimmock *ClaimmockSession) ClaimAsset(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Claimmock.Contract.ClaimAsset(&_Claimmock.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimAsset is a paid mutator transaction binding the contract method 0xccaa2d11. +// +// Solidity: function claimAsset(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) payable returns() +func (_Claimmock *ClaimmockTransactorSession) ClaimAsset(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Claimmock.Contract.ClaimAsset(&_Claimmock.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimMessage is a paid mutator transaction binding the contract method 0xf5efcd79. +// +// Solidity: function claimMessage(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) payable returns() +func (_Claimmock *ClaimmockTransactor) ClaimMessage(opts *bind.TransactOpts, smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Claimmock.contract.Transact(opts, "claimMessage", smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimMessage is a paid mutator transaction binding the contract method 0xf5efcd79. +// +// Solidity: function claimMessage(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) payable returns() +func (_Claimmock *ClaimmockSession) ClaimMessage(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Claimmock.Contract.ClaimMessage(&_Claimmock.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimMessage is a paid mutator transaction binding the contract method 0xf5efcd79. +// +// Solidity: function claimMessage(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata) payable returns() +func (_Claimmock *ClaimmockTransactorSession) ClaimMessage(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte) (*types.Transaction, error) { + return _Claimmock.Contract.ClaimMessage(&_Claimmock.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata) +} + +// ClaimmockClaimEventIterator is returned from FilterClaimEvent and is used to iterate over the raw logs and unpacked data for ClaimEvent events raised by the Claimmock contract. +type ClaimmockClaimEventIterator struct { + Event *ClaimmockClaimEvent // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ClaimmockClaimEventIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ClaimmockClaimEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ClaimmockClaimEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ClaimmockClaimEventIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ClaimmockClaimEventIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ClaimmockClaimEvent represents a ClaimEvent event raised by the Claimmock contract. +type ClaimmockClaimEvent struct { + GlobalIndex *big.Int + OriginNetwork uint32 + OriginAddress common.Address + DestinationAddress common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterClaimEvent is a free log retrieval operation binding the contract event 0x1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d. +// +// Solidity: event ClaimEvent(uint256 globalIndex, uint32 originNetwork, address originAddress, address destinationAddress, uint256 amount) +func (_Claimmock *ClaimmockFilterer) FilterClaimEvent(opts *bind.FilterOpts) (*ClaimmockClaimEventIterator, error) { + + logs, sub, err := _Claimmock.contract.FilterLogs(opts, "ClaimEvent") + if err != nil { + return nil, err + } + return &ClaimmockClaimEventIterator{contract: _Claimmock.contract, event: "ClaimEvent", logs: logs, sub: sub}, nil +} + +// WatchClaimEvent is a free log subscription operation binding the contract event 0x1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d. +// +// Solidity: event ClaimEvent(uint256 globalIndex, uint32 originNetwork, address originAddress, address destinationAddress, uint256 amount) +func (_Claimmock *ClaimmockFilterer) WatchClaimEvent(opts *bind.WatchOpts, sink chan<- *ClaimmockClaimEvent) (event.Subscription, error) { + + logs, sub, err := _Claimmock.contract.WatchLogs(opts, "ClaimEvent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ClaimmockClaimEvent) + if err := _Claimmock.contract.UnpackLog(event, "ClaimEvent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseClaimEvent is a log parse operation binding the contract event 0x1df3f2a973a00d6635911755c260704e95e8a5876997546798770f76396fda4d. +// +// Solidity: event ClaimEvent(uint256 globalIndex, uint32 originNetwork, address originAddress, address destinationAddress, uint256 amount) +func (_Claimmock *ClaimmockFilterer) ParseClaimEvent(log types.Log) (*ClaimmockClaimEvent, error) { + event := new(ClaimmockClaimEvent) + if err := _Claimmock.contract.UnpackLog(event, "ClaimEvent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/test/contracts/claimmockcaller/ClaimMockCaller.sol b/test/contracts/claimmockcaller/ClaimMockCaller.sol new file mode 100644 index 00000000..5f82003e --- /dev/null +++ b/test/contracts/claimmockcaller/ClaimMockCaller.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.18; + + +interface IClaimMock { + function claimAsset(bytes32[32] calldata smtProofLocalExitRoot,bytes32[32] calldata smtProofRollupExitRoot,uint256 globalIndex,bytes32 mainnetExitRoot,bytes32 rollupExitRoot,uint32 originNetwork,address originTokenAddress,uint32 destinationNetwork,address destinationAddress,uint256 amount,bytes calldata metadata) external; + function claimMessage(bytes32[32] calldata smtProofLocalExitRoot,bytes32[32] calldata smtProofRollupExitRoot,uint256 globalIndex,bytes32 mainnetExitRoot,bytes32 rollupExitRoot,uint32 originNetwork,address originAddress,uint32 destinationNetwork,address destinationAddress,uint256 amount,bytes calldata metadata) external; +} + +contract ClaimMockCaller { + IClaimMock public immutable claimMock; + uint8 constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; + + constructor( + IClaimMock _claimMock + ) { + claimMock = _claimMock; + } + + function claimAsset( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originTokenAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata, + bool reverted + ) external { + address addr = address(claimMock); + uint256 value = 0; + if(reverted) { + value = 1; + } + bytes4 argSig = bytes4(keccak256("claimAsset(bytes32[32],bytes32[32],uint256,bytes32,bytes32,uint32,address,uint32,address,uint256,bytes)")); + bytes32 value1 = smtProofLocalExitRoot[5]; + bytes32 value2 = smtProofRollupExitRoot[4]; + assembly { + let x := mload(0x40) //Find empty storage location using "free memory pointer" + mstore(x,argSig) + mstore(add(x,164),value1) + mstore(add(x,1156),value2) + mstore(add(x,2052),globalIndex) + mstore(add(x,2084),mainnetExitRoot) + mstore(add(x,2116),rollupExitRoot) + mstore(add(x,2148),originNetwork) + mstore(add(x,2180),originTokenAddress) + mstore(add(x,2212),destinationNetwork) + mstore(add(x,2244),destinationAddress) + mstore(add(x,2276),amount) + let success := call(gas(), addr, value, x, 0xaac, 0x20, 0) + } + } + + function claimMessage( + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofLocalExitRoot, + bytes32[_DEPOSIT_CONTRACT_TREE_DEPTH] calldata smtProofRollupExitRoot, + uint256 globalIndex, + bytes32 mainnetExitRoot, + bytes32 rollupExitRoot, + uint32 originNetwork, + address originAddress, + uint32 destinationNetwork, + address destinationAddress, + uint256 amount, + bytes calldata metadata, + bool reverted + ) external { + address addr = address(claimMock); + uint256 value = 0; + if(reverted) { + value = 1; + } + bytes4 argSig = bytes4(keccak256("claimMessage(bytes32[32],bytes32[32],uint256,bytes32,bytes32,uint32,address,uint32,address,uint256,bytes)")); + bytes32 value1 = smtProofLocalExitRoot[5]; + bytes32 value2 = smtProofRollupExitRoot[4]; + assembly { + let x := mload(0x40) //Find empty storage location using "free memory pointer" + mstore(x,argSig) + mstore(add(x,164),value1) + mstore(add(x,1156),value2) + mstore(add(x,2052),globalIndex) + mstore(add(x,2084),mainnetExitRoot) + mstore(add(x,2116),rollupExitRoot) + mstore(add(x,2148),originNetwork) + mstore(add(x,2180),originAddress) + mstore(add(x,2212),destinationNetwork) + mstore(add(x,2244),destinationAddress) + mstore(add(x,2276),amount) + let success := call(gas(), addr, value, x, 0xaac, 0x20, 0) + } + } + + function claimBytes( + bytes memory claim, + bool reverted + ) external { + address addr = address(claimMock); + uint256 value = 0; + if(reverted) { + value = 1; + } + assembly { + let success := call(gas(), addr, value, add(claim, 32), 0xaac, 0x20, 0) + } + } + + function claim2Bytes( + bytes memory claim1, + bytes memory claim2, + bool[2] memory reverted + ) external { + address addr = address(claimMock); + uint256 value1 = 0; + if(reverted[0]) { + value1 = 1; + } + uint256 value2 = 0; + if(reverted[1]) { + value2 = 1; + } + assembly { + let success1 := call(gas(), addr, value1, add(claim1, 32), 0xaac, 0x20, 0) + } + assembly { + let success2 := call(gas(), addr, value2, add(claim2, 32), 0xaac, 0x20, 0) + } + } + +} \ No newline at end of file diff --git a/test/contracts/claimmockcaller/claimmockcaller.go b/test/contracts/claimmockcaller/claimmockcaller.go new file mode 100644 index 00000000..917ce4cc --- /dev/null +++ b/test/contracts/claimmockcaller/claimmockcaller.go @@ -0,0 +1,318 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package claimmockcaller + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ClaimmockcallerMetaData contains all meta data concerning the Claimmockcaller contract. +var ClaimmockcallerMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"contractIClaimMock\",\"name\":\"_claimMock\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claim1\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"claim2\",\"type\":\"bytes\"},{\"internalType\":\"bool[2]\",\"name\":\"reverted\",\"type\":\"bool[2]\"}],\"name\":\"claim2Bytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originTokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"reverted\",\"type\":\"bool\"}],\"name\":\"claimAsset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claim\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"reverted\",\"type\":\"bool\"}],\"name\":\"claimBytes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofLocalExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProofRollupExitRoot\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"globalIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"mainnetExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"rollupExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"originNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"originAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destinationNetwork\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"destinationAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"reverted\",\"type\":\"bool\"}],\"name\":\"claimMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimMock\",\"outputs\":[{\"internalType\":\"contractIClaimMock\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60a03461008557601f61063738819003918201601f19168301916001600160401b0383118484101761008a5780849260209460405283398101031261008557516001600160a01b03811681036100855760805260405161059690816100a1823960805181818160d4015281816103bc01528181610407015281816104b701526104f80152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c90816301beea651461006a575080631cf865cf1461006557806327e358431461006057806383f5b0061461005b5763a51061701461005657600080fd5b610436565b6103f1565b61036a565b6102d0565b3461010b57806020610aac608083610081366101a0565b929b939a949995989697969594939291506101029050575b63f5efcd7960e01b8c5260a00135610124528a013561050452610884526108a4526108c4526108e452610904526109245261094452610964527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af15080f35b60019a50610099565b80fd5b6108a4359063ffffffff8216820361012257565b600080fd5b61088435906001600160a01b038216820361012257565b6108c435906001600160a01b038216820361012257565b9181601f840112156101225782359167ffffffffffffffff8311610122576020838186019501011161012257565b6109243590811515820361012257565b3590811515820361012257565b906109406003198301126101225761040490828211610122576004926108049281841161012257923591610824359161084435916108643563ffffffff8116810361012257916101ee610127565b916101f761010e565b9161020061013e565b916108e43591610904359067ffffffffffffffff821161012257610225918d01610155565b909161022f610183565b90565b634e487b7160e01b600052604160045260246000fd5b604051906040820182811067ffffffffffffffff82111761026857604052565b610232565b81601f820112156101225780359067ffffffffffffffff928383116102685760405193601f8401601f19908116603f0116850190811185821017610268576040528284526020838301011161012257816000926020809301838601378301015290565b346101225760803660031901126101225767ffffffffffffffff6004358181116101225761030290369060040161026d565b906024359081116101225761031b90369060040161026d565b9036606312156101225761032d610248565b9182916084368111610122576044945b81861061035257505061035093506104ec565b005b6020809161035f88610193565b81520195019461033d565b346101225760403660031901126101225760043567ffffffffffffffff81116101225761039b90369060040161026d565b602435801515810361012257610aac60209160009384916103e8575b8301907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1005b600191506103b7565b34610122576000366003190112610122576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101225760006020610aac61044b366101a0565b9a9150508d989198979297969396959495996104e3575b60405163ccaa2d1160e01b815260a09b909b013560a48c0152608001356104848b01526108048a01526108248901526108448801526108648701526108848601526108a48501526108c48401526108e48301527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1005b60019950610462565b825160009360209384937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316938793929190610557575b858893015161054e575b858891819495610aac9889920190885af15001915af150565b60019250610535565b6001935061052b56fea2646970667358221220bbde05c8a8245c4319ff8aa0ce8d95e6c5dd5c5828fe085ba1491ea451b390ba64736f6c63430008120033", +} + +// ClaimmockcallerABI is the input ABI used to generate the binding from. +// Deprecated: Use ClaimmockcallerMetaData.ABI instead. +var ClaimmockcallerABI = ClaimmockcallerMetaData.ABI + +// ClaimmockcallerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ClaimmockcallerMetaData.Bin instead. +var ClaimmockcallerBin = ClaimmockcallerMetaData.Bin + +// DeployClaimmockcaller deploys a new Ethereum contract, binding an instance of Claimmockcaller to it. +func DeployClaimmockcaller(auth *bind.TransactOpts, backend bind.ContractBackend, _claimMock common.Address) (common.Address, *types.Transaction, *Claimmockcaller, error) { + parsed, err := ClaimmockcallerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ClaimmockcallerBin), backend, _claimMock) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Claimmockcaller{ClaimmockcallerCaller: ClaimmockcallerCaller{contract: contract}, ClaimmockcallerTransactor: ClaimmockcallerTransactor{contract: contract}, ClaimmockcallerFilterer: ClaimmockcallerFilterer{contract: contract}}, nil +} + +// Claimmockcaller is an auto generated Go binding around an Ethereum contract. +type Claimmockcaller struct { + ClaimmockcallerCaller // Read-only binding to the contract + ClaimmockcallerTransactor // Write-only binding to the contract + ClaimmockcallerFilterer // Log filterer for contract events +} + +// ClaimmockcallerCaller is an auto generated read-only Go binding around an Ethereum contract. +type ClaimmockcallerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ClaimmockcallerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ClaimmockcallerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ClaimmockcallerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ClaimmockcallerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ClaimmockcallerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ClaimmockcallerSession struct { + Contract *Claimmockcaller // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ClaimmockcallerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ClaimmockcallerCallerSession struct { + Contract *ClaimmockcallerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ClaimmockcallerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ClaimmockcallerTransactorSession struct { + Contract *ClaimmockcallerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ClaimmockcallerRaw is an auto generated low-level Go binding around an Ethereum contract. +type ClaimmockcallerRaw struct { + Contract *Claimmockcaller // Generic contract binding to access the raw methods on +} + +// ClaimmockcallerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ClaimmockcallerCallerRaw struct { + Contract *ClaimmockcallerCaller // Generic read-only contract binding to access the raw methods on +} + +// ClaimmockcallerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ClaimmockcallerTransactorRaw struct { + Contract *ClaimmockcallerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewClaimmockcaller creates a new instance of Claimmockcaller, bound to a specific deployed contract. +func NewClaimmockcaller(address common.Address, backend bind.ContractBackend) (*Claimmockcaller, error) { + contract, err := bindClaimmockcaller(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Claimmockcaller{ClaimmockcallerCaller: ClaimmockcallerCaller{contract: contract}, ClaimmockcallerTransactor: ClaimmockcallerTransactor{contract: contract}, ClaimmockcallerFilterer: ClaimmockcallerFilterer{contract: contract}}, nil +} + +// NewClaimmockcallerCaller creates a new read-only instance of Claimmockcaller, bound to a specific deployed contract. +func NewClaimmockcallerCaller(address common.Address, caller bind.ContractCaller) (*ClaimmockcallerCaller, error) { + contract, err := bindClaimmockcaller(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ClaimmockcallerCaller{contract: contract}, nil +} + +// NewClaimmockcallerTransactor creates a new write-only instance of Claimmockcaller, bound to a specific deployed contract. +func NewClaimmockcallerTransactor(address common.Address, transactor bind.ContractTransactor) (*ClaimmockcallerTransactor, error) { + contract, err := bindClaimmockcaller(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ClaimmockcallerTransactor{contract: contract}, nil +} + +// NewClaimmockcallerFilterer creates a new log filterer instance of Claimmockcaller, bound to a specific deployed contract. +func NewClaimmockcallerFilterer(address common.Address, filterer bind.ContractFilterer) (*ClaimmockcallerFilterer, error) { + contract, err := bindClaimmockcaller(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ClaimmockcallerFilterer{contract: contract}, nil +} + +// bindClaimmockcaller binds a generic wrapper to an already deployed contract. +func bindClaimmockcaller(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ClaimmockcallerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Claimmockcaller *ClaimmockcallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Claimmockcaller.Contract.ClaimmockcallerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Claimmockcaller *ClaimmockcallerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Claimmockcaller.Contract.ClaimmockcallerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Claimmockcaller *ClaimmockcallerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Claimmockcaller.Contract.ClaimmockcallerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Claimmockcaller *ClaimmockcallerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Claimmockcaller.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Claimmockcaller *ClaimmockcallerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Claimmockcaller.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Claimmockcaller *ClaimmockcallerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Claimmockcaller.Contract.contract.Transact(opts, method, params...) +} + +// ClaimMock is a free data retrieval call binding the contract method 0x83f5b006. +// +// Solidity: function claimMock() view returns(address) +func (_Claimmockcaller *ClaimmockcallerCaller) ClaimMock(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Claimmockcaller.contract.Call(opts, &out, "claimMock") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ClaimMock is a free data retrieval call binding the contract method 0x83f5b006. +// +// Solidity: function claimMock() view returns(address) +func (_Claimmockcaller *ClaimmockcallerSession) ClaimMock() (common.Address, error) { + return _Claimmockcaller.Contract.ClaimMock(&_Claimmockcaller.CallOpts) +} + +// ClaimMock is a free data retrieval call binding the contract method 0x83f5b006. +// +// Solidity: function claimMock() view returns(address) +func (_Claimmockcaller *ClaimmockcallerCallerSession) ClaimMock() (common.Address, error) { + return _Claimmockcaller.Contract.ClaimMock(&_Claimmockcaller.CallOpts) +} + +// Claim2Bytes is a paid mutator transaction binding the contract method 0x1cf865cf. +// +// Solidity: function claim2Bytes(bytes claim1, bytes claim2, bool[2] reverted) returns() +func (_Claimmockcaller *ClaimmockcallerTransactor) Claim2Bytes(opts *bind.TransactOpts, claim1 []byte, claim2 []byte, reverted [2]bool) (*types.Transaction, error) { + return _Claimmockcaller.contract.Transact(opts, "claim2Bytes", claim1, claim2, reverted) +} + +// Claim2Bytes is a paid mutator transaction binding the contract method 0x1cf865cf. +// +// Solidity: function claim2Bytes(bytes claim1, bytes claim2, bool[2] reverted) returns() +func (_Claimmockcaller *ClaimmockcallerSession) Claim2Bytes(claim1 []byte, claim2 []byte, reverted [2]bool) (*types.Transaction, error) { + return _Claimmockcaller.Contract.Claim2Bytes(&_Claimmockcaller.TransactOpts, claim1, claim2, reverted) +} + +// Claim2Bytes is a paid mutator transaction binding the contract method 0x1cf865cf. +// +// Solidity: function claim2Bytes(bytes claim1, bytes claim2, bool[2] reverted) returns() +func (_Claimmockcaller *ClaimmockcallerTransactorSession) Claim2Bytes(claim1 []byte, claim2 []byte, reverted [2]bool) (*types.Transaction, error) { + return _Claimmockcaller.Contract.Claim2Bytes(&_Claimmockcaller.TransactOpts, claim1, claim2, reverted) +} + +// ClaimAsset is a paid mutator transaction binding the contract method 0xa5106170. +// +// Solidity: function claimAsset(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, bool reverted) returns() +func (_Claimmockcaller *ClaimmockcallerTransactor) ClaimAsset(opts *bind.TransactOpts, smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte, reverted bool) (*types.Transaction, error) { + return _Claimmockcaller.contract.Transact(opts, "claimAsset", smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata, reverted) +} + +// ClaimAsset is a paid mutator transaction binding the contract method 0xa5106170. +// +// Solidity: function claimAsset(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, bool reverted) returns() +func (_Claimmockcaller *ClaimmockcallerSession) ClaimAsset(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte, reverted bool) (*types.Transaction, error) { + return _Claimmockcaller.Contract.ClaimAsset(&_Claimmockcaller.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata, reverted) +} + +// ClaimAsset is a paid mutator transaction binding the contract method 0xa5106170. +// +// Solidity: function claimAsset(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, bool reverted) returns() +func (_Claimmockcaller *ClaimmockcallerTransactorSession) ClaimAsset(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originTokenAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte, reverted bool) (*types.Transaction, error) { + return _Claimmockcaller.Contract.ClaimAsset(&_Claimmockcaller.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originTokenAddress, destinationNetwork, destinationAddress, amount, metadata, reverted) +} + +// ClaimBytes is a paid mutator transaction binding the contract method 0x27e35843. +// +// Solidity: function claimBytes(bytes claim, bool reverted) returns() +func (_Claimmockcaller *ClaimmockcallerTransactor) ClaimBytes(opts *bind.TransactOpts, claim []byte, reverted bool) (*types.Transaction, error) { + return _Claimmockcaller.contract.Transact(opts, "claimBytes", claim, reverted) +} + +// ClaimBytes is a paid mutator transaction binding the contract method 0x27e35843. +// +// Solidity: function claimBytes(bytes claim, bool reverted) returns() +func (_Claimmockcaller *ClaimmockcallerSession) ClaimBytes(claim []byte, reverted bool) (*types.Transaction, error) { + return _Claimmockcaller.Contract.ClaimBytes(&_Claimmockcaller.TransactOpts, claim, reverted) +} + +// ClaimBytes is a paid mutator transaction binding the contract method 0x27e35843. +// +// Solidity: function claimBytes(bytes claim, bool reverted) returns() +func (_Claimmockcaller *ClaimmockcallerTransactorSession) ClaimBytes(claim []byte, reverted bool) (*types.Transaction, error) { + return _Claimmockcaller.Contract.ClaimBytes(&_Claimmockcaller.TransactOpts, claim, reverted) +} + +// ClaimMessage is a paid mutator transaction binding the contract method 0x01beea65. +// +// Solidity: function claimMessage(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, bool reverted) returns() +func (_Claimmockcaller *ClaimmockcallerTransactor) ClaimMessage(opts *bind.TransactOpts, smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte, reverted bool) (*types.Transaction, error) { + return _Claimmockcaller.contract.Transact(opts, "claimMessage", smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata, reverted) +} + +// ClaimMessage is a paid mutator transaction binding the contract method 0x01beea65. +// +// Solidity: function claimMessage(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, bool reverted) returns() +func (_Claimmockcaller *ClaimmockcallerSession) ClaimMessage(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte, reverted bool) (*types.Transaction, error) { + return _Claimmockcaller.Contract.ClaimMessage(&_Claimmockcaller.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata, reverted) +} + +// ClaimMessage is a paid mutator transaction binding the contract method 0x01beea65. +// +// Solidity: function claimMessage(bytes32[32] smtProofLocalExitRoot, bytes32[32] smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes metadata, bool reverted) returns() +func (_Claimmockcaller *ClaimmockcallerTransactorSession) ClaimMessage(smtProofLocalExitRoot [32][32]byte, smtProofRollupExitRoot [32][32]byte, globalIndex *big.Int, mainnetExitRoot [32]byte, rollupExitRoot [32]byte, originNetwork uint32, originAddress common.Address, destinationNetwork uint32, destinationAddress common.Address, amount *big.Int, metadata []byte, reverted bool) (*types.Transaction, error) { + return _Claimmockcaller.Contract.ClaimMessage(&_Claimmockcaller.TransactOpts, smtProofLocalExitRoot, smtProofRollupExitRoot, globalIndex, mainnetExitRoot, rollupExitRoot, originNetwork, originAddress, destinationNetwork, destinationAddress, amount, metadata, reverted) +} diff --git a/test/contracts/claimmocktest/ClaimMockTest.sol b/test/contracts/claimmocktest/ClaimMockTest.sol new file mode 100644 index 00000000..81f748a7 --- /dev/null +++ b/test/contracts/claimmocktest/ClaimMockTest.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.18; + +interface IClaimMock { + event ClaimEvent(uint256 globalIndex, uint32 originNetwork, address originAddress, address destinationAddress, uint256 amount); + function claimAsset(bytes32[32] calldata smtProofLocalExitRoot,bytes32[32] calldata smtProofRollupExitRoot,uint256 globalIndex,bytes32 mainnetExitRoot,bytes32 rollupExitRoot,uint32 originNetwork,address originTokenAddress,uint32 destinationNetwork,address destinationAddress,uint256 amount,bytes calldata metadata) external; + function claimMessage(bytes32[32] calldata smtProofLocalExitRoot,bytes32[32] calldata smtProofRollupExitRoot,uint256 globalIndex,bytes32 mainnetExitRoot,bytes32 rollupExitRoot,uint32 originNetwork,address originAddress,uint32 destinationNetwork,address destinationAddress,uint256 amount,bytes calldata metadata) external; +} + +interface IClaimMockCaller { + function claimAsset(bytes32[32] calldata smtProofLocalExitRoot, bytes32[32] calldata smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originTokenAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes calldata metadata, bool reverted) external; + function claimMessage(bytes32[32] calldata smtProofLocalExitRoot, bytes32[32] calldata smtProofRollupExitRoot, uint256 globalIndex, bytes32 mainnetExitRoot, bytes32 rollupExitRoot, uint32 originNetwork, address originAddress, uint32 destinationNetwork, address destinationAddress, uint256 amount, bytes calldata metadata, bool reverted) external; + function claimBytes(bytes memory claim, bool reverted) external; + function claim2Bytes(bytes memory claim1, bytes memory claim2, bool[2] memory reverted) external; +} + +contract ClaimMockTest { + IClaimMockCaller public immutable claimMockCaller; + IClaimMock public immutable claimMock; + + uint8 constant _DEPOSIT_CONTRACT_TREE_DEPTH = 32; + + constructor( + IClaimMock _claimMock, + IClaimMockCaller _claimMockCaller + ) { + claimMock = _claimMock; + claimMockCaller = _claimMockCaller; + } + + function claimTestInternal(bytes memory claim, bool reverted) external { + claimMockCaller.claimBytes(claim, reverted); + } + + function claim2TestInternal(bytes memory claim1, bytes memory claim2, bool[2] memory reverted) external { + claimMockCaller.claim2Bytes(claim1, claim2, reverted); + } + + function claim3TestInternal(bytes memory claim1, bytes memory claim2, bytes memory claim3, bool[3] memory reverted) external { + address addr = address(claimMock); + uint256 value1 = 0; + if(reverted[1]) { + value1 = 1; + } + claimMockCaller.claimBytes(claim1, reverted[0]); + assembly { + let success1 := call(gas(), addr, value1, add(claim2, 32), 0xaac, 0x20, 0) + } + claimMockCaller.claimBytes(claim3, reverted[2]); + } + +} \ No newline at end of file diff --git a/test/contracts/claimmocktest/claimmocktest.go b/test/contracts/claimmocktest/claimmocktest.go new file mode 100644 index 00000000..2b4494a1 --- /dev/null +++ b/test/contracts/claimmocktest/claimmocktest.go @@ -0,0 +1,328 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package claimmocktest + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ClaimmocktestMetaData contains all meta data concerning the Claimmocktest contract. +var ClaimmocktestMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"contractIClaimMock\",\"name\":\"_claimMock\",\"type\":\"address\"},{\"internalType\":\"contractIClaimMockCaller\",\"name\":\"_claimMockCaller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claim1\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"claim2\",\"type\":\"bytes\"},{\"internalType\":\"bool[2]\",\"name\":\"reverted\",\"type\":\"bool[2]\"}],\"name\":\"claim2TestInternal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claim1\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"claim2\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"claim3\",\"type\":\"bytes\"},{\"internalType\":\"bool[3]\",\"name\":\"reverted\",\"type\":\"bool[3]\"}],\"name\":\"claim3TestInternal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimMock\",\"outputs\":[{\"internalType\":\"contractIClaimMock\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimMockCaller\",\"outputs\":[{\"internalType\":\"contractIClaimMockCaller\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"claim\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"reverted\",\"type\":\"bool\"}],\"name\":\"claimTestInternal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60c0346100a157601f61072e38819003918201601f19168301916001600160401b038311848410176100a65780849260409485528339810103126100a15780516001600160a01b039182821682036100a1576020015191821682036100a15760a05260805260405161067190816100bd82396080518181816102d5015281816103870152818161046a015261054e015260a05181818161031a01526105c20152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c90816348f0c6801461006a575080636e53085414610065578063837a84701461006057806383f5b0061461005b57639bee34681461005657600080fd5b610349565b610304565b6102bf565b610217565b346100f45760c03660031901126100f45767ffffffffffffffff6004358181116100f05761009c903690600401610142565b6024358281116100ec576100b4903690600401610142565b916044359081116100ec576100cd903690600401610142565b36608312156100ec576100e9926100e3366101c6565b92610533565b80f35b8380fd5b8280fd5b80fd5b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff811161012157604052565b6100f7565b6040810190811067ffffffffffffffff82111761012157604052565b81601f820112156101a55780359067ffffffffffffffff928383116101215760405193601f8401601f19908116603f011685019081118582101761012157604052828452602083830101116101a557816000926020809301838601378301015290565b600080fd5b6024359081151582036101a557565b359081151582036101a557565b90604051916060830183811067ffffffffffffffff821117610121576040528260c49182116101a5576064905b8282106101ff57505050565b6020809161020c846101b9565b8152019101906101f3565b346101a55760803660031901126101a55767ffffffffffffffff6004358181116101a557610249903690600401610142565b906024359081116101a557610262903690600401610142565b36606312156101a5576040519061027882610126565b819260843681116101a5576044945b81861061029c57505061029a9350610467565b005b602080916102a9886101b9565b815201950194610287565b60009103126101a557565b346101a55760003660031901126101a5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101a55760003660031901126101a5576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101a557600060403660031901126100f45760043567ffffffffffffffff81116103f75761037c903690600401610142565b816103856101aa565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b156100f0576103d793836040518096819582946327e3584360e01b84526004840161043b565b03925af180156103f2576103e9575080f35b6100e99061010d565b61045b565b5080fd5b919082519283825260005b848110610427575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201610406565b906104536020919493946040845260408401906103fb565b931515910152565b6040513d6000823e3d90fd5b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691823b156101a557604051631cf865cf60e01b815260806004820152938492916104d6916104c49060848601906103fb565b848103600319016024860152906103fb565b90600090604484015b60028310610517575050509181600081819503925af180156103f2576105025750565b8061050f6105159261010d565b806102b4565b565b81511515815286945060019290920191602091820191016104df565b91926000906020810151610632575b80516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169490911515853b156101a557600061059d91604051809381926327e3584360e01b9b8c84526004840161043b565b0381838a5af19283156103f25760409560208094610aac9460009761061f575b5001917f0000000000000000000000000000000000000000000000000000000000000000165af1500151151590803b156101a55761060e93600080946040519687958694859384526004840161043b565b03925af180156103f2576105025750565b8061050f61062c9261010d565b386105bd565b6001915061054256fea264697066735822122091357ca0b4807d5579dc633a7d2a9263efbfe31944c644c21b7ccf83594a9e2c64736f6c63430008120033", +} + +// ClaimmocktestABI is the input ABI used to generate the binding from. +// Deprecated: Use ClaimmocktestMetaData.ABI instead. +var ClaimmocktestABI = ClaimmocktestMetaData.ABI + +// ClaimmocktestBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ClaimmocktestMetaData.Bin instead. +var ClaimmocktestBin = ClaimmocktestMetaData.Bin + +// DeployClaimmocktest deploys a new Ethereum contract, binding an instance of Claimmocktest to it. +func DeployClaimmocktest(auth *bind.TransactOpts, backend bind.ContractBackend, _claimMock common.Address, _claimMockCaller common.Address) (common.Address, *types.Transaction, *Claimmocktest, error) { + parsed, err := ClaimmocktestMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ClaimmocktestBin), backend, _claimMock, _claimMockCaller) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Claimmocktest{ClaimmocktestCaller: ClaimmocktestCaller{contract: contract}, ClaimmocktestTransactor: ClaimmocktestTransactor{contract: contract}, ClaimmocktestFilterer: ClaimmocktestFilterer{contract: contract}}, nil +} + +// Claimmocktest is an auto generated Go binding around an Ethereum contract. +type Claimmocktest struct { + ClaimmocktestCaller // Read-only binding to the contract + ClaimmocktestTransactor // Write-only binding to the contract + ClaimmocktestFilterer // Log filterer for contract events +} + +// ClaimmocktestCaller is an auto generated read-only Go binding around an Ethereum contract. +type ClaimmocktestCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ClaimmocktestTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ClaimmocktestTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ClaimmocktestFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ClaimmocktestFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ClaimmocktestSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ClaimmocktestSession struct { + Contract *Claimmocktest // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ClaimmocktestCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ClaimmocktestCallerSession struct { + Contract *ClaimmocktestCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ClaimmocktestTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ClaimmocktestTransactorSession struct { + Contract *ClaimmocktestTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ClaimmocktestRaw is an auto generated low-level Go binding around an Ethereum contract. +type ClaimmocktestRaw struct { + Contract *Claimmocktest // Generic contract binding to access the raw methods on +} + +// ClaimmocktestCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ClaimmocktestCallerRaw struct { + Contract *ClaimmocktestCaller // Generic read-only contract binding to access the raw methods on +} + +// ClaimmocktestTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ClaimmocktestTransactorRaw struct { + Contract *ClaimmocktestTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewClaimmocktest creates a new instance of Claimmocktest, bound to a specific deployed contract. +func NewClaimmocktest(address common.Address, backend bind.ContractBackend) (*Claimmocktest, error) { + contract, err := bindClaimmocktest(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Claimmocktest{ClaimmocktestCaller: ClaimmocktestCaller{contract: contract}, ClaimmocktestTransactor: ClaimmocktestTransactor{contract: contract}, ClaimmocktestFilterer: ClaimmocktestFilterer{contract: contract}}, nil +} + +// NewClaimmocktestCaller creates a new read-only instance of Claimmocktest, bound to a specific deployed contract. +func NewClaimmocktestCaller(address common.Address, caller bind.ContractCaller) (*ClaimmocktestCaller, error) { + contract, err := bindClaimmocktest(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ClaimmocktestCaller{contract: contract}, nil +} + +// NewClaimmocktestTransactor creates a new write-only instance of Claimmocktest, bound to a specific deployed contract. +func NewClaimmocktestTransactor(address common.Address, transactor bind.ContractTransactor) (*ClaimmocktestTransactor, error) { + contract, err := bindClaimmocktest(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ClaimmocktestTransactor{contract: contract}, nil +} + +// NewClaimmocktestFilterer creates a new log filterer instance of Claimmocktest, bound to a specific deployed contract. +func NewClaimmocktestFilterer(address common.Address, filterer bind.ContractFilterer) (*ClaimmocktestFilterer, error) { + contract, err := bindClaimmocktest(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ClaimmocktestFilterer{contract: contract}, nil +} + +// bindClaimmocktest binds a generic wrapper to an already deployed contract. +func bindClaimmocktest(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ClaimmocktestMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Claimmocktest *ClaimmocktestRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Claimmocktest.Contract.ClaimmocktestCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Claimmocktest *ClaimmocktestRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Claimmocktest.Contract.ClaimmocktestTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Claimmocktest *ClaimmocktestRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Claimmocktest.Contract.ClaimmocktestTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Claimmocktest *ClaimmocktestCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Claimmocktest.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Claimmocktest *ClaimmocktestTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Claimmocktest.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Claimmocktest *ClaimmocktestTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Claimmocktest.Contract.contract.Transact(opts, method, params...) +} + +// ClaimMock is a free data retrieval call binding the contract method 0x83f5b006. +// +// Solidity: function claimMock() view returns(address) +func (_Claimmocktest *ClaimmocktestCaller) ClaimMock(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Claimmocktest.contract.Call(opts, &out, "claimMock") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ClaimMock is a free data retrieval call binding the contract method 0x83f5b006. +// +// Solidity: function claimMock() view returns(address) +func (_Claimmocktest *ClaimmocktestSession) ClaimMock() (common.Address, error) { + return _Claimmocktest.Contract.ClaimMock(&_Claimmocktest.CallOpts) +} + +// ClaimMock is a free data retrieval call binding the contract method 0x83f5b006. +// +// Solidity: function claimMock() view returns(address) +func (_Claimmocktest *ClaimmocktestCallerSession) ClaimMock() (common.Address, error) { + return _Claimmocktest.Contract.ClaimMock(&_Claimmocktest.CallOpts) +} + +// ClaimMockCaller is a free data retrieval call binding the contract method 0x837a8470. +// +// Solidity: function claimMockCaller() view returns(address) +func (_Claimmocktest *ClaimmocktestCaller) ClaimMockCaller(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Claimmocktest.contract.Call(opts, &out, "claimMockCaller") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ClaimMockCaller is a free data retrieval call binding the contract method 0x837a8470. +// +// Solidity: function claimMockCaller() view returns(address) +func (_Claimmocktest *ClaimmocktestSession) ClaimMockCaller() (common.Address, error) { + return _Claimmocktest.Contract.ClaimMockCaller(&_Claimmocktest.CallOpts) +} + +// ClaimMockCaller is a free data retrieval call binding the contract method 0x837a8470. +// +// Solidity: function claimMockCaller() view returns(address) +func (_Claimmocktest *ClaimmocktestCallerSession) ClaimMockCaller() (common.Address, error) { + return _Claimmocktest.Contract.ClaimMockCaller(&_Claimmocktest.CallOpts) +} + +// Claim2TestInternal is a paid mutator transaction binding the contract method 0x6e530854. +// +// Solidity: function claim2TestInternal(bytes claim1, bytes claim2, bool[2] reverted) returns() +func (_Claimmocktest *ClaimmocktestTransactor) Claim2TestInternal(opts *bind.TransactOpts, claim1 []byte, claim2 []byte, reverted [2]bool) (*types.Transaction, error) { + return _Claimmocktest.contract.Transact(opts, "claim2TestInternal", claim1, claim2, reverted) +} + +// Claim2TestInternal is a paid mutator transaction binding the contract method 0x6e530854. +// +// Solidity: function claim2TestInternal(bytes claim1, bytes claim2, bool[2] reverted) returns() +func (_Claimmocktest *ClaimmocktestSession) Claim2TestInternal(claim1 []byte, claim2 []byte, reverted [2]bool) (*types.Transaction, error) { + return _Claimmocktest.Contract.Claim2TestInternal(&_Claimmocktest.TransactOpts, claim1, claim2, reverted) +} + +// Claim2TestInternal is a paid mutator transaction binding the contract method 0x6e530854. +// +// Solidity: function claim2TestInternal(bytes claim1, bytes claim2, bool[2] reverted) returns() +func (_Claimmocktest *ClaimmocktestTransactorSession) Claim2TestInternal(claim1 []byte, claim2 []byte, reverted [2]bool) (*types.Transaction, error) { + return _Claimmocktest.Contract.Claim2TestInternal(&_Claimmocktest.TransactOpts, claim1, claim2, reverted) +} + +// Claim3TestInternal is a paid mutator transaction binding the contract method 0x48f0c680. +// +// Solidity: function claim3TestInternal(bytes claim1, bytes claim2, bytes claim3, bool[3] reverted) returns() +func (_Claimmocktest *ClaimmocktestTransactor) Claim3TestInternal(opts *bind.TransactOpts, claim1 []byte, claim2 []byte, claim3 []byte, reverted [3]bool) (*types.Transaction, error) { + return _Claimmocktest.contract.Transact(opts, "claim3TestInternal", claim1, claim2, claim3, reverted) +} + +// Claim3TestInternal is a paid mutator transaction binding the contract method 0x48f0c680. +// +// Solidity: function claim3TestInternal(bytes claim1, bytes claim2, bytes claim3, bool[3] reverted) returns() +func (_Claimmocktest *ClaimmocktestSession) Claim3TestInternal(claim1 []byte, claim2 []byte, claim3 []byte, reverted [3]bool) (*types.Transaction, error) { + return _Claimmocktest.Contract.Claim3TestInternal(&_Claimmocktest.TransactOpts, claim1, claim2, claim3, reverted) +} + +// Claim3TestInternal is a paid mutator transaction binding the contract method 0x48f0c680. +// +// Solidity: function claim3TestInternal(bytes claim1, bytes claim2, bytes claim3, bool[3] reverted) returns() +func (_Claimmocktest *ClaimmocktestTransactorSession) Claim3TestInternal(claim1 []byte, claim2 []byte, claim3 []byte, reverted [3]bool) (*types.Transaction, error) { + return _Claimmocktest.Contract.Claim3TestInternal(&_Claimmocktest.TransactOpts, claim1, claim2, claim3, reverted) +} + +// ClaimTestInternal is a paid mutator transaction binding the contract method 0x9bee3468. +// +// Solidity: function claimTestInternal(bytes claim, bool reverted) returns() +func (_Claimmocktest *ClaimmocktestTransactor) ClaimTestInternal(opts *bind.TransactOpts, claim []byte, reverted bool) (*types.Transaction, error) { + return _Claimmocktest.contract.Transact(opts, "claimTestInternal", claim, reverted) +} + +// ClaimTestInternal is a paid mutator transaction binding the contract method 0x9bee3468. +// +// Solidity: function claimTestInternal(bytes claim, bool reverted) returns() +func (_Claimmocktest *ClaimmocktestSession) ClaimTestInternal(claim []byte, reverted bool) (*types.Transaction, error) { + return _Claimmocktest.Contract.ClaimTestInternal(&_Claimmocktest.TransactOpts, claim, reverted) +} + +// ClaimTestInternal is a paid mutator transaction binding the contract method 0x9bee3468. +// +// Solidity: function claimTestInternal(bytes claim, bool reverted) returns() +func (_Claimmocktest *ClaimmocktestTransactorSession) ClaimTestInternal(claim []byte, reverted bool) (*types.Transaction, error) { + return _Claimmocktest.Contract.ClaimTestInternal(&_Claimmocktest.TransactOpts, claim, reverted) +} diff --git a/test/contracts/compile.sh b/test/contracts/compile.sh new file mode 100755 index 00000000..7dd357a9 --- /dev/null +++ b/test/contracts/compile.sh @@ -0,0 +1,24 @@ +docker run --rm -v $(pwd):/contracts ethereum/solc:0.8.18-alpine - /contracts/verifybatchesmock/VerifyBatchesMock.sol -o /contracts --abi --bin --overwrite --optimize +mv -f VerifyBatchesMock.abi abi/verifybatchesmock.abi +mv -f VerifyBatchesMock.bin bin/verifybatchesmock.bin +rm -f IBasePolygonZkEVMGlobalExitRoot.abi +rm -f IBasePolygonZkEVMGlobalExitRoot.bin +rm -f IPolygonZkEVMGlobalExitRootV2.abi +rm -f IPolygonZkEVMGlobalExitRootV2.bin + +docker run --rm -v $(pwd):/contracts ethereum/solc:0.8.18-alpine - /contracts/claimmock/ClaimMock.sol -o /contracts --abi --bin --overwrite --optimize --via-ir +mv -f ClaimMock.abi abi/claimmock.abi +mv -f ClaimMock.bin bin/claimmock.bin + +docker run --rm -v $(pwd):/contracts ethereum/solc:0.8.18-alpine - /contracts/claimmockcaller/ClaimMockCaller.sol -o /contracts --abi --bin --overwrite --optimize --via-ir +mv -f ClaimMockCaller.abi abi/claimmockcaller.abi +mv -f ClaimMockCaller.bin bin/claimmockcaller.bin + +docker run --rm -v $(pwd):/contracts ethereum/solc:0.8.18-alpine - /contracts/claimmocktest/ClaimMockTest.sol -o /contracts --abi --bin --overwrite --optimize --via-ir +mv -f ClaimMockTest.abi abi/claimmocktest.abi +mv -f ClaimMockTest.bin bin/claimmocktest.bin + +rm -f IClaimMock.abi +rm -f IClaimMock.bin +rm -f IClaimMockCaller.abi +rm -f IClaimMockCaller.bin \ No newline at end of file diff --git a/test/contracts/erc1967proxy/erc1967proxy.go b/test/contracts/erc1967proxy/erc1967proxy.go new file mode 100644 index 00000000..f4994e0d --- /dev/null +++ b/test/contracts/erc1967proxy/erc1967proxy.go @@ -0,0 +1,668 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package erc1967proxy + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Erc1967proxyMetaData contains all meta data concerning the Erc1967proxy contract. +var Erc1967proxyMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60806040526040516104ee3803806104ee833981016040819052610022916102de565b61002e82826000610035565b50506103fb565b61003e83610061565b60008251118061004b5750805b1561005c5761005a83836100a1565b505b505050565b61006a816100cd565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606100c683836040518060600160405280602781526020016104c760279139610180565b9392505050565b6001600160a01b0381163b61013f5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080856001600160a01b03168560405161019d91906103ac565b600060405180830381855af49150503d80600081146101d8576040519150601f19603f3d011682016040523d82523d6000602084013e6101dd565b606091505b5090925090506101ef868383876101f9565b9695505050505050565b60608315610268578251600003610261576001600160a01b0385163b6102615760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610136565b5081610272565b610272838361027a565b949350505050565b81511561028a5781518083602001fd5b8060405162461bcd60e51b815260040161013691906103c8565b634e487b7160e01b600052604160045260246000fd5b60005b838110156102d55781810151838201526020016102bd565b50506000910152565b600080604083850312156102f157600080fd5b82516001600160a01b038116811461030857600080fd5b60208401519092506001600160401b038082111561032557600080fd5b818501915085601f83011261033957600080fd5b81518181111561034b5761034b6102a4565b604051601f8201601f19908116603f01168101908382118183101715610373576103736102a4565b8160405282815288602084870101111561038c57600080fd5b61039d8360208301602088016102ba565b80955050505050509250929050565b600082516103be8184602087016102ba565b9190910192915050565b60208152600082518060208401526103e78160408501602087016102ba565b601f01601f19169190910160400192915050565b60be806104096000396000f3fe608060405236601057600e6013565b005b600e5b601f601b6021565b6065565b565b600060607f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5473ffffffffffffffffffffffffffffffffffffffff1690565b905090565b3660008037600080366000845af43d6000803e8080156083573d6000f35b3d6000fdfea2646970667358221220ffbfbaa210c1b5f5ca62a5eba67b7d993e0bdf919f51500f790fb7acf2fd784c64736f6c63430008140033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", +} + +// Erc1967proxyABI is the input ABI used to generate the binding from. +// Deprecated: Use Erc1967proxyMetaData.ABI instead. +var Erc1967proxyABI = Erc1967proxyMetaData.ABI + +// Erc1967proxyBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use Erc1967proxyMetaData.Bin instead. +var Erc1967proxyBin = Erc1967proxyMetaData.Bin + +// DeployErc1967proxy deploys a new Ethereum contract, binding an instance of Erc1967proxy to it. +func DeployErc1967proxy(auth *bind.TransactOpts, backend bind.ContractBackend, _logic common.Address, _data []byte) (common.Address, *types.Transaction, *Erc1967proxy, error) { + parsed, err := Erc1967proxyMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(Erc1967proxyBin), backend, _logic, _data) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Erc1967proxy{Erc1967proxyCaller: Erc1967proxyCaller{contract: contract}, Erc1967proxyTransactor: Erc1967proxyTransactor{contract: contract}, Erc1967proxyFilterer: Erc1967proxyFilterer{contract: contract}}, nil +} + +// Erc1967proxy is an auto generated Go binding around an Ethereum contract. +type Erc1967proxy struct { + Erc1967proxyCaller // Read-only binding to the contract + Erc1967proxyTransactor // Write-only binding to the contract + Erc1967proxyFilterer // Log filterer for contract events +} + +// Erc1967proxyCaller is an auto generated read-only Go binding around an Ethereum contract. +type Erc1967proxyCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc1967proxyTransactor is an auto generated write-only Go binding around an Ethereum contract. +type Erc1967proxyTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc1967proxyFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type Erc1967proxyFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// Erc1967proxySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type Erc1967proxySession struct { + Contract *Erc1967proxy // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc1967proxyCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type Erc1967proxyCallerSession struct { + Contract *Erc1967proxyCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// Erc1967proxyTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type Erc1967proxyTransactorSession struct { + Contract *Erc1967proxyTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// Erc1967proxyRaw is an auto generated low-level Go binding around an Ethereum contract. +type Erc1967proxyRaw struct { + Contract *Erc1967proxy // Generic contract binding to access the raw methods on +} + +// Erc1967proxyCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type Erc1967proxyCallerRaw struct { + Contract *Erc1967proxyCaller // Generic read-only contract binding to access the raw methods on +} + +// Erc1967proxyTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type Erc1967proxyTransactorRaw struct { + Contract *Erc1967proxyTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewErc1967proxy creates a new instance of Erc1967proxy, bound to a specific deployed contract. +func NewErc1967proxy(address common.Address, backend bind.ContractBackend) (*Erc1967proxy, error) { + contract, err := bindErc1967proxy(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Erc1967proxy{Erc1967proxyCaller: Erc1967proxyCaller{contract: contract}, Erc1967proxyTransactor: Erc1967proxyTransactor{contract: contract}, Erc1967proxyFilterer: Erc1967proxyFilterer{contract: contract}}, nil +} + +// NewErc1967proxyCaller creates a new read-only instance of Erc1967proxy, bound to a specific deployed contract. +func NewErc1967proxyCaller(address common.Address, caller bind.ContractCaller) (*Erc1967proxyCaller, error) { + contract, err := bindErc1967proxy(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &Erc1967proxyCaller{contract: contract}, nil +} + +// NewErc1967proxyTransactor creates a new write-only instance of Erc1967proxy, bound to a specific deployed contract. +func NewErc1967proxyTransactor(address common.Address, transactor bind.ContractTransactor) (*Erc1967proxyTransactor, error) { + contract, err := bindErc1967proxy(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &Erc1967proxyTransactor{contract: contract}, nil +} + +// NewErc1967proxyFilterer creates a new log filterer instance of Erc1967proxy, bound to a specific deployed contract. +func NewErc1967proxyFilterer(address common.Address, filterer bind.ContractFilterer) (*Erc1967proxyFilterer, error) { + contract, err := bindErc1967proxy(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &Erc1967proxyFilterer{contract: contract}, nil +} + +// bindErc1967proxy binds a generic wrapper to an already deployed contract. +func bindErc1967proxy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := Erc1967proxyMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc1967proxy *Erc1967proxyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc1967proxy.Contract.Erc1967proxyCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc1967proxy *Erc1967proxyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc1967proxy.Contract.Erc1967proxyTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc1967proxy *Erc1967proxyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc1967proxy.Contract.Erc1967proxyTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Erc1967proxy *Erc1967proxyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Erc1967proxy.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Erc1967proxy *Erc1967proxyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc1967proxy.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Erc1967proxy *Erc1967proxyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Erc1967proxy.Contract.contract.Transact(opts, method, params...) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Erc1967proxy *Erc1967proxyTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _Erc1967proxy.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Erc1967proxy *Erc1967proxySession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Erc1967proxy.Contract.Fallback(&_Erc1967proxy.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Erc1967proxy *Erc1967proxyTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Erc1967proxy.Contract.Fallback(&_Erc1967proxy.TransactOpts, calldata) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Erc1967proxy *Erc1967proxyTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Erc1967proxy.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Erc1967proxy *Erc1967proxySession) Receive() (*types.Transaction, error) { + return _Erc1967proxy.Contract.Receive(&_Erc1967proxy.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Erc1967proxy *Erc1967proxyTransactorSession) Receive() (*types.Transaction, error) { + return _Erc1967proxy.Contract.Receive(&_Erc1967proxy.TransactOpts) +} + +// Erc1967proxyAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the Erc1967proxy contract. +type Erc1967proxyAdminChangedIterator struct { + Event *Erc1967proxyAdminChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc1967proxyAdminChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc1967proxyAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc1967proxyAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc1967proxyAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc1967proxyAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc1967proxyAdminChanged represents a AdminChanged event raised by the Erc1967proxy contract. +type Erc1967proxyAdminChanged struct { + PreviousAdmin common.Address + NewAdmin common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAdminChanged is a free log retrieval operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_Erc1967proxy *Erc1967proxyFilterer) FilterAdminChanged(opts *bind.FilterOpts) (*Erc1967proxyAdminChangedIterator, error) { + + logs, sub, err := _Erc1967proxy.contract.FilterLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return &Erc1967proxyAdminChangedIterator{contract: _Erc1967proxy.contract, event: "AdminChanged", logs: logs, sub: sub}, nil +} + +// WatchAdminChanged is a free log subscription operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_Erc1967proxy *Erc1967proxyFilterer) WatchAdminChanged(opts *bind.WatchOpts, sink chan<- *Erc1967proxyAdminChanged) (event.Subscription, error) { + + logs, sub, err := _Erc1967proxy.contract.WatchLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc1967proxyAdminChanged) + if err := _Erc1967proxy.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAdminChanged is a log parse operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_Erc1967proxy *Erc1967proxyFilterer) ParseAdminChanged(log types.Log) (*Erc1967proxyAdminChanged, error) { + event := new(Erc1967proxyAdminChanged) + if err := _Erc1967proxy.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc1967proxyBeaconUpgradedIterator is returned from FilterBeaconUpgraded and is used to iterate over the raw logs and unpacked data for BeaconUpgraded events raised by the Erc1967proxy contract. +type Erc1967proxyBeaconUpgradedIterator struct { + Event *Erc1967proxyBeaconUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc1967proxyBeaconUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc1967proxyBeaconUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc1967proxyBeaconUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc1967proxyBeaconUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc1967proxyBeaconUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc1967proxyBeaconUpgraded represents a BeaconUpgraded event raised by the Erc1967proxy contract. +type Erc1967proxyBeaconUpgraded struct { + Beacon common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBeaconUpgraded is a free log retrieval operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. +// +// Solidity: event BeaconUpgraded(address indexed beacon) +func (_Erc1967proxy *Erc1967proxyFilterer) FilterBeaconUpgraded(opts *bind.FilterOpts, beacon []common.Address) (*Erc1967proxyBeaconUpgradedIterator, error) { + + var beaconRule []interface{} + for _, beaconItem := range beacon { + beaconRule = append(beaconRule, beaconItem) + } + + logs, sub, err := _Erc1967proxy.contract.FilterLogs(opts, "BeaconUpgraded", beaconRule) + if err != nil { + return nil, err + } + return &Erc1967proxyBeaconUpgradedIterator{contract: _Erc1967proxy.contract, event: "BeaconUpgraded", logs: logs, sub: sub}, nil +} + +// WatchBeaconUpgraded is a free log subscription operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. +// +// Solidity: event BeaconUpgraded(address indexed beacon) +func (_Erc1967proxy *Erc1967proxyFilterer) WatchBeaconUpgraded(opts *bind.WatchOpts, sink chan<- *Erc1967proxyBeaconUpgraded, beacon []common.Address) (event.Subscription, error) { + + var beaconRule []interface{} + for _, beaconItem := range beacon { + beaconRule = append(beaconRule, beaconItem) + } + + logs, sub, err := _Erc1967proxy.contract.WatchLogs(opts, "BeaconUpgraded", beaconRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc1967proxyBeaconUpgraded) + if err := _Erc1967proxy.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBeaconUpgraded is a log parse operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. +// +// Solidity: event BeaconUpgraded(address indexed beacon) +func (_Erc1967proxy *Erc1967proxyFilterer) ParseBeaconUpgraded(log types.Log) (*Erc1967proxyBeaconUpgraded, error) { + event := new(Erc1967proxyBeaconUpgraded) + if err := _Erc1967proxy.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// Erc1967proxyUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the Erc1967proxy contract. +type Erc1967proxyUpgradedIterator struct { + Event *Erc1967proxyUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *Erc1967proxyUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(Erc1967proxyUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(Erc1967proxyUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *Erc1967proxyUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *Erc1967proxyUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// Erc1967proxyUpgraded represents a Upgraded event raised by the Erc1967proxy contract. +type Erc1967proxyUpgraded struct { + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Erc1967proxy *Erc1967proxyFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*Erc1967proxyUpgradedIterator, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Erc1967proxy.contract.FilterLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return &Erc1967proxyUpgradedIterator{contract: _Erc1967proxy.contract, event: "Upgraded", logs: logs, sub: sub}, nil +} + +// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Erc1967proxy *Erc1967proxyFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *Erc1967proxyUpgraded, implementation []common.Address) (event.Subscription, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Erc1967proxy.contract.WatchLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(Erc1967proxyUpgraded) + if err := _Erc1967proxy.contract.UnpackLog(event, "Upgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Erc1967proxy *Erc1967proxyFilterer) ParseUpgraded(log types.Log) (*Erc1967proxyUpgraded, error) { + event := new(Erc1967proxyUpgraded) + if err := _Erc1967proxy.contract.UnpackLog(event, "Upgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/test/contracts/erc20mock/ERC20Mock.json b/test/contracts/erc20mock/ERC20Mock.json new file mode 100644 index 00000000..e27ddd00 --- /dev/null +++ b/test/contracts/erc20mock/ERC20Mock.json @@ -0,0 +1,657 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MockERC20", + "sourceName": "contracts/mocks/MockERC20.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINTER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpause", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b50604080518082018252600480825263151154d560e21b60208084018290528451808601909552918452908301529081816005620000508382620002ca565b5060066200005f8282620002ca565b50506007805460ff191690555062000079600033620000d9565b620000a57f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000d9565b620000d17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620000d9565b505062000396565b620000e58282620000e9565b5050565b620000f5828262000114565b60008281526001602052604090206200010f9082620001b4565b505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620000e5576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001703390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000620001cb836001600160a01b038416620001d4565b90505b92915050565b60008181526001830160205260408120546200021d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620001ce565b506000620001ce565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200025157607f821691505b6020821081036200027257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200010f57600081815260208120601f850160051c81016020861015620002a15750805b601f850160051c820191505b81811015620002c257828155600101620002ad565b505050505050565b81516001600160401b03811115620002e657620002e662000226565b620002fe81620002f784546200023c565b8462000278565b602080601f8311600181146200033657600084156200031d5750858301515b600019600386901b1c1916600185901b178555620002c2565b600085815260208120601f198616915b82811015620003675788860151825594840194600190910190840162000346565b5085821015620003865787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6117fa80620003a66000396000f3fe608060405234801561001057600080fd5b50600436106101845760003560e01c806370a08231116100d9578063a457c2d711610087578063a457c2d714610336578063a9059cbb14610349578063ca15c8731461035c578063d53913931461036f578063d547741f14610396578063dd62ed3e146103a9578063e63ab1e9146103bc57600080fd5b806370a08231146102a457806379cc6790146102cd5780638456cb59146102e05780639010d07c146102e857806391d148541461031357806395d89b4114610326578063a217fddf1461032e57600080fd5b8063313ce56711610136578063313ce5671461023657806336568abe1461024557806339509351146102585780633f4ba83a1461026b57806340c10f191461027357806342966c68146102865780635c975abb1461029957600080fd5b806301ffc9a71461018957806306fdde03146101b1578063095ea7b3146101c657806318160ddd146101d957806323b872dd146101eb578063248a9ca3146101fe5780632f2ff15d14610221575b600080fd5b61019c610197366004611460565b6103d1565b60405190151581526020015b60405180910390f35b6101b96103fc565b6040516101a891906114ae565b61019c6101d43660046114fd565b61048e565b6004545b6040519081526020016101a8565b61019c6101f9366004611527565b6104a6565b6101dd61020c366004611563565b60009081526020819052604090206001015490565b61023461022f36600461157c565b6104ca565b005b604051601281526020016101a8565b61023461025336600461157c565b6104f4565b61019c6102663660046114fd565b610577565b610234610599565b6102346102813660046114fd565b610617565b610234610294366004611563565b6106a4565b60075460ff1661019c565b6101dd6102b23660046115a8565b6001600160a01b031660009081526002602052604090205490565b6102346102db3660046114fd565b6106b1565b6102346106c6565b6102fb6102f63660046115c3565b610740565b6040516001600160a01b0390911681526020016101a8565b61019c61032136600461157c565b61075f565b6101b9610788565b6101dd600081565b61019c6103443660046114fd565b610797565b61019c6103573660046114fd565b610812565b6101dd61036a366004611563565b610820565b6101dd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102346103a436600461157c565b610837565b6101dd6103b73660046115e5565b61085c565b6101dd60008051602061178583398151915281565b60006001600160e01b03198216635a05180f60e01b14806103f657506103f682610887565b92915050565b60606005805461040b9061160f565b80601f01602080910402602001604051908101604052809291908181526020018280546104379061160f565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b60003361049c8185856108bc565b5060019392505050565b6000336104b48582856109e0565b6104bf858585610a5a565b506001949350505050565b6000828152602081905260409020600101546104e581610bfe565b6104ef8383610c08565b505050565b6001600160a01b03811633146105695760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6105738282610c2a565b5050565b60003361049c81858561058a838361085c565b610594919061165f565b6108bc565b6105b16000805160206117858339815191523361075f565b61060d5760405162461bcd60e51b8152602060048201526039602482015260008051602061176583398151915260448201527876652070617573657220726f6c6520746f20756e706175736560381b6064820152608401610560565b610615610c4c565b565b6106417f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63361075f565b61069a5760405162461bcd60e51b815260206004820152603660248201526000805160206117658339815191526044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b6064820152608401610560565b6105738282610c9e565b6106ae3382610d59565b50565b6106bc8233836109e0565b6105738282610d59565b6106de6000805160206117858339815191523361075f565b6107385760405162461bcd60e51b8152602060048201526037602482015260008051602061176583398151915260448201527676652070617573657220726f6c6520746f20706175736560481b6064820152608401610560565b610615610e87565b60008281526001602052604081206107589083610ec4565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606006805461040b9061160f565b600033816107a5828661085c565b9050838110156108055760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610560565b6104bf82868684036108bc565b60003361049c818585610a5a565b60008181526001602052604081206103f690610ed0565b60008281526020819052604090206001015461085281610bfe565b6104ef8383610c2a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b60006001600160e01b03198216637965db0b60e01b14806103f657506301ffc9a760e01b6001600160e01b03198316146103f6565b6001600160a01b03831661091e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610560565b6001600160a01b03821661097f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610560565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006109ec848461085c565b90506000198114610a545781811015610a475760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610560565b610a5484848484036108bc565b50505050565b6001600160a01b038316610abe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610560565b6001600160a01b038216610b205760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610560565b610b2b838383610eda565b6001600160a01b03831660009081526002602052604090205481811015610ba35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610560565b6001600160a01b0380851660008181526002602052604080822086860390559286168082529083902080548601905591516000805160206117a583398151915290610bf19086815260200190565b60405180910390a3610a54565b6106ae8133610ee5565b610c128282610f3e565b60008281526001602052604090206104ef9082610fc2565b610c348282610fd7565b60008281526001602052604090206104ef908261103c565b610c54611051565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038216610cf45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610560565b610d0060008383610eda565b8060046000828254610d12919061165f565b90915550506001600160a01b0382166000818152600260209081526040808320805486019055518481526000805160206117a5833981519152910160405180910390a35050565b6001600160a01b038216610db95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610560565b610dc582600083610eda565b6001600160a01b03821660009081526002602052604090205481811015610e395760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610560565b6001600160a01b03831660008181526002602090815260408083208686039055600480548790039055518581529192916000805160206117a5833981519152910160405180910390a3505050565b610e8f61109a565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610c813390565b600061075883836110e0565b60006103f6825490565b6104ef83838361110a565b610eef828261075f565b61057357610efc81611170565b610f07836020611182565b604051602001610f18929190611672565b60408051601f198184030181529082905262461bcd60e51b8252610560916004016114ae565b610f48828261075f565b610573576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610f7e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610758836001600160a01b03841661131e565b610fe1828261075f565b15610573576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610758836001600160a01b03841661136d565b60075460ff166106155760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610560565b60075460ff16156106155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610560565b60008260000182815481106110f7576110f76116e1565b9060005260206000200154905092915050565b60075460ff16156104ef5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610560565b60606103f66001600160a01b03831660145b606060006111918360026116f7565b61119c90600261165f565b67ffffffffffffffff8111156111b4576111b461170e565b6040519080825280601f01601f1916602001820160405280156111de576020820181803683370190505b509050600360fc1b816000815181106111f9576111f96116e1565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611228576112286116e1565b60200101906001600160f81b031916908160001a905350600061124c8460026116f7565b61125790600161165f565b90505b60018111156112cf576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061128b5761128b6116e1565b1a60f81b8282815181106112a1576112a16116e1565b60200101906001600160f81b031916908160001a90535060049490941c936112c881611724565b905061125a565b5083156107585760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610560565b6000818152600183016020526040812054611365575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556103f6565b5060006103f6565b6000818152600183016020526040812054801561145657600061139160018361173b565b85549091506000906113a59060019061173b565b905081811461140a5760008660000182815481106113c5576113c56116e1565b90600052602060002001549050808760000184815481106113e8576113e86116e1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061141b5761141b61174e565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506103f6565b60009150506103f6565b60006020828403121561147257600080fd5b81356001600160e01b03198116811461075857600080fd5b60005b838110156114a557818101518382015260200161148d565b50506000910152565b60208152600082518060208401526114cd81604085016020870161148a565b601f01601f19169190910160400192915050565b80356001600160a01b03811681146114f857600080fd5b919050565b6000806040838503121561151057600080fd5b611519836114e1565b946020939093013593505050565b60008060006060848603121561153c57600080fd5b611545846114e1565b9250611553602085016114e1565b9150604084013590509250925092565b60006020828403121561157557600080fd5b5035919050565b6000806040838503121561158f57600080fd5b8235915061159f602084016114e1565b90509250929050565b6000602082840312156115ba57600080fd5b610758826114e1565b600080604083850312156115d657600080fd5b50508035926020909101359150565b600080604083850312156115f857600080fd5b611601836114e1565b915061159f602084016114e1565b600181811c9082168061162357607f821691505b60208210810361164357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103f6576103f6611649565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516116a481601785016020880161148a565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516116d581602884016020880161148a565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176103f6576103f6611649565b634e487b7160e01b600052604160045260246000fd5b60008161173357611733611649565b506000190190565b818103818111156103f6576103f6611649565b634e487b7160e01b600052603160045260246000fdfe45524332305072657365744d696e7465725061757365723a206d75737420686165d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d5a22b9391b8f37e5b49e43cc1eabfcea8be6d7b5aa0a84dc5daa1b7a05730f364736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101845760003560e01c806370a08231116100d9578063a457c2d711610087578063a457c2d714610336578063a9059cbb14610349578063ca15c8731461035c578063d53913931461036f578063d547741f14610396578063dd62ed3e146103a9578063e63ab1e9146103bc57600080fd5b806370a08231146102a457806379cc6790146102cd5780638456cb59146102e05780639010d07c146102e857806391d148541461031357806395d89b4114610326578063a217fddf1461032e57600080fd5b8063313ce56711610136578063313ce5671461023657806336568abe1461024557806339509351146102585780633f4ba83a1461026b57806340c10f191461027357806342966c68146102865780635c975abb1461029957600080fd5b806301ffc9a71461018957806306fdde03146101b1578063095ea7b3146101c657806318160ddd146101d957806323b872dd146101eb578063248a9ca3146101fe5780632f2ff15d14610221575b600080fd5b61019c610197366004611460565b6103d1565b60405190151581526020015b60405180910390f35b6101b96103fc565b6040516101a891906114ae565b61019c6101d43660046114fd565b61048e565b6004545b6040519081526020016101a8565b61019c6101f9366004611527565b6104a6565b6101dd61020c366004611563565b60009081526020819052604090206001015490565b61023461022f36600461157c565b6104ca565b005b604051601281526020016101a8565b61023461025336600461157c565b6104f4565b61019c6102663660046114fd565b610577565b610234610599565b6102346102813660046114fd565b610617565b610234610294366004611563565b6106a4565b60075460ff1661019c565b6101dd6102b23660046115a8565b6001600160a01b031660009081526002602052604090205490565b6102346102db3660046114fd565b6106b1565b6102346106c6565b6102fb6102f63660046115c3565b610740565b6040516001600160a01b0390911681526020016101a8565b61019c61032136600461157c565b61075f565b6101b9610788565b6101dd600081565b61019c6103443660046114fd565b610797565b61019c6103573660046114fd565b610812565b6101dd61036a366004611563565b610820565b6101dd7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6102346103a436600461157c565b610837565b6101dd6103b73660046115e5565b61085c565b6101dd60008051602061178583398151915281565b60006001600160e01b03198216635a05180f60e01b14806103f657506103f682610887565b92915050565b60606005805461040b9061160f565b80601f01602080910402602001604051908101604052809291908181526020018280546104379061160f565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b60003361049c8185856108bc565b5060019392505050565b6000336104b48582856109e0565b6104bf858585610a5a565b506001949350505050565b6000828152602081905260409020600101546104e581610bfe565b6104ef8383610c08565b505050565b6001600160a01b03811633146105695760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6105738282610c2a565b5050565b60003361049c81858561058a838361085c565b610594919061165f565b6108bc565b6105b16000805160206117858339815191523361075f565b61060d5760405162461bcd60e51b8152602060048201526039602482015260008051602061176583398151915260448201527876652070617573657220726f6c6520746f20756e706175736560381b6064820152608401610560565b610615610c4c565b565b6106417f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63361075f565b61069a5760405162461bcd60e51b815260206004820152603660248201526000805160206117658339815191526044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b6064820152608401610560565b6105738282610c9e565b6106ae3382610d59565b50565b6106bc8233836109e0565b6105738282610d59565b6106de6000805160206117858339815191523361075f565b6107385760405162461bcd60e51b8152602060048201526037602482015260008051602061176583398151915260448201527676652070617573657220726f6c6520746f20706175736560481b6064820152608401610560565b610615610e87565b60008281526001602052604081206107589083610ec4565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60606006805461040b9061160f565b600033816107a5828661085c565b9050838110156108055760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610560565b6104bf82868684036108bc565b60003361049c818585610a5a565b60008181526001602052604081206103f690610ed0565b60008281526020819052604090206001015461085281610bfe565b6104ef8383610c2a565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b60006001600160e01b03198216637965db0b60e01b14806103f657506301ffc9a760e01b6001600160e01b03198316146103f6565b6001600160a01b03831661091e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610560565b6001600160a01b03821661097f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610560565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60006109ec848461085c565b90506000198114610a545781811015610a475760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610560565b610a5484848484036108bc565b50505050565b6001600160a01b038316610abe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610560565b6001600160a01b038216610b205760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610560565b610b2b838383610eda565b6001600160a01b03831660009081526002602052604090205481811015610ba35760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610560565b6001600160a01b0380851660008181526002602052604080822086860390559286168082529083902080548601905591516000805160206117a583398151915290610bf19086815260200190565b60405180910390a3610a54565b6106ae8133610ee5565b610c128282610f3e565b60008281526001602052604090206104ef9082610fc2565b610c348282610fd7565b60008281526001602052604090206104ef908261103c565b610c54611051565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038216610cf45760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610560565b610d0060008383610eda565b8060046000828254610d12919061165f565b90915550506001600160a01b0382166000818152600260209081526040808320805486019055518481526000805160206117a5833981519152910160405180910390a35050565b6001600160a01b038216610db95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610560565b610dc582600083610eda565b6001600160a01b03821660009081526002602052604090205481811015610e395760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610560565b6001600160a01b03831660008181526002602090815260408083208686039055600480548790039055518581529192916000805160206117a5833981519152910160405180910390a3505050565b610e8f61109a565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610c813390565b600061075883836110e0565b60006103f6825490565b6104ef83838361110a565b610eef828261075f565b61057357610efc81611170565b610f07836020611182565b604051602001610f18929190611672565b60408051601f198184030181529082905262461bcd60e51b8252610560916004016114ae565b610f48828261075f565b610573576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055610f7e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000610758836001600160a01b03841661131e565b610fe1828261075f565b15610573576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000610758836001600160a01b03841661136d565b60075460ff166106155760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610560565b60075460ff16156106155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610560565b60008260000182815481106110f7576110f76116e1565b9060005260206000200154905092915050565b60075460ff16156104ef5760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610560565b60606103f66001600160a01b03831660145b606060006111918360026116f7565b61119c90600261165f565b67ffffffffffffffff8111156111b4576111b461170e565b6040519080825280601f01601f1916602001820160405280156111de576020820181803683370190505b509050600360fc1b816000815181106111f9576111f96116e1565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611228576112286116e1565b60200101906001600160f81b031916908160001a905350600061124c8460026116f7565b61125790600161165f565b90505b60018111156112cf576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061128b5761128b6116e1565b1a60f81b8282815181106112a1576112a16116e1565b60200101906001600160f81b031916908160001a90535060049490941c936112c881611724565b905061125a565b5083156107585760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610560565b6000818152600183016020526040812054611365575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556103f6565b5060006103f6565b6000818152600183016020526040812054801561145657600061139160018361173b565b85549091506000906113a59060019061173b565b905081811461140a5760008660000182815481106113c5576113c56116e1565b90600052602060002001549050808760000184815481106113e8576113e86116e1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061141b5761141b61174e565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506103f6565b60009150506103f6565b60006020828403121561147257600080fd5b81356001600160e01b03198116811461075857600080fd5b60005b838110156114a557818101518382015260200161148d565b50506000910152565b60208152600082518060208401526114cd81604085016020870161148a565b601f01601f19169190910160400192915050565b80356001600160a01b03811681146114f857600080fd5b919050565b6000806040838503121561151057600080fd5b611519836114e1565b946020939093013593505050565b60008060006060848603121561153c57600080fd5b611545846114e1565b9250611553602085016114e1565b9150604084013590509250925092565b60006020828403121561157557600080fd5b5035919050565b6000806040838503121561158f57600080fd5b8235915061159f602084016114e1565b90509250929050565b6000602082840312156115ba57600080fd5b610758826114e1565b600080604083850312156115d657600080fd5b50508035926020909101359150565b600080604083850312156115f857600080fd5b611601836114e1565b915061159f602084016114e1565b600181811c9082168061162357607f821691505b60208210810361164357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156103f6576103f6611649565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8152600083516116a481601785016020880161148a565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516116d581602884016020880161148a565b01602801949350505050565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176103f6576103f6611649565b634e487b7160e01b600052604160045260246000fd5b60008161173357611733611649565b506000190190565b818103818111156103f6576103f6611649565b634e487b7160e01b600052603160045260246000fdfe45524332305072657365744d696e7465725061757365723a206d75737420686165d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220d5a22b9391b8f37e5b49e43cc1eabfcea8be6d7b5aa0a84dc5daa1b7a05730f364736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} + } + \ No newline at end of file diff --git a/test/contracts/transparentupgradableproxy/transparentupgradableproxy.go b/test/contracts/transparentupgradableproxy/transparentupgradableproxy.go new file mode 100644 index 00000000..2fb3e042 --- /dev/null +++ b/test/contracts/transparentupgradableproxy/transparentupgradableproxy.go @@ -0,0 +1,773 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package transparentupgradableproxy + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// TransparentupgradableproxyMetaData contains all meta data concerning the Transparentupgradableproxy contract. +var TransparentupgradableproxyMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x608060405260405162000f6838038062000f68833981016040819052620000269162000415565b82816200003582825f6200004c565b50620000439050826200007d565b50505062000540565b6200005783620000ee565b5f82511180620000645750805b1562000078576200007683836200012f565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000be5f8051602062000f21833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000eb816200015e565b50565b620000f981620001fb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606062000157838360405180606001604052806027815260200162000f416027913962000292565b9392505050565b6001600160a01b038116620001c95760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b805f8051602062000f218339815191525b80546001600160a01b0319166001600160a01b039290921691909117905550565b6001600160a01b0381163b6200026a5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001c0565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc620001da565b60605f80856001600160a01b031685604051620002b09190620004ef565b5f60405180830381855af49150503d805f8114620002ea576040519150601f19603f3d011682016040523d82523d5f602084013e620002ef565b606091505b50909250905062000303868383876200030d565b9695505050505050565b60608315620003805782515f0362000378576001600160a01b0385163b620003785760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001c0565b50816200038c565b6200038c838362000394565b949350505050565b815115620003a55781518083602001fd5b8060405162461bcd60e51b8152600401620001c091906200050c565b80516001600160a01b0381168114620003d8575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b838110156200040d578181015183820152602001620003f3565b50505f910152565b5f805f6060848603121562000428575f80fd5b6200043384620003c1565b92506200044360208501620003c1565b60408501519092506001600160401b038082111562000460575f80fd5b818601915086601f83011262000474575f80fd5b815181811115620004895762000489620003dd565b604051601f8201601f19908116603f01168101908382118183101715620004b457620004b4620003dd565b81604052828152896020848701011115620004cd575f80fd5b620004e0836020830160208801620003f1565b80955050505050509250925092565b5f825162000502818460208701620003f1565b9190910192915050565b602081525f82518060208401526200052c816040850160208701620003f1565b601f01601f19169190910160400192915050565b6109d3806200054e5f395ff3fe60806040526004361061005d575f3560e01c80635c60da1b116100425780635c60da1b146100a65780638f283970146100e3578063f851a440146101025761006c565b80633659cfe6146100745780634f1ef286146100935761006c565b3661006c5761006a610116565b005b61006a610116565b34801561007f575f80fd5b5061006a61008e366004610854565b610130565b61006a6100a136600461086d565b610178565b3480156100b1575f80fd5b506100ba6101eb565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100ee575f80fd5b5061006a6100fd366004610854565b610228565b34801561010d575f80fd5b506100ba610255565b61011e610282565b61012e610129610359565b610362565b565b610138610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d8160405180602001604052805f8152505f6103bf565b50565b61016d610116565b610180610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101e3576101de8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250600192506103bf915050565b505050565b6101de610116565b5f6101f4610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610359565b905090565b610225610116565b90565b610230610380565b73ffffffffffffffffffffffffffffffffffffffff1633036101705761016d816103e9565b5f61025e610380565b73ffffffffffffffffffffffffffffffffffffffff16330361021d57610218610380565b61028a610380565b73ffffffffffffffffffffffffffffffffffffffff16330361012e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b5f61021861044a565b365f80375f80365f845af43d5f803e80801561037c573d5ff35b3d5ffd5b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b6103c883610471565b5f825111806103d45750805b156101de576103e383836104bd565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f610412610380565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a161016d816104e9565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6103a3565b61047a816105f5565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606104e28383604051806060016040528060278152602001610977602791396106c0565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff811661058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610350565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b73ffffffffffffffffffffffffffffffffffffffff81163b610699576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610350565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105af565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516106e9919061090b565b5f60405180830381855af49150503d805f8114610721576040519150601f19603f3d011682016040523d82523d5f602084013e610726565b606091505b509150915061073786838387610741565b9695505050505050565b606083156107d65782515f036107cf5773ffffffffffffffffffffffffffffffffffffffff85163b6107cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610350565b50816107e0565b6107e083836107e8565b949350505050565b8151156107f85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103509190610926565b803573ffffffffffffffffffffffffffffffffffffffff8116811461084f575f80fd5b919050565b5f60208284031215610864575f80fd5b6104e28261082c565b5f805f6040848603121561087f575f80fd5b6108888461082c565b9250602084013567ffffffffffffffff808211156108a4575f80fd5b818601915086601f8301126108b7575f80fd5b8135818111156108c5575f80fd5b8760208285010111156108d6575f80fd5b6020830194508093505050509250925092565b5f5b838110156109035781810151838201526020016108eb565b50505f910152565b5f825161091c8184602087016108e9565b9190910192915050565b602081525f82518060208401526109448160408501602087016108e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212202ac98acbfbb3d3ac1b74050e18c4e76db25a3ff2801ec69bf85d0c61414d502b64736f6c63430008140033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", +} + +// TransparentupgradableproxyABI is the input ABI used to generate the binding from. +// Deprecated: Use TransparentupgradableproxyMetaData.ABI instead. +var TransparentupgradableproxyABI = TransparentupgradableproxyMetaData.ABI + +// TransparentupgradableproxyBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use TransparentupgradableproxyMetaData.Bin instead. +var TransparentupgradableproxyBin = TransparentupgradableproxyMetaData.Bin + +// DeployTransparentupgradableproxy deploys a new Ethereum contract, binding an instance of Transparentupgradableproxy to it. +func DeployTransparentupgradableproxy(auth *bind.TransactOpts, backend bind.ContractBackend, _logic common.Address, admin_ common.Address, _data []byte) (common.Address, *types.Transaction, *Transparentupgradableproxy, error) { + parsed, err := TransparentupgradableproxyMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(TransparentupgradableproxyBin), backend, _logic, admin_, _data) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Transparentupgradableproxy{TransparentupgradableproxyCaller: TransparentupgradableproxyCaller{contract: contract}, TransparentupgradableproxyTransactor: TransparentupgradableproxyTransactor{contract: contract}, TransparentupgradableproxyFilterer: TransparentupgradableproxyFilterer{contract: contract}}, nil +} + +// Transparentupgradableproxy is an auto generated Go binding around an Ethereum contract. +type Transparentupgradableproxy struct { + TransparentupgradableproxyCaller // Read-only binding to the contract + TransparentupgradableproxyTransactor // Write-only binding to the contract + TransparentupgradableproxyFilterer // Log filterer for contract events +} + +// TransparentupgradableproxyCaller is an auto generated read-only Go binding around an Ethereum contract. +type TransparentupgradableproxyCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TransparentupgradableproxyTransactor is an auto generated write-only Go binding around an Ethereum contract. +type TransparentupgradableproxyTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TransparentupgradableproxyFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type TransparentupgradableproxyFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TransparentupgradableproxySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type TransparentupgradableproxySession struct { + Contract *Transparentupgradableproxy // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// TransparentupgradableproxyCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type TransparentupgradableproxyCallerSession struct { + Contract *TransparentupgradableproxyCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// TransparentupgradableproxyTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type TransparentupgradableproxyTransactorSession struct { + Contract *TransparentupgradableproxyTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// TransparentupgradableproxyRaw is an auto generated low-level Go binding around an Ethereum contract. +type TransparentupgradableproxyRaw struct { + Contract *Transparentupgradableproxy // Generic contract binding to access the raw methods on +} + +// TransparentupgradableproxyCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type TransparentupgradableproxyCallerRaw struct { + Contract *TransparentupgradableproxyCaller // Generic read-only contract binding to access the raw methods on +} + +// TransparentupgradableproxyTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type TransparentupgradableproxyTransactorRaw struct { + Contract *TransparentupgradableproxyTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewTransparentupgradableproxy creates a new instance of Transparentupgradableproxy, bound to a specific deployed contract. +func NewTransparentupgradableproxy(address common.Address, backend bind.ContractBackend) (*Transparentupgradableproxy, error) { + contract, err := bindTransparentupgradableproxy(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Transparentupgradableproxy{TransparentupgradableproxyCaller: TransparentupgradableproxyCaller{contract: contract}, TransparentupgradableproxyTransactor: TransparentupgradableproxyTransactor{contract: contract}, TransparentupgradableproxyFilterer: TransparentupgradableproxyFilterer{contract: contract}}, nil +} + +// NewTransparentupgradableproxyCaller creates a new read-only instance of Transparentupgradableproxy, bound to a specific deployed contract. +func NewTransparentupgradableproxyCaller(address common.Address, caller bind.ContractCaller) (*TransparentupgradableproxyCaller, error) { + contract, err := bindTransparentupgradableproxy(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &TransparentupgradableproxyCaller{contract: contract}, nil +} + +// NewTransparentupgradableproxyTransactor creates a new write-only instance of Transparentupgradableproxy, bound to a specific deployed contract. +func NewTransparentupgradableproxyTransactor(address common.Address, transactor bind.ContractTransactor) (*TransparentupgradableproxyTransactor, error) { + contract, err := bindTransparentupgradableproxy(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &TransparentupgradableproxyTransactor{contract: contract}, nil +} + +// NewTransparentupgradableproxyFilterer creates a new log filterer instance of Transparentupgradableproxy, bound to a specific deployed contract. +func NewTransparentupgradableproxyFilterer(address common.Address, filterer bind.ContractFilterer) (*TransparentupgradableproxyFilterer, error) { + contract, err := bindTransparentupgradableproxy(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &TransparentupgradableproxyFilterer{contract: contract}, nil +} + +// bindTransparentupgradableproxy binds a generic wrapper to an already deployed contract. +func bindTransparentupgradableproxy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := TransparentupgradableproxyMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Transparentupgradableproxy *TransparentupgradableproxyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Transparentupgradableproxy.Contract.TransparentupgradableproxyCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Transparentupgradableproxy *TransparentupgradableproxyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.TransparentupgradableproxyTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Transparentupgradableproxy *TransparentupgradableproxyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.TransparentupgradableproxyTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Transparentupgradableproxy *TransparentupgradableproxyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Transparentupgradableproxy.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.contract.Transact(opts, method, params...) +} + +// Admin is a paid mutator transaction binding the contract method 0xf851a440. +// +// Solidity: function admin() returns(address admin_) +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactor) Admin(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Transparentupgradableproxy.contract.Transact(opts, "admin") +} + +// Admin is a paid mutator transaction binding the contract method 0xf851a440. +// +// Solidity: function admin() returns(address admin_) +func (_Transparentupgradableproxy *TransparentupgradableproxySession) Admin() (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.Admin(&_Transparentupgradableproxy.TransactOpts) +} + +// Admin is a paid mutator transaction binding the contract method 0xf851a440. +// +// Solidity: function admin() returns(address admin_) +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactorSession) Admin() (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.Admin(&_Transparentupgradableproxy.TransactOpts) +} + +// ChangeAdmin is a paid mutator transaction binding the contract method 0x8f283970. +// +// Solidity: function changeAdmin(address newAdmin) returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactor) ChangeAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { + return _Transparentupgradableproxy.contract.Transact(opts, "changeAdmin", newAdmin) +} + +// ChangeAdmin is a paid mutator transaction binding the contract method 0x8f283970. +// +// Solidity: function changeAdmin(address newAdmin) returns() +func (_Transparentupgradableproxy *TransparentupgradableproxySession) ChangeAdmin(newAdmin common.Address) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.ChangeAdmin(&_Transparentupgradableproxy.TransactOpts, newAdmin) +} + +// ChangeAdmin is a paid mutator transaction binding the contract method 0x8f283970. +// +// Solidity: function changeAdmin(address newAdmin) returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactorSession) ChangeAdmin(newAdmin common.Address) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.ChangeAdmin(&_Transparentupgradableproxy.TransactOpts, newAdmin) +} + +// Implementation is a paid mutator transaction binding the contract method 0x5c60da1b. +// +// Solidity: function implementation() returns(address implementation_) +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactor) Implementation(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Transparentupgradableproxy.contract.Transact(opts, "implementation") +} + +// Implementation is a paid mutator transaction binding the contract method 0x5c60da1b. +// +// Solidity: function implementation() returns(address implementation_) +func (_Transparentupgradableproxy *TransparentupgradableproxySession) Implementation() (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.Implementation(&_Transparentupgradableproxy.TransactOpts) +} + +// Implementation is a paid mutator transaction binding the contract method 0x5c60da1b. +// +// Solidity: function implementation() returns(address implementation_) +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactorSession) Implementation() (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.Implementation(&_Transparentupgradableproxy.TransactOpts) +} + +// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. +// +// Solidity: function upgradeTo(address newImplementation) returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactor) UpgradeTo(opts *bind.TransactOpts, newImplementation common.Address) (*types.Transaction, error) { + return _Transparentupgradableproxy.contract.Transact(opts, "upgradeTo", newImplementation) +} + +// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. +// +// Solidity: function upgradeTo(address newImplementation) returns() +func (_Transparentupgradableproxy *TransparentupgradableproxySession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.UpgradeTo(&_Transparentupgradableproxy.TransactOpts, newImplementation) +} + +// UpgradeTo is a paid mutator transaction binding the contract method 0x3659cfe6. +// +// Solidity: function upgradeTo(address newImplementation) returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactorSession) UpgradeTo(newImplementation common.Address) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.UpgradeTo(&_Transparentupgradableproxy.TransactOpts, newImplementation) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _Transparentupgradableproxy.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_Transparentupgradableproxy *TransparentupgradableproxySession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.UpgradeToAndCall(&_Transparentupgradableproxy.TransactOpts, newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.UpgradeToAndCall(&_Transparentupgradableproxy.TransactOpts, newImplementation, data) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _Transparentupgradableproxy.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Transparentupgradableproxy *TransparentupgradableproxySession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.Fallback(&_Transparentupgradableproxy.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.Fallback(&_Transparentupgradableproxy.TransactOpts, calldata) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Transparentupgradableproxy.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Transparentupgradableproxy *TransparentupgradableproxySession) Receive() (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.Receive(&_Transparentupgradableproxy.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Transparentupgradableproxy *TransparentupgradableproxyTransactorSession) Receive() (*types.Transaction, error) { + return _Transparentupgradableproxy.Contract.Receive(&_Transparentupgradableproxy.TransactOpts) +} + +// TransparentupgradableproxyAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the Transparentupgradableproxy contract. +type TransparentupgradableproxyAdminChangedIterator struct { + Event *TransparentupgradableproxyAdminChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TransparentupgradableproxyAdminChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TransparentupgradableproxyAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TransparentupgradableproxyAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TransparentupgradableproxyAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TransparentupgradableproxyAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TransparentupgradableproxyAdminChanged represents a AdminChanged event raised by the Transparentupgradableproxy contract. +type TransparentupgradableproxyAdminChanged struct { + PreviousAdmin common.Address + NewAdmin common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAdminChanged is a free log retrieval operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_Transparentupgradableproxy *TransparentupgradableproxyFilterer) FilterAdminChanged(opts *bind.FilterOpts) (*TransparentupgradableproxyAdminChangedIterator, error) { + + logs, sub, err := _Transparentupgradableproxy.contract.FilterLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return &TransparentupgradableproxyAdminChangedIterator{contract: _Transparentupgradableproxy.contract, event: "AdminChanged", logs: logs, sub: sub}, nil +} + +// WatchAdminChanged is a free log subscription operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_Transparentupgradableproxy *TransparentupgradableproxyFilterer) WatchAdminChanged(opts *bind.WatchOpts, sink chan<- *TransparentupgradableproxyAdminChanged) (event.Subscription, error) { + + logs, sub, err := _Transparentupgradableproxy.contract.WatchLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TransparentupgradableproxyAdminChanged) + if err := _Transparentupgradableproxy.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAdminChanged is a log parse operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_Transparentupgradableproxy *TransparentupgradableproxyFilterer) ParseAdminChanged(log types.Log) (*TransparentupgradableproxyAdminChanged, error) { + event := new(TransparentupgradableproxyAdminChanged) + if err := _Transparentupgradableproxy.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TransparentupgradableproxyBeaconUpgradedIterator is returned from FilterBeaconUpgraded and is used to iterate over the raw logs and unpacked data for BeaconUpgraded events raised by the Transparentupgradableproxy contract. +type TransparentupgradableproxyBeaconUpgradedIterator struct { + Event *TransparentupgradableproxyBeaconUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TransparentupgradableproxyBeaconUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TransparentupgradableproxyBeaconUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TransparentupgradableproxyBeaconUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TransparentupgradableproxyBeaconUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TransparentupgradableproxyBeaconUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TransparentupgradableproxyBeaconUpgraded represents a BeaconUpgraded event raised by the Transparentupgradableproxy contract. +type TransparentupgradableproxyBeaconUpgraded struct { + Beacon common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBeaconUpgraded is a free log retrieval operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. +// +// Solidity: event BeaconUpgraded(address indexed beacon) +func (_Transparentupgradableproxy *TransparentupgradableproxyFilterer) FilterBeaconUpgraded(opts *bind.FilterOpts, beacon []common.Address) (*TransparentupgradableproxyBeaconUpgradedIterator, error) { + + var beaconRule []interface{} + for _, beaconItem := range beacon { + beaconRule = append(beaconRule, beaconItem) + } + + logs, sub, err := _Transparentupgradableproxy.contract.FilterLogs(opts, "BeaconUpgraded", beaconRule) + if err != nil { + return nil, err + } + return &TransparentupgradableproxyBeaconUpgradedIterator{contract: _Transparentupgradableproxy.contract, event: "BeaconUpgraded", logs: logs, sub: sub}, nil +} + +// WatchBeaconUpgraded is a free log subscription operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. +// +// Solidity: event BeaconUpgraded(address indexed beacon) +func (_Transparentupgradableproxy *TransparentupgradableproxyFilterer) WatchBeaconUpgraded(opts *bind.WatchOpts, sink chan<- *TransparentupgradableproxyBeaconUpgraded, beacon []common.Address) (event.Subscription, error) { + + var beaconRule []interface{} + for _, beaconItem := range beacon { + beaconRule = append(beaconRule, beaconItem) + } + + logs, sub, err := _Transparentupgradableproxy.contract.WatchLogs(opts, "BeaconUpgraded", beaconRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TransparentupgradableproxyBeaconUpgraded) + if err := _Transparentupgradableproxy.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBeaconUpgraded is a log parse operation binding the contract event 0x1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e. +// +// Solidity: event BeaconUpgraded(address indexed beacon) +func (_Transparentupgradableproxy *TransparentupgradableproxyFilterer) ParseBeaconUpgraded(log types.Log) (*TransparentupgradableproxyBeaconUpgraded, error) { + event := new(TransparentupgradableproxyBeaconUpgraded) + if err := _Transparentupgradableproxy.contract.UnpackLog(event, "BeaconUpgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TransparentupgradableproxyUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the Transparentupgradableproxy contract. +type TransparentupgradableproxyUpgradedIterator struct { + Event *TransparentupgradableproxyUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TransparentupgradableproxyUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TransparentupgradableproxyUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TransparentupgradableproxyUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TransparentupgradableproxyUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TransparentupgradableproxyUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TransparentupgradableproxyUpgraded represents a Upgraded event raised by the Transparentupgradableproxy contract. +type TransparentupgradableproxyUpgraded struct { + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Transparentupgradableproxy *TransparentupgradableproxyFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*TransparentupgradableproxyUpgradedIterator, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Transparentupgradableproxy.contract.FilterLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return &TransparentupgradableproxyUpgradedIterator{contract: _Transparentupgradableproxy.contract, event: "Upgraded", logs: logs, sub: sub}, nil +} + +// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Transparentupgradableproxy *TransparentupgradableproxyFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *TransparentupgradableproxyUpgraded, implementation []common.Address) (event.Subscription, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Transparentupgradableproxy.contract.WatchLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TransparentupgradableproxyUpgraded) + if err := _Transparentupgradableproxy.contract.UnpackLog(event, "Upgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Transparentupgradableproxy *TransparentupgradableproxyFilterer) ParseUpgraded(log types.Log) (*TransparentupgradableproxyUpgraded, error) { + event := new(TransparentupgradableproxyUpgraded) + if err := _Transparentupgradableproxy.contract.UnpackLog(event, "Upgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/test/contracts/verifybatchesmock/VerifyBatchesMock.sol b/test/contracts/verifybatchesmock/VerifyBatchesMock.sol new file mode 100644 index 00000000..34db310a --- /dev/null +++ b/test/contracts/verifybatchesmock/VerifyBatchesMock.sol @@ -0,0 +1,163 @@ +// SPDX-License-Identifier: AGPL-3.0 + +pragma solidity 0.8.18; + +interface IBasePolygonZkEVMGlobalExitRoot { + /** + * @dev Thrown when the caller is not the allowed contracts + */ + error OnlyAllowedContracts(); + + function updateExitRoot(bytes32 newRollupExitRoot) external; + + function globalExitRootMap( + bytes32 globalExitRootNum + ) external returns (uint256); +} + +interface IPolygonZkEVMGlobalExitRootV2 is IBasePolygonZkEVMGlobalExitRoot { + function getLastGlobalExitRoot() external view returns (bytes32); + + function getRoot() external view returns (bytes32); +} + +contract VerifyBatchesMock { + uint256 internal constant _EXIT_TREE_DEPTH = 32; + IPolygonZkEVMGlobalExitRootV2 public immutable globalExitRootManager; + uint32 public rollupCount; + mapping(uint32 rollupID => bytes32) public rollupIDToLastExitRoot; + + event VerifyBatches( + uint32 indexed rollupID, + uint64 numBatch, + bytes32 stateRoot, + bytes32 exitRoot, + address indexed aggregator + ); + + event VerifyBatchesTrustedAggregator( + uint32 indexed rollupID, + uint64 numBatch, + bytes32 stateRoot, + bytes32 exitRoot, + address indexed aggregator + ); + + constructor( + IPolygonZkEVMGlobalExitRootV2 _globalExitRootManager + ) { + globalExitRootManager = _globalExitRootManager; + } + + function verifyBatches( + uint32 rollupID, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bool updateGER + ) external { + if (rollupID > rollupCount) { + rollupCount = rollupID; + } + rollupIDToLastExitRoot[rollupID] = newLocalExitRoot; + if (updateGER) { + globalExitRootManager.updateExitRoot(getRollupExitRoot()); + } + + emit VerifyBatches( + rollupID, + finalNewBatch, + newStateRoot, + newLocalExitRoot, + msg.sender + ); + } + + function verifyBatchesTrustedAggregator( + uint32 rollupID, + uint64 finalNewBatch, + bytes32 newLocalExitRoot, + bytes32 newStateRoot, + bool updateGER + ) external { + if (rollupID > rollupCount) { + rollupCount = rollupID; + } + rollupIDToLastExitRoot[rollupID] = newLocalExitRoot; + if (updateGER) { + globalExitRootManager.updateExitRoot(getRollupExitRoot()); + } + + emit VerifyBatchesTrustedAggregator( + rollupID, + finalNewBatch, + newStateRoot, + newLocalExitRoot, + msg.sender + ); + } + + + function getRollupExitRoot() public view returns (bytes32) { + uint256 currentNodes = rollupCount; + + // If there are no nodes return 0 + if (currentNodes == 0) { + return bytes32(0); + } + + // This array will contain the nodes of the current iteration + bytes32[] memory tmpTree = new bytes32[](currentNodes); + + // In the first iteration the nodes will be the leafs which are the local exit roots of each network + for (uint256 i = 0; i < currentNodes; i++) { + // The first rollup ID starts on 1 + tmpTree[i] = rollupIDToLastExitRoot[uint32(i + 1)]; + } + + // This variable will keep track of the zero hashes + bytes32 currentZeroHashHeight = 0; + + // This variable will keep track of the reamining levels to compute + uint256 remainingLevels = _EXIT_TREE_DEPTH; + + // Calculate the root of the sub-tree that contains all the localExitRoots + while (currentNodes != 1) { + uint256 nextIterationNodes = currentNodes / 2 + (currentNodes % 2); + bytes32[] memory nextTmpTree = new bytes32[](nextIterationNodes); + for (uint256 i = 0; i < nextIterationNodes; i++) { + // if we are on the last iteration of the current level and the nodes are odd + if (i == nextIterationNodes - 1 && (currentNodes % 2) == 1) { + nextTmpTree[i] = keccak256( + abi.encodePacked(tmpTree[i * 2], currentZeroHashHeight) + ); + } else { + nextTmpTree[i] = keccak256( + abi.encodePacked(tmpTree[i * 2], tmpTree[(i * 2) + 1]) + ); + } + } + + // Update tree variables + tmpTree = nextTmpTree; + currentNodes = nextIterationNodes; + currentZeroHashHeight = keccak256( + abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) + ); + remainingLevels--; + } + + bytes32 currentRoot = tmpTree[0]; + + // Calculate remaining levels, since it's a sequencial merkle tree, the rest of the tree are zeroes + for (uint256 i = 0; i < remainingLevels; i++) { + currentRoot = keccak256( + abi.encodePacked(currentRoot, currentZeroHashHeight) + ); + currentZeroHashHeight = keccak256( + abi.encodePacked(currentZeroHashHeight, currentZeroHashHeight) + ); + } + return currentRoot; + } +} \ No newline at end of file diff --git a/test/contracts/verifybatchesmock/verifybatchesmock.go b/test/contracts/verifybatchesmock/verifybatchesmock.go new file mode 100644 index 00000000..58b67630 --- /dev/null +++ b/test/contracts/verifybatchesmock/verifybatchesmock.go @@ -0,0 +1,685 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package verifybatchesmock + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// VerifybatchesmockMetaData contains all meta data concerning the Verifybatchesmock contract. +var VerifybatchesmockMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRootV2\",\"name\":\"_globalExitRootManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatches\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"numBatch\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"exitRoot\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"aggregator\",\"type\":\"address\"}],\"name\":\"VerifyBatchesTrustedAggregator\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getRollupExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"globalExitRootManager\",\"outputs\":[{\"internalType\":\"contractIPolygonZkEVMGlobalExitRootV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupCount\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"}],\"name\":\"rollupIDToLastExitRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"updateGER\",\"type\":\"bool\"}],\"name\":\"verifyBatches\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"rollupID\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"finalNewBatch\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"newLocalExitRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"updateGER\",\"type\":\"bool\"}],\"name\":\"verifyBatchesTrustedAggregator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60a060405234801561001057600080fd5b5060405161097138038061097183398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516108d96100986000396000818160bc01528181610178015261062e01526108d96000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80630680cf5c1461006757806343955dd31461009a578063a2967d99146100af578063d02103ca146100b7578063db3abdb9146100f6578063f4e9267514610109575b600080fd5b61008761007536600461071f565b60016020526000908152604090205481565b6040519081526020015b60405180910390f35b6100ad6100a8366004610741565b61012e565b005b61008761025b565b6100de7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610091565b6100ad610104366004610741565b6105e4565b6000546101199063ffffffff1681565b60405163ffffffff9091168152602001610091565b60005463ffffffff9081169086161115610158576000805463ffffffff191663ffffffff87161790555b63ffffffff8516600090815260016020526040902083905580156101fe577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d6101ad61025b565b6040518263ffffffff1660e01b81526004016101cb91815260200190565b600060405180830381600087803b1580156101e557600080fd5b505af11580156101f9573d6000803e3d6000fd5b505050505b6040805167ffffffffffffffff8616815260208101849052908101849052339063ffffffff8716907fd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3906060015b60405180910390a35050505050565b6000805463ffffffff1680820361027457506000919050565b60008167ffffffffffffffff81111561028f5761028f6107b0565b6040519080825280602002602001820160405280156102b8578160200160208202803683370190505b50905060005b8281101561031e57600160006102d483836107dc565b63ffffffff1663ffffffff16815260200190815260200160002054828281518110610301576103016107f5565b6020908102919091010152806103168161080b565b9150506102be565b50600060205b8360011461054857600061033960028661083a565b61034460028761084e565b61034e91906107dc565b905060008167ffffffffffffffff81111561036b5761036b6107b0565b604051908082528060200260200182016040528015610394578160200160208202803683370190505b50905060005b828110156104f8576103ad600184610862565b811480156103c557506103c160028861083a565b6001145b1561044257856103d6826002610875565b815181106103e6576103e66107f5565b602002602001015185604051602001610409929190918252602082015260400190565b60405160208183030381529060405280519060200120828281518110610431576104316107f5565b6020026020010181815250506104e6565b8561044e826002610875565b8151811061045e5761045e6107f5565b6020026020010151868260026104749190610875565b61047f9060016107dc565b8151811061048f5761048f6107f5565b60200260200101516040516020016104b1929190918252602082015260400190565b604051602081830303815290604052805190602001208282815181106104d9576104d96107f5565b6020026020010181815250505b806104f08161080b565b91505061039a565b50809450819550838460405160200161051b929190918252602082015260400190565b604051602081830303815290604052805190602001209350828061053e9061088c565b9350505050610324565b60008360008151811061055d5761055d6107f5565b6020026020010151905060005b828110156105da57604080516020810184905290810185905260600160408051601f198184030181528282528051602091820120908301879052908201869052925060600160405160208183030381529060405280519060200120935080806105d29061080b565b91505061056a565b5095945050505050565b60005463ffffffff908116908616111561060e576000805463ffffffff191663ffffffff87161790555b63ffffffff8516600090815260016020526040902083905580156106b4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333d6247d61066361025b565b6040518263ffffffff1660e01b815260040161068191815260200190565b600060405180830381600087803b15801561069b57600080fd5b505af11580156106af573d6000803e3d6000fd5b505050505b6040805167ffffffffffffffff8616815260208101849052908101849052339063ffffffff8716907faac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b49060600161024c565b803563ffffffff8116811461071a57600080fd5b919050565b60006020828403121561073157600080fd5b61073a82610706565b9392505050565b600080600080600060a0868803121561075957600080fd5b61076286610706565b9450602086013567ffffffffffffffff8116811461077f57600080fd5b93506040860135925060608601359150608086013580151581146107a257600080fd5b809150509295509295909350565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156107ef576107ef6107c6565b92915050565b634e487b7160e01b600052603260045260246000fd5b60006001820161081d5761081d6107c6565b5060010190565b634e487b7160e01b600052601260045260246000fd5b60008261084957610849610824565b500690565b60008261085d5761085d610824565b500490565b818103818111156107ef576107ef6107c6565b80820281158282048414176107ef576107ef6107c6565b60008161089b5761089b6107c6565b50600019019056fea26469706673582212204b504ae2d3686f35f611e3ef5bc38d1f2d64ce4fea28c7a2a657dbe4ba6178ce64736f6c63430008120033", +} + +// VerifybatchesmockABI is the input ABI used to generate the binding from. +// Deprecated: Use VerifybatchesmockMetaData.ABI instead. +var VerifybatchesmockABI = VerifybatchesmockMetaData.ABI + +// VerifybatchesmockBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use VerifybatchesmockMetaData.Bin instead. +var VerifybatchesmockBin = VerifybatchesmockMetaData.Bin + +// DeployVerifybatchesmock deploys a new Ethereum contract, binding an instance of Verifybatchesmock to it. +func DeployVerifybatchesmock(auth *bind.TransactOpts, backend bind.ContractBackend, _globalExitRootManager common.Address) (common.Address, *types.Transaction, *Verifybatchesmock, error) { + parsed, err := VerifybatchesmockMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(VerifybatchesmockBin), backend, _globalExitRootManager) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Verifybatchesmock{VerifybatchesmockCaller: VerifybatchesmockCaller{contract: contract}, VerifybatchesmockTransactor: VerifybatchesmockTransactor{contract: contract}, VerifybatchesmockFilterer: VerifybatchesmockFilterer{contract: contract}}, nil +} + +// Verifybatchesmock is an auto generated Go binding around an Ethereum contract. +type Verifybatchesmock struct { + VerifybatchesmockCaller // Read-only binding to the contract + VerifybatchesmockTransactor // Write-only binding to the contract + VerifybatchesmockFilterer // Log filterer for contract events +} + +// VerifybatchesmockCaller is an auto generated read-only Go binding around an Ethereum contract. +type VerifybatchesmockCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// VerifybatchesmockTransactor is an auto generated write-only Go binding around an Ethereum contract. +type VerifybatchesmockTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// VerifybatchesmockFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type VerifybatchesmockFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// VerifybatchesmockSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type VerifybatchesmockSession struct { + Contract *Verifybatchesmock // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// VerifybatchesmockCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type VerifybatchesmockCallerSession struct { + Contract *VerifybatchesmockCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// VerifybatchesmockTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type VerifybatchesmockTransactorSession struct { + Contract *VerifybatchesmockTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// VerifybatchesmockRaw is an auto generated low-level Go binding around an Ethereum contract. +type VerifybatchesmockRaw struct { + Contract *Verifybatchesmock // Generic contract binding to access the raw methods on +} + +// VerifybatchesmockCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type VerifybatchesmockCallerRaw struct { + Contract *VerifybatchesmockCaller // Generic read-only contract binding to access the raw methods on +} + +// VerifybatchesmockTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type VerifybatchesmockTransactorRaw struct { + Contract *VerifybatchesmockTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewVerifybatchesmock creates a new instance of Verifybatchesmock, bound to a specific deployed contract. +func NewVerifybatchesmock(address common.Address, backend bind.ContractBackend) (*Verifybatchesmock, error) { + contract, err := bindVerifybatchesmock(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Verifybatchesmock{VerifybatchesmockCaller: VerifybatchesmockCaller{contract: contract}, VerifybatchesmockTransactor: VerifybatchesmockTransactor{contract: contract}, VerifybatchesmockFilterer: VerifybatchesmockFilterer{contract: contract}}, nil +} + +// NewVerifybatchesmockCaller creates a new read-only instance of Verifybatchesmock, bound to a specific deployed contract. +func NewVerifybatchesmockCaller(address common.Address, caller bind.ContractCaller) (*VerifybatchesmockCaller, error) { + contract, err := bindVerifybatchesmock(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &VerifybatchesmockCaller{contract: contract}, nil +} + +// NewVerifybatchesmockTransactor creates a new write-only instance of Verifybatchesmock, bound to a specific deployed contract. +func NewVerifybatchesmockTransactor(address common.Address, transactor bind.ContractTransactor) (*VerifybatchesmockTransactor, error) { + contract, err := bindVerifybatchesmock(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &VerifybatchesmockTransactor{contract: contract}, nil +} + +// NewVerifybatchesmockFilterer creates a new log filterer instance of Verifybatchesmock, bound to a specific deployed contract. +func NewVerifybatchesmockFilterer(address common.Address, filterer bind.ContractFilterer) (*VerifybatchesmockFilterer, error) { + contract, err := bindVerifybatchesmock(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &VerifybatchesmockFilterer{contract: contract}, nil +} + +// bindVerifybatchesmock binds a generic wrapper to an already deployed contract. +func bindVerifybatchesmock(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := VerifybatchesmockMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Verifybatchesmock *VerifybatchesmockRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Verifybatchesmock.Contract.VerifybatchesmockCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Verifybatchesmock *VerifybatchesmockRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Verifybatchesmock.Contract.VerifybatchesmockTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Verifybatchesmock *VerifybatchesmockRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Verifybatchesmock.Contract.VerifybatchesmockTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Verifybatchesmock *VerifybatchesmockCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Verifybatchesmock.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Verifybatchesmock *VerifybatchesmockTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Verifybatchesmock.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Verifybatchesmock *VerifybatchesmockTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Verifybatchesmock.Contract.contract.Transact(opts, method, params...) +} + +// GetRollupExitRoot is a free data retrieval call binding the contract method 0xa2967d99. +// +// Solidity: function getRollupExitRoot() view returns(bytes32) +func (_Verifybatchesmock *VerifybatchesmockCaller) GetRollupExitRoot(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Verifybatchesmock.contract.Call(opts, &out, "getRollupExitRoot") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetRollupExitRoot is a free data retrieval call binding the contract method 0xa2967d99. +// +// Solidity: function getRollupExitRoot() view returns(bytes32) +func (_Verifybatchesmock *VerifybatchesmockSession) GetRollupExitRoot() ([32]byte, error) { + return _Verifybatchesmock.Contract.GetRollupExitRoot(&_Verifybatchesmock.CallOpts) +} + +// GetRollupExitRoot is a free data retrieval call binding the contract method 0xa2967d99. +// +// Solidity: function getRollupExitRoot() view returns(bytes32) +func (_Verifybatchesmock *VerifybatchesmockCallerSession) GetRollupExitRoot() ([32]byte, error) { + return _Verifybatchesmock.Contract.GetRollupExitRoot(&_Verifybatchesmock.CallOpts) +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Verifybatchesmock *VerifybatchesmockCaller) GlobalExitRootManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Verifybatchesmock.contract.Call(opts, &out, "globalExitRootManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Verifybatchesmock *VerifybatchesmockSession) GlobalExitRootManager() (common.Address, error) { + return _Verifybatchesmock.Contract.GlobalExitRootManager(&_Verifybatchesmock.CallOpts) +} + +// GlobalExitRootManager is a free data retrieval call binding the contract method 0xd02103ca. +// +// Solidity: function globalExitRootManager() view returns(address) +func (_Verifybatchesmock *VerifybatchesmockCallerSession) GlobalExitRootManager() (common.Address, error) { + return _Verifybatchesmock.Contract.GlobalExitRootManager(&_Verifybatchesmock.CallOpts) +} + +// RollupCount is a free data retrieval call binding the contract method 0xf4e92675. +// +// Solidity: function rollupCount() view returns(uint32) +func (_Verifybatchesmock *VerifybatchesmockCaller) RollupCount(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _Verifybatchesmock.contract.Call(opts, &out, "rollupCount") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// RollupCount is a free data retrieval call binding the contract method 0xf4e92675. +// +// Solidity: function rollupCount() view returns(uint32) +func (_Verifybatchesmock *VerifybatchesmockSession) RollupCount() (uint32, error) { + return _Verifybatchesmock.Contract.RollupCount(&_Verifybatchesmock.CallOpts) +} + +// RollupCount is a free data retrieval call binding the contract method 0xf4e92675. +// +// Solidity: function rollupCount() view returns(uint32) +func (_Verifybatchesmock *VerifybatchesmockCallerSession) RollupCount() (uint32, error) { + return _Verifybatchesmock.Contract.RollupCount(&_Verifybatchesmock.CallOpts) +} + +// RollupIDToLastExitRoot is a free data retrieval call binding the contract method 0x0680cf5c. +// +// Solidity: function rollupIDToLastExitRoot(uint32 rollupID) view returns(bytes32) +func (_Verifybatchesmock *VerifybatchesmockCaller) RollupIDToLastExitRoot(opts *bind.CallOpts, rollupID uint32) ([32]byte, error) { + var out []interface{} + err := _Verifybatchesmock.contract.Call(opts, &out, "rollupIDToLastExitRoot", rollupID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// RollupIDToLastExitRoot is a free data retrieval call binding the contract method 0x0680cf5c. +// +// Solidity: function rollupIDToLastExitRoot(uint32 rollupID) view returns(bytes32) +func (_Verifybatchesmock *VerifybatchesmockSession) RollupIDToLastExitRoot(rollupID uint32) ([32]byte, error) { + return _Verifybatchesmock.Contract.RollupIDToLastExitRoot(&_Verifybatchesmock.CallOpts, rollupID) +} + +// RollupIDToLastExitRoot is a free data retrieval call binding the contract method 0x0680cf5c. +// +// Solidity: function rollupIDToLastExitRoot(uint32 rollupID) view returns(bytes32) +func (_Verifybatchesmock *VerifybatchesmockCallerSession) RollupIDToLastExitRoot(rollupID uint32) ([32]byte, error) { + return _Verifybatchesmock.Contract.RollupIDToLastExitRoot(&_Verifybatchesmock.CallOpts, rollupID) +} + +// VerifyBatches is a paid mutator transaction binding the contract method 0xdb3abdb9. +// +// Solidity: function verifyBatches(uint32 rollupID, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bool updateGER) returns() +func (_Verifybatchesmock *VerifybatchesmockTransactor) VerifyBatches(opts *bind.TransactOpts, rollupID uint32, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, updateGER bool) (*types.Transaction, error) { + return _Verifybatchesmock.contract.Transact(opts, "verifyBatches", rollupID, finalNewBatch, newLocalExitRoot, newStateRoot, updateGER) +} + +// VerifyBatches is a paid mutator transaction binding the contract method 0xdb3abdb9. +// +// Solidity: function verifyBatches(uint32 rollupID, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bool updateGER) returns() +func (_Verifybatchesmock *VerifybatchesmockSession) VerifyBatches(rollupID uint32, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, updateGER bool) (*types.Transaction, error) { + return _Verifybatchesmock.Contract.VerifyBatches(&_Verifybatchesmock.TransactOpts, rollupID, finalNewBatch, newLocalExitRoot, newStateRoot, updateGER) +} + +// VerifyBatches is a paid mutator transaction binding the contract method 0xdb3abdb9. +// +// Solidity: function verifyBatches(uint32 rollupID, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bool updateGER) returns() +func (_Verifybatchesmock *VerifybatchesmockTransactorSession) VerifyBatches(rollupID uint32, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, updateGER bool) (*types.Transaction, error) { + return _Verifybatchesmock.Contract.VerifyBatches(&_Verifybatchesmock.TransactOpts, rollupID, finalNewBatch, newLocalExitRoot, newStateRoot, updateGER) +} + +// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0x43955dd3. +// +// Solidity: function verifyBatchesTrustedAggregator(uint32 rollupID, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bool updateGER) returns() +func (_Verifybatchesmock *VerifybatchesmockTransactor) VerifyBatchesTrustedAggregator(opts *bind.TransactOpts, rollupID uint32, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, updateGER bool) (*types.Transaction, error) { + return _Verifybatchesmock.contract.Transact(opts, "verifyBatchesTrustedAggregator", rollupID, finalNewBatch, newLocalExitRoot, newStateRoot, updateGER) +} + +// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0x43955dd3. +// +// Solidity: function verifyBatchesTrustedAggregator(uint32 rollupID, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bool updateGER) returns() +func (_Verifybatchesmock *VerifybatchesmockSession) VerifyBatchesTrustedAggregator(rollupID uint32, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, updateGER bool) (*types.Transaction, error) { + return _Verifybatchesmock.Contract.VerifyBatchesTrustedAggregator(&_Verifybatchesmock.TransactOpts, rollupID, finalNewBatch, newLocalExitRoot, newStateRoot, updateGER) +} + +// VerifyBatchesTrustedAggregator is a paid mutator transaction binding the contract method 0x43955dd3. +// +// Solidity: function verifyBatchesTrustedAggregator(uint32 rollupID, uint64 finalNewBatch, bytes32 newLocalExitRoot, bytes32 newStateRoot, bool updateGER) returns() +func (_Verifybatchesmock *VerifybatchesmockTransactorSession) VerifyBatchesTrustedAggregator(rollupID uint32, finalNewBatch uint64, newLocalExitRoot [32]byte, newStateRoot [32]byte, updateGER bool) (*types.Transaction, error) { + return _Verifybatchesmock.Contract.VerifyBatchesTrustedAggregator(&_Verifybatchesmock.TransactOpts, rollupID, finalNewBatch, newLocalExitRoot, newStateRoot, updateGER) +} + +// VerifybatchesmockVerifyBatchesIterator is returned from FilterVerifyBatches and is used to iterate over the raw logs and unpacked data for VerifyBatches events raised by the Verifybatchesmock contract. +type VerifybatchesmockVerifyBatchesIterator struct { + Event *VerifybatchesmockVerifyBatches // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *VerifybatchesmockVerifyBatchesIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(VerifybatchesmockVerifyBatches) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(VerifybatchesmockVerifyBatches) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *VerifybatchesmockVerifyBatchesIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifybatchesmockVerifyBatchesIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifybatchesmockVerifyBatches represents a VerifyBatches event raised by the Verifybatchesmock contract. +type VerifybatchesmockVerifyBatches struct { + RollupID uint32 + NumBatch uint64 + StateRoot [32]byte + ExitRoot [32]byte + Aggregator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterVerifyBatches is a free log retrieval operation binding the contract event 0xaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4. +// +// Solidity: event VerifyBatches(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verifybatchesmock *VerifybatchesmockFilterer) FilterVerifyBatches(opts *bind.FilterOpts, rollupID []uint32, aggregator []common.Address) (*VerifybatchesmockVerifyBatchesIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Verifybatchesmock.contract.FilterLogs(opts, "VerifyBatches", rollupIDRule, aggregatorRule) + if err != nil { + return nil, err + } + return &VerifybatchesmockVerifyBatchesIterator{contract: _Verifybatchesmock.contract, event: "VerifyBatches", logs: logs, sub: sub}, nil +} + +// WatchVerifyBatches is a free log subscription operation binding the contract event 0xaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4. +// +// Solidity: event VerifyBatches(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verifybatchesmock *VerifybatchesmockFilterer) WatchVerifyBatches(opts *bind.WatchOpts, sink chan<- *VerifybatchesmockVerifyBatches, rollupID []uint32, aggregator []common.Address) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Verifybatchesmock.contract.WatchLogs(opts, "VerifyBatches", rollupIDRule, aggregatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(VerifybatchesmockVerifyBatches) + if err := _Verifybatchesmock.contract.UnpackLog(event, "VerifyBatches", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseVerifyBatches is a log parse operation binding the contract event 0xaac1e7a157b259544ebacd6e8a82ae5d6c8f174e12aa48696277bcc9a661f0b4. +// +// Solidity: event VerifyBatches(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verifybatchesmock *VerifybatchesmockFilterer) ParseVerifyBatches(log types.Log) (*VerifybatchesmockVerifyBatches, error) { + event := new(VerifybatchesmockVerifyBatches) + if err := _Verifybatchesmock.contract.UnpackLog(event, "VerifyBatches", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// VerifybatchesmockVerifyBatchesTrustedAggregatorIterator is returned from FilterVerifyBatchesTrustedAggregator and is used to iterate over the raw logs and unpacked data for VerifyBatchesTrustedAggregator events raised by the Verifybatchesmock contract. +type VerifybatchesmockVerifyBatchesTrustedAggregatorIterator struct { + Event *VerifybatchesmockVerifyBatchesTrustedAggregator // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *VerifybatchesmockVerifyBatchesTrustedAggregatorIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(VerifybatchesmockVerifyBatchesTrustedAggregator) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(VerifybatchesmockVerifyBatchesTrustedAggregator) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *VerifybatchesmockVerifyBatchesTrustedAggregatorIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *VerifybatchesmockVerifyBatchesTrustedAggregatorIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// VerifybatchesmockVerifyBatchesTrustedAggregator represents a VerifyBatchesTrustedAggregator event raised by the Verifybatchesmock contract. +type VerifybatchesmockVerifyBatchesTrustedAggregator struct { + RollupID uint32 + NumBatch uint64 + StateRoot [32]byte + ExitRoot [32]byte + Aggregator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterVerifyBatchesTrustedAggregator is a free log retrieval operation binding the contract event 0xd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3. +// +// Solidity: event VerifyBatchesTrustedAggregator(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verifybatchesmock *VerifybatchesmockFilterer) FilterVerifyBatchesTrustedAggregator(opts *bind.FilterOpts, rollupID []uint32, aggregator []common.Address) (*VerifybatchesmockVerifyBatchesTrustedAggregatorIterator, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Verifybatchesmock.contract.FilterLogs(opts, "VerifyBatchesTrustedAggregator", rollupIDRule, aggregatorRule) + if err != nil { + return nil, err + } + return &VerifybatchesmockVerifyBatchesTrustedAggregatorIterator{contract: _Verifybatchesmock.contract, event: "VerifyBatchesTrustedAggregator", logs: logs, sub: sub}, nil +} + +// WatchVerifyBatchesTrustedAggregator is a free log subscription operation binding the contract event 0xd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3. +// +// Solidity: event VerifyBatchesTrustedAggregator(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verifybatchesmock *VerifybatchesmockFilterer) WatchVerifyBatchesTrustedAggregator(opts *bind.WatchOpts, sink chan<- *VerifybatchesmockVerifyBatchesTrustedAggregator, rollupID []uint32, aggregator []common.Address) (event.Subscription, error) { + + var rollupIDRule []interface{} + for _, rollupIDItem := range rollupID { + rollupIDRule = append(rollupIDRule, rollupIDItem) + } + + var aggregatorRule []interface{} + for _, aggregatorItem := range aggregator { + aggregatorRule = append(aggregatorRule, aggregatorItem) + } + + logs, sub, err := _Verifybatchesmock.contract.WatchLogs(opts, "VerifyBatchesTrustedAggregator", rollupIDRule, aggregatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(VerifybatchesmockVerifyBatchesTrustedAggregator) + if err := _Verifybatchesmock.contract.UnpackLog(event, "VerifyBatchesTrustedAggregator", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseVerifyBatchesTrustedAggregator is a log parse operation binding the contract event 0xd1ec3a1216f08b6eff72e169ceb548b782db18a6614852618d86bb19f3f9b0d3. +// +// Solidity: event VerifyBatchesTrustedAggregator(uint32 indexed rollupID, uint64 numBatch, bytes32 stateRoot, bytes32 exitRoot, address indexed aggregator) +func (_Verifybatchesmock *VerifybatchesmockFilterer) ParseVerifyBatchesTrustedAggregator(log types.Log) (*VerifybatchesmockVerifyBatchesTrustedAggregator, error) { + event := new(VerifybatchesmockVerifyBatchesTrustedAggregator) + if err := _Verifybatchesmock.contract.UnpackLog(event, "VerifyBatchesTrustedAggregator", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/test/docker-compose.yml b/test/docker-compose.yml new file mode 100644 index 00000000..a0208440 --- /dev/null +++ b/test/docker-compose.yml @@ -0,0 +1,91 @@ +networks: + default: + name: aggkit + +services: + cdk-sequence-sender: + container_name: cdk-sequence-sender + restart: no + image: aggkit + build: . + volumes: + - ./config/test.config.toml:/app/config.toml + - ./config/test.genesis.json:/app/genesis.json + - ./sequencer.keystore:/app/keystore/sequencer.keystore + command: + - "/bin/sh" + - "-c" + - "/app/cdk run --cfg /app/config.toml --network custom --custom-network-file /app/genesis.json --components sequence-sender" + + zkevm-prover: + container_name: zkevm-prover + restart: unless-stopped + image: hermeznetwork/zkevm-prover:v6.0.3-RC16 + volumes: + - ./config/test.prover.config.json:/usr/src/app/config.json + - ~/stateless-aggregator/prover/config:/app/config + command: > + zkProver -c /usr/src/app/config.json + + cdk-aggregator: + container_name: cdk-aggregator + image: aggkit + ports: + - 50081:50081 + - 9093:9091 # needed if metrics enabled + environment: + - CDK_AGGREGATOR_DB_HOST=cdk-aggregator-db + - CDK_AGGREGATOR_SENDER_ADDRESS=0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 + volumes: + - ./config/test.config.toml:/app/config.toml + - ./config/test.genesis.json:/app/genesis.json + - ./aggregator.keystore:/pk/aggregator.keystore + command: + - "/bin/sh" + - "-c" + - "/app/aggkit run --cfg /app/config.toml --network custom --custom-network-file /app/genesis.json --components aggregator" + depends_on: + cdk-aggregator-db: + condition: service_started + aggkit-l1-sync-db: + condition: service_started + + cdk-aggregator-db: + container_name: cdk-aggregator-db + image: postgres:15 + deploy: + resources: + limits: + memory: 2G + reservations: + memory: 1G + ports: + - 5434:5432 + environment: + - POSTGRES_USER=aggregator_user + - POSTGRES_PASSWORD=aggregator_password + - POSTGRES_DB=aggregator_db + command: + - "postgres" + - "-N" + - "500" + + aggkit-l1-sync-db: + container_name: aggkit-l1-sync-db + image: postgres:15 + deploy: + resources: + limits: + memory: 2G + reservations: + memory: 1G + ports: + - 5436:5432 + environment: + - POSTGRES_USER=test_user + - POSTGRES_PASSWORD=test_password + - POSTGRES_DB=sync + command: + - "postgres" + - "-N" + - "500" diff --git a/test/helpers/e2e.go b/test/helpers/e2e.go new file mode 100644 index 00000000..e9a52885 --- /dev/null +++ b/test/helpers/e2e.go @@ -0,0 +1,322 @@ +package helpers + +import ( + "context" + "math/big" + "path" + "testing" + "time" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/globalexitrootmanagerl2sovereignchain" + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/polygonzkevmbridgev2" + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/polygonzkevmglobalexitrootv2" + "github.com/agglayer/aggkit/aggoracle" + "github.com/agglayer/aggkit/aggoracle/chaingersender" + "github.com/agglayer/aggkit/bridgesync" + "github.com/agglayer/aggkit/etherman" + "github.com/agglayer/aggkit/l1infotreesync" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/reorgdetector" + "github.com/agglayer/aggkit/test/contracts/transparentupgradableproxy" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/stretchr/testify/require" +) + +const ( + rollupID = uint32(1) + syncBlockChunkSize = 10 +) + +type AggoracleWithEVMChain struct { + L1Environment + L2Environment + AggOracle *aggoracle.AggOracle + NetworkIDL2 uint32 +} + +// CommonEnvironment contains common setup results used in both L1 and L2 network setups. +type CommonEnvironment struct { + SimBackend *simulated.Backend + GERAddr common.Address + BridgeContract *polygonzkevmbridgev2.Polygonzkevmbridgev2 + BridgeAddr common.Address + Auth *bind.TransactOpts + ReorgDetector *reorgdetector.ReorgDetector + BridgeSync *bridgesync.BridgeSync +} + +// L1Environment contains setup results for L1 network. +type L1Environment struct { + CommonEnvironment + GERContract *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2 + InfoTreeSync *l1infotreesync.L1InfoTreeSync +} + +// L2Environment contains setup results for L1 network. +type L2Environment struct { + CommonEnvironment + GERContract *globalexitrootmanagerl2sovereignchain.Globalexitrootmanagerl2sovereignchain + AggoracleSender aggoracle.ChainSender + EthTxManagerMock *EthTxManagerMock +} + +// NewE2EEnvWithEVML2 creates a new E2E environment with EVM L1 and L2 chains. +func NewE2EEnvWithEVML2(t *testing.T) *AggoracleWithEVMChain { + t.Helper() + + ctx := context.Background() + // Setup L1 + l1Setup := L1Setup(t) + + // Setup L2 EVM + l2Setup := L2Setup(t) + + oracle, err := aggoracle.New( + log.GetDefaultLogger(), l2Setup.AggoracleSender, + l1Setup.SimBackend.Client(), l1Setup.InfoTreeSync, + etherman.LatestBlock, time.Millisecond*20, //nolint:mnd + ) + require.NoError(t, err) + go oracle.Start(ctx) + + return &AggoracleWithEVMChain{ + L1Environment: *l1Setup, + L2Environment: *l2Setup, + AggOracle: oracle, + NetworkIDL2: rollupID, + } +} + +// L1Setup creates a new L1 environment. +func L1Setup(t *testing.T) *L1Environment { + t.Helper() + + ctx := context.Background() + + // Simulated L1 + l1Client, authL1, gerL1Addr, gerL1Contract, bridgeL1Addr, bridgeL1Contract := newSimulatedL1(t) + + // Reorg detector + dbPathReorgDetectorL1 := path.Join(t.TempDir(), "ReorgDetectorL1.sqlite") + rdL1, err := reorgdetector.New(l1Client.Client(), reorgdetector.Config{DBPath: dbPathReorgDetectorL1}) + require.NoError(t, err) + go rdL1.Start(ctx) //nolint:errcheck + + const ( + l1InfoTreeSyncerRetries = 3 + l1InfoTreeSyncerRetryFreq = time.Millisecond * 100 + ) + + // L1 info tree sync + dbPathL1InfoTreeSync := path.Join(t.TempDir(), "L1InfoTreeSync.sqlite") + l1InfoTreeSync, err := l1infotreesync.New( + ctx, dbPathL1InfoTreeSync, + gerL1Addr, common.Address{}, + syncBlockChunkSize, etherman.LatestBlock, + rdL1, l1Client.Client(), + time.Millisecond, 0, l1InfoTreeSyncerRetryFreq, + l1InfoTreeSyncerRetries, l1infotreesync.FlagAllowWrongContractsAddrs, + ) + require.NoError(t, err) + + go l1InfoTreeSync.Start(ctx) + + const ( + waitForNewBlocksPeriod = 10 * time.Millisecond + originNetwork = 1 + initialBlock = 0 + retryPeriod = 50 * time.Millisecond + retriesCount = 10 + ) + + // Bridge sync + testClient := TestClient{ClientRenamed: l1Client.Client()} + dbPathBridgeSyncL1 := path.Join(t.TempDir(), "BridgeSyncL1.sqlite") + bridgeL1Sync, err := bridgesync.NewL1( + ctx, dbPathBridgeSyncL1, bridgeL1Addr, + syncBlockChunkSize, etherman.LatestBlock, rdL1, testClient, + initialBlock, waitForNewBlocksPeriod, retryPeriod, + retriesCount, originNetwork, false) + require.NoError(t, err) + + go bridgeL1Sync.Start(ctx) + + return &L1Environment{ + CommonEnvironment: CommonEnvironment{ + SimBackend: l1Client, + GERAddr: gerL1Addr, + BridgeContract: bridgeL1Contract, + BridgeAddr: bridgeL1Addr, + Auth: authL1, + ReorgDetector: rdL1, + BridgeSync: bridgeL1Sync, + }, + GERContract: gerL1Contract, + InfoTreeSync: l1InfoTreeSync, + } +} + +// L2Setup creates a new L2 environment. +func L2Setup(t *testing.T) *L2Environment { + t.Helper() + + l2Client, authL2, gerL2Addr, gerL2Contract, + bridgeL2Addr, bridgeL2Contract := newSimulatedEVML2SovereignChain(t) + + ethTxManagerMock := NewEthTxManMock(t, l2Client, authL2) + + const gerCheckFrequency = time.Millisecond * 50 + sender, err := chaingersender.NewEVMChainGERSender( + log.GetDefaultLogger(), gerL2Addr, l2Client.Client(), + ethTxManagerMock, 0, gerCheckFrequency, + ) + require.NoError(t, err) + ctx := context.Background() + + // Reorg detector + dbPathReorgL2 := path.Join(t.TempDir(), "ReorgDetectorL2.sqlite") + rdL2, err := reorgdetector.New(l2Client.Client(), reorgdetector.Config{DBPath: dbPathReorgL2}) + require.NoError(t, err) + go rdL2.Start(ctx) //nolint:errcheck + + // Bridge sync + dbPathL2BridgeSync := path.Join(t.TempDir(), "BridgeSyncL2.sqlite") + testClient := TestClient{ClientRenamed: l2Client.Client()} + + const ( + waitForNewBlocksPeriod = 10 * time.Millisecond + originNetwork = 1 + initialBlock = 0 + retryPeriod = 50 * time.Millisecond + retriesCount = 10 + ) + + bridgeL2Sync, err := bridgesync.NewL2( + ctx, dbPathL2BridgeSync, bridgeL2Addr, syncBlockChunkSize, + etherman.LatestBlock, rdL2, testClient, + initialBlock, waitForNewBlocksPeriod, retryPeriod, + retriesCount, originNetwork, false) + require.NoError(t, err) + + go bridgeL2Sync.Start(ctx) + + return &L2Environment{ + CommonEnvironment: CommonEnvironment{ + SimBackend: l2Client, + GERAddr: gerL2Addr, + BridgeContract: bridgeL2Contract, + BridgeAddr: bridgeL2Addr, + Auth: authL2, + ReorgDetector: rdL2, + BridgeSync: bridgeL2Sync, + }, + GERContract: gerL2Contract, + AggoracleSender: sender, + EthTxManagerMock: ethTxManagerMock, + } +} + +func newSimulatedL1(t *testing.T) ( + *simulated.Backend, + *bind.TransactOpts, + common.Address, + *polygonzkevmglobalexitrootv2.Polygonzkevmglobalexitrootv2, + common.Address, + *polygonzkevmbridgev2.Polygonzkevmbridgev2, +) { + t.Helper() + + deployerAuth, err := CreateAccount(big.NewInt(chainID)) + require.NoError(t, err) + + client, setup := NewSimulatedBackend(t, nil, deployerAuth) + + ctx := context.Background() + nonce, err := client.Client().PendingNonceAt(ctx, setup.DeployerAuth.From) + require.NoError(t, err) + + // DeployBridge function sends two transactions (bridge and proxy contract deployment) + calculatedGERAddr := crypto.CreateAddress(setup.DeployerAuth.From, nonce+2) //nolint:mnd + + err = setup.DeployBridge(client, calculatedGERAddr, 0) + require.NoError(t, err) + + gerAddr, _, gerContract, err := polygonzkevmglobalexitrootv2.DeployPolygonzkevmglobalexitrootv2( + setup.DeployerAuth, client.Client(), + setup.UserAuth.From, setup.BridgeProxyAddr) + require.NoError(t, err) + client.Commit() + + require.Equal(t, calculatedGERAddr, gerAddr) + + return client, setup.UserAuth, gerAddr, gerContract, setup.BridgeProxyAddr, setup.BridgeProxyContract +} + +func newSimulatedEVML2SovereignChain(t *testing.T) ( + *simulated.Backend, + *bind.TransactOpts, + common.Address, + *globalexitrootmanagerl2sovereignchain.Globalexitrootmanagerl2sovereignchain, + common.Address, + *polygonzkevmbridgev2.Polygonzkevmbridgev2, +) { + t.Helper() + + deployerAuth, err := CreateAccount(big.NewInt(chainID)) + require.NoError(t, err) + + premineBalance, ok := new(big.Int).SetString(defaultBalance, base10) + require.True(t, ok) + + const deployedContractsCount = 3 + l2BridgeProxyAddr := crypto.CreateAddress(deployerAuth.From, deployedContractsCount) + + genesisAllocMap := map[common.Address]types.Account{ + l2BridgeProxyAddr: {Balance: premineBalance}, + } + client, setup := NewSimulatedBackend(t, genesisAllocMap, deployerAuth) + + // Deploy L2 GER manager contract + gerL2Addr, _, _, err := globalexitrootmanagerl2sovereignchain.DeployGlobalexitrootmanagerl2sovereignchain( + setup.DeployerAuth, client.Client(), setup.BridgeProxyAddr) + require.NoError(t, err) + client.Commit() + + // Prepare initialize data that are going to be called by the L2 GER proxy contract + gerL2Abi, err := globalexitrootmanagerl2sovereignchain.Globalexitrootmanagerl2sovereignchainMetaData.GetAbi() + require.NoError(t, err) + require.NotNil(t, gerL2Abi) + + gerL2InitData, err := gerL2Abi.Pack("initialize", setup.UserAuth.From, setup.UserAuth.From) + require.NoError(t, err) + + // Deploy L2 GER manager proxy contract + gerProxyAddr, _, _, err := transparentupgradableproxy.DeployTransparentupgradableproxy( + setup.DeployerAuth, + client.Client(), + gerL2Addr, + setup.DeployerAuth.From, + gerL2InitData, + ) + require.NoError(t, err) + client.Commit() + + // Create L2 GER manager contract binding + gerL2Contract, err := globalexitrootmanagerl2sovereignchain.NewGlobalexitrootmanagerl2sovereignchain( + gerProxyAddr, client.Client()) + require.NoError(t, err) + + err = setup.DeployBridge(client, gerProxyAddr, rollupID) + require.NoError(t, err) + require.Equal(t, l2BridgeProxyAddr, setup.BridgeProxyAddr) + + bridgeGERAddr, err := setup.BridgeProxyContract.GlobalExitRootManager(nil) + require.NoError(t, err) + require.Equal(t, gerProxyAddr, bridgeGERAddr) + + return client, setup.UserAuth, gerProxyAddr, gerL2Contract, setup.BridgeProxyAddr, setup.BridgeProxyContract +} diff --git a/test/helpers/ethtxmanmock_e2e.go b/test/helpers/ethtxmanmock_e2e.go new file mode 100644 index 00000000..0d72c6ab --- /dev/null +++ b/test/helpers/ethtxmanmock_e2e.go @@ -0,0 +1,144 @@ +package helpers + +import ( + "context" + "encoding/hex" + "fmt" + big "math/big" + "testing" + + ethtxtypes "github.com/0xPolygon/zkevm-ethtx-manager/types" + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/stretchr/testify/mock" +) + +func NewEthTxManMock( + t *testing.T, + client *simulated.Backend, + auth *bind.TransactOpts, +) *EthTxManagerMock { + t.Helper() + + const ( + argReceiverIdx = 1 + argTxInputIdx = 3 + ) + + ethTxMock := NewEthTxManagerMock(t) + ethTxMock.On( + "Add", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything). + Run(func(args mock.Arguments) { + ctx := context.Background() + to, ok := args.Get(argReceiverIdx).(*common.Address) + if !ok { + log.Error("expected *common.Address for tx receiver arg") + return + } + + data, ok := args.Get(argTxInputIdx).([]byte) + if !ok { + log.Error("expected []byte for tx input data arg") + return + } + + log.Debugf("receiver %s, data: %s", to, hex.EncodeToString(data)) + + msg := ethereum.CallMsg{ + From: auth.From, + To: to, + Data: data, + } + + _, err := client.Client().EstimateGas(ctx, msg) + if err != nil { + log.Errorf("eth_estimateGas invocation failed: %w", ExtractRPCErrorData(err)) + + res, err := client.Client().CallContract(ctx, msg, nil) + if err != nil { + log.Errorf("eth_call invocation failed: %w", ExtractRPCErrorData(err)) + } else { + log.Debugf("contract call result: %s", hex.EncodeToString(res)) + } + return + } + + err = SendTx(ctx, client, auth, to, data, common.Big0) + if err != nil { + log.Errorf("failed to send transaction: %w", err) + return + } + }). + Return(common.Hash{}, nil) + ethTxMock.On("Result", mock.Anything, mock.Anything). + Return(ethtxtypes.MonitoredTxResult{Status: ethtxtypes.MonitoredTxStatusMined}, nil) + + return ethTxMock +} + +// SendTx is a helper function that creates the legacy transaction, sings it and sends against simulated environment +func SendTx(ctx context.Context, client *simulated.Backend, auth *bind.TransactOpts, + to *common.Address, data []byte, value *big.Int) error { + nonce, err := client.Client().PendingNonceAt(ctx, auth.From) + if err != nil { + return err + } + + gas := uint64(21000) //nolint:mnd + + if len(data) > 0 { + msg := ethereum.CallMsg{ + From: auth.From, + To: to, + Data: data, + Value: value, + } + + gas, err = client.Client().EstimateGas(ctx, msg) + if err != nil { + return ExtractRPCErrorData(err) + } + } + + price, err := client.Client().SuggestGasPrice(ctx) + if err != nil { + return err + } + + senderBalance, err := client.Client().BalanceAt(ctx, auth.From, nil) + if err != nil { + return err + } + + required := new(big.Int).Add(value, new(big.Int).Mul(big.NewInt(int64(gas)), price)) + if senderBalance.Cmp(required) < 0 { + return fmt.Errorf("insufficient balance: have %s, need %s", senderBalance, required) + } + + tx := types.NewTx(&types.LegacyTx{ + Nonce: nonce, + GasPrice: price, + Gas: gas, + To: to, + Value: value, + Data: data, + }) + + signedTx, err := auth.Signer(auth.From, tx) + if err != nil { + return err + } + + err = client.Client().SendTransaction(ctx, signedTx) + if err != nil { + return err + } + + client.Commit() + + return nil +} diff --git a/test/helpers/mock_ethtxmanager.go b/test/helpers/mock_ethtxmanager.go new file mode 100644 index 00000000..ac10be2a --- /dev/null +++ b/test/helpers/mock_ethtxmanager.go @@ -0,0 +1,270 @@ +// Code generated by mockery. DO NOT EDIT. + +package helpers + +import ( + big "math/big" + + common "github.com/ethereum/go-ethereum/common" + + context "context" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" + + zkevm_ethtx_managertypes "github.com/0xPolygon/zkevm-ethtx-manager/types" +) + +// EthTxManagerMock is an autogenerated mock type for the EthTxManager type +type EthTxManagerMock struct { + mock.Mock +} + +type EthTxManagerMock_Expecter struct { + mock *mock.Mock +} + +func (_m *EthTxManagerMock) EXPECT() *EthTxManagerMock_Expecter { + return &EthTxManagerMock_Expecter{mock: &_m.Mock} +} + +// Add provides a mock function with given fields: ctx, to, value, data, gasOffset, sidecar +func (_m *EthTxManagerMock) Add(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar) (common.Hash, error) { + ret := _m.Called(ctx, to, value, data, gasOffset, sidecar) + + if len(ret) == 0 { + panic("no return value specified for Add") + } + + var r0 common.Hash + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) (common.Hash, error)); ok { + return rf(ctx, to, value, data, gasOffset, sidecar) + } + if rf, ok := ret.Get(0).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) common.Hash); ok { + r0 = rf(ctx, to, value, data, gasOffset, sidecar) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Hash) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) error); ok { + r1 = rf(ctx, to, value, data, gasOffset, sidecar) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerMock_Add_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Add' +type EthTxManagerMock_Add_Call struct { + *mock.Call +} + +// Add is a helper method to define mock.On call +// - ctx context.Context +// - to *common.Address +// - value *big.Int +// - data []byte +// - gasOffset uint64 +// - sidecar *types.BlobTxSidecar +func (_e *EthTxManagerMock_Expecter) Add(ctx interface{}, to interface{}, value interface{}, data interface{}, gasOffset interface{}, sidecar interface{}) *EthTxManagerMock_Add_Call { + return &EthTxManagerMock_Add_Call{Call: _e.mock.On("Add", ctx, to, value, data, gasOffset, sidecar)} +} + +func (_c *EthTxManagerMock_Add_Call) Run(run func(ctx context.Context, to *common.Address, value *big.Int, data []byte, gasOffset uint64, sidecar *types.BlobTxSidecar)) *EthTxManagerMock_Add_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(*common.Address), args[2].(*big.Int), args[3].([]byte), args[4].(uint64), args[5].(*types.BlobTxSidecar)) + }) + return _c +} + +func (_c *EthTxManagerMock_Add_Call) Return(_a0 common.Hash, _a1 error) *EthTxManagerMock_Add_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerMock_Add_Call) RunAndReturn(run func(context.Context, *common.Address, *big.Int, []byte, uint64, *types.BlobTxSidecar) (common.Hash, error)) *EthTxManagerMock_Add_Call { + _c.Call.Return(run) + return _c +} + +// Remove provides a mock function with given fields: ctx, id +func (_m *EthTxManagerMock) Remove(ctx context.Context, id common.Hash) error { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for Remove") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) error); ok { + r0 = rf(ctx, id) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// EthTxManagerMock_Remove_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Remove' +type EthTxManagerMock_Remove_Call struct { + *mock.Call +} + +// Remove is a helper method to define mock.On call +// - ctx context.Context +// - id common.Hash +func (_e *EthTxManagerMock_Expecter) Remove(ctx interface{}, id interface{}) *EthTxManagerMock_Remove_Call { + return &EthTxManagerMock_Remove_Call{Call: _e.mock.On("Remove", ctx, id)} +} + +func (_c *EthTxManagerMock_Remove_Call) Run(run func(ctx context.Context, id common.Hash)) *EthTxManagerMock_Remove_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthTxManagerMock_Remove_Call) Return(_a0 error) *EthTxManagerMock_Remove_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *EthTxManagerMock_Remove_Call) RunAndReturn(run func(context.Context, common.Hash) error) *EthTxManagerMock_Remove_Call { + _c.Call.Return(run) + return _c +} + +// Result provides a mock function with given fields: ctx, id +func (_m *EthTxManagerMock) Result(ctx context.Context, id common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error) { + ret := _m.Called(ctx, id) + + if len(ret) == 0 { + panic("no return value specified for Result") + } + + var r0 zkevm_ethtx_managertypes.MonitoredTxResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error)); ok { + return rf(ctx, id) + } + if rf, ok := ret.Get(0).(func(context.Context, common.Hash) zkevm_ethtx_managertypes.MonitoredTxResult); ok { + r0 = rf(ctx, id) + } else { + r0 = ret.Get(0).(zkevm_ethtx_managertypes.MonitoredTxResult) + } + + if rf, ok := ret.Get(1).(func(context.Context, common.Hash) error); ok { + r1 = rf(ctx, id) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerMock_Result_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Result' +type EthTxManagerMock_Result_Call struct { + *mock.Call +} + +// Result is a helper method to define mock.On call +// - ctx context.Context +// - id common.Hash +func (_e *EthTxManagerMock_Expecter) Result(ctx interface{}, id interface{}) *EthTxManagerMock_Result_Call { + return &EthTxManagerMock_Result_Call{Call: _e.mock.On("Result", ctx, id)} +} + +func (_c *EthTxManagerMock_Result_Call) Run(run func(ctx context.Context, id common.Hash)) *EthTxManagerMock_Result_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(common.Hash)) + }) + return _c +} + +func (_c *EthTxManagerMock_Result_Call) Return(_a0 zkevm_ethtx_managertypes.MonitoredTxResult, _a1 error) *EthTxManagerMock_Result_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerMock_Result_Call) RunAndReturn(run func(context.Context, common.Hash) (zkevm_ethtx_managertypes.MonitoredTxResult, error)) *EthTxManagerMock_Result_Call { + _c.Call.Return(run) + return _c +} + +// ResultsByStatus provides a mock function with given fields: ctx, statuses +func (_m *EthTxManagerMock) ResultsByStatus(ctx context.Context, statuses []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error) { + ret := _m.Called(ctx, statuses) + + if len(ret) == 0 { + panic("no return value specified for ResultsByStatus") + } + + var r0 []zkevm_ethtx_managertypes.MonitoredTxResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error)); ok { + return rf(ctx, statuses) + } + if rf, ok := ret.Get(0).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) []zkevm_ethtx_managertypes.MonitoredTxResult); ok { + r0 = rf(ctx, statuses) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]zkevm_ethtx_managertypes.MonitoredTxResult) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) error); ok { + r1 = rf(ctx, statuses) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// EthTxManagerMock_ResultsByStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ResultsByStatus' +type EthTxManagerMock_ResultsByStatus_Call struct { + *mock.Call +} + +// ResultsByStatus is a helper method to define mock.On call +// - ctx context.Context +// - statuses []zkevm_ethtx_managertypes.MonitoredTxStatus +func (_e *EthTxManagerMock_Expecter) ResultsByStatus(ctx interface{}, statuses interface{}) *EthTxManagerMock_ResultsByStatus_Call { + return &EthTxManagerMock_ResultsByStatus_Call{Call: _e.mock.On("ResultsByStatus", ctx, statuses)} +} + +func (_c *EthTxManagerMock_ResultsByStatus_Call) Run(run func(ctx context.Context, statuses []zkevm_ethtx_managertypes.MonitoredTxStatus)) *EthTxManagerMock_ResultsByStatus_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].([]zkevm_ethtx_managertypes.MonitoredTxStatus)) + }) + return _c +} + +func (_c *EthTxManagerMock_ResultsByStatus_Call) Return(_a0 []zkevm_ethtx_managertypes.MonitoredTxResult, _a1 error) *EthTxManagerMock_ResultsByStatus_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *EthTxManagerMock_ResultsByStatus_Call) RunAndReturn(run func(context.Context, []zkevm_ethtx_managertypes.MonitoredTxStatus) ([]zkevm_ethtx_managertypes.MonitoredTxResult, error)) *EthTxManagerMock_ResultsByStatus_Call { + _c.Call.Return(run) + return _c +} + +// NewEthTxManagerMock creates a new instance of EthTxManagerMock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewEthTxManagerMock(t interface { + mock.TestingT + Cleanup(func()) +}) *EthTxManagerMock { + mock := &EthTxManagerMock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/test/helpers/reorg.go b/test/helpers/reorg.go new file mode 100644 index 00000000..136de16a --- /dev/null +++ b/test/helpers/reorg.go @@ -0,0 +1,37 @@ +package helpers + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/agglayer/aggkit/log" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/stretchr/testify/require" +) + +// commitBlocks commits the specified number of blocks with the given client +// and waits for the specified duration after each block +func CommitBlocks(t *testing.T, client *simulated.Backend, numBlocks int, waitDuration time.Duration) { + t.Helper() + + for i := 0; i < numBlocks; i++ { + client.Commit() + time.Sleep(waitDuration) + } +} + +func Reorg(t *testing.T, client *simulated.Backend, reorgSizeInBlocks uint64) { + t.Helper() + ctx := context.Background() + currentBlockNum, err := client.Client().BlockNumber(ctx) + require.NoError(t, err) + + block, err := client.Client().BlockByNumber(ctx, big.NewInt(int64(currentBlockNum-reorgSizeInBlocks))) + log.Debugf("reorging until block %d. Current block %d (before reorg)", block.NumberU64(), currentBlockNum) + require.NoError(t, err) + reorgFrom := block.Hash() + err = client.Fork(reorgFrom) + require.NoError(t, err) +} diff --git a/test/helpers/simulated.go b/test/helpers/simulated.go new file mode 100644 index 00000000..c138901a --- /dev/null +++ b/test/helpers/simulated.go @@ -0,0 +1,181 @@ +package helpers + +import ( + "context" + "errors" + "fmt" + "math/big" + "testing" + + "github.com/0xPolygon/cdk-contracts-tooling/contracts/l2-sovereign-chain/polygonzkevmbridgev2" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/test/contracts/transparentupgradableproxy" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient/simulated" + "github.com/ethereum/go-ethereum/rpc" + "github.com/stretchr/testify/require" +) + +const ( + defaultBlockGasLimit = uint64(999999999999999999) + defaultBalance = "100000000000000000000000000" + chainID = 1337 + + base10 = 10 +) + +type ClientRenamed simulated.Client + +type TestClient struct { + ClientRenamed +} + +func (tc TestClient) Client() *rpc.Client { + return nil +} + +// SimulatedBackendSetup defines the setup for a simulated backend. +type SimulatedBackendSetup struct { + UserAuth *bind.TransactOpts + DeployerAuth *bind.TransactOpts + BridgeProxyAddr common.Address + BridgeProxyContract *polygonzkevmbridgev2.Polygonzkevmbridgev2 +} + +// DeployBridge deploys the bridge contract +func (s *SimulatedBackendSetup) DeployBridge(client *simulated.Backend, + gerAddr common.Address, networkID uint32) error { + // Deploy zkevm bridge contract + bridgeAddr, _, _, err := polygonzkevmbridgev2.DeployPolygonzkevmbridgev2(s.DeployerAuth, client.Client()) + if err != nil { + return err + } + client.Commit() + + // Create proxy contract for the bridge + var ( + bridgeProxyAddr common.Address + bridgeProxyContract *polygonzkevmbridgev2.Polygonzkevmbridgev2 + ) + + bridgeABI, err := polygonzkevmbridgev2.Polygonzkevmbridgev2MetaData.GetAbi() + if err != nil { + return err + } + + dataCallProxy, err := bridgeABI.Pack("initialize", + networkID, + common.Address{}, // gasTokenAddressMainnet + uint32(0), // gasTokenNetworkMainnet + gerAddr, // global exit root manager + common.Address{}, // rollup manager + []byte{}, // gasTokenMetadata + ) + if err != nil { + return err + } + + bridgeProxyAddr, _, _, err = transparentupgradableproxy.DeployTransparentupgradableproxy( + s.DeployerAuth, + client.Client(), + bridgeAddr, + s.DeployerAuth.From, + dataCallProxy, + ) + if err != nil { + return err + } + client.Commit() + + bridgeProxyContract, err = polygonzkevmbridgev2.NewPolygonzkevmbridgev2(bridgeProxyAddr, client.Client()) + if err != nil { + return err + } + + actualGERAddr, err := bridgeProxyContract.GlobalExitRootManager(&bind.CallOpts{}) + if err != nil { + return err + } + + if gerAddr != actualGERAddr { + return fmt.Errorf("mismatch between expected %s and actual %s GER addresses on bridge contract (%s)", + gerAddr, actualGERAddr, bridgeProxyAddr) + } + + s.BridgeProxyAddr = bridgeProxyAddr + s.BridgeProxyContract = bridgeProxyContract + + bridgeBalance, err := client.Client().BalanceAt(context.Background(), bridgeProxyAddr, nil) + if err != nil { + return err + } + + log.Debugf("Bridge@%s, balance=%d\n", bridgeProxyAddr, bridgeBalance) + + return nil +} + +// NewSimulatedBackend creates a simulated backend with two accounts: user and deployer. +func NewSimulatedBackend(t *testing.T, + balances map[common.Address]types.Account, + deployerAuth *bind.TransactOpts) (*simulated.Backend, *SimulatedBackendSetup) { + t.Helper() + + // Define default balance + balance, ok := new(big.Int).SetString(defaultBalance, 10) //nolint:mnd + require.Truef(t, ok, "failed to set balance") + + // Create user account + userPK, err := crypto.GenerateKey() + require.NoError(t, err) + userAuth, err := bind.NewKeyedTransactorWithChainID(userPK, big.NewInt(chainID)) + require.NoError(t, err) + + // Create deployer account + precalculatedBridgeAddr := crypto.CreateAddress(deployerAuth.From, 1) + + // Define balances map + if balances == nil { + balances = make(map[common.Address]types.Account) + } + balances[userAuth.From] = types.Account{Balance: balance} + balances[deployerAuth.From] = types.Account{Balance: balance} + balances[precalculatedBridgeAddr] = types.Account{Balance: balance} + + client := simulated.NewBackend(balances, simulated.WithBlockGasLimit(defaultBlockGasLimit)) + + // Mine the first block + client.Commit() + + setup := &SimulatedBackendSetup{ + UserAuth: userAuth, + DeployerAuth: deployerAuth, + } + + return client, setup +} + +// CreateAccount creates new private key and corresponding transaction signer +func CreateAccount(chainID *big.Int) (*bind.TransactOpts, error) { + privateKey, err := crypto.GenerateKey() + if err != nil { + return nil, err + } + + return bind.NewKeyedTransactorWithChainID(privateKey, chainID) +} + +// ExtractRPCErrorData tries to extract the error data from the provided error +func ExtractRPCErrorData(err error) error { + var ed rpc.DataError + if errors.As(err, &ed) { + if eds, ok := ed.ErrorData().(string); ok { + return fmt.Errorf("%w (error data: %s)", err, eds) + } + } + + return err +} diff --git a/test/helpers/wait.go b/test/helpers/wait.go new file mode 100644 index 00000000..86a6f9fb --- /dev/null +++ b/test/helpers/wait.go @@ -0,0 +1,32 @@ +package helpers + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +type Processorer interface { + GetLastProcessedBlock(ctx context.Context) (uint64, error) +} + +func RequireProcessorUpdated(t *testing.T, processor Processorer, targetBlock uint64) { + t.Helper() + const ( + maxIterations = 100 + sleepTimePerIteration = time.Millisecond * 10 + ) + ctx := context.Background() + for i := 0; i < maxIterations; i++ { + lpb, err := processor.GetLastProcessedBlock(ctx) + require.NoError(t, err) + if targetBlock <= lpb { + return + } + time.Sleep(sleepTimePerIteration) + } + require.NoError(t, errors.New("processor not updated")) +} diff --git a/test/run-e2e-multi_pp.sh b/test/run-e2e-multi_pp.sh new file mode 100755 index 00000000..8d8f4928 --- /dev/null +++ b/test/run-e2e-multi_pp.sh @@ -0,0 +1,70 @@ +#!/bin/bash +source $(dirname $0)/scripts/env.sh + +function log_error() { + echo -e "\033[0;31mError: $*" "\033[0m" +} + +function log_fatal() { + log_error $* + exit 1 +} + +function ok_or_fatal(){ + if [ $? -ne 0 ]; then + log_fatal $* + fi +} + +function build_docker_if_required(){ + docker images -q aggkit:latest > /dev/null + if [ $? -ne 0 ] ; then + echo "Building aggkit:latest" + pushd $BASE_FOLDER/.. + make build-docker + ok_or_fatal "Failed to build docker image" + popd + else + echo "docker aggkit:latest already exists" + fi +} + +function resolve_template(){ + local _TEMPLATE_FILE="$1" + local _RESULT_VARNAME="$2" + local _TEMP_FILE=$(mktemp --suffix ".yml") + echo "rendering $_TEMPLATE_FILE to temp file $_TEMP_FILE" + go run ../scripts/run_template.go $_TEMPLATE_FILE > $_TEMP_FILE + ok_or_fatal "Failed to render template $_TEMPLATE_FILE" + grep "" "$_TEMP_FILE" + if [ $? -eq 0 ]; then + log_fatal "Failed to render template $_TEMPLATE_FILE. missing values" + fi + eval $_RESULT_VARNAME="$_TEMP_FILE" +} + +############################################################################### +# MAIN +############################################################################### +BASE_FOLDER=$(dirname $0) +PP1_ORIGIN_CONFIG_FILE=combinations/fork12-pessimistic-multi.yml +PP2_ORIGIN_CONFIG_FILE=combinations/fork12-pessimistic-multi-attach-second-cdk.yml +KURTOSIS_ENCLAVE=aggkit + +[ -z $KURTOSIS_FOLDER ] && echo "KURTOSIS_FOLDER is not set" && exit 1 +[ ! -d $KURTOSIS_FOLDER ] && echo "KURTOSIS_FOLDER is not a directory ($KURTOSIS_FOLDER)" && exit 1 + + +[ ! -f $PP1_ORIGIN_CONFIG_FILE ] && echo "File $PP1_ORIGIN_CONFIG_FILE does not exist" && exit 1 +[ ! -f $PP2_ORIGIN_CONFIG_FILE ] && echo "File $PP2_ORIGIN_CONFIG_FILE does not exist" && exit 1 + +build_docker_if_required +resolve_template $PP1_ORIGIN_CONFIG_FILE PP1_RENDERED_CONFIG_FILE +resolve_template $PP2_ORIGIN_CONFIG_FILE PP2_RENDERED_CONFIG_FILE + +kurtosis clean --all +kurtosis run --enclave $KURTOSIS_ENCLAVE --args-file "$PP1_RENDERED_CONFIG_FILE" --image-download always $KURTOSIS_FOLDER +ok_or_fatal "Failed to run kurtosis pp1" + +kurtosis run --enclave $KURTOSIS_ENCLAVE --args-file "$PP2_RENDERED_CONFIG_FILE" --image-download always $KURTOSIS_FOLDER +ok_or_fatal "Failed to run kurtosis attached second cdk" diff --git a/test/run-e2e.sh b/test/run-e2e.sh new file mode 100755 index 00000000..e1f4d117 --- /dev/null +++ b/test/run-e2e.sh @@ -0,0 +1,35 @@ +#!/bin/bash +source $(dirname $0)/scripts/env.sh + +FORK=$1 +if [ -z $FORK ]; then + echo "Missing FORK: ['fork9', 'fork12']" + exit 1 +fi + +DATA_AVAILABILITY_MODE=$2 +if [ -z $DATA_AVAILABILITY_MODE ]; then + echo "Missing DATA_AVAILABILITY_MODE: ['rollup', 'cdk-validium', 'pessimistic']" + exit 1 +fi + +BASE_FOLDER=$(dirname $0) +docker images -q aggkit:latest > /dev/null +if [ $? -ne 0 ] ; then + echo "Building aggkit:latest" + pushd $BASE_FOLDER/.. + make build-docker + popd +else + echo "docker aggkit:latest already exists" +fi + +kurtosis clean --all +echo "Override aggkit config file" +cp $BASE_FOLDER/config/kurtosis-cdk-node-config.toml.template $KURTOSIS_FOLDER/templates/trusted-node/cdk-node-config.toml +KURTOSIS_CONFIG_FILE="combinations/$FORK-$DATA_AVAILABILITY_MODE.yml" +TEMP_CONFIG_FILE=$(mktemp --suffix ".yml") +echo "rendering $KURTOSIS_CONFIG_FILE to temp file $TEMP_CONFIG_FILE" +go run ../scripts/run_template.go $KURTOSIS_CONFIG_FILE > $TEMP_CONFIG_FILE +kurtosis run --enclave aggkit --args-file "$TEMP_CONFIG_FILE" --image-download always $KURTOSIS_FOLDER +rm $TEMP_CONFIG_FILE \ No newline at end of file diff --git a/test/scripts/agglayer_certificates_monitor.sh b/test/scripts/agglayer_certificates_monitor.sh new file mode 100755 index 00000000..1206c8cb --- /dev/null +++ b/test/scripts/agglayer_certificates_monitor.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +# This script monitors the agglayer certificates progress of pessimistic proof. + +function parse_params(){ + # Check if the required arguments are provided. + if [ "$#" -lt 3 ]; then + echo "Usage: $0 " + exit 1 + fi + + # The number of batches to be verified. + settle_certificates_target="$1" + + # The script timeout (in seconds). + timeout="$2" + + # The network id of the L2 network. + l2_rpc_network_id="$3" +} + +function check_timeout(){ + local _end_time=$1 + current_time=$(date +%s) + if ((current_time > _end_time)); then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Exiting... Timeout reached not found the expected numbers of settled certs!" + exit 1 + fi +} + +function check_num_certificates(){ + readonly agglayer_rpc_url="$(kurtosis port print aggkit agglayer agglayer)" + + cast_output=$(cast rpc --rpc-url "$agglayer_rpc_url" "interop_getLatestKnownCertificateHeader" "$l2_rpc_network_id" 2>&1) + + if [ $? -ne 0 ]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Error executing command cast rpc: $cast_output" + return + fi + + height=$(extract_certificate_height "$cast_output") + [[ -z "$height" ]] && { + echo "Error: Failed to extract certificate height: $height." >&3 + return + } + + status=$(extract_certificate_status "$cast_output") + [[ -z "$status" ]] && { + echo "Error: Failed to extract certificate status." >&3 + return + } + + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Last known agglayer certificate height: $height, status: $status" >&3 + + if (( height > settle_certificates_target - 1 )); then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Success! The number of settled certificates has reached the target." >&3 + exit 0 + fi + + if (( height == settle_certificates_target - 1 )); then + if [ "$status" == "Settled" ]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Success! The number of settled certificates has reached the target." >&3 + exit 0 + fi + + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ Warning! The number of settled certificates is one less than the target." >&3 + fi +} + +function extract_certificate_height() { + local cast_output="$1" + echo "$cast_output" | jq -r '.height' +} + +function extract_certificate_status() { + local cast_output="$1" + echo "$cast_output" | jq -r '.status' +} + +# MAIN + +parse_params $* +start_time=$(date +%s) +end_time=$((start_time + timeout)) +echo "[$(date '+%Y-%m-%d %H:%M:%S')] Start monitoring agglayer certificates progress..." +while true; do + check_num_certificates + check_timeout $end_time + sleep 10 +done diff --git a/test/scripts/batch_verification_monitor.sh b/test/scripts/batch_verification_monitor.sh new file mode 100755 index 00000000..4b3e9857 --- /dev/null +++ b/test/scripts/batch_verification_monitor.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# This script monitors the verification progress of zkEVM batches. + +# Check if the required arguments are provided. +if [ "$#" -lt 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +# The number of batches to be verified. +verified_batches_target="$1" + +# The script timeout (in seconds). +timeout="$2" + +start_time=$(date +%s) +end_time=$((start_time + timeout)) + +rpc_url="$(kurtosis port print aggkit cdk-erigon-rpc-001 rpc)" + +while true; do + verified_batches="$(cast to-dec "$(cast rpc --rpc-url "$rpc_url" zkevm_verifiedBatchNumber | sed 's/"//g')")" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Verified Batches: $verified_batches" + + # The aim is to take up some space in the batch, so that the number of batches actually increases during the test. + cast send \ + --legacy \ + --rpc-url "$rpc_url" \ + --private-key "0x12d7de8621a77640c9241b2595ba78ce443d05e94090365ab3bb5e19df82c625" \ + --gas-limit 100_000 \ + --create 0x600160015B810190630000000456 \ + >/dev/null 2>&1 + + current_time=$(date +%s) + if ((current_time > end_time)); then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ Exiting... Timeout reached!" + exit 1 + fi + + if ((verified_batches > verified_batches_target)); then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ Exiting... $verified_batches batches were verified!" + exit 0 + fi + + sleep 10 +done diff --git a/test/scripts/env.sh b/test/scripts/env.sh new file mode 100644 index 00000000..af9ff936 --- /dev/null +++ b/test/scripts/env.sh @@ -0,0 +1,7 @@ +#!/bin/bash +### Common variables +KURTOSIS_ENCLAVE=aggkit +TMP_AGGKIT_FOLDER=tmp/aggkit +DEST_KURTOSIS_PARAMS_YML=../$TMP_AGGKIT_FOLDER/e2e-params.yml +KURTOSIS_FOLDER=${KURTOSIS_FOLDER:=../kurtosis-cdk} +USE_L1_GAS_TOKEN_CONTRACT=true diff --git a/test/sequencer.keystore b/test/sequencer.keystore new file mode 100644 index 00000000..96b662b7 --- /dev/null +++ b/test/sequencer.keystore @@ -0,0 +1 @@ +{"address":"f39fd6e51aad88f6f4ce6ab8827279cfffb92266","crypto":{"cipher":"aes-128-ctr","ciphertext":"d005030a7684f3adad2447cbb27f63039eec2224c451eaa445de0d90502b9f3d","cipherparams":{"iv":"dc07a54bc7e388efa89c34d42f2ebdb4"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"cf2ec55ecae11171de575112cfb16963570533a9c46fb774473ceb11519eb24a"},"mac":"3eb180d405a5da6e462b2adc00091c14856c91d574bf27348714506357d6e177"},"id":"035454db-6b6d-477f-8a79-ce24c10b185f","version":3} \ No newline at end of file diff --git a/test/testutils/utils.go b/test/testutils/utils.go new file mode 100644 index 00000000..cda8de71 --- /dev/null +++ b/test/testutils/utils.go @@ -0,0 +1,26 @@ +package testutils + +import ( + "fmt" + "strings" +) + +// CheckError checks the given error taking into account if it was expected and +// potentially the message it should carry. +func CheckError(err error, expected bool, msg string) error { + if !expected && err != nil { + return fmt.Errorf("unexpected error %w", err) + } + if expected { + if err == nil { + return fmt.Errorf("expected error didn't happen") + } + if msg == "" { + return fmt.Errorf("expected error message not defined") + } + if !strings.HasPrefix(err.Error(), msg) { + return fmt.Errorf("wrong error, expected %q, got %q", msg, err.Error()) + } + } + return nil +} diff --git a/test/vectors/l1infotree.go b/test/vectors/l1infotree.go new file mode 100644 index 00000000..fe675aa0 --- /dev/null +++ b/test/vectors/l1infotree.go @@ -0,0 +1,21 @@ +package vectors + +import ( + "github.com/ethereum/go-ethereum/common" +) + +// L1InfoTree holds the test vector for the merkle tree +type L1InfoTree struct { + PreviousLeafValues []common.Hash `json:"previousLeafValues"` + CurrentRoot common.Hash `json:"currentRoot"` + NewLeafValue common.Hash `json:"newLeafValue"` + NewRoot common.Hash `json:"newRoot"` +} + +// L1InfoTree holds the test vector for the merkle tree +type L1InfoTreeProof struct { + Leaves []common.Hash `json:"leaves"` + Index uint `json:"index"` + Proof []common.Hash `json:"proof"` + Root common.Hash `json:"root"` +} diff --git a/test/vectors/proofs/1871.json b/test/vectors/proofs/1871.json new file mode 100644 index 00000000..4a9ccfba --- /dev/null +++ b/test/vectors/proofs/1871.json @@ -0,0 +1 @@ +{"root1":["3295076584405554042","6618971217808013681","16442848468676351391","13373459210721504251"],"root2":["4869072528223352863","6275850450145071959","8159689720148436485","8979985763136073723"],"root3":["14127994790264865165","15891580232607663172","10972491704639599229","5130226808173920548"],"root4":["12774152301526189225","2375967557593525776","4281237863637726616","5620888804093680795"],"evals":[["8045928200710543358","9840562958972197414","13608050390039606521"],["10327145304435105704","5906292561146817218","1445652572396829075"],["3311517826726312712","14317474585538798959","1805697900914825442"],["17030913070754511489","13015606895174078394","11709567149443936399"],["8572744179226951463","16194205828200745391","2323196428908522020"],["3120069627887577230","11544142654480447744","6333990071019962708"],["9012459202959064011","17273140076344448956","10281134962250763242"],["12143976914438625790","631273832830402507","9893825150229718298"],["16417463879178462852","9325797262433172848","15331238551784230573"],["13895179444556137629","4854986024569601648","17792470161961893727"],["8672123074183187048","2771792476102924130","318070987028141770"],["16216171934254065393","12558155625624072139","3176177922126978923"],["12343115488909147701","7554038455251856715","15823302369593496823"],["10287630392532907224","3007470060396800109","3271972011415507492"],["1384849900766487548","317379193545615903","3509787466150180166"],["15996518158898589706","8413762995103064542","1100025398951924569"],["2055977062104882387","7679199083246820466","10613814717580449059"],["13493641639280267764","2150322823761611072","15101009472351601668"],["17318502188034085851","12088778684724755166","584679606867339797"],["8955487855303191381","16404229918151559406","6832138294689392419"],["1914702357912838183","15271915690638701739","16438545478617152287"],["3680326884477547072","17697844063739430382","15670050101183307612"],["15395136272548197074","1861448298262765630","372726507851897294"],["8588606293595731312","4985473450310764665","7126790332181603825"],["2700339445265299087","2290327979830559376","7417148173296261339"],["2025982682470681228","11649389147342152709","14396451249931692647"],["13609271733698926842","13549710439597878938","368127752974802055"],["1757184008194749709","11022845965818986723","8345964260248785823"],["11150576972783625201","3618964538893135939","9744630299268173963"],["3437963269885130029","18167629183654131578","10117860949837202641"],["3007552385143465473","16963903984935276448","10820455347953719753"],["2870347187019402869","3352555915186201066","17991291926772520383"],["15697225993641889236","13443313231965578683","17622178380268812967"],["15025852076839139340","8485141093658364380","13140329294707125827"],["1599386855737630346","14392476002144128760","16512749093145840219"],["2240408511913573124","11417209853889727018","12277581683182527517"],["529601203150757907","10276006373996994599","11431617993774121657"],["16392905860020375500","13197903153176518213","8919405794694820212"],["13338313095181065040","8905402261730505507","17007084785367385063"],["3281743425872457908","4975211093031039811","4030495758585631300"],["17353744286631096722","8095053819701950409","15091858372987728872"],["2978076357703741280","14896752697188015623","10667101184009897400"],["2169471974752914370","9506925783287683967","8456226278704800532"],["12365649680987375389","16736607382200763730","1058777952954955402"],["10958402835886415415","2940374594075121906","10713777202687707530"],["7216694503908210414","220885678177452678","12137309530526651827"],["8375930347675320679","1145219317658049899","16593713584470065379"],["15488457479405313131","10526628120702623649","14833492129099537071"],["10641912296272077875","11569297276218303631","14769250145336076904"],["12509223279407701427","17784659393090261596","13595255362168438778"],["11471623947876708359","1571362235924524498","3482010714350330876"],["3777242127254130307","6380575999870924830","12007783628673391210"],["1526722764740764768","654976949262339357","9450930218773236571"],["10176788008301916348","14246420955117703313","13339967984106714957"],["13373339677343679807","13049952459983469370","9015086547767053427"],["4970896227270374503","911756820531335952","8812537117349835360"],["4577769006776505987","13814181356259516904","7548960572753906070"],["14547539808280252048","11331795323868806837","12401822249592233235"],["4011911382646957567","13354940072147213032","4203989024133578879"],["9463387817783114496","6893729948994265279","6759080537629615514"],["8749316542681330210","16493153754704336332","14177560730662589426"],["3800097249860356654","11270224336697331542","8349945025285214933"],["7413136912179720206","13915498018976396556","13835199590533317946"],["11596564074834890154","18398654900541400490","1251169494175022943"],["8598453860002782331","9537391135368102106","14925173851288031833"],["3599882980413437368","15529213932692099336","4877099555643323789"],["15462018073839632685","15386169563683747080","14218555757300224825"],["15427672034416318803","17920766081367156362","10270646350973231718"],["4020495338704516825","12823708538099941162","4828955402716198531"],["8332984616878697725","9008825968122758241","15595189654755571082"],["11240920684034356950","432035929658336086","2729107703146761066"],["15914657734766315395","9808270733995180391","1936947344953292610"],["13371290892823773614","862853102731714976","7650326474278110228"],["8156101489083843264","15146871993695584684","12530806014134753127"],["13576027258959012074","16338009570752241894","6638977538949980742"],["9825194988901588354","6427705233826746512","13181427286814238239"],["7073001766971478813","11481683928528991052","4446588536408399744"],["5091058421966026914","9279265395542711691","8079959174881132294"],["11051084259052297151","5350835434593820970","13139937289194981438"],["4819290576211874115","4144246660391665419","12257757336708896284"],["18082689510026675882","17785306802917041046","4350552236145891725"],["17299389733230645412","4938737846006319821","10983406707985928359"],["15742148332115394030","2821848459248519609","11546632396892131011"],["3313837974887664381","12509458793626275828","10278890287465984271"],["10316264561445291598","1748656795196240511","17701912099009598516"],["14729600614305758335","13553420931206015940","11731218543369159713"],["16978044650728534897","69416588000996509","10140301510957331603"],["13990516326294279305","11192059357810914826","17751486568980279391"],["15288727928402414312","10385472753638477240","1377120005256613110"],["1198911186640294293","2089427213981951334","4888908415354309645"],["10064495613972246301","9295200281325156560","6780023480179128783"],["17335001365359054568","11034770983424889304","12144017870426364346"],["3260945281366673844","10920481792950202552","13251050147151703186"],["8368862802971940028","15197448152462404581","9502683910187039845"],["3107156204695319664","10143490519449135293","5848559855986114002"],["5725629474633705318","11799156557239789961","3900756346228675433"],["9225746555710134529","736095315572082850","1020694079583065289"],["1427652085613800691","3038850827828805685","10000341818238179561"],["11955745924076487473","9930981685376064037","10688363472263463877"],["13363145971147579354","3318915582955557663","16306650192178886456"],["809836553399975303","17629683202842174186","12266457186363912468"],["1772393002760609749","8808178511129338523","2169472702832580409"],["2271837338360833618","2329540694653884162","16968093559625899777"],["9890830041820931455","1170899058360271762","17312006420395938133"],["6005339241593602236","9003902488984580287","6845501784990450679"],["9198353278007215812","6723488597198491607","17592514197675606322"],["7415073956451974410","8914964809359086776","5748573821355906712"],["10374386688899672134","146150595460246579","11563912223205918292"],["6778917168902969647","11053720369436203177","16084303231496325486"],["16343576784249687139","11211097736056996807","4052444013129054581"],["13347650513549787859","1159835835958158301","16661387149749776543"],["12151134318246951569","16108581775228057242","2296536489013003218"],["3959298765814096049","11703635854385531705","7762501646624320617"],["5203676724848221711","682467784303861048","12284681233775051190"],["13606556072049803460","4249750476190527557","12661455618570576995"],["17618102632492409627","1962212046452558088","18367219498884382392"],["2973152008125554298","15996864955244298742","6062308652898575137"],["4962897849016237702","9473333529023398032","8355367310969301224"]],"s1_root":["498829569035859779","17003937996832987304","14166218151166973294","17014352867102180983"],"s1_vals":[["13409337484361536346","15163128752874179861","11715213652838449446","1245374829233108894","3111858095324836836","1351358446154222654","1478760359427434606","2930476817757459931","412321516530180629","9774148588275903914","17233376663381477492","5393725133069781727","3466143936800973893","6481350498887521824","6381939704660888234","15724147117238710251","15982403894537190802","2764343081012862985","3988777545732867487","15093865203819898335","466532952646332584","13385888112016344185","5614168967876471186","10706489405102490669","17402558077341451411","4926343991971858687","10137642962249431032","11705466150192548574","11461245005672617160","11008678945562870548","14073391528485947732","15639406370930646777","9178612797141591184","17612860280357635051","7437735811127230360","1118702008809071251","4310762424650316288","17126850938502403166","4208483601302545466","11746244034982339299","11124041768352713599","17691079349345124743","859846948727645842","9782561698485632234","12763706816055094472","17927033723428634657","16252472898985828002","9102664396854215201"],["11509394029979588876","17011374993340974232","10596010256211332730","1550189034973430782","16373873377776172634","3935962058951598084","7762666335726778670","12471391991278940168","5528947610958068653","14174818426177160246","17715859682816784498","15124302787852448781","9459864746990609088","17031301959714532611","7124539442293283339","4063004849346702218","5599870875509087858","7456743379902091941","1090104021120613545","10044108483472049710","16680418734924720319","3919736054827836631","14307664273886556220","10543904565512960590","16976895693679349275","4344888298866856395","3434642297251031328","8819378427493808615","14586007354083642155","17397211270824429703","6580593603792008669","13891373368804113970","8551009753648585815","16926587689907136552","5910049679534960572","3773088308503997780","5453842890395071721","9495924060871220339","13318399807252015839","13615794046869931887","14812750178383485849","17043793189952250047","11187310087896542497","1035634642865070994","17254040237878442394","9389140415256639818","16793454030706986064","7887551285580533017"],["9165568526523614736","8632022060489226344","4583086350860052116","3726173456237185648","15729300518794328774","9373395302510859152","18180359370007419706","15330405435353742416","923425349698292150","9137591090240854387","7116962247478260028","10552323199307039627","6021888588416478176","1741182028891097739","11697511936268283822","8624303873743830843","16323080349008663316","16287627937284202414","4227889532515997507","17944474470144144164","887026698600228165","2327963047282638844","2747142134750126676","9762324124276999410","12789949594002635054","6563072854062309946","8725182865126022649","4041429469456777855","3113521115193701816","6920892039233006104","13403209006127259456","14257268797322094408","5560685420650175282","4574510237850966325","4908231486458151485","14306052629017946076","4522402085202341460","9189461851701887299","16364233707210787609","10778086576019900357","16534938720625614229","495150986798852493","4933529525959566434","821160675572653962","5267226331293741620","12444708959295422188","15281411984995074838","2284842662793025062"],["5295463040106253277","6851363414874563950","12447311809450420085","2264978857700222007","15562648183783157673","13627091774918661523","9409587044143732248","11017755309177871309","1965604191754179840","13214994246096556742","1018328760505847001","1920551172491680863","2395837124736435694","16118296550408309774","13711617621950550180","12445609552224458364","7771630552447980850","15584169134744584422","16965584092387336673","5206249862377735419","1757641171404843986","3906495750426596704","5683235341115519945","1161334142701442001","1916024776875352458","5656009353960040734","2399025178698501926","8814188928552459341","5175816592976837291","7103065238867267627","1324307411928424835","12538286409141612137","4756485533126774335","15441544473860417447","7024345332581176122","5608939347816297985","9905679014177515222","2714326469731550743","15883631520465693261","6434437338741172402","12546967954737128729","5037639188219743795","12186317465051388965","15750103471520301912","10418938299816005840","16151865137363124624","16816838101861931348","7739925694373921314"],["6158362404190334880","4633835518321954568","17643517888053112706","10594133321872067738","11022460068111951238","6653626215727703396","12332150122613005466","18221301638146121412","7998013267323758802","3293783039566350681","16644298617337385151","11235192636790027602","18320121591151662609","17131231131314326047","9904081196858439125","5760802449834131249","7329007965731228199","13560660488839597250","3556299377404200657","2082203449880906164","15832529457432470067","8963068838520949314","16079988395476629555","9845318182177531354","8990679385671049921","15115035491429913985","4450868093485467084","11540929668389364769","1641916794403233392","12607617627374583454","3072925752661762416","17396173259599762003","6184090168117480357","11906236564441477074","16647930694672110419","17519735183534716148","2760791686843778140","6299331940963724101","16084863136230926700","10784365511236787158","17021810603620581373","9855146956225464890","7017862486040299460","8245118081924710860","16674377931187081824","731453973443333785","12064814523288893088","1376751947281879134"],["18265418651261299995","15693054161577846136","1668543821746834270","17606896743705308395","864777979109475909","7538706520461420038","13212343424986983068","12958094088250802960","13989096905199504617","1397941663396959560","5223460716049933286","4721503016865928091","12298208593223439272","5961845892815418417","11809585236022590975","13157782972475431088","15237925094938910428","13480223815683098711","12250900075941708665","17924282472509089608","8289361970720473078","16715989038969907035","5769332169828106295","16245352157527768144","15548140463295632653","11425907254337102511","8542482385576077098","1397780071391718932","11000285951436155166","17979640082039791260","13607636067430720883","1255723495351977271","8088054969575925340","9588986367639267154","2882110770135235607","18136827596897846812","18295667509613363992","921717069418678313","12383349273321699051","14954843074610098917","15075260977408150034","13087651325764230481","17197816245533106422","14799926282958318171","13726169243475415522","7203966570398113153","11554840061272864126","10660310504783106298"],["17108422527975322693","15089916367540237328","3958537758035509327","1421743314527734225","171688296127503117","17108804423768681274","16374985963075811445","6766527478873917380","9152878532238061395","9278021613168987042","3105283918590089830","3493686626008922554","3943344558908468693","541773342189729323","3649278506677525450","13836619002481010131","18202867366723088818","8327333991947845680","13015045409793360230","10881067577422584861","230277161605419466","7860604139969187572","758488955288767212","2425236650582922025","4933316438846991053","14392112287719624120","15910351115948854104","855901148094712061","5030375531134369355","3126906828264924261","17996935167044099281","11016504828179540490","10897330974640663423","9902613289475625316","6104868179221148101","15046336035783807090","14143706649191621297","2515490813469271070","18119106197020361637","15834577260636519290","4520343943494064775","14915646405469497865","5837986882141556775","6419202304917785211","5376835520425999931","377771991453383749","7951510106219832724","15764191328706437321"],["5659305697201251196","14112840635729303838","17903778929488857443","9757347100398279333","13244777373854702713","4059380469302446971","2709510076695808494","2306842829083593906","4009745096249555420","15374731577227594292","17828041967856359809","14118253369629684030","9299989041105153306","7417419692786712285","6038225077510792894","15694052087685052245","10907105492464521078","2566573843236636161","2506835374418316345","12036292056479925426","4421733057288866094","13621172662942363442","5508052470260439142","15331359467905643005","42028715741833813","18208507145260715604","5691528179479415077","10688755860447753119","4407774044297224781","11317777489046602762","16948726344396862406","3166343500457783805","6569152825475447350","4315663296603782691","1502057719570150134","17286132388437705668","8184683961513191314","6777687229427306288","8877902538458018452","2551635895113221728","8454119965319360065","14284738512167650734","10424914728608666975","13252812377609723239","10756904300750546653","72551964995466234","250307125597179172","10989146932706938054"],["2714131621866324388","17753332788800521501","11716322839343902353","5459736084709249462","15433559734604398668","10013046795884459549","1570160159421237798","2362135353659464703","15792950680849398780","14140141158192505671","11473005678062736643","8232523122640008732","4717246213712788703","12983558828326751990","7390439427702908212","16457225522212303482","3913202945541609469","13796291012460303333","14415886606759541044","2737917149841670839","9339285436901876189","7605587768005876658","4887571154855672765","14299570011710259763","9661771342046300366","17774792638736930656","10017741021504326963","2807045787344557974","10793572091195986687","5765847833743063699","11998760830351267031","10938704419051128434","16301478633168561859","7916229249873791456","6918831154803414236","17337577751543866739","6485104643422565514","16819576101674502122","5319422574107998375","7673082407809417256","7834731326338534354","15010820945740252098","16980661604624740140","17050292763669498898","10701695349900492922","2567817402822454438","1636770655362463055","16411278308489295751"],["4024543468577652452","1874743835783147859","17572483483544505188","12113928865638717437","10544601945467471214","6788204281375822524","3510110700509676253","3593297843157570378","810210036986094192","11871514058565517015","71366156851730059","13601923046884507734","15827470915840418469","14166703349893679683","13360805607570240644","14448296560229356888","7742732577009445634","985097132601972599","7920687112076492473","13896024553649372778","3764929438156222128","6158668494357767836","4012283600278760036","11908862273226416918","13021506071912155456","15926862163875117506","15799745970478936723","17323988008266276673","16063187272596354881","9654066626042276786","7289304925733109130","15079609382972568387","7900848457568086530","11588952094099399222","15239136468888910479","14794578105249163977","12518898732817181521","1519071038106676845","12334314635327873837","8012894357061731445","10734580570443732602","2652389978320881696","1818840829310711910","1245360008117516989","5619773007289683116","2626476252134672107","12079083404049223899","1630147090788023344"],["7435917994302417268","3200112369889236944","9889436438948220292","12116866541663572747","9633992917747594177","11329388330453431706","10972820503851737297","3260775697412938481","270664374965651907","1410247336414281241","8874715987184766427","16580538070387343158","1246132657831844047","13029866450999144729","8008788957009342707","7607546206079893505","12189658229978128117","10935765761391117237","2828213014045025273","2390895344298259543","10615173848656832595","3428086008728904337","11026790174548438731","14242633555237330596","17723218932864895560","2250743262246878550","2376760985905792067","14402284240491405610","13376108777006845850","2343419140545532974","15324126317071312292","9357522669321707563","13985909938303485754","10287675738852154567","16674425521028583147","7871191135016804140","10577979641441806678","796119110509756352","9314015539519526998","13249465276495480822","12371308516590225248","18050436645070435987","15270608495820823141","18121481703871266184","10639134301762440158","3835041066757658417","4124022658302521544","15122415264411005835"],["3109004600864167289","11421426136557089000","13816416000590218431","9074852551098162965","15897068238767259945","6966897453412591052","5192620099905840209","2421249878768545105","3786599773528414221","9974452683211819514","9623357682857783213","16306785797283015796","15838125841965647341","9782609108238757447","17943711844337996464","14098909353837391954","9995515713961058700","15237838911019860597","15918604249608014647","5205043597801263073","5833187286652271374","4178135934792970196","4072340999049644769","11191790374557091551","5345530991747044193","3193477638001762812","15036592801197858535","5559490791437236662","4141068323307048663","7977153374821099658","6436095021961531207","15746176669772076760","14429645478180736001","8224441906856285445","67068153884261247","12777831494302950357","7170414965049694816","16738825730615131471","17144346411797587377","17838815135554213311","11547242536206992561","5222425689880228212","10064769784015998495","3923854902525562026","6328328811885948074","17180289472306098486","17377517362522255184","3233384801209595440"],["13921698735277504781","3089725762777236734","1383344948248219865","5834294272301568916","7276469867274422573","10680990575053147711","8633189459477268499","2841380450439014095","9092803627793333852","11782418677513221043","9286796940992554486","18245503598281547788","3880226005610527575","10883668823711493234","18110058072687090401","14860330843141475424","11432416480399083990","3708589501165179994","4969579017811698557","4723486917149175530","17885934317644674985","4676138317167563283","101184538186327017","1715172097030211160","12023686974118681452","16579158490543962324","16070880526425482622","5449899893142086434","4907849166450952945","5575586350231143677","6703395773387085395","2909446370316229900","8088037054142807813","15520997051337960330","7468844235113785406","7541682677418665781","15868189184330443115","14964013912516402877","16841223539844234114","3338528385292058845","2952257545485026981","13534320550617942494","13398951467959185659","5864924167550997090","6773271138694649364","4443682722690778249","14512855880436307890","9462561393396641594"],["17024404021703085965","15291314666543269410","9742045389916546137","17561322940720193698","10484510110577527421","14158188214871590162","7347280529587705278","13639909818199020088","17509153063950645564","2935601285080561158","4070184056063502083","5351304104412869634","14821262812637067680","5141928600086564634","9195497683631327918","6849637141217441361","4729683823323859145","3715818275236328638","6085731394549845481","2533136032835301027","12763515325674389987","2317517111698577470","2568680245966093099","6598539990204393588","2860473501320042843","1670372154912535424","16459905278804739152","17274585104806585186","4904490158266572602","2588791778782491314","14105099700293095916","17388575859550587950","4919020622010910058","13890287430328737867","2406535347167680204","1756428066121455643","9536853331576017824","10346076626363763170","13162971620479054892","7726944503140846226","9297768705818716662","10006970035602711668","17089180066496020987","17770305267695375643","1172465456180841734","15385889415168149365","17305035820773166313","4513336475129981464"],["11477481962459090612","14307869029152736144","5383885325143366796","17258600842699422020","4183758243703578292","9883650671179534289","11779114170920547383","4242635166969882372","16247845470505802690","2934057516321920150","597433514388450480","6654226491710650769","9365551611039441424","12486120588147146584","11671510677669874360","3859911830589087073","11802869038003798154","11681731693625242675","2879223985961491392","6227895122895334157","4822372760155894386","292138576347012283","134962646102309667","5748627730485019492","4123142000144183426","4184100533914463515","17746318478891560738","11918035017068988256","9430175373442853138","17400481318555058909","5990999118092302433","16234810439416013728","5488676854919250990","5097653428597798326","3243505996923894525","15618049771694720306","7274892389737836666","1148157532022235058","8178734690958546166","7403676639516941031","15204591265875882944","14721066766233972040","8145069485858974922","10894699374276856681","15584597385671953867","4792151798071940797","17966044810135970453","13126659352671150626"],["5296366334541077557","4592311399708389759","10306998826316727307","9240425418961487617","5332553743926925759","16508544801948147000","4806407556573984990","12857938096223620098","10427380347581583689","10901361901592084228","10263032025056350528","11249651790590942272","18295370627944000671","6605695451910660725","12947047215077245584","5798817421426257402","103877587783673100","16968767283988867358","9600244910395034083","15682168358341826057","10702636112732598901","11399853167498498698","7482235763212693943","11367725958578235746","7549379852448537395","1395016334587487737","13839235860429306214","18406301356865699871","2053640069196318454","6610501420729806375","10032081226563080990","16932730802343204189","3742404521310839809","15187575912944178076","7329250489700931410","9578740739355471193","17224400907769832041","16823786540176568","5525817804006163137","9546591502408457745","1826510398261701895","5254583631088435925","12248343574274835782","15882907781433579930","3739164250953326287","17863891400599998638","17006390407320167019","323195620020080535"],["1020013416607555061","1221068677486130658","15358064149621897861","15455020923890622339","3413509619404445786","13273576596331568619","2744250053397112064","15853581458705738714","14224327099891419359","16976032273111997725","17689465120420182149","7712552446942558330","3974883343718988720","1516675416973059558","10140322351582341315","5605924349201988540","3113223877512445507","83212233644796336","7300255100428401349","16211297619487270487","13515746743504260902","13798802373861485751","3097212319205927339","14936268270799249618","9457741154277913111","6500371435043236467","14625357400149218852","18395953628353785347","3464523608295457501","2555011525425160434","7209460956708571948","16265356841556808763","428162564554453607","401366178250291113","2978706446080568725","15753754031809263502","5777064032657641919","10324426322507931364","4513491652896098587","18397234641242130552","15088135276558664196","5700359899082034259","289842119213794022","15017331653736390314","4273466034851339167","14713688828335187634","5860637812253918324","8617609294861701838"],["15037686557652425120","10803660997878787517","15130301591605638266","9980845873006742511","6432282578950851002","2491215826676162986","10446314899372564176","17024098564040568570","13165966902933959182","10076153902664709118","13369351152472002995","17629393590240907801","1578974089532530419","4666735745943052659","14839197224080341307","11444956812119759408","12944999995955489897","12732705265332631888","8805647869337500399","14956513965806839706","2371994242573557613","10033955937778598132","3462688241188034274","9855985694473954349","17162753019078988056","16536697267458628136","7430215532556503945","4241040335828738395","9077264036962940538","7683783429432610583","3679023753275160284","17806892158085915537","7574074348721311159","15846023816187007150","10795338865818011016","14127250735339323500","10998273095790385367","16152724870351179930","5644944494637032935","11992646413921409742","1057232953703556332","12843770752260833782","15476491220063809957","10399047530657874568","16246940356710678434","4199734941666744434","10673943627300405814","5835791414890299436"],["17974998261123693755","9261915408173280746","16715787437919205758","18304950965829065944","7500886923042726116","1345538202732557533","14363236044693854485","4914571049236372712","8971794639851238849","17640222668357445635","14646937956434315447","11865061001714398743","1515549559204904437","7901058725803922487","11885630999393130338","13862068146177085332","15399793512789370700","13558299741608692552","13383650635283715410","15022464984584834709","2247591034678936534","16879330896354915740","7754722602415195632","15872955565214553901","4006918196953785436","6290171625021133904","14697062022100780118","2583892685336421893","1261274759873267877","7234894600641387379","16279908742417080612","14922653794852643726","3014823221213606383","17332203182338574477","10740160466275460463","13528249530086978117","5021229288055932447","839822149759075191","8602344271923835715","18108502173009145031","17177341177845077165","6308014875447685407","4197938976902043697","9066472927788918062","12340753581395493088","16970792258818159166","5746039081667494735","13774853237591016794"],["10117722039793261793","2457473993128654576","7703049209772454075","5516754141563478915","3023611334526174660","11100893605243812347","1695251674984562052","7568440989310827706","14081076586666595636","8367870497339091869","10779091156375890595","2688682902678920290","12098622996804625979","1179421847796024239","4250982464525661814","17521358755368568052","2396582113210629009","7813468499962418669","14598068698026220098","5923282882893396062","3673082442700836082","14501133419526694769","15454150051518214269","2186665530823946141","18078934898601767319","7201165937265929582","10353513683075902268","18076265005893885898","2204185688737237407","5322488300778948687","8312408251665714143","13683736299645908307","6423636825895534769","13076687032182731071","13452597462504063880","16765839869174160915","11013173247275089901","14117486774439152840","13882900755913648766","6970474708447271275","3696397112482748530","3828525096824917358","12385634725438338468","14447359246340129325","9010640190591782017","1637876564641281842","2480485764857501942","17274863715946186015"],["16787554107351068008","2721003889018620412","15740272367646634621","2891305473407754044","11160093607704302943","7311933764651240800","3714692696174983344","17437592436902110716","6782388414594000271","12741707182049209152","17860540613788793881","996433365978204804","135373393448133603","6494655095621492845","8480316664419530386","18173072654976505175","4850173132414205783","17147741396001111252","16565629250927521529","10502920204294584487","17313644328974120025","17045807351222515951","6981802250613426539","17306283572815426697","13591637189161401352","13778874693060781950","8956135892768162552","18309015235980398051","9150089071761859503","1293035157337466042","5813808862841179999","10891750742537507929","10064961412180144546","7604192863250196770","15641115021190561111","9319658487427860854","2774727148908008885","1667561396408771851","11453299802828105567","6735217677998104113","7480657907890386910","7203081795162267987","15340047925367942852","3975089697293762353","13631643057118090925","7494550121763438814","572382330971858799","7481064381247251486"],["1346851995722334524","3058149927146474304","6367483462413109919","2465674288686139559","1642949543401840799","5014842404574762524","10598092305933161121","2150153884293342059","9668518378735127538","9170641255314232715","10811122002512792944","12555377569804317922","17362979077363951720","6089318899031377542","9794019542747335706","8506302891311402631","15467701629451640256","3404745781701587144","10334333228392624163","11113934408968033482","1224655367830779060","4622411959071567922","13312711193813781619","7171023797829129451","8060936968062896016","18128236729905147561","3780647542733541937","12127644862254649369","12727078311596897237","6757762079385036435","3526912192668824481","15233172200442910541","10252867827442239445","9256156877974720812","14532258333633895478","2052489826760337565","15027495976550563836","10994523057285847858","8606816960980503812","17868751551938619157","9892846760286796677","10628391843458355699","4455735030853811014","15725762709397465240","11851403525099648692","16425391021346571002","2270288832074338996","487661336531458422"],["14232381515409982634","9549085437049870714","4021058871123135261","713361361300958142","1635478297930587050","9342242466171509480","13789094402602516012","1406277492416702407","17943727881257553488","11508205975739054196","14829997400580457559","11697226735137158449","8780063855930014227","8960248944739473713","7628460768240687177","3626923885811325075","11561732200338376544","17690283090674090082","18423814059287670105","8634973458596296207","4698192240532358290","17772384360903275676","18084438897079224481","737886167049066640","1475695411072812070","17975594843519239854","4230521369726866656","13734810113667715385","15223693176400225201","15564090553379251128","8460394360991020271","3339240365832325764","5160099696633088321","9484869048358501048","18147820728595891108","13841498095924150534","4243080680535814768","9904365357561502310","8951198138233043843","340704994900144991","13370593528990030801","1992722530134005438","6650172190724071260","15548917819854706621","6803405152879943477","14223965561751509727","11038227365748314295","14437571926413579352"],["6631706608438605808","16394698232129714613","12912768254149557065","9945189030747291432","16241848964750452293","8085975758480296283","6081896330037922707","3604066930716780585","3252098550089154451","2567924851168694531","14523712380351355864","9367176964113798232","4877905995336831867","17719052089820608829","9745662811838683369","5519512656383750627","10928723041121228459","13398469956038857910","10106629831913364384","15612697330530533871","14548672095413058248","4019180028504671363","10186641463925035197","857025470450285485","3060571263408858175","15869450862848097003","2272564524150360234","8692665830215721196","17689688775202188560","8563916081600721623","8363100621553087569","12610813868209732079","10641072685609329566","9248417811978910101","2574896832274326705","1373437169891563272","16565262672363996264","2650667206708358840","784552198515025745","14949324501276715307","18417912702426351168","12109625122400187330","8044327466651740576","9979643282442915169","5154221447483168851","3961347889140516962","3069126848048133753","13136815740357547786"],["946095562141069386","18078841177254911182","4674010221368977906","6489925681226951163","11824814894951482308","17228450647301109678","1448123901709686878","12190932578560967967","17800937259801239628","12586111301937485839","5795831195992329195","7228473093076835449","15645295846799741222","3841340663154604981","8774159095686060085","15956652326281856976","3501774728268700861","1293187366298777817","8656437750618336121","12590759422797523406","15151110703183692728","70035698337744150","11366457457830254236","14951465489007157922","10863977770472083018","17798242897257956562","8790035101799336345","16168755915074901595","10305648047659616255","5633176219961788721","16491997381678702017","6365587026113423631","14649344231638443247","2181791375779793320","17190222754047357071","2686404649670310497","5209633207770652731","6523117170118373316","11428069303943468899","14224074166550811499","10591123562190979637","14615998824160612711","8661709141833464440","12915513352668193217","1254055885475973831","373583689440770385","4556019498499302355","6825136210295971271"],["2147531249500371703","15848268662474321863","688907474775707107","17551301135356884064","14178335324460460146","4674730928395816945","2707962972679673424","11394859256483419585","6044333979274550674","10025194828537821095","17020725415177095052","1335613062226855069","49668358735040633","3442804808639790910","13709798081183945336","14524255201063595649","11365088551760229894","8686053509722419963","14268615948972292422","854564450122543274","3369638688548213770","16125770308744380861","1572024982961857879","4907075298633892196","8195498621664340877","12122615945031644064","10362045982328299187","8402769261529389652","17831909422102297029","12484462711309831697","8093061306641506712","12036846115081986121","13370603670657213263","7356985184652293395","3202140690847219441","17193894830604855411","4786107520712730063","10155390476424391181","13798399655425481216","10880853099675766342","2980513017006062899","15102798484821329722","9941209619840145097","14558977573537728751","13296215189081988163","13136442131925021948","6258084675300286685","17973674360966443524"],["12110008870486757158","338945304465097582","14071693112516634277","12451968695574880815","4433303928864320865","13313975958909929297","17666730605759956257","17797699562173678044","8480305448886465423","971779748022478806","5769552779197988800","201128137055110507","3867546521897816691","16268318024735384793","17992189589661891605","16270901865879661968","9660748491932865387","3244253128006680434","3091423393952174728","14399599382051086667","17716963594828601863","765111958218799007","6464283723161653144","12340427826288643351","15687558997021937776","14512879076091000544","2479505234762865874","14693362131082909077","2885512901331937238","6879465786968761671","12905108006912095606","14190340841678166045","12715484448127657098","12766688498731098963","11125233509477208014","3933019191433749644","6688917538908624592","9546318125746174107","102288309912710296","10127667554942387698","2535113326988251881","4152345448499509883","10086127336979089480","12434877851221896291","4095512344040155690","11760763206250450368","9824598298180792544","13221408290526524364"],["12427026130203686516","12596763752866909836","6666960427251498539","18321769307174154582","13608760406969242863","10711011899649141665","13135174650836535264","2022471749631971189","5678082988099159214","17151579711103774960","11387224054005188254","10159795922834543291","8528848263918519453","6034661943885749175","600804815399707688","3133480971735441918","15780577765849684028","1464755731078201129","3394346256432763795","6952477064709858540","1842122239072122113","16066306144344529080","14258165772972161438","13164571332758713591","10894662336465481966","18049549394354324073","3782327287007442783","15783245031182199329","5956750451047259100","11520474540409572882","778264592856664504","1283213820261403922","4648330334983527288","14751677992475680973","9574950945283691466","9931809491878559562","12460229745832165169","3911815879807000356","18050042131731998170","159998647392567030","6478851136074226222","1480818787166775529","5115583317254299177","9255383936207472783","17460706398046587277","17356828127054096056","6890407457595480762","5556862173631071527"],["6614729931591590258","17729231761352068192","753413761227107077","13927144065024138351","12406622306526876735","14573516892166748961","14778798364280731163","13188583823543962531","7288125757746840043","17838283675759259810","17085640999367545782","732213010841364569","10871296741332601563","11579147637016554588","10019532443598190671","1762444596155295925","9870655301366926274","11760729401221124259","9602357048427171917","4834689365150963201","6639945809055048634","9237763010886404305","15732550711656305839","13678205493243288825","13833506317550030407","10146374817694224310","3553785720250569526","10578052276353896428","11492181204765076198","1639644940696088225","3711392389955520147","2365978018933510608","15317013796026842865","6424116455263744968","257541796881527484","16802261731482295136","5989742617953451605","4441359268673976151","11117074438107630378","5793934425750157109","10472648330174014591","1706702923475798643","10015646696794729527","9537199884605214417","6282648004696306365","17043430192935197256","2437831090548571316","14863047061611935634"],["9432391177315264546","2356137482560448845","3211394496747894305","6544449580037397042","14416278111166304285","16243476470118563686","12064602818455635902","4495183232853632905","17083374402431276229","11541502168558645967","6797143283241031028","12330258088428438807","18292153198372254451","350692473701414138","12850043258412922425","4322492746467747009","12643951990894918169","16609583125185897571","9698030632695360262","17862070351344580890","13712094270692586606","7829054981204612356","16601812422872140697","4616462224135672120","7835486809854420443","11486136026652064939","1080736634357477483","1243757435470809821","17605137287480067133","14851689194061602815","3139960501240842250","2102326868787512204","441356884942857912","10100906886372503668","18304571725024648958","2721458821649147673","10415889555930835651","16819627490595459232","6162660179615822560","2760605038804043339","11507723493329908248","5986939066823481026","5294069412291936118","11670743293619023320","18240916261725088659","6594271214071049083","14776252835464159791","7836817580123924664"],["626305263891491361","7390011346900472112","13137151195517587471","13809478891511852385","16417997356809018389","12547147583902367551","7480072974413302130","13021820389171116105","6039941272997312522","9310927013065572850","1559657777281694313","9962914963991797084","13665805863637921479","961985354498194597","404530730452092107","4946297757279399095","2211007855665993131","13468457702854851454","5715865442354924414","9058722098026382602","508153531959946812","7305985918315457959","17984214012116034511","3898417399940702969","14436488357830546148","12123089943244147029","16074570340329883423","5944233354262320938","10364141901450472635","15512648965648276491","14920690995330304628","4055505201677205196","7751546773305845237","2948121406235281144","15707760133814938856","15802983498084927049","8448230033886758141","9333664202419843246","8596924530942688477","11180675066841918399","17806455557816715717","10292772357477995513","10969475009957943851","8290704302216514206","8553362038358075177","13084769212485044753","16678199844063556467","9540023775577876472"],["18153072398431936926","1896550539328326282","3710676589532982706","11048263148314564208","6936786568271228479","18244698023335922503","7431840521441422095","9695932161786390972","3962902968842135491","5716553314536171010","2955711484806622037","14302624529601015901","8981652166998893028","11202804055078318558","5918185312349255413","6199227885210065548","3075403857859907071","6361907700703609563","16764100936232155647","18290039116502528096","13717084410921685228","16429890807959371354","643091070479921387","17990942864314164467","2277446134430957069","4081196231417055525","7177988649999907911","1608835479758479849","4396629423793478381","14193143581396994652","11742494890142952229","14144271630650300636","14828921462350588615","17154000149873579621","9515341078573301097","2246014348543000985","9827288537603637758","7665903761959030804","1648767835196845026","15207566669658526461","14598256765441791431","7832678186071321915","6834318634236427951","1258039273090551532","5259451958410296672","983596749647126614","9549766013702006260","14533223641795164738"],["8499970232217902585","5454416166692661083","4320619443605801635","4645107808525856952","17511762873566772862","11848661199865988967","11412716279958453658","6759893632454208107","9477928074746967011","7149577107087402615","2465613611509688738","6052570567139596008","7727580241064049849","15138166333657190527","3048528345539766139","17713214781704360028","12157211111496034617","8596276363088899453","3913143483315244289","11593164838884998432","640414217268863271","11612176578418337732","13735237668522427251","4653498373906622943","5893662656177465503","3371622331500491225","17089724828054544091","13988569297655908683","7467331887524549159","9901697753600124203","9952433846115673739","5831706453351107168","16400920888423107069","16355643868320621309","1623115019392100666","17920628971323795391","2159335734986330957","17029096109758476723","7448852289426932882","4645625655917445805","4485805524119557439","14867195747675421578","5441171222692822366","911409727980518987","13692748759309646401","17778973995103310702","3821627546563310912","4053506415955458594"],["11346561697238852513","11606848471236325610","14112159694468669132","7460250488310626858","9026898113869366287","9283871386470026673","15084505230279651871","12790930228044543029","17759314712551223672","9945537088684414452","7065413891507761657","4536933372626234763","12840995338591901139","5695324643673247234","11260385642385114283","7776480635663505282","8307174875120993577","8722113326759421994","7365532188646354518","6596956703659360233","13564225925449927869","12633968465412228215","13422498707416418155","11781246698467075394","7185271493380308570","17325343503174236033","12603578493879048432","17536974429777673131","17449141193864154613","11047051930359032250","4453893986843800217","12756756624164422003","17666579505113646371","4117127985173354368","6811435604663401247","7051710646608756228","17226704470298825522","14101007529723520332","1437405048861288417","15961937169719357283","15485597353103711962","4353976820868408072","17926062695780048695","2407018023695069216","8050802641147104934","244476982223276098","15707670369432375027","15557159486494271715"],["564551395034090726","9635163268670846958","5579773343378525699","17152328912562169956","8854032848501315824","7896008957586056285","12764183632119561742","3738920892621792260","15964308000206555410","11894535745656550508","3633626467588325812","7670200023622743963","11167314912770048121","8253943020183096","10665576023251867497","1879190916664018713","9829375423346210460","1273470474231278607","7137758557168992637","8736400634646866628","7185529793392499690","6628864636568864910","3014292211886762135","2588695513520271231","9941405420160921644","17161835082069708457","3563568435028196328","4986528868101796242","4463320420788246898","9179095675625121493","16137318166808721034","1294259323599037116","12743343034722290549","16311842112815584925","18263007703222583348","17586821099492411512","928288974096633059","15679136452901626625","7526674175782341866","9930567614349239211","2693679031921013622","12942562655288932349","8629370759382701078","779774056719003259","11217252995945119669","13491719525551953562","16813415572067535347","17457491494762843961"],["6672160542490640588","5374916008610229215","1152519409665987935","10281921594970846920","5885412633928410266","13101415644321201269","15920417935264719211","8456587309542858398","14689771682814482857","18246716446020811777","1612207859390043157","1820841050511187661","8349547120501033346","7320614635749019195","289544600236746737","12968348338774152178","873148884316659169","1380182983330007866","10693352725028648625","16935337762675941581","5700189300412303902","12107489951890672009","7779867001826771199","3744034725819532381","18260311136266271234","2096740026733213327","16775438937535196544","16490936367892505819","16852719067367598151","7002347981430532394","10336256402010594588","2831356186822170892","17801879937860790081","15881563521277035368","4911337252039229831","4786239460655856846","3333173653414781638","17659040870464431344","18177909373114637804","15262602229611801917","7869124635828649914","10673465844303905300","489929566623416766","10865649984891451225","2713900506888990608","4046077451037347451","6000835684766264623","15796616121865610263"],["10103766568647094327","18247718470955914208","12554805110846154598","9582195392606848100","7671032948376522167","4175910423732967866","3777057181519412372","2049350741584998463","6849640733003649933","6845283536362737359","6830181066620865828","2495705665716250084","6864653662037424582","15141655395278257391","12202568801290827592","3238129766531270601","3197561108111694406","3508510863468734464","13848278485466537541","14604200399678241893","13051102688245192600","14509867737025372150","1074604294081580141","4837574056101320418","8474905958380920969","16414594885105490196","15310591977236624580","8678862823281333012","4926063359498211463","9586249749074421662","7998967186700942570","17450724780129638350","3149633022405975270","17122682014224190678","10996412182575604996","6981574343538442774","10192793522868862135","14401265257207955893","12227180152377299203","662307709848095127","9309114985594506961","1541718704132162432","2695778630940758768","12273558229953600652","10491829809576887169","13273195543582046296","2797247126037966163","6836209517610552929"],["13256789743351707264","2679975784118231474","9105251302475309957","2188792981049612504","13540612886303624655","15118472345615407981","10450686160373409456","7017962483278399980","16450566857473787286","6127843535019883232","9196377666569151258","104146238012504285","13174450136666812304","3277842323066389161","3324953312587793594","14472994438894214005","12309984413028123444","9710296301469783421","12174757356162772230","17089021407059693121","1403480146112700563","16531674280522938380","2825463583649883163","13653790577590560201","12608863383596488076","14732735456365923283","10283251445375781371","17510182049483220206","16275510386694359707","2874806892464087552","6155274057291262685","14130746353833842410","7196530300619385114","16223114454375833658","17027391496958465198","6372995448276377831","14571487634808035729","2897411006303531588","11893928019626962302","11143093912459802436","1980020983820215380","1871387377471737882","9047066818135953278","3014262118258380339","13156091505390949529","14320660790543476053","11243558587240769464","7758366090810940567"],["701721879197012148","13152822512801388170","2694608606608735711","1021890532231804552","8085804583730871790","5125637126919451147","10667524610460850188","11367289311845731209","4846186704412364680","17648201973633980964","10940614167685506100","694477397760994706","10115784563327524634","17015608039919084316","8431086322151086192","14609878343706851609","10856103823012743012","12564787105172441457","14476159709316618926","12444350297887431987","5267287629771377510","13249834237709437466","17004648737505661454","13634834580314154848","2523831564760428906","6055337846542309803","14162271926708091009","6501679580479700726","14164806020611141003","13300836830803622977","13137474183335429564","4915111003473771121","2328518120870026255","9892572738635501986","2936877367502782833","3525160719321882271","13843220156433505609","6950083555697538219","14413828387048105926","15357281300098196664","1464998657541970129","6097180750399080420","7581897743371923745","15448911260623016603","2263832840755645329","12803963284078217976","33888071205819812","10140891069058131421"],["15168111289762968446","15276991099644584053","8660162281899118397","13219324898893214277","427116501490450449","12965012057604128936","2748200201303518734","12271743114423709949","15257374416842614772","10592201513415853647","1911950684822912730","12120847495574672446","7912895676804696203","7118636254170660292","6643262927026403170","4680117997618709653","3421874841779593020","15967744664789254192","9427470672474411979","4849113750179089708","4656727339432997834","2107930144330963631","2193319289982452269","3158233483247554758","15035416904574048090","1556058866789870708","9167633767741728547","7962275369465450911","8406654655880793847","8680667258353036683","17909560330422552548","2789392456291993827","13069611889704181363","10095616837053121758","7809367606544186816","15259422429005756512","11708243967965451741","11189909306262135459","10103695965601893455","946457675380131605","3360122971665133624","13985057882488708210","2210448319483296249","2846799051081583633","10048325957462832837","159107453715542568","875772854745448518","7266899233932661290"],["4926863211820865286","2567640023847452296","15420625019154108368","974915217427127355","7221625768810594355","4369968803830310738","10607799713183452716","3048576983174953502","11591767975811105721","2000013218585482872","11245479028721426683","8361904990212973728","5878891398479334003","4561182795637148474","4423848729659529699","12650082996177167112","16683720133208321831","17838793418342479781","1613511432274070787","10415164615367976389","7227836117832049751","11267614691196650974","2433660455431890299","10000866130224230632","10921795161687538959","812601738954845056","15076814547111971814","3729226055414573548","7357433753881402080","16992629893990120718","3216427897921791610","10821635398852383010","921282494494502529","18404330456515591281","4973815678406224192","14588823845402817788","11645316266677041535","13428162472904401080","11811811196780143780","14045191801080278081","2594980256471061505","11366853155904278544","16564054451378587586","9751476812151684447","17178562136350020814","11967591271849520152","10785994066953669021","15320772013918115898"],["14303995314113444466","2806737838272676591","17970247922649786735","12004620945884222991","2012934940452153761","6205220318740906534","15157022382417188657","8199047724642539989","9499302142894116618","11444514052237667990","9963346088469039918","6962560178632745131","6290906545002643902","2549995951071417905","280844416805933631","14918385973445840776","10167983051051431597","11381789198112061343","13673508904352216763","7134855070580084350","2826677546937250293","5691362996534937070","424593990288560864","14516748907860219989","16034993510687727767","16505948923885196812","11605324037679046347","1038289597501196328","14729088446909698132","7457045809538521709","1559571382975808127","3537897347864963029","14841553981452462848","1270879656490287326","11003945524825491310","8118849246053407323","259448606850649348","12101947451586712638","15714483313562660112","18353579304305756305","6699978839895043882","17598611797477273132","2376095906320610276","2739204806858898658","4237070793190881460","10149036062403810496","11665218205315735230","12340543343848229605"],["8957495098859173392","16999890162375539511","7908651640713590034","16242874972437728706","10691555221846135175","1425616051447957712","16512386513555399739","18067113436742625912","16302655903958613968","1253521678544349296","15504265993829956973","2158412115572675082","2365735534407941171","10357456197206354988","10688649498693023667","12050717291858532006","17400686788566592614","12653871562608712755","1623614625488983293","2573976919137447056","883164702770834153","1239471608938448630","17478860400669611545","16124004252498103460","8021223224744815517","4848405025919076904","9095270757310533901","4715868057615989584","4389846641674985662","2994262559096210516","14252117508140477634","12237186283831576110","8519425316424073353","269732684078940577","16062091536866739985","11756988346400720317","13083553960307029562","1912816141333369128","6951554253809734585","16371605383328984419","1354576103315186158","6957943565340134406","9747626407736424218","10098795573320062974","2342776552292336968","2379804525997424036","9437292339181550389","17499348068751696834"]],"s1_siblings":[[["12218005526450321729","13985787946830707323","4480437731155389718","5608751299169990152"],["9154471934816062857","6405070652754543986","13799229504736983123","9761875019043144152"],["167160464110841591","9137250901943678171","5592719319457954443","6045512623443437284"],["12490033027372685645","11893094784639046530","6994419772298267869","1462589765015412432"],["584585464562408615","14957131848860974149","13043898782151831158","10677836568687444345"],["12551123819622456955","12383092057456434933","15794059313190738463","7172808253642908088"],["189565172713375555","15906748272037463995","1397094207156064526","6477834567840209830"],["8484483619996495533","5047760564061094339","8914595275521543219","8367796272943196186"],["17174074210860958856","6413568589068443130","7641041153029502914","17248787836031507652"],["17840931049909548759","14914326572264613314","17897440592761644950","482312780406363524"],["15509494131226539616","7689906771623781804","9604450406453648482","17854584060292553224"],["7736688721135312501","16394186740749102688","5967365230775551263","12430920296910065439"],["13792528043287349750","8572833987245508304","13166150140636928878","15196972103847227485"],["14479203326972975066","3788493300173444325","7288415901184590838","10917290900230604425"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["8359976898834874339","10630878206413443640","4554577530689291520","10702423487912155878"],["5538851465504384759","15680418339993369497","1472295574199622913","3941667467543588679"],["4991598158900270721","6275031695601224412","8735867644946289979","16968681188545347329"],["14763195679155637602","15846979448521811326","1027230043427714779","3590394451632054669"],["7068317194880783228","5644041537336876111","3986321934472661959","2588364784474034384"],["16396758041576794912","17600179939413916911","6358295642471804232","9514716685685433140"],["14494153202491784950","13006923498732598599","1514966997668710118","4269297557117674064"],["3126134353476040118","7679466843696659788","9531439001144243603","15662401351319106461"],["11338937638528816930","1796458117916859815","10972428179765903486","15699950282130348633"],["7679607715930349512","8722345116136361457","13347588238808902101","8002947217637759815"],["18407023936816332655","17965167078338431207","3200664991023716324","14823641287664047781"],["10355398883197703054","17160104412990423496","2307561707386201731","7607878679218149407"],["8863053604336634559","579619652178776971","17446608347941940366","8073861787277550450"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["10294260178561467452","12532392923350749387","3660921370881330233","12593645834985646947"],["13795971177452925534","878716692019932608","17909080546975923339","8639769547640455795"],["1237585176181059589","3926862618782404163","3939512663877987605","15749191672166255898"],["5081422668074124066","3114069577000936773","14724280729887910400","3784194082154571230"],["2061180540782747702","9785937816728976583","454126664820523104","18410974917312544062"],["11494540919673247174","13314970568750562048","17580135415089259975","11018552823733375717"],["1105796913304494188","8983121823248628491","9912776513213154765","12051454026591225676"],["10511138682323449392","7166037010571241639","8948202405827746264","9933460742577795558"],["855474894128965437","12322440914206312084","10030271457946627569","896720736537694569"],["17840931049909548759","14914326572264613314","17897440592761644950","482312780406363524"],["15509494131226539616","7689906771623781804","9604450406453648482","17854584060292553224"],["7736688721135312501","16394186740749102688","5967365230775551263","12430920296910065439"],["13792528043287349750","8572833987245508304","13166150140636928878","15196972103847227485"],["14479203326972975066","3788493300173444325","7288415901184590838","10917290900230604425"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["17273025823710474662","9435531534781622553","18419018507401616357","9807495502637696271"],["10679183822236440619","7276155917892391830","10678112359838276442","15755561743874869484"],["16907076300711036455","16846290403583552867","12998163897938521264","15534301917777690249"],["9794638328045798010","16691843887396914206","4692796521429719619","6947712730282968054"],["15460632145390857822","11217324836901044527","6262510555627211304","14625919302472708253"],["15948048922800666521","3134460840029278817","599905450041584737","14056381682360193846"],["4827668885417632978","13538310866869990145","17836920095003015332","16111562851018599276"],["7750881373172932245","4405322870825213996","9030226743077995021","4507712727237422570"],["4203091086126940633","14992494698238510412","11456408238778470868","15215113123973443641"],["10483888289902155364","17774012431066870967","13489348453635682361","9781494202019887372"],["5315604818257426551","17190138277752403147","13505480836360500346","14801502399631625762"],["6791441794994724915","11767631964771345875","14424404290863812364","2774423653113969681"],["8106330301591400410","135276838751032051","8784008938755823365","8862451297665185347"],["10329434112406601809","4698161112584361734","16649154814466953797","9391812266335730138"],["14405990439363401106","4055583168739259932","18367325195844121436","17487254987012662913"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["6493990037068890809","11614623298620827179","16455687169929644485","854537128571257323"],["13962060250590158905","4576138219946969032","10109809900385760424","14418932125549460632"],["4639757812510439846","2843824668361667045","4881241504335669565","1815419014563155"],["5160743280776291234","15746443393423432208","13332434469979924929","8155947738896148183"],["7172157783408830542","11168551000466233775","1365997869243431017","4968702897776181252"],["2868086255634976452","15156187864354172707","11139628670264904619","16747797102078135519"],["6575418263902391691","15764156403042454301","5756982651110076604","16420759648990580186"],["17417392059429420708","1520332209219066667","6518737511037246612","18162030881615753709"],["5961634174007690242","5044672012763417978","15872675565067210761","16510474673701930138"],["11589677942412106080","15737833968822811122","17997131559618605891","16174013714352563398"],["8565418413045599545","14782381601113638923","4452254379868680980","7572020975386347769"],["3090196762569501465","16791145118553403807","7944834574117548479","13785730441104942229"],["1001410534418569829","1440231005790684152","12516155068761946130","2775951946059601317"],["4005934639182589953","11643894902161301756","3103901784440455095","17474644982600968342"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["3656219390357636903","14095688309120459880","4306406983629806582","11257719137554037760"],["8363524137969964183","10380014212690715136","16501371940273530403","1781616329317582258"],["6710828985078487842","13187426462298707854","9398816827804796459","17345362838632303024"],["11040496646612618571","9697936744814213215","11991819708706893325","941952071905816337"],["5052225773375607425","16015432347159614490","1430548287525902811","2690661178588159290"],["14915415761773922346","12685380974297522526","7109172930694865353","16666144707908435662"],["12050419994863469144","18355600912031070798","1098850603176712170","1947407951572639251"],["595101621068750556","14844360498325523037","7578360037679455333","10475161836769890520"],["18055735461071242894","10860868482688805923","2562596954431908624","15890512213349739448"],["1163541379428592594","5288678860396655280","14181173507449024505","9146799540805100000"],["10724289839886738441","4597168876856904096","14576415022995653731","14856611787028831310"],["16837621591721028553","12689818185296250673","13216790081487543383","17921468442122900022"],["2704628002545488760","2608813131731322428","5039462867923743297","5858788900801251726"],["4005934639182589953","11643894902161301756","3103901784440455095","17474644982600968342"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["5758744515499234072","8764694601884953625","6630370567489176554","13480032358211573088"],["5519316311540193810","2236514120904440172","15294328401228377099","2650621568300648305"],["5763273818227522677","16729891986408546035","665549804855721531","7470272304683163420"],["7195351729073873464","9572526129057008488","17078697468585163239","12799839683292267216"],["1877895310601119063","13953874973577729514","2381480854181183537","1504907921260547501"],["12844754285833800479","4683165884963717855","16646742374188397997","12554758971145902896"],["5035985153745480961","14520884762589490053","6612286049884525776","7800761411102232739"],["15566119336764196706","177601260885999516","4975049337624952114","2027033486403082096"],["5310559349873243818","13385001282822253192","3195649568816585160","11587590463838131200"],["4922283227977304282","2655485988913969441","12010127224641532593","16451015819461845925"],["18407023936816332655","17965167078338431207","3200664991023716324","14823641287664047781"],["10355398883197703054","17160104412990423496","2307561707386201731","7607878679218149407"],["8863053604336634559","579619652178776971","17446608347941940366","8073861787277550450"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["301643284587097137","2696010085871949801","8291221799706210679","9158172237354666926"],["4992139404838742092","4552620131047692320","8486878773032066617","6183742282467049407"],["10660491488247393071","13517495629704704177","4046720891911797140","14494576687499144865"],["4942982158535925989","8927150395036606765","4703515517492204509","4781650957428033417"],["12147180223986841621","3934060675606527322","10756014250997952185","8652012133689053558"],["8520442508686070346","7213918312731182938","13098027847514741173","5379639104480952607"],["14490126241805253764","11021665509640331918","2906769775616266959","4751223606604945817"],["18085763280738978736","4392311882806545287","8636294459399040624","8088095399044002258"],["7146944300506259448","5145763591268654964","12934235191952286887","324861968979722796"],["2606283128222622195","16889886804924202588","4354684762327057614","16180770231765737187"],["14665636266810854580","4899725399592500056","12980488260532844975","13440588083339221850"],["10355398883197703054","17160104412990423496","2307561707386201731","7607878679218149407"],["8863053604336634559","579619652178776971","17446608347941940366","8073861787277550450"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["2046737546195790262","8952886561003030319","3027604185757735861","8688029979492721413"],["11782432086234458574","13691483773980071856","10156950263094898982","11631695569663572179"],["2703967578139515187","5999427381365626974","6913363065492326149","14056837881516241771"],["18254520174046065210","4034685228256847188","7152258020589197541","337470511783300897"],["8156245904337785705","9263540541111144014","12083941096902836625","6132131235342402278"],["5224444644557731825","5716346817521646322","10153769827971589140","17621601718852699790"],["11997001436183154917","2166434729588461324","599877852974733047","5673846395342796007"],["15488598035162103679","943452860850041028","15718645032223167992","6303291716400663551"],["9616577858201937609","4612622967118045730","17222545603824867870","15384796821449990629"],["8830362708921178628","18405984152175833275","3783248064992233342","1484889937870003677"],["16978237019241786833","13548065278940360680","2616625305033170643","7192153356943628478"],["4550662790103189061","4096701692431156065","13124020264313886867","8242820108571349738"],["15043364219794552937","1435654866664037969","4451483782092895115","9181847750303850504"],["12766322275454895454","15377757390331463471","5222840505079706386","15800064474960110597"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["11982525832434783505","11758622123947833277","4412385348322315208","7944922155927915062"],["2520768547183385392","9166984536464037992","5344459856199941547","6975242184378474308"],["7907181622229883210","16609078373773265379","4532923005616443903","2949424522545794516"],["2341099363214996913","11872810191058504400","1404005875806234552","17404844267007580732"],["17502241107653373190","11038846722888109062","10190137049186262471","2108404181453938301"],["2051255029994512572","1472235742366558105","14874221934283765202","11297873197708122373"],["5975186012518535608","11203741863036265059","11886370153479023813","7423980324044656475"],["7178166266014191429","3734384528808639962","9128233572711011756","18217880680847714626"],["14969406741083340425","17445174186523258899","8083399276499762156","13192743035474554996"],["4899687894823545210","11723715312196317662","10332834690208643263","16340336064709348473"],["12954868639373443879","202539426732279749","3099580928740372940","6753816357505153292"],["7863878989421281245","15645977488031006029","4505304880930009895","206964547314734610"],["12923869321002007703","599751446412730672","9559592510097634075","457083731176190111"],["7554612642080551068","3554192856960144539","10089467084867284868","229639879859779435"],["16481897701581108293","3970386080110011717","1003135512040852246","1380407884217094818"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["17017180271470418046","1405065929368257550","12468076524802012421","6867281552957797512"],["4412844019852114812","9229697881767676266","5767192416781036130","9141679666760985951"],["15075836696729214236","14317188506610801415","17601732106212585755","15641795472740480076"],["8217750978143074342","10265409287619265993","16358452135936199258","15209909629689378851"],["12291376012299724453","17969576749272032100","11031852345054673191","14331781639655581737"],["13213560540426584353","6422961423126424114","4906470584846325022","11922196769404199313"],["1245930068594356661","1432331346323591674","17537017601333851859","6767815427364072854"],["6354862428457842651","12103471007995909861","14030756968739487549","5853752006792889506"],["2832875421324944205","3169279860883285479","6643083717319087554","16992424971296234307"],["4661052726386918171","4278255143730221996","6321959745889546827","3741023962715204160"],["12954868639373443879","202539426732279749","3099580928740372940","6753816357505153292"],["7863878989421281245","15645977488031006029","4505304880930009895","206964547314734610"],["12923869321002007703","599751446412730672","9559592510097634075","457083731176190111"],["7554612642080551068","3554192856960144539","10089467084867284868","229639879859779435"],["16481897701581108293","3970386080110011717","1003135512040852246","1380407884217094818"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["787963127107161590","3865264282163260789","3000691594367542514","2373464248354640510"],["5520802748732628537","4018204651997057919","8648707373620011108","1179441156869517888"],["17536882775001134194","15129282285276818306","13210106736720309793","5567908901394660059"],["2365455106668480200","13855696336178389978","9360586247071708965","13753059279329224356"],["15928780985457823373","8276286078894674590","9372711996210874624","7414745894676886273"],["2529862912639774333","3637931346705436860","4324070179077434136","7835054383865372909"],["504082827284175422","6363890634203096357","14780548603681818344","5502377107337863216"],["819048100881159838","3760787507496700705","5871424226962209950","17244546730910353725"],["8317368070110666479","5397877953944658027","13892922663402696147","5637834160993525636"],["7795931466909224808","2459807303748578703","10034444318676738388","1186370243975393514"],["5776618559764040313","9927664263152416053","12519422475797919447","10502894758688004473"],["3778776735642754420","4623278507866590237","567210001706978861","7380623676490206275"],["2757566091276135083","10635836724741035170","14046761493147758692","5144701656210375702"],["12766322275454895454","15377757390331463471","5222840505079706386","15800064474960110597"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["15239822254592391509","10538877523669719535","1216614600869976265","1817594218739402999"],["7644045823081170912","11400660187598640348","1956567955303047169","789227212388754778"],["8690868682841025766","10438843317176104978","16888852727123833493","16950367754444531800"],["9046277650590448699","723993956439928921","8921640195109415672","1751129681589339982"],["1311572966270739724","4582078106572231820","1344230765540906515","577786664227127737"],["13817638029849324315","5586486013924235987","11533265770418874176","6420365815072470439"],["15151581768758023053","705979765842980347","6711937439712589523","12517213380179987323"],["11523058713437301893","11375555197301657941","8991229730833333329","16558452009918335796"],["6939835638322104775","5792118692009807118","16496023834989924084","7016400496288017200"],["8881374539654606873","7591493947680611848","8470477866246095274","16894875180117005204"],["4500731510444744402","13358480478130898628","11193565871334696245","7953282590469694459"],["9928428518117257655","5364423200550708148","2370518896857894441","609656566095272567"],["11182545737869430126","3383468827695405363","16113791336767552303","3719484439632133164"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["16765365802825950872","17969425461995765531","3704521081013616232","10856775918474133572"],["14662280887257298601","637220715315817109","17897195524114848954","1235578811881262365"],["6649204907165814495","7793921533757462784","11878306497244198770","16803599344156385707"],["9892047651674401077","4532322905022140057","16859190537086288006","13196477237191417495"],["7136919069363068160","16870260519795523358","11505450083102845902","12003720597076216501"],["16484297875749179414","8231443825572990058","2111299935459047760","1655131488965131022"],["16328511148157728215","10524619860888487350","9721338581908746466","10654993944959480804"],["7594305387405740709","12693794961625719241","481359357819855743","16568436267428397218"],["2619275402499866116","2505953152759245354","6587522711706552641","12379937858291905377"],["15268947840781369211","3613267391791460083","5769386391968604493","8415560159855892531"],["4251615306882651158","3021996717085898708","13712514202349923748","4835473771767832158"],["11164469857689145828","13201852987065174364","2813253008441186696","7560117425599287209"],["2975121947322739587","8648142752381434395","1335890365523683950","1985233234887832393"],["14479203326972975066","3788493300173444325","7288415901184590838","10917290900230604425"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["8689580300626564169","17511740054066493367","745108816190018064","16745551933059222669"],["4937674186734447731","14206080140812176568","17745881982829393770","5404161576736327368"],["15932917427888512276","9753404766006811365","9081415264964835595","9591415369302310767"],["4579554902371421535","3090328698545855309","4689648467687710809","13180863100113258403"],["2868149721202241913","9252198431217757273","2348919131649131220","2681112244807441163"],["7658193393919081084","12895290962134220057","4693087074524513296","16261797294511528554"],["12227281129341803712","14788442566744703268","1305727688889154203","904963413688089743"],["9588965715939238947","13874477155612396360","14240824862810559233","15125730064668115994"],["10236704341219271002","3163546421086455251","9868105473310126359","8519137078999358321"],["8628999274529548430","14063781607490753599","7836184285821182478","5031715959286748482"],["6266113472423837044","4867968269930819621","17455513979790230082","12227093705605696704"],["17708834438398782782","13062360938636462942","9900619140462801249","7162051415850433876"],["2079945520102284457","3939470363054430448","1207336340394784042","14257965529051316423"],["6062314145923744684","9762077193179685048","7817226733563655039","4770590603710419115"],["16481897701581108293","3970386080110011717","1003135512040852246","1380407884217094818"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["2714788015558274815","14873368612744020019","18432121780889676730","12192666018098460077"],["6960153921616919336","15293909080103696246","1571129493949314913","8036301852159840206"],["15116845847648455066","17877395784949711770","9771259868017853706","16109053680533189404"],["10747886407078749745","9704884053402413601","6024114956933608889","3767808817394455849"],["17129174587485173672","15193065538138038426","3999695538990251861","6072794777074261251"],["18383660998175442828","12145708215214901654","12468689129613327035","14307517159574538241"],["16200266429459488246","6428051427838484454","13255280846221224204","2456103697106510745"],["10090340071816695999","5311313888703429639","12430197453243589020","13284863169295859729"],["5128655486056944351","10126472999058312293","13252983877744708091","4003894442316740513"],["279420425182721527","8915549331563827398","17311465739240437313","1746059324800594123"],["2770010533652570369","5038976011576955646","3297822992979799031","14857622908778179376"],["7474708828897995396","11507159640985907758","18124455960549333273","3366727349524254489"],["15043364219794552937","1435654866664037969","4451483782092895115","9181847750303850504"],["12766322275454895454","15377757390331463471","5222840505079706386","15800064474960110597"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["14078559720623316202","17381073243470502515","10937598327237663635","335004687800969138"],["8535110093277518079","4469506806985390166","6319494564471690386","11105308974384521243"],["14742672574046260900","12263452200311703484","11615492153938726769","14668205551668883692"],["8694950075382188215","11410472579405681298","11150423904215123803","13408827625239975433"],["1687548365621552842","5246777703353374163","764627911067864083","10244031013761118470"],["7427889474839728849","16670908087312173650","3325045181598857428","6641197706555331596"],["1675500123691962855","16142117251307148026","16107952373662992041","5290764778322270736"],["2620295712556946054","2416310613897278696","3486025060675490476","3686390425380776913"],["9899029780794594538","16565761791510960449","1086959995330638506","5854419300513804214"],["1592963719531915285","6635585947436716125","7416291275397596369","2626170596391882097"],["12324781555840096455","15914751081919476830","15253067243585920147","6859386006313420740"],["3208888866947055474","13561280371298186267","6533790832722716347","16962032619110009452"],["8106330301591400410","135276838751032051","8784008938755823365","8862451297665185347"],["10329434112406601809","4698161112584361734","16649154814466953797","9391812266335730138"],["14405990439363401106","4055583168739259932","18367325195844121436","17487254987012662913"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["16277234053410765784","3861087485960670686","11901113083398125821","7637122516436285279"],["17119063255232643816","11528211422138895836","7237450185536649173","327586360851019818"],["7657601901264713123","1881433816373316636","782041244299283812","17160569926573391903"],["17138852728532211424","17211098352573359104","2248039612577917929","16669639289921252252"],["16788001352798259254","6558132814085788161","13161272369644075418","8822218411589149911"],["3351788295658532274","7621584172032108534","8324201133002413068","16685076284222032588"],["4914105567003702104","11353700822562819176","7084402969137342906","3075665509207210809"],["12312876889553655586","3149842194210006996","17967205981237649697","13508722999441979599"],["11117953450382274558","15493731779642337333","10025585223899343593","6001425648105606291"],["6737846579766246782","14272818025982496028","9704058013347997703","4351536143518634558"],["17102284077947646294","7019259028311321309","5912843667274264637","1175884626925525536"],["8907154361044387243","12096025809418498255","16644436554318141859","11405990514536316734"],["8863053604336634559","579619652178776971","17446608347941940366","8073861787277550450"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["9641223484847076130","12629637516218315783","14217947654455571314","15733521643470858015"],["3689046398459524919","1159499803533899862","5486923658984610677","4323836165141290626"],["16563553733287935942","7287284565962472029","15907808458242114871","3771594526760668591"],["12679250656128514401","8088981281222391724","13620674659491648179","9587403569164221490"],["980169825136966255","13739548243982005373","885923840430391800","17950088217402624849"],["13621714014940718368","1755232359322479515","7743400358115747259","3457160240262605783"],["1037339724468187589","2332436315803176190","7385186781067701516","11412131540007559250"],["16093422834733604541","10063120368096669347","16491637651279133719","16610184676564443801"],["15941289191419393015","12545914890761158872","17867757985262772657","9690188603323695066"],["16057417601293107141","8321885273898702273","15922290158339437762","16455161488662599974"],["14665636266810854580","4899725399592500056","12980488260532844975","13440588083339221850"],["10355398883197703054","17160104412990423496","2307561707386201731","7607878679218149407"],["8863053604336634559","579619652178776971","17446608347941940366","8073861787277550450"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["14093780241162759938","14208528867628967467","13511034554949411624","10541679101447151571"],["857528997172427378","13369976266828648760","17648054169639270756","9774685075642394122"],["16684232159922253136","10363957730906485144","16139698957723114770","10737203517302171867"],["2915039406638681992","9137076195957399217","16812234310947297535","6410571104893325929"],["12927759825083479968","12969039082772482735","13468182272754408603","18117390094854345986"],["17948716538537019812","12479927019149285330","7890214749273127862","12322550885565391076"],["16232618878314260142","4075474859700760498","14384303106470025154","10231538774972575808"],["12278186938147989155","9353944611935171431","4049993635799059513","9710195479008928391"],["14971385546233326921","8978406584337377137","5120381434473840149","14359665782164512549"],["7458961098306153481","1619195207271133852","958103364265541488","12986774722277146808"],["17102284077947646294","7019259028311321309","5912843667274264637","1175884626925525536"],["8907154361044387243","12096025809418498255","16644436554318141859","11405990514536316734"],["8863053604336634559","579619652178776971","17446608347941940366","8073861787277550450"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["17660501464707671863","6759591488083092574","5469826078083019541","2877668825707237232"],["5397014014531353724","3729116565279478927","4963301714084130027","17350832961538128637"],["9510960381846680448","2128106380557663833","11528943657062425719","15640936513137827291"],["9566557541810288078","11435442218311622865","12555689274221940918","9917714644164353821"],["18005618616845471684","17687396417481427481","1719367267345279177","10750321771781863003"],["6149332230976829912","3149208663718210780","2581638435095954277","13003691178822898204"],["9070045050071981074","14407054615871753358","15761379539651615372","1557018737498208876"],["15121565104897971684","4281772077192419107","17104587982264438968","7177017800431216698"],["16246465808440946106","1296183558071803372","2915538936723246382","11699711645057331541"],["6545530897021316932","15992482734500956272","16011002304262490341","15305581243704633324"],["11597949054169650396","40744340639087517","15174013566595414203","8306093420077869464"],["16246490725395887610","7882055263099692426","1323866075931861068","10185493151823136616"],["4715293862472490421","11702473210298099113","1225066094843924421","9589978309340247335"],["18309918201377070490","6177022856990605003","10426871426652721584","9256748028792236844"],["14405990439363401106","4055583168739259932","18367325195844121436","17487254987012662913"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["15292151849577584372","16978430596807194082","12529576043143023721","2401107089898504622"],["9920958523150604262","15767279797484213827","11511782947343178100","17481925418296062491"],["18190680211564816477","6859226045004138219","10272513655259795225","9921010003978116345"],["12120485329897738149","17441991999161434470","5937005194583242513","6791184944839685445"],["11860679253985346246","10245358094388119528","12469521558787031658","2574345950223032930"],["9051142432123826550","4872320901653123355","18303964020054350644","7990285023797745094"],["16436535085353644336","15489532532488593166","3281631611518243904","17940111616539967844"],["9842106066894349339","5223019066377189450","592945405872168899","9248377576469767900"],["12032873647063451983","506502901455731999","585656733703195357","2023575647996543510"],["7383084390640512923","14349314394875926806","13070311827550902032","17723398369007481265"],["18157668259065946906","17068869192432088158","11066267062497773838","1899365237759960933"],["15265997879750765870","8347215233501463825","14839286613054745941","2172488121660870184"],["13792528043287349750","8572833987245508304","13166150140636928878","15196972103847227485"],["14479203326972975066","3788493300173444325","7288415901184590838","10917290900230604425"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["6764571158921269364","15963421781543775087","10524050732915028408","10604114135802819827"],["10930706501472278790","10952810808062007389","3009758345011688148","225181955830514738"],["14206150405736656148","14588088247977300984","15137433574436692806","4240825400080924703"],["7232624478732167920","16781122451034026769","6668180297077450688","15640061537286512918"],["7822796738942914215","16053860396616311959","1735965966321715630","5337945070110520253"],["15615695020569646228","13298981666943351978","14847492333337183564","12788051412292399502"],["9539443614221602000","5542222707853956894","12588527830170783878","7744227992175490247"],["6979076920117289592","5202656067872427570","1395207272941623375","8408881842205449738"],["3712034710339245246","9165313714892500027","16884836180058107155","14642137031015903431"],["15659867918904771821","3434195511949027435","10121675703632391260","16526714983637822009"],["12104535813090823338","13556413723556720884","17487528953605293654","8177220995582274187"],["3164758738890066965","12296937922194677083","17259209614288829128","7944663034614042658"],["17735523902934941976","9813141025535100200","10168366844969725455","303399352280507257"],["18309918201377070490","6177022856990605003","10426871426652721584","9256748028792236844"],["14405990439363401106","4055583168739259932","18367325195844121436","17487254987012662913"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["3147762767417905418","2852855437868025683","2030888475616144922","6803793780915905410"],["10908811265279133554","17177205436488156008","8273769295968940527","18074161998022732422"],["3478283454797457398","14751644305599182680","17781410892764675962","2991534280567495348"],["12965231378362954195","10603067047587717630","4637998454157782035","10972743098964043705"],["7056604317227965077","3894761793272490974","3826763851693386756","13325593332022687153"],["337048527086849394","15250782082197597774","10644077721594967128","9730703757723318363"],["705671008320430486","9915802077540010545","536319146432130187","4563832666594759370"],["122512631302654411","10945731787027636585","11300901927474809417","1302411741888248067"],["12603183619846984807","17280164738738688136","14477029780104095473","9080766442868155518"],["6509259838537255179","10010855662325751739","7862867081479138267","5612270035418721921"],["3745967042204563214","12321839112439850450","4715055861613049312","5446597319193405973"],["8144752203746323213","3437917849061577541","10271481071160894019","7222367148521074981"],["17735523902934941976","9813141025535100200","10168366844969725455","303399352280507257"],["18309918201377070490","6177022856990605003","10426871426652721584","9256748028792236844"],["14405990439363401106","4055583168739259932","18367325195844121436","17487254987012662913"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["5011253143132121606","4482360117225306221","988593267481276823","9171457658840097093"],["13845203276986806848","16738988755563825098","8726455795220732065","9752684265526187723"],["10442887694749826595","11243812676983097445","11392519225804952018","17063696782562280472"],["7125556993425502653","7902407855728586919","15903326560797089883","14904290747682246354"],["13745944679267367871","9173149017684781114","9870727124116933299","951076960292526401"],["13449435267899867506","5341900456108070815","15478292791534955221","16083519694834806144"],["7923975107148934068","9155503318267964402","13921226808354067345","11343973451458243409"],["11813009026846217724","6304210226741113161","1401941056054163463","15630284236931498273"],["9732202974965304781","11063311375972634683","16399516197683180087","2395386808417920219"],["15691880991737623471","2767281083350267208","4113655217685442748","8806053252835223575"],["3955585951501316402","3278251314819979662","8357194329833448289","1382721414390952634"],["17473341785540739123","2338266077804375673","2344152537260081939","7798170910187299559"],["12923869321002007703","599751446412730672","9559592510097634075","457083731176190111"],["7554612642080551068","3554192856960144539","10089467084867284868","229639879859779435"],["16481897701581108293","3970386080110011717","1003135512040852246","1380407884217094818"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["13403579733829278952","2329792478437481739","6409688842668082327","12257680098411647560"],["5101684601992862061","3315940017685814008","11398764062472639004","6492312763371111558"],["2928822582939373623","4462840007127822418","15649768219889546678","11771592267182800205"],["216673273548550922","1531456790556372403","177335024594456947","762924361020264320"],["8156245904337785705","9263540541111144014","12083941096902836625","6132131235342402278"],["5224444644557731825","5716346817521646322","10153769827971589140","17621601718852699790"],["11997001436183154917","2166434729588461324","599877852974733047","5673846395342796007"],["15488598035162103679","943452860850041028","15718645032223167992","6303291716400663551"],["9616577858201937609","4612622967118045730","17222545603824867870","15384796821449990629"],["8830362708921178628","18405984152175833275","3783248064992233342","1484889937870003677"],["16978237019241786833","13548065278940360680","2616625305033170643","7192153356943628478"],["4550662790103189061","4096701692431156065","13124020264313886867","8242820108571349738"],["15043364219794552937","1435654866664037969","4451483782092895115","9181847750303850504"],["12766322275454895454","15377757390331463471","5222840505079706386","15800064474960110597"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["18331472542132402941","15646207034262575423","997537527608772372","6056449957381218893"],["17589286569518367198","4955202168608134887","11837643293278008978","13685716222645835888"],["15004535882421514164","7764556613023245589","6718164115719561553","15102765469529475292"],["8737297976059568291","4547484495316409342","11940695826781127811","5485262755789256450"],["3867358527465953990","18177036767475321050","14023130873759092466","10988658984032356934"],["16512057349902193256","10632968464104417094","8070519534083343851","1181804606983594975"],["8465054139713781307","15415056535922470847","10273403430058897460","14175520919510491673"],["13348334668667701130","6881500552044462867","1946538771206588779","331268380078643688"],["2538082538067456586","1230821714547840264","12066305989545695733","13562389062013640818"],["8939514407593903307","17556381087627563312","10933422131910233585","9145040632951827039"],["15509494131226539616","7689906771623781804","9604450406453648482","17854584060292553224"],["7736688721135312501","16394186740749102688","5967365230775551263","12430920296910065439"],["13792528043287349750","8572833987245508304","13166150140636928878","15196972103847227485"],["14479203326972975066","3788493300173444325","7288415901184590838","10917290900230604425"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["2846841340724228554","17682056660330906811","12802182240556926720","7072335637727608706"],["10454818938010304857","2504040415045142905","7784085918023924839","8443213542634851242"],["12577462564874737504","16294666467525553529","2690565278195270298","8709294386347138085"],["11348842301815931863","10138398776989078206","6784779982445550506","2404786120937472885"],["2621252601853542470","17310364885390545483","7029809236107262530","3827184902707225909"],["4546874699205396504","12560161176752814434","17153411552419127127","13721429050100168739"],["17822284651536199448","922849517545439820","6512814382991620112","15921920700912166194"],["2123006498125982394","14569054244208241713","14954115803031748740","4984986659434323436"],["16614446084397504400","13274279981515464589","14912821832824392184","4710018576290441429"],["2616325398730491263","2324564244783053579","6532289648484522008","14727119172786164092"],["11786347279364008300","15750489529751234564","17438043512546424618","2768976650827132935"],["9810950773023991415","16469357822625439026","1138298526095414552","3508939684150461046"],["2704628002545488760","2608813131731322428","5039462867923743297","5858788900801251726"],["4005934639182589953","11643894902161301756","3103901784440455095","17474644982600968342"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["5911464908313195173","11323349171150621266","13206219640597696639","3770983793019241558"],["17952178893701588966","3228602182831794182","18188248625353816988","7195357011207940432"],["6620118972467847190","6737271096830068350","2850123263064280119","16526138437783406903"],["393705762166775021","1731454368608608155","454372331822009650","18248131684274898259"],["3776382955682219516","18123686450011957293","9467320981088965511","5045981330683344256"],["13901248843655837263","5561898190622472480","7157265720894849039","15847833504139229251"],["8850239415876488555","14611685043797919474","5400198194370093199","3901117259233336794"],["5934116183430222766","4122932990202511118","1419329023439481059","9672953069268928279"],["7146944300506259448","5145763591268654964","12934235191952286887","324861968979722796"],["2606283128222622195","16889886804924202588","4354684762327057614","16180770231765737187"],["14665636266810854580","4899725399592500056","12980488260532844975","13440588083339221850"],["10355398883197703054","17160104412990423496","2307561707386201731","7607878679218149407"],["8863053604336634559","579619652178776971","17446608347941940366","8073861787277550450"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["5244111796271380158","2973752470170489697","4625876320308300679","11899753724218543923"],["1498250348787441231","10106174432577827562","17573122073284879227","17449094024807543385"],["15161581471042864250","317836318211116008","10701264934076987962","13185551584143736887"],["2161464027431151710","12238176585573388061","11226334046926864018","18182022355889368139"],["1604907517133949811","18359480153075746748","12517259081753572306","10361320042445069243"],["11727792939082963611","14956158895130479103","16015346970012598495","15903954060598370250"],["1037339724468187589","2332436315803176190","7385186781067701516","11412131540007559250"],["16093422834733604541","10063120368096669347","16491637651279133719","16610184676564443801"],["15941289191419393015","12545914890761158872","17867757985262772657","9690188603323695066"],["16057417601293107141","8321885273898702273","15922290158339437762","16455161488662599974"],["14665636266810854580","4899725399592500056","12980488260532844975","13440588083339221850"],["10355398883197703054","17160104412990423496","2307561707386201731","7607878679218149407"],["8863053604336634559","579619652178776971","17446608347941940366","8073861787277550450"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["17045988583112758972","12139118244137836584","14830235362781586382","16038879585813594111"],["8027877223415555874","477147544030103124","11186016761318740221","13537789884246165103"],["680806902182253517","7182067648485180063","16638694455715609245","10404933359979448687"],["2489641368048377364","1265323135683107976","17237653620156753194","1671945418923695650"],["12917252030710025018","16304371782279638785","8654132298984997145","265343894571275346"],["16609150827372590616","10793585240484271450","9588020955217471009","14833302090312550624"],["8067753120581967105","6404326954123839172","4740309358306106345","9707730306378399416"],["16759130701890038322","10452312171417284257","9893350215905418048","3046347722392619949"],["12896861495327761197","17782942994203106654","4493728920533190664","2820425398705852394"],["6451050229059043568","7725017604823992796","5481930659392306888","4059492104361144121"],["1552719366172220151","6602927909487338273","319694199282089015","13013100499939743820"],["2859092471705225009","16465799749550519208","10879335809776907478","13089741454520341436"],["2975121947322739587","8648142752381434395","1335890365523683950","1985233234887832393"],["14479203326972975066","3788493300173444325","7288415901184590838","10917290900230604425"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["1891713757963538603","3149706270213527526","10725510245306708542","16835257287927664520"],["9310197031113241998","3186783268085883179","6631514298708738728","4405775327450148054"],["130852363848133946","3300005866579188127","7823380355356578827","7451926448617017410"],["14615386044966641640","15234872510905810624","7692993967360199291","16407247290859957903"],["10327589966668708694","12121629121806560668","3583066742958333148","2197859912267723856"],["13517885918579025720","7175877671345879174","12494335245867429154","13020344046129158446"],["3459888347413271231","11495697955355311813","18370544991055753692","173935117801743696"],["9893510105740015045","2956141463148661127","13739013961706460889","9057440796129747018"],["8362453988140620878","72614488446507660","8339529908756711778","1079985957779062777"],["17749399102090813726","17881208072869551751","13459435716673914381","5901456669447211716"],["13502199554558810405","16121987072723100798","17247526870704571010","4876045349504921274"],["7863878989421281245","15645977488031006029","4505304880930009895","206964547314734610"],["12923869321002007703","599751446412730672","9559592510097634075","457083731176190111"],["7554612642080551068","3554192856960144539","10089467084867284868","229639879859779435"],["16481897701581108293","3970386080110011717","1003135512040852246","1380407884217094818"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["1374473394551288762","11056896707420386728","2624076381648450363","296235066358644714"],["2703295272730475674","2092468168042933071","1012717017655748843","9630970353443136730"],["10119695229534388832","12727279194725286570","16466925425299029057","15535581261660952477"],["474801792092147904","9125428466607519486","8292711933019179189","14772148639450599437"],["15603746562041922039","11979061073867800507","13480043373113677422","2831943872664012797"],["6947555334799463777","1036989018059551783","12087007082892238041","3144535639928373597"],["9737459680987965189","18322327386829245591","2575941466288224989","17727876116925578705"],["12062167764171948998","11196754641383777085","9569398253171466918","3680303895392683570"],["4360568386795945803","8441457709771855164","4171570088806310402","15761611597581673707"],["5137536950913941338","14090858505418438045","12412174148671702783","4450669140790892749"],["2118983668726399781","10862377074850458207","5691295483753344911","6057167898697315158"],["3208888866947055474","13561280371298186267","6533790832722716347","16962032619110009452"],["8106330301591400410","135276838751032051","8784008938755823365","8862451297665185347"],["10329434112406601809","4698161112584361734","16649154814466953797","9391812266335730138"],["14405990439363401106","4055583168739259932","18367325195844121436","17487254987012662913"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["10668385343215185887","15966388647131143440","8816855787433466068","8580141486099487150"],["9828364768568438024","16927135512802644140","15810753213730127316","3971064232091455710"],["8992899812427273039","7143194137347349049","2713413607639842222","10918695018621489884"],["2998931357277548179","10533809519176930764","11799741557549374745","11679141598373752062"],["14724806625357798332","11603178865712240057","14794427842614458881","3127107167333028513"],["2619671887467783543","4102715393449498720","16442817002063644552","8741932179595425529"],["661758812463347291","17812993321303500637","8967490876391845255","7461074769330481516"],["4890461879719430925","5936860198855688241","16259360613752372492","10307253375270221997"],["7174545206095616335","16849346371133130736","9421814611576723706","17197349732901647222"],["12629147556992043247","1776129660346706304","14332053951064546747","10624869723418243928"],["13036179348272366129","11826256273879046544","17945120818780102556","9885361131674539586"],["8144752203746323213","3437917849061577541","10271481071160894019","7222367148521074981"],["17735523902934941976","9813141025535100200","10168366844969725455","303399352280507257"],["18309918201377070490","6177022856990605003","10426871426652721584","9256748028792236844"],["14405990439363401106","4055583168739259932","18367325195844121436","17487254987012662913"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["3874028786241018378","7107473892978915733","15063281063870500834","16177088466400664839"],["3881444118912399981","8361469380559524491","9341553877930727278","17626049723386819358"],["3358678903740929200","12943343084585429739","5979881032365885154","10090627995116484280"],["14678390366069382021","7999683740685853879","6841567590669902043","1616462274644699005"],["16674264946789004820","15308656687915579904","1458685953212705475","12358503743651316549"],["17729076410248338921","13413916194502930870","15867938584408392853","13306953109161696643"],["2096911486045490152","14028245844479288439","11681656968752204162","5519310661505484895"],["8218855817042351934","12327169540270850003","18120986725974919753","4712056823735039857"],["9732202974965304781","11063311375972634683","16399516197683180087","2395386808417920219"],["15691880991737623471","2767281083350267208","4113655217685442748","8806053252835223575"],["3955585951501316402","3278251314819979662","8357194329833448289","1382721414390952634"],["17473341785540739123","2338266077804375673","2344152537260081939","7798170910187299559"],["12923869321002007703","599751446412730672","9559592510097634075","457083731176190111"],["7554612642080551068","3554192856960144539","10089467084867284868","229639879859779435"],["16481897701581108293","3970386080110011717","1003135512040852246","1380407884217094818"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["9417971915563946281","7611361816000266697","11482716740591856251","11878727216907223569"],["13879682695271074706","13584517394497515259","18188587169226684129","862480262041901664"],["8533238215180065222","11579485607967051511","16022145067081792198","8873765435339490706"],["15068958110931598153","5515715531976795074","16248856975077684556","1361618193759822643"],["3718715411231596344","17203239954686088587","17257755980422911144","11578829171617067209"],["7070813108834783467","770270754558870224","6653705895292791290","14624344500027276231"],["1167325216341213432","17659336807251842541","3260805856017664841","3019580389075075825"],["14910283606362425225","6626905262351815029","16104221504167218107","5905232662127074567"],["17155809448191579400","8539868733863291773","11474987022183616395","6121047907415531699"],["9344302752116148939","4872039917658521106","515196654349073570","542369677360794454"],["1130727927078909378","15569852380964751896","767298824911396237","13222874564021585163"],["16303152390449714952","14787556709257607958","2692306719068498537","13092435718518280416"],["11182545737869430126","3383468827695405363","16113791336767552303","3719484439632133164"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["1956838220525208899","104296647906920402","2501361977882210903","6151894536567541591"],["1703027407084200554","9641084006561183845","5495051002292947552","578924707520907731"],["17606403843988991598","15643731499693335018","4139580092193199945","6515150008664248770"],["4171432093151382478","3865790217793370717","9266113664105609127","18189894399462105110"],["15224284844674837163","18059026315616367003","12908876124810675317","5362636794544056504"],["16480425199053609920","8918701886516244946","7378464161107944236","16252734756180977744"],["2226124105230590102","16184497930317724491","16463154314783610243","8451056895858445326"],["11529537535487560421","9541825427334638747","15240430699380277452","8529502495526646066"],["3809516280826985490","14738157994228428180","1112580779132350688","9411328582727672782"],["14550876037574217784","10429594115666663298","16199902577425718713","5410860935587819552"],["12920859493509511909","16383253007693329736","12607083275649365543","1098315747586759881"],["17473341785540739123","2338266077804375673","2344152537260081939","7798170910187299559"],["12923869321002007703","599751446412730672","9559592510097634075","457083731176190111"],["7554612642080551068","3554192856960144539","10089467084867284868","229639879859779435"],["16481897701581108293","3970386080110011717","1003135512040852246","1380407884217094818"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["4922261854332255152","13983697708006707645","9605467825371837367","8895094738118481470"],["2016191987992377793","5304105405753745202","16094372698954261765","3674062009710542363"],["8551442342126584350","18221738823473804041","472821787530179624","15495432746684874223"],["7330714889748605645","9761124103263113740","1822131372940106328","11633205735363353312"],["16894742797949076524","5030231738879511263","13274771728371460805","9392488470938957930"],["1879576669319452195","11820106249878069130","615949249569667718","4683104220505396010"],["569199227055367162","2323711627761948928","18273562631575187952","18122693564414605676"],["3342522776232504229","10218107384919452617","10482318708735252653","2444048221960375744"],["3517713101384295827","5003363582205502224","14649235733468138153","3535336573638603529"],["13516902714064864694","12713440609606297846","10369298769513178626","15617175931176742474"],["1552719366172220151","6602927909487338273","319694199282089015","13013100499939743820"],["2859092471705225009","16465799749550519208","10879335809776907478","13089741454520341436"],["2975121947322739587","8648142752381434395","1335890365523683950","1985233234887832393"],["14479203326972975066","3788493300173444325","7288415901184590838","10917290900230604425"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["14960284814597683547","5411927832272394584","14730969002562922268","5868229093275891843"],["7904227767230827776","1349668113839589494","11898724084157635427","14340597167609715579"],["1924369373727989040","5739617379200441612","5789780775137202421","11806060141887663360"],["9567610884651459671","9852186200211449971","8123816237434699089","7286397023684788501"],["10032446066595906451","10089937130573481803","3744540119208679902","6949647021759236859"],["4004665915303531101","1378396886397573765","3981749833053561470","9564072876207767770"],["647303993748253140","8181964598492227279","12632919318197762454","13160156188277535695"],["16438621452228825043","6293151783267387394","1992770675632705126","7006933737053353858"],["4203091086126940633","14992494698238510412","11456408238778470868","15215113123973443641"],["10483888289902155364","17774012431066870967","13489348453635682361","9781494202019887372"],["5315604818257426551","17190138277752403147","13505480836360500346","14801502399631625762"],["6791441794994724915","11767631964771345875","14424404290863812364","2774423653113969681"],["8106330301591400410","135276838751032051","8784008938755823365","8862451297665185347"],["10329434112406601809","4698161112584361734","16649154814466953797","9391812266335730138"],["14405990439363401106","4055583168739259932","18367325195844121436","17487254987012662913"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["2585726741595331427","17883014762303060347","14581741811166804070","13730823498334578611"],["16101074640758572566","10151118492106370227","12413320128347427536","13970169002605680190"],["6153616817716060628","11015899014407104848","11197606422350452983","1683145294079299058"],["9646893924674009715","4687185685951340673","1066873990432205472","4033545940430925825"],["762262818881218098","3049985198624211683","3410937388597947080","13978367680507206035"],["5771107324356437744","16166485107186028531","8095692164867779663","11427274995978949871"],["13651482023630130039","12293331666426059630","17006988505103912535","4773257233288632680"],["7664934546409811514","18057390476621771751","17179813501898981143","8943938304528128130"],["18270626380375019786","15324184213858998963","5450064951282144624","14126536644311753557"],["16101340450271297054","7755175057370952289","18012237397884390864","8937187387251404604"],["4214960334008026667","3032890028661779499","8423166281006076719","14376559360257130759"],["7474708828897995396","11507159640985907758","18124455960549333273","3366727349524254489"],["15043364219794552937","1435654866664037969","4451483782092895115","9181847750303850504"],["12766322275454895454","15377757390331463471","5222840505079706386","15800064474960110597"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["15117464201247599296","14814197649760838653","2018706794313849686","10357840868490018461"],["15589366482486772728","17261785593216494996","10594469291768669841","4707600977073019179"],["7169624827386322603","5438973164519157086","9815198848111780053","15398374955730475308"],["1152196371695466512","5520737146831115267","10943494760348382202","7170547794220067603"],["618750756849154430","13723057066536719536","3612544442056965477","8809324883950504203"],["17725155768932681523","14658386044221943673","12313073559594119098","14984115283644487882"],["9620939839141452258","6049702745381283229","9846247378522926847","6936598997811427268"],["15872209753276081189","17967367722238889658","6019928799078737580","5767640225189571604"],["9139758105020970008","1941592701471654604","16799463279607937991","2511977006363185323"],["7699890143489656060","15644972965147515161","14183066301971569588","12298674478801746683"],["7976949325477943332","12702849408907099530","6426039997988194443","17070111462199267752"],["8907154361044387243","12096025809418498255","16644436554318141859","11405990514536316734"],["8863053604336634559","579619652178776971","17446608347941940366","8073861787277550450"],["8719860237688864115","5897016752274265744","8910027603219962413","14990351134432608567"],["8482090797793531797","13438703839666276775","10760926017412919407","10413074156632741656"],["2229155045715998977","4589838919151130591","1574378951274824183","1870819037171299202"]],[["7377074702122191758","6737976240025948446","5512568670351499476","15749650027544038830"],["6926876687177707683","6142185635170251685","17747475382554798093","17684615392039499111"],["18187148288446420452","11520154828537442702","370770909946354838","13739030562934685638"],["5070383436795260628","3607542628457238857","1986373196881540726","4566762293313579511"],["11880104901718403145","16272652196773851327","10080402400674169815","13770683264872247216"],["569901793616221184","4373445723731343380","2479006931806528331","16727657933477626287"],["12484387771563648355","18128290563391998858","614618406904705375","4870953126080549800"],["18004469346914481439","10527261658448862045","4672489132609338966","6444687469776377258"],["11622051182353473332","7484796142409858732","2161928645535468384","9410926129567680434"],["6650289263531127888","5967127292659601792","14132065158702987425","2600216904104153543"],["475052206386767920","15594303072651915488","13704740111712492951","13734946171712262373"],["18262805140406140579","1858262641986149606","12067691194326309802","11620534832803706322"],["1001410534418569829","1440231005790684152","12516155068761946130","2775951946059601317"],["4005934639182589953","11643894902161301756","3103901784440455095","17474644982600968342"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]],[["2538290952456632905","8636676880400297919","14319385452325393410","6036650812183626084"],["15976389415831000775","678927792316532312","17434887893437670728","6816619876488836029"],["16319383523105842275","56791314154488119","14802956780727168086","608633838725155740"],["10566494323904776853","2167016174338055773","11926308443036157846","13394641768833376324"],["2918291433571276111","3484868952169359266","1143231840787122880","6793365297104406565"],["6616622885274791175","8064909000401133672","1935880983407974214","15727136430390310230"],["7046589808786026605","18045269236884902860","15605720890406576533","11023851173517804070"],["11385174508567966853","1763364523209264734","5540025003672484853","10989623229018737681"],["9338093315251631579","8474413073918601860","6618930616181644265","14831486503189919653"],["14538277909191424901","15037728197340418155","14070810024527601817","9101440722350138208"],["13710084109666558652","13523824090604452404","4831721263778250395","5174533286219641870"],["18262805140406140579","1858262641986149606","12067691194326309802","11620534832803706322"],["1001410534418569829","1440231005790684152","12516155068761946130","2775951946059601317"],["4005934639182589953","11643894902161301756","3103901784440455095","17474644982600968342"],["496212700760529936","14435006860486389554","12732537945117330400","16536850557659145560"],["9890840801068190080","7223147717681357078","9232376918539752592","885773398307318155"]]],"s2_root":["15430298763228326296","7848726413225638144","2789755375679844366","10026130172511339110"],"s2_vals":[["14675595166526901526","15760451886430544667","3751520057082109387","16317146463552796346","12100121266169624958","16561800002446945478","5167364739136984251","15124971833073744777","4421870787195445327","11703562639620988037","14540190658064618901","2536457757677917981","4657991637024612700","15367898761752110927","13077390274545861086","2754075408011163093","16731296754773698935","5217585049588842824","5866512639585365800","1099741366738710887","12686288343179096272","8308679944212468024","893104650017535770","17288458120192060516","8789030051608804130","6996119355141598853","8428418857557221634","12693858309246265471","10694509455006191829","16092424742210540411","11692709677260043604","11377455644216100894","1251855158341857880","14670035746279465676","15489778909360942262","11620506256826174149","4082788197868768505","14292231985103106476","2570175680691156821","1066779067397940361","422933028449801213","12922839846989220535","5571271524308582661","5402013121085503072","4350092625494337300","11909948641837264555","6597792003834205139","9634694903295772640"],["11132333238056587201","9473173789800732028","4979094616729665499","16341379710617094160","5027909017596668927","17150729086971599427","5591090437487913764","13596379526447360197","13377343803894124378","17569392160464325896","18186460565287171127","11952829988656139061","16106395245503357586","14272593638938976167","12525282868683014720","3130936178091756527","14436187227280130868","804152155161249378","582937302760706596","5334394112520841280","11762181617257131277","18394607557683723639","11923222158318287613","14740937217175916511","6739641080834961349","1378483410398219993","10631287626908859426","3119860704765304197","1403611299047453395","4278836890388535174","2552891621437153125","2276809208133567007","3562107160775949670","15640930121468543905","8172182691689603530","16526127749091159598","12586983047857875428","11110089227013672504","5127467079344595248","11808566968241424518","4004176300112459104","11262564193505309430","6481703502122660821","776152072102787841","5386916079100736559","2606350218446193092","7559259073900256029","10578987326945401360"],["6562473718288181816","3290556783286418473","9243904790558806583","15836520109717194358","934352532397523137","13252554684802459011","17834398301183524158","11107507798842780209","3911813033334108390","2481114681825093441","3177469742329807279","8948354876533556596","3390543595321030510","12634933335307563615","1470521005867618939","7238458125444445549","11921850358155514594","2131977976671808299","4307019216325236158","10548006624905996568","13397837661780194367","2025764015270668278","13593496151863340779","14499032632942253670","7190490261445386308","11988930895211129668","17584138261070344542","2697911556003162422","10013824848671534487","10008466498620319792","13466154724760699821","18025876162726756597","481255021965112159","12881884614408531958","17654058347534363871","721090868290760084","2222576652137202734","3543713764462041697","2411183195887735075","1142884099999418698","13994566102105517759","15397429916210059714","17184519180497707614","1408142066253075051","16787246092835969877","13565708567642155252","609547903678297004","208306969231248606"],["7493387807989397568","2375893801257242806","7133670081704018282","11508588801293348769","11947505979558798365","18006044512775368497","5714983720170997072","1869048047765692004","10798722487665534462","15322739971613800131","1862695590285553772","14490234445702018376","16884575982794868371","6856570070326986293","2927103411904652368","16286532767090007353","4507438476711906571","14031174397469341893","3898188011972520760","1641069428735124692","15962776553855831521","7389836941426617244","3485296932497698120","17679425763806462246","9513176107685689076","7210963738092049834","7741675030295887647","14600680212565732645","14071654802151594297","17721754409255662752","16875449122148268276","555714993855762003","12099127668105085699","2670724290478386842","4445485517575709124","5605608165361032460","8267075796031464252","4683159506090827635","17676051719371711906","12247051131948092547","1148791148251584494","16205612557883279229","1556791826669486119","2094312596802802395","1352073457123834954","13168497129916021303","12690136226563350631","5423053507189446069"],["17446035998519908035","17198752274385386983","10375339604235122605","4920891993654123710","15230852070430312635","7059554886136269056","1073478615662282005","9468444789389273656","17768325545865320341","7891198264743172349","14204284215777415728","11863820285789892092","6056980446282665706","1205700038338090755","14832526633535580282","15555227898813513063","13603371985486824447","500832936810402538","4314015867694559944","2297690067789246773","936844643048800553","5389088636004723296","15970582137517036981","14782161230237561635","11372585367729856976","17280339776835035230","18195062393209901668","1162355147110703409","1609688952699308183","18092961927689235565","7472630161936472129","3052947703909701810","4455081901756784829","14393411038050191806","5239898683740587150","622440018398589581","14690849484447014719","2928830174117821535","17742952626104400261","6187816290946245856","6443610158947251552","17258129441060120564","14367003051035535084","685097943615373302","3221605886776288226","13476117035255191746","757948029576271294","8585078182302360244"],["13895799916286275259","4142477181061250297","7307824559527713459","15327987745472588861","7209762792322112860","182328845740598239","2461243790687827429","2974443001798892898","14526291723939689446","10247606181048426351","8789355901301978348","850482019179901746","7316785346157564987","13727146879635914095","18100490460457025918","1709993157126086998","3483663285213161289","11022721685040256817","12653223509282959192","8852393461858050912","7644343971359969802","3099889605566258124","13870208794604763721","13204349363946649853","953648414995385396","8829262477550925096","4210962696896612306","13881170463833589298","9682938451975770500","15330907851020260156","5132740605782006168","6361118069816346567","11873150448937024217","7887264693697811312","14382792430143917740","6703283700984653841","13179050881740887191","11267055673173618093","6727597419793731102","7899436114049782265","2119046976487484482","8965194214111835300","16646446419359011550","15024961006658777356","6851639270152317277","15381286116760912293","8510774029812652706","3088876867629056018"],["13860570059115220520","3055448103554727964","13318787598091059719","8393573850108695294","5328364775124582081","6809463862365957240","12145006148372845077","3155567503292896667","6903442982164203580","14964818129789545796","10312505871811788447","10106976628788715403","12329160530452728193","10221751118809799352","13024271913693081070","3895261057890493141","693116042254533393","3247414250939950878","2401146224832013627","9765045105748672340","10164596362817361430","11579791941819991070","737020204041964928","15041326400652257403","18118692680959037609","17030903685323319536","8491213905266481260","16259674117795351534","2926678341584113405","17455040966551536340","13705929543775753863","11192210127897976517","18354063886222362228","15745594497410924176","4899852100871801891","18031923321582192354","2878105655030571056","7520612533556719524","935447856206416805","10149926780643974387","14976576369331797211","12688851571157108008","13634845443408635734","12545023426007061511","1461736429718377525","11746905616965508749","9430403668921716356","12205427739590263056"],["12460110797089589531","1516651733204117367","588276348164810178","790266604241790226","10080176793876774707","1639421358079824931","12633246123037544215","5914650480051500081","8675473829420206211","6267735728240771364","13734110537650221162","15577240637678371983","665269310264754011","16656950613612128826","2231156364689861401","11428501204471966083","15374173511320538915","12685699985629168011","8467699477695326182","17418055139543082440","1184336831410201566","15626108294092673116","2076347413611599725","12728896429448655404","17235563301071580836","8884997827604629533","3914821990672495754","7864235765318623813","16885836337596403431","17550729226273077856","10223561939773836885","6560916403471234473","3342041702817718837","14506047360345247625","16119676229670502793","6348708635103982914","7404058701574376983","14999459266405464762","8724164470961393525","16998757103113286780","10884500178466350389","5290793563979711409","2099272654866020852","12866504059656965533","2848737390175182047","8005278998623824258","12729064519277756363","8512500478005780717"],["13755646337728867674","11209805020955327987","13597129334094006976","15831068344291355645","6217007526939883761","1225859521856348686","3221568405603799994","18236966379373384434","2236971825206984508","2629723756730423913","7700303275139659534","12158593790953806626","15495877865986272807","13122887079092331071","12556753357879901715","18362096737910885973","13770427694686332316","17116904283007831280","17376688813051833349","9332719172543798926","15581957451570863575","3660182074883351426","9016333906777012766","8951537750458613145","14363559389409883987","16071869693778776888","1264893856113138891","18406145424364119882","214476005681243997","12844824129257543688","6434799403711979402","8308117397579587627","18276710449035772926","3450494487995537042","2110438944343982839","12144209673751857271","7036892956400716973","410485744914542694","3500829815252350870","12982709771974547198","9408097104182538973","6535942492186945451","14489991633321637267","7255251270367071405","1014045805095964952","11478730977007187643","16830898108256424926","1844142775961081306"],["4481307734347896044","10739772898830084476","7428796402057142107","7243313010684367463","14354238834295286432","13256064728348065387","6026625143695455760","11015582237186915759","4618613612618835205","9065558883235775180","1966351972445198849","15559824361415124208","11687487976040778160","12024612825727440588","9125980897689898478","8694637382374725575","1175529457947578967","8122194509453129995","998002078586697085","18350123665647050577","4315425780971589814","5730218939470090963","14153195101502369509","18133723600938754891","14524386747796109424","7172525029879774778","1184652729668951143","9943696910984833387","5687126349488922243","12167551601840418007","8469877101057545831","8582938700564379268","8521882501847828451","7909221414284723326","8633426095651232199","4143785143831219577","10048716398977720076","7984074405875753381","727882800288385510","17107317248730124895","13172339335455877717","10630805745623508667","6122700389793830754","7186021269478838782","17637785011921019778","3837652837820547982","4884660606646022684","4191766347990656231"],["2376699259469751124","7801017354690241093","80584159022035383","13752977155569456723","495068351952767575","11620402428558711236","6252160284741021609","14907299546133121897","1550148824823322176","14062002876379448712","4443928982909409400","6294412691449454933","1933398901225311939","11058091979631413791","13111380271516337655","12950474505928162846","16535943415426589061","7768856824523356969","699124026410546051","2476129677517852245","9141557638536661210","17795325558203350572","9527331951096444401","3341645829865090644","16143453719039742981","4279890485940581497","6596329172860624385","2871728612083128192","12240683038765831410","1553591111463348654","9036098518465771263","11969736454642315331","11817404248313331836","17911782219389723056","18064416752638077538","14477280613681512628","11581826775623078476","11486285482900467828","987804004684566724","12675680253883449523","9704320505113299896","9199401943800963831","5049523235422898088","5924653118112808752","7414809492471705184","11883754965373502350","14903081589647661984","12632653536398129798"],["15699353760525220877","13402251152358219159","9326596405403611150","7528641694970993238","17937939878624752554","6606635091079079068","9256642227457373485","618581305989638862","12379727095892594823","10162270228042172600","12977152788748832092","7386534021104511571","16819579407658489653","4234018502708544584","7952389698471631547","16089749900899936819","2108351646161263909","17368439797756883715","3291903818075948411","7791874757257512089","9015936332853139208","12580437539538200514","4459342360991376302","7530743256308008881","6428434463015669482","8303859318337784058","8645063019051677944","6685985547154776977","15641675246281243298","2462711600196216381","17633090629249560445","14304423430161868188","13418217232313448552","9002952602337200006","7571720438946986186","17678441975609293931","6742908129115182884","12955291295050273694","1325660094189898223","12000230222909111480","15591976034555731220","15812041581769996198","2999792558803713540","519694986290547685","1704048378524258711","12748416895344284208","14015152425147245866","5837821459627159072"],["6110195166964104645","15448183589124228137","9914522734837065314","815003925519459824","16629820895448570777","7162550856135788386","15943319796832768880","6541472967287671206","9882434049136692350","3245747949057751187","11643615607882018290","8112486054005643799","3099642529993912757","2592240158252670000","4783938846513855769","17518003379056091324","2304612752014581864","2948121940201176871","6184408622184511119","10439560731863836780","202131065721128302","160024851167126518","12356388014073709840","11694393235589793734","11731962946481982062","9459986474768307592","9950380392891222269","506525469049772110","6408727980041746819","1638700969777038564","3871711493634321800","12504570041441167757","18129149258100503487","2732521098060546519","10874743097483745533","2652402058385295117","11473226314440170656","6429151422659904739","212034512661985171","14544904058095438609","17850173246890431797","7538541975643173456","9281924165767726028","9617934727661703079","15594302012880408534","13449145607620524856","16529772051213042188","9818723593157622376"],["1888966807339279773","12349328924022487488","10316163413028836406","6214392220622361028","13829537428474304768","5916091631550146138","5584911838444967301","13763075121529647148","13583342013983584659","11564151442346866881","17400028882217689336","7516018887170330152","9982403592850541489","7682883026852205058","13592034481461517447","15202442237560316262","3700456240499071240","1177981877479529273","14069057244613184750","14104731420257802435","18028769971264329397","11937314505542159278","3741169036209135903","4420464007840426291","6860399334097629393","14734608349263883726","11606894166076154384","16747818288932603611","13487152002924850134","6070893893013656997","3589483266199536739","15497555432533084580","16068485819926344951","6625235919001126227","373844757016356856","10747952099816622631","8723053242745097074","5889298141411350098","15231091479176000401","9190997986351147910","7790436560319836796","17252696716951103304","14543204135085074399","3564181484881787189","18353835816064533859","8272441940171094761","6068211889039800465","17598899235985887136"],["7775722293143987620","17104600950779801867","4454324576507061165","11809230116603191369","15097052547016943717","13385177726558032170","17323257254580200185","9588875837045401638","6050316657035774550","13644768279690053133","329007993131342079","6887363235047822275","11306043859450338195","3252915342952377657","5971709695831707981","2551261520232290124","6717802963747612112","12741489109699303238","4146909389994577346","230722283152860340","8809547661165631677","3171643364455184880","11272898104677184935","7040781314252102378","13505117388497757270","512276276240304675","122233769119622635","17895769701731722683","12991948376091784882","13258552844862814331","3159178149264899470","6664116663133495509","7204315404317151253","9636252428313226970","11022101668155635597","5265745533916283800","8261559571913799676","4118660173989800783","11485557674516633196","13462863678961321066","16579154351884369499","10275481477679343590","13279231866816669010","6594985692985664138","6290378785004340534","17074441816557453616","14361816751815130321","299908594424089693"],["8098146974416233388","16706371774803574411","2809580387568319658","5463432354169096840","6423710752684037929","17840693097462119294","5554325887713272610","11307622058218526295","5909921066600081722","5506527179361020137","12138153408699292671","12269179060788750129","14602540783467536574","350298502995576449","2347778984908534302","6974745693036260999","12283001935423816576","4286192989711325518","12335637818817663811","9163584069078296101","14158203005696081402","13743992852108774634","2319151663514168813","17928374571240361268","4108346232061287081","7741962898435290957","6999880920993399821","5808457365415815554","14675253485707880027","2058280314821220531","8995067531705408439","15689556074920706526","5967405490157080993","3015091986339402106","8458423219063837538","3221093747376038922","16780471581487398003","17928683577191298689","759307439484216723","11144089549128082332","15043112050429516522","16847527361620576201","609359324585222461","10601655823102020088","12026138102925968379","17755479326079757414","16442081784445181471","10336407715515444881"],["14256949412152302962","16617393001766594799","11666185651276245870","16224794268800441449","9160367881279579451","5007756169711737914","10723934586493768530","11381866833450447557","17879346037390069302","16806802910693010199","7637734527730110594","929113964512916525","5183925712881105800","17831915814291188440","7729372072659127718","1335279022526410478","14799401352328841297","2295881127491594414","7337095534323729450","13258677704586075357","14145846559242576203","18210519813434460693","15613913636665751635","5020326823489814916","9265885145060566667","759983718112016681","14004587037869011947","6728027939229899174","6233028499657964069","16702320894460635485","10109811670556865196","1882285039313419613","6898178532012615151","14161528038604966560","9353781214678949793","6135580102872027044","13901537449677186027","7928289438385415055","7672308137127231145","11277645327464248239","16299990801793632628","16172857025078035671","13180391737311420909","4595856143174197835","17386727720326490410","5512821027738208085","2998284189403468599","1546645356032639852"],["1147391426270825487","53980406025974591","15889889558461895461","5895792279648884871","9777757287811538905","15080660103851930980","13310497373403549656","4460257073640853869","10900846826799904635","13427787664098588459","5641686410361522548","13837925272036262559","16025397843177024493","8331121051111239778","5366918024743199771","11303653776296967841","480680556588600015","388519758354139212","615277430466654261","13664386891248740722","10226600493835563710","131289425097396470","9457080857590411806","9192531683139256419","3530987429048851737","579633530139131892","1455285921076661831","17853503655914558652","3603701965868108700","11618103724885732191","2885778803422366475","1971486657964961573","426753596715282993","15117201271120309338","6864996847290910936","18302837010711242462","3494032593657722233","4612045906942671240","1020385338244400025","12540497279168158254","4954856814688996929","3251945006578825398","8691745288831232115","774968944278952371","10663064437669306099","939568734461289418","15000703618401842351","8787610799892114956"],["8669592896438886102","10097495705184238218","14290786088667559898","11613297420448651862","7773469374430834883","16051693218074938947","1787531536253843216","17592437367488169598","11688740598134317129","3616287416471632467","7259724387888099350","2114886401779927029","6995148576391192380","10553879019443068423","1951479806394879134","4452087960890882148","9849469859459156880","3661700564646812733","5761865024980063426","1717743507330657909","3722182159395919561","5787109676408847484","2542017387824873563","9947177717417085839","2574976285429188667","9772103974539142026","14550580880731476153","7956847267991509150","7649454062702238651","13868093027361946869","3064744189874889541","2127041064117855453","1138408967539360963","286848740636804995","9834590500292504546","9373925204841923361","2940134040191433617","1541209004810552811","10303017813474643135","327179638606155810","13411805606114524890","13022722099623178117","18378946755503667945","6783866700781350297","12599055565402833762","3378512410567859363","11315104304753280328","3819347223544162036"],["6336131289555902722","16215203180315175589","17558986331267630874","665613272092432085","16071279158610329048","8433093550325393155","10946352894993363127","9506671768662504301","17652144145651210073","12333284649735782183","3660900610479802540","17895144525072387399","16216114388125288866","13844572615449111911","10792189230937738649","5722249160490750788","18117006541123684898","3798812280294206469","16933400502653496792","12699737672587073073","9689227089608803098","15417388418667356074","14703449802458414404","14550997809719966131","3371815083182124259","8626522807059444706","6183147701882711115","10019608772535067572","5673340811984133201","5334268271007178926","14184731399480929321","10076974718403877126","18341897094040762971","9509907193137160559","2755305757913746065","10802200610149158295","2708186488588832496","5971480442532148984","17559261359669205289","4555120572211831556","9339251246064135576","15604663429103127431","9125382954146018495","17578680560864499905","5140458440309908319","4507602987658194751","16778452892119761055","6133986534682804223"],["9985255447203483412","9660774403563417448","5096412367503526339","10070163954623253556","12271878967405929180","5372190563749492205","14040643432733545975","6193442787188345066","13893494998601231430","2983259542427852099","7956430698941834412","13344973307467987171","17966252145008036635","8494679928501265080","17068381059926525911","1427290434406857406","6720270431801719589","8044943775182674969","8625359169465213680","6790873502339472803","1222975668754810081","14174152396250138964","12064118571014108368","5946705441222758876","2827618674810439890","9315409395449641801","8177790028087204890","16795094195329470034","15661524750257022140","11169631881658903376","14982367849511991509","10639677997202198067","13224154614640989021","1200262867954787514","2807041225907559603","2910502264264873636","13857652458331102100","2461758621750368081","15946493545740537814","18052995922653056296","864287538641459521","3949774049652784513","16887326948003944631","6476397438337319775","12344274486246902467","4217804611797053257","11220263443629626137","4684309620558396862"],["14262988441239641759","926109731185195762","13260876073995858187","16387404608595070757","14495371523259212595","18262875013672809697","3771380204641326145","8323456145634098702","1773099212689464326","18307890415751094764","10996596817117128944","16155205976787240453","15034016388229360950","674455308190014519","3483080351136576980","3846627754178460504","6908781246357321478","772290192610819254","13133166270906859140","5480617540071736309","7867019107359077443","17154449390883548700","13972808145651867394","4102864735248090100","15490866565701300221","5005818423176243205","14655138279660691853","5274400584001033873","664048477347094572","10437601546175058954","17012249555047279427","12134063923610640356","11991158902053867448","3561000662594552279","7155659524898210088","4890393421236643278","9555382029084109725","2770364388157555828","4892850830383597715","4918171390508233600","8746764739318267796","8390997966676612759","4637099831451335230","17963262032704908474","1510193755742804749","17798680760427711904","13401334379486274198","7260762115113573957"],["6148295116371847935","7378637328315159752","4969642863988518983","13755476628216884558","9151812070706224149","11756667418234712510","4587304314654122054","2308976857240610708","7305591823113082373","17181344658880839688","11471628718592684882","5048791887205884748","13269726964224747988","16766869678198307414","1218095224226170178","13068314176537285442","14902242683549997996","1531293992193920648","6958057205046616195","6265645022367683156","6029798545620198554","3786945067616115094","7153693420234332252","3616731960531031318","6789576856292595955","9214841598033003789","13985422613802553319","919096103547482267","1701578426105828829","14163868388630670699","15315438000940924976","18086460938846999541","4052740839017186969","2024049619645028238","5291764737794385927","10794365435098944994","10169165858815172743","14156610237134087402","17581849444079977193","6744998341310704222","18369739626269184694","9933596406112094934","15520526674250717932","10750337596761050430","17443588772544876242","15934380291190153087","5435339115928565022","5721413981756590871"],["14582581488617530580","12793143627900925309","2039468727274772667","18095754607576103953","7234538644256958495","14304820009599444334","12381902359091497161","18036170637533068709","4949046924968895335","9371614052793934458","5979516432970311687","11362938156929236077","11983888606656150793","12386535056682448185","955722449164423393","3353715282918281801","12583395810819695020","318903067293567632","14217770796594863442","4917946483431537840","10916529689968033519","12867957834806480520","8124905289195152294","7068785121792705932","12687677665083021928","10445874247132294006","7038375563093307358","11078318949423344920","10595628102554535885","8921051189888038274","8434138606053009690","17146642741295913933","1301879921607014547","9767312550918897871","8143402292889264276","9539473589295411413","14694000847783517395","9034714095867644219","714074323176714819","8633713190867935856","2769980843001269862","12983592965746861679","17267509763618522033","6318416234149568199","2177014158188666658","14191932770671503112","9974030844969675702","9821258838942490746"],["5460163027764500437","16436318984345552314","4893326136567197091","17418061497927385307","9660218273116626279","3430847969057901848","14789572034445502210","4709167129730315142","17164193306653656380","2923356658419692217","8119420594820926055","10720639804215805406","18373611689542164584","15982578921385422016","11409707311816226208","2898756149656727318","722022923096740544","9684543065680246370","14666074478695347578","14456583244740517873","7817098937368682802","18335303008694463300","6779316405555312955","13313769807970298260","16033105316388969151","15706206720297302732","1904490465958850054","17373368023631441629","8610450069063347643","16992903721244880109","13173269732386763041","12899044126076395848","8677037438813624064","13112645885304131906","11968791798792651427","18092024715441854803","6952337147489603084","1550611689613066531","13568623572283919892","6965947644045609743","11084987461409044842","8339447651624042874","14340276373333760087","8663798609930170798","4585838581413039100","10558995982944990011","10588250811599472739","12005266439043074432"],["6393784705190070424","3659638218465612970","808583976581069149","15242709374790888850","13723815681872855844","15627494582760416713","13936443365146015291","5177724781020962548","8095153707252689424","1701653842712714969","9083352318497000228","305784168993916178","9390040614666764953","9389306080090903223","7219462795008221696","7483238211140041324","15871597684401692684","17260914322466817843","5956866223853686683","4020950037538710399","9902923344136055233","2169704382221257158","2593020642322166317","9251819845353183357","15048623699411226615","3427795264331563035","1310686730114032326","5907331685555187492","8532961825770280973","6718620422108377790","13307142430406409134","14256214689649896319","17816525872045388599","18437595008739629505","18083011290959459695","16136859687362734273","4719589026536147647","2802146564123606130","7438322171552516790","10280308643070937549","1065607350181792133","13164299021985107872","10196001949156638583","10012744361962760925","2989656427381021574","17318666851207699267","17504797601074849835","14777789557792391251"],["3691777205459950744","10333310189776211021","13392185381305157312","15779791329170778883","5274846027768107540","11469607403904988684","2312132867895175774","11143761810291774175","14130791799515814482","8617220698568128642","2585752369669398965","15957458014366065364","17011667561092179166","2745085103100025784","9404190687725965184","16144658987599299917","4952781751778883774","17542439159294656701","1037026951531721986","971233436408473078","16324212489484859102","629322511491121721","5460227687874073200","2296248007877357924","8657940856443190070","15571521895236482111","17329226417547964103","13937801640179385057","16077491496371453651","1626787472320348492","5337525187461166577","9453338152136110102","14517991801345336375","9143796188463076857","12556999141824263424","8498544355403505921","17602888847193350219","12718797787635227340","3417731280878672844","14392370042158308067","15474210535029883648","7420752660693343666","16794368312479858786","10636039937856994431","7655881760132707571","510965149332912188","6861346851488648296","248097185008445051"],["15859789710346627795","1146397926522250086","15864878922476772072","7618989115955773588","9172350142551051391","1904347943580202492","8904326174849754819","4192533114246441121","14718433332511695469","2735618945783427702","8912562338398783910","5824799142994053791","13369766683786832172","14938039956086908110","8475764731274929276","6707442734787253406","17707194730056450412","13370847022608551046","2561127988921173865","4115784135157267208","845654384220663732","15888648759654459093","11681590384457141786","10399855642103173672","10210884405797462287","11868726190889311203","2953229209731018459","14268830404695738848","3163029247960819610","14589081158680387348","3760541540306022893","10420741675113102998","15655895186289834881","13573008727583264606","10421227588110267082","5963635956890763406","13222911629222502013","3464048917074998370","6347580010971679354","15695160539673957238","1002352033598833011","6029297742023090281","650951147505790007","10035204410318647103","3716207554464704178","17163055213375221834","11155949085979417531","7381989344708173146"],["5082242940304436914","9522015796370382339","8247982239631110153","1081873083384820776","12721341951334482673","6573929659378454525","9607977844406329163","14097360299183679831","10730096833820237525","10823934710104475362","17261011429237426702","14646654096845463547","16296568955513800859","36557183060167301","10031351567704453310","15952798887169483969","13991456061962491057","1446359343868914820","10007760369262486524","9658404185999676236","5802052597439032255","2851911481524586912","9608231716722099933","17722008587121485619","8784490533166126763","11001587404467739868","4512668898765222563","5618692958695011947","17932318381886087581","3002479676387218301","14881886072901194737","9444708616502490839","3564128616664272992","5421814654253869625","13150921831163577363","12374021007486419614","12617968596809674127","13179051488616645329","11154879576946266954","10881812533057387878","13451015768057570091","9612362887446283682","746484592694478633","7949961948087265664","11781980567862073428","8190718698619897135","5112577923387894444","13525644616802691556"],["17266257158038753218","13329835903779752124","273294707460544862","17574725453510165300","5465981044726152561","8562197767764111279","4637699607218116696","10445874280850100116","11774848933450620889","11807923672117434670","8338062093327475356","9700463647291223293","13290238641366740703","2017332747396281336","15320053748482010772","3392049994365661174","6151279857351625212","14987107245875187391","11291057742284333682","11820873988660651004","11398317319159350733","13342097536994442224","13486230875038825648","16580355293975984895","4875991520080175811","130993347117930505","8373631904216060908","10602729419308708813","8393434031019775314","6154441481821035819","913881003744832385","14797156628093828718","4301639137732757908","10675878927724814035","7765779996508551728","11046701582701416068","12878959290333161424","16689947422732777097","13629652749337348913","14684689799991843157","8429059125643633772","10470744354422078941","17077985053508189733","15882079550016356798","8611555723226129036","8790528928556458710","15630441390274182156","8210686139628169361"],["8956894902933282190","2611704139394020722","12750280760363710844","11031558926738908809","5711410223071457073","5348640125083802142","3935003235423569615","12455607804938885088","3775911068947970584","18122587608675504023","1322034590804739737","16823724566982970421","9909260960559296667","14439710714862839778","4993742010310641692","5551175468577902244","7537413229109155416","9122184418082895199","14201437794201957792","2531094198850472785","17606874557198901220","10317668359659753867","15249735083999271327","14927103834642517198","11329688644858746777","16498649839543757986","16652204432679985770","15685145527600503086","15912818189734072982","8114163271986802693","6505301806319938707","4616511860449401351","2217838669764367639","14672095540415370321","6343927679859424579","4493907415726118718","7151075734115856841","16781955630691535866","9397944262547245370","5305246217988700603","17169712722641296829","15652831904828850034","1896586754217647836","11056005235909672200","8855008801585619850","6914737569175803661","7950388096102670651","4439955857710364894"],["4981181077275990255","8536667713931436876","4273338972773480666","3946803926836952166","9102465053251900728","3198560476838203305","76253497552775244","17561795601526082727","13952307821491607432","7374694296888836299","6879266369598361","6223568118171404228","16986559126309396004","9427074090978629338","12472464393610341431","4011414530658103367","16775996381665234589","8263813455039662399","17764149814852297267","1421875115190700662","4286863673108513719","14521949169931969056","6789903644453155982","10726484163918141766","15608734512913682119","4691776662360308177","6877310077538872975","8912904776931404886","13754250078334413825","13362140383878963231","4236235883494690536","7102136154780966825","7690173442852214688","16443112223461468680","6072994638154908566","15798448258774516407","8797876304449292920","11035104208512052688","2399500537215591915","12646407601601013641","9351098836450704352","9664467089032629876","18310314424002794502","518861488474611388","8547632140799096229","10758878803446475372","2618110636079480867","15795188670689103655"],["13094568052834480150","10633656084354729014","3416730037239590179","7521833386068671333","6192485025602757854","1713535592062907750","13148300150185934588","15190563669449194835","2159992799622614903","1581202256470447433","14278389469561840098","7655269746285852700","2388838911914054755","17316085133088054577","9303327075487315139","17451287675981489196","18299994022515387828","14702420233945123156","10207567603586411358","11924995575772042430","5443865084572337529","2636637215138158459","6208010880856213211","14967259520745564400","16720000161987267146","18166053317568545601","7185784030314298573","2300043685229523865","14473700732769178328","9920593185726412003","14022152560158515325","13168978221873927897","3481169732008761526","2586982537344227728","6584475467354533799","5053421758110957765","15538665106252364399","740558635646140230","4180339775746168402","17514878739606088982","9886819072596856061","15584715233707741594","6742306626919332571","8871008484723280016","17877457603676144230","1173124342886042659","12220795861709123232","16724932231679247786"],["4819011226377230151","9262501529023295776","1929904484415691632","3104039043842250367","15016072050895309572","7778881185297409542","13657747445562908295","4191085820544904683","17052946874042927736","5563446519495678901","1252071546164305993","16057862532066527080","14255211913638244568","12131592318469598112","9019073511772016039","16159739495281959753","10830050940695696328","15548762264450796123","2674422557947539786","17071715483798240931","2989131459292784510","17860437694796873232","2656482963299419904","9225280519080526611","7381736314264905624","11070965185043323504","12554835153533032871","6035917334996954751","8474636756333422836","4854108520305519375","4291643665605240262","4025250661672056993","1506900090451160547","10018139901079998605","14809656101844813078","16628688889699948774","16247974937096132266","102149262320334923","11912731160105912384","13233988065099248855","6790250622456290824","12099162838993160778","14728835033238477180","6044652381480728590","14591400498974671180","2215324609138989061","3032487671483583087","4930177720816905935"],["9002220879175346194","4827700912996751230","14327165363576007129","8865176739902536899","10850776082607717102","10037751349660893198","10475655774989999713","14134022633462928000","12281811234112794407","7338503071213117749","11761125821971530759","15229714701628477947","3228610273046380339","6186847954252779098","1010307066316200131","3304873266439625641","11618841387601785637","9102489459617499445","9511531836898007225","7317490406282981858","13342336905630881135","14827760884335744626","11957571073738138849","17417948268790482252","6609313218434194162","17244973670828008837","5525326672634222303","4792971032586133280","17905131631446178335","11078897348621865290","14847130021066073218","5346732701531963633","11086327781504852299","4195403200829009950","15153243970990497805","3059447439002062640","1724071178760787067","421970716519423221","14329040292282376216","18128672876709603952","16962002525500528331","18329578309834723891","13929264311965990554","435962503141104784","17176808200172965894","13848168966657977801","13749561028358496082","13768995671642719340"],["8784067779054997457","8226061653844544213","7850517571440409933","8832714269747433256","14274021377247132456","12077487100821008151","2891931405353431630","2644861361562822134","10458307332966440372","9789319731113978600","13565353617867937528","6276426942991607305","136644491196721740","12218294756098109140","159944459287136106","12048650436568067349","3495296163285174783","8380675678955202320","16035820933951344608","15739909911571341457","11297993700995511932","16901795380285313881","8616046689664511596","11444864070926383875","17641404767547802630","16026363769677401595","9646844366314035537","5016748710408530734","14793786289277648292","7732447026956379587","14578602738594773468","15235701983741514957","3308070040643194630","7007645051470464031","8087619263802025415","12547530283794901525","12972419103783206361","1641165411375521349","3659840883553071384","11619164210963252204","8362639981459584630","12117229046745520151","16319088013082562884","282358398732970438","1344912967073068448","8237983076745042596","3071214436739480985","4664107963295203946"],["851607755792772478","11731871331652504920","812084933241025023","3774565061639640194","4150060866717185758","7442467747321546447","4877634506889384023","10698998518858339158","18219058833905968984","13409819021392093486","9088389718036514655","5039529821188443365","13272897756217555554","3016891641140993786","4514959235485481395","7303102917549811813","15510765906924574506","3033070432890321204","5544974443583456170","2618207467333752891","16290336809287007923","15585072472958949460","15534933655289930048","3975285252868297336","1326639341463123057","2791800980327782973","18229609316298486587","12158146977058607031","3757430059053736301","14490816048360756151","8603866366073482505","12705201832009339129","5830156615494859360","11334521120253597812","6605372231172715536","187176871587028047","4993060966743332694","7273034151174577743","11573857975160975150","12170518950155485151","9756342255021166953","15942545009408175249","15250098777749255314","6853913698972205237","6607566289228686658","8626573493308452919","1626493381668418042","14938576378170100138"],["5765896375707446767","13711091357971941242","8763734347982071273","5903739864002874829","10559645942191948986","9810094280548476205","4524987326931193601","5967220637025963835","8551599238150697655","1102188799938129181","502148863213714157","12314829730432840838","11138161581263196119","2063096091053596349","8413914622710697951","2329823807476256017","3534275805797200856","17842142307109609538","11440254111316270920","5517577870241234026","3460137641802759598","864559123558140318","13782524214804011439","3747940509575476710","10809488855766830843","14325166010567636426","7189096649717324836","15469573656471637034","1141955110506091342","2332344736195766802","2500864942648874105","1144719261595586566","14516989074718882398","8655097689863064995","12388717306667608119","16008705064133001272","734103353731543691","12980186513948170999","9610520973191202557","18078347933736550485","101633607366177218","293634347161122679","14854571208469174236","16194384910345602632","10753659190405181327","17562867645092758220","12481640789280086166","4261968165959157134"],["8479472695395734325","4857608126185487409","10502337349848749870","12785602919657143902","8125999092870920803","11583316935598696892","1765457930897929114","128849761249632139","15522249623614849994","1969076244911577696","15365986235960630999","16221725101066642788","9235773763870579116","15085488284840444936","10518642789268504184","11165367628354777186","11146867188340911498","1716976811980797508","2580966209252594517","10097989177420918260","11979016196584888234","3684680233959180227","12367683670592293029","12664971327028389472","1279635909359856179","14779303328648313793","5733112153004478879","9589022295181236770","10729268838624524047","11545951566548861338","7044376927583404916","8908049451019972906","7674010994913223197","4274040047714539418","4568186963792499150","9920158254300525988","16174521537554754381","3986032852509812632","462075461888095521","3988265238576050242","15118274448748946984","7194059448142204259","1587380582875663400","2016325391787902269","8198070612491082536","16410401438958975704","15483194078431183281","12520291044662478492"],["13679838324584931121","6783880888472167716","9486941504497027723","14252828196390009329","2019789703900786347","4698662466477885691","4545606308660886307","16162002169039553710","1363776914248568517","5294302562060047193","5153947445079217911","9069162353757288333","17007632177421256127","1384776190875637238","7066647305732169077","7272603103883971517","5661808693907581193","16152562973201168697","3504616141729508588","1409043663951607890","8992754827020303564","7246113359952514762","491164507732097531","1425683659730526322","6435327042303578693","2780746080452352658","5915903239435410370","17294456242763492346","16180740346630978463","6326613594466187509","7758557337007314411","11076969320185844042","3223965753046919104","12886372139159492677","11827412840342723472","17837058842743365276","11620923572868161854","6786918259433941551","8158421167213472072","13747122158780324040","8613494346836064490","2109808888344572245","8846149982510821317","5666612545520766882","3892458395301060033","4501192459810165201","15188478690137732944","2294717336016712562"],["634786559303920795","17671360020622879798","3189742879203544936","8394858849603454307","17531694031208973699","699938460292124049","16663194453392290284","17122092066254077115","5546051254656538263","9183080769646666613","15194383274179938851","10146158955674624459","16075544491690623117","13796860462380973713","16705548620982982991","7420320512529792923","3570774031417869871","11113471609955486399","5146438707308275402","15267026448027715960","14551436544862127945","456269454925390374","12103787739701547043","7278867325091234518","5910320926896599893","2001667311074303947","16567683653043694278","17125143407144186776","14654822953600192492","2288642416243306104","16552886937884780345","514282100191130985","6072527192933834860","11385392087811475089","8320103646331179023","2589655911227773395","4160525002950076568","11153709898841152570","1738291997519157986","17675154123495416598","14634465136327174870","2902968651009224910","1707725925234820693","8509313211698902232","12742096010631728523","2126307774213789751","4355770729835051398","10092085055023729097"],["5690457322267899397","11167103071147054386","5797638753450980093","9632721255658959593","7084796894905187169","15742626692489347161","15585548817938932149","9399764549411566216","3693072887786943495","11766211593127612089","15055104342241466734","16380469964081465625","15343685053908893009","7907913911772243498","17104471177806201426","7134908610335323268","2458972021717533158","3447873681195151038","9535450385997252182","14936135237938675170","669536614241370360","12232062508068818964","5240039033697798798","14621216072485796771","17471299446609689197","11828048366126363817","2829919023262906119","11265243052914305212","8303065638748752916","16536321067103615431","12150659666128347270","17099942107087933204","2521517993323969756","3005436284259295774","3048399478229669193","4670514984189722927","11367747069129405151","126618086123287684","1437722146802667130","8586193073880067293","13078762216197642476","9272812061458833750","12878886098712700136","11407729241977341075","10566618882401767462","14741484771322436817","11331058662888206863","4603214423355917792"],["3223731963072686428","15219833153874017120","7664908833739353556","17233051524812789138","16900744140957981064","10692820788600156024","14624460544859939283","8185559237958306294","13333564316308885677","8456060127499982078","2697438987676878389","2939962135384214001","427645514963769134","13973403722398604980","11088256162984701122","14695205566218289456","10772703291648328077","9641141761154030103","8489209446882280131","11793324792882997094","11100264763497117535","7551588929872026622","10681904879933233365","5736102889738712657","14156739335244221306","5806061668062163709","13064536991662566038","15517193024635174289","5509943082891254730","3119087837008166978","8715086733505017859","14532303607664337029","12996680457078365116","8098299566101318263","6268794326827729614","9605868635559602238","13525244410021858708","8559168101881503142","7190326082450871724","11093004713721217375","2715855082530677821","1298876338230070703","4808554854996585040","11561285511701952999","9698085335733601674","14770148411571035100","12097599640598207435","12797661582666852869"]],"s2_siblings":[[["6499293284998404950","9977675181235318057","14667763920689881051","7762306474666765730"],["13868971780591868287","11326183739396112249","6394128708541428521","17865154871962853925"],["7216091465302344328","3790500492832989941","5768016977879857844","10591633078727191873"],["6498229881059549944","4803030016568573875","1785789397652423423","5395463391277210019"],["2279732720228097090","6878846793731376207","16530692260907441650","14123952363231767784"],["13063331455616834078","11538783579702838211","16961822732559304472","16704141881593355297"],["12344439642080126214","10165483281062174956","12350145114172380318","16433194639778402843"],["1505939300753545842","3840624107618084983","9296738316087581323","16830538474496152678"],["10258508178795964215","17738899632134950548","2855170214510630710","8084944406903951195"],["9364788049678479136","7599513386342832952","32910750051627459","5783547652375391203"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["16906106708580527607","3562999514356225493","9461622010031155624","9604015759696321407"],["3856843161183290012","5009404731010345018","15780986730037507637","4098807043921715580"],["6493824686871395545","3392449675365797565","2175435960741588010","2578169075597953804"],["1508079630224085494","16429832856349376961","7109875350688943977","11818737658851101925"],["9235954755336120833","13862846379062097027","7649060296988325187","5693797215120726835"],["11056215909824873711","15528382440466857577","5875448189064208996","11278389571789894799"],["14571553313626451777","17564380076533509030","15457095217812766131","15187718695690095889"],["3852120139648973897","3129066449620734055","1437754848609974334","734291056212003022"],["10258508178795964215","17738899632134950548","2855170214510630710","8084944406903951195"],["9364788049678479136","7599513386342832952","32910750051627459","5783547652375391203"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["9807818137943148515","15431003898507111001","16733456563077473507","16536619422157546587"],["4033600011279042592","8401299772703569034","2123282677750146746","9337076495379566575"],["5435907875774866654","17044530665088937624","12518455428216184570","12231175377714301437"],["18104043022384311688","7948529785617562629","15599797994169286609","3807693716258255398"],["14822486382918762824","11669891591693675539","6792702406673185170","11904839858572107309"],["7176895813651812485","9241210034296823280","10989359272670062675","360103800502706703"],["7750395884317378889","920289046868804663","8201361568226570616","2248606080473315058"],["7985150237237860752","18387648185603208676","12471643724726941163","4013619960933809167"],["9045108975415467316","14856435305002697069","16016405181340511990","10233648188020626167"],["9364788049678479136","7599513386342832952","32910750051627459","5783547652375391203"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["17866314171312003268","9297040197311820881","7169275620862553132","5559697975468654701"],["1775999807262552259","6620457620293291291","8595626882529212340","10084233054394949519"],["13893970475111843948","17161899818548900028","6848120636737476545","14254744007048135997"],["10428486772106674086","6694730617804089568","1447475658230788575","7231889168254167514"],["3417961853431405120","14151233771393890701","10987524864358883372","18210494006288680126"],["5924903133047523229","4297275766526625837","7279812973541705697","15756818100711837879"],["5260081378922320439","14187927455460327376","5567273502907304040","2539790415182970705"],["13692278243386667669","3857647910385400975","6601203442291631742","11181904269707445732"],["10253205865187723840","15408712031079502836","5040293705518009934","6997744857949903608"],["8814157245288540795","4691368749323574511","1399159018997572834","8310217849095723329"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["3490729344133143389","9007100673735350270","10909449093989190407","18171066881748455016"],["6871052378905922848","2022141395306966039","13629750881486844418","17950650278922678626"],["7631044400972901940","5073667613023666823","578817386756528229","2952149509217498052"],["9031478271295667652","2084018305207600562","4581295861895414743","2061644450990508299"],["14376193915663177571","4509066215987066125","12895272100083348235","6995527165176109979"],["5917646008077058795","11038583075955963199","2596535524193286231","1369878719948822127"],["9642321179856550670","602949369449743077","17521041493852597194","1891155888453656914"],["13829610986337602538","9114826939810868319","8145170287740053744","13565585188606077225"],["17924519013971979028","17187570982864708398","10173941519914140996","3691100086731793174"],["5592430004697072181","18131407151366765349","3602559982011028325","3756758016094860970"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["3349224721362110409","5283447617728743011","15026614593841145243","12919337088977726501"],["11080462788461426477","16984990859245204055","10735592857638575663","6256710913462285938"],["6953827275717861025","15843675698049676869","11979549090006218613","14992060697244298319"],["10026777171723675628","12995770173710709329","16059735250922472258","11659797813091010609"],["18207452209673770291","14102978539963852156","9268567690020760209","17588149068764788854"],["383014110187813627","7555106581535220489","10477199523766161335","13815548053540667336"],["7441375941264675388","14220965074987796854","11962124790921716107","17567977747533437355"],["7743288565264071162","17746118137690714649","3514651194309867922","1675300146740483680"],["6459673515608529391","9177370860853745970","2238011886534295854","4701871947474543828"],["5592430004697072181","18131407151366765349","3602559982011028325","3756758016094860970"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["15599377677962277765","2078055693274746583","17476613069707321124","6346945251381777049"],["5994764670324236271","4283496547394480143","13399220732517192911","15724234585164172224"],["2277043142414303043","13121356210896274301","15108870549850283918","2129389021032298640"],["4541325882457272770","3763573968165521860","9362809319388216785","418832831134708359"],["4593785905184744388","13907192552272672895","6534553345829277955","15053279703192541169"],["14440925546075848270","4709483864296733698","9081881458778373399","15329013420138250944"],["6146463284108905594","10727634556934599116","4974161843556560238","10794100339115446509"],["5999035869758427784","13919516414555046053","14018120024040872577","13290979317452066648"],["14263149424056291592","637744133280831406","15047546752802532524","11815365376120718017"],["10424771079831885428","6250368964565816410","8999844870728118793","12666127914976025323"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["8778659055893628264","12349274111431478466","8836706984920648640","1286228152637959012"],["12894004543559126096","12620105492040439788","12661626374196090308","2920823627498000919"],["15300843958718532798","5626286971584199909","1191435729553096212","17678465806826335468"],["12817613871686674697","15466650269232159861","9806187866377408117","15089620966453004210"],["2422631658611418414","4840010161994437843","10517711695734247951","7248320216335148033"],["10585687741231985081","124173716848243539","17950884981759980505","4321961479729475636"],["17640469671823788772","1007328875378308657","895830702388826154","9556263500697944082"],["13829610986337602538","9114826939810868319","8145170287740053744","13565585188606077225"],["17924519013971979028","17187570982864708398","10173941519914140996","3691100086731793174"],["5592430004697072181","18131407151366765349","3602559982011028325","3756758016094860970"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["4141237756404913718","7236113588874060895","9361433120701530419","14496948433183993440"],["532190929598656844","13941205153548725502","9335522288537385747","8967931470323786709"],["141314503094211835","15698930507237837458","18006049438905682751","4284365311720800396"],["10804274769399579384","4119727796410275151","5656875982088486114","17296241047185387054"],["14710338030247954778","7966748919578967417","16886682173236053438","10857857618950753959"],["10040340789798054649","9597289964043511749","907774863919952080","12286694709043952173"],["17972454083829061778","14582955259366846852","11436437069031472478","10224944833311878759"],["11174690744944780950","15897877862382562539","17704251813411576532","8308715090818457466"],["17713937184878803017","16169337877269688272","3725507519026771255","1657056817606993975"],["6593870330105218000","2893298859581013130","16681907848494038650","11187863392465375810"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["2539575314076264088","4507119031745973819","15271738147483642691","6948525865742539732"],["453625441259362338","13888369321176079601","1593632579095964751","14044377267432665405"],["6389736302374396294","9269355309207740084","18305437829645752621","1507993893630121420"],["13443410127318150422","16463261382501776195","8068142132275354199","15906246987104846875"],["14953589681555038125","16690239649272437882","18317498564755586543","14689907779063109870"],["18213105893946794683","14297795171113672904","5936045618398337184","18134461462735654604"],["1185823126026358373","18251601651680655766","3011191857361119663","7065999068917788682"],["13030608977823089264","12654768054010314551","18325380864683469714","13201776209621771634"],["5290779728158376129","3659454114976951662","3491294625250013445","1289952049144474694"],["10424771079831885428","6250368964565816410","8999844870728118793","12666127914976025323"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["13442856901570088465","1712999462604418127","10531942940022479676","6383863417891883511"],["15671516946250448350","14464129626369196829","9211818131118858108","13755891477576089687"],["9186475137295213988","17596028231459330013","11793150616279746245","9338542808813676733"],["7567742796277230363","14446982846882931597","12603703235743499574","295918234861600338"],["3510011041389532102","4796766934085602534","7720311718199408215","16312892014574303150"],["11056215909824873711","15528382440466857577","5875448189064208996","11278389571789894799"],["14571553313626451777","17564380076533509030","15457095217812766131","15187718695690095889"],["3852120139648973897","3129066449620734055","1437754848609974334","734291056212003022"],["10258508178795964215","17738899632134950548","2855170214510630710","8084944406903951195"],["9364788049678479136","7599513386342832952","32910750051627459","5783547652375391203"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["9091202256199250101","18020601582284840242","39146648245843809","12280363735309993614"],["9531240102926875276","16538768459580697709","18014734535964275615","14513275765134179192"],["2320921816563048464","3510683930055274198","1635984520528941974","9700399699117146383"],["10958567635994705520","6018380970613147089","3154286623478208974","4721757024533637323"],["2822688576340947931","4788003140217479393","4500717307738198117","2659761025414781949"],["5917646008077058795","11038583075955963199","2596535524193286231","1369878719948822127"],["9642321179856550670","602949369449743077","17521041493852597194","1891155888453656914"],["13829610986337602538","9114826939810868319","8145170287740053744","13565585188606077225"],["17924519013971979028","17187570982864708398","10173941519914140996","3691100086731793174"],["5592430004697072181","18131407151366765349","3602559982011028325","3756758016094860970"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["12338468901306474283","8348181026636106020","5894097208136401966","2592151005559916319"],["414680131587832544","10317610304387369523","3571140866493847885","4578953969606316412"],["9921976886363013217","10852411913979484350","14455041309745701557","15385222941981944533"],["2801190319068503170","1761818369467906610","16089347589576260650","7785603749844877437"],["10982647755609259463","13440173064684046312","17518832261920856516","379835142709913187"],["4253478353922747166","8061630172433940021","9934815926363157843","16907709809473779157"],["15642927145655360775","4562058513584293059","591548699134945809","16028163054184375142"],["2591133149957741436","7254134383884075186","11393930944440869716","15264407350759276329"],["16594719484741036673","12446440154204112287","17864847594361020369","13098572677479990052"],["6593870330105218000","2893298859581013130","16681907848494038650","11187863392465375810"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["8515407694404838109","9012882378412958623","436035688143717594","2330803741344525597"],["12653028471346472676","4424168857729607927","1754563892868837035","15908593673995110876"],["12335848898883298166","3223052259785942727","10168318431785200816","1828005377967098538"],["9920239717966921301","9450932488220798608","13708607597942794166","6978021604308882252"],["2483201480312461312","14651165693882012362","15292306293511052891","15303280706202672808"],["2449375280030414728","15637443663180539882","16317658080435947956","9213529451440374123"],["13331069488729324456","5288301408353848078","14216787007466307844","9718831692519849997"],["3539070122191871959","9830102196679765798","13030317249107632419","13953689203930056828"],["3316009302975010142","490068274414823243","7098989059390016490","12553212624692213448"],["1333685679961366073","7011487616870298305","6774538831323660286","17580926921414720263"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["5965251360531232839","12797325944029051058","4736456794908067743","3463303196820719012"],["7601287524104833178","16244959685824964748","9549531615124780473","2447925180056464655"],["3492805914032167381","8508211735047279330","2770636646552640774","534739787248503770"],["7387096046071482520","2890372874473732877","3711625472358069483","2664024107934927960"],["14376193915663177571","4509066215987066125","12895272100083348235","6995527165176109979"],["5917646008077058795","11038583075955963199","2596535524193286231","1369878719948822127"],["9642321179856550670","602949369449743077","17521041493852597194","1891155888453656914"],["13829610986337602538","9114826939810868319","8145170287740053744","13565585188606077225"],["17924519013971979028","17187570982864708398","10173941519914140996","3691100086731793174"],["5592430004697072181","18131407151366765349","3602559982011028325","3756758016094860970"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["2883126083567239638","17403846479578660893","9241200161508155701","7303257737963599139"],["12393471070701511677","15461871313826284208","1595122761840317240","12883033515528128201"],["17400885946864924867","8564016244261982444","12642081633434633007","12802656495701467923"],["11233822909817874154","885053904645399550","14350642118682296060","12108791086985961599"],["3574717874589565650","15756367606541382332","12703753485147668822","16360912203204381566"],["6803641307986016920","535066997402893554","2711991374056623273","6745295511711241787"],["17395277418962405159","5631383416423125934","2479721136670196533","10990689668680221740"],["6209830197787020415","9046621984117981603","16628496472632519979","15267064027593256250"],["5290779728158376129","3659454114976951662","3491294625250013445","1289952049144474694"],["10424771079831885428","6250368964565816410","8999844870728118793","12666127914976025323"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["8168475360138683875","2364839728792256267","4571637004669054788","13139372418479830203"],["13710440854126031271","4875404051231541021","7985312584264378370","193994040517293715"],["15965505816994143733","17683260055917662619","2310111143131803627","713174700549224545"],["16675513362304814336","17325615939085066847","8889758586501400906","16737585367299969741"],["13133546764099197390","1963161552167293950","15580813736914371158","11437075140298950810"],["2753319655731580365","3271024104472190965","13731083192429065287","12394624315295790340"],["3284727838292922972","8164696536365331613","9892433979737414051","4184564590169259387"],["17391116383486644010","11294793143516100318","2366144854988020095","10345161415138122855"],["17713937184878803017","16169337877269688272","3725507519026771255","1657056817606993975"],["6593870330105218000","2893298859581013130","16681907848494038650","11187863392465375810"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["521979154316208473","1468813274783326635","808935766910710200","6081711582514571900"],["2003771552339652064","4774413348558715247","10236108923923382058","2287844834841576074"],["16208342950822515579","10455443313863759459","1517584111169539757","4800465371857981277"],["8416688823804929657","230365915023569734","17645591701988165847","5932647645933588068"],["10630199222972163918","5762112217451305582","16294562172957574879","3744305303342387801"],["11055194571410499154","13996794047793273088","4831112879854660028","8615468825104018623"],["2497835967276273163","2359420932997036806","3878889248691885440","12005154322650392611"],["1638732485298504782","11169266866646152888","11629463773318262957","13566007955825158905"],["3361134389939028107","4605414983999537700","17595179851124761613","7229389409501176026"],["1333685679961366073","7011487616870298305","6774538831323660286","17580926921414720263"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["17761686971207357005","8936787890947910743","3103457948176587029","5485024593662807495"],["7570519247727846739","3558601945810966188","18016183366865244175","1192288183749735627"],["12051878515828035844","11139792917554987373","5752901484902765057","10643140639040556253"],["13312945798058578467","3752762284536143760","7517319670625380198","17030516055250938712"],["10002577497435482474","11509891177280630491","5456878721148433999","16043453162350042504"],["8980095145908509801","12344618059299975159","5969530039601405642","7350529621760284705"],["2005392053410242073","7860313664066677743","9608988044199962389","12950501183170322706"],["9695859936895695658","512010759924365131","10437937482514790339","2717488596790145533"],["17457810991040417913","2616921143447985592","15730219272158111098","17598650871385513641"],["8814157245288540795","4691368749323574511","1399159018997572834","8310217849095723329"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["14519192999463816587","17400249474391042567","6592757579802558297","4562925545004824749"],["7490006967508971860","14754616037666793986","3778789933640529246","17376890030114328197"],["9601131092918938373","9915039846192921699","7709048436888320268","11721641330020554957"],["13454458436747041588","15951650325941599443","1385769418167730003","17752098939736170655"],["12084204978225614987","5434698900979166168","1038682454699544569","15122970101167470259"],["8697869693764923782","16176362794812984798","11912660364264001301","17536770052213980040"],["10957471973655752106","17920894517254923611","8809349981382797011","13466760805017713671"],["2591133149957741436","7254134383884075186","11393930944440869716","15264407350759276329"],["16594719484741036673","12446440154204112287","17864847594361020369","13098572677479990052"],["6593870330105218000","2893298859581013130","16681907848494038650","11187863392465375810"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["7030721966833250540","4936583722385449675","10868430952000406129","11051207307414923738"],["18150198497068235499","11158186831969636604","3494646338128916112","7776166800813771293"],["5892700831479401889","15271805346423832839","5356682863168818859","13407602101580022934"],["300062109545590188","3752269488356583677","1926363780797410660","3284826631133354050"],["5512219207243839544","6017102207808468054","16462909145101625981","16817820756441332465"],["17547107942892602763","3980087712124413977","10043782702192047045","15990646700506394613"],["10957471973655752106","17920894517254923611","8809349981382797011","13466760805017713671"],["2591133149957741436","7254134383884075186","11393930944440869716","15264407350759276329"],["16594719484741036673","12446440154204112287","17864847594361020369","13098572677479990052"],["6593870330105218000","2893298859581013130","16681907848494038650","11187863392465375810"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["13331095349834183539","5200830471794323697","2229806013002671075","684249965817681623"],["10018283225431864621","2715197056724921466","14021335622132581013","6770322412821523314"],["11374550231558303759","4554455447075142583","16566358601289404663","14498766356710079187"],["596100735157175769","17563163864655007986","962376839797851630","5815880017268655293"],["10971379178223092869","6239368102096754442","14829578130303123545","4831605635554857360"],["15200591808130537634","14386180224063985240","2936917758911541936","11527942193709584402"],["6712479536976170035","2939288292681764029","415017661585048642","2910743147242148745"],["4198259438477901230","10533749197387986932","12771545218223563396","7331562276962389551"],["16594719484741036673","12446440154204112287","17864847594361020369","13098572677479990052"],["6593870330105218000","2893298859581013130","16681907848494038650","11187863392465375810"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["10785551624963766768","7604380144861200480","14745779387846657187","2038713947127656352"],["15653128380137005429","14540375580067887301","15661418861249631831","8213989725707633966"],["9113202680760718355","16167827883619924749","4835623582936202693","1857644883735541672"],["4310813848084400355","994649443515212595","17926532010005937328","10387622554389758242"],["16167097340521179864","13211806956062144604","2512950587612923831","17137104591060062554"],["15730431034108212408","11857963925071871567","3611401489072446004","4051019614916659452"],["4348566370402169352","8226503907526350742","2585874726872817595","3061302300301170047"],["10853180910064326154","13732175883885398205","2185570986465330583","14455072608547910839"],["3361134389939028107","4605414983999537700","17595179851124761613","7229389409501176026"],["1333685679961366073","7011487616870298305","6774538831323660286","17580926921414720263"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["136429070786582401","1024712993531636490","913165866157039099","14374600303336475601"],["18378328988187770438","7532667589607309159","7657898691444691334","17071627462440337195"],["2003109680616451767","520439788385729788","940876871345258501","17015026839981268334"],["12341392457231261920","4175817911429230090","1016360093446289495","10405927845467974185"],["9127366750975463709","17553658485186835171","14712392107434814788","9186566405553590623"],["6303084174306132621","6611837073452104083","2833094348267563892","671978285396801061"],["4385029717245784327","2016909206631885212","16529634694802037728","14260018517927975213"],["13030608977823089264","12654768054010314551","18325380864683469714","13201776209621771634"],["5290779728158376129","3659454114976951662","3491294625250013445","1289952049144474694"],["10424771079831885428","6250368964565816410","8999844870728118793","12666127914976025323"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["832626387521561995","8006618709470792807","561337818766060198","12942065098299812962"],["8728360682039316247","5757723789107040438","10658297585820359560","7581349901691535169"],["1554560250814412275","18014575449008280462","14184392165385294764","4986069387722416679"],["8035053256529064261","15462098119078495411","14638800721337866421","4946254878630998384"],["8748636585398206754","10757022528479942763","5662242105105351436","16136594095728745570"],["15676788529696573272","11774155880134087246","7530639406968585880","8051343663285582201"],["11557518670450684708","9825074109593187784","10974386614165720359","3739529324553646924"],["10198106225703895332","9510525710787478523","14047066069939811209","13950219197175246998"],["14151345286351986508","10175994965981525725","8763684805167112814","9993762245136929787"],["3644496101985393664","13078568604745987053","9159102791433477021","18063424109130621850"],["14792281578764844923","10920962327962239707","5879239644389174701","5611256157845900910"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["2055643003945194508","10593838794321338187","1575176787898626727","13387569610274606869"],["10598239636356238367","11069659197858382277","18337905891317712572","432835491813890369"],["6623901779279812024","18373416287572671165","15794854670352815633","8496602797577997862"],["13420955124174431960","8650824266004285943","13724193307881454156","16951323542041594210"],["14710338030247954778","7966748919578967417","16886682173236053438","10857857618950753959"],["10040340789798054649","9597289964043511749","907774863919952080","12286694709043952173"],["17972454083829061778","14582955259366846852","11436437069031472478","10224944833311878759"],["11174690744944780950","15897877862382562539","17704251813411576532","8308715090818457466"],["17713937184878803017","16169337877269688272","3725507519026771255","1657056817606993975"],["6593870330105218000","2893298859581013130","16681907848494038650","11187863392465375810"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["3586610432074750064","17207642995864060790","17000404512114975067","14509885179285873517"],["6559500746084986577","90994194441187961","15775027577545436463","18268250794529007647"],["14662328285924111895","8419545569046950773","2219146760860920963","10027556129686259263"],["17187350450198440900","3421866128832216246","11426726561394563616","16019643945949092517"],["16725850449138012051","13804223698989100020","8994098406793164361","12813645684996345632"],["17493235255413574747","3104292071967829120","18120292377497719765","7323529995594760894"],["11611727482929409344","2756153371514400564","8060583157661702606","9374318203380711199"],["794084793711830179","15108232664468532139","11743313253321570746","2143586648420185385"],["14263149424056291592","637744133280831406","15047546752802532524","11815365376120718017"],["10424771079831885428","6250368964565816410","8999844870728118793","12666127914976025323"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["9493185903124629917","4911280518144826556","10395761347453361869","9959702800257936497"],["7916164107087973422","16315488985484816421","5241291687405313644","14426788865042268029"],["2225237238481150069","28602197807187360","142328517971020468","3019197518131629666"],["11169655782885490779","18074004500821824180","331086096102124378","5188998291137142613"],["12201976249752716544","4497723856639505055","5864301652836664612","1671974478519458"],["9056732016490476754","17329911351836549863","5704112863922720618","4776389004261769815"],["4348566370402169352","8226503907526350742","2585874726872817595","3061302300301170047"],["10853180910064326154","13732175883885398205","2185570986465330583","14455072608547910839"],["3361134389939028107","4605414983999537700","17595179851124761613","7229389409501176026"],["1333685679961366073","7011487616870298305","6774538831323660286","17580926921414720263"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["86214273370838505","9973908717259699163","7803759426480448245","4778362517661715275"],["1556916358590505285","6450158377687979459","7702223452974440530","5939037849647697503"],["1138724866898063973","12173199892167800289","930575079322034833","4384593688497761805"],["15415686044863608724","14268189157855547071","17026673174950472751","6883390606335639634"],["1080144359643746150","17989103693584870449","1337826262833610942","687719796305903086"],["5137841453867838289","5559546033084812736","2685895011601459936","8638081714743923194"],["17999607676345688042","9823766216912638127","15090090266038231952","381470885707058214"],["8651842041197682810","18165491979470085618","3179512170175417247","11295730388308227681"],["17924519013971979028","17187570982864708398","10173941519914140996","3691100086731793174"],["5592430004697072181","18131407151366765349","3602559982011028325","3756758016094860970"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["12909726312938239407","5511671465827217180","12757108550528919832","2328924330938511958"],["11946077624377545634","15503198011208138546","18054381670694327146","5189151176486893743"],["14838806294085067047","17723840235985139277","17356583034561699264","11404240773702280913"],["7410769890215098542","8339648875841440229","4454095237603064194","12130256701136135504"],["12196201669256466351","1308325861886140018","1686731968669832653","4206961793025675994"],["5876405712208593902","11645557473160375509","10516339161440493750","1569165242208896326"],["2005392053410242073","7860313664066677743","9608988044199962389","12950501183170322706"],["9695859936895695658","512010759924365131","10437937482514790339","2717488596790145533"],["17457810991040417913","2616921143447985592","15730219272158111098","17598650871385513641"],["8814157245288540795","4691368749323574511","1399159018997572834","8310217849095723329"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["6270122359738272983","2351002175007794623","9929894434164056598","17063708640539472078"],["13101853689863899128","13508687572729068179","14532646146744757922","4373646654411927452"],["14674127640372024221","4556395895469433872","12736538137592070587","13754430838376698013"],["14579327741691106552","9858645935489618297","8606845531100054080","12301634479027091105"],["4166658517561604216","11867323706537935082","6818634437179558551","3948808809845716427"],["15199725401674353797","3647715051467713047","3678388772482865117","4831217389448039465"],["5260081378922320439","14187927455460327376","5567273502907304040","2539790415182970705"],["13692278243386667669","3857647910385400975","6601203442291631742","11181904269707445732"],["10253205865187723840","15408712031079502836","5040293705518009934","6997744857949903608"],["8814157245288540795","4691368749323574511","1399159018997572834","8310217849095723329"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["14763026693148536345","4013910643666246955","17424983338039359336","15075902701484805447"],["7682958440433087672","7415929261709861244","4579860921085331212","8887567828979178876"],["4010066605327179743","16928138025432494862","1181440003407064547","3085960435670324017"],["13825419402069550915","10611091084346136819","7454838702214452766","17706637939136004815"],["1763815963719342707","3341538303558005086","8238124484591121547","272675618944862450"],["15199725401674353797","3647715051467713047","3678388772482865117","4831217389448039465"],["5260081378922320439","14187927455460327376","5567273502907304040","2539790415182970705"],["13692278243386667669","3857647910385400975","6601203442291631742","11181904269707445732"],["10253205865187723840","15408712031079502836","5040293705518009934","6997744857949903608"],["8814157245288540795","4691368749323574511","1399159018997572834","8310217849095723329"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["9891654289255341048","7103330150936437395","1631557643347837860","17467439985300934446"],["12583846638895381333","5784712514857789819","3319341702427884548","6107553611033740431"],["13728315024202518195","12499979535058407593","13099553033839057333","13980196946396087931"],["15704195621150165892","10210563035723267091","18022493878526912186","13330596910408351199"],["5334062311614291502","10625531568490800149","9025557379305116893","14983631263262039159"],["6619712558616989612","6102671771455004793","9225293583481365807","15378920507065856031"],["1736878977617153578","12634920087567550552","14414104120191633220","16896017637847504178"],["1529959934041924340","1567435077254535061","11933513175846403879","6161480788490256412"],["2366794457686279604","2823495724310430440","14719407837139930127","771778038414602423"],["7295245279475975382","9925197287491668531","7073065287530347635","4252282888678665903"],["14792281578764844923","10920962327962239707","5879239644389174701","5611256157845900910"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["17137963747559512834","8938004311575896486","15447058914711017031","14081620335566000026"],["13871706469500853888","15242817570009543591","11590834461586524702","12981312293740084208"],["15197978857662992737","10643387276464160588","1854149899093565578","5784549482377213313"],["16430916161171319357","2619933714872330135","7622840683512835899","16855132351157204218"],["796072281829954984","3833636102872676135","6966670533747913278","5080873025328424754"],["6025657434407540060","4166429814718195089","5116989370335233491","12325994816409924398"],["15656625848804248880","13939683639110871004","6873820809730463946","16007539945533457671"],["13692278243386667669","3857647910385400975","6601203442291631742","11181904269707445732"],["10253205865187723840","15408712031079502836","5040293705518009934","6997744857949903608"],["8814157245288540795","4691368749323574511","1399159018997572834","8310217849095723329"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["5793899721993619074","10887368918134120572","7485450254990803510","6240496006608875478"],["14919312153333916623","5932067837507338303","5245235136549513848","10303088952522641799"],["5084098959911466858","15335910027598649257","11282639772998555568","2779119152805263406"],["11807792356486149053","13180538965826814736","13115133191654053671","12026228030721455688"],["6727532130700441219","15467024839899206131","3610159325823160406","1431055117500976792"],["1975611226028560195","9670030954700799295","9350603089663119778","12337088772414336513"],["2497755532520253068","15864635841509570541","1942570333203486270","8945086366190434771"],["9749338330752975072","6188571756244491959","9419802478155332365","14873882032223417476"],["14151345286351986508","10175994965981525725","8763684805167112814","9993762245136929787"],["3644496101985393664","13078568604745987053","9159102791433477021","18063424109130621850"],["14792281578764844923","10920962327962239707","5879239644389174701","5611256157845900910"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["9344756286215878682","196221726191383139","2325623334110523520","798534977082516948"],["10720597393126368084","1758049751012734371","17247675325969293801","4548787602108202907"],["10307468624105413677","6570924009224609649","13858437605964728180","12071558304960320006"],["1836418065104329526","11349455925729244380","3024247087056977352","11045068139263210066"],["8618091304719304182","7589978472196512872","10845804666593503189","1986802509252879623"],["3359539349792567024","12015912342178545050","289094597544320731","2062531298926703074"],["1185823126026358373","18251601651680655766","3011191857361119663","7065999068917788682"],["13030608977823089264","12654768054010314551","18325380864683469714","13201776209621771634"],["5290779728158376129","3659454114976951662","3491294625250013445","1289952049144474694"],["10424771079831885428","6250368964565816410","8999844870728118793","12666127914976025323"],["3041443807013280879","538332430064665846","15527851236059002325","4991941573625648884"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["2617143307543177077","12710990731930660957","18423862624412911040","9683653014913450370"],["7490006967508971860","14754616037666793986","3778789933640529246","17376890030114328197"],["9601131092918938373","9915039846192921699","7709048436888320268","11721641330020554957"],["13454458436747041588","15951650325941599443","1385769418167730003","17752098939736170655"],["12084204978225614987","5434698900979166168","1038682454699544569","15122970101167470259"],["8697869693764923782","16176362794812984798","11912660364264001301","17536770052213980040"],["10957471973655752106","17920894517254923611","8809349981382797011","13466760805017713671"],["2591133149957741436","7254134383884075186","11393930944440869716","15264407350759276329"],["16594719484741036673","12446440154204112287","17864847594361020369","13098572677479990052"],["6593870330105218000","2893298859581013130","16681907848494038650","11187863392465375810"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["16826684282271676655","9649218277011148229","14744235378712745259","3849236376176366143"],["8143289551583258393","5149505643655748541","5041337171751724272","2330876759217696638"],["2668551560896132823","5776831647587531040","12962096823529407054","2739377067035720453"],["5371364208436502383","2007124052419467804","6161357420623508031","15899692871277430968"],["12982573712253084051","5436480104152493596","18034699867558118629","10529401511835730590"],["11145280452417164962","16782188119923612174","2978582438602413944","2484751080274481307"],["7441375941264675388","14220965074987796854","11962124790921716107","17567977747533437355"],["7743288565264071162","17746118137690714649","3514651194309867922","1675300146740483680"],["6459673515608529391","9177370860853745970","2238011886534295854","4701871947474543828"],["5592430004697072181","18131407151366765349","3602559982011028325","3756758016094860970"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["15087123517777042893","6737470861150115658","16990471769713676073","17754087555509012178"],["17621159626377716879","2958893464538970167","1298237381869507821","13479253217726351228"],["10285322327216020663","14641339039089565264","5945661031129732001","13530280169686495416"],["2203449037765414005","3232296988325452084","8978944883534509819","12019824387850886831"],["7017792919770392936","10774535342309590386","8721139070119711194","2584961083039360185"],["1632162959438763944","4841005734452005975","2124854655868125664","5161437223952837464"],["18031018357453821942","6692728594094414944","14880074123322254799","3103574739832978884"],["8368585026486633818","571163925406445469","15978589996756521757","5908081132677811921"],["10253205865187723840","15408712031079502836","5040293705518009934","6997744857949903608"],["8814157245288540795","4691368749323574511","1399159018997572834","8310217849095723329"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["231771687627402509","1891280417597107029","1949738067168129608","9909783767092742049"],["3334313519172666826","764838987615716346","4564146973861377608","10949328679869513906"],["14744324000892903492","17377658649084203246","10420798308471757551","3413266477223072599"],["17392978146108077605","5190004847732351336","448853422369518351","1911506054265685308"],["2687118737571628360","5018788350690222257","2726913515943744188","15681744936463216314"],["4611642109470246957","1863480349260197418","13309192652555485153","17604092553602430407"],["6054201203773144749","11027422913807978281","17352114849503269428","16752891169002162811"],["2305258957600180211","6742456500230930527","18214773144912472181","4677735646842657855"],["6459673515608529391","9177370860853745970","2238011886534295854","4701871947474543828"],["5592430004697072181","18131407151366765349","3602559982011028325","3756758016094860970"],["11333361067434718435","373421711737196129","14926566440176449628","1187479752946886659"],["11921986906482207327","1242364284328953315","2467700871884953534","16009026879318738612"]],[["17816534647881548361","10987318777965756848","16467055354927828892","16984658295764744225"],["10972003172337152089","314732196289466780","6468229531547592043","12614060930574256375"],["15195730823746715167","4402906923087182402","5258994008884703203","13214043318595660062"],["465241316889311672","7307004869983306518","2732847188651323579","2277017367365968259"],["8287237633602961643","1589566304156168126","14515579461858425486","5596659294830098930"],["6532818253657845854","156391412735794255","3395387412777008160","4447091847463268918"],["8947553494368997022","15602889317029799813","906465651917110503","5063224826355690106"],["5362256636630113560","3735062031140342316","14947759726087462388","6171656481727024232"],["15866141288706225806","13891892355964582160","7915914651824592549","3481328300773489039"],["3644496101985393664","13078568604745987053","9159102791433477021","18063424109130621850"],["14792281578764844923","10920962327962239707","5879239644389174701","5611256157845900910"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["2595227489731176255","4138454134446063435","14603930823118860643","9500755291918543729"],["13983587243396687605","11831717175106419885","17059390183475998023","5334213579196155640"],["2595139180495813033","123693143935799153","4507542487126468310","325865292906554333"],["3196653249709536049","15667098548836294032","5691884463455337639","8406140862949206194"],["11513982490407661820","18387379970061600673","1532240635339904719","6936344977369966090"],["6778118531212320458","16971514036193863194","1289031611846910422","18444392041753535494"],["1239596401332084844","2699253855681194761","12036301192655467212","9395286964168964672"],["4198259438477901230","10533749197387986932","12771545218223563396","7331562276962389551"],["16594719484741036673","12446440154204112287","17864847594361020369","13098572677479990052"],["6593870330105218000","2893298859581013130","16681907848494038650","11187863392465375810"],["10325838810410531842","17966708830724171691","3487442038417320052","7449818699035514162"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]],[["7335682539174219152","4660675820158940321","14857302368951386493","7364633457035567348"],["11360539508870795336","17120181769835923126","14155978655345941046","10815132655372139219"],["15366258302451212420","672711031121598295","14143182804595509515","10421352553015724795"],["1634921339022539015","933890563007176619","7832502847788058836","8375381791845011019"],["94552045676493410","12705108416141174160","2243711525031553388","10973979651038780140"],["6532818253657845854","156391412735794255","3395387412777008160","4447091847463268918"],["8947553494368997022","15602889317029799813","906465651917110503","5063224826355690106"],["5362256636630113560","3735062031140342316","14947759726087462388","6171656481727024232"],["15866141288706225806","13891892355964582160","7915914651824592549","3481328300773489039"],["3644496101985393664","13078568604745987053","9159102791433477021","18063424109130621850"],["14792281578764844923","10920962327962239707","5879239644389174701","5611256157845900910"],["5502013909413991746","6050632806865713393","3646946173105141501","11656517960626972188"]]],"s3_root":["676183914036575183","1638937119733100746","9993849828388665790","11008088229967892472"],"s3_vals":[["9520012758583871508","9809229673540129309","9119989241715611527","2588382269850866046","128483967178449668","13114567102017301001","5581408958974455439","7060278402965301690","11207302710857503143","8157370676330875156","2521623200656261083","18112382457929157398","16162179983160864654","14359253179066586432","6552759120358836674","10823143485664768393","12384560891756160706","4435998818557338130","4342778485251197683","18196013468072807313","16150674534854616897","4319223219662854198","12494242262799571333","3236443420957014036"],["8805174081294124062","9245790761141066627","3036234253055199130","9440445806587690641","12962205191438633975","31366321325530843","10220813992964766804","13273350146271909451","17323559719787465675","16359757147083416449","16140451289138783492","573839498120225266","196172315818674564","1999274789432137751","8519031632667247448","3866269780267484366","8828158640994259840","14743718054996248498","14426031456468295338","2223355318136538502","12170042119562866018","436966662804794241","15369531195204493059","12690063818898982449"],["8938321146946222902","5059827258028160622","11417588063368242108","4010177062474433404","12344852190083634471","11490475689844207493","4592922360289252231","17396217263697982120","6210013710378891875","15705226451946319215","5956474644524500812","12223060191983290504","5659667172302175637","5731217553346634236","5055428517349532670","3543398196043671401","7075774205062531112","188997533840154762","10617629007344366927","11143986298034842226","17529711065370739001","12851428674625860272","10897948909260514901","7102618927031830984"],["17488314473072273297","2829402127852861595","3831605313216524282","7928038813384203968","17085412081677674783","12108032983724830017","3943638897999934023","6209682369252368836","1191990513166358851","12643699988066091774","11522152558725329914","12145408721769682366","12534437451905519717","7025849977756622714","7254939273677651606","12700720171996627815","10688506086970417274","15328286328126321600","6499204052974957565","17019531369206738841","10448062863893848823","12794705914042221913","6808734688581194541","1092115289535443460"],["7245430133253523248","2681435040935174707","1270314433246102713","240839010107482800","4175099398297651489","14502999498960102959","6934748630466554104","11551686393949868119","9275592525512726203","671194566771575251","12517330549804778322","14834777802923053980","2321953274892883412","2592526748229052590","13661430660371571893","11310339238937189305","12482850450077759264","8170567213763959620","16188141086923653109","2201772613037722880","5956282797389180851","6275399396637276554","17237373436811692043","12922486075090239447"],["9975690406848763271","5323104469637763374","9658023282351755254","3842868008826699289","17222183009321881185","12935151721770354677","17315190656856198025","8696628156611200106","11937716777686729015","10950171082347307961","694581987354810844","12884369307248094225","14825352842580409813","14812868825200345860","3094247883266458413","9880906044615984372","4974798257712793119","16190197853039104305","6373811946758237515","8190933858543111196","7255134186644463362","10583209882077892871","10595111781416342613","16790488940971113738"],["8529817433275907397","2535970525000552382","5893745170845515483","8578973082913820956","4309329860981792318","8439834211221658208","1292923332075569580","4126110046157792346","4315091310332774849","11463941962921278655","14182034930579645773","11283952468180660397","9843449927108565699","9570157108542578339","14323520119184988901","15419125022702680188","13344955712685589795","13003894018662471818","2530369010227616719","4568441748059383378","15080964770504399005","6533229200221465379","8839968211409037134","17627205355051321338"],["9753172317182841310","4855657847805428959","18210801958791901767","13385713549189865581","16660152354404525908","139212682960749494","16589198532302710995","6157192527148909152","13490717984775416520","7492378417080286146","18156984008275329371","5138475528294775844","5976167785992036962","15462814897734521513","5428646428387324076","2696112392571469187","14065705653341265946","3882995633236181797","14918441888092702354","16422410225171561679","17590726535701539336","1453186235426049381","12288729757716756991","2989928951691195321"],["11659384505510805214","8341207607589847683","1080526581085193125","5744507166063113755","15742987877776978973","5994599724062681559","15947112494730050649","16510818663911391495","16847966004436076411","6152774848998364554","2241708204261889502","10475995883663482869","11762879390359862212","17164335125883455111","10480673641899982412","3898210628381105208","11464419655449916419","6792263425639354999","2627594730775691544","9785379870830516411","17288793473885196970","959316677030370560","1037686424638274071","8966181121509198707"],["16077409283435629624","16674294699592161244","15362759059879297770","7529856555784951122","5710197348572631804","17234331750938119143","12974216314998316577","11080766375432449900","287434437649879530","14782604736922695717","13113564688643135914","287756402826200045","11209600815031313411","8042273428571463923","5473103423963401593","8888724786193787762","7592411389389978416","1134033516923933252","14411304383181090458","13982102267341767661","6319891555512227815","10809954527425585610","2555098969839286853","6650759834080682715"],["10164602594002585966","10982087359205386149","14539884905171777579","11843992963837915167","2494192471948502588","3681573852964019692","16229708451834403084","10350536906499127760","7715699616641610782","14177245378866057922","10583453821214230290","8678431093640652806","3693241903386765150","7792618975505463965","15480301095486066929","5578096896619883243","16712806701794173807","8674671487565013339","15209930378929692475","1715893210321594415","4286899979594730686","2596067166878502606","15089717797274482339","10574219948747027924"],["8529817433275907397","2535970525000552382","5893745170845515483","8578973082913820956","4309329860981792318","8439834211221658208","1292923332075569580","4126110046157792346","4315091310332774849","11463941962921278655","14182034930579645773","11283952468180660397","9843449927108565699","9570157108542578339","14323520119184988901","15419125022702680188","13344955712685589795","13003894018662471818","2530369010227616719","4568441748059383378","15080964770504399005","6533229200221465379","8839968211409037134","17627205355051321338"],["1502610691901452156","18392429241390320777","7799004929586588519","7953209018498790015","1792215343643385264","7608354602334610068","5300253987861078027","13185610335585594558","414232277960549167","16578609532392909440","11503425561028973342","18174115137337470708","10373786004948549863","3119446829115783359","7385852857107973593","4899221479758597587","365827056959173280","12111984053188081630","3543542871033955470","6206281556332566498","1102681151355961679","18010010738663575957","366429373881605992","11457797764596984377"],["4672622811455721889","3829836154745725511","14114336483111187932","16269457451238160922","12335892099446059394","14891691791560077225","9676385413286123111","512108844959679470","13885507380848071805","11793065437573419066","13206534859737878343","6706052412559120135","11642638744778745959","8978413213062960500","11377974118729617915","11103229023249534849","2954297723851851176","8413114747681884402","1154027245793183206","12465766837997700012","17286080946545611704","13814631853279624189","10877154885413818793","6916654051300020703"],["15465483603305752653","15344337277177880413","7184540090210545393","5619554377035509243","17795464143116033901","10881615431111134758","10569642588668642363","15226763636251997051","3321678017485098323","5894335207626167252","6214094802082535257","15237939330782795307","10725352503036162959","14362533771511896490","12155446104541350598","7091905477230763641","8963928576928770059","17714293612751508710","3556801629308655800","14785743593824584584","4742733311604108805","15823070925321834586","14985643094826841955","8964676023462066782"],["9598017906644413664","7744939375241299208","1939190353909434954","15189546081354949591","9758625787971869526","16609270390832854478","9679935822870308614","2155727916065976042","13972743224713584438","14392100790792521186","11687749299641847447","13962295722904921385","1109175565353872131","1681531344762243996","831308422965896659","6656464722112530050","1858912713921121255","8292374590431404852","11473543277007934809","207927577361053660","18032997603050516126","10175473677274999691","11903717452566010912","15546083885876023544"],["4176816120017310752","16259479409606141277","8389749435744201421","9551172504953678323","30628760120324432","14040231171709394181","9015290301328827778","4145554273147008693","9140634339918462201","2734688366748068747","15669362655134161486","9335514381973460303","3594839870628759732","4675128998727496193","13392712303914332953","6002046103269926531","5853249569330721162","8269179839778668971","8315030039260157390","11808754945026229214","10957148879872780383","4058204489843370897","10348536161378405537","4981263754987822126"],["11200980034058726645","7091435216717302342","3789038914062184620","1390511826309974863","13492088431726406523","13461665629413043496","6657005769794921825","2427430528192087511","10770821658123372520","7602319360492792688","12913584497059643065","10951199013588534963","5587586050934690299","9123111249580474985","14679816229281691221","9549737043833972085","1589316820009971748","17242156111456763014","9794380491015130235","4204679215412476908","16419593465963952834","2548149039773398156","2534603105586001347","4053423970475336571"],["14650831939856430146","18260055196300171116","907715669736520524","11194066513554196064","2057445375361683542","4912264404603862174","18147972495271988897","12910586106608384851","6725450342742239325","13325609178754964291","5524460603612873849","4108698120041239105","12982499793949778987","3512223102832244036","17646149186609984274","10531587362085369304","5011198214107663869","15829620773107050660","3549975083284446964","11260195668950309306","6934345397527502923","18048324412868729126","7663769027886252877","13079268842461464068"],["2362965694599175483","16074648400000371366","9207593433073091782","9933251385805329022","17597471528616290006","5587037225270027863","2318659665247522052","1249645822525835450","272595013502075581","17498292323184353324","4235055710505865700","6483711902248388460","8133556889514104348","13851037461883398733","10881586432654103364","17811165635267805150","5956370304285060934","6294943772830830329","839201175559931361","186840680484258488","16396396559696657689","5894294975246020563","5519927997812929300","5679281197972871026"],["11070564528445997255","13179224604286639551","15853329750242518612","8490845146711235382","5772436450202562902","16214060392081042578","13747078261824914467","15269268473383353163","5382158290750724834","11396220557982018913","1624557659046256309","8849936393177421795","3459748296099250847","1254351900795730494","108532624332030277","8867553460951189214","10069877868147603292","1747761703274717422","7432385530252649358","15182107530980496766","11826234310365667284","10634355205468940299","17220852793341739758","15972346080767454593"],["7882426471512291598","9987900270295977579","14016091320113263604","13343648771372489675","9056500266416348848","2199473715153065308","10314906583158002610","16424309601082431473","499039570058047740","11313728910689160715","14359354482278141049","5563969641481509992","6841499689500889633","10101160012559981117","16748564691161417601","5804538000406987852","18056475128957225282","1550297732066984875","1691251636303317766","7831918257146800669","3811506697951071460","3903812765787391521","8376513158262853954","4871822359363389471"],["13888841675196898000","2636933505721278137","9885536018495795049","4281761016503909020","13531818992583092335","7564552391988408018","3420800323610754160","14156594427500465576","7258819639944780429","11116472003939696529","11128440403850921011","17349848778380292371","8806502256526561244","3269568259546893486","1039350530214741774","3464082268815084272","15859370646354208701","3028648141857627241","5989952340028804486","15166860326239053787","14735642715012783481","17618541751263541185","16202072475182231278","11901905519424062262"],["14077293146041626320","10815737170415379500","210132233687839770","15393988175099273602","8266125242027789364","1151601235325583915","17834213040107781195","16557236497104141407","4879519240962383585","15702251841112751398","310573669072246751","2968310883487772673","10830124964402056299","12883615333586452913","3329494731826160782","6365775371457227239","16378378782133714603","11631982507257443506","11630190191153968337","10592044071005595571","8390232959401496360","15704370569928268000","11405429941674702976","2257877179319237723"],["87881569329728643","17833041142622097432","16773586302490346789","8462455494478588808","9298576204153304625","3433394552565152364","2357970275339520560","4111776441280650193","2531672949768517217","8655792710152691532","10062786230213991587","11482813908020422495","6054808562974406325","8613967512945277138","10039850451095314007","10909614562060627451","2487536148221989123","484282460349505073","15989007102550550183","17095866802811351892","7594712458345643388","3622589133155635582","4336866402016235897","8866226605415147246"],["3015917773103285034","16360953217026847406","5157933159035603662","17131014783854194628","953520179125341818","14839332456762704019","10054822369774953753","10235773752891365309","1864763527385890670","6719455053183367749","12187294220365219982","12049557785402575632","1795627602453964578","12988883328353085729","1572264528316161681","3976995130964264101","11974032973181246389","3789721444090074466","2878010337259783947","2326602351265688677","11928157475983161759","12188138030174637420","16725164435017448712","9203924430927285863"],["7926430939329270560","15378694691325992748","14190928521249750048","12058452349715354137","14144999330313669834","3647163063018604240","2598925659876762813","17007767401566001856","4280005605279182474","10516776776842240086","8438110574614722065","11565473314242951031","8656249361670827154","4123221880544748321","9491148279582721526","99078149802660199","4317642451956469062","7100653795104942544","16909731481991976807","6077197190266128536","13806759440629243046","2587508069644839631","2846838359561903972","6949064128850205170"],["10132890232049627908","2237493083740416177","13021122681107727146","5504610123616924445","16137131952452738476","10630763610635779898","13335660985458095514","5429022038447973973","14442650232025766279","13751307727706434667","1051586959356515232","15271817397603042462","16132147722930650112","1635745460597444275","6515035693057919763","903509552924464945","1048926625112299134","4215933128303131119","13867540276873379477","15567676240290446315","12654266124294980615","16177706037383833621","3486127777574656689","1273692649679149756"],["4295625686383677461","14757314554670345811","1224788138668573375","957679726394560934","4874946691177872918","5252033578146598170","6780900643760710009","1211236112171546707","16083980563748354919","7639038026495451003","7870861901494632745","17568447452241008483","5039479774751467133","8901841725515883903","17411213246906128635","7077668819709414654","11521933871875586832","10168938256983717392","16341537352593826756","9070311618734679725","9365357083870399718","10268401289050387962","4270523720225455407","15656534240066485250"],["2083308476698290328","4970284102730725778","12978014266364507816","8306201120254966824","14570943027828724071","5017936568505313","982256356520781170","16875622392417442765","4739141711106928093","11671627884996581677","3420091562451078758","16817615304686280994","3054573865543617790","6374163354423548522","17481592510084745781","10969861511080441609","2930028922426768995","8333273959479141210","8678426010523284703","6514796394005894823","947191837494914718","6988695732276229267","10372169468203563629","18327702543095950935"],["11498047626074482531","10000274764458529687","10748360761005254231","15070083726223625422","14554752635672588873","15841118132926469111","2229861853040012229","14404168961502882561","13264814424436320092","5798795808049332423","9772406050216399389","1222312891555993968","6724930468477522809","4059189583346067602","15746436514942660458","16290764358642430640","11612889903632389132","14201823569390344872","10998722211797689413","1531955889416287730","17790469737148722180","8683598171471122680","5603877552617237925","14542016913702203313"],["1580522227058660230","3280234062655926939","1336507179062634644","2032592021348355307","1742270295512553775","3022270539730002303","5195760920517920218","15696554148818676055","13520640435624514290","15362305185281166479","2551093654878559853","136106397225865434","9470044483538351364","5582996001375241350","10020743167022043386","8859631303598877146","4441104672880562209","13231941651990051261","4044075311495844564","5202516336773703196","7944063106663116356","81876197328871807","15329160273789374817","12875783547603238782"],["13543761578672683916","18155736913111178280","13053508525642983210","1391128261212911709","17999781822675832839","7692032353663956467","7257755497965249980","10201585383170470146","5190291375165223456","3439551222582907260","5019141609185675650","2394177670572910317","12249411602008793326","11522009363074133893","5584534484609859899","6843754137296029939","8827075645071499730","16017941437980652967","5622681189130914094","16673402377060930724","6759417429112299937","9180133191609780012","5661154237849455834","8582318084425754382"],["7460508098287634492","2976698743878762487","7868826515842022642","6627549118136409434","12528756412277838654","7979526076029265951","16702482594827466085","7140181235473604611","12160069923818330813","55163384046185224","8990480938790678673","16294863404361308282","15298140007827884506","11713050016750580771","1204951268221063181","13497310053644165907","4985938564403165818","11494927127376901812","2013766425929920407","2927782464305421246","9276510403773625911","3004131453952802368","10261666846232674613","13712706255239226501"],["12831292633414871127","5676359356154289949","16586599473528385874","15832576624508377738","17627710210268365009","16178570598622960620","905854351862216654","5181316695767275737","5583782240514218976","7441330583580394005","11597210624110588377","17740744790089527058","8670607450218641905","6524929556267735794","3504164448016826905","3556867727700877825","14918526788224630486","194882278708201733","17773700615109524071","2717273386730223641","16009845925891984774","17428547519879108920","11862088175240596505","1099083056960994593"],["552074273753141659","6126256795426755804","2705624571130244554","17118932945065734581","7137209736408399258","12835156786161325496","15212473796490845989","5602223994111770053","1955188486653336604","1136201847820639734","5380938517877565769","5908501314833579045","1133307039180760812","171805001722056742","12851003689163661515","1453411180062603812","10807339266316060026","874259491652308163","13800204915129035403","15334523512625533179","6216377657105977867","2167477684626716944","11778169683180246317","14791748290312663635"],["8342312903275462589","7295905059847652637","1635742590478444160","16938289839434508427","16889057004288483986","422724718937558613","5552472360370957849","3714680483645079183","15124117758153160099","18306975868065988654","14182956793881155941","17541596514220806931","3544563559159369501","3216439307873863021","11103491062196242607","9813128943346524377","5883703438372607668","1515274225942228572","17449967753026163096","1666602772039444954","1827326523704115269","11978480532560134601","16654025506684831261","2885576331584007460"],["1310106761170327831","7174643700030721136","3855125676033657530","16719012128845473605","10144757152283411967","2719343075009294212","15213516597766855056","15811352795685646151","13558097984735727355","910510318175561368","17982434597676715978","10690853306546249672","17957676660166050520","18395616724283629934","9587886435864099161","3111081498045299028","16726974973859892932","13622900248270499240","3086838860219166460","2895523566304742139","16950418010255182972","4793532345619798228","10085399874256701827","5226875186026297336"],["12211180273875855068","11248781534698940827","10565492707502200281","5265853663970229059","9372768965994209576","13898042553472802832","6843643230877260757","2113744528361346569","16220131799633031889","17697233677639092565","13394650695155738560","331925601280480878","3960390169827649306","8848303963962504423","11875566508302129900","5899860221234606386","11445681850432142673","11426211769319761937","215550593805214013","9804931431824137209","14400426740807962576","17199447249958355942","6838099072916463745","8749394283947375842"],["11482584099755158670","2194534255287338313","9317913472387137676","7408988258301399171","11685012203461519589","14951453517401511232","10068410926480191139","4280189307328370251","9422788297736976913","3189717806072991172","17279779299643600272","3780917053355528268","545939345286550515","15755672232876598613","408029417530553986","12368721563293352396","14587226139423133553","17900345133907837270","11950388280856053487","4902630630262120981","1286164165188331928","17371066205966315166","5713226167780453579","11329259767208973513"],["15918104117515880258","3543485252133644928","1040478555383203228","14295634326745379257","3070015877296028519","8718274846233530368","5152154232775947142","6682141444918765497","11471748210600870036","16377177040101809644","16465351720441337392","4990875302183225522","13629554213833770389","16839577460391280884","1419471031839947577","18140228088774874971","10945053777580431846","8289598676626557324","4807458808227790704","13351077611806299002","4393521306825941559","3209710322805851284","1078640793931638395","2170523339446398082"],["15176384766000350980","9381139166056963806","16275940162824396856","17327223117875796489","3579229300864957410","5950524883825500583","10253603222033901274","7614742147688755676","9409974190655101990","11675489210884752003","14874412655048201011","3709740778703180532","8964698006956611048","16335084892565095590","4307341807517424079","13070975789255962023","1026113325543573991","14975469929267387760","10185053786317875972","9833237810757835883","10373683464225570637","15666377606877557493","7797470825289928920","3658768885676678870"],["17660874141740944705","13534564448002645473","8596266160654039535","14531887997520582260","13635351691945743911","4502093640708720256","16316492312069099377","14895633517057275868","1096442866332328630","2764953792333227457","4112272830236793463","17644777824535259104","4728038135979797646","5096677568546490291","2258521733712928614","13183447094940107039","12751472840044803495","2442638419825277466","17712124315170694007","16168297521415533817","4689226629724901584","4999814310673049678","12540622373012148339","16315928282665856578"]],"s3_siblings":[[["11168733041403993435","4368081763303665837","2412150101515296885","10403984830898120813"],["18137002066021027675","3605755179089423587","17708121378722991462","9102893690988879949"],["174394896349578960","18421135458638413069","11391061548025707600","15186767275631591616"],["11932574710259516178","4755380094975785539","11644125348913731886","10830599829257718354"],["5232674868292478046","8693830015485313174","14953775528082760425","7188126122225591282"],["10445650185482899153","2558955377310260844","1942884157587848050","11165168181749282969"],["9739574280558055517","15043447694986944677","11636923091601905832","2365650092009695002"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["1942469323283871176","13875831917854305618","3468756034103068439","17266657757736064985"],["17191938292983378188","5216813772679798897","15443231079194895138","1799172478795117927"],["6380720846142070203","9242754083379031183","17639236081509281926","15220055117335736530"],["9740607126061753687","10659877598655214222","4885854350910604254","17646888627892759562"],["6950244277142247694","13515519284179588452","6182899710623878517","4622826097292329810"],["6340444869188372640","11297450325170158255","15517672499008557231","3780128528119918032"],["4799346614871623804","16837489227572482934","9406319578961103600","17010839360013053001"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["4340259024932187048","2754522528855969036","6588178164904165565","15400707860953833912"],["14527729477499236531","1182360020172043795","17287800503556853823","18008397832202364200"],["6665721403490318986","284106986477048032","6605925301604999933","3725891688856672338"],["16574938363243300004","14227704272259973094","13284134871336134883","17397700956573145325"],["7910445235360839363","8272133276152754757","1692128742937055057","17751364977564056737"],["18092984936794502102","10691044544672161235","7737368167817850969","4408663984643599563"],["6157711554957237108","199864477268291837","15585457279085363473","1103053204888264411"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["17590730044202783140","4860762617559433904","527250607711923390","2044384705569647759"],["14782655311723203647","5701214132065390860","450292191258036081","13707600229202796138"],["18025862120313454547","14338246608348433046","14168443938510651296","873625026547397411"],["5587642533919910600","8208539107346335559","14591389315004491148","8773829230279969980"],["1677696497272035065","3688589819153261240","11942847545650710796","13207945418826960927"],["11325736808183053101","9480667077771078358","14627641033944171505","3421554605306198042"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["14002316486018530312","5216972681925821969","3806185723595065913","18226302587130162394"],["6195802065145790292","7475345416361821534","6185713902864181485","91884766856794361"],["8053576911329205350","16267642593703240278","408990289903887577","3505763980210750089"],["9222857869668311269","432519144408063839","5291839865018638550","11401472594433397466"],["16892309994257658168","4000905072274253602","4375055417638891384","13396198490164767501"],["17936835048106359384","11769775116512187645","17652863962599793543","615303981836485230"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["16665242252163411016","7532096719989443452","2222359077665676332","12785841640522195601"],["8949427429961156109","2918321354967779262","1801661634736224080","9860933457133328196"],["2973180618734688350","2884039473316597741","17945066638855457759","16747897569394948334"],["5076829152077900635","6895137624608730272","6487089867604014710","9272800406488050171"],["11171339745678253174","16303809445511452189","477773196709123243","10911520548127647089"],["14895507780242108208","18224015989204158423","1051623656107978975","330518409551588800"],["4799346614871623804","16837489227572482934","9406319578961103600","17010839360013053001"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["1661205072616694644","2125220776978525721","15564721834330405423","10352112108086002788"],["9242960006181251738","6930258624926281317","8761278507948366416","7069648596783244472"],["474341876147211011","7308625804371984835","14515149562175583988","3962754364586088916"],["15709605041230933120","17894866467613538769","1066959459684901059","4186112158955624720"],["12408863037924949417","10524048065834895616","10921907786212672807","3261723025406238674"],["17936835048106359384","11769775116512187645","17652863962599793543","615303981836485230"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["11314222739168140461","2776917548720771504","9734371550081038574","5025519874008355344"],["11246044134808872444","18360981933530643550","2952964386009131991","6958574028176106641"],["3244837086602269655","16568783743805376653","9515477646106449759","9421903678565276327"],["15317384504512865065","15860936795016226657","565853969162965057","17533787449757083504"],["398404038676773951","12065502885545947566","17950853401885060083","3758333154172960295"],["2091000423679724054","7162656917256966579","3768519366445466290","7494973344488431943"],["6157711554957237108","199864477268291837","15585457279085363473","1103053204888264411"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["16807210746160942523","6018648234177168685","1556892996987581307","5754497935930076895"],["7389145956214261963","4409460162806697369","6833378628216012055","9594031611823740745"],["6665721403490318986","284106986477048032","6605925301604999933","3725891688856672338"],["16574938363243300004","14227704272259973094","13284134871336134883","17397700956573145325"],["7910445235360839363","8272133276152754757","1692128742937055057","17751364977564056737"],["18092984936794502102","10691044544672161235","7737368167817850969","4408663984643599563"],["6157711554957237108","199864477268291837","15585457279085363473","1103053204888264411"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["11412862870762969623","12137093170431803289","2408443683310165966","754028057567856125"],["14632754373764104912","10977005343586977023","14236395950578098145","14848169466246003323"],["17470814238566760932","13618112880886668914","4399636911525127623","8296640557848282854"],["9640002430207341175","4621521742386074614","9682390340489162266","11039413569356482026"],["13531068431919719031","7810081551848617779","10239908019329413126","17761587429209625794"],["3416453237294773837","15077705113560668929","15892796157302745768","4594909671587441211"],["9739574280558055517","15043447694986944677","11636923091601905832","2365650092009695002"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["15742891666997810575","10666533562375025006","4989296882197621314","5407720944368458264"],["8323228429187574507","6683952918143417968","7424102878494929673","11537520369101911779"],["6369452367469049882","9103663441480849292","5599238321139999535","11916378239776332526"],["2603417006196861158","15592880229074072339","7056937766780303049","1231731167725928384"],["14986974113136259403","15717990795149277031","2351907731007682793","10910688787504046347"],["6340444869188372640","11297450325170158255","15517672499008557231","3780128528119918032"],["4799346614871623804","16837489227572482934","9406319578961103600","17010839360013053001"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["1661205072616694644","2125220776978525721","15564721834330405423","10352112108086002788"],["9242960006181251738","6930258624926281317","8761278507948366416","7069648596783244472"],["474341876147211011","7308625804371984835","14515149562175583988","3962754364586088916"],["15709605041230933120","17894866467613538769","1066959459684901059","4186112158955624720"],["12408863037924949417","10524048065834895616","10921907786212672807","3261723025406238674"],["17936835048106359384","11769775116512187645","17652863962599793543","615303981836485230"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["4621100926194031353","15794140859209111423","13350789715589650924","15878106080815391252"],["15397539421253633135","774589950654494894","15754790428112063527","12793549593155897261"],["17462258600708459389","17104614947140831221","6570385598624860845","8955751700528223668"],["12811931264641235904","6740728306478192750","1019433276164244846","7020593395681764311"],["3467030169342694939","17756888228670322017","5010838748638466535","10633324972586670323"],["4349995300479227128","11132093740295737157","5199176074512137449","1958736119011791095"],["339209644035721976","10830328966690634440","17751220719265155844","12738890017164283934"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["1249258148792612087","996805862506253998","7961103198135302219","16547684704703744926"],["827418757577456863","12356273462780739016","7814997013088723857","6812569658329564603"],["17457447119496024754","1491914591940679646","1459512217312893667","3184492513627768937"],["9816514323421659505","3625450784968772899","2741970496736891188","17919953786043424700"],["14231553907134382654","9842132358979358971","7277593524543800825","8848279262164604899"],["11457385264753969674","12824496183216306566","6721987974731827568","2034090868978978231"],["6305929612527944037","806529519812027232","7291110954827342269","9086383500481190046"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["10422896150992732024","17714392685803734565","5369870392217320003","8124376040853328264"],["17983070019564365679","17157829858232275745","5409075696045325593","6131098836379396413"],["4536710026455000422","18427179621421846741","17423500097180585705","11109078880762802240"],["1586808316309215629","14011156179210097319","10845212984171912214","18332124749104425241"],["16892309994257658168","4000905072274253602","4375055417638891384","13396198490164767501"],["17936835048106359384","11769775116512187645","17652863962599793543","615303981836485230"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["9826747667821711141","11006309267901434225","16604827109670818321","9053613164086570182"],["3416529408248582791","3157162409003829229","12284827677655703740","14024202293390430309"],["17390502899595332553","11087343549255805802","1373153796884328495","14613832106395946790"],["6606280069934380510","6382200125620777962","8249046843934904769","1356628870024644365"],["3467030169342694939","17756888228670322017","5010838748638466535","10633324972586670323"],["4349995300479227128","11132093740295737157","5199176074512137449","1958736119011791095"],["339209644035721976","10830328966690634440","17751220719265155844","12738890017164283934"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["14882756113869028160","15901926826789397375","15788070040566535903","17449362439690599195"],["13224868093680117489","7125333169118462606","3808897991428589020","5880074935685724582"],["2250227255747314063","2850345802241875446","1518808036523185619","11642183330094582870"],["4244684265665412325","16372849419978238566","11433278067556709985","6987154596369807340"],["5671108938311172897","16000169733801551557","9817554818392301341","8296934218213927053"],["7333313123524850472","15141749622039473281","12564850984513579664","5719943269386379552"],["7098882647377649958","3879791418941135869","13084779982590914242","7674537013475056323"],["11099053721646869229","17976599926946351094","15830741791911358422","13536439290312057038"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["7427961203045771307","9073871814291973278","4463843120767485460","16791661838554450991"],["2272674358710846133","10439219044855348385","14589890716864569144","12561807898331600922"],["10479864908610102163","12985141175756999795","4674717730192268633","1627332870753775938"],["4244684265665412325","16372849419978238566","11433278067556709985","6987154596369807340"],["5671108938311172897","16000169733801551557","9817554818392301341","8296934218213927053"],["7333313123524850472","15141749622039473281","12564850984513579664","5719943269386379552"],["7098882647377649958","3879791418941135869","13084779982590914242","7674537013475056323"],["11099053721646869229","17976599926946351094","15830741791911358422","13536439290312057038"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["17466900577292821903","15313273720322968065","13969858823588414750","9779352987248014643"],["3823171551772754309","12444599152530477508","5324239230842851162","11345250905763653878"],["6526698003786546576","680925826106153227","2435352727855933059","1672219064496446443"],["5076829152077900635","6895137624608730272","6487089867604014710","9272800406488050171"],["11171339745678253174","16303809445511452189","477773196709123243","10911520548127647089"],["14895507780242108208","18224015989204158423","1051623656107978975","330518409551588800"],["4799346614871623804","16837489227572482934","9406319578961103600","17010839360013053001"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["8956686807344061174","11229721815105337405","12507564544023271682","3782936347775644090"],["18344612872873298336","10415221354895910562","9494546272120355299","213488248990258479"],["6380720846142070203","9242754083379031183","17639236081509281926","15220055117335736530"],["9740607126061753687","10659877598655214222","4885854350910604254","17646888627892759562"],["6950244277142247694","13515519284179588452","6182899710623878517","4622826097292329810"],["6340444869188372640","11297450325170158255","15517672499008557231","3780128528119918032"],["4799346614871623804","16837489227572482934","9406319578961103600","17010839360013053001"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["1812417568054612564","7057273628245954721","18139425912344566876","3592689595468137468"],["1102471242174051814","15935615445434665704","14783645198710117288","1021471692957819960"],["721821735148074689","14995963792416101521","2647084518416361046","12222107700117122172"],["13791971828137482492","14476474898985325828","4048331363018124342","15817025188649245688"],["8413367136894012286","15389729397468423353","1842899692581034667","16887410611126338704"],["14895507780242108208","18224015989204158423","1051623656107978975","330518409551588800"],["4799346614871623804","16837489227572482934","9406319578961103600","17010839360013053001"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["14151405623804433130","12649099438848527182","237283813747169197","6536752584508665403"],["5985430161197196097","18428132113003450889","17314856768329433197","1477030765430078920"],["14008536733069783902","3090728260145602183","9722910200395420509","13437536915570451197"],["7086641656599337655","11163597909059799072","4273751944793207551","3366699342019597983"],["14231553907134382654","9842132358979358971","7277593524543800825","8848279262164604899"],["11457385264753969674","12824496183216306566","6721987974731827568","2034090868978978231"],["6305929612527944037","806529519812027232","7291110954827342269","9086383500481190046"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["10680345171664935697","6802091391970524781","16828565323312991280","2497353944210369729"],["8992510539703409454","9263800966199715514","13091535067622971659","17531013199786262303"],["18353503091043001954","749837981706209872","3774100568730971813","11413128864239797974"],["15709605041230933120","17894866467613538769","1066959459684901059","4186112158955624720"],["12408863037924949417","10524048065834895616","10921907786212672807","3261723025406238674"],["17936835048106359384","11769775116512187645","17652863962599793543","615303981836485230"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["10872449043537007871","17452543523582663098","1215039174402322730","5699541705107907528"],["18286204956386738523","8928390623420756472","3207239615275294691","4005099920245868017"],["12162298479299788272","4101584942305169463","18253275178562140412","1339828666026131819"],["7333189424566966993","6779517248416349874","11946248277016973900","6739743255521114252"],["5775889558846215514","8344585387359911583","5719350318822729454","563185128692073491"],["11457385264753969674","12824496183216306566","6721987974731827568","2034090868978978231"],["6305929612527944037","806529519812027232","7291110954827342269","9086383500481190046"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["14353831719073476785","278799301955995648","14252627703014311615","15620639224476099425"],["6847767484500016009","11527762432674953749","4136711504203785086","5847739875802939236"],["4495239156573363220","3842173786038126018","4116801545223168440","6572848150497877583"],["16196350077625523452","1076038516306179794","4103221278067196155","5182193501802957380"],["17230406711308935755","18190507844621809501","14395112409592791112","5144112651233902436"],["3512994172871562549","392853630645707147","11343577669291300886","6360635589650419308"],["81525919476454088","11059383481710693292","8943669476375663536","10190740240288455645"],["11099053721646869229","17976599926946351094","15830741791911358422","13536439290312057038"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["1289505233982387724","9191225904017579607","2777121932857823690","3004705648340901398"],["6837192040333291038","8526508472325616368","7474365916234172613","4731053689437100442"],["13676484792752156765","4547245833122506770","13148668251323297733","1513996868000816260"],["18023048332640961114","5101522006267367173","2325983600685564664","9367436224574663623"],["7910445235360839363","8272133276152754757","1692128742937055057","17751364977564056737"],["18092984936794502102","10691044544672161235","7737368167817850969","4408663984643599563"],["6157711554957237108","199864477268291837","15585457279085363473","1103053204888264411"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["12198525660539480510","8637474318883097860","3414403671509505507","12240776243633599244"],["233077700396743952","11137429726269718588","920208985318196429","394023977886046282"],["13855672666052339244","1796089002258101399","9341983452791183495","13461442603957992326"],["1021394321494005703","7295066623418538048","10022703551553954644","7083647692204249670"],["16060175294771829891","10159662834199239375","9003558179848822176","16659085218715961703"],["10116480561847673949","12493400020107673538","12791369106785893127","16078155192173941699"],["7098882647377649958","3879791418941135869","13084779982590914242","7674537013475056323"],["11099053721646869229","17976599926946351094","15830741791911358422","13536439290312057038"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["3028222026518938595","14895079296710752762","16872989693092989718","3347839552849746453"],["10755259916781923727","12274795832024004228","16486381258167271676","14736907416619606538"],["3655918804364641986","5288678173335216231","9013470517793323508","11921035601099808247"],["5587642533919910600","8208539107346335559","14591389315004491148","8773829230279969980"],["1677696497272035065","3688589819153261240","11942847545650710796","13207945418826960927"],["11325736808183053101","9480667077771078358","14627641033944171505","3421554605306198042"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["18137672863089055179","5881229722164876996","9314368536267333370","15547570395485923327"],["2455935845677694037","7068073318513038773","5144279104235093514","993860907638116322"],["5568320901346924731","7908408262977560486","12331437551864336496","3916158680201159987"],["10844004531225337848","10685015277467527599","798186131466567401","15668131091821230977"],["6735688200514316960","17977152933155783901","16397859409753724659","7188692899789501482"],["3512994172871562549","392853630645707147","11343577669291300886","6360635589650419308"],["81525919476454088","11059383481710693292","8943669476375663536","10190740240288455645"],["11099053721646869229","17976599926946351094","15830741791911358422","13536439290312057038"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["1786679425076553934","16555220849371746986","3131451162643570671","4018180400858579080"],["7023001019366247297","9822218660199336533","8575817734579577183","11015644737860620911"],["18108187503250658203","11123786400482843359","16143800926545784809","639548779828124057"],["2603417006196861158","15592880229074072339","7056937766780303049","1231731167725928384"],["14986974113136259403","15717990795149277031","2351907731007682793","10910688787504046347"],["6340444869188372640","11297450325170158255","15517672499008557231","3780128528119918032"],["4799346614871623804","16837489227572482934","9406319578961103600","17010839360013053001"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["3155175242508666001","6597773347223345176","18303002734198851091","13463670703452906238"],["8992510539703409454","9263800966199715514","13091535067622971659","17531013199786262303"],["18353503091043001954","749837981706209872","3774100568730971813","11413128864239797974"],["15709605041230933120","17894866467613538769","1066959459684901059","4186112158955624720"],["12408863037924949417","10524048065834895616","10921907786212672807","3261723025406238674"],["17936835048106359384","11769775116512187645","17652863962599793543","615303981836485230"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["4705771952915821408","15714379472228810597","1510316487040949347","9226126555494478005"],["11914252607290210402","13895473394776753727","1008861060453590669","1616815733198818087"],["8053576911329205350","16267642593703240278","408990289903887577","3505763980210750089"],["9222857869668311269","432519144408063839","5291839865018638550","11401472594433397466"],["16892309994257658168","4000905072274253602","4375055417638891384","13396198490164767501"],["17936835048106359384","11769775116512187645","17652863962599793543","615303981836485230"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["5835312337337300702","8368056502438471751","15417293910644746742","12983609356806823780"],["6117785680051457954","12162386444411938966","14560610064534698847","7975901448175087527"],["1537881252189710741","7090950724682054395","12495101534810606858","11948409927492578465"],["6983443037456180094","6968617012198877743","1243228550929909997","10373483901840495673"],["16306475118622691749","13371840740641228744","2105968835655775142","14277270932686985583"],["3416453237294773837","15077705113560668929","15892796157302745768","4594909671587441211"],["9739574280558055517","15043447694986944677","11636923091601905832","2365650092009695002"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["6655277230462562157","3529371727996868836","13117976473680515178","1040699356549138284"],["1155950363655062287","4799740854348879281","10624619653784208074","12428819594476999613"],["9775545332881198476","2668347515542802660","13116448134411462648","757307648742163727"],["7162030729671565783","6230567344055200369","11300335857960632493","3447909792573120994"],["9383973508751126369","11857590010139088792","7667874568766470963","5987055826056335077"],["2091000423679724054","7162656917256966579","3768519366445466290","7494973344488431943"],["6157711554957237108","199864477268291837","15585457279085363473","1103053204888264411"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["8270793629292421998","1700021456389287047","3971537420190876339","2968981608199674228"],["736845331761273941","17070776628493758219","11080975534425103846","1243523939465508910"],["614464951573159881","5805975049046615577","6901089192392233319","8721519954329410622"],["16598049804019930970","3091188646643615272","7184900372524634758","5321147118597032734"],["1677696497272035065","3688589819153261240","11942847545650710796","13207945418826960927"],["11325736808183053101","9480667077771078358","14627641033944171505","3421554605306198042"],["17422812231849103106","8377754487388171740","13480061141272939306","5655692478408065448"],["2858699714671927889","3102654800655231993","3879493898402280383","17522815013848686728"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["16761406550986506467","9228606651345224731","9965891138742638500","3153700036741443316"],["18137002066021027675","3605755179089423587","17708121378722991462","9102893690988879949"],["174394896349578960","18421135458638413069","11391061548025707600","15186767275631591616"],["11932574710259516178","4755380094975785539","11644125348913731886","10830599829257718354"],["5232674868292478046","8693830015485313174","14953775528082760425","7188126122225591282"],["10445650185482899153","2558955377310260844","1942884157587848050","11165168181749282969"],["9739574280558055517","15043447694986944677","11636923091601905832","2365650092009695002"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["9074425249608792734","9517404245008953165","6437089521769505612","4324931391328415434"],["18344612872873298336","10415221354895910562","9494546272120355299","213488248990258479"],["6380720846142070203","9242754083379031183","17639236081509281926","15220055117335736530"],["9740607126061753687","10659877598655214222","4885854350910604254","17646888627892759562"],["6950244277142247694","13515519284179588452","6182899710623878517","4622826097292329810"],["6340444869188372640","11297450325170158255","15517672499008557231","3780128528119918032"],["4799346614871623804","16837489227572482934","9406319578961103600","17010839360013053001"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["18236872635014487756","4801984893985355462","9539902916018338084","1975160150631339512"],["15072275606099257794","7177141005897578433","4158206489326328875","17725786998900281846"],["18333805609919561081","17761809889433055610","11442473565239996257","4122735486653676671"],["15775849062504795401","7404848365589987724","4851008061628444470","5931442583061632026"],["14986974113136259403","15717990795149277031","2351907731007682793","10910688787504046347"],["6340444869188372640","11297450325170158255","15517672499008557231","3780128528119918032"],["4799346614871623804","16837489227572482934","9406319578961103600","17010839360013053001"],["12271470513482290661","2648679066417222678","812612681303762731","2372771841398123578"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["12455128289818402428","15295598770597498906","4280438041478563485","9127949889092287580"],["2850631763903283283","17259784490577673108","11969937939263638224","9574158184161210911"],["7338794389733701872","12527818678848888132","7059351118275368686","16052212244175898506"],["10986385711654118551","16736210533267483531","7668502351465663224","5544747259561744234"],["375557217460155114","14132555460078924464","1166832737633875082","16327604043840519287"],["7333313123524850472","15141749622039473281","12564850984513579664","5719943269386379552"],["7098882647377649958","3879791418941135869","13084779982590914242","7674537013475056323"],["11099053721646869229","17976599926946351094","15830741791911358422","13536439290312057038"],["2103076232501480439","17959536696732983087","11791503164378636853","9574237140835593203"]],[["18145223784586029643","14412818909747017447","3534737590215942853","10667147101745560955"],["5225653411035699747","16812436633449688258","10401192661373684497","14248926101516031287"],["13308292602883091097","9841156754607399736","8069034690074957945","16042829742654257684"],["6114139497812591986","943119120312552650","1402413158837251454","1743821570431768350"],["5232674868292478046","8693830015485313174","14953775528082760425","7188126122225591282"],["10445650185482899153","2558955377310260844","1942884157587848050","11165168181749282969"],["9739574280558055517","15043447694986944677","11636923091601905832","2365650092009695002"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["2390528471218887203","18218631017739978043","14609179464952372552","7016802006483182910"],["16448776850349308098","12445842393548357531","3667713618824647653","8234848423036042959"],["1537881252189710741","7090950724682054395","12495101534810606858","11948409927492578465"],["6983443037456180094","6968617012198877743","1243228550929909997","10373483901840495673"],["16306475118622691749","13371840740641228744","2105968835655775142","14277270932686985583"],["3416453237294773837","15077705113560668929","15892796157302745768","4594909671587441211"],["9739574280558055517","15043447694986944677","11636923091601905832","2365650092009695002"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["17573478297447882123","13519661487598548571","17483836889699203631","17341950267902850261"],["10502567607120545166","4700601212158644222","12357852816925316251","12533389345918405658"],["7747628604046486829","4901845641271595133","3540890285682240616","5816975092090396041"],["4239815752429669542","17533896299756744234","8355932228182089193","2219750246299304663"],["5965796799033133422","10998345579255366952","15008822399704941708","2426114565758562801"],["10445650185482899153","2558955377310260844","1942884157587848050","11165168181749282969"],["9739574280558055517","15043447694986944677","11636923091601905832","2365650092009695002"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]],[["15367197266076575190","5024157071731184456","3926388344810346140","16690020214235468656"],["2002148407780481206","12515033735172079928","18039839883409844218","10630283556935242687"],["7967210114721740942","3215977477265824133","5212717874648913503","2283005734637756117"],["10684408158437934208","9245734692988911589","2365991356310450869","742666670112149691"],["13531068431919719031","7810081551848617779","10239908019329413126","17761587429209625794"],["3416453237294773837","15077705113560668929","15892796157302745768","4594909671587441211"],["9739574280558055517","15043447694986944677","11636923091601905832","2365650092009695002"],["3093027151581919926","8218463759247351349","15249429048785979156","2701962402494066526"],["1167647544310219562","6370878302618206521","2995593098366536596","18359209952949733129"]]],"s4_root":["12202237547269734450","14175343062137655922","18366860162637719219","10374654585783865383"],"s4_vals":[["772573584691958407","647210196736610999","6910170365791407701","1143903136645365391","647617099018385818","16696102937178574200","4795918409204315100","12789919732288408149","256757909455698102","15107538933471007471","16064317717137126097","5290202640737038964","13530155692625574295","5206389121573276597","1969393361998158576","4711374331198701895","8213762827530494099","7468145006056833997","10771615104442480152","12415169274593034109","312051902874136401","4997908755397616463","17297740517130124161","4682016001994989928"],["4724228711241672570","11313768965809655836","17588885521011900856","17256575743894530555","17398427713407096888","10896415380731915828","4889540042361710982","13825008489656483611","7945821052477685319","15475895471757500005","1576101827665185820","15213226359309005596","10814881973292567066","4723104166812181581","9811301292419446523","986149197707359427","18269769908820601466","9113798658459161239","4922664968761182997","18035864027894286975","15861325498292342232","3551991826022307632","10640025435949867297","8625572005452093711"],["16977372806397367175","2815079889089170923","576408487695644651","8079796482506241335","17294474649678159779","2752517443082428950","5808644484568548982","1774129667169282614","4620506469517938578","9298184411767796971","9297498950342311646","14784167840173810321","4217428838522036745","1526168573064273228","14108145334852597214","10508039263187980166","2640999182745204688","2401498954260848718","4959103513126606293","2271398604917119551","13959526842170826730","2180537303060287534","280741851162368268","14676165734910984535"],["4419052630557715855","344230787548919558","9492000418556250783","6229145615644659082","13465905472241689232","7919430973997295097","999102683597122836","11089773456574347147","4361327267994360627","9438632083157287301","10717753591277610581","3311095732740590459","11879944045016096911","11131954935438660478","5954315363953671465","6944785792391093750","4652542044847306292","10024926984749449601","16962548400312843224","8304314756863322484","10611325147933556833","7778169733238226228","5603338592367172863","3546656907467230287"],["7758147209509942855","6030437685980747651","11407596522942547353","13092110050492935137","3382028174296359221","3590557757571966414","5327601154443748258","1914565448043183229","2052308460811847866","1922948532032568216","2873710668443379252","16937150734941766075","17335495336476557022","12922311623643072106","6541346556050099272","1295013076446414453","5700957873971345047","4954713928672670357","6158889975548206959","2895945074066853215","10501474091828301533","6969972953587493134","16634358538963578641","14901852618679670588"],["4419052630557715855","344230787548919558","9492000418556250783","6229145615644659082","13465905472241689232","7919430973997295097","999102683597122836","11089773456574347147","4361327267994360627","9438632083157287301","10717753591277610581","3311095732740590459","11879944045016096911","11131954935438660478","5954315363953671465","6944785792391093750","4652542044847306292","10024926984749449601","16962548400312843224","8304314756863322484","10611325147933556833","7778169733238226228","5603338592367172863","3546656907467230287"],["4724228711241672570","11313768965809655836","17588885521011900856","17256575743894530555","17398427713407096888","10896415380731915828","4889540042361710982","13825008489656483611","7945821052477685319","15475895471757500005","1576101827665185820","15213226359309005596","10814881973292567066","4723104166812181581","9811301292419446523","986149197707359427","18269769908820601466","9113798658459161239","4922664968761182997","18035864027894286975","15861325498292342232","3551991826022307632","10640025435949867297","8625572005452093711"],["16072159729325221853","199493814528346520","5299091329738309784","7904870887317124422","14799660245849377586","7664710908229665591","4525028861794840705","9263558353631004572","3079439177843954691","14407699816379703657","14419198743331733281","4431133587880087751","12892049898264626878","6126578331356900101","2075830991329453660","4287136712689413104","14952443717998378250","1657338449272528744","8636086763622963336","12382935243236416318","11413914162122621744","3161395253685610370","6427581949683924435","15002854633969872432"],["7055341027290910356","17700217264653048147","13799470070140315027","3409850981424645740","8781529982950688110","5169100717998691595","14725243192930711183","901753023982244952","11998921340511646790","7828079398024232847","16556930750913143882","11440977797463092656","1978432494963917372","661872057150412701","852038828305160141","2970735075715690064","4322313643376789184","1994304226906274664","4567568401874627871","14010608884628268348","2462251823454144920","12710391259766123948","5725411397432997243","17927005879572830721"],["3895227544781987479","16799221216546314430","402063984881162930","5318721257622204234","16813870993822312989","621473147726652363","11400978128567840601","561943941495261808","18177377818224764327","1809147195264917763","2430232787038587669","8117731628693947265","14506632491033991655","13288743742046036133","6431632592672735671","6751798464047659876","8627741564640034560","7401141640446796839","5455826700134320183","2610405212501799039","3645587659526089638","10766995087271013633","1152235416880419389","1342661101451562966"],["10120948663137267063","12409486526443970016","10589807881443361409","12218808382994997830","16521169405984433853","14209072024243324970","2982757620046981223","10902337572518455866","9210917076209617132","7832482624175252393","4661219752319108799","10403356778623896317","3738321114123784011","10475506467299376334","8459186177422896429","11327203054796889502","13992800455157053068","10694213850347384584","9415382691936452327","12298986877210621534","10596509416849693994","11950755567984396568","10999563494650963556","15450842755959193471"],["4724228711241672570","11313768965809655836","17588885521011900856","17256575743894530555","17398427713407096888","10896415380731915828","4889540042361710982","13825008489656483611","7945821052477685319","15475895471757500005","1576101827665185820","15213226359309005596","10814881973292567066","4723104166812181581","9811301292419446523","986149197707359427","18269769908820601466","9113798658459161239","4922664968761182997","18035864027894286975","15861325498292342232","3551991826022307632","10640025435949867297","8625572005452093711"],["5117649533160754416","13739490543081749660","1353516933197851944","11117225838134734093","468511758881678662","8963633443885335034","673611102783498500","1443189585818577047","16955490548559360424","11910900727492428947","7307994496515402927","3072472332215575793","11376635164384452128","13684227496072173548","7215615018599254296","6449947102866025156","14239136569996999568","11853547894172807644","11847947491319645846","18127439258721440120","4479884181764207392","8155770481551185875","6219640412335462871","16743015263761258343"],["12330834301409240378","12764630830274294492","14965077674480512919","9778528124068378544","17687436851755206982","15867076832308916553","6815355502507271185","9165239510565833169","5538680195421904588","7327071487799887473","4729688067276183657","15878720897430497434","17094117753911390586","13360983198696459651","13195161497827623077","4501953451183821124","16868000529241562218","17033646533264517676","11731841636671731985","13015067296429869828","1421253760780280508","12912982641555250291","6754335366107158447","12635738766803086382"],["2530558004245170403","5223756294978107074","12853332671699675101","15480124685855235563","3388315524697059149","12486615754933139905","17846077826679055600","14328602474086605593","5436140884302228991","13990602779135783593","6611400849071438168","439611553292084362","3055952155624248092","14168512777336718032","2458139479158886256","18431692400593332270","10048437896842239593","5913443785440130405","14073322904714436773","7058794807420122108","13375523600891641316","12494626915640180182","17480862795733985808","7930830773352551963"],["2530558004245170403","5223756294978107074","12853332671699675101","15480124685855235563","3388315524697059149","12486615754933139905","17846077826679055600","14328602474086605593","5436140884302228991","13990602779135783593","6611400849071438168","439611553292084362","3055952155624248092","14168512777336718032","2458139479158886256","18431692400593332270","10048437896842239593","5913443785440130405","14073322904714436773","7058794807420122108","13375523600891641316","12494626915640180182","17480862795733985808","7930830773352551963"],["6912197857925886021","6526398120564352040","7153771793307460957","12991540545113500225","7146077938875526665","15467028232883915787","7528289903629949799","8362616118157574530","6231728677856365971","10265524884926074760","1626855977628810363","15997571225218398899","7011844419640635427","16542167653252640050","15190226318292348129","5277786828273191971","1944577466803475186","4882006948452275656","11251250921300145229","8953640492369549664","1862550285269575353","6288854378386303488","6729308908175663519","4826125075359867539"],["772573584691958407","647210196736610999","6910170365791407701","1143903136645365391","647617099018385818","16696102937178574200","4795918409204315100","12789919732288408149","256757909455698102","15107538933471007471","16064317717137126097","5290202640737038964","13530155692625574295","5206389121573276597","1969393361998158576","4711374331198701895","8213762827530494099","7468145006056833997","10771615104442480152","12415169274593034109","312051902874136401","4997908755397616463","17297740517130124161","4682016001994989928"],["6036182030617164238","871755087339528335","11721639232219816584","14027494374650989612","9387204653814239079","15665597291805499198","5201156593777731626","9812108035222559936","2150274001801629927","742424145612174030","16273852245938036710","8144040301848597128","12785926863149117376","9254137931423968837","11066589056398551980","11149610600450776121","12878487872574977889","12283664993537550431","15057765776305852472","13381445339849431511","9735917872277880442","4129930664630420521","10491923293391552452","4330440950767659343"],["378240951249333471","6755884875084810478","970915822688807254","12431575550319987602","1963807538652351512","17806843884083321118","8696806611427672544","1001583475088221642","1338991698577416292","1177020552537367395","13896361501079393901","2671970865716348383","7582121590258409079","13979100623549574432","2127395129030025733","4422427064317633543","14120003653802624352","6925878208698121416","15795786868012253150","13887461579351336370","14484752032161787091","7026640488785405297","12344639666624509083","5271985843312611411"],["8154319780268875955","7825338077836973015","11327037935087195780","11618620134394502585","9197300031274490408","3355568873271199918","13274472460699756280","6746480201674547834","2136544406888605037","749192938700304924","8367861773882824853","6166250872689128874","9366216639701589634","14005094629962026930","8796364214681525331","1767744586597889646","8931992792298738983","1172496897653700769","6378071912079351754","6016723879126663307","9535345289027153761","1841358067086971685","17857866210670842495","775182588002966763"],["15643079440913801642","138488804987084051","15536459042724268133","11675898783071616475","17330960510597182969","4863855567340908844","18299922415417917493","7469867120267693410","6105262460375577324","6563986814122551569","587564365661930578","9388979084299857197","102202789592560972","3947546983573311864","5247819777941312398","16979699733897021730","6092290889566979166","14039132559936322597","17452221546091863340","17195135582980128914","17306044452431080584","10178168230724590622","17666838891718115179","2702086380515928493"],["7055341027290910356","17700217264653048147","13799470070140315027","3409850981424645740","8781529982950688110","5169100717998691595","14725243192930711183","901753023982244952","11998921340511646790","7828079398024232847","16556930750913143882","11440977797463092656","1978432494963917372","661872057150412701","852038828305160141","2970735075715690064","4322313643376789184","1994304226906274664","4567568401874627871","14010608884628268348","2462251823454144920","12710391259766123948","5725411397432997243","17927005879572830721"],["9532240663392707028","11753729810147799795","13179810119867616076","6145872702471401640","5719771445552892831","14893887209761627543","6471282327290110327","7262393347057260258","12386603169515567784","3280269019986412211","355137231222478514","17512550945327636449","1391018567112889150","12264398532352878626","3223153854394462467","17979603415836331252","15517202328169735923","16456407839364614921","10887742623247682116","2259345099359030762","15632138364373401078","5664306283327101202","1413889470056083379","13128433860296548591"],["3466124756321810876","1289586471271792958","12527003949290278781","4354230595137530911","6471358490458721581","5384116667354894973","9989364515513432640","14570222399845994390","10300689764824839352","13950898568354781364","17339495723366301285","1407347858938106134","6439436567148878216","16056402720853332717","17878994550804736784","2602564841543737265","646997987054334153","15247583743173323699","18278624991486863246","7818699697555253399","425957944011366417","7950493348810410529","4234184620379750456","10374510969319431342"],["5984034150948932121","17353240902573481867","17729613291551785373","7388232752198960751","1994436684268223556","476667728127901863","16395154641348660357","8425206473362990360","16238209355197453472","5702485666498042187","8087556622928015537","16063548759958828302","3887631334079894915","841910610329890868","13804391035502045869","1196672033724828071","1425410538974870335","18094527312167864951","11504630708641731891","16665318342089699972","212052134640110142","18360371845575104241","11441971992641702881","2139902650960837513"],["3466124756321810876","1289586471271792958","12527003949290278781","4354230595137530911","6471358490458721581","5384116667354894973","9989364515513432640","14570222399845994390","10300689764824839352","13950898568354781364","17339495723366301285","1407347858938106134","6439436567148878216","16056402720853332717","17878994550804736784","2602564841543737265","646997987054334153","15247583743173323699","18278624991486863246","7818699697555253399","425957944011366417","7950493348810410529","4234184620379750456","10374510969319431342"],["10498280054557806915","5345884021717289545","15625701364524491382","2250892364420472317","2246940469140001770","9170155810634949526","187812854148952335","6113412243614984212","14915667789415515291","9394181351534446872","182752750074812818","1441038525957216331","16377596260327071180","1946067521435087154","10777709873594031731","17958633055261237148","14104874682906205223","9430942839692441090","7813015363018875780","17173649044152660429","15729385772955993532","8287459363501507274","3024504162816254004","5287407230434469123"],["5873733962460707852","11767315489542024218","17643514177587532084","11098964905346473948","8643702857859930722","5976380854471300047","11001691343712258963","2362925156692752898","11366700123840753843","3792598136707354055","13709723010674881353","5549603850241997643","1194918699917992465","6005328687182568629","7087113984460086683","1750711972123198867","11765539151855209910","16030475515500544399","13520373409523336216","12435106100518659719","18089188411920273339","9129128191479725011","14614447206411596776","4118277430835109317"],["5117649533160754416","13739490543081749660","1353516933197851944","11117225838134734093","468511758881678662","8963633443885335034","673611102783498500","1443189585818577047","16955490548559360424","11910900727492428947","7307994496515402927","3072472332215575793","11376635164384452128","13684227496072173548","7215615018599254296","6449947102866025156","14239136569996999568","11853547894172807644","11847947491319645846","18127439258721440120","4479884181764207392","8155770481551185875","6219640412335462871","16743015263761258343"],["15204223945752218180","16660582050654577802","406812409662702249","18079300870424492744","5050051481748200631","6707501011638586650","14366828581445086147","11194769036618252556","1095648386228685405","8104152562854603540","10506266748055602064","15469941652137787027","9351554227505319044","14601808917109585833","43106597204541169","904462791494956735","15255318146599666063","10643620922765542774","3611452508334794388","6072210292847971757","11523967558353237571","16502528301966225539","16736270722211421033","1080381469335194912"],["10120948663137267063","12409486526443970016","10589807881443361409","12218808382994997830","16521169405984433853","14209072024243324970","2982757620046981223","10902337572518455866","9210917076209617132","7832482624175252393","4661219752319108799","10403356778623896317","3738321114123784011","10475506467299376334","8459186177422896429","11327203054796889502","13992800455157053068","10694213850347384584","9415382691936452327","12298986877210621534","10596509416849693994","11950755567984396568","10999563494650963556","15450842755959193471"],["12741626682187681791","8423403789249512273","9644759511136274115","2370436507833752225","17760982354919189572","9629703845149199322","11310095669381676077","8034739407508629682","16346022734010650529","819346504623120610","14596613037247310524","9908327559131034552","13348169683617394363","15517959518296335154","15108309817931309987","16871116740381179406","3670168744036114241","576639168938266476","3776316391758980650","18003028894626209752","17262899050453297985","11360407796877133567","13162124700005728384","15122340471065713100"],["17932847074901193683","10721845096959789276","14676593901906886040","10514582092614649814","8695309681101706438","1709408820315715657","13028248687512594051","6886774618835375894","845135012832072316","11402980361381327133","15892189778415157212","11863389772753964207","10931910390420420653","13941459810401042043","14314220817544108868","4668296519334627906","12286683330462615869","13082718813582939392","7706711939141086319","4744583071744142095","11086104598860813939","2554139301893002185","16889464161982746945","18163353186522197742"],["8149769965067486692","7144424484499578907","14574304438877155740","3179816740666182892","11404708588620462881","1911260975818431309","978340120244626122","8229214712276449411","4361382659700645674","1368749495747886427","8964758294620275861","8384384297130400054","18324641467765460062","167520591616420294","8546124184725652381","12834162111026638267","6411200313625634462","3745557601209644238","2774835280719653901","3910858272039410769","12445711298809137169","551201010342669725","4870530369270219197","18214685629275184528"],["13334822424354706287","12355254587025914744","4586736260722964723","1457100900944153754","8659500211976613769","8904906316840594414","5690010269776277395","1080460357525085545","13123077537566567133","11788147901859985097","724011794336643922","17169918407579328020","3497669177819837409","6260808334909195665","945465499192281613","4022300365221025843","6181884879354011066","5699747168867795869","15045414829688036910","10731478986438217532","11143431686041323348","3320460173889918288","11882337035937708954","3904500010481708126"],["8881986642316513888","6659196774822399918","2786710890247294269","17535975179160717664","6191033344969937455","6103743964901193359","5237805361720359647","12943514687882536898","10310212306453698089","14948537495433428245","5674160389811806356","1075041868054664555","7606499077447207874","17980111789463899458","16839619024445968244","1581862523321458621","15111511680033093437","6967384530127492941","2137023750586891554","3491409306551362944","396831000382669211","240330480126042936","18078106186755628117","16667259600392491107"],["16586471805838332366","3942775618757278983","8134190325754365471","10844681801231831686","12739011183488790859","3182591092102573993","14547878532138259484","7851663987308875035","4689180026959284594","14923552621155685788","6571604994493299681","3281610757329652329","8686124001950814649","12494760493933435931","7761159687800704823","336458733804226129","3706895984503598221","5068527054064472565","17103721578530382628","1417009990449011535","14613295079891142207","18191566215703632375","16824193741758198613","12526846329516251713"],["17063874341329679598","8867450434607705775","4328438569266922171","3975575194195710848","17299812991450665164","8156472653959768797","17795764854695137481","16778190285395302052","1799747070027702010","11048788386056585186","864991248015669118","11539754860302049374","18175889770051430445","12128971851459177902","7080183487190636383","18075757842006896409","9862948499321840881","4329458413171229317","11315428738216540968","1461364457886894055","825325217966986088","14568814919747324763","8208384397373373442","16263014768605604566"],["11473598466771897457","9106006238417086920","17413729099182152328","12117047482361967221","18219884942913869786","10778249856626407000","1346791882281744261","6749311342889799288","466666196489206426","16019570208883615780","7187891672852885080","13719787268675636056","3093822596166034539","17101571871035470821","11718023320248725368","5868704694985693293","4216629052444259104","9449807608683957464","4650251288289899389","5160853652829722235","7424813578949372708","6512044767917177484","6208845106599895197","680687106436185322"],["9124149621379233718","1564160933046890326","2465263720702634181","6267300086811548937","7553986097818958212","1116033400795194066","2538628971832483069","10777617752892852810","15260208937553825226","534997933817362461","12667995958672552720","5856790869730536012","10862517511837614749","15462068115283257933","15016088463586144918","6842884870870728485","10813372035769475994","9034067268107205247","56254862211265073","13677770284370327690","13902119890501279200","2480461452024185450","983431495300849596","18031591394414663221"],["16262766971828050954","5454640820065102819","4658016401283368351","15312749123156697635","4824299570015809720","14879636619687641705","7553438852249978386","7250413796863260511","14944942667235745592","13105071692132924762","3010096477154086431","1655860424884598213","11317506338382404832","16732234186863430604","17289426083962425494","7536352631409383651","5259696178112464107","10119615671153430723","6142862933395899524","5363355500757858471","17864439453498672158","11283094732757315671","13272900761088969579","13569769873479207107"],["486554254341313768","7760927600242968003","13929099060797054017","9553457815756648597","2017610464168124545","12683021747579593362","15367343889757009334","7631860114221266882","10859201752986231181","3877529179762745590","307597590226890813","1971458393455855481","1382793869094829013","11513495442220738215","11010190930390432075","13642662331776450137","9092065775607503612","16637930898931137684","17823885780359504341","5928480822559903684","10548966701672071079","11047014137635384858","8915766565003790188","982151049456757458"]],"s4_siblings":[[["6094650416972852563","1388347571370188300","2169043741982901495","5330422260052761480"],["13520679411588924333","259808786516478468","18379839968291912456","2510521597377315697"],["5215673097959006611","5741205282825392303","11932863263371182173","17926226171185061221"],["4131767947715643439","6781178185386477343","1707478341167813673","18400775831496977347"],["14209231314069287649","7285347281188771256","2284952365478279432","13005707332553742184"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["18111199625098762907","13929808115424646218","11518136271403407707","6598328290716050061"],["12542523549365608452","18375173904345611766","12752150479442485782","16549149483999018694"],["15765303025819062501","15191888716666779520","12278919237686813905","10140428038517525388"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["11383594475176945949","18393451246355738943","8810927077344133093","17026643674208637078"],["4591983282825299444","11298379800756111670","4966031176719611305","10117311958750850127"],["11591210007027148388","5604224177091502611","16708304545454113164","14544553045612430009"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["15444837448756598730","11374738332086069333","9000382186292130152","17272578681010834655"],["724762835503297511","4195110129002864937","4507055069065468282","3315710023263867155"],["16178140596488081626","18068851480952615767","10427977787756144800","15447698896422614823"],["9225820044479501083","11335733883272272877","14311659060826558903","2772952408760935943"],["11786862607816507473","2783664905248746802","8803136654370864767","2221926111516065459"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["15131692391579958861","1990388685975348224","16124164820295104034","6550532858382192972"],["7747696966675902892","13341327488813174610","1434364125096705536","677430493043820349"],["3084679515189179151","1732289670201746228","1452600402292795424","7281895852244925222"],["8609709171951665294","10007075822696605495","16530182008627737030","14495973818220908000"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["15444837448756598730","11374738332086069333","9000382186292130152","17272578681010834655"],["724762835503297511","4195110129002864937","4507055069065468282","3315710023263867155"],["16178140596488081626","18068851480952615767","10427977787756144800","15447698896422614823"],["9225820044479501083","11335733883272272877","14311659060826558903","2772952408760935943"],["11786862607816507473","2783664905248746802","8803136654370864767","2221926111516065459"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["18111199625098762907","13929808115424646218","11518136271403407707","6598328290716050061"],["12542523549365608452","18375173904345611766","12752150479442485782","16549149483999018694"],["15765303025819062501","15191888716666779520","12278919237686813905","10140428038517525388"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["15843728665044074421","2407130881838913733","2930993323471321816","6846723829660448827"],["5383501800092085859","2169469593040185713","5869418612835947672","11173509183558522729"],["2966821424158858318","3498231351400344831","13255766356698769914","15099179370990571700"],["5852575838129275887","10587324939707410631","10609679920618469056","15397287643889977531"],["11786862607816507473","2783664905248746802","8803136654370864767","2221926111516065459"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["10677724644239531937","9348999633559609682","6759231032520815358","15772225755783003318"],["15164672010772937686","8700325245345110996","3631240250598868660","75159595775532912"],["11591210007027148388","5604224177091502611","16708304545454113164","14544553045612430009"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["5814545150070626945","10372695135563472744","4693621630180650423","16101467979341751348"],["9942873380015933900","5372152496580214135","4646215614835106843","16450023546862828593"],["3084679515189179151","1732289670201746228","1452600402292795424","7281895852244925222"],["8609709171951665294","10007075822696605495","16530182008627737030","14495973818220908000"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["10593011146418872670","9851962274662817918","15139896269080440109","5023747341958453172"],["9942873380015933900","5372152496580214135","4646215614835106843","16450023546862828593"],["3084679515189179151","1732289670201746228","1452600402292795424","7281895852244925222"],["8609709171951665294","10007075822696605495","16530182008627737030","14495973818220908000"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["18111199625098762907","13929808115424646218","11518136271403407707","6598328290716050061"],["12542523549365608452","18375173904345611766","12752150479442485782","16549149483999018694"],["15765303025819062501","15191888716666779520","12278919237686813905","10140428038517525388"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["18422672218469597015","15105801943294056755","5597121784273794370","13216778903673859634"],["16463489064547443308","14639610737805046041","15025447671915089299","14416322255004308072"],["4141853159790025114","16084848712755255372","14498411381237797272","3373091007066025396"],["8609709171951665294","10007075822696605495","16530182008627737030","14495973818220908000"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["12597991715805906897","11821957704065807141","12210026042274330442","16991324250074229073"],["5417394275632567512","10216436425902149684","3583960371478633309","6071834653453229355"],["9343055230365397355","17763090952307035200","14832416937328359950","499055789497414858"],["1450842803794654970","12162508320906046951","10707831688189081356","12532426386059499629"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["6125634092715665737","10227087570731927500","3543090466683633297","6905776327136605180"],["1142439694068594273","9772615595558592185","11238142814940487969","1273210337205555447"],["7737294308748230953","6307972965355896609","7122987099835499444","4288721749403163420"],["3916851047974855606","5569964689158592130","2416803939637261621","17201479422342371141"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["6125634092715665737","10227087570731927500","3543090466683633297","6905776327136605180"],["1142439694068594273","9772615595558592185","11238142814940487969","1273210337205555447"],["7737294308748230953","6307972965355896609","7122987099835499444","4288721749403163420"],["3916851047974855606","5569964689158592130","2416803939637261621","17201479422342371141"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["4708790986155086066","12210512733123044419","6284144366311129604","16270059782647078478"],["14889480220469075657","5598732117663881743","17736996480949031361","11006240120873707355"],["12498676421941873968","11541070832673754036","9970275841561727991","15078617234159553372"],["4131767947715643439","6781178185386477343","1707478341167813673","18400775831496977347"],["14209231314069287649","7285347281188771256","2284952365478279432","13005707332553742184"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["6094650416972852563","1388347571370188300","2169043741982901495","5330422260052761480"],["13520679411588924333","259808786516478468","18379839968291912456","2510521597377315697"],["5215673097959006611","5741205282825392303","11932863263371182173","17926226171185061221"],["4131767947715643439","6781178185386477343","1707478341167813673","18400775831496977347"],["14209231314069287649","7285347281188771256","2284952365478279432","13005707332553742184"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["16523291124284712880","914180383216744927","12812991215838462514","2157086381106011638"],["4871282885039897734","3313532306173521310","13262850831150978537","16162530528914039906"],["16565558542661003732","4270275861549734206","15968828872550641267","17162083027478899933"],["9225820044479501083","11335733883272272877","14311659060826558903","2772952408760935943"],["11786862607816507473","2783664905248746802","8803136654370864767","2221926111516065459"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["5604024491784320749","18240904921394681788","13313647869829635519","4419102234711661725"],["17345908219897601483","5871207037700899864","14595645180411907345","13991017670145394903"],["15765303025819062501","15191888716666779520","12278919237686813905","10140428038517525388"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["7283522008716026141","9401284851351741634","8280276950363626812","600054123756516841"],["18016627338415117588","1756898517879781240","7676851149607362184","9914614558754653271"],["14016412294013662644","7320085980958152809","14251998690479475392","902369513302804030"],["15624663924483783320","11177348382192518035","16430783497728151255","12719811643411629835"],["14209231314069287649","7285347281188771256","2284952365478279432","13005707332553742184"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["3685734914452974142","2019959187106507524","12545560093216104789","5558219554622671803"],["4591983282825299444","11298379800756111670","4966031176719611305","10117311958750850127"],["11591210007027148388","5604224177091502611","16708304545454113164","14544553045612430009"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["10677724644239531937","9348999633559609682","6759231032520815358","15772225755783003318"],["15164672010772937686","8700325245345110996","3631240250598868660","75159595775532912"],["11591210007027148388","5604224177091502611","16708304545454113164","14544553045612430009"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["13453481207130110050","5586011285305869279","13288689119387489669","6440189944293917323"],["2164200468300906298","2080706973631458148","9261749290842954990","14383247379114456880"],["7737294308748230953","6307972965355896609","7122987099835499444","4288721749403163420"],["3916851047974855606","5569964689158592130","2416803939637261621","17201479422342371141"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["15345152683961011817","4559177094157366068","8787734974446967491","11192159778885186284"],["12820850718158245227","4158447623819645640","9975266925329665430","17020569110738581667"],["4141853159790025114","16084848712755255372","14498411381237797272","3373091007066025396"],["8609709171951665294","10007075822696605495","16530182008627737030","14495973818220908000"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["15426102419751982276","386852026292802757","3141070480646942783","9841486743474392203"],["10210376170458282670","9645729858403388934","3123896705251310668","6425470487835449824"],["9343055230365397355","17763090952307035200","14832416937328359950","499055789497414858"],["1450842803794654970","12162508320906046951","10707831688189081356","12532426386059499629"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["15345152683961011817","4559177094157366068","8787734974446967491","11192159778885186284"],["12820850718158245227","4158447623819645640","9975266925329665430","17020569110738581667"],["4141853159790025114","16084848712755255372","14498411381237797272","3373091007066025396"],["8609709171951665294","10007075822696605495","16530182008627737030","14495973818220908000"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["9543267591179981143","12201048901100929845","10589579874177188790","4598722963233970083"],["13281924161098259715","6161536744961661338","14008257462320329078","5928604825704844867"],["16565558542661003732","4270275861549734206","15968828872550641267","17162083027478899933"],["9225820044479501083","11335733883272272877","14311659060826558903","2772952408760935943"],["11786862607816507473","2783664905248746802","8803136654370864767","2221926111516065459"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["18336028963159956880","7395538385702048882","4457536857806850698","7325191827487399168"],["3215120350799619486","11572754695438415026","10549321074122694781","2110833911778082790"],["8996016811233463226","15233228921526728758","18154140222098774010","17436176353097810931"],["1450842803794654970","12162508320906046951","10707831688189081356","12532426386059499629"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["18422672218469597015","15105801943294056755","5597121784273794370","13216778903673859634"],["16463489064547443308","14639610737805046041","15025447671915089299","14416322255004308072"],["4141853159790025114","16084848712755255372","14498411381237797272","3373091007066025396"],["8609709171951665294","10007075822696605495","16530182008627737030","14495973818220908000"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["6134965415354051949","11506262596185368052","7439333372828212918","444522378868103418"],["15164672010772937686","8700325245345110996","3631240250598868660","75159595775532912"],["11591210007027148388","5604224177091502611","16708304545454113164","14544553045612430009"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["10593011146418872670","9851962274662817918","15139896269080440109","5023747341958453172"],["9942873380015933900","5372152496580214135","4646215614835106843","16450023546862828593"],["3084679515189179151","1732289670201746228","1452600402292795424","7281895852244925222"],["8609709171951665294","10007075822696605495","16530182008627737030","14495973818220908000"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["4458279357619148820","16784711396406527293","6844701408455893855","14348680227366351485"],["8247155553380867830","16632665237482447971","10343779472519801635","12512254624290622630"],["8996016811233463226","15233228921526728758","18154140222098774010","17436176353097810931"],["1450842803794654970","12162508320906046951","10707831688189081356","12532426386059499629"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["10825757469914345867","6309907427426946024","3873897467724327373","10824299840110107739"],["6226386056728558125","13761082715187816206","6494413796075797405","13081940500335056163"],["12012022579627132361","5349207689064805307","16790081033817506775","3127972578553637059"],["15624663924483783320","11177348382192518035","16430783497728151255","12719811643411629835"],["14209231314069287649","7285347281188771256","2284952365478279432","13005707332553742184"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["18302333731415396158","1198964788228097088","3136882931605747500","17298781277855406399"],["14331587281862270329","967625522862434902","2464331717470705506","1078337127232898395"],["2966821424158858318","3498231351400344831","13255766356698769914","15099179370990571700"],["5852575838129275887","10587324939707410631","10609679920618469056","15397287643889977531"],["11786862607816507473","2783664905248746802","8803136654370864767","2221926111516065459"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["15874891013522607346","10252513454048459560","16936815901574742307","14261086826951579483"],["13520679411588924333","259808786516478468","18379839968291912456","2510521597377315697"],["5215673097959006611","5741205282825392303","11932863263371182173","17926226171185061221"],["4131767947715643439","6781178185386477343","1707478341167813673","18400775831496977347"],["14209231314069287649","7285347281188771256","2284952365478279432","13005707332553742184"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["17032968588870493643","14075343049737662091","5756195251694096746","11314762060123395653"],["17345908219897601483","5871207037700899864","14595645180411907345","13991017670145394903"],["15765303025819062501","15191888716666779520","12278919237686813905","10140428038517525388"],["7615183885528104514","13507981440808172176","2195967332726617244","12576928271872825204"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["4635370444430658032","662738792863606021","11941853769339578886","5993697767217826495"],["6841990412813354539","7136358361106869638","6286673617110924397","14572008524793423587"],["11012425572586677452","2018564022008721214","11789342325572715882","15060241984475388258"],["3916851047974855606","5569964689158592130","2416803939637261621","17201479422342371141"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["16484551094153146075","14793351234223918202","600962080364788823","2308195899923746693"],["1877624978175767073","15073181471776922116","9660933609104112163","11701505956337723675"],["14780210403083190794","5552490070148277372","18088282263105296859","14537187448397898938"],["5852575838129275887","10587324939707410631","10609679920618469056","15397287643889977531"],["11786862607816507473","2783664905248746802","8803136654370864767","2221926111516065459"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["17362217232772069036","6124653745855304039","11097769251463295385","12078612306577836815"],["11524310143048575910","11832592058442836864","11930640930194821675","11215099542478426558"],["12012022579627132361","5349207689064805307","16790081033817506775","3127972578553637059"],["15624663924483783320","11177348382192518035","16430783497728151255","12719811643411629835"],["14209231314069287649","7285347281188771256","2284952365478279432","13005707332553742184"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["14156078778817304517","4663853115225297575","14220644908368403550","3597046131564070334"],["3215120350799619486","11572754695438415026","10549321074122694781","2110833911778082790"],["8996016811233463226","15233228921526728758","18154140222098774010","17436176353097810931"],["1450842803794654970","12162508320906046951","10707831688189081356","12532426386059499629"],["10851605048428574715","17674084658600550922","1363670371574181324","11213078540379734194"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]],[["6555971670162801365","1012754124177331301","16786255722971285208","7728675867817237235"],["1877624978175767073","15073181471776922116","9660933609104112163","11701505956337723675"],["14780210403083190794","5552490070148277372","18088282263105296859","14537187448397898938"],["5852575838129275887","10587324939707410631","10609679920618469056","15397287643889977531"],["11786862607816507473","2783664905248746802","8803136654370864767","2221926111516065459"],["15276103103087031988","6880634286516718085","9422046012225751445","2263721447835258334"]],[["183980536595555551","16057911544224967307","9467138847899286445","14073102369652254330"],["4516578676783080505","2223514516151102485","3464293146307435594","15028758807052357851"],["11012425572586677452","2018564022008721214","11789342325572715882","15060241984475388258"],["3916851047974855606","5569964689158592130","2416803939637261621","17201479422342371141"],["18123415451004188058","18152488322458523712","7043172003033723227","14925144594011881181"],["4808034378216508035","610201608076213340","18183952643858495708","12759047308529331009"]]],"s0_vals1":[["9871267534912696469","8737604077253630242","1495250104796138862","11147324846350355916","17764490896341894457","12370378115130652962","2764881851775845934","1246640557946465212","10252615224222389961","13402819676407835070","4306048078928474052","6640504185704164894","11340384981531871540","14214063601392032248","9615465938516680350","17920917532344951244","15978706507454875657","549992703859730362"],["2138754756123473177","1947782978324379659","14847276130274228948","17830136675188230895","814323043308793713","10336441925107739192","10644728635315252096","3824558967702610864","657590605079012713","7049200723242319230","285077384076355760","17922005467929395829","12161545533968543403","15022719139475300827","9230333868762415415","5025458703370462001","18299298307061877764","6363810363459419684"],["5936478938321229289","8014340691927579414","11080925085555790159","3565208519025391982","16667956758761928167","15010053550277881311","14307211392798556319","2694146484603085662","2445149284847661164","2459260546026172579","12738393610476351903","13143632158736167141","16267042197761700717","5014907981852736727","9016744667043380729","18023346523171633360","17957316715809006924","13162922952275790013"],["15350537374541121554","3218969115697931176","13308748821055085185","11952056647059234780","6240256461851534679","16404265833073076658","6883689483102060245","3282381393796324067","1167833909333523603","326948061490638046","15439119179194436984","18149905878569949038","12978583460565880002","15343670133812461852","1002539808530326489","2063455980801634097","13440816652682951658","2766456714503441942"],["9470603785278623403","5432842670262405741","6737086168131025397","1135401731301085166","5638615691748167197","9815772970598435129","12806978621892511587","6195878508365441564","17542117345369886931","18251888491750041137","3103563305502757830","4287960171197989473","4377295073931635193","1507208735914773861","4582168872408953982","3415415915137218094","3545672756667495150","12884354274913627939"],["215576621763848276","16708881684963074991","9918820038104643352","6330036290150714647","9011569128036884377","1462366164665747539","4649416368148005236","7992390773381069854","18253970499046522709","18167864436053610376","6573927167863762093","14136438613186158086","6043429014614328961","5649707784772647735","6887163386717296747","548457535300404440","910565131913145156","12876588055450827425"],["7932161423408404678","7151520098366630722","4775329500154665362","13480979674367414489","58264135405191639","11387872190427995351","16098094087489821729","18011475995169906716","17359288600668969632","17554278125625559880","8121795197051342163","7010278060571243464","2660271846099117009","9251362835860467672","4154422561892847806","5465564697787963065","3733253116168582757","14382610164715114153"],["16596257732132599946","3594554396558312163","4493644833475302577","16060635603391220348","14857846953586479301","11610149534899752573","15386513711391586171","7423532504082797499","10937579923687201666","12874204878134326592","3294240422638445911","8365333601511830902","11442210107228667301","10851005878596600233","8072665618341392789","11677822000970091790","2457715471738891180","16114876119789779264"],["10189419847243313118","5647953959618584896","16449192819116046159","17778263797537132765","16501242392615807949","8620318103545567283","13296682517493870577","8417237314493121130","14918598009059687611","17756855588193430989","14755530348797767753","16845022007208543261","13829780076175709821","5782858851764813299","4737767050677895454","14079404234842255867","13420410112833735820","10518309222814892501"],["13695900753608814825","5585370146577278464","2777214701092110298","15452052214116376390","1373654003676374757","3151614407774582633","17363057669326445879","5466088483265446633","14636574496805985947","16540858650891695904","14222799678346047592","3500861060884039874","6621513539677166675","1310939968745349282","5204961721888480535","12647718237373545618","1359392215042399720","7428972093674718224"],["1360466903746816154","8222068723312705181","11088956861757838344","16373919188526773284","15054668231000752827","13065495380239396363","9795372369637675776","250478921309952321","16322834621100963847","17950925521619674935","16549888618756399651","4950509146187450158","14787802458657451399","3877326121617160947","13591078632011513984","11487550776706746694","8271251818151609786","4790541375961014320"],["10005347100230259790","79122285432610091","1120858229523024562","7526179725956349748","12746515953526152128","17124538343738043818","6570470705263263536","11366595735533832515","9720975831725273856","307550403162297193","17208031270882323922","2398912426067102493","1220666494229753102","15794005831018131008","17782661031654822259","2544026176126123016","6890706248341795291","15626396918611857215"],["3883120051213228670","4308213934100429448","3339191412095548154","1953117590166374974","13166271679523948721","253255175573129179","1858728450207165298","10106960101882856310","16276497124090792269","7673281726564450353","4166134326479145297","11657627247679231660","4761503561732617840","15390453828216907853","2645110856677810743","6846151025031919987","5547465496735747066","4970834483970399341"],["12740348545779891288","432794848603474309","2277636926870650569","8186274906572616307","17122470680684163349","12116864454203322490","16974937275257882888","458262174827759374","6418463694175431441","10854238265970752419","14192012413350080586","16967180840761026967","8344800300422886379","9516707689300488060","16181328993815701820","2223911262463018135","2543707751641261557","12296595035608152"],["11508299858771457460","6385326595216382416","3923522989462746204","2745652174172319856","5543316508779254904","17956303613034122226","615190758952005714","10426234676698343653","11549459883913512084","12196430960506238275","14215845592513033123","899612842822946654","11660744378049530906","10778044603526927484","11318970457450985947","3751313704624201686","624550994795474077","16881641024682668910"],["14233255260725643559","13348909630329084605","2649231078598665731","16367721027373301324","3538892976586517294","15587594129818373835","8764012433854164002","14859707683655702782","14326788439149000687","1907406488031307643","11265303421350865024","9924293503480939247","14641067785112595984","8207623173184291227","11805550130382421808","16871758099851537924","6664489466560306412","4959464717063675807"],["10597635285195327323","905144759310477211","15933070314647635688","626235757701931646","8957703829987734587","2566331607446923314","4806874051960906836","14198580826432250190","6400333314455111255","17269758503490894077","4364160901872679052","11616561035493504947","6524415933991853769","5621876660577500629","15165888051989377687","10018008653873078167","12689807978036502636","15608126920740013522"],["11456536401747283563","6502000198501330360","15867245431242863738","15091837310209908077","17454343447436531828","6679528599385582140","320357086572625128","1089485241585424597","18276842367871697116","10652087701405453411","17808081320619890904","15351637728611517046","1640504298453556060","2440719733069825021","661248424472021393","6467011093980170381","6033952927493496898","10646647839703891129"],["15223991139998321873","17667602743812731860","16084958538516664511","10708280039795158144","12212062107638030838","14819545728792864870","1157621549042999657","13513218653990105792","10913146344129767381","18200552729119035458","13567831557584650901","7558297475874523545","3732282367261557244","5692631410714845833","479185614247385981","17510809440674340362","15092930025724285731","3027864985892132065"],["17171685648139817430","314023568861386078","3963724396140858349","12652647292618823835","13801912160560996050","17505659623727643211","5416382756263500294","15329286496460422113","8865668022019521417","10075512278945526814","4875729724012352458","15822815542513510308","4208439057801494401","16476414597907032070","2787528283550868259","486947852588303295","18437306453264609972","6444487268920571704"],["18249297453521297318","14470751232128053287","8995466737223211150","6471127049642451287","12021934391032835091","8282781933895516726","14671787544113525568","17866196758533871949","4112577799122469908","11626574795931979857","1846582964856889306","8599236843031562717","5470936802291394668","9614124282116282709","1958851569596522986","7374491017336856867","4460279291498271765","13998147104975463551"],["9336258810526119572","276875004420092786","1395883083061913658","7886564982225917163","1417574212408958739","18149817892539834528","1664797918380829538","15382549365020506661","4414110782482013052","8263327636069656752","7150445295315662418","8879370865564530473","6479990552440489548","3843106843135546802","6024270334872038197","1039576951262755925","3389434031639370423","16261478779105481552"],["17903379053697505771","10698017608528327552","5217530059330753532","8238774605080108519","9825362821596807316","2044293256955248979","10430090142015134946","11145053200992815771","4469692369800422948","14224766807088624294","3893402698316370504","10731964188865831702","15629829530391201224","6009986940058172951","14344475318287130887","8432090985416279581","11534167096500162969","15241426524276241828"],["10804501671887729350","7074079275419545092","2432789425081845468","9341956613018838083","17260630902023745196","15237968594221987069","16682721508124710214","16419545128455660317","17937218529979848770","5428193681198167766","12269461424850784585","11363812557798958324","15881626843003644911","13794912424471221683","14005675019885469188","15423604043770104209","8232420498095689549","16937613260411059054"],["3874126121219629659","14388705501694117086","4717084579157516780","5089925629151150622","18320454171489462539","7494284140471609932","10526990976569020911","1940612372666292720","414357434763323349","12696917680908897026","16081097179308234209","4364376774998370605","12642206189987574696","1371171445410946810","7417099122960339113","8009680770959142660","5301174511325522866","3378987420806964853"],["16301132120588173929","8848424395564240955","8074441611756341936","12182212814261109066","13232263124334697856","6886733503731437380","15043649540997180416","11995244057565713536","11239513644118007124","7102818856563358115","17744581447315308324","225581778237125","10310855491256039321","16214205858331144402","17599342739564428155","9286484837615285597","4279542741163879090","3803101139519586053"],["7926812534248612402","11406017471799336841","347691334180990452","12844675523687716046","10170607491613985988","3167861120231101803","15559657508529472663","10072484193183648436","6503375716291323011","2049307727860106656","15047249484481753578","5877566770291103479","3764678063101504795","4381856146699084244","10256294208388506846","5129783053927448719","17095219643139013760","14587331460248562270"],["12885479356080769644","10262573601073099041","11306238220010444568","8010046078291375356","12130779250209637231","11723038958112165210","3071311009513427093","6707521119086458006","15980292917336840091","9782319312000423151","10645587034736686789","3072132370789819322","11205578839155246320","4208875767468753678","4233498184818793759","7446263522416728795","5492239180573689487","11380961016362886440"],["13251357001223792576","1155357220662299736","16968057717858860370","9076142947124561031","17879660596824499806","6048157652863854985","3781088172303621819","3724719609099993727","12233201239389850370","9830062906376233308","6508390009170540837","3845231504939622713","11817543563589339093","5857989202432398793","14690870954276290121","10051964732307791005","7664328253878418969","12729919254914317389"],["14529184075790908574","15477700768739257416","11627772806412402231","4235993164534667106","17421853187261498909","10322422312812508374","4932834810634613945","17251013052608632789","16843367251254970825","3944346146180096709","18203792204372850712","4541909595877059772","4031439735369786266","11202302132933351686","6026604569820717212","4201624267046895473","8013481304713817673","3633511898831145024"],["4657872174053557394","12486673778119877103","10714199443549787904","9266744633895681466","15791550717610080684","9395848819471306499","18300131545912682494","16067592622174454120","13543362403505100036","13855078850255790852","14131229317908268804","13802273974317381466","16819690384921251190","11102305515298009640","5771976900755440820","7437689183770988024","16780413877250631289","7905385566642581555"],["11811901203139870337","14835157039317081102","9012902530860354626","1953170892572598239","8963444960661188493","10784301102858461675","10276522652760436922","9803407457583760188","1478557286882934407","8706184953352415953","9084334217903043713","6700005159745120061","2303280853197554616","12317581905873752773","11344241305417865003","3210154080872958115","11203990562152329822","11856135209676845328"],["16480591890223186094","11868638959151834609","12526198186832693036","3548396605736685342","7840680147563451050","16808478431602226292","8984664554261545858","10655674850136036172","5343787958989065126","11308950962446954439","6359925136287668715","10607607683182371511","4205165152300971711","4455362686859734598","11498010077035327474","1106377508504295912","3564868200609060563","498040859921211468"],["14538726687931141182","1519512151321600616","4441613750358598178","15793157274748489376","1817247338779815157","1210366113842779702","17954933403946689563","3138020493715462200","2931134384048933431","16770385899515663117","1376910414239318376","9514011730715340636","9701047202211007028","9371371489950839651","5468330354833284118","9270568228502800379","10197980774374319833","5969033098671424580"],["18140417137890886183","8229999263429916380","2067808250187589506","17931368585812731481","1998883629211674396","6333571833613608450","3518419619825126160","10506202489306457626","11779628649839223305","3570735436049101198","15145029778861746546","11527757711577492039","17448507734811685025","10323105895224957571","11101149684807445654","13501537471469539031","16142121232564078571","9453148740771045053"],["6279302645712688967","17297915086922852585","2922808748608595182","6956568376185713865","12053084342330349214","6428960526962330829","13346408783749720423","10363347925375228559","10944823748522822696","17740695281304103264","1434836237032823902","407398131834104146","7039002527276083882","12508349889279969522","8683859179151648172","17322894218995622143","4923578016228318308","7817823934148134385"],["11251386910023115390","1655186953119592449","13434583001789769798","4194610010028036072","4936140546800992499","8167503511047652900","12138887958486377476","2431445358912924147","8134234379896143163","4680123394000378373","10927974072448820090","15444640236837386305","16887399949547831913","1703837649311800568","4697389496980729212","4797465688884951900","15711711973373511644","2041550102629383146"],["4663640411204425420","7250253365252099530","8105594858138835897","9361136349317440470","9750121534970149178","7110968901665184695","5067520472261823109","4372509396578643775","1411096542254480580","6050817951058770139","8512380948256782566","4445995449976116203","13896130430842622265","15789391795727935475","7480108652195711384","4443453284245381918","14518568598333388451","2673069964382499929"],["13893949699457881232","6833404472075357401","16906071517812736661","727084230311125967","16098125245532701874","838749281192591455","15412420820282698898","1902002049985237681","664513185034933684","10962817683267892870","2650788102365401109","16153271073696592286","15418831742762699157","9390165310124147473","17311092261076624855","10601066458923814071","1844932454839931922","2139988378110648413"],["8879664158496323855","7730542302409384260","17641905806138528360","15373227370222405097","15207619585723055367","7938113263617017548","7488457893371026681","14247413465135529876","4837203359642731019","14520376887123764341","9485374711269853001","2451973078839383357","16126783305577512540","5034066584963581749","18297883378124376761","7450830384106649308","14334636258874629606","2575889964625243754"],["12309235172497224279","11158710434340886741","6417252144225066724","1616883756157308833","15449540746507585202","14966844252252391270","11566635101390921463","4720179507675532273","12781422214228507048","2280883753839470334","4511016127621658493","4034818042714218662","10497222317500561646","17240810708089080879","11324823957819786906","8520562517381848524","13678550003597409140","192574146997421260"],["6024134458569215196","7080977525886924431","1304925891349986937","16249652152934197340","9821249067454083961","15670847779085916340","11747596044947456219","17440770338846617447","4905286281518738731","10194407801386520610","15168153496736562465","1537615144499465178","10377827662195971437","16872601376139193245","116860095311075781","17507370558385394533","14705956723135702082","11669351928335549478"],["14082078374262946396","10784656735569025200","12349931241353865304","5974213975398151432","7296468211285002118","11717931636441424162","15409254403355837906","17308247059709737170","12523505321827164362","17729105344434237776","2611066476202869997","3667292321935092067","9958206190116093944","17309125149476013666","4826115008232844660","1228828235541723219","12691302410811658643","3092108700147167735"]],"s0_vals3":[["7215820960065847634","5850798837331943087","8440427966885951923","3378274614750102891","8162456008582448380","14030963078729723278","7992977064445578221","6128638391081609275","14138453199161600360","11801828419278853016","6593939426981978360","14390463698716999815","2652495412118633164","14897938194863310584","18040636045309684250","15981101875540313439","18051966253839063498","17543352368253545809","8736090141609054313","15899182217197668220","12175913176955722960","2364886491758975209","17300293994967096312","14007620836199302368","16097608255408873029","13187062647143046871","5134030066295998911","12946867909747851259","6248220844076680455","863741061262282789","16257729862996059142","288209045316316616","12460471263849155184","7102323731064404204","14167788374603457616","13266431682856298825","10170273480804309376","17721492781555341376","16526282229833237087"],["4711405060270674684","17416182932661135683","7587478644401054114","2629751624669709816","11293431906386405321","15766126035560199448","6456301773774367955","3479470458967348642","3102436359254546590","8750048457487141485","4899044484091176163","5420317748656605285","8361638811238205013","14014721854822653381","18104170954147306796","13727417663975273050","1088556376180875472","16193949378719593602","2166547156194674180","14145239263608614494","13805136418490359418","1706898979464245438","16733093520042375949","711781784179018653","15541110462851340314","9644423598860487860","5956728872438969950","11689650610079043426","3889900243851889343","1163019141063403157","13671205410673487444","10898015770779434583","7849494994794805046","18252941074881246479","3551625463758801082","5284707722224641002","12981789228204127430","10863826199536017711","2561431838397203258"],["5050557022077005991","9367373658763649233","2433977985435472445","4146389302079502104","1965137113837273304","2071006242268359109","2757646715845323484","2461724156682275373","1742177942581039956","6431765990407151417","11049978185754938279","15417138772960143506","140860840439402688","7883849183666120964","1507631123664456671","13165736710425311197","13987410176678069346","12537772021840020085","16373269695603716785","14634256825595162417","17599097189278793165","1576304374542352035","1404425542625762761","2519627406012335128","7599728314869877483","6356526050654450741","7879875196550880298","17241937109215841047","13798691873080806881","252221704793914486","5071625079883301682","9151298105663162558","11416346291135587713","15961024575028966854","15400677010585068813","18044676852860081276","8875851882257137420","3942740289362933305","325794769587555221"],["6773322894037387929","8457344569390525400","5129807319086262074","17446665735078445805","12771402191311511110","2233600899668906748","1263567426525599344","2637336116270638825","15486869540833243763","13723450347065983832","10287334285145670910","7870334532934271727","9875480236150213181","13567813391201317581","5486106709103602273","14386178586784058307","7748937642099049048","15028363886018189425","17560692189492933638","4752447398363059876","13911593975044651184","15845434086092315407","12763476442107004830","12233723205301745437","16774783135848851686","10733885187015416582","11553029102317194052","10535911854151725791","4190301859388091436","9894320081747467217","2195767917625237514","13889338264537215675","14573065948616921373","11574767449362922459","17585078658921903787","1927637336286640365","4602858491715024733","7856383165961061999","178441836552657487"],["11019094243893663783","13742778606920792318","4877840550886993340","300634470547061311","13683487537424202994","3102356813825362424","15450645967374677496","11253223694945945166","7932995387942358895","5620263557171168860","2817364397669527611","14110748896306628927","16888060018538343349","7233521458286794129","18222082870683658421","4216293048614456517","683412191198330185","12387914060668929522","5204995926211754501","16577766495990582362","13531813556993999735","9048691319027826643","16950740171505418648","3337536440360410746","5901348421982905687","15209808192922521968","1237298065012534899","11654632285431691586","9302100746179495339","846746477214441832","858628760007964998","18149270665165958","4434619254815090536","3333386083664646237","18140828519404761324","194971829901220770","11412731900738018762","9459539724493895857","3102506095714074718"],["12875373462016883307","6197019863394090463","16602449863962181078","4056086739203755564","8641864616032170074","13539132665394419543","1558690137638511588","4609301526302190278","11885679408494659192","11197112341019573635","16784537825861765123","447825862523415628","2716120634704578135","15355649435759865809","6486679222210487193","6692353069510496634","16862326304238635119","2344278683848969077","18204700971293962329","6807341551676040702","10413202967758683898","10516486990347109456","8466200868221500837","12007952303531102703","725343596802418812","18323360233067318202","3588229356181507889","2694862236294264539","14471663010513599368","11176341188655671632","7779111441395852455","3955939576973303034","18446173811873371682","13907558707053821890","5696989802193033981","6645414676167580838","13189974448662690128","5770750507933551241","17145081738559124822"],["12796804417571884439","2910331850391282878","5847791549379895199","12024250986918744932","10215830342754177133","15492133487976623890","13938704575982719533","6165753868397635347","12433217077199412256","14985913717367860093","15335355024993369264","5761103575112953606","15280875540585899573","611470539544784346","13253819299354977398","1720486796513253577","12349341337189174467","3085555894167237882","1217639964183269793","17568386394535860450","15324377226570744008","17018216870883041350","18315397502538420335","9702380332659671218","10902738670287483564","9543474826238106724","14037199741732912376","16339412097712250019","3421150170287945670","419820633596094362","6572376902926474498","12594948446662155932","14761690989435486873","732974143360924320","8195375561006785977","4130068590343628449","15475936202696191173","10659940131549305071","17281344905838862697"],["7480812224755131525","13032796092675419474","14819859306599342628","9491691305107800714","7236541732276010459","12682481113900662991","13196547798794095915","2474696981809288503","2589515372495792851","6978010199959970126","14004648642881493343","6987655686871695847","8212148944223756367","8912235902538468329","184810433296410691","6327358475493628443","17853237710988161795","14577684766455696397","14283504803888354270","1849667267956556515","17175752926644848228","15515069868226163284","205337221609780275","3774956989262153584","10687012201743892666","7638007939075443723","3902684724994651799","12663346057828882546","878285753801088767","11411253209854748194","4393192803913641874","9609693172516839125","5393988583109856933","2691628904109819008","6954482624593397944","6394332273756962896","5485977787763655593","12761007156957546054","8350554184610603139"],["13692701418932994865","2206114492038110619","9612964095271290312","17944891168176824028","14986585239510446171","2728804404874770208","1723914992897645350","15789267290205657285","15387142861941605083","8277733143784107632","2686156006804919071","7394690282514121296","16375951756528959072","15031978113975497464","7063231528250764650","14681764090655085160","8176135019174982308","1082989220977658923","11395415197433252222","11305469341826811103","71835427775222611","6047587140950829232","10448028692836384337","1964439273348083419","6936214202627606376","240709456376289051","1864053957654593954","7074770973221883935","9893705344100839737","7988944542659032590","365406531655751160","5638925347690942409","10688734792806814614","2440090333668537725","17051604015391688866","18014678279367117525","5098816434627053896","5241125895461178957","14209186711667079512"],["8588118751933639603","2268967309741595584","9023572208003837701","14808694584379788950","15775306701444914472","13167558007492363173","4108304263865727997","7828926787993953937","18439405458561538438","17972329771043253568","16617201085915720310","3516543108550377697","12952420985189141916","10803365914400156028","18296479782933222597","8338859526313496647","9387695435516423561","8026497183568029796","1791073723405119089","3121330125429390343","643982668586430021","770540666905153464","15953138317145753849","2592258065564006760","9144180522582975853","3344581408099971178","249630466455928250","3566764474404807762","281529078085161184","16005233438353271813","7642374039161460233","15330670012899481379","5407502587117603120","18078923691403631221","9910045764566366826","5982718509414021652","16689798264734140875","4793876920353180934","11630227516894758698"],["1195921966984052860","5421101892735702835","11478760932855305610","7106696707815243029","2128863760927464143","12139638508679284708","14868131981570865033","1164790441278020725","7676433615053866349","15793345357715637236","17016485205620578687","15858985584948016081","15609870187169644507","4660234560124874703","2900746413721113122","13998048235019831613","14781908031592950207","4942138289341051559","11268198588158721325","13730987862948391324","4290765399618297223","15584921234065880101","16725170123925125198","17891134086670119240","11321673196583474897","7099104426202321122","12131972434829500298","344132129443267592","17607794197650848482","9682353477417336232","4355370369689171376","6464607308472639681","10203086853450951652","13053755880372548591","11901314386019675501","7088007785889112693","4489196627647560663","6838767874802395612","2502430653210329161"],["13099723122344631820","15545292314377564388","4222698887092968511","13534082230802264630","7616796116188753050","12288974843970000017","3829807540384342765","18149778080575001295","14189437722184967430","11672882905803125689","9596230486625239757","17861301498234096213","5340083968937819680","4232170546961640070","18409433473219585495","17026908957220601099","9841574469759471737","5988033328110927778","7351148825588449439","13511502843981684407","2758618032097522972","2101346654277385553","7095721776169509346","14436111716484331945","18374705884498854985","17078549914145241747","9899008391553546793","3850534776737776587","12150973250311180488","16776876143082172032","4200933395216735096","6147803437154863427","14020223755081780610","3918589141073883506","15865005140097774638","17420733917612942864","6897259900876556961","2308254729824580393","2230796135025198795"],["9393420032555151080","4136108992288303599","3674225045547038129","7936197091152975890","8163982031039403561","2872650889592865357","494035276625500481","7109699602780351389","5568708933378631441","16152997007290154154","9151306031635987717","13736202632962192983","6908624863419717821","16790989254502363022","16235009959637774318","12006772132532024839","15339140259098047538","12676184656652961720","18374785411179631489","2664279765997398973","9109020912214136272","10068871693460922097","9982328663600012263","14868688363748090870","10270004472016472402","16150844535291259626","269018966742116971","13972899883340533810","16249952852462762072","8280500429727379072","432865308214341751","14274333662135344201","2135171572614139059","3798013963394081272","7240772824901809634","4086349889175715439","15674514462493876312","589383907608446933","1582906647521122793"],["4313352771831449149","7387970481329887221","7142394339191698572","11963617282324722567","16310461394870038750","4568256840742080468","15289521350742387939","5867413575153796805","13893402412173716736","14568137147803046649","1003531602656597330","5346681422876959358","3350123304426230299","7101054931168180217","7817885242444050193","15086483434194279927","13970947048526521262","15143787648132591256","12893905166148988778","5624965663187526794","9547580543946037303","582497025344071180","11938734966169628123","9445056045217138364","4349347779481933751","4168317965865379300","1279273449639267815","12143909595060712286","13666998480831169595","16324982142696068855","137104256303070780","5205436931431534467","8696649319563920285","7966676728036773243","6516270748941171874","11280022659989094591","8402597985158591253","13920732234387926400","15419130762475993662"],["10390938951848149018","14843266998157198495","344353790092928746","7225314126348576225","1021197474046683038","15099821484862304140","3841446697861433488","9127031245658334472","4978891657647597055","6410201279597813298","9681106774514458139","16459535188171054088","10534361238066214830","10533602221722434004","11646473221670815535","17947912638478067280","17978233355992381103","1398899971690976029","15776256648494866637","7242054852198154414","4992816261812640088","9772852267745363617","14352556083572342353","2371048901797583487","3447753651819515393","4054057324266700408","4853989222247355827","741894162583238367","14610620160949469894","12481160227929782657","5283931345344305249","9617780280036294857","8937762369513259067","17802398488032109599","4804512466482121016","9915358545313300732","5403320295721573676","2849867152902410919","10620535984239303439"],["12886114245610916691","8504020778243047989","18197978291766907894","14217847928614965263","13273988542433536031","9851261762597756950","17380901234847717518","7255530352074803402","16355950781396296042","1975067231158074823","8978089029605021334","9210450939564826068","11479760386515612888","15140625514484704702","3440835267061051319","1856720221434422253","14763302923540899616","8893312120977162818","17403857728064926961","10293230885269542567","7429392978353578738","600934215551459038","10540077227960624192","2988285090398754161","4660826332013207192","4769802743783209507","7448257399312928863","10564744992007721795","11136697789242319585","4432885406549403201","13970406055567498502","13268733156006328825","11279628597366107428","739660321507422523","17369031950122707939","1730702553568824229","14655876410040998314","17396896578099559329","15188324194997309466"],["15181096905028415917","7370409240214070210","14782966002165835102","448306632520613296","15069081442520594708","12027547292892519359","2307115020366967478","10063831415328227339","16833484334979506890","2503289792738530152","3547832027487494957","4842790520610296475","2830609248120065549","4298370711174087816","12282303692702285338","11925370576142840787","12136914983009264195","14090058666891296505","16744991716367024348","1599744351711239546","2230857811522266525","7539742630151158178","13726354027404377527","15343024964306545274","9089966737934232766","10740218783045142651","2845274248910791301","8804774833264575377","15692841900286639149","8676751406570923349","1356858471056715305","12296575033079166861","7269388506253532330","69163157986461097","3763662536486894478","18219696151998878631","4043361199753584420","14251387780021873077","6912020463390334332"],["2313545268547257767","6551001828378244963","14846844684782305789","5305944473363149693","7008940458462449368","4506221955454690057","9743391403995242709","10792470742873348061","1021665165737705556","7930240503513189861","16682509431771051321","1807201144246454915","18018536899930555581","957017566690901459","17871684591078414613","9011424609943230182","7313755826293358154","4011391864929538184","5907909142630774715","16618041874961436217","14736581480955137208","14186316852201297297","6001822123228186880","2137075457187039147","1859759103773501324","15797779212066724452","8210573303921263198","1848578175311721619","17354048688507046272","6484253295153222732","14966180332983527868","4051747392827863310","17908176153153222267","7274916831599026819","8314612970114295886","3596492579359562900","5592022594060071420","1065142075223162603","12453294234407038429"],["8505781734274174998","2211383790299292226","16408625134895979124","4796500983037800748","6542381518259018522","13461988371753383261","15836433579843631732","18103855104514585377","3669582904660587783","15458575659455707525","5658593036461823324","11392352148744907811","4360869103314290569","11899979212668164951","14231638802032705041","5269725584757015283","8783855910986508464","18159860627850080630","11848323213842068739","6854186710752032771","9259087722356534211","959976757040451916","10112345230197753350","16148271435041954967","3797192093126225792","15666954272274186283","16082622882006607272","11343153429107275106","13441843108565469064","5836342050092674754","10515742735219846964","16906088965722386673","15878774317237702113","18246454842781979759","1691133092913248824","18057741296244784223","14072689225901534978","6441149234257992742","12646487773644142168"],["9252186802525218977","5569328536503226291","649422400472085082","15114517331359618279","545066928662264904","9596810108456406708","5505422067939670262","16954092697234069581","4072840069083059580","10488795805575923657","17844182011865095095","3593730369042956336","13418226069417374794","6436010736691817150","3427721207105981060","17610568463512882941","9953986777545403373","5707554146131822455","17884600010761676727","2507676027121480966","15275350784810245208","573408146627423811","969682738375885532","16764175709885625561","12147840297260280285","16983270251503430221","12569473240211285004","7200715030819424468","5595938603186352111","11145472255901911862","6716168707456419342","7136180300714008180","11664877003963091088","7260622213231660162","15243869820634454008","9336015787961772645","17361983928621973801","14706232532007856315","16339969268210455452"],["4925666669555163392","1091636068761373670","5357796724374122762","11319173818604612959","17850405464260821929","13649379949455432932","14136484044424384995","14071376180183061278","7227461305824599647","10282789007190514908","6576355474507236355","13223473678367215114","6669500266838036952","5319092345983490910","11344872360191302348","4539470979090368041","3797270410155316932","16272260632808401696","7959245971416416439","6114506739008442843","10947180375230427517","2208169759850596018","16370581496981052735","16387263220407946051","4036447362068096258","2770831550501610606","18432421049788607453","11087926088602058649","9102060528185245314","11482550015722208244","8673412252966134280","6939146436999097760","8919733479646885966","14526373782000365073","11727723401996679621","9887722376595908928","13637628050402168052","10087461649096646525","1275933952383824186"],["6338947860756326827","4231397803054005179","18207608634943862044","12899843271504249572","11309962120732065563","2171464444646877104","14525218986770330674","10016892302106885880","16915464926277618763","2933648353813394499","16020266606621139649","5362429831717902397","2675722826508724985","17195073334154991132","2094177597946128694","12558992544710741514","5785405560710427055","3408193630732667139","7716535385053549736","4252062667451509153","15235574201160052370","3429241296157812235","7931505075557789277","6252914664805214497","7082248844049968891","13660925713784245246","13708999720117031357","16743089511362643415","17773793298109537126","15418261416327801141","1997350080948338198","6417208019667436569","5047773456924334930","3053964067761242094","18264663036290092001","15627296310510765623","15580486832098604220","13167363822327413485","15086799291851500843"],["4781858525578158627","15863813207370428335","1684911342621558554","12015165795974404125","10476204043152478144","12317180866796714095","11986341501117669115","7160862056686160727","13455499786695448811","3180289804237733093","15097361909050057452","15795116015276582305","780554610699886360","12590612047525990767","273047868303688865","5482375055714662217","5075888850304068429","623771892848499895","16407896671162947515","13746537367000820882","7310979044511406488","6160581854795011951","2104049831457027504","8941655062340205231","11095653497004457350","8391487094056181214","4364082177836271086","4574068348498831667","18420432740367130353","5959091900748774897","9112246068368063946","14203464061926678338","6561331713489642949","15054348375800273676","1007624435454390343","10730264112419876687","3803331442479156241","7838926576324246200","11045464848011062104"],["10576367520648215209","10999571987456449494","5734318818321220406","6969112291641345066","5147072798213165724","4203677458055862027","1402264509030411819","4256337347934789880","9486858878774485530","10749153077183407153","9641107362463621782","8853182418539262679","3327369201566542726","13051934853873955306","14619019044945927919","52267126536454333","5910479822059009440","2174568243592895676","13665394982029153264","15056842235629088968","8339681515589408624","12272525809842851786","3110163242690243648","1098715869684050029","10643477382028280614","14317462287962068538","4095281326842299772","6911764995454105184","11281849732640207687","9146437858163535346","13004115527947488113","8493702427033134821","15639359396757744911","3940977715123885672","11605395823132267557","5031467136157459045","10782409165610800158","15501808311570861723","14271489168236068432"],["14671495396267272367","737448310338560843","6705167201513549730","5759538646926594888","8629591950113837185","398951786272819108","4588948953836194666","1819801104050491086","5229018676957624339","3209655844580694313","6049451527522144826","3243061657798525549","14124617140421299757","2923971263273652949","13300255187519478205","5333382976835000027","7734259422661812061","18072426404983026438","10916217040070892635","6731530249456560019","10362793701603849635","4517752901977693903","7618403199344555898","10212249333324599111","16577759805901001588","2565409816896023672","14992815724868902621","7984335384925046309","15519638474550579275","15085301637663929268","13774415786199132419","1801423351308239087","8063676368532986158","2353440188293437992","9683994675329682398","9634096193019748472","17330188097006799091","17056524271835689433","14317559169982750441"],["16665562923130169846","17915090482626844229","2637204266211837935","10329971794002242265","3270791485115335961","8460281805321443802","16623857388471612264","4104194617433233630","6537768063450751194","4039569141438173413","6385679525154624588","17816984916759987359","6391018877633078463","15904487795129067339","1538837566612770927","10053628765927455425","10761528062568814678","13658972917732001367","4790126698968449337","4650825686143400678","6611503487568575536","3174940058745846922","15274337580873364806","2274111033860809070","16130960031020035484","18439338605269308371","5728109252543084243","13668720423960256988","10319212240626534749","15283373030646585597","12703751123723281013","13726571274105905223","6733984914362666279","12357327113191876338","1853746093637782181","15766661351602293851","1606581866412496529","16334129455820054118","6720594265147536061"],["14570490814613361434","10495785597721175236","9947955414843983686","1790562679994108490","9792414342859252213","17014698649561366420","1180003014156103058","13767973572051795323","14028546802324768591","10381420590271977381","10406720598020664535","14812271702637464467","12590521432543385132","10163948821788631030","9969350100638490725","10951105506235483429","6762504909222625394","8148995522504036900","4262872805021315492","17031639608365129495","9737116079469201393","10778871859022142807","17517091846162094672","17606087138239218519","16237146157042000086","6163095355166228171","15049787443536255313","3924068906337113564","14441016215481631130","14710996053887568646","4479894380517201275","5029430120211805256","1438241077202240611","6948251173588591454","4926414064819410636","2125110801885746091","3426363895702610088","12849595966688229416","1460747318364179935"],["2058275238768873513","1598721094066165317","16583147713192687787","8649287319817508419","14510674932640070594","11028277245503709922","5879404822980003946","17124324385962914801","11098253943588481401","7301871053378481377","7086148995708040028","1356435190117423110","13408408441474425204","16321335351892263752","8285854068247966845","15669105650644679341","13458663502997226057","11698661019453372150","17291702399442171666","6841481299893661788","14444121699782235034","4923214355818152382","5492403032778865963","6738140507035739505","12684804053724680476","2638205146581136548","7712614666174398752","4855074360454621092","13945763849689387365","15363670140591573843","7283713412656212400","7827129475577709791","5670297468215107041","5906059508931472655","10428080558778977991","16669794278341242498","11099297634776956115","285360220540592725","14215418649379565132"],["1036707335123955493","7889119447796001120","4614083304096955573","13292545512801383685","717914729818586504","14655286536589486199","2795150372545884450","1896695624128655707","1473474713345110162","11417971191144470892","10952277608352093257","12830228619835936127","2105285039712055673","5831367185242550223","15464657916737108892","3995811899641038545","11260927773239816708","18128822043151057803","17533657235511185238","13511359177848950717","11204317449149739384","12373053865408882144","8354874183712673485","17097192972753933606","4015094173062912824","795679448703905701","17971837058961820913","7801905964415477108","6982889768483048202","13774328122427213357","9318442201012097589","3113146374366606148","6839312807170638608","17329685561428498364","8712292455226746021","16986857657339248940","15093208274182042657","7220322320219114176","13013426459853378194"],["6016818805546606481","17041214816036132206","16864936256726183143","11786090201629189813","17106533034327937581","4122116060101721982","9068829526694864711","1825482530004844868","925255181373019266","1668465193588498464","11483453587984090328","13181485738665057682","2626360418902934217","14408135532449823166","16868973799387965116","2830811653472046285","17394877986271384004","15757231711075520398","17800758050535782628","8793027134711134064","8765882527368168739","11224976915214610666","17897871360269575895","14828979390297255178","1756158132155478108","16655268724781088072","15430293320808286107","1730071598179503292","8160812254390905097","13016466905081415913","8708883006566294509","730355545808051405","5392705743896771261","9308808029288082488","12536114747120959062","10279352479805877127","17918061681225855395","16683809059468912039","18129725791999790056"],["9600674471541954364","15243021968141865957","18279648763222451469","6122769370523207925","7870039374772434149","5289989175074179854","14425340004310920038","10739868971523344963","10380923214339868292","14257962654794823126","16508146708396199810","16653954594505757574","4484520583339312505","5108246547917202026","10420135225615085764","9999602888501841765","4051093707755064127","8192153366100448525","17756113540094034997","1904192168270243208","3427880859732515445","8300717618423502437","14813487824788933002","990509499439950718","4337783906521997206","3508484458765998210","12442823176551012115","12219830245629625048","16177584034801209170","10339471361548716021","18087701883614090851","8751398275150161844","6886381674163913806","14350671867145840118","3618048646684446376","7455085783225662173","6133009662083495940","17284559853109204448","10765935050421673501"],["63955133536274257","11463312979778590884","8240199204923347953","17715945573338636410","4895982757799460600","9257559508457111543","11639378443298444483","927115537219446962","10750432325931855820","8003793879626209504","4090042311823809084","3169470280233814873","14477261366856685187","8021886807618208831","3930500948401089847","9819185777461698531","10802101555588005007","7307807031475740016","10818035016688117595","12392443075855608572","8685654710904832369","373089761637987670","14413405919500845803","9943285858569406207","12962602232368700503","17161426648206360293","1817242954205745336","13951233977767733042","9570295231816822899","4600129121731949182","18118513869898834489","9733188469333299098","15450850031889477241","6029712300945566017","6069535382094689183","17977776285713047875","3293732517151540785","15941915314692471909","4305239661444977831"],["13057007911331728762","13909645446328873375","17009010161488795613","10077263429649177591","17909473058544056360","2066230068828628722","8414520835309568017","13335896949659743657","8625010269176833794","5838568621193957352","16843517930357728076","6644744499277461666","5367539748431254634","11558422709838299283","17565340382086147411","13657809510505803190","7245308342747804925","11248849142505922080","11843447496481118918","10062972147237285482","15259613787662035189","16741968664150021140","13123880975918964768","374596092116511630","3704073589206039920","15087608349985370108","17246800981457781237","7213567896834168661","18056836787071915200","4247952610571403248","7203199846280981959","11647226334493171216","12694294329534578906","4345249679553620874","6755884842769574182","2242011794928431069","7091349049908389439","3924435829036023218","15998523894024652127"],["1006375013079336839","12856113640171602845","9648971368991545060","1067903913938771231","6241301919145694620","2373802212137985785","16387742393474141297","8709138443473574327","5214811778409208927","14554639151708824114","16193820219913305344","8907026794345294519","17730871798899406824","6204710905943844500","2697089573123917669","2336057171867422256","7342141636549559564","9772422957068553381","17394467536498758493","9768614597798027240","13682075444277226007","8734651664501784567","11593931615427672078","8805288021674762063","11467184329608939744","11298160315283250697","3928325020722219454","14565739086992236753","4169007965524248848","8074797257449617","8235459881441419434","11580176822941838678","9590683052494952013","13808988406661747343","15697985992217122995","16920281714118909904","8669662469050504402","13855418859398298583","2788669631555317152"],["3368482817070504541","5901075359004449490","3331652708376511241","17784707982599394367","11453999605567085359","12305030142698015645","4061410869150032442","15476547547516317581","8737763686294167970","825398315122977330","11954340253427151839","2813659008305911216","13193075764128597992","7334325721599199503","15335309548352210414","17925599012017671291","3887729733905733087","15537043948671966536","17178684094607779686","1447386109196671156","7827668731588491330","10004762683791010937","4477657849177401886","7318593990103944392","3245902712525140836","15779368694587045373","10743895290145245846","15308875876791490091","9975318324313213642","13978257757765598081","2438924169098924800","2490400424079504752","1137432113906153626","207171874211660183","1123796905371034586","8587431441067519068","3065971071352997127","10899532145240834360","17824379097753917958"],["6342869841850640850","15724689016321462519","12890587138910244526","14372387694207423117","8185081507347095365","14969938918072887426","9279247404609005751","4172663324800462944","3912345979294198585","610130768710965949","14525190159104610347","12708655521791197494","11505573712819396344","9401619854732770227","4617313767370757332","16501013026188816407","7290962323037336680","788951924285016106","458985455422958920","2154688961225545775","14821432900119016094","4631806413360200496","11375622724644163626","15260342094108989505","9322797689646105594","7641705303259690558","8667034908483768408","5111490688669243332","15133761428756790509","1605879868486878961","10399406728080493952","4761726845130220724","10030514661458543804","776253811907067584","9048772911361442906","6575232120475197913","3329350533789115463","8686330667892231795","14873921994168887415"],["11888739491918879442","16530125209141301640","10162823658424018364","1884666775172351349","6661442554962250155","15378139927592399754","91239387045949558","17146724103951589084","7787778284752257916","6274912506589104311","12222284945512607819","11706452824384042053","17104567428020885931","15344981723187968639","663682018867652525","1352029930427309501","6402162539915665390","11655863074761981666","14692238309522261997","14986299148255194176","5181867771423949931","4005072513588991059","13508150474860712365","4284245833069695110","3683945225064590005","14595337519554111280","1906842115192375867","18321198468372622102","17503733008157278605","5981873246992475157","12239789508826568849","5348313066675205252","14293482125440279651","14908766977689093787","18368078324805432767","13077753027862618212","14534756614929663121","8244230805831668089","8538577032454222715"],["3188355544995486565","12255349438709566077","6630236475791527218","9786102965586858612","2538252974698181744","4738238341883997220","6698876194238039640","12223461124246181520","15564877675468708340","655339034355479256","1984994739131013157","16128787416738813685","14435610084647517297","1596337399535911003","11660821160589381590","2283350339646513700","9052822978916135834","4902677158891554362","9303517422691218517","5860261407060747467","17174000708968043881","11211583760803998310","3702664633012113198","11228648554133813533","7804914118599820118","9546839364575034215","6681978935328826432","15065763142334700126","3539221775297554566","17650343144689953824","629457524613316087","5042176241163108051","17441677264774153086","15462362074827328963","15968695715371383762","16754190749761101392","15891747177347909112","18251545497228065808","12037534948447626246"],["12948149307375226769","7140576390681310446","10977682439798445188","10531420429875220128","12898109296413828731","1742504142858584744","7757056688753467712","10308166467657862100","8586887662278791444","13918706405986624877","17141491228451201488","16799527966087493667","12238536570840417677","10634956509692647573","3056442390616426021","6303043894930787986","9227636773045647268","7733851895080732732","1059795246665023715","1275339858895552357","2365994122072617895","13949430310492607853","7510224576408761710","1138397200958346053","2904353994261049277","13926138186566616740","13617109850979151257","9747525997357675931","8878401617627787275","10894484826800190091","1653963530146296848","14734937777581536228","1388581336481198248","529379833880271307","10561360711464905347","5088203834234139873","16832271340373879309","15780279775938571231","773351681942630749"],["6176419230286473368","1293751383769025634","4297043969495585390","6465445460798262893","880127803971878508","9856926530640222274","10462061639371509858","12052746116347610242","16411296994855703620","16858871050711126860","7473874605251825372","14584408059627676763","17790998804421309015","12988805555653266595","4269726998615512629","16513785878436263309","10371972214531990847","6069833971317731622","10430186158908300463","14049357633023916772","1532513475256616416","13185874959449512536","10869455515627681884","2937320166258200327","9955140858312219042","1190232492883322505","3021568960421966738","11157648345393524835","16804358544478284339","272144189039575991","2037719755252800344","10806942798059230870","17551085859874201119","12930670583128354022","1904604819739739050","15559427119341942407","15263217197012663957","14302699972717488460","3895770346831316742"],["7591577531625425715","12975881838821030479","17864202950763869284","9359559211222321125","10767566814250708110","18110000033393611789","16371924428050539981","11597017207889797567","12361601459554249912","6722297186263247288","14546672144752076283","16528834666660966213","240394476339123333","13929740327607590393","10680292715255178081","7761355885595984352","18294959120474524292","18082595061356828727","9979048031547910034","16075637305744590921","17702828812279650750","694052450903180446","3462995368586791174","18264989199671521385","14433600671040846284","14438954097382415425","6928844580062725466","12664937274087653856","7996094131205632282","10208046546954676889","12777737458036389209","17117572482311498816","7501411928910620628","547395460782541105","9718095998758896582","3782108267149183044","18341607303739747049","13854907974882833881","13237302011338311212"],["16375792045323663185","4601748894542590647","16173496585872548882","7435832784113980335","6272030128734160641","3523522781862232570","6566233536783297651","13475060515803298437","6479036340023777808","8436624975686691399","6852895950358121946","9716128199685858949","10500780742214224661","10290893239321074192","5016164859476911499","8809874735249169675","11945425673295955685","9092235261675009406","6472117693694577875","1982920803152458701","12671398331283257647","3371344020217218197","7519469223125983336","1264824031244429617","3783371182336353435","6680358011749051936","13379135479766106219","12892077690197675438","167487153032569823","1650454553637492443","14685952301195678465","11537454301942125544","16418152500534749706","7696612695791455099","4693447973925305261","14877263471935920219","11790207237212198034","4628417678919648165","7166044334315872950"],["10944551147724920971","6218037086559256755","4080032035024381154","6274863602464779069","512420320061836131","6502708307624920169","12365540980152066832","10805456852419414143","7569808951967679708","9503848141559095589","11050694261245746978","13010524840534138497","12517228649034056802","10333835144351871757","15966389821425465033","13824308850685817005","2536126603147215588","3826830171726679818","14865810737368311820","2740886371533353319","8752760271600942191","11381118711220640558","1520321174782447712","8136672885136430250","812865534124300699","6295686518716626964","16647395095227385277","11397332677749214955","11641882314169338044","17346972907912647259","8645429381976529545","14210630385664811148","17254519841626671673","834188349732548667","13843260410444588143","18069337211189424379","7617506126828028717","16533891448221134686","17659389632340073309"]],"s0_vals4":[["11135911592083380245","18344998709043925329","1215001281108893267","3620070698066242512","7284587513781193190","14294785538156357054","4502224532517804137","1119345804340245611","5226565385645385680","23988948520066008","11085950178698441745","9870899851513389419","17519565886295510732","1356571885738633060","17643975392885439923","15085172273949181002","8445534080247612108","7127453137503641980","4445536412769405132","18080845984768133882","4322780544500959632"],["15733658441308879421","16579877353253610292","14743341267443218898","13906514777476487499","14890532377391511952","4961991382619476821","4954497447826244765","3883966335642980898","17231163863973732635","16210462515505547622","6176037571964176522","10165652056954471818","7562671635258780085","7299506653520521300","10675399438776607132","14650251071521051057","12877609771320938481","10293091133062579656","9043241734689136079","11447370145069624692","5855380399031492125"],["11988777830045365883","15770170926477276721","8051218181876671620","17746942185701105358","15374424204413414006","8310595033821362634","9682971957484104628","1129411602677054133","6878762647141748540","5778478821989978741","11789839110392925257","1198934003144118832","9357392842069090472","9808794107180604013","15136182496922103014","7663644804404215126","12587631789654472322","5162002494679000314","77708382382519698","12696542888536309309","2874093440209115576"],["236830560836192221","4538888800577941446","14685222167466667535","1723453640310218399","934808352694676271","14592775560891118654","12361711828501206103","5416301116278955154","4288121759232885407","4838339595411865608","9260173211729196198","7827344026706743084","1726264375376006246","1324583742583597394","15032674294447787353","2794241258141267553","2022795524721321733","17832377629073838407","10860334548767914264","748970582347025998","17392845750638394091"],["12098132037799138093","1344494429029342840","14470784495606637940","14286479544276806161","10477278152481985315","13303413924104791315","13912344760096230997","17818948332838628138","14187059708583844675","15804314493701512109","16561867027012282500","14175440341766273128","15831057437018608398","4497927922946230407","2072921188491072232","8085850114987073789","13576161093918017974","18382098009773564260","8271975667648755900","7978472574047788412","17595054496174002514"],["9951347316510790091","7241091121401482351","15163316409963699060","17964640349916827152","4705136768231920543","866735763531599491","3501025762378870179","13334610404629946322","4956641313577935226","17304654564352275499","2021353994210549362","2106297525752340634","16580715099673551169","4551706761317328357","9343858261963348656","1958895140792185143","12870744623360788962","13690886093337362203","8880654056657442912","8187479099638004884","8504304008780527266"],["11352874709098761193","5387431721389833394","4793215881504138368","12657417147421231089","14525128957582058746","2846982876501587513","12995274091553035819","5937685688497610969","5915748633763192444","2483536407918482022","10566318402977716674","5412800800004110266","11204830924544196303","6005868220379061009","10836644986977193939","15784464878870448345","13824360618763057396","16225567091358784765","5589920513948981477","17854897944376546510","17245334332228356411"],["4805786985966248398","9857689714640081860","17428594173937237682","9088797224969661833","18422070246795972458","14313554919641715257","6945803633294906329","7133949721888507912","1463408326527456902","14746372680214454107","11601853832605185331","1225452977408002698","16625853507784967766","15956714787454127906","9006517751747121201","5359163168637449029","5508400190482472829","2943306439148340101","9712061256005291443","6567492728800591409","185255445789002321"],["4429118586660869003","11662318239127751258","15131837538581623762","15025103769794972259","8035379385300587464","5464654346102930726","17528498650123129079","415613560608292094","7744047927769696904","16019385435411060771","9257869436466892910","14219861210763087478","10534723185888962364","15862708114729259180","15277740265375357929","16556464281204540753","937345540480048149","13504374367272037906","1392735840218530154","1191545342768050921","16882828978759594166"],["9701402162414772725","15538251916357887703","3498702530955884567","2361954702771711805","17918517708681688759","16196670805964670232","6944766868458996883","2955072836611201741","17463966010980547668","4765091972016617134","7987093224294851978","700525193499857669","17451889895058225488","3500493130824844846","10604037193148346510","5090425256948495246","2279487883782422663","15071002019650843535","15420380767629214072","8152265150882612577","16347967911753018214"],["12169468544763407797","7064608430096723800","12665464216921718844","14469366400710886141","1266387726827358911","12870854663120724674","16306060518833927026","16117777161623132244","4665370118700446113","13181303271089322457","2014698064075327182","5204266163707067446","8134305042873081866","12006058717904315759","6664513909012730346","18013584505481312741","5533577590164046927","6998431954360048115","3966841543942982532","12026757956106707912","14049923073476186012"],["15571964029687501839","2363428283016961782","11263532881712421903","8858050367914692759","11799417795432142358","5783536545331809898","13096529559905108136","3667229834477949517","17175077202640260507","7321064273828617824","8507314775514902152","6424757467789770899","8723485803947044392","1744927633723509719","14598964702384696507","13873728948927733483","18106580700020087795","3594855667353579344","16430310919262542947","14061422592432107722","1132484306925828916"],["17821927514148846114","571140296771776138","6996321205222540871","16374807534648433488","17889596152425002174","14019473332744084694","17563606543773137831","2917931957501030006","16024491323332041131","8105860439954308956","6399073055872269437","14841455812933747453","10208659884300813520","4428224384065086106","3322027583874905361","16266309358631256107","12158567612931288884","17692283314678447314","15954339172676686510","8145320745232372168","14152699518318432454"],["1740423952929793610","13741508626096297416","16191558582822189319","2808261762620137781","2917492149251931729","15599508796467372269","1787980723292858892","10119154367336518325","944500466353553075","8709650511061174235","15325704083062711748","15602668408436950747","9496034022405681004","17396214700537274385","6941379170925903713","8812315087108538881","2108672162188218688","5857289788356738625","8823717243068897158","10708258138355663516","3482768911280541001"],["8919818662970618267","14590397594584812318","7913771768637411544","13063000512014229533","242406696436742454","3462036881044594204","13154918842812399934","5739767285287884707","9979958094613035043","13254749074529092356","11906139266835073323","17544062009135188783","1102317237654565580","8194790118826564552","7185845708929855814","634835959971451347","13652738677341945503","626734778963030642","7445279040961273110","4257671178065201065","12674995220456955440"],["11352737649879575672","7964146839442347553","7826903248202675190","12105207427437094719","5553445615331025054","7395390734655784467","5426298641637648891","5814682221380502592","16447812909908204511","6124556784950748176","6381196462618001157","14968130788850381159","15836955161201606642","7694250156168191177","4364383060434281692","5153167092192242107","10096560516048765709","7351571250093061135","4387722879692563926","12663115346324732365","7825829662952789484"],["4714839877510938247","16087943845141736125","1882333567119994965","946640686385053955","14125040881707999501","2746402652624098544","9520820903855619769","11926412386017865988","10195039431935760412","7750547101313967504","12138315459816431207","5950830938630458114","5115339881052701482","3339816010021639755","13881352275296167678","2331806532042722065","14341701651235537639","11242414888058027539","4666300345222323318","14069239830751634520","17404394352719707319"],["10238380400478018145","13784098212987487052","17940865472892135406","7515683251759453450","7940553701884730556","6610536581507061888","9338341768506392413","2435281814293680193","15971225277167871926","1274551273643390257","5389626032963025878","627892966773860057","7033420057888635682","17980820222468683632","14132710885414401866","5737185898705134179","1666709454459554931","13153234246408652159","12638239127107663702","7302169062989486143","16762212267373121330"],["5642617137336004454","17101890530729830773","17713758359041865094","5631541571067575952","3219113048642020990","773679800478407512","4684990205421539010","3902592143126016603","17124764510814647232","2795088060053912015","10916253308123470916","3393301955150518617","8835105541147204094","16228532285652468012","10768024063304608989","9418779525082532832","12154453736291976857","17925061077495513854","9040192575256410365","16338127163870506864","2050912910240972052"],["13130192802585575246","6221209246659574278","5041744291028212153","18120904950291649164","13227908469961316417","11799378529938837758","9248676189705323319","14439231471388770362","8021325331606063578","17687182323982890103","5235718634616551265","1186706061422810070","128053635980489162","2568614093844722315","11964462300366012450","525582275854113954","12416175000384461513","5442325025539467588","778856478878362202","10497629429078535019","10886485202474991577"],["5208142908045218164","13445865358488719303","641042876026745076","15279727591252496173","4828274579778075353","1542620123320273514","17540886776032328139","3501474310009933775","10901563769111986401","505665194993257890","11986720312814914965","2581347989718810119","2206684893663060835","17361862308573782575","2698377957167241416","14105567391181579188","17624539873168138844","12981692936911160328","14126202172558216687","7054860622381476258","3408835051585578270"],["12833881160046368891","14333958936402935320","14945492552941289025","8069892902918098919","10258090702759397647","16678403793917377595","4769970296713452246","1188623912775720940","16693576689860827993","12765093999332078944","9382783021443282989","3274995395058830297","13716402082800708371","16180424338555958827","6113743662735923249","9369728658430148075","9683423594354250953","10604354474136777795","10384769668348972276","209855068127661623","11849724114895672690"],["6947213629798812869","11037093537137459990","13230203152368504980","3752510902240216885","776998679793538483","16593757646669925294","6217460080546475512","9676294727179393484","1539026014106326981","4549347650929176990","16311599384042295298","13065667581181872385","16650085696258659482","13821505391239576465","10593755491908212621","9205240497433468397","18066776359312992320","13744919697344190036","9713262414964619918","1228913290557710351","1153963415665268389"],["4261331101767923016","5945387591064276262","5416879165850320379","8378831215785915628","7811426432038573619","5442029768051152049","2751518142975674250","5667961331333155159","7612108201655560632","1844651573884980614","15288726828440869608","4248479740735466841","11311832279637320121","2177495142020711284","9248197404037851588","18186586918505674319","9774958137874920614","11051847817088063154","15986068846804424152","12680941347043775962","1396275954249019892"],["4985884466703647100","8298598362497499571","14739125679015130181","15037935175371421355","7751553026539601101","11923455394561060301","4992291053549973855","14052798642713871841","237283696501763950","18021384027299308861","4032689942046680070","13093518359031265269","3157199060189161688","9171633054581600790","13685634891515854241","6368989182257442366","17927297149263512388","13664602016623487543","4316049519622854618","14123220899761716435","4895520490313959728"],["9179687761445346366","3594094858429813243","3292811347288043502","16104124601186713504","4044520457213539229","14051417270033314351","5233568704605968459","2112972019037774906","10964102763587264161","4582655433875575205","2702975148220843337","17660930821025328617","2188564185836386235","14369259606497944554","10586316224677302149","603140002486500648","906665453805895640","6782001334811836324","10064395771570813111","17635520436704842771","1643536781103280249"],["2426954771719650442","7477530047602357367","12438449445348467226","976752644397475274","534467003581190203","1486790493619388595","4441789107557163437","14395423902611576704","15973648748807798027","13127346609172520224","11478566203512818717","15516405506932331410","8633215106973430595","11880944909933090242","12403179899141334319","6167150949887824213","2995969731872291455","1893995745174634972","10153700138769419619","17242725069154398810","3229459971007044409"],["16028174504920008493","7521678674433156576","13642679392521676488","10353175597335804200","11002111876215611545","941021012552760499","10519097500916777576","1945598464378595076","16877149270742085317","13474168126422587209","10514738874272977104","10633231595817787130","12383243975355812677","15241186249505710110","753944159956673385","12499917642781740881","16560670336716234954","15913861215613227568","7765219553959457778","6620865956898941661","4296907147915856538"],["15144033090439463673","4241588505148930591","3720639438193688886","13499558563453299372","12176100139673333947","15386783838651287418","3117777225926718821","16777580804272355091","8202890303122544502","13372771805776924617","12866114394103844907","1369792363283367215","9843587239721389891","13886010212116508303","14292234674801337979","8050565580114615727","452768701151838077","6404875814264185024","5062784574381573271","12885332288561147639","16493640627496916365"],["2347116520549534108","14329781955732515187","1419039998412417914","12247607875855276040","14946789886807468930","7460935318855451860","14333683898515034592","5998199075610829798","205681485765372593","17215497322110206502","4532650340632858888","10027736459531213928","16894695998370406492","16581114813287725691","3343564965038182849","14366471626956187442","17138614759233292012","16946791470373923166","1025726504765381923","18235994530226832763","12264613414806657205"],["5745652650160829958","15327424608651221004","2735406695355647513","7108097294571794767","12136900271582542849","14864400129793161690","12743280469782916006","10436151412765214612","3729760824969676004","461328747451953866","11000858375583772416","2629299465344024656","5452353233988272286","5116483124662797678","5832883735532292479","11677009509097183390","12997813640504771281","2923373162558497703","1904052999310619311","2671164772376459236","12165453209132684931"],["1496519883097303022","3353437054898496302","13532230240414172156","7093325255121775619","2812750645526834088","9542893923758769176","18309457086569214905","8366149840529819765","15495205156266133707","16201156718419726084","17880589086905326120","8979891303297958872","7950341977662190959","14661441239989517167","14259699752088872564","1974029948674305111","1672606437955615779","13316087178741234496","5700310928902685275","1605102116683568546","4373643027907842663"],["18091227235632258140","14945524155054435682","12307069854873990976","2013417782925838043","4859393661773566540","14543266650194932794","2400398692146269512","10593779976661749746","680916962479086687","15257707599147779844","8765865173365545598","13870325563142448145","2689554615076723013","16242591470161930987","11558955471972147973","5511315990554355535","221814774503171605","15428458288848403575","882881781432442325","16393907000487157819","2117342955739185473"],["2678644650718739734","9626907615512692312","4895993161192965208","7607649505070017541","6894346369407421358","17271186464137255758","18309073601260131167","16910833581738444193","13039356294803896222","12791484177920519997","9645924563842958691","1167482920573930478","11866701446658721617","2949471415116523203","12898963944121493389","5000381719962579944","8395271832645173307","11996863602834247238","1218743392785062201","8063771675273345394","6517999800743686276"],["7111676946625710496","3412371651280670897","14619262242920916383","5746796073153899694","16224635966933310720","4390444453097765190","2506533531280643107","8308148009996473926","12463413459121298841","15650851793656960866","6904730423966197923","4432860559236811894","5655522649454269327","4358339225760770883","16134809027650793902","7820670048225141084","16907571961159939723","5850114483081454131","7991345424491401833","15922391269450307074","12018750688970555752"],["12089354246289690185","13848419590394745451","11477966661804777167","2756299025462092442","4825688651800382270","2552462329013327075","5269610465377296212","11714410803013941241","111465810913149776","13981732202181389182","16957687784094959659","8379808462760094192","13421058403371654833","6487352752219793696","1379083152849160716","16407632113361089831","13360493989313045808","10118308469109596213","3330761728503189182","15397438344998199643","613457282120847937"],["4043611180160904382","5779563753223299985","17663733374412195295","3991405699846668422","17487654207694715316","3674482088963061144","1289235603732408343","10814068232092839684","9948791024424228942","13063424783621447084","8747237056370336052","4005834408016532150","7924705835584351406","10941185323107614545","311140521342690904","1326241059046494686","16932470487393496542","2364122768563626020","10615225070980491780","17976425312190376075","14690099524518185706"],["831864357855088933","8884901403279998760","10786236693431593040","13040773265293930183","4482673218788669878","2151773155396290086","16405059871469099102","7551723646228370311","7933853190015332010","7219208649550845250","2413937652771892423","1084331092607596048","5292300640660112227","10803482310940325549","16965087799332517638","15133709995182487170","10411169748009928894","3792509566663755228","5706666873232391749","15179469724800568066","8413318722856004449"],["11318638082873659383","16764149056525158276","4169456041172690415","9497161700539623260","4665821489252857907","196603389455534914","7263355196394883497","16449860059772284416","736097433653121082","7418613501677678416","3976424779699921341","13999193726953992920","1239712025148518774","1952124684294669028","12909348923842128312","17136910932971183536","12879329550465531499","4604563582433419602","6981050809612900869","16730918073061865702","3421055128392049230"],["12717182822188419530","14608712680223375850","11295964849513255203","9181442664638735954","2431051677953348970","6539184521869464615","15666131091209791262","11851886512083161705","5597516534794258322","14296980152531204480","8038395886326353590","4496320641056188430","14704729076279803855","3554140350509921937","9741279643129681606","1998649369409994189","3121551703832757423","718233827814082394","4060876380181725719","16595256394553777471","3898302383384124968"],["9579695637947987264","13840474730834953188","1651667468403044632","8594895713907884411","6888183935173422422","12300406108765880118","8343072408640947591","3719660142741751209","11148899675382372038","10668452267640023389","5783230193739994424","859158330962458004","17204675727219172175","14708545407179830968","4434880753175805971","1723877266920795299","3757868017086590154","4477080405721435314","7312960812784104977","2007332671181628703","18198953888193186549"],["16281081540524674570","8218636390375756403","14166920713530204169","1011640343325039214","14524933149558217056","13695703907958054092","4275587424460717323","1993367359806671131","18365523763273053495","7338587612477864484","7662922229635421544","18007461560455926245","6114703548310987028","8235023795040854610","3569159110745059752","14659476656317462345","11541984000944782655","13855089611814751062","1117885013217001808","6901255859497813181","8555378704983193060"],["17339651371513767874","10197143433398423932","6890208172635842628","15847400944615725848","13358377467983683164","9738341606339541208","5322104657754244731","12623987906943716319","6145119879484721163","5506027367133105378","18027149285139392182","6213068786063418683","4614921055396326672","9316264863172553672","15721298133453931712","2064646235175374115","13652624006963957848","8319195472829568198","12045184161468189093","6513859258578983210","19638505532292069"]],"s0_valsC":[["15473625343941103254","6764973117957486011","18028330627754831442","12291308522107018390","9787765857005301757","2700125542475822381","9227363295843469667","10194825072201348880","3892676621425785340","10967475208868998319","15485286233203825731","8229516391834194558","15861802912321945356","12241973493970066024","687604896898499050","6351040751068430724","10336931182851489085","7107981609211257781","15060971058749664982","17700674648554706826","726102040403974857","17491412529163159397","917785694292596818","1975901473088656244","6502550670809337736","17138412619108519118","3523996857984613277","3534088335766144861","13381935141825402085","12824762462191638703","17817198814572081531","17377795882013054650","14976592820868166019","12592421117580657020","11489558515461499432","2340768146020593658","16571152364604683191","15519753021041623159","3809474354210616773","0","13802320208622457421","5793310753481997316","14062801652018338033","12344556209078136389","8514705547420678605","16508589641423475012","14800150114929070226","3320555592804197522","8960737024847457282","16618089300131117411","3937026424149020616","13498917495039052083"],["16562948861123820895","17723983832979904097","6441455169679456646","9952908668004181214","3206741058244651294","8552095274757407847","9701992126427753011","16407956034631545308","12204281152214872966","1711907142562349114","3461332045594053976","577229225922522684","2914081283732117242","17566350688622025937","7338782980163692035","18104996687340817446","15921771118943055931","6388967230150179027","12222720016347799809","16578287054557945384","13972094177810194517","2175335223679901452","3112051976034147108","15202703021407874154","11244348469353272802","12582026059335821485","6098507930213890223","11272208570116415648","11607482933392441122","6510555634243289307","15153222191580410404","17635840423710945138","9351534251797442480","8092314091049340256","1165800835784236162","4489793247563230413","1983243751620334971","9273457945940744303","14674929753356943408","0","15666274676000036252","7121244744718055883","8642000274830645601","15777180665599028733","10490551917915041034","17012702556690371594","15892465613077623205","18024906418358428452","14576044743466720500","14823436478070401931","215133849298223910","427177287897911289"],["16757396245222408637","8882399395587683202","15298092796925923380","15546167761990015483","17210400557743612206","6228789424592617169","9180032448896206508","14949167582451517884","15574717548973412370","8445123261497469547","11600255604745148688","8150717905763834728","2320300995126471495","15866638720714239747","3650434595413118618","16388312574579199167","13369547651721404157","1322864319101311589","10578568953469148424","16568349837653275330","6214713817128306773","2166108969604628908","13345648239268331304","17166061098122801167","8347818135621951480","15352010620319208688","1383619370555897640","7076863298588994139","4418610163128204545","16152758704078514816","2601100629902042842","1007277378921372873","17929402981894875540","18331371371247998307","5647624130906830397","3241202800843172290","7624937166423399159","7768822234755160856","1056054769090783642","0","9859163091909958609","11713879106652630710","3154897313486561499","17000987598993209397","17771032091226195013","4491427486586731798","17643490494395254593","9179597728852994557","4250128412235183348","13520874030249871568","4006572790660995033","17418645382705840508"],["6176724097309664762","152078736845245852","10117696519418842383","14231793273741162236","17626402057902804564","3048294138933512091","3395977179216281546","8160803295565128788","6908161362681568718","5899678517373990358","10019615539995402479","2837431420129573171","10032582998081409509","3295783203134514008","8151205029318962021","268006009013295551","4603102327129849888","11181503962393440121","1295841579713177294","9902451441545926816","15907844694416251227","14614487051018521013","10000940683786638022","9423440799151289545","16495124203851405141","3104800829597410110","17508698475652434975","3683783795473587526","15561539230718884845","9136853264471684575","6313590161123107705","8818266140387268529","967887007219534693","11611561463004719520","1373180454413234343","1037557597154076627","9037084739104164178","6539531841358598057","2492576924755374168","0","1658101086124966295","7494925524712071190","16393159435576136551","13082103960427344037","11343096286012812403","675676068649415789","5474814472442634754","5506340853534249299","13055238750054329937","1736254653011703020","16456004818910388718","9533772339819890049"],["11103334659134262838","14309566814736006936","7229616498712182968","6145746069029818440","16545837521414461876","1022989828908124976","798719745636934583","15599269992763611401","6219995512432435611","6914690582757329900","4592094454279902587","6515682931274793568","1137634306567847248","11168120900689935866","8627181183078225534","13824562298072091919","15684650848873465163","15402849049413083540","14558943905336320372","1091467598670389160","15125421996566235566","8510961893919700118","9120119772901182033","16666570510916695711","11433838300810702479","12473255450861341129","7702507662140150927","11046095606139639700","1618924716057502194","6478636906571580489","17983127974881812878","17117315534294996151","17176432598169816555","9749882891076543787","11927539773360382253","2554481582194544219","6196350899504529676","12907274856369255117","72621632224859825","0","4899570993566174764","131970647203522768","1564696852744655510","7730602693753459994","2722170267553664348","16732395242441503338","18191445425069751747","8701627513067060407","16688291901248694460","18114764221444131397","12996605829253509317","12665798452034210357"],["2285320209129655985","15067929107086778833","16079260510430915659","11469947892848542994","13558962142055284192","11512311180381306766","6122290498182573356","9186257665547296850","13349876847493485436","11127984387495378613","9513260357236449208","12453328031111757611","3875450064323063845","5080821768046833119","255580139696150638","11037800691215680758","3741853115481104525","5946101791407855998","3169263939598513489","13695385735756791809","4613565449392411336","11243111691836905207","11910540062208336679","9032737329194168633","5953613302545805429","4233287703067891260","9256638270487749751","6108013864073068366","8348784450955554780","17509178769317956708","7367488672879069627","7232916002133161034","17165495053938340819","10012254416749486159","11293499436251609610","8667028400139991224","16760112960226745299","7549502733852656432","14383830015659646344","0","5130426406064993339","5796424798771216300","15800060672090806322","14010219954664739188","9678610710439805808","8482422988556178390","5170960284492690788","10409908799505837871","3051117654696257357","16887013977510697147","14702081215820997783","3456760500843779691"],["6243177080438949035","15440301503475137361","14626706168778401555","577216144354721158","12362331162680824098","17098759736005718563","8212091674322163548","860935208568455292","6614880116942534555","18389755656230749367","10138127693667331962","12673326873231646124","13473123310111553078","16926804028264003615","12449125783877936227","10523537511049948778","10162105255349870064","6175694858652314650","1404020851339306040","12798897545465344684","1277282842132846754","17446137144001191994","4968538045029259802","15060572264788459698","967674292471989836","12939852301067561200","3492414737820967530","10935979554372314487","491643994831468901","17579350184860131411","9092993796976829233","6991334896762224782","16025955681270155444","4876495585960804283","2957341044869848164","6739383733948618776","14888412201290766749","1603066945892615274","10398609944089003019","0","13106441158456976898","6845959741185526015","16861486475853099801","8634353590901829385","8766904599723999588","2918715742211672383","9515071873724813748","8240912580236525698","4427289371279241722","3462549834821226906","3487576231952646221","3961715392746825066"],["16258799222588436234","13014668207249158864","4771313225654999505","16760971849604433877","11678557144622777254","18335404776811393613","10756511412022935420","17158060494251237422","2803660086584708416","15939460290942355137","8254107227322003783","576957241604798246","14984895306278738159","755956182769587441","16466268592317073585","10749935286521433740","5595407160317406928","16769965287819994636","10369441132441096060","17509938413893266810","2247168786574097609","3132988252991552958","7655803508126634409","17249870621611958607","15452333176578442474","2287830656356419530","8836401127500826049","2136834055924310549","15817572537217017572","6349820749394195990","5634843232636429209","12099480047409026493","1779072810038548753","410654742347465773","18120625209009136709","5555185805461371657","17951563810733871109","16469337558189815117","5215556823960357985","0","16967524315476250060","5321430811990873642","5074353836702131765","6509431681015672567","1728105546416730764","3616694051459412026","1252786239136376030","6702891648485484840","5465437570428760482","8320050258891461030","7404175960693835937","5699061397650362089"],["3934136013191056244","6555783243511996251","14774151180703120630","14155012923718875958","13606145138776089100","16448144609067271096","3409518145225960213","4875979147872093925","2942087922702009699","17030877283418580702","9273159326404520005","7475278315048505711","8659060096900277463","12933664485145997608","7961337229959531311","4029957766017149932","16692238558613913892","72836428699459959","15552637261242446322","483127579357926500","1232414559614033640","12024686425912992241","5541393479259294124","6067999624549986865","6554605117367274777","4854558483016582532","2223047048798275147","15439165555261820631","4186768883944877408","14283853526045328081","4533945691537682914","9166037837063829158","9246343150589728608","842857403206989288","52649393598062310","6149035715815883793","11463615621663417809","4187486463028063216","935086775987525106","0","1255095496048282359","5615068616878886833","3015611193373191574","7658182310042869399","16967540658954970331","15030310617764467949","17772449689674309408","16362339622760409376","6398824651352384791","9052179330729130139","8771213287090281531","13481163896736367096"],["1714921418898733717","17820668512390018108","17505223625001220163","11295451054233671779","933567858873808410","14546084096440874720","3198449024577535736","7688980251580284572","5250630233717211254","7134560751267628500","3030935250547454338","14666560027193501674","7446096815837346054","8799092291994188795","9270043813428618181","9350869131416614247","15524525453843658723","17064412790936757975","15517349102779495415","13880082871163445025","14400992007293504339","1538198067142080612","17858009308525478962","9649687714572528252","12641207436027109895","14398730731467560864","17550621005493701971","13636991265834680477","13633208724013600599","10809776641623524208","9195851926959622628","7465594571122804176","3514693327975195912","14726425738545271994","12611643991216367760","8987844225332457765","374059065917134605","17102838430842045256","2177308919972869726","0","1775115543394606482","1697050187024528429","3613085307466793446","1727138310965161680","626002475259202282","6686148945564030161","1937585137940380899","5921298617851357475","15936748659021343199","9358851816405615802","16190395597588448999","12520438973638866028"],["7559145390548485946","14018946904799601116","8060372345656103472","686015829892884468","5638066458264681094","10855066994171423599","13024066151308995590","10810431776090430690","1477133726648965231","2446520522075626567","10311135652951165747","16472431315800275130","2640307413312963423","13744480174384080072","13830250063217624803","14703622525878723547","4158895312886357269","5519177802404111036","9417036110303388923","14850969981009350312","4840945756024031936","13805299113052095231","17446160434088160196","14273506133841137988","16654183707286381499","18286362337988277968","15571392170826030300","3665452753771370304","3979096239675340013","13495742299298442099","12359151872228602668","8082832027427301750","811288928426066173","1114780099648368989","9977923991640271983","10991592984591426544","5220806049195451898","10717814883178085439","13432875276647544026","0","3488328750532953784","16278700108125008293","13195266831056716868","13962665389422972444","651352147809746738","9149593364837768654","14208238932543022024","12407505312194580293","12728641420874056205","17679208105781784022","16115100517973865479","6506724259664157853"],["2717223648396350310","9637112255608668182","8461185548800355509","11344309621142073092","2047971817364203132","13156822234145428879","12684879855293601668","13167077544150937889","14388414445820960945","2760922526445243437","5351184831914807672","5607094881423031386","1807834912820418530","12345367532835960172","13042402938814711935","1851581378743580514","1338872503673953210","14475190052180289602","11799581208789666280","12088452032048464142","5519770793665753813","3918073970456767841","1424521049743301557","6017795011332153338","17437649474403405360","17491802155675034371","13301121322874975747","12302283143794226753","11635251341682744881","18077759193066338630","686565010933165305","11538008375133002712","17781064709812716289","4482479845165294141","17849775999439673880","17534501656704173590","11941787167441598005","1941130094096927334","10868532748633073269","0","2625802672021161360","8311968953815550630","12241154825023550140","17101878336627441228","185307691604096966","1517800049709218258","7360545365148260696","10928419656344606149","6447450204311150868","10124352654115234896","16168655229430026239","14660466065794239421"],["6098367950738969289","18003284081187503988","3680972903643041833","14103925037377861457","5340453480479074966","4141399692120863804","16799984703139698487","6338617340059333438","11189071661319109446","10144187233730374518","3155290888280447594","16552532726454557015","14074437622394845868","6378152260214742949","4654977446577077943","17401860298928996260","16859133384233955494","15056156825881951641","3347891977305023218","10536358794339438749","924054036778549548","8601273791119441414","13294722520997480538","12929482790706496084","14176835323503195317","12871654533376650814","9066595315910007927","7210100356216268591","13262312214279136446","14665183021034767475","1124025210424581257","4052341767197624871","369813173491121740","3457252446976410429","8434588803539796871","12800233521163961033","9684705049349165227","10735597375188093035","6002654883230271287","0","15645173264989943672","15583793799834055137","13724408031314401355","8834011334053956392","16143670664170510681","17361187197938367505","8274040051641490105","9125101298148381178","1811000399272714954","16516015680791876320","9827574651743403342","15013007673052324152"],["5856508534117169286","18013081719764111493","11017066087703293746","8325351664477804048","5074357701001772149","4532328977483900786","4233434350062671429","10859456546685812607","12154151929281115582","7685132459053910288","3977169109400975435","7924614870059678757","3115152995355155425","17488931277777993923","7136675202627201557","2209564802617212921","3619511475650099688","6585176389359940793","577602237628374900","17228502299130755603","6221823374405427013","9919218375690538168","15133267806612980103","12928082999101196989","10478850525512725980","16462032202624040218","2609700639423097225","11178982544524294585","6285495124457685491","10392541006591663725","9595333037727819069","14685024368326203042","4913911465975573376","12341411679919828789","5423360069292130991","3521118286872190984","13565170267683785413","8565328853774095608","16700548554363347973","0","17229169444306613302","9437872032274825394","7297054737773943062","15155901807680724243","12637965534895912431","15260061008053607286","14221125904840897187","11746210067979723436","14368236324619147838","12090051225967912411","12550900610210448348","17896294437061636708"],["10387648239994753613","5285876622753524444","13769035321629919368","8146299911054699872","16825742401379108605","12806812359730888612","1935739719771776457","16697177340696703097","16693513177899854800","1253744701753642411","9761708623557363565","13426294873482951847","14392700366120076039","12933213943791538319","705064004050923026","15500484921667747484","14861616849428346758","11775606830557264534","11556758573112930582","5212592439855330646","3006850139490833712","11930046836950833824","3060885102100318992","9817636403884582319","2315584345583913488","3098161585902333780","18080178242006264922","18373947894742917670","13533108682725566748","947343962121710172","7756057315519388209","10832408341468061446","2641226242692509469","5249504375419506924","9910746916570000980","178635577285353120","14831813884998328367","10422935381211614348","18179668437563280732","0","2211808621351246662","12824672325828105869","11977794657829540825","17804246907956408822","2015522457568974257","16470718893793569023","16331119953841796998","10202385611325509760","18037000028280321595","14920201537943794018","13022965023557129281","10201729086854720992"],["991030237716797598","12114051721187145156","15838524504849748963","13300786488364085888","1792097796991884138","7691213579334589727","4254323794834581365","10137470461633741047","2220402626277393793","196024752900539869","3676174261323201406","5410502803730314714","9694308221121725452","6101325991237347739","7955675271926060143","11057700696658743505","7397661776182364884","7803406811289722758","6880211347755302471","925502050805447725","7349770083307693863","11210752843829897727","5338292791119794420","13666055618291872767","10496633602480199486","4277470982954692167","11182542838823321976","8689692673277825671","9620780474201633854","5350406586749150137","1956057472450355582","10602712310891557280","12874969982028152535","9142644300371371540","10968233645134808218","16635699286384626717","14290880603320792105","569766926850806203","17383213808502112622","0","1294945112931449283","15498312987804505007","15906038730234747656","1761687722302845120","4042905647205732788","2745684222830283928","2898863853495246510","6963932401582515288","16878341311748510750","4256315511177924374","8039655575657740033","5868157619591239968"],["10695418452191554853","16322983129401332467","17644616222396027968","11595562268528402451","6629603519222398032","6164950906484646399","17654458569657965642","9863543564703381164","7665741214368566553","5142282041098447283","9163844823277465368","8652647723461606345","9335672109200750663","12915309953930943675","4616922618694879246","7819060846094215426","14573276868241841984","6500486284650004740","12759648950477625620","14942216034338898507","648991607193831455","7934860250056000117","14101765825135085000","6110655774530026371","686590896904738992","3119575165808542658","251854627857056736","5118707164587794065","15862755753325317016","7489305193446888304","15977434019031872934","1878730617445493472","9323185356712433271","12062028622590616043","486118887709483298","3310400594527282975","2737231058432573840","16407225418644621130","13589439641934508077","0","14737956594210585975","13262913989771495858","249046665211190593","4429682324005278314","6540486281038560583","1600082783906070284","16801961878697588771","17555571480432198571","9047006186290155948","5761880103659494310","4717467974389511823","15507307833463676874"],["17909304253634749798","2763389475564865831","1582176267040884826","7241335765376692717","5740170818661020789","4457431050056331491","9325834974306283364","2686490036936005749","10282357786697017342","6284644442480902876","16396421843237156774","173677684592617229","6650833989450848409","14279099624335333004","12310568681582654646","12014406972198743809","6637926736328877352","1804562805038296214","8574379342886389824","18038645974506543973","16172974032899450546","10023333417344821417","1306274759931133095","15381325127590203048","4746998357083611405","6591019116998339983","13208273963424196515","15446362572791620655","9861800315140588226","7881397682007697457","12597689648149131460","10649595195751555494","2244711929563072727","669191184491674310","13891920878863245480","6541862543708905302","3316549376036226276","14898882527513637780","8915908412660473609","0","759152376419292476","9488132020727534005","16287976212179319989","15265360240821177444","3223472367440572581","14973359911591196920","15529457551510213551","4520523456246345851","1071254845435031933","11149249143221826915","5099374203782486565","18169487341548875477"],["14178817583086967145","18243017229206831620","10194398301157735251","14872826997772867026","6603041430934078445","16340409334798267625","10574867508149372167","508471414220530788","10482321968650236339","6094000838135778973","16767082041294257053","8602820981475225651","2654983293795536621","6797000089362057785","12049588617516664528","17612593333224125781","6264943885617173674","3809802926210235727","4553636338886080433","8660778039505008342","9415578880891293713","15092784083141326375","8992193773771395106","16161914299459964687","3339982555187394552","2551105913488020133","14590522525067270435","11145452411720692787","17656580041883841220","3230020338199544596","12560904247335633317","404724596162405224","14068793194585008948","1646397896297302071","4107972676854022255","17839390933902982714","11274825392231340563","13704398373130489802","11840787168491796463","0","10333849937830185840","6841806561119769685","8804101475809030227","686593448263216235","8728869848565511921","9703171941504632687","9721580026095255174","12098761957899074432","614881782899145472","11752589844244352546","8865165112823396259","2440393994925401098"],["11932966229401251544","3158772746587102434","239629928154620782","15762973418717944134","3973323526505338203","9390450667202478203","8208385234101496078","17859001058499624369","7563364167452599115","8948363808101982008","1558349273037696495","10641658680395385453","3948310195004823304","2566644867716937492","1641709747620618475","16685782714134669700","9955078664347226924","4322220956154455730","4455335104469195060","4042103627664544069","18077955846507128957","14653096872615262813","4072543794175291412","13550877510586020368","16183924344623717559","10864514436931396112","13075003016443706142","11434847301630489018","14992708183176769225","3487262434777683595","6194204303992516715","12688059902410006047","7679634175666584476","13663269189961746410","12327860505688693998","8731009209173507437","2141254173219997501","778807366223804455","16194794384210555918","0","15354792490115960791","13201323909208265762","16421961015383991365","4267304717977554637","9105701923184838109","13124261984189240045","10060893786748712444","10777375586065594949","3366728497612502337","10441548566751866857","9026413836081099569","17487583656395304895"],["17353870006381165068","4981523870316212575","2884873378206095931","9749291639252877691","11188186207545549418","9387468760796362541","16283645721860307707","2265116283195406891","7261627427314569547","13473098849018296225","15593195550461368","15777988307717202552","7229138483058760173","7880405982529809575","7683528709906539524","13755753326419959341","5043410820047312553","5708731024574288411","2902141833659640964","1253655031977406653","17646535941608352398","8787478315179248541","4103273984873368202","8582939042301416193","3031391840683556837","2618179464894077041","15571395764596650990","8738800222955323452","17932310897426842881","8365168046018786917","6911865363574504431","8740525313165521324","17592076654152948595","496003178185699287","2122937609417553761","13732361959635756783","12839045612687724184","9943380007189864329","11659477240554781361","0","14426698247916804321","2852693473795788511","16945401553168133407","16417553264232219495","12311735921953931398","4649305822979839863","17819929071553851344","5834895838072574751","18248487664299855244","5403283789723986869","14628732592095678409","17388473590419917495"],["9468723938428896555","14975896546947698835","8143544250128101009","10194868523543353844","7852603101827302811","679106630816283779","2162275992272547325","12324599883042590324","2073562845805373171","6863099222815750153","18056914526159619739","4658369156167167298","5915404630128579434","3734270665925168517","11932640700582467706","7712106102342714387","18041281053734900458","10315509621704174752","4284640555416679406","6000147728585008716","4219537612789645063","12016930442748870855","8354189796581382124","17800712040712712674","16092967129758789092","6114436301308869874","14287721345223044915","4164291978830281460","7285347805790058594","7284648369667831298","10876114124248172973","5875867557871085187","9102840144449002906","1794978839397935278","11868865311589781993","3522296409126715298","6522952637085969841","16181766106244934967","2027874539481861042","0","309661735230012920","5010900091363882064","11374081797379930595","12747447971257157012","9436902324508700534","17536244924372011472","11693805087630606950","15086797510252037193","12267155589350618867","15001502501544234349","11291885830769593256","10586668523190673626"],["1826239568924267622","17353429287744781117","2894458913903599315","7359363159140444294","16897559437790615773","14711878302442821102","17575900194934082","15176018679548416027","12142490853848226393","5451018653951682716","9947257117557181172","16247971840954855307","16507372357435982815","11490277766378134022","9547181870719746504","9594136776552138114","14752423696820603602","13926281844227436130","1385113212059591220","5406640503836481072","18275545680998473412","6021975469274821975","9991294869109680919","12205848815057870918","257876880673465638","15048947248096292802","11421122638582777682","1523665743567272334","9207306663380631006","9188545878917564395","17090905551112938501","9066082143769150729","1463465145472631006","12151222260755621366","14565169810739299427","7029086932126601963","10312089939473881942","4273595662190823050","10193418952974665880","0","5071082414230126134","15591491261466333060","5003023217605007776","16733133964377286367","17099016375003088599","9697622386539549059","12500124152907838250","7612784032644039245","8746384414140067627","17778576780580400213","7877350826897390747","5669777071162974818"],["4224202458780149856","15830500431645201051","11982055528314462879","12000568581396167429","16584551753611169572","10817328781850721728","17719025694934190469","9064289646772834507","9466479990908050225","14288014725226075338","16741096504596448181","15072823349074940354","15029383253670713872","12529773471893586843","18366249580903679556","9517370395754171822","8300434386860818994","7410610648810394669","12010540135234908924","16198209115195638685","17441443086838076040","15373059288789478760","11936412387459839042","10079704473509112369","9341833547927151988","10869225347009283563","671140578672863592","14435464191622571381","6000718392240182714","9551603465723628375","13739278484401961739","532426587303244830","10856005657271490961","8164141090237858720","945068751742245628","1332088643383021840","3250985931240873502","6370627365488947510","10725262581468396927","0","13382205907244558776","14078432983447190387","10266157713669310130","17519325959899223125","15170762846324143568","11265367153116120270","6688376128916283817","14030171375113381680","8346695298711941689","4146923934976378333","16246050975852481064","16805350485436125609"],["15480921203818437053","17739513302288123349","13508616492797145017","18286702916719102544","15621622527948806741","15615859358295472233","7908379244547365062","10854972737247721469","4814319499275782942","8759232652092847517","5454304946672048645","18183723232947159495","1023212884806796792","12533183956603325365","5004646385772159756","3737464204814984595","17472987131876804793","5425193438131997141","7697082173251441074","14668092935676222915","13941289458368780301","5693691305695782826","10016825106899925616","232967464877772751","7613343580982844753","12264830466792032028","18057642935073321833","10259657921641000109","16427030922530227077","2935046336160371796","617711443222669668","2447454104291242023","5143724676153928568","13497699628418729204","86483023106092694","359262070565800613","14324182985057934499","9857379536915946028","9066094839267667783","0","18069295323897648","12561651365109073642","2961054196253102358","14733142428191288891","3638950571126185377","5729657131946522554","16170732042236398863","1535549235909306641","12682589404761937669","11365479618793755443","5565429580004190301","1414198382896238094"],["10504951711584971553","12599916913681850515","12320897461685743831","9011781309571258525","9511965180406166173","4041626520986250764","5884284763799197808","14772674400352116619","3925760004169347046","275598752710833734","7640468760843000319","17902738255750008288","7437324219802586489","15423357412442865622","12608468458110179207","4044305811917222781","3501728543318927289","2285888269565522053","13597820873527055442","1384627337717802704","1379274554603306538","5708402943518378990","9908698880662782464","4030139246737067189","5645723121981841830","6884613702018706646","1330260563428935767","12860379612068423986","14877454530808536025","9879251171015588943","7684719238463086171","2163205062897487332","2019337203913084341","2147864431884295393","915538507999793958","10496786892010717627","702028364819765150","18085216941274891928","14884955337927147217","0","12016406998784198813","1583257121236031176","10917495562849113938","8856102154705939778","11706645807348009631","1661784776253602976","17347827906878785570","6364017685938618218","275133410631230977","1468905529429705375","14099594193003054042","2424128732043287827"],["669715936222548938","10775053359877053959","16411158719425605206","11340554867498992813","564366918351489809","11406576060871082595","12250081135581098233","9553200829244800588","17806938058892504222","718003681804872257","2381816257418156674","11222237257755033805","11349687485972476655","11434080714678168524","5834797812900118531","863923693889516159","12557203232462247515","8453528439007121940","10768773466320407620","16935006393014425202","16352621252914647526","11032006203900251628","16012881388126384726","12808746584552448398","10560509879779328819","1865789645916600359","13797691103655772515","7133140297682911781","4556291251188978514","11694985153806667946","4014118920539996243","17642324580809679019","14499803567253835519","17208143482340755565","6132905912745540662","7634514027158552713","9200628717265484262","3352745074853818327","5722398921693552614","0","12292263432622281085","12787520452892276984","6208848375904275582","7396600246541387250","15993517481500180048","10332284518513742726","5584588327008918817","18015339874794001746","727131394129691686","2761844132595260231","5618687449189600562","8783689436364143157"],["8309482090938622472","10158020268997105381","11223504263049667078","10094204112298263682","16759243045934614609","7078161314410013843","7935588341171683174","16105210860360043871","8014115602391564091","6511662857879212352","1221007041086786349","4860700185118727651","2887844336566244274","17348770168222313127","15793493660470741443","9448340693707535129","7939723548469382519","11823712783369518965","15207210905988693039","16354542048534896843","7015679598169548485","7557487016743392065","5178912598402111181","15027131578448126988","12891481479846365423","4849023470552703426","8352163286163637388","9885570691107538571","9462490981049404754","16721141246016168504","139092495484052025","15808456183146608785","16415780987324689590","4540475065483084102","17015651319537343415","14513252723883749756","368379321857490730","17613248362336871095","4950120843825763448","0","18285102283531289320","5497214246008938646","4186303554930905401","18390620768095088884","4103791260078234079","9092991722998790645","14424645130827084875","11448397285029557993","7392246094461770822","16814285760091462134","2809306043886530687","7791238972399158110"],["5764627265100133778","7326327187004886622","1976093493933765628","11805245824969574383","7733929568122760705","3456826215031940986","13087957949409097829","3209951864416733442","12545711979878110204","13034745958946365657","14846509144278967871","4474291064328325932","16590172744479527357","6294431985162639717","4737133199509555604","14826749223672402109","8981593908309671241","3814675826187177730","3969008192158550956","10871951182633062611","11941595906074812647","17752431366904436220","17908466053157699114","9006033116665614944","12016708203500156070","3646866121740081353","3511413704212679901","6450884590421660903","283158647143278472","2313270647449435649","12191461097928565642","8563350353857726740","4995840516622235533","13582579643953333136","16064606938274164711","16470726228695619066","6994074662815518437","6477361229661552285","5989879089251351029","0","13309245739973588971","6175364058076950698","10603836940444261900","8087376254580510349","8187603354563923410","13384842092901809002","183770313362958260","4929294004509473482","10924570763235635847","2060638134000814545","12281576766290855185","446605625257788679"],["11723821991511210637","5165386626758459091","6259778069341172568","5952528349611908387","9073107663464596477","494209661810905397","7546487923070950788","5097675060071335472","14462735638207667178","827485356954749280","10438788902824289222","14463687849924860149","6472404399598388864","4400314002996616233","3695186951801500893","17199875466907483892","11192536521086008129","11877475497835694037","8854537422832643506","3886779984270975322","993817417725109727","9177243924793455297","12021564358025696617","2633702409586187759","17773520267317608305","6270790104620348290","1366452986380465842","14181230406816970334","2093466635226877316","5257742834412634705","6890109521504761517","13184581010772921923","12362445799250600842","3819906541503046430","13748021922335045852","9597286130355861297","7132435637799291109","1303083735014240613","12901065540438968419","0","8764898381725798728","13948221810266847443","4458628398923128279","11874332370249714778","14297772056789876341","15926128892621522979","1379746532163057643","5501229121922212170","6165158964377739964","430047684028775680","15993542116688766891","7886754010948069340"],["1291764430301109512","2690098586817648803","11854350074092139804","8955607223942641774","13360155013246914764","16229531128740010768","16467678725585535059","17465869205218407280","16573509663494267359","9162851892181296068","15634631510904690123","1819570645804532155","4301633193770878125","2872271318296276769","3850669450998866845","17348331446586376925","10828337576254876069","809856050662692486","3087160475469097810","14370970723170011169","17758900660423965592","6333344417786758994","10431729031515747771","9535900975489222701","7379483418954030635","11860008801336253406","6845129995617684331","18052314191955524948","8571880107227731493","7449486103680782558","11400724774315758517","18161634323605617768","7396344542770901707","5445990201222812723","8229428033262863492","11261983643173237163","6493678338233552083","9217749421792913440","14228778248380891370","0","2478196474172073095","2449427820145604771","9339754196163235212","1697241835847767298","14426477783731987106","1829902621284277431","1469129056085678611","8503386863788598513","5602884441592286309","5855974017237778391","17247827801071232174","17054984746953404191"],["11946615839503029081","6846312280261181328","17348042966112709877","9762655915068977876","11808098722059025224","9320904553075875506","15963133987658544115","7345788175443217043","10787241575495722673","11726524267765291021","6417711238902159544","15223062656485667040","5444641939491127908","3429890353005958383","14984787959653302180","12710041949944499768","5981464204487041544","2371896755654911095","7111427668981888140","18088580769687094564","10479767015045001468","17859255810928975619","10583427163456090068","691874146831405497","14098595329266350367","17172994384763358205","726147245401885469","1598285528613867408","9220106399457920657","6094581278483772458","8910736914130744011","9314889588640665836","10262374451551382912","17313703559119738220","7533635895401742641","16115643047619182924","13967587680757271160","3036352828311835797","17625820472804311512","0","1700413127516767007","3270538749355552223","14022111995068210931","16617521123575495681","14198437112732387906","7118708533466021495","16802794076051058971","10254688909957395409","16121109239961103479","15801629782436363044","16963624184532037109","7059488829056642048"],["8361695585580068728","18148831957526010840","18328469940795241604","10182939174815400412","15659644167937907275","2836595711853121462","12899051845414002203","8208142779500410823","1839879123814636943","3631358662382242644","1630673292416056726","15209738728395800903","3166279299674574417","14737034439626392896","89276310419548639","14435926901243455429","14148961309418959258","10907036488412090380","18330622631393504225","14164666217335923580","16858742996975892831","9420311598241448583","14965830232963609086","8896346149971635484","17123819847119401568","6567397958485390678","599888691918515313","3512759077095604538","17745512654154092523","14223023984904797513","9987235008683929630","10931752499205386212","13710469052120686270","12814553777529801407","5530799494012052379","6517565135590985753","10855458578287395482","14554830479544321513","9640172392072955806","0","15079002956406184776","3975181749747077096","3635337984385014617","18243834685297448536","10601240745794204114","14250620485553829789","4130884898527866086","8486851123932063411","450136225839981686","6911626270782034629","3632431627711563849","5807716479920119701"],["8320248710834602357","2339424809323167441","10838839553074032420","14622600429171875408","18361283081425772909","794556336534753816","16867949631874247717","13543094204252519804","15711079232932487269","7535235535848714213","11102545431037540058","8447505644595277470","5254303017412687780","8524881105336085090","2921751303421421154","13983547749570620398","7349610858181863580","13410171780838229998","18160344982201621477","5442070570104241525","8492200894186480092","16451601210854801326","1016005471083404794","8350342053810421315","12393768098219745004","1472420330689556893","6717739435188785973","5848455424466066810","15466968459612462637","17499714858972915423","16975003783693912678","5359085387842086653","514926060658992712","18427380406288747828","8707755388077777044","2286568650578906198","8863560858797611582","474943797724394699","7775812805313256604","0","6716147533925348792","7594608743606716940","1749208570209224873","18414455900697313943","1400619419172282776","17347720645000696165","17059842315763600590","14087501050268350602","9065442579787031507","5764360841713005282","13054928779435689007","9942624831419071998"],["10005863131372615732","9148043553238378699","11820467064381064479","11375534870024738019","11428719537817662175","12568182224258829713","11791642684643146539","11212366789512229025","13522865535798473928","14560501815267380576","4712215712774772419","2375069197319849342","7614202385742271625","7731571913115310094","11028734081672085402","1000302221952917722","16878890657359506243","8507620876140908666","6404268240912692906","12550915788617051984","1513337180800409494","8035001556564697267","13574528897606125495","15171668812158612582","5556434918570067273","1467993338793627342","3048225842726780813","16494700042381550724","412773717567041109","9786892299927695632","15265198866303458644","12461148270232429968","6094991325810015520","13572036804625955025","1717663555785560701","14375902058689435107","1572154009575519303","1266795215096984245","4576806004116910024","0","97813434269738076","12526652500543533007","9723485294321002085","7266746844359380005","14582540138470293140","14399994645273620946","3475514207110330972","7632393285213403597","17491056821669157282","17588238281637552734","14003543880562832706","14438047897001915628"],["5498862268842709927","13973016782698044033","16092094796132996844","15345490380324391625","16581876323368436442","12479990680068514471","4129929183552994208","5978478202437470047","5075019492838532399","2741921175880822679","2315795739733896975","14852951535110070641","12881614970907623912","14708265856181947938","5490644749753876876","8956197345810651794","2906883517883981172","10338613397422319784","9474614038617131994","12108917050594213023","5438094022090358485","5161295067605941766","1117956319753363079","1295808072804818346","16870503077099037640","12774205310294669819","1399635229571370215","18236893517327230814","12272804128012911132","16667446308078645836","2969173066339573784","16628903427932708090","7752906702468701743","6037800806593634509","15072400081447333576","8780882336391192136","7947397464078571683","14264320718323724645","13967090530826101644","0","4998589149447480290","9155477737126350616","13743663980445240170","13127904736417387922","2235795988004156877","4508745167915012879","6854180016462310167","13520566388771114431","13512586813117546578","10744101664310986709","444041365283961132","3855803039700253709"],["18320243903213652878","17935917019418844040","483933321678139736","3721551405965804472","7305684834150690475","11794833087762541427","9552795554352165096","17661287893204211340","14994985824252648052","2966003719897376734","4854597487922487018","14526733404109796486","5146920611693707323","14775191825834551806","5361393366330537301","10689173995788758830","16628107473303920214","4589046027634186553","17255226680892035921","13892982691177542911","729342772220438451","11617877096068810458","8269054971671950846","14747064238476555149","16279450447218150602","13881475586203024420","5931484252025770264","17793765080601207061","10588965956007638142","2619627084971443511","11690335596955779988","12125164299853659645","9837067572680833595","10342993375017411273","6800574580138733094","13761487009262163506","13257391656589247538","15924191010234429392","10230220585239706386","0","13242549829792934775","6717197889504207670","525981522608425702","12545961861617758980","2419700761829440140","10621931472542901974","4660387979851879283","11353920970627373487","14922066553063086040","15357000014456171782","18163376745674053751","6982649048486232037"],["2221809014355464662","6025710693198954395","11494343375743440472","825260147091730546","9224614612648482935","12712200985502803796","9482012780266732499","16004682265853504536","8393785951031835802","13124235271282703096","5903798578138619456","910540448670933378","14124742783424590790","15164173377915600046","12054084793897528612","3951652557968731309","15299259127951704732","14768220277098012370","14079798411595119476","14220910827244727095","14819900841360019203","1380356516533699398","5007752661400276988","7333257120631407168","2407328530312612318","16967130618504030400","16989754064305717800","10206795109413168252","5362339641863912316","6713707328973328311","15319015184801709684","18316113447014619887","5558115767778606030","18310037172470523164","15452357117324704837","4763327074055714233","4697766766808973091","18275881676472595089","3801235136870418833","0","18026379782934463043","8133172670119087096","523796444169851089","8778416010529874550","13683134770250452363","17481710114872533027","3063257950140325566","12628374189338225073","17043518726589122183","5091835328469512649","12883300839652325141","12398395007100127736"],["11264929173361179289","7544251200899497231","12877855028348858595","10310138130629093471","4493412269352180685","4192997654971819511","9368444940736174563","5231650074263897481","17172622808011390187","14588895939873306242","14333025545611957466","15387491371721999634","12681302745763152145","8144018437281083668","15328210880936893445","13215962434940424276","5508371716083201602","15248816020548618724","14022391823966752527","9750521759521278492","14054137902823876463","6023273046948593101","9423277974962359837","1934624279941735665","4011873751711577544","13927861079725624281","7350273093824410702","9005652153352173817","18258132201292328067","18018575402091993603","15433602947061776394","13465114968423072067","5103690190511751348","9583096420877818136","16548310825990113260","17431808933017916978","7371071065768841211","14754096634201310577","14453116686761554548","0","13220151966515393446","13046374853424586757","10325103087787274677","14402101270455734032","3877831188639336970","5392733693393137227","16415390847558953847","7847131027569452612","4097696693946389246","5200273101233926757","10097455191160525301","2184370853960636203"],["10260990495312734226","12827323640397845297","15509977238253590729","6757321023914633322","8099289699692175877","12796595607971499614","7623275578207541574","3879810125370903245","4354562308756185732","2683746360492795825","4140153014233781801","963688773627556219","8671935894134288211","14028880333043751500","2565400846372177467","3422991786062759430","15833554961845841911","15353758980027282053","13746794130327080062","6253951564272696063","10851620282304647835","6990677403090491267","13871812212353389074","1787685058128289371","15564251150631381045","13142746601377240511","18267538355670574638","2962421030617320922","4374834002039786608","12422108282374102292","13285694771751773496","672452624363231870","5374244441041742569","2923444911449037504","5520585335912835309","4323310220632725246","6774492018951309861","15657765711778362221","9177219597512914912","0","13764342568111419702","6247028627270853410","6441895085382279310","5104708225408862195","5654558637476244550","13456955387483590114","17972421322532986355","3291606307277135254","514171409402473571","15595543699215443151","11701793770642304766","1808029630885887481"],["10268814047889627912","2527345567978824014","4429687080838313709","3501739189565795358","6449532937063353784","11875372037323748173","16287809708692345961","4301372097870002690","700609737719033149","77714123749784051","9858416430133194949","17329034561278924126","9505190010650080145","17945312160310718486","10611310890345419958","4708189538940886073","9169037998012591010","5267788047974506512","1604052091256798170","14712823951220391915","12100571371127989138","9942157729680414976","14513602629189347239","12899598666744757069","12384527385581713308","8529600705970079633","14279362456672290322","14214973271700281206","13867270948570974808","13354409644697742175","1533561813962459293","12154925462737381839","113943438042714012","15373530802553834635","13810997516294067101","2298846795361549434","13086854284037528324","9778562629854258820","1214428072069231688","0","12104662824297664902","12636480603607693209","12478353449184133924","1240615875375341128","14143536106148069801","16090832341491659242","1983665161292172141","2556562873073378225","6632325362196996321","2595588552628466931","888142634647900040","14058182701346393380"],["13439015478156896856","13558922721538161897","12379846664876732210","15221686139624356802","7340259298731491843","12735796668013714198","13482202927226976280","2286463997816320774","17328977441542779321","6628726453885955488","2316241659966340130","12677192218737278772","8465038208790175487","886915629701130252","15963511186148324866","12436172029129091326","15408769609874237635","16965992911970348770","13277648322891988614","16721129423160863887","15843061917812196134","9584716548679440382","10335787641599785045","1245268593023145350","3645752933491887036","9378726518572936704","6112162019306539301","177938942147106764","1323744590207421696","2736004514283239460","17318934683794822376","17970737889541099224","9468818763017049460","2956400891937040587","1798253346937605703","7185102851611775187","7736710517887283281","5177742737483272669","11884274158702599331","0","12814495061285828590","1953937848574592550","1693542927248086903","252104643541296339","6264910946081644119","8510765197589765106","14990186296634201520","18398824241932607727","16200885179029345542","16441526287434264820","9302073645324212040","9106820153101373733"],["8772855676214635628","17418992828530185653","3441805692566350200","14337531796117775583","13150658585908431744","13760305251157626873","8574599347731316577","12057531221058274320","5653450633719435859","16974042495544438667","11262561095402910207","14855264352011569161","6206305417090827757","3877758871361672125","8428686677267904922","11958533141414531573","16759228184093761004","16336110951080713946","7600095337026307820","11868529914653221619","18164379663243625344","140581097190457786","528388330974115617","7368161137921172626","6968298515302724735","914749757149524886","8787006584168947422","3958565235428754839","13574123749456544426","5313571591404060617","4803387872025379608","7413018303764345162","9279493144045358013","17638307467096300571","12394158136183551669","13112720922836647585","9352084516087227482","10324781561880149363","7961105644254795741","0","11708836717803292098","14856054780810609810","6689188102993808804","10885503718976150585","13391611067059977125","14349929544483642711","13629132601476436711","9728237750993015776","4326484953734573374","11258523129305692242","16400898923280947272","4588372076766211597"]],"s0_siblings1":[[["9116322389463432406","1952185078808646432","5219300197985808292","12256343861461050158"],["6475687667090375612","17389014007000892518","4019065467632524359","6143909415467189279"],["16740522099623605078","8528697703824321472","9702300100316953579","8117106919898466643"],["1010636533566369348","4610350206411638954","13203793064085650092","12147298578537489707"],["9015179814335933966","6048741416314837702","5270326036648911283","15692775853470845275"],["1847150919844490773","2288749999399646145","3682182290673867729","18067940366078436661"],["4860218275025506019","15981801919307264754","11622539110520754319","4606512869855034109"],["1833747521720962575","499397295181288889","14167221824876348510","6036854093555731104"],["14442804934221189710","8162961652067987527","11068995712652465126","2717580888530057360"],["3985778502465161372","8226155536026913333","10466474134039061235","9772818438982110068"],["1031897910604482656","7714030582318072159","756716808284483362","17025928751732540897"],["5648670936103401495","18288721490447740654","3535179932351629961","18055125787997020172"],["688582403055161646","4140172472566295203","17408178031065244417","12242978174387531206"],["1317660200395494823","12960539844453473748","16420687463912898743","14406145598062014902"],["4340835704004628138","3093041026726396878","18012161882988436034","14500215985195028679"],["13317854779594397502","5184939888813827946","11170858570166905800","17850057906956256989"],["1588586881765390788","7038078682252533520","1552678451000163157","509582752665755538"],["7651680230165321132","16350974120942772954","12484644582683815902","14825965845405564906"],["6166247739175571091","9843433325804058319","8016930322496311064","2490964867642701215"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["7533382558599498972","14639580365959256364","10832084899074734828","16884502997062868218"],["13909846321545356564","5423993857658509071","3077569813101249120","12676926974008242447"],["3936692931168626091","15871264105250934318","16333052002580268477","18128729071172451560"],["14317225561508299893","7765539947222275130","12689997492745928044","12574792860673232852"],["6139066353514457365","7438381277591173296","12067551521651964719","11011258140166409817"],["17422120041618850299","11122406951313008980","12719329946408727975","13562088498718252198"],["13133546413476630122","14225191916967373578","16780253481377701936","12979186025142440835"],["13301560744793159568","6253279220674232957","6454508956211708364","6677450062506335102"],["6704989341788104545","12615156877588771677","12402710748950166606","7267035469591930700"],["8250473205911754615","9981954299643278542","18156794871650728734","3038181514247102571"],["14681325400237925257","17075865793411746855","14228460949841163784","7319243055177832922"],["4530783541462799396","10124967197813076932","2276825880899166299","2062419475996031842"],["16512088640773448275","5026225207470880321","9723042660358020556","6883638150266647248"],["10174664890743176661","10045111303784146440","94185656067365789","17175644471732968880"],["3490884317609826615","7722253297499083388","1482462299675301996","3454254297136676777"],["14058210262098802424","10200148041328600264","5226709179739491802","617650952852207554"],["18099775917844496493","17783693641701114421","9438039603372830505","14831592215533552439"],["7651680230165321132","16350974120942772954","12484644582683815902","14825965845405564906"],["6166247739175571091","9843433325804058319","8016930322496311064","2490964867642701215"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["9026671165106662969","4001056396852911096","3117137736730195188","9804873271722549862"],["11224931546806246434","17760954625229549148","7630150598904410380","12406827468835461504"],["11978106584311149998","15984573916615534564","10800318775369965326","6262871300598389286"],["8323715628466167543","5732756191721464191","7039580942100373834","840747124336899342"],["17092031508582132404","773914837993214333","17635619572326795129","13486879176488327613"],["7206390908018498489","15214980898392923192","1816439711986299046","9580988279194927637"],["11454980282508728739","15617388065516021344","9419174498987755128","12502096468150641335"],["12057475256488136277","8516490889304318123","17547344527141629632","2009202068337193907"],["14135322311720659114","14134298749023571979","10968370281022839575","4803673745941420811"],["16771378518587513860","383749572401160053","5659799512229845737","14638869123875751695"],["16154837561488620822","15016708431835972040","288641267313422532","17434168318362863228"],["12856122450446851318","10828826845858174636","4590312586560352605","6854562500707352550"],["48789292603277143","5865775923199021578","9885227915292814107","15696450433786399489"],["5944241158078792264","12933992039641341077","15959971306647215813","6923049537731247644"],["14862895780909724775","3619940706151660623","8272846166907340514","16311769990413609749"],["16834593510926680543","9159405093123783892","14369132313130720957","14394187123213597792"],["14657616336497142827","505590759725807261","14086191880984678489","4161605989232786267"],["4116266419273675542","9209239022460860618","3409333246614947774","15845048648987278030"],["3729974320423795929","13426102090680096429","7141449717570135095","9756956530413408752"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["7854829094559662928","6251914435240902761","3181946422826109400","16992587481570478607"],["413647121856075527","291050360145408225","3828863180737415234","15770578617552043091"],["17034754508032278847","14547626614850209930","1042102527425788681","8695356456891945402"],["13284894693186615690","16035089477768210867","3315140326014209221","14345857898043713802"],["16572943875533145117","15817958586168550724","4278141648813762721","10264892556406650164"],["17311076809230729284","12366983924407204467","5583685040040820686","15426516844912556394"],["14276026027077482076","8113652207525129325","9501427982160940686","10993232756200180699"],["8204081084223282348","758375671348393824","10386325579758883736","11767859588059533108"],["6765579665564996118","7863032491713466595","10412980227966422338","15899307822891460095"],["4925302398559080308","6499170940245081295","12497756771290730864","6852323555389771559"],["3731023735700434720","4728573066531416561","6008811680731501293","9460347468688209564"],["8243321237853919859","12879077321595532314","9296363228820377097","7488079198795398783"],["555995406710729274","11338361586393158587","9406903239910019429","12500473728769974273"],["934562271299595411","5064198432091730894","1636021437913441984","12347812250869576994"],["9429475782158054560","281371277880330929","6847682224327792614","16029301585124838440"],["7689582237712584654","13046869152104857139","10769108943150382228","4314992337021196403"],["10482162157716515654","12803031882278410922","12198308400726503885","6275794527839795034"],["5493668120863601849","15479170189203263361","2015378068099034132","5472638158491809052"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["5197518729215791364","5851546614749851732","11395195351127818667","10030371977754308443"],["7975651418583157012","6979616395784692509","11718340667231846433","13697592356654538289"],["13066287864530690671","18245355973589753506","10029440446094420248","17159044008538999547"],["9035533028123135881","5685301070397762795","15346727870878530434","8422917851931198695"],["11206816318261213340","16304334644630736799","3584268556366478551","13717240512196059640"],["16072378835600148234","2120419860002363401","7215932390945849143","17272571208216201723"],["7691302381797447456","17233477113727498459","1589346278534098216","6227407045667639495"],["2693950525507071784","11530902877537794965","6060140611524775796","13861697721819815699"],["13951360500789694815","3482631244990583389","6506509489713658746","6926263184295097393"],["7544331975859843349","6041420632393571346","10514320247551115472","11072853346480557381"],["17537460763676134315","11861146739516369856","14248974732790239224","2665508418956261735"],["22872042721100815","12365655173671982939","17982024241399529918","15822315133518484182"],["14139947229954149050","6557498700267654415","11940915236112676925","5052862461178991134"],["288136795873370997","12312417231083861953","2264708645551759718","8343379352105554400"],["3790128917109351660","15059810833652957940","9891954972811894890","12977958082110343124"],["17717433858752300892","15231555264789245277","9112035974606664977","10635921846124952875"],["9433774243329749933","1911297299693656211","1800137304728176191","14819885708548432222"],["5493668120863601849","15479170189203263361","2015378068099034132","5472638158491809052"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["18048819258093217889","6192509424411627627","6104839152373445220","3053749421888745007"],["12334626730614728142","6109000661757809957","16853816281339397347","14226097452102655035"],["6339180485021674117","8671987001694034611","4697320826268371713","15464446515844954387"],["17681804971831353008","17492909116257660929","8810005968125014376","12224513047183838486"],["9847319100616622284","244388455601536128","4211766984872035153","9351360621030111704"],["17216862090444696065","15606061884409816281","1765167446364223255","5593380657415563888"],["15662008083413576241","11297830120413341460","8062827868848793110","1609801899024058639"],["5830085211290359405","5235929557652867461","325622976017377855","17376114014824420414"],["7765857588630875356","4828618028920893058","8102018237681914086","9302322806739219762"],["3518469836990193480","11476631600170123214","11671909050504169619","16677004545433197824"],["14004705247884925491","13911521169650340874","1484910024283733792","13238930882534929236"],["6196992414712162208","1076479711724026541","8223850528876662410","12301667989158201469"],["4140999905963873735","9842862360484724133","5711953190916668094","5533701846983750689"],["14346579075988824631","95675802327679122","14927265474178096377","14786633829989802773"],["10665888146589640466","17484513358871969070","3429265225215643765","15450356208353570143"],["17196796136730421108","9745226620665344718","2664672104779508657","14660396825802939201"],["7113912238317212491","10841255592884175359","8203860220774479172","15362411478199671725"],["7833761783279904757","17498206473771029503","1991156864893256948","18319088515855541367"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["10425686233666105830","3518799304251624539","2466905864027261413","15822582507408699340"],["2999779129764239829","9924992638841525138","16110887766762630761","5884155800382899645"],["4850597263009089261","1649107423485704308","11398265496225448016","6396217186769460355"],["17393880702726787227","4580421586065825231","2620823285599074122","10337600991777924786"],["15461559266894162615","6695234466453329909","1036088377622124777","13154549793698136074"],["16687552942501190129","15409573336939005930","12184057880607306818","16111525431924003106"],["7843333488336445059","13015212380210972327","10573774198134955419","6970168460861782028"],["14054925279957018876","2627078984052145251","6894132795920986215","15214303818870562589"],["8680960459854481154","12034723294068869132","9991466108210326571","11550770628471214068"],["1345802525975105859","12549830387730850224","7460263254298565972","13059827652386141493"],["11236612734467442376","5975928129509155006","14123001507854907416","6634358657215255885"],["10508011114429282492","2005399180026423426","12055280834140731090","16916695382392524300"],["1262827279624860715","17512786019180341240","13339321177641834321","10817782172476016024"],["17432902273091154570","11121225273735836406","4909043529978776764","6383867444501007382"],["10093022996954306321","2465549095151033999","3377097238436152268","13258593717797306188"],["16191568905384762781","4110679578757392756","6344503828589536827","14847911589867329871"],["17546316578463284398","7626887439295232888","11088948491683921189","15168991178152738068"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["12075306228946465833","7789461426815477032","15412261528145150792","15012662269027924316"],["5221854445196801960","3926415624501083201","5438834346944316632","14069069314428924193"],["4493967793827936269","7372411731565222388","15687197293489969521","8187840764548669089"],["10406190046812427072","14238202159637893341","7968659314304106553","17143232148907824227"],["17654182308247871296","15039595586298106012","16560241766698891014","2341657415637357865"],["872699251472315478","5480953608612060602","3516736204155291780","2496142249070237245"],["6736321869158550889","8120388997527014870","16138490263483217873","1118214961977728940"],["15303088224251706033","9240013156962714559","1399556211554475797","17149422895110386661"],["6356977998883066479","14479903182328087421","18116654426514499760","10982139318579231250"],["3534258878053821404","3571071366422310606","12173733048392642210","7900186231859964016"],["8489204193356564534","17791125297607241487","12495898973862225650","849471052168024384"],["1862587888301304049","667373819581419545","4312048969167716597","9652816306541655310"],["1483878878347240493","10011733187353530671","15793291396073863993","13499522888096808565"],["7090939317572270325","5582128391115913321","10318478994245652211","15007751067141212184"],["14230656898486148131","16757408560179421244","5898522412682867063","7237824250735756248"],["14810396926216418650","18445122399209285958","10715773050657767966","565969435455311311"],["14657616336497142827","505590759725807261","14086191880984678489","4161605989232786267"],["4116266419273675542","9209239022460860618","3409333246614947774","15845048648987278030"],["3729974320423795929","13426102090680096429","7141449717570135095","9756956530413408752"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["4694908560161797104","3640163987069316125","17363734264588244267","7100746610570904565"],["10568720438520616084","17204864334617858511","9840321314174431343","8399917792236776358"],["9855731423132104133","10665873942318428236","10416294815475939257","13260550705546644380"],["5561131451965744348","10356354011035112387","1227063688116772136","16932562090996218653"],["3336045050879413316","9756888287674434642","9805903415093523478","13578235952171961439"],["13851924466927859113","17401119225117694119","8031744239451015999","11422251663976546294"],["1596137950505988628","3216986240007895228","6881408972500799869","11204323680329067045"],["7048435082448399756","18221635581082440358","12792291050041881015","12049820534944135272"],["345788369919632514","16941613960068932296","16032116244994009284","14400827283328965892"],["11538798964123131689","8462791992857429125","1202653359080918173","8654258193816991543"],["18208671243864004680","1660657374267184489","9092794806031593880","12674874738454398033"],["12724778894455496741","10619070117493698439","103017399655992923","16862591426532204154"],["2674743648101335309","3957938043391867985","18227727797777629182","5600875968771166325"],["7808947233841495587","1779049459120614879","10537945042210069124","9567111829991416076"],["3490884317609826615","7722253297499083388","1482462299675301996","3454254297136676777"],["14058210262098802424","10200148041328600264","5226709179739491802","617650952852207554"],["18099775917844496493","17783693641701114421","9438039603372830505","14831592215533552439"],["7651680230165321132","16350974120942772954","12484644582683815902","14825965845405564906"],["6166247739175571091","9843433325804058319","8016930322496311064","2490964867642701215"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["11108642500034039795","12630650546618616417","17649134886597200336","1748729044898558489"],["313986132090477130","14037821272057472155","15469353011772822586","4132341454337904589"],["10091316115770275791","12789009114936800766","12401325646980572316","15154766379146003821"],["12457774504021574466","13275810916296647876","7390892766498573995","10199768834939939370"],["2344610449838000619","3937931089271855357","4663996575223719","14437314977574841100"],["16162128102606149003","7568915556677074772","6631361207304788064","10194032054021151567"],["2314937300683206690","6701458573125657142","518846094841954993","7920221405732248372"],["11611142470525746958","6225769975859668653","4221256535986466579","17722553556304630210"],["49124053223016872","14856663779536347008","17082666488474633441","1753028627450539534"],["862326735693590618","6238508468688036597","13765769393016704083","7270825677222108271"],["7493515952328777407","17216212895761177207","640094137603948207","5249538447276241019"],["3385741305980717789","2518960642520206378","4183834521073579655","14120400922457334166"],["8928838128665447460","12268154074200677805","8461098893902735091","18367304528171854088"],["5874379766464325560","9486415079617525803","16752772311886207005","13242447515063936382"],["4759293364879521078","13677040151511083095","11195160509750430360","1604683186726310276"],["4565487923546631568","1796031834079846954","7737968806730644067","3383075986501154985"],["5512479058119209896","579447237486689443","8553628770903598505","1337031897507892337"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["10311547687023360653","711818356945275707","16561101825915235933","12046021812732845764"],["13888006011352835984","18438595880144619737","10553368727334353850","15673763645682026050"],["15618195782744046112","8628139925038423925","630249175896748717","6771661627168133459"],["18235678918774712804","589597206779268974","4271187854206053373","6676389313486167813"],["10542904764603428451","896655711307177547","3934352803878362741","16536336174307212654"],["1825386881339242366","12707466678933172447","8529282447791339322","14598633037786012512"],["7709454462252883279","494573236116277960","14324370492000131502","5284979811582302311"],["11294489690489579551","10235604576138465876","9845419730113660264","18025239893969312145"],["9748226494160290767","5064904117677691700","15371972538960750931","4368532568061049492"],["1420818272484329940","5668616307147620815","594735860175006530","4901163541236393241"],["1050112241984940583","2344869880721718628","7809539495770726217","15178466686026556984"],["15156818778534100132","2469078671565224998","2976819796552012577","4723680476139872546"],["7381035313366122509","7652819853082651091","15753668350179043976","3915064298386665871"],["14628817265898472166","4668487311484266218","10782627639246863893","13216884671061884845"],["9182587901792603687","12928933302209387733","14968464446936497346","9512961250928539651"],["5319827210536753413","13657071624578470549","12014298857031451661","8054670392199367791"],["14384568200918472572","6723177851678456049","12244960638478762937","11919137471243006662"],["9317114892048060463","5339679175708281764","14032449259827011449","12136296848987034849"],["6166247739175571091","9843433325804058319","8016930322496311064","2490964867642701215"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["5536676601594914958","689943573353428757","10096849861025555844","12121804593950427897"],["14978948298313166095","14968387200197450246","14831637136676180760","12519552660503858458"],["17113240098077076713","9522820380270369653","14567475555465686862","10826123196149783925"],["15123295392130433498","14812781698995993600","12204664059110641856","1649668229993529576"],["10940491119128509168","14186793595972715596","14317120247371159624","15407631994569266422"],["4456239076916515161","7033940766519302245","14919565459176836731","14975721664385709138"],["183830184019542778","8939702642932086633","17861803245645793563","2042567513764677905"],["17447908125418511330","220530313425052242","8958272631994601256","899365628859840265"],["9367995373791474760","15904329640215320984","12375603203618932984","15840658721311639774"],["10643130649164581389","852228462556480656","11779141366843885514","5852506143634994752"],["5966895622896911872","2676299161763852486","5842700240525490136","454604019221700740"],["1638538699462419755","12045288034308211134","13024557996737441002","9175567865396687961"],["4025463280590173847","10008815312707718906","9420157202723409649","10067882385756135981"],["6666607381406029660","17410309841483886584","9711865605837664836","6189054690383647995"],["17941703578276389899","4677141525617318751","4335690132884901786","13678965539527589754"],["16728187642353956129","8904631083355949344","12435867426896311284","10061453218447454083"],["7113912238317212491","10841255592884175359","8203860220774479172","15362411478199671725"],["7833761783279904757","17498206473771029503","1991156864893256948","18319088515855541367"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["5997539556078888817","7870560086167758126","7757031158561470167","12090993285299368235"],["9684274684674845667","7595560851167649726","14201294467419856095","8577772483196508900"],["11222577097380594031","18244006393059178856","6287519163135584169","9051201288773640876"],["17055837570411730448","4203144322288351050","1397473775568703210","3191673625249268368"],["8187713983636550138","12188837738027566352","14006177535666603411","13603244704813250329"],["4772512745347012929","779859851630132763","13777916098711237684","12356326481438370536"],["6130702220883566327","12268237016433871986","13587277315889801598","10110600941707046918"],["2416181256135917909","15868536198402039954","2274073284846651196","17901073208949123861"],["13921699794428445706","5090657857893029384","15005431097410532965","15781309047381930106"],["6791819121207604746","7123708334715563264","4171566388600543154","16359571816015268732"],["13299972323045291897","6179728373967130089","14233803849746061619","16192263006989378491"],["12290177956131840504","15316140042462994709","17544472197767762864","4765651473411800743"],["2640291459124646168","6953819050331304249","7025407093719065637","201084474745384431"],["903959426063729213","6692181000309364275","7119567746580453339","7496215529998437861"],["5250045515182301456","13210542325393278295","9641972204906409902","3393089242248558308"],["16163918397166212375","17511067354404709671","7524082050220042813","9397085284329362360"],["1588586881765390788","7038078682252533520","1552678451000163157","509582752665755538"],["7651680230165321132","16350974120942772954","12484644582683815902","14825965845405564906"],["6166247739175571091","9843433325804058319","8016930322496311064","2490964867642701215"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["6387013570123739876","7454881685698802876","13206403050325266192","9835710929796341683"],["8839106720377702812","3318631377921602486","9550683960632967638","13825134072101939397"],["5814159124435740321","1283749724943423523","4576047776227959522","15357647539205448878"],["7714200249576155097","1044397366448494159","17346533511975912042","2108566396812185618"],["1099704633276347938","16522769830560389108","6800820730791637812","9772202940397720102"],["16884865033241696875","11710799618787319197","8180885818122608488","7668709686327322478"],["2363670537121962912","18378782115045956311","11673399816416925294","5860372137589544344"],["12243132395483608114","13962180398801674274","602062262373359951","9908509049453144314"],["5198214265957823885","9367532527999715360","18395809147088764955","13014455485353412670"],["16912173829725361939","14875837464250815844","2650195090597875056","17764664448439440220"],["13809845803010677998","7236412787246987994","13033006915735578138","14640513634196652362"],["13566642983281173440","12049076962642112193","15171287307889910090","3947135974208094959"],["1902310893618314866","14512129893623072770","18309783023354270212","10108227591187086343"],["7542789362691008438","8956567919781840387","11839563281159988399","4534950096333947593"],["8822600064787057733","12857378461941249288","7486474092030604509","8973249938350206156"],["2080795493331458646","4471864924717580266","8653927947835398765","4915303914010628285"],["5512479058119209896","579447237486689443","8553628770903598505","1337031897507892337"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["7901585332094435960","619436014798324576","12915644321583361932","13067800944580021822"],["10685611585360912476","12537104922339504523","6549849267003449831","9939536461011974639"],["5663351161407576782","2660828588322005072","7901530554321459948","15625471074153964705"],["6753258446167110807","5925131368948957772","5725748680994886362","17040585513546380825"],["13068297139548086304","16538063915979625959","6480621654528211986","8756146940137563393"],["5655344609973531207","9343204951720577237","8208911184301834302","9399146860876293629"],["1857975683906738473","17958407906236762619","9912903005274240854","14503257414066823205"],["5254030990683083431","11864836214121612594","6343085473689795399","7992098841876282308"],["3141366827530575762","9605621712775688917","17331168164153970027","12613930756003272612"],["11536207097582397413","12622944919177863084","11207427628686607120","2910612448403706989"],["2918885173800340860","11009306964318090824","15893721396774962793","4529439295668183800"],["6044977983703642519","12562411097086435057","2009319616282158637","274878115809043071"],["3821124651107496401","9826424716230674231","15341467241173533026","5127525796467251892"],["9585194677476430262","13572793303978422211","7231143593232068293","17814162173359649380"],["4759293364879521078","13677040151511083095","11195160509750430360","1604683186726310276"],["4565487923546631568","1796031834079846954","7737968806730644067","3383075986501154985"],["5512479058119209896","579447237486689443","8553628770903598505","1337031897507892337"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["7840654954416995957","10225803603449112383","13734104801970310838","818088906600662418"],["13086545490771447077","13347181352445840101","12837358529832724390","13319543419115239608"],["11975410161311127885","15608141908152952036","15340137799308916295","15879756144883495164"],["8395175754748334939","17726956863851035691","13851878306060656786","5477127609734289173"],["2429855926520046564","15553284200790539319","14875992634845030816","2888249383209156207"],["15763991376976960381","4115858614327600715","4205015131134484691","13297377533786782821"],["318377689464512443","7094617782126758849","12758888872106384927","4358372322436507545"],["15295854383774009810","10257609987846947266","3866867345702904501","4301485039092634765"],["9641966826786934001","3130307229057887371","12359023071132045883","8272519040047863720"],["4884100951770745351","11420921604520632889","4677486151253076857","10569031890866589582"],["3994300823288417011","11134061089268013449","6292658715058149758","14230785759087857636"],["5878758468082247823","10138202959249240574","7410567010793820888","5210682865450122943"],["10298010334955631813","16984550306884353623","4527366310477819453","12657775286246401331"],["5128584295939178757","7984289158364435541","6258728638805677687","5786631596863301858"],["10246983251707467442","12208291975162837393","13981547418531072272","8542260028700928230"],["4356499071771941605","13277994194625615152","2139369286375815299","3633861328322547390"],["10266042303146807315","12779162642696441780","11653564159824587553","1396088492347013722"],["8524696953138374657","13010617575242890508","7415001712144144260","9878457151909632035"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["18343165599335745846","11649307990088051831","16303167612312516165","12783463177998975040"],["11962385890725947158","13157112409531352101","2875203466414452505","12933044123428442044"],["12243265497732203179","15326687137395538224","17507575126754877996","4641879600427943724"],["17360996453227993939","17511627074302233927","923645340462115980","16149577942073346865"],["15106136603505944934","6951034367212347592","6529287108888310002","13836362340810028813"],["8481164011006126124","5203565064978993963","2139758890681049072","12419965878000266229"],["1492602438722488652","4601316333283606645","17773640340646791182","7318785638877410410"],["6745562062525395191","2633993155526542440","11726671286454004970","4479956157431643333"],["5877403762472304056","9705421005760470608","17485530732600535186","756001462998485319"],["15982452946743481849","7160112735125986216","13508477776539690200","16322649961504061241"],["13043315133132197428","9697467548514477215","1093522667390740309","1604622443536530305"],["14275946530078212348","16725556232072218991","14974273561419193523","9395907567210223612"],["10400945260725829280","10286209250667116778","13199550225942704560","841847548663082400"],["8356909708743394362","6456738077364951956","11670376751230791661","2223210737300910865"],["6994375359503922035","17883003253668689392","10886666530400890581","16750287414599047875"],["17717433858752300892","15231555264789245277","9112035974606664977","10635921846124952875"],["9433774243329749933","1911297299693656211","1800137304728176191","14819885708548432222"],["5493668120863601849","15479170189203263361","2015378068099034132","5472638158491809052"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["8588890769037394603","18072148605074450900","4974086166514325548","17285086933298984978"],["15729780132218612344","17165188875742142268","6691129100586470701","16877162254733908792"],["8919850972464076224","5491857010640772743","4577600201755239150","17799566173580285012"],["15403694021439031895","15026841639004620250","4090969326472304435","4447759957033567755"],["4208749937793687952","8940732743284384071","18093819803334752831","1799896525025034128"],["15666196408881918662","6754306204948905265","12543508201705913236","7349968895791803165"],["11856880989147080231","16900087211894568971","8161888670641675723","5177818067458914505"],["9172005832804675468","293785082774076315","14250209835905587162","3629430661045614552"],["7925129683033535019","358909355827669804","9025960238002032201","5890639305620612570"],["2527377890928842431","454092659720086963","9950094901393597753","5991308304768875121"],["18264695196832228126","6734971957537264137","17200601454385029606","746046007199341930"],["12667582482030788448","17080025503681030874","5035197452223038362","15422492910200482904"],["1483878878347240493","10011733187353530671","15793291396073863993","13499522888096808565"],["7090939317572270325","5582128391115913321","10318478994245652211","15007751067141212184"],["14230656898486148131","16757408560179421244","5898522412682867063","7237824250735756248"],["14810396926216418650","18445122399209285958","10715773050657767966","565969435455311311"],["14657616336497142827","505590759725807261","14086191880984678489","4161605989232786267"],["4116266419273675542","9209239022460860618","3409333246614947774","15845048648987278030"],["3729974320423795929","13426102090680096429","7141449717570135095","9756956530413408752"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["567505546884771509","5481841768760213734","7105841041203298746","1224612757555056019"],["12659710180973756668","2799346139278827534","11692688989560845449","17026218023957771794"],["9777678722290677127","17031459636392823865","15612316215237055526","3639079458812654420"],["14720746954681185214","1549198776191101498","18095127619890660400","3169047568010426458"],["10199773840570877863","5151831659695321794","12770164053651314093","1454307821364166315"],["2294966213015128834","4667115151222482214","5120047711119924478","17193707856729368093"],["536024154373303767","7103450209376674092","6453852299409513813","5643359221682242502"],["18002607415461752834","14477938578697974744","2087524486703436597","14228876941603082096"],["11951920088758073204","14261298187481091894","5181715472716403478","16839715012264501134"],["2679141867351178757","11488570323479731472","7019570547374034527","11130016266044741274"],["11751657446970759360","1876579352149694665","16353687611583357090","3894432940884236481"],["18127094511787929417","12044143800834197315","8297624075682397960","12015615393030234037"],["11942666004523265349","281072960139254215","12153214022118451430","2415963243068740625"],["186994584885032055","6810231798640373213","422334982406434652","6203248743451946256"],["10359528084756800688","7120864691050636824","15830549844082414200","14508172972342709125"],["14015028578931553620","7422250149334370983","1663200469063923544","9089004814239795488"],["3520444466412343133","14586730475157033479","14272530434686497330","1338448141224726959"],["4116266419273675542","9209239022460860618","3409333246614947774","15845048648987278030"],["3729974320423795929","13426102090680096429","7141449717570135095","9756956530413408752"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["13598172238142346938","5684485568526414115","3408962512144243610","11171934951190520179"],["14046810970949162706","15150847536965199099","8449283682815941567","2188803470794095760"],["13152280254497764994","7319296929682042115","13098399735131565300","1698682849716300576"],["11233249016066406070","16624424718961895721","2542384876917441093","10170816355830827912"],["7182434139169054675","11308434749531907201","15150288730239577234","3413060570632927236"],["11534643637791928788","10969446889068261144","4356080407259314907","3637762062147802095"],["1417196745553462780","5453125282223003921","3013806578697209434","6010729867783186157"],["7233089170954464534","1171561066681262692","1622490968597470250","14969190900557517833"],["2621871277473951028","18398541493593450077","10721175967420675876","17465354420640768352"],["15784461402970425396","12277801157362225816","2690555390578167373","12059071549167939911"],["9476786602651594043","3126130189298027258","13935342375396812435","8752524008051862791"],["17052998292127488548","5511597759581015769","3116392876623157416","12445404242277348860"],["4434863906027209035","8919271607524459170","9105988133152977629","16890109940212687972"],["396662931402934013","2063528812728725563","8460704921626020129","8871579839994355079"],["6822460688195449951","10682391550789234864","17930621768590835488","10973367206911088821"],["1355991959064536980","17975903415673826793","11479870970694374999","4294707143742910291"],["11932168559525517266","14353179054903147074","17172560685488396305","15522397546537461735"],["8524696953138374657","13010617575242890508","7415001712144144260","9878457151909632035"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["5864777286594468704","3848155702102282468","14170880779904596281","10510783451388662239"],["9837481751928644209","10410253360080462710","5622859101775784059","6494347825756836236"],["11799123964731814","5675587989949798724","7261058838585639687","16364866745573392625"],["13634394370579959808","3340716492779206499","2242753890635543120","5775237204409002330"],["14889424237257722595","3748940906308916728","10956049189652874624","9021147667264536710"],["14761018158496355505","511521056763340561","15536814393741857252","14970742608622558271"],["1702251762585579985","17834948400654904004","5848779242152641142","2031442449768054721"],["6999064512912673567","2765272560410641305","17381014924134439929","17540213756085781177"],["7499936100306372803","5504153345076631027","13008366997843558905","16486680681047830939"],["14523769337688359282","8289218038767978144","1426544625970778772","17843523852807175576"],["2599142639255453291","17231736569096059240","9501147930990990613","18300879048991732580"],["9135011757212976352","3703406340625147770","1713204671987746984","5434049379790637079"],["12506722615832249675","4040228756422619867","11670081899999271826","7557515976922136363"],["10548414276175745936","297528569536544510","8391668964139243915","485436702942586980"],["13773541562659848813","15702861036347036573","1170602011721625478","13265376298430454382"],["11231937517526637709","4819891957618134089","10903474612802017660","5527836614548097048"],["18099775917844496493","17783693641701114421","9438039603372830505","14831592215533552439"],["7651680230165321132","16350974120942772954","12484644582683815902","14825965845405564906"],["6166247739175571091","9843433325804058319","8016930322496311064","2490964867642701215"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["1012964133750370742","13200980060752284488","17784251208224800002","4461962933221016299"],["8018282661963850980","5012328913971685534","4674519136117307131","7227229126883042559"],["7308198451731156725","14555318013235721601","8476734733634423395","18209901416550723819"],["15220665867873891039","3054829697380162454","7604534948512067199","10108588125085760262"],["3181345161985490981","16562835714490989918","9973994697709420161","12528243374547080427"],["5310742115947563116","217336989265742511","6965364392454801072","17523721772037941184"],["12368736854808998630","12610613379850522471","12494867938707136988","326133645986754325"],["14584812451102551226","3021331039906557104","14951299181331559018","7053048801927416379"],["357569422962913542","12209708359646890505","14302561379183792248","12175450559772407920"],["13711022740636103217","9755184672790827263","1811696755656074066","7400759862741075763"],["5024206444745961590","6480305636916197514","1048336763300464504","873478008110568665"],["13762184114651371453","1238231299527940778","5787280629683578906","1555042734085914478"],["17189188807964996840","723127600678856406","7595291609306871164","7813101778535312246"],["13339007598939881859","416934720750736476","11103791788330455799","8527333737821384044"],["14604906284694654964","2645893876588230072","8620587721548352540","13807930025360798516"],["7689582237712584654","13046869152104857139","10769108943150382228","4314992337021196403"],["10482162157716515654","12803031882278410922","12198308400726503885","6275794527839795034"],["5493668120863601849","15479170189203263361","2015378068099034132","5472638158491809052"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["2128808527332609273","1402949492156860371","1095784230686010607","9866908628693109846"],["14229381334447196715","3105328718926364497","8943469437082569498","15022927923221915068"],["7879699877995583176","4474267829892319255","18264303422246718865","6218859421309866670"],["16656584266364052495","8585841921808206207","16301640472247737564","6942381767321252014"],["1709225268384846126","2639459099297257207","13199940092818200998","97172492020328265"],["8402949882950774147","8634268111082228500","5376266799310345048","8633033752500760629"],["17510667763702902098","4439466379614617288","16177725863712010062","4705795892220865341"],["3787588232274948865","3346045093828625144","4839632634073895425","1691236056596669109"],["4836673117410714786","12747832566144756047","2055640157842362055","492646768747562578"],["14344797850062857462","15529273125019388773","283225744212296848","14324337535184365418"],["9213886094986716417","7242341895495174678","14977788092133949031","8400703577789959896"],["16864285407368765221","14678003843710581168","2800836722341793724","6783100058310139546"],["5628879577829567663","3255475668013640790","9900653246538691312","2900102133950184760"],["8567585267812433926","8912532911353962592","15770846267326584046","17745354101043890428"],["16607873460899161833","16303899719070288241","17861075377771285880","3696960708088572116"],["6780172344147956371","980104858381657533","4728509290797568215","1125988867737354385"],["994981203432321562","7676497303952428081","3378615834517488439","3609011180939718910"],["14462231131663948982","2744321657687092177","10876173231683841840","13185667575119005524"],["3729974320423795929","13426102090680096429","7141449717570135095","9756956530413408752"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["10492282971727722383","14478903267554491389","8297778089482257452","4587110063080195920"],["10373890513008254707","5728239493054918081","1392959242949488263","507403275847900975"],["6645494985837677187","16855970866402235472","551651820306065191","6818434314751464765"],["1614881016971444778","17954937585304245502","13643383038420993349","6962523567195227941"],["1399441132700821590","7291891537630655000","9251534606431285657","3033788100558290162"],["15027245980746575032","18106470857799825614","1871296694717936734","4390683833236036463"],["11696536082435325787","6011988765790329445","3091193850276408390","15122332749661923489"],["13277944221837546334","13530807015029507635","14583013709893115324","15274175431594249515"],["590375957320092133","14601955130547696110","11494712287574983808","15042230364822597976"],["11637556346523331543","7745880728743960502","18164952852292123107","4686648945253110918"],["5860154601964093649","2780274976693182788","8195374865426895323","7387585458910597532"],["14452320466491908767","9826948781618265895","11673226320255801957","16853910738854382021"],["8926700001309193733","18038926183116941208","7888343770109220934","12244749565872606750"],["443767522561939189","9327209776331350648","13504979664987336424","15560378985342751056"],["18026070660458455230","5213316711147055532","2853724557782307679","3668943581096964739"],["1557919983575425046","6886628979213720622","219472033965826396","13376445289053041287"],["1719899142661999708","17400817710614558862","14766081762066939161","9106718794927855798"],["7833761783279904757","17498206473771029503","1991156864893256948","18319088515855541367"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["6090416845381585428","9543297983038690581","145631511987493415","11390081313762465538"],["14815024975130444008","1756863407721911587","3808617888525895057","8472399670725186428"],["12593716436237906069","14129020692396899426","10029083097179311926","14113257780645259226"],["17166776354408721419","13438286924614393389","7315761619659616901","6701753814343052376"],["9324502449307160743","1489644236578223326","5553549576336037976","9861098958605537659"],["11772197915032906372","2256941212213724088","12378945383273151524","5593153524260592632"],["7197010842959752879","12319265616930040468","1140799448545520477","6465779571695333358"],["13602528248018273836","4708842090554657907","8441686161886591755","12274078493102382337"],["7549279671715189229","18302194734958265656","15332384501787873760","8886092202428330932"],["12653783001227305360","10858772730603695625","12364596326949272445","11656940649863368747"],["13730191379182238258","16448138225547987206","10265187534164372271","5865521940243066705"],["7850989074625854754","1311562204552180977","14600660679861114165","848402993246016043"],["2107116959653245490","11450944759861700254","4241403755672512071","336663343599306753"],["11976069322268455683","5303536872200533781","8603643481722195285","6184277095913285072"],["6154874026189883014","18415881051946469747","16286512697205238710","12278324988749867943"],["16191568905384762781","4110679578757392756","6344503828589536827","14847911589867329871"],["17546316578463284398","7626887439295232888","11088948491683921189","15168991178152738068"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["12355607300759596091","18263502202611617330","12030334227306537585","5195325721087061481"],["8385834203310204604","16322783550529590675","15143508602471198723","11071822763434691803"],["13656892480471898702","15824893923908535873","4450298055865249934","411542453859186122"],["7816494234919694790","13302378063162682738","5341420576671710229","9466908128188371637"],["6234221762873562259","15379460162472487918","9527702714547213693","11323570277347029166"],["4035471027153351345","6991249246345820111","7911331919933884322","1263435023736405269"],["16465313723004178031","3428228847877647196","1235921843496028041","15918931994672546751"],["9172370930994114420","9905619652875243379","4839269004499344035","10539251045239336700"],["6266831878440850625","9983826800049595615","9884481594313235469","14469337545248684904"],["14127996728536650501","8820093383175539212","14883101910520088483","17024395236102576344"],["16341101878670705224","4729998107253550","12272558941685862434","7603541196150389591"],["16850172779937357824","17048693791458144882","9700101054644729337","8564880644324568563"],["1384834122379963034","12074686660775946828","9009233382896188397","9678922049088308073"],["3891671047379284745","11937198173443725068","15295217409143384786","4954313187027081236"],["1730785840257967499","1058708850468869449","6309692099124729511","11618690118625239462"],["4565487923546631568","1796031834079846954","7737968806730644067","3383075986501154985"],["5512479058119209896","579447237486689443","8553628770903598505","1337031897507892337"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["17348825296862385333","8319825787519642674","16505158001657905928","15646150949366264025"],["14324256274531844611","10108217478857134229","9497539547690539457","3051040798672925663"],["11819679888525125477","17433047546154949898","6997320127030653266","9354409578929731062"],["16068222174123818269","16187241367597383033","9837147247784026543","12416804459100314551"],["1431476875464189224","2854573608825738242","17932309501676677763","1667840967099263133"],["17717518450085049219","3851482850476628838","11629207076650603498","6283221159045562088"],["7292990607973062217","15188578289672949342","9049588912841951851","10819255579789408944"],["3493013039531080084","17757889741599188576","2262289808892786058","10729163060745240930"],["17248212000222302187","9666505509903364019","15081498739355829934","8464066201726948480"],["13452672003999980030","9494013887830243904","6757906449792258972","12612561863578033945"],["11622469703148175264","16559644767173690088","4733425081942119342","8679624023678459375"],["12197271601483684304","16115209798402202223","16937797954659376213","8418219731960629930"],["6158632446809653990","2168626735532919723","2680246172566580548","2778864395036948356"],["7542789362691008438","8956567919781840387","11839563281159988399","4534950096333947593"],["8822600064787057733","12857378461941249288","7486474092030604509","8973249938350206156"],["2080795493331458646","4471864924717580266","8653927947835398765","4915303914010628285"],["5512479058119209896","579447237486689443","8553628770903598505","1337031897507892337"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["17685252929243913246","8805781090513990262","13098011703870579035","4908556224210857789"],["11883697840683211017","7479773811927138002","16341956828309640965","10008558788424225856"],["14193905837159566348","875810571764596534","1974798425441743953","18158360586595439715"],["1183714798682055028","5042469945985094511","4502228712337464684","10482502890626547133"],["2662020937196164400","13349800517281276136","547211453203894686","4910021942140677457"],["10047375291905933264","2390729316282897314","13255894876391289701","4424638628962171658"],["1031454696576414407","18112580665489085069","14733285072182005229","6823355029646029665"],["15971286571258431189","12506086075252601690","16486769838222407291","8847601830613199284"],["16773014985336032296","17036187310620344885","916671468998467270","356136127818255620"],["16243621358817559907","709664543729981228","9574504700421178524","4499795462764576415"],["1509005532221809595","298755276183603477","16012952571065188679","5374742410337043731"],["9408611843946447955","1444638279965679053","7032246311778779018","8337086952952455712"],["11367133001897114117","18168640051455015283","16285843585532665299","744466584395938942"],["17283895521173279150","9496185360209735531","6525864424562493900","14299381354468575904"],["12856594423783252494","1838716460632908732","13068439341773761673","6701428936173527191"],["1557919983575425046","6886628979213720622","219472033965826396","13376445289053041287"],["1719899142661999708","17400817710614558862","14766081762066939161","9106718794927855798"],["7833761783279904757","17498206473771029503","1991156864893256948","18319088515855541367"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["5232017139415835409","1316780994608672000","16193911729860966306","9581066249188397138"],["18254463007268116191","11990857504159570538","3290195288701756612","13880596080489326318"],["16548101022771595657","12039966817225919069","1834073442414942478","6455529377945993156"],["3020603625028295046","8787030351833837753","3100570544263911940","2396285337575216479"],["13112425177309341144","17065448721467296963","13141909358509114048","4856147640954582260"],["6102933029343939925","16358685361467791984","485828254861770328","4475599759835621870"],["11974663972096405672","3524546134881135594","3246732027829286392","12929160784685582435"],["10686804270129740747","233846474729415558","11494493895146775196","12822007551378189817"],["17721334432489149814","17387372920076069182","1112167003015754484","11735734561973059383"],["10766460058289399954","7005785539023404154","9409502643756865965","3868759223106750497"],["15935603404905060879","9832588722023540925","13244081383446645563","6481860632662989333"],["3038328139754699065","620876737031516329","12026769478740615613","17699242095148045417"],["3292781493226252180","8768171939268225033","9298573522498557000","430924382055682981"],["15603585379629201745","16779627299364888098","11935274994736822835","3011998696395136346"],["10246983251707467442","12208291975162837393","13981547418531072272","8542260028700928230"],["4356499071771941605","13277994194625615152","2139369286375815299","3633861328322547390"],["10266042303146807315","12779162642696441780","11653564159824587553","1396088492347013722"],["8524696953138374657","13010617575242890508","7415001712144144260","9878457151909632035"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["11084356021833879073","7197398818398272575","17085286831556017010","10126069931363374413"],["14155255010430064526","7524445126293207395","12776674400791920489","17565871829124244973"],["2356105424177350840","2921788453169683563","2461109282834050312","5049951629691813676"],["10025175821804328838","5258456298116882445","4979991076019708383","9760583332425723224"],["3427529715185049735","622959106450967803","12528782656587483284","15561798544656892580"],["5582142704183011014","4325825732243625780","16729556620396391869","12312397545298281605"],["17952221245045175109","16724316059726981813","14262106352535450428","17453184588701199547"],["14819096948688559008","15579395447837353785","3715103805221765986","18421553236168102455"],["15825168657491436329","17895307568853808055","17272317498518454162","9336525942998573522"],["12686519536119984798","4107027423945954565","12332192485833759739","8186948711869262220"],["11251764875989643555","10907059752253512114","4555161657411003324","4787685257284309119"],["5927218699130951686","14626542620306056021","815590385299559209","17327868258196425982"],["5383897920994897760","18302952872483310106","2454373362283054577","7079830515923614734"],["2206243577136749710","11933711712837844749","11547642484629717657","11677990792770881442"],["18411258612253801746","14276533724527214630","18021042161395461174","17875929641958908739"],["15835234600415070819","748103012862313836","1056705324321427341","4233864491729245884"],["9433774243329749933","1911297299693656211","1800137304728176191","14819885708548432222"],["5493668120863601849","15479170189203263361","2015378068099034132","5472638158491809052"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["9264627191618387338","17375640238293384260","13353383414433789169","15043305568338163884"],["4869081395602737426","11814307095226634529","12144214787361136813","13418500803937670113"],["3055711333660254654","11642886508846100489","18070904921728682830","8472257035228926929"],["2883939676017528908","2526762497417254589","648214630563142382","5370670859824410222"],["5127038988049907791","3461144478767819865","4832291196389079320","8667311992806218044"],["6436048409705614059","2410891458520360939","18106291884336823850","17284299248550773247"],["14687389675395165641","7096336223415041190","264432155065152462","7222163519477457468"],["13718078619309974274","1741008175058058602","12501459875265268699","2303165501257473016"],["14574085277148126700","1394672461944640069","11877065914667727126","13348933507467248985"],["16543592338844028814","10941082182325825978","11858490355547413388","15056995045651066700"],["6608497693459920388","14168668686954793798","9998723954966000341","6961482341758487607"],["161971386921297764","14845964790004014741","13036716223298161182","974005758914986312"],["8026174115206194700","5887874516501153721","17854201603061652435","1641050330000819338"],["13342148209475005129","11592486298827963697","5553476214199222829","15464827362592244995"],["12397525031149681900","6664549535969428124","3611258289728978987","10091982785990190169"],["9774818842543098165","10532887040371155304","12986603120148136247","11026684269813006687"],["17546316578463284398","7626887439295232888","11088948491683921189","15168991178152738068"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["7675486758906946546","7036513635506528032","3312833994352891505","17182036438104141809"],["12132047266863499343","15636072782532750210","7307924717973058357","13238773011997542733"],["4258461978904467731","8725527968356437965","2558103000741435158","1678844487883515802"],["11516279071488120545","1667509186819451820","7242966372963299448","4879436830982469640"],["5460675537881582076","6127839986227916547","1794842512813659832","5576684385116471051"],["4212386427684073321","574948777488361432","5539507772930217045","9002297308341250682"],["645732239339975241","435799005723521746","14664372695052066272","11973864500866527649"],["13312024115576407733","826891011281428711","3409525358439267134","14935293840099312711"],["16068277741674875539","10778667966332683249","10766113012632010887","8878585790660696159"],["18383773175445994369","11942898803839427478","11352914330167058991","6289237986394588527"],["8562163308043968803","6342227574499876330","16995268376295726729","12640570919353467592"],["7821969931432759690","12764506133957481725","12454862570450233388","4180856084446505534"],["5699090403352310897","9730681758863430581","14896275886491656262","14733778711490265274"],["1138579618887686567","5921771182532417715","12262397807947935078","8418889669896860454"],["9378398322630879950","9150842034500063724","2992575988370565208","5993015307547204124"],["16728187642353956129","8904631083355949344","12435867426896311284","10061453218447454083"],["7113912238317212491","10841255592884175359","8203860220774479172","15362411478199671725"],["7833761783279904757","17498206473771029503","1991156864893256948","18319088515855541367"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["15569011512458664242","318364815721013113","10474347615976843374","10151024012616610778"],["7227814582738080216","17444967818557596730","2667654492188631795","9886437630983233884"],["1215238579282930995","6187788618602685029","4386488179861459195","2898887888869789298"],["5256634838633635373","16860375330488079878","11771307208342298005","10812387056956797389"],["3178190409879008938","15367884126998051831","18178237077527589446","17406014439226788144"],["839626237389965383","14331887697660535223","13791012299914316133","7899003607054179931"],["12326646465733231751","4266532590803686314","1395970056458708946","12617380698323000205"],["4948760457274416455","17097117248269679520","17791325112031596760","2314432510690432846"],["11100303653696778505","7260461638309491937","11169194513517750346","6187559852411354213"],["7154597345118797357","17937386935088806156","15155836355420580389","6675499396071455102"],["222201774931176017","10622224398239208478","13686244964066250113","1373018705392520894"],["10503969712402250402","13972528700559979874","14056479555236500904","18229273469230056471"],["2565196596045112582","753264071643492575","12456777115096974347","4951078402130316761"],["10169480347746947109","7747091536008915385","7672734227443118762","702206848699628677"],["16607873460899161833","16303899719070288241","17861075377771285880","3696960708088572116"],["6780172344147956371","980104858381657533","4728509290797568215","1125988867737354385"],["994981203432321562","7676497303952428081","3378615834517488439","3609011180939718910"],["14462231131663948982","2744321657687092177","10876173231683841840","13185667575119005524"],["3729974320423795929","13426102090680096429","7141449717570135095","9756956530413408752"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["11212755803719672274","9384025329077432299","3275255996387264471","13352784652728156114"],["1279752287508921360","13442897014751406047","9308270204830519677","2122283410492615035"],["10751389845485894747","9371587035039203060","11901863175151067660","8304186903051217633"],["15525876447016403175","3215738817009974890","716128399898311448","12029711073979837614"],["11416538131214985305","13176795025295409503","2344510620324191103","4554254120417625109"],["17448675001028397784","16375343182943785961","9864573313699355730","14954806547117404964"],["17793960423579297060","4134219177474002813","3042812370718080373","2112255863856027535"],["4721021672410185777","5597896541167610908","10579570548841025064","6189527151952577622"],["17998591336774516355","15973249291254730230","10454474645703326846","14903066073747684839"],["12539793008457654478","12769833852428943927","16708132157762466499","3820380573567250109"],["7560091637834918065","13657351985533787946","9109033306546048774","3741051052372455730"],["17990804851819886835","4170258489082289098","15878390265672389655","7008940164268140325"],["13273720439383987105","6533509230880255037","9204995201725364084","17267347505210017856"],["6730574478778594241","13576853329587305074","1914479816017496540","6108464030826914555"],["18231342403723188627","14717162549805630429","5386412307256557614","4417558249021362043"],["13393645928296942402","6908538378746166705","15122332747981022334","5645154678930958671"],["3520444466412343133","14586730475157033479","14272530434686497330","1338448141224726959"],["4116266419273675542","9209239022460860618","3409333246614947774","15845048648987278030"],["3729974320423795929","13426102090680096429","7141449717570135095","9756956530413408752"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["16549220026532188712","9765836403555346321","1876077814682294492","14145601805182851552"],["11905337161312800964","16667826880797546607","17577252371323162886","15644162938398223070"],["11571441160645749248","1481138714146925746","11397752900042795283","17262202081344748245"],["11782351607000707905","6322369063024376451","7584704190848681236","10784388482578979880"],["12881159808215167997","12591930896847076262","13821643941713302493","2688319410125527922"],["1521128675053750228","8900739390032385376","13296694815604482661","14928550766787347777"],["10680026154573257806","13243191825696010517","2724468384015384220","7135903086472590652"],["15974270809222488728","16314774627994276243","12555857799621357467","976656389205019527"],["8401461454462332955","14121409123437604663","5337957693049256833","18171427680993501140"],["11025417166512451271","15966861305329704835","11481425932506563347","15067287856073449824"],["9590961895163336692","16976212998403430650","2579658433207386876","7483105457571446712"],["12583127919295819894","12386269082971252346","6422889454155355969","1415872697646791120"],["5699090403352310897","9730681758863430581","14896275886491656262","14733778711490265274"],["1138579618887686567","5921771182532417715","12262397807947935078","8418889669896860454"],["9378398322630879950","9150842034500063724","2992575988370565208","5993015307547204124"],["16728187642353956129","8904631083355949344","12435867426896311284","10061453218447454083"],["7113912238317212491","10841255592884175359","8203860220774479172","15362411478199671725"],["7833761783279904757","17498206473771029503","1991156864893256948","18319088515855541367"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["63849418984704608","1958147561656801195","5105368089345689569","5949420142679556563"],["5880278312303635149","4623773921015804618","15640686741067655123","17049029904638656989"],["1264928062962582259","4200836426827151013","16629806144306081782","9754235246181371390"],["4779888397972598452","1719219900212212136","18359462417096046867","9475986776121563034"],["8111181728776780956","7711240260097616263","14310246504867135781","7479429510100029388"],["10321554045601061074","4136569452166047678","470970107647641404","9806521660759942127"],["12857258146403598467","9085967812924938979","6131425542835328969","5509372235448411887"],["1068366395016555593","12964838242357663067","6949229960328813229","9749768312718202487"],["5111795552326583715","989755960328804592","8231232290952267092","1113750952686923668"],["8750190462003401312","6691433548003574718","13955997161220648648","6712140474641903144"],["6511232802597421441","1718091984487984830","10233031424064711411","10265200200490950127"],["6753285865586280770","6545898120090550989","7038998060332086464","17467171938845470199"],["16151215238230074962","12179814902110858435","18002019928134266332","547434644877803074"],["186994584885032055","6810231798640373213","422334982406434652","6203248743451946256"],["10359528084756800688","7120864691050636824","15830549844082414200","14508172972342709125"],["14015028578931553620","7422250149334370983","1663200469063923544","9089004814239795488"],["3520444466412343133","14586730475157033479","14272530434686497330","1338448141224726959"],["4116266419273675542","9209239022460860618","3409333246614947774","15845048648987278030"],["3729974320423795929","13426102090680096429","7141449717570135095","9756956530413408752"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["17531071756764856885","13761899071862545075","15991363186616358952","2792429759575935231"],["11271119315338979335","298652906964945670","6929216484876392147","5356358748146868719"],["11124376631872950903","15588069938941703991","11301942125551839663","8028746004690148635"],["5807028794755586803","12296954346297981607","10919680181864866583","160666530146487554"],["10470254937180043426","4789121303727497201","7363671616273794051","15214614296433122237"],["9577756933550793465","14814535752860620827","17431187981916857383","14445171978482780588"],["9262031096844382812","4635840174238089421","9739652064052066956","5341631170891968469"],["6542453055403615099","14812037748659010965","1984777430173935887","10398680061959254781"],["5009902181169659067","9537674697068682686","17210143771588639277","9400086237419420360"],["2910296647682284651","17617471013229748219","1410778630406903050","1691683575509567016"],["3066194998155552677","482661520999324868","9377915244179909176","14770342886204680540"],["4589535353601508196","6802625058726512216","11726494589654270048","2349676671141407942"],["144646882250725699","11929625918913443015","14254544359738558576","13666036330513078753"],["10782288929684195241","2036506696527930789","7004250279319760365","5392026515523794951"],["13005786910842381271","8265704048806381459","14774945230327538324","10812114307057578576"],["15835234600415070819","748103012862313836","1056705324321427341","4233864491729245884"],["9433774243329749933","1911297299693656211","1800137304728176191","14819885708548432222"],["5493668120863601849","15479170189203263361","2015378068099034132","5472638158491809052"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["6800406919930696987","12091006097515925553","7271501771219915619","2503333410867309007"],["8355365394927897651","8375644573367061441","3132206577062562207","9475389824277630260"],["11683741987433233632","53067805505943744","11866924288376515730","16133717645049420025"],["13655725349768524177","14954030896404658220","15312304611478132905","5446503953262685895"],["13914620770362006679","10437308993559295552","18163984342756122272","15527203757096384746"],["9120247929442388356","16812049732840878410","17708479127759955128","16480909988373773031"],["6505326299318523296","2446155332904214567","10212138513570075737","15060178137212200253"],["15864292474929329838","9949747860682616540","8120323939703846819","5563778397625941264"],["2758831772778737250","5528346384513921663","877893481924336488","5557193026605521581"],["9298196683928267129","1482701075296258774","1153471066075270085","6639488676442548124"],["6608497693459920388","14168668686954793798","9998723954966000341","6961482341758487607"],["161971386921297764","14845964790004014741","13036716223298161182","974005758914986312"],["8026174115206194700","5887874516501153721","17854201603061652435","1641050330000819338"],["13342148209475005129","11592486298827963697","5553476214199222829","15464827362592244995"],["12397525031149681900","6664549535969428124","3611258289728978987","10091982785990190169"],["9774818842543098165","10532887040371155304","12986603120148136247","11026684269813006687"],["17546316578463284398","7626887439295232888","11088948491683921189","15168991178152738068"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["14685803804015837400","5393454550667820545","151736444423485817","6537897118546268220"],["8881448975200967349","16296659273638802532","10741088298290408109","15862013677106529313"],["5849812208617594746","10905607276782922026","8465399393472321441","11827089408955375034"],["4698711466235913935","18160192394966333005","17135203288188891042","10463901270811713699"],["12262259394968659818","13555266425904561682","1966193771925265622","13908840344459726939"],["15665314793036239965","17730330730199020611","8027613578866872473","9649215543975780721"],["10574882513680846455","1378148610691015861","8951200296913904884","14278909000180743593"],["4711145659213132310","9729998603963733160","828930215278171574","1852814861391055481"],["11562941167012803370","18262963651309428919","3039724477633514505","18061373705830605973"],["8978409039979156974","17574371602787756565","7442935211569797686","16576780363582557927"],["4607580478619468886","4981816958863128374","1474227400218565744","9507193873789841638"],["1167693842812890238","15019412208900376100","10447873304331132187","329880759487586795"],["1299899084297073374","16537520776285063128","15890636082659769355","4923467188758989514"],["2050595944867339886","8404052133126700786","7998972448725612469","18194080278212851328"],["13060528183173701056","2715121799862490303","6111052971464849304","1157725146717282450"],["17196796136730421108","9745226620665344718","2664672104779508657","14660396825802939201"],["7113912238317212491","10841255592884175359","8203860220774479172","15362411478199671725"],["7833761783279904757","17498206473771029503","1991156864893256948","18319088515855541367"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["992086019149207503","9800270582125964458","8754770023656921138","17197817618395947215"],["9146970012050222173","15346201859538714776","660517723791141747","12870773905797334376"],["3009264972138553079","13452629856369819091","3041385892979621981","15442375205516846381"],["3614586093627741870","1919313107871692265","1260619099124834091","9992342036397957216"],["8089529253937081988","7001013492023235005","16106293487073176735","3394220968206402322"],["13033619320725424417","302274580295608139","4762130168122267972","18400635763597119737"],["1511564181729877593","7369161162536214659","9356241812410344465","9802947830077706143"],["9049507426943264551","7986350140803697803","2872297373764407471","9169404962297450029"],["3289079096348024590","11631004129693131833","12089632320071341473","13392946671364221923"],["4087295242860080298","1008733975516478240","17161868368647115762","3577027666021414953"],["7984159433988297343","16570301372996281168","7149554384599970384","6877759806938806518"],["16034610866620915030","14728456921673096760","1649186089623917434","8239609696988243522"],["4913789600780288402","16572689159188263400","18123252263018037248","9267551658407568235"],["11989636038249806611","2334095331746259761","13362360782206516467","17764794453191198143"],["9977942233063432847","6366583977456896342","17494521190691528707","9617500510172969481"],["7994745271605367568","9720543338777827339","6555396622514024819","8455140533193407183"],["10482162157716515654","12803031882278410922","12198308400726503885","6275794527839795034"],["5493668120863601849","15479170189203263361","2015378068099034132","5472638158491809052"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]],[["6424360056296662665","16259665840480894572","2460496428987049030","1713661230929790948"],["8999249251618561539","15254798135546927340","13977427539197409207","5314824106448865519"],["4644311613190428376","5311798152060580664","12167069115504673106","6502655871858830421"],["11435891487896887927","16344417416702997474","336020712016521956","5597998843204634908"],["17917825287027367384","10943611939626495347","8656461249151193941","13885411124130763915"],["16240912215972802828","2085026472364319937","9110558145503849561","10135332578744036531"],["10671615254778479775","1375443268034500980","11217743610894706016","13316261493447216726"],["17390825178221867044","7163668903680010503","9564365383371829883","317792519535460155"],["7226694047050916638","3054697560359842262","4370459533925627205","2963894105006299768"],["5197602460762551703","15003635163630854436","2301785384272052514","15317876821932778950"],["5921418888210885515","16602225649435924800","17486737962029544441","5890767640303070257"],["1502242032462696695","13924494164132815481","12773384710278723456","15649078801562422162"],["5161393469641989114","9707057492926482145","9039901291767777664","15280799384441443134"],["12169654149970533181","10878234951543432823","1299874503911773437","10161399769292986989"],["1730785840257967499","1058708850468869449","6309692099124729511","11618690118625239462"],["4565487923546631568","1796031834079846954","7737968806730644067","3383075986501154985"],["5512479058119209896","579447237486689443","8553628770903598505","1337031897507892337"],["7076188966942126236","15636798382507773554","18294642135247218546","9645419131435114581"],["5066270218611017310","13632339663226287959","17757495895652513456","10325365867175732353"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["8738907654343729718","15391158050478775847","8985047745196433169","6153483073800147616"],["3793244833188337979","5007375072992586222","16503789537329958230","7324480808415101853"],["9536793241837362012","181801698038162048","9787758486828383210","11151228355114127855"],["13422533727393879873","4521475221442794950","5937797263519317764","8340880982911590906"],["14525997677474679878","5438131239671272253","840727943574749848","9276981739839290507"],["6676137409216987334","11767770500064770297","12336989464509873501","3138424680020955385"],["15773066380605657714","1971001478178584303","8776479401348185959","2346297769622683439"],["1332169650317344109","10142647379814637535","17032702969197675003","13656263148489488821"],["17971721309545278212","14557560146424496601","16512314881340457183","8561326290936593799"],["17189743190222455785","2177868942931909657","15047679921143108954","16552582779432595600"],["5744599151867885844","7967407162597576535","3752966324996661401","11256342390289294586"],["3703434046268986433","2747971666263365242","1010630690004674226","18413003239737898431"],["12900546129145656749","17975131888402862943","2302598076952237102","12637962760146366671"],["15797600250828117782","8307704455901457365","1662339689416883554","15089942290002467661"],["14862895780909724775","3619940706151660623","8272846166907340514","16311769990413609749"],["16834593510926680543","9159405093123783892","14369132313130720957","14394187123213597792"],["14657616336497142827","505590759725807261","14086191880984678489","4161605989232786267"],["4116266419273675542","9209239022460860618","3409333246614947774","15845048648987278030"],["3729974320423795929","13426102090680096429","7141449717570135095","9756956530413408752"],["13570007878825227347","11993300606700997488","18203464482653515501","10944531059060399236"]],[["1675739093430437015","16435332581941581969","7460302764178337097","12136065460201935685"],["6451408225868987799","7287709916789819289","6517462196959684199","11855728706328098664"],["11486144525777526623","862127969478680083","16610597231122497081","13772030276704573189"],["3721996294757751011","10036370834938694463","8115418384700897759","4813190423707710699"],["6660728264592092319","17005240416392205797","8492937422449195738","1919332779084847074"],["5357958398874259690","3126856660264062060","8675257447695193224","3401930679127899970"],["16782691865876631326","18108622718202365476","7077847388989826367","10969231533475873738"],["8150259094450884168","6853740164569999887","325707287238152457","8238168605376119028"],["6374641095754661793","8730193922198884918","8084025805183450857","2945819367185802334"],["11707221134457351463","2453718520555739757","17607773058904906060","8332099145839309437"],["6176605872734023171","13229106109085286192","12874975385240039590","15382555511604873940"],["14543559129075572374","1137866610787711302","18365020375531648677","8054799819193972249"],["6196151401920304412","8837706452216784712","13629947129933303618","3680910259074435146"],["3481490750402559958","4854313885650786289","18152461897250771819","15095269187074682545"],["1311346106838507567","12642601976087595806","1620295732667239996","1563697182155990475"],["11362965306207745573","4609671512856287348","9181264491839667610","8465496602344653515"],["11932168559525517266","14353179054903147074","17172560685488396305","15522397546537461735"],["8524696953138374657","13010617575242890508","7415001712144144260","9878457151909632035"],["5536127847465822500","12890055231585558594","15208732723092665858","13574457966845856619"],["14059881196152394360","3812073036777097326","5832518330622353156","10986778709452821312"]]],"s0_siblings3":[[["17508405566277609471","16496352920153945932","6985798240024671507","16008526048197755254"],["11141727574780345808","11591597606528578064","8470166364707991356","7508818828987895201"],["13291149378708014529","15755250979500833674","3698328805207945693","3560016134615955559"],["12292778768012747776","15840027650783323356","8045583466224312458","9641275518128253286"],["8180141620340789525","4544827554615960707","13849865365910255697","17924324677881060398"],["16095332537788112862","14636731487864506202","7686663281804862820","16278812310143467442"],["12981946311184154042","3226137392964018950","337535693552280566","11646267943635915645"],["9203376036883275333","6168270977922560194","3913309475823769086","5260886651340298261"],["17430343739325666579","1653225456476432883","17316818793191017947","3606687103840360898"],["15579557299680735562","17174504186654500279","6787492402980936504","15036061401304292997"],["4811086955908914374","2036523814119672411","2978494277077882576","18437856780146850883"],["2365231837013663603","17005913650484056157","3228874374661075521","5335615958517906005"],["11165604450186921183","7598979229823565929","1166958946373279214","18040436047496323437"],["4740579571791553588","3999221249874633264","16819303541956266829","12985061106661485552"],["2787559049975850145","4105837868944866966","4586368097188011216","9006756840256886229"],["11192707811697451280","2474491272432095034","16180743067300958456","16630572939937020947"],["10906962903397033660","8916870525891613040","489570361431324884","15704261158092557335"],["17089354324206534967","1923123244468241599","1070521696782143946","7345264618338924574"],["13363929098056396545","5967812080041678196","132520753691167170","14367848557091293899"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["1798169081722652348","15325996463702749770","12501333866700977754","17707664216109697073"],["2612259543891568874","11250845051877812700","12272809125024198056","6121172721534344604"],["18248706523646682975","7618236333923543573","2485108618113523231","918397738411624924"],["16667053031941892004","13507661895754905583","16148007143266749981","14099544237457092755"],["939532661502992012","14948032894315509394","5089828134014303220","1317784931476729681"],["12973291203950933090","5995156581475918382","13863904540663663548","8166904918692635219"],["18241671589608759158","10489121899997672037","3013690009346780975","15242468758936852709"],["17391882183944558792","16558761779756897674","29391712493679769","8693371559693848371"],["7233263178962759656","2487880687153930774","4133206584729886128","539850636823438603"],["3413883124254798807","11091499513161496552","11350667764740298859","17558174105507581760"],["4092682219597675910","5261320677310993961","10823833379753748063","2249996442723596253"],["4593318972983413053","12973811057655451230","13801545188379047448","13483229375057371333"],["16734568893040981633","10658898033625187312","16692817061688738926","10410867819288815292"],["5530681579464511110","323892789133366000","2838866769272533168","1458161345180416441"],["12131798815640725270","9498901070184952818","3900402213310045322","6375093752339640744"],["4095168282699209553","11383234008882867165","16290259851821389235","2722479906431211370"],["10657874422900482143","13289788036921040326","15444564938687555104","121575279239856751"],["17089354324206534967","1923123244468241599","1070521696782143946","7345264618338924574"],["13363929098056396545","5967812080041678196","132520753691167170","14367848557091293899"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["3136044821144277423","7083143707092475957","11315458884450892665","6650656065035033141"],["2586079424777169454","8265867552851389316","13093942823863011818","12502306620487914669"],["15070873164966724966","4436780433668029895","13005414091940319805","12084350765287328221"],["11169912184909822561","13064032811142690629","17722072774550023895","15752691711857516736"],["11930291342756935770","11071953522257837694","12114937241532659733","2394400306152256809"],["9967582184980174223","9298986828920359634","14567744981150838861","16787733700920515596"],["13254587461153795674","5983967641348873322","4969375934067296890","11873293558343788716"],["2040396595063749358","7591138745405202270","2466923300885037013","16620191380085997068"],["2647799597582171675","16706581078836576582","14980423403138252668","11697278979668006335"],["10453681464083819246","4475139313701948373","15825123409147352930","3366034965646769833"],["13962234155549430398","7548027391741933491","1792883519366821475","13995130427736065979"],["10331898341657053582","11365390907975750524","13535921568148116764","3232408185003443790"],["13856319099228391916","9778531606987045594","14107540931954466926","8718805368650375099"],["9194214154160700627","5710848763081066068","12777438367833484386","5500994940232236848"],["8604806750682064781","1499720892691871126","16471465282144545019","9121463588727455928"],["16582105848833891350","5572227330478148330","2084530671833663002","1963599225325804907"],["17795500955773774580","5335450046053470075","4565699192844024374","374885246836617956"],["10137768859383344761","10753367648423279137","16965981483494781417","8539040512862957998"],["11515331920616996079","862440133153330828","6388808946284734283","3813111000677541152"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["10718889244377762239","16117355358537071669","3994310018275587344","5684128662052332711"],["10106684890592621436","1544000508542162649","4186729253345109254","3149404026057478445"],["13094965136248602470","7202143968682482254","13512464341281003374","16854433690301803500"],["14413394886258374310","415715451626517259","16617277713834929303","18262914129604619452"],["8587495724986790010","3053516338809571530","2949329933588752183","18024553615676037213"],["6799764468207135611","1707120310059215481","7931726064842733814","15223785748254101144"],["10772275155707310925","3812427295669801322","9471355693593879572","3864203416624439782"],["12373472773513579980","3968672308341538306","2664050592680514974","17486228753809937696"],["8582500764560841995","11508556917161296871","17356346208503626017","12201636634952388272"],["3502108978585283696","248907080493290265","16469614076943475777","10398311585967062577"],["16853173733336044403","5863228740541920019","18081731121712999422","12198773751999078307"],["2882339686547375278","14108546397468172865","12400725533316760561","7480810514286701735"],["13755534988572276433","3896875403112496184","18411928244085388112","10073851136538462199"],["16236134450219855428","10747127171993979515","8543401539395608990","13143451861560527894"],["11465891224478499711","8881725200321890562","15104205119175899471","11695613043778075193"],["12437493462917172329","2075190714827969375","16142830169858176494","15886257188110975711"],["10532715873190416439","14073409782749810974","15361318670543693934","2311202464092856885"],["1247806796825128220","5304386652243791320","265683885125149755","6182076631481696923"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["4925997423890030742","15687878644292164556","795994677359229305","504305381154406633"],["12109308132510637976","8662916380904749373","4841514825621780822","10177060913264432237"],["12701275812115816313","14803866119545405923","14113853914180797670","11246945172530916588"],["5526099077452652796","3622873539436158787","9546756247944933375","11340644176315983934"],["1241044677202874202","11789308199685371234","13853678605455716278","2124498163447887219"],["10373741393122298373","8798410808598964483","4965204897977055151","16875902510393956273"],["15118285234651942328","18129449565864361357","16211336883332655514","3448744066584760428"],["14053248395860296636","7963890786068305533","1019296831168928951","10480650137740198407"],["9733271057312515855","14372418927086631973","14185535082437194087","9435132829838939784"],["3485889659718937596","5381910519847867295","7409014831279156559","10904030723159622363"],["3554825107489267120","6163560075117732953","3501322145148263231","5155479407722077251"],["348448002536611161","10293890857341508576","8154949461268888541","5510753001251037268"],["17196439416039596647","11862302990828462015","8206973640480834252","11643622592701493195"],["6143505015081001345","13635886133610421728","8407974210434789370","15372011202096462914"],["9803918711096826877","3668026783011141372","14354721386939846310","6015782262739336635"],["15310848213938315383","1750525814390565373","9026959340110504075","2546560273307223756"],["18128318277293628810","4222316042828176374","550981079205893023","7478927196755919636"],["1247806796825128220","5304386652243791320","265683885125149755","6182076631481696923"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["17505905971967351310","9156997194274402583","7924351737027123534","15199010542258315380"],["12671749355313411432","1711152881525719253","15559495651140661946","5043466339449884568"],["8727748476445323131","12930287732260620931","16568116202256265163","635225569847684121"],["2082533958757921124","5616586225360425839","17108986494964019942","18077352132821608480"],["13266179283785599712","293071883759152919","17097716074305859043","15253784037186133080"],["12454929368595757038","756607855128905492","12126220692946526777","427162689408132075"],["3257083437561747640","12144764852222761169","15637683274561473701","17223439657144473517"],["8262314788205269924","6392702185879555062","4961242798466968059","4244050287348965164"],["13326131060187455976","14795915334724375710","80846497218498663","5272560552636295727"],["6730573457194469073","5026644556070368683","10256110085773537240","11352503585765001937"],["17630353515760176604","10882352597610805058","7988241455246667362","13717614228630680891"],["7242152697125102987","17953233266048035674","16256409025098241566","3176973812615774829"],["3207940011603427636","9804943215511606319","16819654317072236107","10647384026951695472"],["3185761889576385599","15929407229510831593","11502762394076832103","8612110988149478691"],["9255099409900192835","18200709615460034589","2925933403124295798","16905572222492809840"],["9739236651463317308","13954091241440597271","9850593628054743286","13715618324040703459"],["754572472133887706","8005100128465361923","7951593194434332989","7316241415922363871"],["13899885566824261626","2284243918945495940","6794049278003130901","17262788975114513978"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["3661074931004445148","3238331977324729137","9989154075313515870","12235274899988662660"],["12698422281829744669","1092364915334598512","17082756895642639048","1282429058175926847"],["7962722005838107372","7284047083014958064","1437231160008737001","18285117351590056303"],["13061955165233967816","10658135816151493993","12860685261673413797","8451293602653419677"],["14300426805218386700","6167878402049762595","11366432058315237153","4970508700741935476"],["10191734315145871196","2177419545595232249","823384959260862742","6736755732078659472"],["8801540203587553588","15956635822831190222","17950666166619350357","7059043324780367177"],["17863420219240560700","1124455381618043947","2294390383032770277","11181611291796847995"],["9265937289202304051","4488787883837988439","9049357936882319385","8953506848954871744"],["13154314953217905268","5664650636190495312","16862988336731957069","1390057575541963274"],["14478454361923743424","4317696665015769744","1805221997974358376","14139270861223797712"],["14858071821610908439","8674974654761921076","2120606414617442138","17061946986343332888"],["18407797446464433305","14872945389791296921","9016993213480203415","10645379044895742376"],["4263750847841587955","2205796790784428464","12829265815587062554","15409337764415278544"],["13128272318728080597","6787973210232558248","418814020727533075","14676269106701822047"],["1174323201937139930","7698722731376488607","5632982445599930525","10057592481282171134"],["7798867573819120197","16653145017617782609","2969574753244961440","9033030808537774663"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["7609691729903843699","3861455025117323063","7347101452526076275","13344260693015451975"],["18177766697400583249","10219154331067916743","6895414702928750043","3201362959921934156"],["17048945398983622633","3914518084463885954","634243901090736300","4429455096106910755"],["9483127425834563103","11097988067371616161","14663165463183536161","3589928897666094109"],["3028712668808404723","11125485375827128869","956368232603233815","7751952913841508225"],["9064907707112543523","6425431450614180076","1052930014782173006","9067414790250785590"],["3600871720689818449","5145889208240045749","12873977238324769616","11613323921672192907"],["2387545599561064155","17358391995591214046","10129486319887337171","10327167287770879155"],["6975448468923547338","5430225329361258577","5970901701667691476","2805355047569474486"],["11266068037153742838","18123700127736223569","10193262609215587483","17892684327859674552"],["8939212065453056812","11656038036903491959","10617793605033325360","4166014607421963143"],["12221667152307039515","12794931050562455123","5511690736749586136","10712866948801512648"],["11181995309774152087","11143756850338474108","13061097122397837401","6988058008111766172"],["5682637807612970784","11502266406426831963","12762108761304179107","11900699827890350327"],["18008406200263474949","2229686430260976342","4778044984437376584","5826701692371175615"],["13293578043399321456","13803675469609947776","8006664796263949514","5911060774647500542"],["17795500955773774580","5335450046053470075","4565699192844024374","374885246836617956"],["10137768859383344761","10753367648423279137","16965981483494781417","8539040512862957998"],["11515331920616996079","862440133153330828","6388808946284734283","3813111000677541152"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["8280653439644710264","17862971728858791611","5314486883534652771","15386731791624329230"],["12021451768827650130","5525000587406051980","9719264639579719004","3850600467380329353"],["15983870497644232512","17787292812180802704","9652980560480800208","18037575059413376526"],["331518723272587657","9112140181067202723","6866699640177282859","8654946607993563468"],["18352202056211576741","3382212037727017362","16042337081757526906","5275268479709511843"],["8882091165451822802","18096032797206485267","6467059823713423147","9862277310816832134"],["7938305185009152914","17419288050232652777","2816071424800559788","398603006490312670"],["17494336786686780207","1424933839001920046","516142379232622649","782944167318741691"],["12506865104005840987","11120899119900468576","9685053415406119712","12799476604100939236"],["11673252015428463009","16608374230684477637","4272505021774188213","3763842266170628442"],["10689592042510004255","8235504824836259368","1740088184042137404","13086988362107211482"],["7355781728489694462","17016631190102539279","500400515958528189","17454177249104527647"],["12487816567254569624","8679858945139398761","6767343139775287164","11074050628970130019"],["12145779038467886992","7844075909157182750","4636176296349727237","3598800247116464567"],["12131798815640725270","9498901070184952818","3900402213310045322","6375093752339640744"],["4095168282699209553","11383234008882867165","16290259851821389235","2722479906431211370"],["10657874422900482143","13289788036921040326","15444564938687555104","121575279239856751"],["17089354324206534967","1923123244468241599","1070521696782143946","7345264618338924574"],["13363929098056396545","5967812080041678196","132520753691167170","14367848557091293899"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["12136515322078686159","14800806118757552799","1484565198920169910","17616254758017879912"],["17562618804688502518","1047298757590974538","2840917966021782870","4564562659680227639"],["12109626445784650640","2023112619650520031","3183864819948750649","3308937108705631015"],["7201025466579409533","6741829137497989444","12454352509343373329","12515699848059908680"],["10016103397466254676","9521052865385792447","12800703791868666531","11219803590044124110"],["13185884538704975","10460700603932851009","1172363809302612419","16078607872633318446"],["305685870569647945","2812932258851002927","12160018595870284633","13171141353769612917"],["9535061979589442596","2680630304752776627","11726380535360365528","5712446213629410632"],["792078091057083505","2344585788079330948","12906442735743553458","15943797110595402275"],["6040289890012717299","18065966492969993042","15793877425777711137","16128668934068765022"],["2222721171620820634","5191349751757039801","2212492157663712037","2890504383333386762"],["16542190547188403850","16289917315197861728","13006652948690833264","2616647928669053125"],["15849539553027763262","9926657971162168504","17235360779528310129","14717761175006916758"],["12994210527423334296","8902366863307099365","1816311515199980067","9069032744953242625"],["12841855288694147058","14282948510031358314","3199364527128484165","10427189345572176768"],["5121362995753026355","2456500915318506972","8095960973219089848","7363311877238697817"],["4102532425771445577","10558543398492338467","8680535612802767291","12103656008277548801"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["14412262358864466484","9021970274011264924","442429566125508261","9800928210112329848"],["274976126677537895","9483495964187048053","7751778913403397122","18397578858174367750"],["10771960448047894580","8810867273915327489","17031830362985280735","6616052264958174777"],["420964970431419779","14426291098249116119","13518659184696479908","8404128635768126121"],["9739980316077409174","17373265027598540076","11055829845854522622","6613171854773471081"],["1147719191309180866","9357576858279534120","610950907534908300","11185153973406954378"],["14951817562684537821","9201159166203350597","3088220276720619066","5572530291751231670"],["5312841933707074537","2089861775995360364","734791201508319811","2492724067565076470"],["14848960938327578349","6140732914910483135","6246052891579702759","8053214512202724500"],["14263111421437326048","17646590421944125977","3121819824478462068","12591257672796702887"],["5494697018395374263","16221825594504485040","16957345227586600051","757569177355216882"],["2671058158171206728","15163369795896649142","6104079315092970159","17468908585597238041"],["2413828573258340978","8659620289436363462","10910734678943403822","7624322219442422515"],["3956173025588750005","4049515522420390","358718397018775335","8284951999149324302"],["3468331388311331709","6878969899185854488","1768068077795846375","10367868786066853170"],["16538061137148361387","4902672696187410347","10010312922387286777","12147572349717024104"],["10884448520663867111","18312050496779305666","14463088510388439923","9438402717950666870"],["14103902270200202525","746350266991908818","17892972339956605509","14807124795768922105"],["13363929098056396545","5967812080041678196","132520753691167170","14367848557091293899"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["2727479741272133522","12346020886748095576","8302467291789505776","18401812088474561304"],["15655843254923384772","3236585392498489890","15074644939274701847","5444161746534044023"],["15890527575851998535","2725772077872314895","4048413843333412524","4590879210673981177"],["14663065334511807038","17837849561060901994","1084519239074314401","11654989762114447115"],["18251065242176212719","1487247979185182849","4750414233126424833","11466894113523834633"],["15481082687042059086","17103587731291322179","11094389431095950612","3338928377097377536"],["2834085213693915970","2210022274560968338","370256684035490874","8361809061573558865"],["6810439617244091699","10937920792923485411","9124970748045495205","8765624960488774809"],["16926032606578296550","7979628136070009896","2525744308335328727","9607089554874014253"],["12761923396241524568","11831557771374103202","1669274959648028799","3352835255001411721"],["9433922371055818628","1208181097478061721","11757629069729511565","7346795932840611270"],["4264674200508851683","352839390298455823","13418750329739949775","15009959430567231799"],["11303884837844151277","7132049281903281333","4044164257614081115","16568510174405513584"],["6090249571261700130","1486049240759761249","760211305647284583","13591509853095207477"],["6627230292666735022","13656715085271186345","7173082503180240647","4372082420966471452"],["13041038073223985919","5854416158118763077","11994307379948398354","10531581604668997902"],["754572472133887706","8005100128465361923","7951593194434332989","7316241415922363871"],["13899885566824261626","2284243918945495940","6794049278003130901","17262788975114513978"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["1666542903123656667","15213366071178563831","5166100516679973017","9747842574944147012"],["15435748754231176344","5671613019496471574","14687679668734526870","16421054174319700004"],["16332201052716671470","4254992834521885215","3293133241119672010","14158686902047318721"],["13763879210920622921","17828874177245803646","5286630644228803090","14622634304046692588"],["5438299787666149514","7587603180367436527","18371218670762142413","5964053072221163040"],["3982470508926419494","67537911157644855","17081390482712171230","9207016879077786871"],["13196201883209088974","2080834809478706411","3954941045187226895","13492977413352264361"],["12089368711698907406","7520791795911284513","3760925153326372999","12351043594054326445"],["2881352416033901693","10381590127930912932","4748970014303349038","13110139523156997709"],["15346605931286996032","4109523820243698029","12293436860016140954","15875887066448085437"],["17292164485606339042","5044502582627070753","16093885965466141295","14033584852546931194"],["16285406157712161242","5138174180281680297","12499537502673350225","2261235775226138435"],["7703685274484836978","10380014802357830722","3503102360947234435","11462117849834297732"],["5318278749205646420","2426228297967055429","3656171905950246516","15728697651986982769"],["6123200635468889315","9934823572725356348","5292729030332456333","15483347161954760401"],["6161077389323229895","3725369990357536208","5579424378403465108","11011110019643484668"],["10906962903397033660","8916870525891613040","489570361431324884","15704261158092557335"],["17089354324206534967","1923123244468241599","1070521696782143946","7345264618338924574"],["13363929098056396545","5967812080041678196","132520753691167170","14367848557091293899"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["7549792520541084326","15231280189403602037","1418841810990779956","16043218767067437161"],["8795058208427889249","13708679945108027798","13594523131875311072","13728413823306830719"],["14750551120164955813","14951966973903762172","18300701201971894972","212060276151005235"],["12332348487096249492","13140029416825642879","14389964073519709641","8864802464818351353"],["8041681708589519661","7788134955005574956","9616467055141567889","18425818896431743799"],["2216839218644270188","15203078674310552494","13551966178204776110","3903769052084377945"],["13604708087985426902","14762486132913761212","12730426207455918745","5389226135880089036"],["10984340878346010048","9149666808933924705","4126345142590182167","1054553419236585140"],["5013883730369652041","3471238437157014144","11368978927462719383","4284356952895724841"],["8696171772164168085","2228385268023293569","16571035315404490394","13761652389051902279"],["12950109390721975298","10126605560049008872","15951239552165546490","13944306940157765523"],["8239737020496807930","294744558300719033","13531852173116546663","15177298154597108629"],["18290659248160681502","4873090828811770053","1113960176026712971","7385987717592620771"],["13431251453915880795","5715687198569889850","14569446938315129014","4625618618350002246"],["11612286004327842665","11254833398696450534","13438830284650801905","17834546552232062302"],["3248664212014980738","4723593186806841240","4828506926928892811","17503819272496542856"],["4102532425771445577","10558543398492338467","8680535612802767291","12103656008277548801"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["17675890333934239397","9670182990346202649","5567064580025724615","2430161974357030186"],["1665643412093472919","16167147001549984973","15399495832140209805","8245656510158231545"],["4459603123754782874","6053162494146252311","11755343405369883976","4086847632131794560"],["6124187988635938564","6843132953068960815","11765087484716159709","11148629325369151710"],["18388375446281052607","12617813631559052268","258944472103283118","1207423943796635891"],["4888368462579084231","15573519449415206100","18314676190935353776","12101127935102190317"],["10120275168639471193","1958332107675096209","14566256360539632840","17738786147537592981"],["9186430326441002519","11207276873053356126","17631238431051915962","8607140519613997421"],["1207276495663924811","10706931138643279422","11230264038371267058","4280918216476450656"],["9085721031672922551","13450612687501292613","12631360187929217829","1735654217084380189"],["5404493181773893621","17069575905878435245","2482353002793218680","17492310632472356791"],["3719384519562090962","11475912042877420087","16406577362325802716","14673593885831391440"],["15611738626008706839","2918712172961856621","2822229396881509329","15070231590242801763"],["12484577631689331624","12341714568374411217","4942615312537273555","10228887605833148685"],["12841855288694147058","14282948510031358314","3199364527128484165","10427189345572176768"],["5121362995753026355","2456500915318506972","8095960973219089848","7363311877238697817"],["4102532425771445577","10558543398492338467","8680535612802767291","12103656008277548801"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["2918982583759918527","14738075887521106627","1087375530062398675","11209722425585064300"],["12987756482899126800","2729117465048389331","3003680583674884923","6087704076165923590"],["8523955509020533778","15513550855740764230","17000591250529703734","15798734879041201451"],["16117580534662863170","5930668582936230341","3796879436552111934","8284846816266634867"],["5009738073671466183","12515678792915525532","13523434754645024829","17603649466880668935"],["14219269914134347928","3182455511957254715","2036405526335597265","8344634213829979113"],["11724251913634602028","11989597495550235440","7629021236354837671","11800289215587305865"],["9532634759605551055","7021833372095389969","18238326094590909360","15086691270235805530"],["8893224039926888163","6927312414364687212","14057127369736857197","17350193247880154130"],["12160625999447162033","17628299078624748726","9530558699370492654","16396147665027697675"],["17401133893148329971","8803258306600878009","10046614560569111894","4982811329528269614"],["12215230766131003292","412397751974030904","16188620154896526888","2770044373956280635"],["17324793722001094058","13166329590000884992","18214902337336507762","127336897808059848"],["3246843150387710411","7775033613602971138","16104217911146168954","15414513630911121346"],["12039207908130363632","1116409095691894218","16316370903759431512","7592100928744998227"],["6655637978786832539","9882540868977353974","17269183082214930300","11878618037307790727"],["11643387984020961504","252239480763010923","12916960587966529214","14870415719426221063"],["923973661845686306","10136698382849311691","6288847712733800514","8374355574413741752"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["3557224333213649756","8803505441285136635","10417985205770915822","1982391173903223709"],["11768937119796004004","15225012927793720717","13969023230994454873","17891326002108097380"],["806399638417671872","12106331760816497409","9160728711403091886","10204688410632662379"],["18431176958590466382","6917517750621028114","5059478872287042472","4087361844629880227"],["1457709723206630431","8734512803420742220","4757586972372635782","10978694368042159767"],["16245359713033487951","17682613429386354631","15101273920445641106","8540434882767932711"],["16924692884684037717","15899691649639801919","70362090947763883","5060460781184082689"],["1832999256526382770","7798451123501996879","7913900042826764718","12425524442247517939"],["8999180167364413078","16027306990984162501","17555845027031828137","1857416117138608811"],["18224080735067910024","11080353218599627716","16335397468529125334","12177921709772735215"],["16298483425683490867","4906112180707361669","11722998857245493882","9687808838794773627"],["15158096630060778328","5533958753170092225","5796103588103338700","5750381109947415112"],["1086730127023515155","1113744742689592709","7572615170877319512","2207020719537844059"],["10378225769372097071","1688367116393940429","2061076627344740799","17895759438759478006"],["8205343749050056937","12829416040033466629","9487780212855210800","4347097251150987586"],["15310848213938315383","1750525814390565373","9026959340110504075","2546560273307223756"],["18128318277293628810","4222316042828176374","550981079205893023","7478927196755919636"],["1247806796825128220","5304386652243791320","265683885125149755","6182076631481696923"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["8365932433421086564","17043799084341222683","8645753782195711198","649599347415738005"],["14794961435993102891","11101607943749471459","11877390842746497938","6105119549220996013"],["2333108390433580470","8918839262868313900","8944134877676434664","16650717163845121241"],["5536959328804178475","9118610984545149238","10250411306520134541","17443715758214679731"],["16815027978171220352","5000128033223681413","12090957785192548552","11981030447074948503"],["11714707705705257563","739974759504539428","14873852974510645994","1797370613840453894"],["7735606484599720394","2020486660138131600","13828099265102557010","118864441992208234"],["11305635530086676680","15155483582655643868","10138967133583044226","11144028343638401342"],["6929386796450177576","3125440158359208603","12764699147969948077","12519062289770605912"],["8017222758130408409","11519559433065762745","6025111755172672248","11041923187488797606"],["573671433770630096","10657102878543441469","1861933010170002609","9572568942598231860"],["3712606943209331992","4431121989179762178","1546796026188027968","6140590281451433274"],["11181995309774152087","11143756850338474108","13061097122397837401","6988058008111766172"],["5682637807612970784","11502266406426831963","12762108761304179107","11900699827890350327"],["18008406200263474949","2229686430260976342","4778044984437376584","5826701692371175615"],["13293578043399321456","13803675469609947776","8006664796263949514","5911060774647500542"],["17795500955773774580","5335450046053470075","4565699192844024374","374885246836617956"],["10137768859383344761","10753367648423279137","16965981483494781417","8539040512862957998"],["11515331920616996079","862440133153330828","6388808946284734283","3813111000677541152"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["8203619374057597604","17118872771158194044","14818311177021072393","11556341657551593217"],["9408350220771088389","7198669467334479910","16162763236803460735","10464500756557447485"],["15875267051175437045","16471969419837284758","10183625783269731659","10113410943853963472"],["8198529480047935398","12040403458290000016","2509848756792501297","10319027104253920272"],["13957736997178673412","4033128592869814627","8981565965006382466","16667707367463339274"],["2480182929051335882","1215712065384820746","3565251568432205576","8613955280311060721"],["8125317584121577242","2142709281185449839","13875098563988851361","4522114074507458337"],["335680445042182070","10641458117731712431","18106878126626812418","10621943585331203483"],["11300068695584124534","9398526982548901119","9020359818313819941","10057216856804111104"],["6453742097306163953","5575521529350008308","6088803054517209612","6086191421420156903"],["17779142096141835754","1004683007565819565","1031530341571297742","13580930620401066156"],["6712775574590857445","8520265454049269760","3507757882144010208","8500760046121068450"],["8180583892467340150","12827483116114957678","8943538858186901741","2115820828639384947"],["4485794968683240743","8223692094143201694","6307921220337131827","15695576482664418839"],["17675394713781214914","3332270429169503802","7548559670968593276","1485876607187077018"],["11472131305136741354","11993135697645242802","3426856040454946535","8308209739858913199"],["6497757229561424692","8509755114368582589","14016314621404961673","1952428492006793163"],["10137768859383344761","10753367648423279137","16965981483494781417","8539040512862957998"],["11515331920616996079","862440133153330828","6388808946284734283","3813111000677541152"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["8629229821771739118","5507919452362848107","16726372020678541053","9846888194963484961"],["13755380368422504122","2109766386232751765","8467872234058434930","7523383924636041943"],["3537520525600552328","5920834058793262749","16584688693949543406","18059686454928007266"],["12205067725847764566","16095709502515222379","7308945428271836330","8286775761909010242"],["14482358273729550066","14762664683304043727","555143154109079428","9244257623439337364"],["4508459410343066465","15749263380033034763","6045025670575641353","8756743548722368693"],["1089711760772138692","11045611521388072252","7748112493677897384","646640137769937582"],["16875375979921999268","7600258698533854656","17730262472325840500","16917066697632740721"],["7515684521319688756","10492415844085969436","15342183196775785653","11228278420111710658"],["1911184433949139712","2733499826304956065","8731027262154433728","11107452916684925288"],["3112588581922198404","11709249455607275660","9157938314084493365","6922428277600877295"],["14367306768895281362","6854638764145951478","9248480408442299747","3028205095790671598"],["18179058653779100141","18441108990000576133","13085894268602531704","4420921352615477123"],["937526331912092632","2691654251619924865","13237811793336818930","12746969687700437849"],["8368013535929983794","1757598548016476636","17507972322563415749","13112904389158997735"],["11377809192130949556","3554517086503400278","5056854899290578926","17955463641500613093"],["7476746829360312370","3426264457907271314","7379708167085636790","6355866470576136586"],["923973661845686306","10136698382849311691","6288847712733800514","8374355574413741752"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["410771064051838766","17011143116736024943","10165681998196345230","10074309728388260521"],["12487573869288018448","16897718091252574786","6513857423165643718","6908254481228084945"],["1926378372229357314","1666806954149595318","8456620766520245441","304439072473304601"],["16187736597742581960","13969610196529067886","2144923609123398748","1238293207032016263"],["13299397353091332142","14850191721328150822","5524923463365165031","12050419065353185083"],["10644067867058684585","5273681077009733086","17648729048830697395","2330412791663047680"],["12048494898521002618","16768146229055356158","17680442716928973983","9242633286488318320"],["18210015269693592353","16179394340791586580","3368710561484443759","14836436211086801129"],["6021367617617140250","13037077830595943551","12048781256121913387","460545027707186102"],["10025518781028842694","16786328158412122879","17933262054985689808","12872733830066339348"],["17615339060535362778","9518167193236888777","13042410214672216716","16332309441909403885"],["6408298026907786702","11762477526273411289","14832027338742594620","1307304113541116975"],["12034982016369202703","3441720690352702946","9684744211877632537","6221992186539057187"],["6517982037700166836","4117414206841614198","18221613846939958053","4959480287638284883"],["16940084445624109452","15272156791190010231","2870579068570347675","3322766732105712450"],["3983251584271636266","16532657084566018991","3118715411237711763","2128568329850360319"],["10657874422900482143","13289788036921040326","15444564938687555104","121575279239856751"],["17089354324206534967","1923123244468241599","1070521696782143946","7345264618338924574"],["13363929098056396545","5967812080041678196","132520753691167170","14367848557091293899"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["855217211239155085","2213899237261257471","372924579964118579","3668127550936733193"],["7308662113295586011","7543593357799723729","3974928323190203438","7043153228211356780"],["2635865773461455112","13812025167287867640","13807396969536106585","8207220422600893732"],["8629926399449984100","2201662776411957484","4582400457617636096","7894414374001230867"],["4862576654877096073","4752250372182046425","12268377834158986785","4420908002229990369"],["7667781194880201465","12051094130246141368","6121225896411749120","14550848277793885248"],["11518012873151967413","15069817176451794000","10992163598269258272","17913235233651783922"],["969201380108227817","3729589870895364168","18433793429927931560","37377273018764412"],["6248650673924631323","17130318071484356702","16816274637797110255","9622524665914449782"],["1442706284626311420","13558112635353362464","375408208472242744","18255673159807907619"],["5268501208141070578","4176537111259077460","13974952158271075584","3904253810938021118"],["780965249539280674","11407091243549222604","13115351872345568530","11236135698809305450"],["17492166416783864781","6988039378778907175","8854570712945714337","13821667219656964194"],["3940186451088962828","17586553055278178949","11254196639474532606","4398931388693819383"],["9541944956983785560","8856695136990528588","9601152474299059276","4657001419101903729"],["12437493462917172329","2075190714827969375","16142830169858176494","15886257188110975711"],["10532715873190416439","14073409782749810974","15361318670543693934","2311202464092856885"],["1247806796825128220","5304386652243791320","265683885125149755","6182076631481696923"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["3013103730713727218","5803004191738009228","6355827177643693648","9017118718348708883"],["3769035124151176926","7251972588213625490","11741706356743059822","12539849162955921356"],["3217762520243324529","8407928102688936093","14549004693765732764","8596688630545010344"],["5403494511040265001","3958053134092848555","6130587557057622431","18414020209807267293"],["10039180399873980861","7014051265911924815","7236035827127273073","1521573544927463482"],["4635662134672118074","15255578393936875240","6721906909505061289","2625573378007473881"],["3357086266074549708","13902853562477699964","9085060890636574481","2551380452614747453"],["9135166283044118440","9818432118993901205","1254852719572985624","17807691788476948249"],["2318420385248638136","4981162584245970878","1252843802420885000","17930958976369238093"],["8631630133960420343","14348942282009178659","11976162666146851999","6203720264566167128"],["11682628146237229161","6840831381418682539","1582492016915577999","18323773460198904817"],["2256214975901383578","14168399694708230929","12385181419760340019","14383101853875240614"],["10490571675895422337","66320734492716712","8280948617856462231","3381209063077607252"],["8609094879006874414","13774249537890174211","9936830003517071534","17262705002382534508"],["1656680477451023445","2950116878971732875","12704125903738970462","5608950646434814232"],["5497894696518668320","16478760449033887526","15516987457759341462","12713419706876363002"],["10866965968134527078","9752198070946233804","1771296471499595069","13330020479161230684"],["2365954137465537101","12748729537270066000","16560139360093497387","4548855511415599222"],["11515331920616996079","862440133153330828","6388808946284734283","3813111000677541152"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["12476248599698217252","1736269088927168265","1555732153072328722","1032242423733431623"],["4108035720315030670","12197283713687947023","12440143437706412473","12272998883800883300"],["1713035508129170350","10744313202436454380","10007570130669081160","15850228744022168910"],["7958606307036653466","5233774339174981228","17458185269507857086","6080855181759129726"],["2987989252775778564","17544392889385870752","4027564992293237291","13257118507580432663"],["1108223312501389166","16650094166752321729","12525595640490990987","11710871100450546568"],["17217339711826966476","142281737678704793","13405102978381906948","2566413646389010223"],["16573857901449952607","10655241165507812597","2188948526094897486","17743056795197394812"],["6987183204974313874","1651210937287368714","15220342746036739898","309329713364258446"],["12979871636559296764","14262987522603124656","113514149838343122","16024241206786799668"],["2094709257667752140","15395550918829533827","16448680529497798330","1410717392971738642"],["16806085966953625561","14680054684052071851","6884494907023590325","7872702755207803824"],["18363147093145200373","14229248019776951066","4982532831686126562","11115913894296022728"],["5897371277405384107","3819688915155753502","10012142320007474154","13157131619612693315"],["880312468817026261","9974375163023020411","4213383418569407456","9670171155371373297"],["9595911355813376034","14986627023048985671","3629788175157077914","3910518659507093823"],["605807066845424626","17731561615232845770","5253174251606296446","2957184076501753971"],["13899885566824261626","2284243918945495940","6794049278003130901","17262788975114513978"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["2202634534695406566","3419823699247591855","2376851963403128252","13241118704682527291"],["15225643737577493442","15541766199472245761","6315982291745035561","11115808276725081378"],["17546451168708353167","6084443928804868507","2843274346571464518","10762224127112185615"],["10688825409064907512","18175613908397934718","6156369839281788334","18370355976893606490"],["713864185315514617","6860685739650091274","16178146015304598734","10135895490549454929"],["384695570303815263","15058471195845977388","17551942597431076843","6180196271471444742"],["8431090376112660178","14254517553858256406","4876156115622633206","12970163777946112252"],["9855755212079695499","4761670495270128542","772290629504876075","709470203804000737"],["7769171837274296985","11441556749316395068","7189749897843540088","9482086417368812327"],["12433831613296650379","3188404089317963166","7637186081570865055","8675414722525892147"],["3218583591964209719","16766306221324105170","11258018419629254711","5144558445540787637"],["652972689152648537","1054041962566276118","8205924322347110131","17361446357739019667"],["13329853032462570533","11462545044734462110","974879311377078645","2041556103213673791"],["1000623671821080933","8533250405442769775","16982659730924486803","13496886365160627478"],["8045426184963200563","16196384198915883602","13784137369312401703","3677202733597251334"],["1174323201937139930","7698722731376488607","5632982445599930525","10057592481282171134"],["7798867573819120197","16653145017617782609","2969574753244961440","9033030808537774663"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["1058389050959809334","17615334743793305357","8976684161288788264","16321094279647196366"],["18328422333017558681","4011074049246073972","4884596283958445352","11670031255813626474"],["9429354057701427095","5156420951702739486","8131849511213986544","16240228303762806648"],["407985893433816358","10464659229766028781","8116310514884496885","5968949410476205819"],["1005521702138714075","10880038997097632785","7002576906953270012","7857161027746482685"],["11977390163764134038","8452854705729304059","10917110160865691285","12340875248733394496"],["6488603983494635982","18011863603979511694","3977095824345272631","7879538564902620108"],["7351293603714173035","2832316243866596229","7603176374860595802","7713995695204819463"],["13915747364221605496","12396701469987332401","15870538604599933050","10823086573931580581"],["18162988808036807258","14652564221382644345","472440143880020680","5628887766025597294"],["11554185849415511492","16238016671140858917","10863031716667043387","17001087572090856814"],["3634423035689980104","6747137598918220289","8234894607379329883","11529654212549572996"],["14217213659150725856","13738182252059614","7977143224138726465","15057419768575303401"],["16888720745437004054","10035356611492076891","10654298186985100175","17757134416065186063"],["8963119009757867936","8445061635367908813","11135745782566158977","6951818184030391485"],["5121362995753026355","2456500915318506972","8095960973219089848","7363311877238697817"],["4102532425771445577","10558543398492338467","8680535612802767291","12103656008277548801"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["16041327218292526658","14510464153437814549","8450087859315022103","3435426334218386576"],["15184211190388286147","4775493719424153972","14849303567754575223","446181070924308137"],["13068389475647533104","4189244484054639563","13260679783251521901","2399043132277845046"],["9558947793433037831","9140748876932019481","11428492022721241075","14424625770958176089"],["17284817490895315717","17062204417193941550","8626529745117148508","863088448620873275"],["5334067656346327079","12104531946338652676","5175533841434921954","16706205494157460207"],["5878675424575351063","2372997097203141192","5962241357068034689","9917132259867668274"],["8389614246699481104","14551296962787549337","1942785924276822314","13461235500831708618"],["10428126348507768250","5416300672497235741","3655355080471127917","521313404031216282"],["6565403020989970807","16477600281911151455","9388710943771740527","13640237263677124339"],["2054846647519686020","15448533315837783980","352410969548571120","12584739713002250810"],["16028039822923031708","1112947884340985045","17418719431772828703","16870332390021756077"],["4051148227325409268","14737755193867463135","3045546154466456620","5106850072284274219"],["13431251453915880795","5715687198569889850","14569446938315129014","4625618618350002246"],["11612286004327842665","11254833398696450534","13438830284650801905","17834546552232062302"],["3248664212014980738","4723593186806841240","4828506926928892811","17503819272496542856"],["4102532425771445577","10558543398492338467","8680535612802767291","12103656008277548801"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["7538003156909178150","14449969238389996244","2200987789529759025","9904298489204429834"],["346520212205258789","874591742016568921","12364827087472125421","1860929555650585946"],["14495505573943246056","4616111335523897300","5903689170982101400","12798590677328830719"],["17152620477000992792","11907593883687446989","2337948880209880516","7299539009413174070"],["16779744471851623002","14029829679606993230","8093168081632224856","15841751467961364360"],["17467297473235190098","4593140304872228889","1442744128673936181","17029014615313716930"],["3615092759277149238","3655184039976223558","15896017782387770621","5167134203037209616"],["10148717689290754741","8906705563084599691","1527743940023500566","5373188654160567048"],["3229827294150694963","17342160021693435483","4260411146312349891","4666279286512944948"],["11753016225588526996","14494037384834329624","291545549758847190","2421634769259157873"],["11487395434051791428","1724429275030008324","3726470166082822614","6724740342545310667"],["22149480614084397","8499190551138226883","15522825112627189556","10096224360940947800"],["18365170002375760490","17330925449388483436","12977484071685200260","9942899602298228679"],["10721216919419514055","4536470960792020856","4635101941015094384","16013774055666827902"],["4282376264160902369","3318318318383480568","5999679603880752108","6410049685369092870"],["9595911355813376034","14986627023048985671","3629788175157077914","3910518659507093823"],["605807066845424626","17731561615232845770","5253174251606296446","2957184076501753971"],["13899885566824261626","2284243918945495940","6794049278003130901","17262788975114513978"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["9425142606104841351","7446409323431526289","480899627982427323","12309617009454030851"],["17974713297975166515","12049732522048972371","17506610600425983914","2888484612702972546"],["4094923967550672160","4161893856533375101","3852361711650762426","17882265844222035763"],["16932571959180455815","889834191654197213","1561350471199856511","14153421789456414111"],["6769060565491141662","8067427923495010456","10604472780365504232","7142774635830928319"],["10116054303447495321","4111552429024124942","14812277854477605100","10577392396194809842"],["18176844174396844531","8420865492056741523","2792360920890282557","3046479950635663654"],["9826398481514274602","3506713595741036783","10236334628129504786","13290550366841822988"],["8733225597742631464","14277883646440284420","1554982578163907160","7702640419740257203"],["4790656666317347239","6979434103872068450","11702071360051105198","15378732717039609376"],["16801135665628243907","18101670411730186080","18246514787614588427","15830968467267567379"],["8064122868957624794","1481182818952855424","15611945742502780380","1873045599127332520"],["10229879252680144038","1139218193141456607","16474470867909333429","2699719176062954518"],["15619321923444709798","3163995242863292130","6342816350926322508","15816295762018111663"],["12039207908130363632","1116409095691894218","16316370903759431512","7592100928744998227"],["6655637978786832539","9882540868977353974","17269183082214930300","11878618037307790727"],["11643387984020961504","252239480763010923","12916960587966529214","14870415719426221063"],["923973661845686306","10136698382849311691","6288847712733800514","8374355574413741752"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["16089530527754794896","10793698707473741819","11142941190531857683","7596399832126655658"],["1906478560754726522","6032109682386943939","14833413361380956493","280087957672675257"],["8276694556520427950","40945817330883871","2416271623150358189","18343974581815390970"],["1024982706374814760","15300483146657988613","17930761624293646861","3224103323763458391"],["8832742117849798752","12395006076400410447","6508240880116738106","7226913883454513616"],["4999681395663411675","12231902105057916537","10657470716326114246","10344262437109080752"],["1415694267391348003","7008063137553080128","17395236775846978055","16079395378112652314"],["18039290335579032470","16664849774417562562","13306680271501541113","13633187093599542963"],["1906549525753138932","2452258752568868413","12218769037182775918","2998746339204255173"],["9944050185974934034","8016793864287481052","11287434928311166440","6557023155212278114"],["18106794302709787304","1148768836056541429","2736385444036418254","17148728733311278027"],["12500255748691506433","3711063964529911884","17522169677147810132","2949439270278123234"],["16785866975289007115","1173462679107664558","5745926468452190713","6805411611259926562"],["16293364482216573873","5890591736310485864","8034823657876933849","10527547611192552570"],["1035825203488358117","10316979345115041842","7672868906851279497","1396703640942504702"],["4986586089613064999","10215749588261891911","17286858819959187934","7381555329591794195"],["18128318277293628810","4222316042828176374","550981079205893023","7478927196755919636"],["1247806796825128220","5304386652243791320","265683885125149755","6182076631481696923"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["9911803924308507326","14286453492142222901","12061367899420632038","12854211016082593941"],["8109108344620218707","13656507483391844584","7975505799001941151","16045941962517861290"],["12727056505744826037","1179665183528470904","16681037163994719630","8717603416292745097"],["17994921987088809381","10504332491190956027","12153506963095377508","14231181424598889469"],["6526794042856229729","15344080877092928728","14147302130205350558","13938651870091360580"],["3584093240699578485","12036212070539485282","17417271193645495799","8579009810642913312"],["15724983799575901327","4600096897624471371","4465211633419532645","9653237225497829971"],["237623804558167083","13007524494713380764","8032619311750382191","15584936064231886209"],["15924398514324510290","15042308223205903317","3017297762513145628","9016309016443112796"],["9762602928183645821","14954418125186997446","10611591808133502312","9628444830947407460"],["10577764886035272974","594604814405995725","4102780747169441762","2029317523311693354"],["10047199514756371604","9180889074768777327","11804415951966752454","10730584050252376874"],["790821357866012326","15112933166765445003","15759611118861826470","360675847784264997"],["10347554461428968857","6658998718455947007","255132512255731087","5433684543898760866"],["15924746320898956989","14231887208210599339","12083435207521737683","410831386849209058"],["6184010042784546527","8899922088419007276","17849285444753012076","833592516147058898"],["7798867573819120197","16653145017617782609","2969574753244961440","9033030808537774663"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["5152925097265320009","2817053429776828376","15217684412012319266","9967666420625434661"],["4435890316475610100","4476083732739167158","5258411385971550402","5266906083922396604"],["375750528396967088","200493059209445445","16787140758224194028","17127290691660589640"],["944736188585270558","6554815116570539449","15287864534123911687","14129359482784012203"],["11974863180482654695","14936691101579164517","7608693631331817152","14369703132637233977"],["17316417779403143039","10628466455967573049","7073361965385118625","4612508283994053373"],["4884192093070548625","1987664860495854959","12130019392907383086","14353791936233834881"],["15119788938893216904","9843699484200302808","9761114887953638537","17317134642519469634"],["4088336223158566812","11742428557025530471","13814572225772686703","12259595288627902677"],["6670676505545953139","16518830706946619110","8188444259619758218","3154322919176463206"],["8368188335821924420","2353045307787023189","17815375253694068985","14597499841452987172"],["14614362268352340953","9661499114364774055","14678829034230985143","12867428128263615516"],["1447714482217075266","6571048998681147634","2664988985311481062","3014590186691592194"],["6249726152306132106","9579441360138518112","9410691091663385407","12795846145140032713"],["2474095296198981245","14696055377755393565","17115421953276321337","59072792789840546"],["13041038073223985919","5854416158118763077","11994307379948398354","10531581604668997902"],["754572472133887706","8005100128465361923","7951593194434332989","7316241415922363871"],["13899885566824261626","2284243918945495940","6794049278003130901","17262788975114513978"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["14599553425433722298","7288685684884806102","12965464873500651406","1695607030900608399"],["4601914657296784323","7910756093861805407","8125284131990997125","574636562341626349"],["14885368544604909058","3544263428294117115","14833883314304179203","5047899498184949497"],["5499369782286517620","18081737057056173624","18094643431015144141","14213024829769758347"],["5671614419643241872","16347126192012206526","11712285575301806707","14328406527643540444"],["2553514127621955319","5164769092838510837","2440507951293276195","1651346609254547346"],["67208285939297194","16929570674882100193","3853483444622277602","8564704792560449945"],["16999303237687341426","15537009685006947701","12573070141353374868","8620367361956479947"],["3481678855001403334","5487008239997833129","2642745469584994537","14950331199963379061"],["2838024558893715651","9123000381738825493","16197232649677257165","14957834935083165770"],["2633335653793627675","10483040506758506073","3821181594803793940","4503472341735026554"],["18029144597084405352","8416420335479648181","6551198272943537752","12916766651520877231"],["13975108246183017265","15071306177326714233","11285115603615235406","8732930285233047540"],["11790611093862617428","14430567301051471517","4084000814357012328","4614712948507237121"],["1656680477451023445","2950116878971732875","12704125903738970462","5608950646434814232"],["5497894696518668320","16478760449033887526","15516987457759341462","12713419706876363002"],["10866965968134527078","9752198070946233804","1771296471499595069","13330020479161230684"],["2365954137465537101","12748729537270066000","16560139360093497387","4548855511415599222"],["11515331920616996079","862440133153330828","6388808946284734283","3813111000677541152"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["13168898176495030776","14783623417677038320","16880931396946271930","5309838998708494630"],["4633204646019646287","5937043607206539744","3440836908863623178","10764127698475890288"],["10651876930804139906","13825740914989716072","17192090860641864770","12414034640581308616"],["6295887679672753435","11371865078933224863","3743326631336998075","11994240842170338560"],["16982919786657651808","16007436378876796692","1503993609256694547","6676645231603806115"],["17261177522436902585","13873754043243252290","9078104250895172259","16830815898506134214"],["2375306237047873969","3380527297951814240","16928095720138680940","8587667920068843705"],["2522374306904038630","9023335393219972863","4912851838540744719","17971780434256391473"],["9061658888281037734","15541105822353827583","12674930306225883004","15325354301622349407"],["12229707108229809528","16534220039064393496","5039045564203229014","5333674894264201332"],["6302755300456355708","5606005625461593744","331433322197302460","3567996669668980564"],["235698212754786137","5689860172121581744","7241726850244267360","17602829978378887365"],["17060169313318184578","5229560514030577882","9507735649695302095","6128000406725704973"],["1695505596296382185","6805432515796180018","4603911018982529532","14078581989483602442"],["13028292992648585568","15318785593515679388","943715477049951213","1726459486555045063"],["4448477237090735907","10336829770329700100","4256908213891589584","5622916973954771310"],["6497757229561424692","8509755114368582589","14016314621404961673","1952428492006793163"],["10137768859383344761","10753367648423279137","16965981483494781417","8539040512862957998"],["11515331920616996079","862440133153330828","6388808946284734283","3813111000677541152"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["2538847448447684162","4182487366269226171","5024568554822461911","8185661358942889864"],["13997239068572598016","11293017145784981234","18383610733469990539","8406390655224152663"],["1528114922183120182","7594676148347307840","13555186507982879706","1742998857105746233"],["10576699356049081897","15565535675441036501","16707605124929151884","12242534897554886352"],["18218747208131353953","138675051476213163","17051240606994656566","18080870758080216639"],["13802210493715830392","11954147794586969767","11520824513769512691","17244178300561689241"],["8373709654344577729","15237039480316396987","10724587420854830789","7884508206306848453"],["9226403541027443276","17729124728693955566","15166414227968663250","17489905442328063725"],["9971036493095440581","6889382672785819642","14377781388157335629","7632999374600649400"],["10851989621858185913","684670855224927387","9410190079059953828","13693125060378569053"],["1344867909959026798","11567475424168792862","10785326301595594928","5552967187278487757"],["12272424936694636103","10449431287599183422","5432171008674228607","15667874778269325346"],["1447714482217075266","6571048998681147634","2664988985311481062","3014590186691592194"],["6249726152306132106","9579441360138518112","9410691091663385407","12795846145140032713"],["2474095296198981245","14696055377755393565","17115421953276321337","59072792789840546"],["13041038073223985919","5854416158118763077","11994307379948398354","10531581604668997902"],["754572472133887706","8005100128465361923","7951593194434332989","7316241415922363871"],["13899885566824261626","2284243918945495940","6794049278003130901","17262788975114513978"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["4049109129523106478","6322911930473830905","4579301217753714445","3634292269967686562"],["4178607494253081147","10498290682992908569","1526311134999838823","6675613633847236039"],["13123135942000765453","17350363387972186327","926036443151406450","13119901329097511343"],["11914717549483133296","1819068695209622583","5698326251833953073","17975207316874116564"],["18278536850678078973","17535758785216247109","3001152888987757738","4429415755955976772"],["4381357869937431479","2449404822621655240","4176201869229149731","4354254793672880553"],["7876269226986828746","8962194982317817360","2426553592264799067","10057236729002048650"],["17394856110704412908","17342046352784898837","12978019751054792119","5432995671027858573"],["5016009846231816331","1735287746570689389","13854243725326257445","17201406799443013238"],["6267160453488941715","11915492820172744689","11501781526422195170","14533491739657493493"],["1386327422867155875","16189362303853539361","17118531048220316911","13728965427816307503"],["12483589325951628327","13060624002505165785","16503297401081827531","13212615284466069637"],["8535761573603645341","1668965552726495687","12658593352353658863","6785725011850583438"],["4485794968683240743","8223692094143201694","6307921220337131827","15695576482664418839"],["17675394713781214914","3332270429169503802","7548559670968593276","1485876607187077018"],["11472131305136741354","11993135697645242802","3426856040454946535","8308209739858913199"],["6497757229561424692","8509755114368582589","14016314621404961673","1952428492006793163"],["10137768859383344761","10753367648423279137","16965981483494781417","8539040512862957998"],["11515331920616996079","862440133153330828","6388808946284734283","3813111000677541152"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["15252612606146055660","11325060815935251050","7859791836549675327","16683876110427128031"],["11604931553883489511","15179511982778665878","14127256512943241986","10554408637117270107"],["14370333217990192150","13828118897857717253","16231246302387421812","10947120047985394750"],["3939534817623486670","6232048002045155970","142664161960079992","4499722701457462054"],["10858053140714856546","9975752384937928337","2325910545639524434","3209242759928073899"],["3874047038251090032","2726825076368596514","14002347527997869465","11782354798340370230"],["11762514482752437280","1525555121948046864","12224362957064230586","8566553314173609194"],["7692111311673200805","14064319143196837834","7405363463796118672","11369098407820005446"],["13306170886075748922","12709579412701422690","3295683459602249348","781413791874954618"],["4223869900963944803","8716225343384453249","2958547354845238999","3312034161411047502"],["7249433520233350403","14357407935640715848","12807385057727887464","12698762384257972095"],["13953876115508523592","8319641762497216443","3593380312855787448","16481963248515194093"],["9404194975254019137","11281181638470310304","1220144770025074032","9895886653017466799"],["10540540732794949601","9355751011270076345","10003554221138691360","1336481245039609455"],["17368918291619837850","5506570111949260142","7997719040633913536","11623329723651307244"],["4986586089613064999","10215749588261891911","17286858819959187934","7381555329591794195"],["18128318277293628810","4222316042828176374","550981079205893023","7478927196755919636"],["1247806796825128220","5304386652243791320","265683885125149755","6182076631481696923"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["10881537418517588176","7804500351651689661","4630728562767549367","8631184255108608238"],["11117132156079777624","15085082162513051109","847721938562758855","5312350249499003385"],["8527111967699837880","4606884801197895912","9308784732293420531","7721466343457973208"],["17059059787951671762","4797227474759669566","6596247829280064764","13428038119261395989"],["11305572774008207040","17461145257926998807","7787024986858229134","15191898797118681539"],["8339312211453140216","8729141307554294174","16245549319551422098","6980075269895451712"],["3734312647031979381","2618457388388743880","17161187976112558454","17963646546765176200"],["17415338665668312379","137802754278978359","966482083883027444","12105910490830778036"],["10371108319595942404","15333008915146060080","11429291456037981009","2273694903694980023"],["18331586382153142971","17077703617486834721","14255438816936658834","3505882586405460007"],["10577764886035272974","594604814405995725","4102780747169441762","2029317523311693354"],["10047199514756371604","9180889074768777327","11804415951966752454","10730584050252376874"],["790821357866012326","15112933166765445003","15759611118861826470","360675847784264997"],["10347554461428968857","6658998718455947007","255132512255731087","5433684543898760866"],["15924746320898956989","14231887208210599339","12083435207521737683","410831386849209058"],["6184010042784546527","8899922088419007276","17849285444753012076","833592516147058898"],["7798867573819120197","16653145017617782609","2969574753244961440","9033030808537774663"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["11699830941803352292","8310046319668396087","10130491716649924198","3750774235127407802"],["12419648379267561418","14504711543493111956","6858255825301301439","11493493605693840017"],["2875542216316000860","17294045021750638412","11554110664660395445","12725596835706311638"],["18264575285430167784","2768737949054152396","1121658364797086519","16829765475529299299"],["13857639224357543700","962851443856266597","1356941615157430138","350485918684144679"],["5071994434014645156","6220507029674796595","16515206748167650824","7561313833155487090"],["8355869726976881205","4767490700148650236","14909269177456703912","9325594991638219865"],["14769172491473957258","13117269845814616892","1537809055690486044","2912918334639569860"],["3814332575070687991","14891268415224945919","8187075791991460757","17981496239809149547"],["4276174612164408417","8067143636064546745","9390581520736639692","13853434769872313700"],["18241908618443754123","2716323699401637372","8668568298711226813","7220365675510936209"],["7347441859758791964","4773868002114849800","2418041134538589926","16666117574220610500"],["4990966223043518048","13887768876186643771","13814534006117799513","1708642027554048414"],["11860248895061830748","9050976035837004264","8687025147306644551","17975839034216405565"],["18181232054580821047","7658890626883711241","16891776229178599458","5781326425981719613"],["9739236651463317308","13954091241440597271","9850593628054743286","13715618324040703459"],["754572472133887706","8005100128465361923","7951593194434332989","7316241415922363871"],["13899885566824261626","2284243918945495940","6794049278003130901","17262788975114513978"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["7447054247445103729","13428412450433626054","16623833978797603432","8045595558721086013"],["9613622989967171136","7331765933013628213","15797721079927825409","15225401125103018719"],["3861652698824712376","13113716783363310552","1746467234438562409","4058486637265044451"],["10574972744447254226","11960396345972418028","9583210930626302070","1755176924123932364"],["3635156745041215545","9303688650896300488","15225913865431358828","10748694467703314775"],["13683703140820063001","16022613439643056494","13812010202309469269","2061337597708760519"],["13929424138432831425","10660152617510483007","11291583696447381229","10672928989183799541"],["5760380109866350737","16533187582400650131","14808763709308331573","6389188942995487930"],["14323769148149672807","410646562151443179","15573789184699485186","1775539144836880197"],["17109688869401796612","14699841960204907313","3034372938353114060","1460977386993303871"],["8809803487622464445","17356144716793597187","16998525100666970518","355361913821365878"],["14188017116164398125","4123778582761803012","1145975058264123919","8207020543433989133"],["13897229953349932469","8608521903813886592","1548303187277252411","15730292193643041687"],["3113461930086415197","16264632052818890679","5289892618723968400","3250313765565718316"],["15781118159454892810","11165166396323153073","2019372223496794191","17556508674379977616"],["17532910421188121145","1979682868475634757","15153132010884945611","15419906263821142700"],["10532715873190416439","14073409782749810974","15361318670543693934","2311202464092856885"],["1247806796825128220","5304386652243791320","265683885125149755","6182076631481696923"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]],[["3659373646388553513","16582578117930054745","9992880659822352","16285023082838875851"],["7586673664966491775","9598444384034356987","6495430359149285619","15583090068651521215"],["17366322352338524148","7128144587809050004","1787424490059307885","10801414250229916065"],["11581200536657073102","2464018040542240806","7924939694058347538","6144061514609127203"],["13358143984353481514","3970197174613915392","1551559935886330302","11337145812840998283"],["2954912056393012115","11840469609764364246","1143206432390402237","4218857252374423617"],["4993878359330294191","4953176292982592782","16221094213980022473","9107580701950128426"],["16164954544158448151","11668144617158422337","11696791455149185013","9906179298426647365"],["3445228043649902368","3979926248821037442","7928651566215565871","20060296929666013"],["2400686981634785575","5736178709419057332","50408708900461828","10483634817397667458"],["15172567752853759775","7563029712172654895","14204587706762396205","3749458537624161741"],["16381214639856646287","9713726620619413506","3898763508423348006","16141600146724078201"],["6777251763241740949","10425148394293736934","4319471181241951139","10229059230441954185"],["8269803251346167267","17296824672545939390","12193713822697324448","786944833329752665"],["8963119009757867936","8445061635367908813","11135745782566158977","6951818184030391485"],["5121362995753026355","2456500915318506972","8095960973219089848","7363311877238697817"],["4102532425771445577","10558543398492338467","8680535612802767291","12103656008277548801"],["15886482498799996910","5401703481770323394","13854065958370483458","5662179440953677603"],["6714212383413171830","3765634870235157254","18302482255465802630","3010832601492222624"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["426286773727548397","16564165177461602742","1429311412853081250","10620513257323023228"],["2069862055324770562","81155988776857752","14985580303112812401","16217752671772834114"],["2630550517902247785","10776844360739394154","14661010783204310542","1596187919995830023"],["197534394870616603","17052207426110703183","13913515138742857978","9255812603070332915"],["17643988675140747710","5191239909317094083","6637775174370889632","3618980304362122692"],["7050299868686698492","10152381188714908082","10909587328531147939","8139683850292713900"],["15090730268576312453","1249284890751467712","8709969984358852697","10641262550916576257"],["16217604018714524176","1346317445961905658","16710828560617950631","1727151802594363387"],["636652125704134691","11222819994897494168","9218897798181321578","4879981195742774957"],["3516364709218667850","15991398304346936723","9756962617450401247","989068090922011051"],["12572319043682669669","2428205321433527997","1835322230570520860","13666249269190601733"],["9295827582819470573","8207196191776394488","3894629746745061879","17183446844015693653"],["16525327004837728046","12902006665850708255","14295083789462271955","14052245544419855003"],["8866731292764413579","9455846054128349950","1350941144129159816","12218931783549606074"],["8604806750682064781","1499720892691871126","16471465282144545019","9121463588727455928"],["16582105848833891350","5572227330478148330","2084530671833663002","1963599225325804907"],["17795500955773774580","5335450046053470075","4565699192844024374","374885246836617956"],["10137768859383344761","10753367648423279137","16965981483494781417","8539040512862957998"],["11515331920616996079","862440133153330828","6388808946284734283","3813111000677541152"],["6864500732117313830","17330582083688377395","10672833923778069922","1040159693701070428"]],[["5346366344552303650","7772914845990069892","6832524992115515967","16185102956724087314"],["16774684893203245802","16039853122006128782","7294428367173952812","17219538522185284637"],["17154776539258312916","13372790163361887384","6744753986504619166","13275656224063134512"],["9756542808294662502","11075849503748149380","8575006482868037386","7696943136767524655"],["15418496108408670078","3893158724181041286","11539282457535197269","13592611380289647556"],["16270681633254635516","8296014171727222408","17602743079088784139","3458838396121186955"],["7700471742320868602","7114846883703857102","13139116821224459318","5664382018828809325"],["15544670614712104584","7368715429200704501","7609639760756617690","16090795792057461269"],["13170222592511764192","1132003758987673493","2918661600895992920","8547249119722475967"],["8969871703930339970","10233885903498199064","16953415328135124372","11550949341098968046"],["1705511455942531612","18421714238676059133","15551503478777929145","1169725719155788991"],["8627015730709664452","8119838680127716545","14235742482282687721","12980528435492427869"],["8247391998915202971","6379729863633330330","7479728067248463151","6057431014960334421"],["4416662730498902370","11240364325142794175","16216936271218457815","6352567137182249325"],["4358414727869969735","5961915294659323639","16332658779069722468","12356566291379017061"],["12066442186491293727","6804497015754106439","10748620167678237895","8187192266695792473"],["7476746829360312370","3426264457907271314","7379708167085636790","6355866470576136586"],["923973661845686306","10136698382849311691","6288847712733800514","8374355574413741752"],["7483216063933632798","11467825458272649103","9602349581437132178","6492698604994697235"],["2853791479619435219","683566550979685795","1133224789213755139","18048173272412755527"]]],"s0_siblings4":[[["6324101851125159208","7881276372874087338","9524292537954749132","4503577426292508290"],["16183758872504072914","5904663623252019071","149317421092672298","5863961671082379515"],["15914307040026549667","11902268657551505404","445831062677409236","5934216492594631954"],["12625037830025258100","16519717413448344288","16386300987476512177","3433963139669109290"],["16020062408624490818","4992127660553697207","15008551646909319517","7193891967606713962"],["10236740878260997270","14095971995246314973","3130090144497486039","6262193240152920584"],["16339798710321494725","14733906299427975359","7654709967399664006","936016867072403576"],["12971813504965458685","12876870465520182171","4477767514427678167","9567591254653290101"],["6922532420315152787","14954775401304865730","11945952060774392606","15650834416703606540"],["12186115183507797590","12640032268698372698","4801666092461638557","8192661939304391087"],["10205835018759801866","4824197662005785739","5288576217760664078","5254826056916969711"],["9556281072010857022","15571993459895543327","15908740953223065705","6202272071138819464"],["11208418847009798685","4866238010006122780","5213696502776284803","13712246965376569029"],["6850676991178977841","1511305835048619031","12648620863210344262","8006337859923583616"],["16150546848374334100","6300069400100283883","11543461778065923001","2004259043551669024"],["7368030395698246495","8605757626182942385","2884634088301515762","11323002879207832906"],["6651161428554372806","14176796109399811898","8978824067393528477","10807727455869620446"],["17797376583842078371","2303999468800510039","5451883007483387404","11093275901109592527"],["14499157304310544385","14773967033381085580","1489182782870612069","11197350336157789878"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["15516586865807314668","1851876586513843612","3250126543925744333","2223054464287821360"],["820600518715411192","11935480825113158408","4832881517294892209","1938712842658220122"],["11048219824744661077","9309874695996181605","3655241788934844945","16250608933080598867"],["8670931433161782420","14573534440014450426","8581333292170881613","261155028322233786"],["10473388443608013565","1682673266028481637","2797843002084642880","12326950877314636090"],["15545918612154970974","377870895196042623","1115445317255015845","10746300859742464095"],["15668311805821727760","15006642195226009726","9370310765559002332","17789669950397956496"],["13348237853597860493","9127258958072608339","16814625290210651734","4266246634256245884"],["437286880471993548","6421331126936252588","7523072491203516801","14578445661162990596"],["14239759705744219642","15723998818848073474","1813098630638667578","10000736245102141514"],["16107989559869376692","16983888003033869575","8611119066525100338","15704767250231701656"],["9293735105368058546","8450377845012191820","6190702263791833546","2519224435411757572"],["7032440951980108736","962327321801542985","8301936626659625248","11236471953134856352"],["14470977812496414849","11938097436083295743","3932354648077296787","13886992173937153168"],["1733543834533230516","1121512775077962614","17246765670155505456","15690058823806020016"],["6812472027401724476","3901356390929616135","988231689229389301","2507751018314911022"],["17283450269830437964","5433137202770492937","8098956973528028421","11279791880331658001"],["17797376583842078371","2303999468800510039","5451883007483387404","11093275901109592527"],["14499157304310544385","14773967033381085580","1489182782870612069","11197350336157789878"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["17696610359027446457","10587907283675089035","3931052226424060098","15491882188345273343"],["12322770763064445604","15139317437756942361","17808518964505411486","6484545456782616672"],["4040100760656718261","17366736948795243083","3528809986850723202","4692876352737174595"],["2976413931971681574","4920503335269525988","11297208758832291451","4772574703232346169"],["5643505606077410213","2963775936168465217","9956767996591051775","1984798734831387208"],["3279541582618709295","2474721917261538856","799560112409133287","16952897587948541973"],["3746798800528074297","14787562869579555845","15468385647229890477","5449790768352475710"],["17906550570465249031","3438306140780800193","14342902744788885661","106110150353759434"],["10379385915383570837","8435961741379351532","16694399638964146319","12910938854103625575"],["13027600813817203068","17510370179036471824","16041894124623257216","4013532734970359756"],["4827766714563652578","617683543655570231","16485889279024456609","8188113850306946348"],["15130413102327951174","8632192458989805588","16412037672540461030","678592805388461212"],["5450502907634534211","15825505069225445550","4372187267817793671","8408193582659337413"],["3071111931385518371","16195888358819072232","12392385448828064","10892467881121778539"],["4664478227634390651","11864468483971373151","16523054761589784431","11257565924641928813"],["5713796116439696269","5999615870001604498","2159520368766742682","8149521765295977945"],["2717872171550586895","13660486777814830319","13101514235646478229","11135301798988593187"],["13883583706498417277","9583816329066445233","1758089794378020680","14250032705571478496"],["11714705052269852893","1225784866581541753","4348849259866568775","6305261573995915637"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["10134635649302349966","16865904319722725198","12171279558658777491","14954730072715032079"],["12540431574416184620","17165346846349969465","583999423782093927","95869128834070635"],["10759016632458458892","18320761838841363523","3701710416691912371","15791188678896527321"],["398745022915213759","4602995462223167672","9624486519360701187","10587053749767511187"],["11438251561219128086","857842667986574629","1520218531788252896","13058815409184537798"],["2149897024424689966","6182920629165823390","9681709343743389223","9356802784403151478"],["8406608702486601322","14389606689230569599","14848911205944018699","12448496329223122353"],["16600990506007437142","3303703495469327525","7090326187091441095","16260532852288380382"],["15571369998543686173","13071232741911661040","11127969270492291989","17510564307751635024"],["534315678742819670","14736461556016818756","1150396921389732486","16394724754236230987"],["17357643342642336628","6660708797829148766","1770982125847536793","9733280345428614733"],["900506307488447315","11952312564064081530","17800198806880755832","16149252866242112134"],["2486390269709797806","7363348320466971807","18325587940768257220","9600412023625443626"],["1363032357256144926","18159986818438903780","17803969835455229414","17378818377000596173"],["15469929025406086818","5897170826042023025","10923578415149373958","15715821480201382952"],["11721576686919708225","17587994704864879182","14513208349584111081","15939167172266099612"],["12265189298843974073","12404092549491088705","681387365373197157","3875747828882464090"],["3937131025915791145","10363022442545307678","10844394000528363125","7923317672431018993"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["10112083839541337464","3116276074585990868","18108739173454833964","10499154169951028645"],["10508551769415380117","16239107699305482671","12299303790334533248","5768691087280350967"],["3110303862349228008","12926689085471013384","11149477829111841940","18023387549202472805"],["1631025190419578941","6667324636941348183","10024575770212919882","14771417596004189716"],["10859920686099310544","9290157299309240223","11594582591566355740","1373590933489187955"],["6762402038816277822","4864928609494378545","7039830743582274473","9731734359188769401"],["4458876701790298635","16898827017682448028","5559534204513208088","1486580469379668451"],["2505049528840736207","16325043729629450655","836966907885886644","11262735551166451408"],["1926153163721192682","15050637393735062083","8899820050925288078","4512077867599992200"],["3912105281621686450","15444817136570118328","16746215078738299721","13133947216847103167"],["17597347628597154890","1155817748025528218","3913083829024610842","4136155803611910689"],["16393027088828821075","2472271621753689353","16259812223246645065","536969817221113687"],["4308636461136592490","11530646076460874307","12863625098244740497","8068518411782090661"],["2141498272567023845","499742815509283990","4033000017576555627","3482297136464344349"],["10522267335347274937","18126206143746831702","17585777917950944508","13919390613179301873"],["13526837903340373954","9851212938070197477","9021053776628619979","5380963464721577455"],["17788779284907331946","15537435062900797646","4338944474506995964","13863350675410312198"],["3937131025915791145","10363022442545307678","10844394000528363125","7923317672431018993"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["5898603014911345863","3600451546402592899","2758730774074958807","12163244255928415016"],["5158091725398411549","17806988616382851020","305039538729315483","7930525478440803567"],["13317466119996311995","8707837677448457129","4999103796918963568","2820497002838476628"],["1093302581598376112","12501119116867085649","8689360732027396383","6550858541342195780"],["6377261927073418553","8836708139376656453","743962006209089003","15475863147934299492"],["16934573748913684301","11605017547409950996","6570903051479489030","12520909620724456756"],["11214926972305555763","4540120915448012112","10272206374979678433","5161699761674392002"],["14134154429237094135","5635806540955122133","16303116155363040801","14579260421420602769"],["11817568202493475880","14825050324663939298","4442195010023192464","6872548590695970994"],["2700265486033345809","11669305846769172210","9784371394065828066","8362714726461948854"],["10957420200788028148","2754801598491712442","1274722762612898016","7411705330949593931"],["8280515194607176612","16462266320253359824","3648589204538683558","8737945292984435809"],["15518681272321381320","4334685893100546464","16411496421467779958","14827753258391359616"],["6532773639677537486","7887316734184253324","15957950578832298219","7342422695306699061"],["17743779564834979789","11310633299070149579","9350111794849588922","8733903426724737208"],["13043420011382489086","16812929745209669480","5649625027750825042","8812201389338526422"],["7099374182902924956","3325592865964943985","13404426535701646913","841561236030999688"],["6443713032599401889","9767951857498316427","14930540836640888797","11133518785494715819"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["9920200572129082202","10327311076462102075","13937860202123334206","9490546923984256299"],["7824860570908837406","11447129599858811004","3357464403402147700","5577502917959700624"],["4804301699928764760","11689560323333336709","14002063681003460648","17327035304605830199"],["4350637767203218898","16510721939648464503","11772482257539233462","20574337574610000"],["11118660293893163748","18434393408070980496","14760932584241884349","13009184727134818120"],["17966618473948535080","4089557526491769748","18085669209187063979","14529313450681908272"],["1445415686356829799","581856469323555267","2790015069399078234","9703715317648440122"],["240037383500931995","2859000710085449632","17112930671636296953","4062951013960522863"],["15364195445306009920","3506282612834761048","16630561983226806615","12253152426473123357"],["3128500638319888074","3420693431970986814","4090253083449168952","4680374960448242597"],["12477612250341871537","14720760134251651828","7837475398224315057","1634406806421961027"],["517507922533773090","18375129078105454904","1739856802369164514","10938099615530746408"],["7236059920960018237","11273064335307556950","11941650152400690265","2568917587757654992"],["12784536995820782150","13913969987827141553","6042888780150764953","10760943655205903176"],["9817398014333440198","7103139921233329652","13477938954296868545","13318821509565617855"],["13879465189851453099","3701033310050211188","2084910071906582952","16104144299167292853"],["12166121663584996280","7514619790188551387","18066461882513256369","501818958624602315"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["13281809972695819176","11106973108450238433","13875789031429805595","4898320768361683005"],["14559887441403449881","11970737557779441805","8219718605132269927","8893507391648918980"],["3429264362141391557","9749531845844997226","7339358302565846459","8095325299103770349"],["16437006753120017942","14098600814463383208","3568391045913934244","446790604086340169"],["11662128297447092921","9715028178285671540","14807904054643498400","6416970730341006737"],["5212289893423509166","12029779751246408367","8017620082628502893","11152220985217934615"],["6934030772950468570","5520387453626036288","18281246706071989154","8769056521648219920"],["7377383945742382962","13596265863509175239","10106149485097289575","8129413893510430865"],["6498334697165967067","2613861470841214569","4099925139651883456","478084984532132406"],["12234591285756515052","9214617633578629592","14579837361799076632","6636278447635016805"],["8066551909797120705","15956277716155387300","12976829615554207629","2433127351757441429"],["11735599001260086666","1194378982277660263","18057037990625209426","12778494442566940090"],["8020472980554313359","14234997008422269203","250292031139275819","11320061286920966163"],["6284651279818742944","3290623946423917733","228737855112220852","14317816153079503523"],["7090612155670700468","16306417237496785972","6729334799686905515","14917204887891475390"],["4339705524769692136","10618299709476549263","17560839890417218733","10817207276663317674"],["2717872171550586895","13660486777814830319","13101514235646478229","11135301798988593187"],["13883583706498417277","9583816329066445233","1758089794378020680","14250032705571478496"],["11714705052269852893","1225784866581541753","4348849259866568775","6305261573995915637"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["13143760525566736987","5666832711130211780","14688597970350670020","13782355963105023540"],["9429409583998245191","13525041081309226332","3701521531101051862","16808700711634939270"],["11927903036956089796","3638641491421798301","7820796688790968260","8438645757080583295"],["7226566663743245595","5812009751209966990","3793844085115187306","806051121769705183"],["4338051910276814714","12981446672353388353","8217442955498325117","850674742641558511"],["14029277382071063404","10715268131642942696","8549860337889827921","7846706632934585480"],["8857467683329878802","77487847551284835","12079490349082864022","15371714217655638950"],["11842044815932418963","17516615884949867567","3924106717922856354","566615068516395899"],["1851139610534358646","3967735607447305147","18301238568775046117","15726394742056135296"],["10910813265220735711","4308478605370117571","1762959693933606157","6474002053389567541"],["16418194260883717988","6192096678926243557","12984148218798064850","15761207079913628409"],["11126474718926812313","7046512006628235465","17211869214718607475","748615404885211741"],["12122318702226813442","13959614040780052605","10189920726330608047","12717756414250780391"],["3273144167511298899","954724877597396343","14742928585782438605","15486263342508362205"],["1733543834533230516","1121512775077962614","17246765670155505456","15690058823806020016"],["6812472027401724476","3901356390929616135","988231689229389301","2507751018314911022"],["17283450269830437964","5433137202770492937","8098956973528028421","11279791880331658001"],["17797376583842078371","2303999468800510039","5451883007483387404","11093275901109592527"],["14499157304310544385","14773967033381085580","1489182782870612069","11197350336157789878"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["11685217160802429086","8911369208365030090","11160376762417179397","9797759390615918311"],["11926267555763478767","13101860271223529582","8425344614898097897","5919187770038409762"],["15419380233579459158","1964096282843385829","6237830838809730043","8337693681354686716"],["17919771200337380249","3366895410991964030","15998331325348312038","7499563260687528953"],["7385809639409041949","3202936105639783265","7764330424474849139","6188239474869853591"],["383417007080421266","12669311305898731772","10429077294230961088","1132370706270539164"],["17708064486657662126","17786021668184001058","9482449101117710417","4233325850741039183"],["8784846650869100616","2564840092024350782","4963371641685060933","7224216526586075265"],["14452548022930804580","11968463177794881142","8128718117740239218","1162855875218815203"],["10347871462120172302","10101438945133233660","2528381301032015980","16210329129160589390"],["12202819252415792959","15953810054837934659","14126974247074693702","3952405778682186206"],["10115914238442502954","2728401135632134692","16947523605873127363","8956886561051406807"],["16488610834382784135","8820307153020730783","4921135431813445441","10361521358008525389"],["8866516949696079570","3953353749013178146","7452093641959249323","5200987236443451892"],["2275548787040236511","11562660529393779335","144234155442235061","17342014007468830867"],["39518000357467613","15711118908383141168","11508701244703371418","14493779209338101655"],["8340897312956175920","1126758042341354431","3412236770268361089","810622246688742658"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["513715423341130269","16894107174651225864","14083074269505907690","4085205451620963116"],["5268136096212066536","1722985181505526840","612066344088040325","12727527569358403647"],["8446474662087151091","7606984346386900234","10227939561830539882","4346710908186341771"],["10970584544104064481","9605885313743906901","12465699061197946916","6112379061737958207"],["12383761995480409149","3936283567155868028","15355175803092666679","13237448043709329424"],["13599147457102632867","11339073000774860442","18002616963525321409","6750108882017483977"],["3563613246075127343","3804943439232163719","17178147628841977815","10031388005273713270"],["3032897150529864063","10733454476404166452","8313122342687384625","12853312451617901750"],["448010671081483899","4066718157203764882","1248899013309049820","7197886594820823374"],["3140924830874205359","12786104479817079216","8636230484184118291","1656242115990024306"],["12274467554426609073","3342010185836319405","18420717129519780992","15674563577374269680"],["8991020239650285410","10089453760495456036","13779270966547394957","4160827260423546135"],["8380739056339676243","9606318750294151935","15578937487433963239","1978192608164184384"],["14100135000169510310","17253132094058336528","13076881392488836587","1559097570176727896"],["4764182741512728380","8635697959445405062","9348986146121263450","4785930993233575678"],["3927293097953316600","1441545278861487970","5032978743855939935","6956606393561852336"],["8724918256265970052","3487295680783931771","1891708080085355016","11344390182303667006"],["8130213504815071280","3885266181102617723","18272230487771836539","5122547672793423738"],["14499157304310544385","14773967033381085580","1489182782870612069","11197350336157789878"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["2180462637620661977","3993525546065248440","8297162067362884990","14999460449500634695"],["824459405798365780","12676842523851925901","6722357985481693550","17190855261501446639"],["6488789440611496990","2677130018590344252","14585876416621191219","6361522164389879886"],["4170186041772598763","14546906707065816015","4395967442912902171","6220741236802223776"],["10750833797524870092","18191116736255930827","15191123814748667540","4435134985629463480"],["12874231897607389332","2793846742558464284","6037988186245255047","5704869883630419950"],["4220326565066569710","1585572477684505605","11384457131119364778","13329491272957161364"],["2069960711019381429","2287513228333610971","13002221721650282710","5380537409221129748"],["16531317610860434659","287298087979254857","2616206746300134924","13008942895491827449"],["11439940810914555745","13757462302534072100","454415715446883870","14021357218724319856"],["2695380475588347285","17422148582525675159","17272796265654912593","7600805214888874847"],["8167467981736162830","15914495415821619858","6163576614142858020","13613928586669946956"],["9708299677568176076","13135972091241438127","2562153063480975336","10746636636334765352"],["5324555461835683213","16726753506925390567","372854542224456328","2073081330760655237"],["1292875920447773737","11169269545694185810","5194352138757933666","3148515444292518156"],["4130236002806063654","11153033105026526834","5727845669929381612","16386791967444891112"],["7099374182902924956","3325592865964943985","13404426535701646913","841561236030999688"],["6443713032599401889","9767951857498316427","14930540836640888797","11133518785494715819"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["2705701657069793629","6387300538011771237","13325546220885632594","573405457383563102"],["2563736277750032531","7214327329496010699","4653093491643162318","13628368260204065136"],["10330530404453155681","8046657841427163553","910417705429257057","13190647850477519618"],["4362373755594764422","17953955519030385948","13686295972452394056","1016853457891922433"],["16114740682842059386","3187108007826705425","4022395639972133510","11761414171025915057"],["8759213308473100235","949934168556255670","8637781784248311524","1571832221403346483"],["7527588423144213089","16954587766866594395","6231264292258690836","15644771997547260843"],["15420989010004272130","11246105989027814423","2709847094763839608","1593661806025636389"],["324782211325283807","3996052188347788836","5856445732621329480","4226165286760797968"],["187430445417584328","9225973688048831732","2609603594755374442","18388581592262390835"],["7287324943063713223","4973165283790647244","17650460811666168199","2273674304094152521"],["8057320492127808639","9635724835687581753","14251413884613103562","2441512219442187700"],["3260740680788518803","5658899923020351095","12712291465991829250","2354020983466045666"],["4937237097062533295","1622811157438444899","12539309810230208957","18111594456310231400"],["17890228870244187253","4663536917184303111","15319733718807349251","11959609537001212084"],["12299817824388571375","297274210799124534","3466111317222657331","17817402046363024387"],["6651161428554372806","14176796109399811898","8978824067393528477","10807727455869620446"],["17797376583842078371","2303999468800510039","5451883007483387404","11093275901109592527"],["14499157304310544385","14773967033381085580","1489182782870612069","11197350336157789878"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["16920299430901220602","11622654857424437548","2487256274322844518","13226921376881188615"],["1056770660505131375","10113186673363533177","1037421788517765603","14267935646843322270"],["11384930518815412840","8873502358219006319","10421858339101003782","10028332069557082290"],["5753419184274897023","8926506348843122615","6137351213754100046","8240640141100389232"],["7468134434994630879","8691354984938865600","2415682940373070882","7365302096389967133"],["12578263974520110077","5818711343522792958","1166823610363033827","163246587815516976"],["15843592798487157972","17259964657838302487","13228249756738036448","10458263783989613705"],["1617993460968801413","1986378542234351933","14456783011266889434","50473206020861193"],["3723180330668600362","8951070126694275479","13605780810474104662","8606572229219054078"],["2428578954260107990","5006034988165649920","10921404620611487661","10555276842270687254"],["10245748796852725422","2501682407674349712","17945091606981305020","1579770146637199221"],["15576968662411711901","15307918127631088261","15192369691745779235","17999794438951236042"],["5414693274337341145","4370847226182494577","12377530862396716506","10872018930297344379"],["7204735395364881650","14261206228943751445","12585851089930687733","12317648831624778826"],["16928008908135212570","7923611183683060111","8024363894254340507","337101663044482780"],["2376984583531847988","16802107917390108853","5974679432425530710","10077947227199491994"],["8340897312956175920","1126758042341354431","3412236770268361089","810622246688742658"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["10449111366769783321","1445083006009699836","17820335721268612400","5467137142282934120"],["15032757832404403212","14437526560241789642","4305235345260575770","10269633889215776682"],["3302856754030081151","12903196594370478535","4460685787774112437","2939710027064583777"],["6478465736211975888","7711172405049024219","14817770235298643438","1197581536739074261"],["4370777516551080576","14645594745461015524","6738527278920610035","10834521816216346417"],["4935083553959726979","11417538121498607680","8367494186893375638","338480379954286012"],["9792997968916311572","8927646085136133855","4514551407795440504","7350041205859680826"],["9254500216239762056","16433913388898756301","4609869227123416787","12956423747151895990"],["8558792077020245662","15349358305246132580","6403026379805343700","3874463828737464362"],["8802273188918948181","6906144425402287889","4101863777426342404","1668283872426376225"],["12968413183224227016","15941087638572133435","13862681402979920875","4443868450731463943"],["3892266746448829081","18101894210825623614","6338536786303976511","17286055707559210124"],["16493545704724016635","1014849173930099392","17549642616298600119","15270932035977472005"],["19790127644142907","9571716025080089229","15338044920620258460","4501529992947277491"],["2275548787040236511","11562660529393779335","144234155442235061","17342014007468830867"],["39518000357467613","15711118908383141168","11508701244703371418","14493779209338101655"],["8340897312956175920","1126758042341354431","3412236770268361089","810622246688742658"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["8464116863615291454","17573197888666970029","6759960327297787643","4535414824183043283"],["10500285226697548150","4174589128733857876","6932519535941671498","18251495836042053710"],["7314747223206665231","5729921441988249654","17160379676596302934","8465072752849045376"],["11062399503642864857","15157483109443624793","11660359627721598904","2835262628219333300"],["543481330509051235","9022529973271383277","11759895821511420340","1503071899300451098"],["5031792276600513230","2872279878686504507","16701868584034712515","1588203635865296377"],["5063279585831283954","11085310051377123685","8018714334871169610","2423220881145535577"],["12339382262929112755","938157637045186534","2004782454293518665","12837215840661635303"],["232656817628404714","7457920258948238290","6229384398557479303","5306801311465295505"],["14618332317889441363","8759355959216521726","13785596000892080913","2307911124704189538"],["4892344957718651646","17811617641954050674","16109700308744373255","4918342893729063622"],["15769662604613293378","15391257475873096245","9001244612614119546","10222141502966250172"],["12642448663104183045","3774246612054987941","8016220195600763098","18153735270141052675"],["6381596540886069242","14121037160536892306","16150716646274819167","7223888666005205385"],["2523586086283141659","10391350835839403463","9189858423933129307","17266635907141557590"],["2670473228776590335","10713876398303997609","18324092727202731716","8155929359687928480"],["7097488789943943084","2109846742709810840","12842794468550268837","18421688336012727471"],["475009244574342618","15894481152125667920","4502162819845236442","3649534016505843513"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["14127446042869528466","13771666203928790035","15096205606580264759","14622338643070545759"],["8524454160911517208","9147123104123182359","11048170814594860301","15325983719358472412"],["14068525064123068284","7356751304643998147","10759563871663878426","3666629529195277117"],["7937238173750816547","3535514947373255410","12511394543095390630","3838956673609591434"],["17006256135981592695","15002754525670794165","12845857790403698038","18409312263951538767"],["10815679433422011146","6384332611404396484","6096928764896955352","1405032396789443693"],["17743780699994237924","2999172301757222259","14117677194541841482","16113085853202300283"],["3463810952840094135","13861353965549797962","7606013886168142145","8635832084623397596"],["7595345564316997907","11852929256415195669","282531964071780586","4827430046130087838"],["6417742644796452116","9085075296288824242","14368342114824243925","14784745260069765653"],["3337278925429521267","12196808754003094714","1156604656478769673","17616148796274399779"],["6070524515281720056","9208353718740764757","8578376324531190997","14802050649561315673"],["14655007327892101404","11743257776072913344","2966011541828482640","16338487366225616123"],["13828606894262137212","9617018283543783158","8056911512116960927","3407997241496057855"],["16569657972027849568","4713987414364193390","9369225965721371065","6469114609319820430"],["13526837903340373954","9851212938070197477","9021053776628619979","5380963464721577455"],["17788779284907331946","15537435062900797646","4338944474506995964","13863350675410312198"],["3937131025915791145","10363022442545307678","10844394000528363125","7923317672431018993"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["14219656170354564892","4969292434405736027","1906923129884695920","6836282812209266257"],["17497708677461940136","10331702737151406672","15622121960733720743","1094984118623479956"],["17632620707327358432","279741358005448924","3096141103192476286","14942598843495729982"],["18181219658405793864","16717798953301038505","10597353861505230865","8753872349819214503"],["12761361306842242367","1116575263263251755","4042406032371914387","5618144872133772406"],["12268545865312188861","9774885266352950640","12875161239326451007","1979159577423109175"],["13586422514947367497","839030199097010185","14347087588463507458","16350453410543451250"],["8993080802862724201","2631061330844726911","924709771186691580","8348683628225480868"],["11842864624656029393","12784643708432702534","18387447544987109869","10630214413622385777"],["14389213583125428157","10583172251704235634","3795758385285489409","3238120605289043361"],["3134695452092777348","14591718180147915774","2058508413873034277","312786464987548780"],["8415676715886111116","5840425365385572483","10592995798316016064","10337896947613867760"],["8020472980554313359","14234997008422269203","250292031139275819","11320061286920966163"],["6284651279818742944","3290623946423917733","228737855112220852","14317816153079503523"],["7090612155670700468","16306417237496785972","6729334799686905515","14917204887891475390"],["4339705524769692136","10618299709476549263","17560839890417218733","10817207276663317674"],["2717872171550586895","13660486777814830319","13101514235646478229","11135301798988593187"],["13883583706498417277","9583816329066445233","1758089794378020680","14250032705571478496"],["11714705052269852893","1225784866581541753","4348849259866568775","6305261573995915637"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["4266938289582388533","4563876073014365164","4046179092188528019","2403993572991727723"],["7342112840075960877","14816915131094035638","14956615549545812155","3814028753636725551"],["13502210806398046614","4283750289098383464","12139645878705623191","3090596582550985953"],["11575607657158077000","2982074516617748335","4802017555736139535","13028040905123823716"],["683633196416849856","336001416358118736","12055362692346744986","4867951478664694231"],["14919128278331438125","6168103009664387260","14572842029942691825","9847137517004834931"],["10778021739498321016","9620046562315810692","15931279875402013817","15157689027418216934"],["7947913106616870008","6926184956434299564","12979349988993278964","7368448932289478904"],["12364405721096806610","8943436997292596667","5375406175344769945","18278120164124679155"],["4501770063816535925","4818392942942503140","6917611713916513680","4664858703334935022"],["13995130723681908505","464438524210319283","7262573944804515794","2570413488477415804"],["17053959284650445246","12546187736606483774","8436663445376232315","18071668294146380274"],["13046521203480427039","14435094251552987264","1926510408189767170","5899068941354214227"],["10387760378070093771","4237542877260344162","1462737388141023361","2335583515926153636"],["1326901214742935668","9856802499373229525","14426914794435142539","7325627954041355933"],["2308889792804448372","12543363474312902463","14167860077254490940","10630056519800132147"],["6297284507298685842","10994199530054086978","8267997066797890630","8512416545013867187"],["13883583706498417277","9583816329066445233","1758089794378020680","14250032705571478496"],["11714705052269852893","1225784866581541753","4348849259866568775","6305261573995915637"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["5649890186109049767","7610760126728722367","18363073002544800577","6515794618730108922"],["18205738440581474955","5342172720639736834","14763570839593884860","18280063869219174201"],["1805135268498048960","15759562489193238858","7276472173253885058","6866777973417347089"],["9930203738221544611","12624087017680808981","15364797529252219977","12804490856206397087"],["2710256822297749121","8203233967382615332","12898088484635470665","9936720314987631050"],["9534792145392657848","2253117544646706580","14338788990818783307","17235787983925160977"],["6972690408199686046","8151469180496093234","3312354426616918409","10687302075228199967"],["7576566777467919633","5239062884059441280","12395635192031899130","18302835971300176519"],["17041932057889567587","13987562416641614961","15832334552200656456","4513333310783307753"],["4726799190206758533","15091567217173577650","16782956540081288666","11669915192504549351"],["9518048062113628618","17929056141095021351","16350860158617660567","13793715674294960013"],["4822260500354923532","7408236461888592903","7777178494986866603","5064768992546668399"],["16561581654354481550","10879765597052378683","13569338371053855438","3510621952745395467"],["12148265122509488341","12583813988259072621","9312389783461442941","13827805597337090230"],["44155063330192167","8408486151531936450","9096031810110519409","7870481350102055892"],["10508104305301337623","14917663878676968587","15900260814776037609","484811007904688502"],["16767640943912163266","3057133834632271768","4008907268961934928","2539112982719839860"],["475009244574342618","15894481152125667920","4502162819845236442","3649534016505843513"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["9628527768654409732","6179107370066049092","17921917253707801622","8775802791610957047"],["2580645303525547314","12809113503303859138","2248916200316025744","3632101647125261612"],["6087097408933119224","18291871163703490766","11051949972868419768","12235320638258662676"],["6291015089507520954","5768390704151978894","673404973000244197","8695111872345712169"],["6526937832375683272","5385536235770627610","2483490627634609794","3746685593553614928"],["6851519214070263939","5847218044050503724","9417296169374004760","7315283529994992156"],["16305715833199812306","17399010209134845402","5416053998314423587","6415956894782625714"],["6237321433497278101","8522764121242546971","11812993968182539314","16009200451076769543"],["10078891909154470689","11753858870390112902","15359514099242957661","9739968149335408962"],["17571952547840012100","383478144969659795","17496578286203718533","11202117381390220008"],["18271114712950977136","12259246614232328056","15571917377869762166","3439539062824918578"],["8003000160714987845","7356212248844096585","11186816353747371074","12666286637023768736"],["15458586220107934394","11658765797659284685","1930320071941948554","6219633767478988774"],["10596155828486071371","3729556560367408141","18128534251267753850","11965413372843539307"],["10374131649195817714","5597882747463979813","7610201332173851585","16597672533851439732"],["16419245403407026129","12547025263904961473","12227958187362017303","6799110523976456822"],["17283450269830437964","5433137202770492937","8098956973528028421","11279791880331658001"],["17797376583842078371","2303999468800510039","5451883007483387404","11093275901109592527"],["14499157304310544385","14773967033381085580","1489182782870612069","11197350336157789878"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["2126748153218816261","240445610698027890","12000583707686237764","13203393357971718173"],["8541968147220339863","16084360437198755081","1323813197686558898","17143736152630403356"],["3171476338067934164","10358305505134256238","9883105402718637517","18233818913157463147"],["16356664847509629025","4367501444875509210","9545687875241276625","6745075956281455479"],["1455976004598257093","10550501501668854344","4624457765718271917","7899753429668940195"],["2341727702712090645","17460997193728938089","1183300534731493593","12794205548074235819"],["18170513398744717590","1520144289795682315","17640644036650271662","6415807365749522090"],["3068198796168577311","11274813123966367146","16133858258356884139","13106834967522137380"],["2426577187004761054","10441378529584442293","5651155112462919380","8148610743542577471"],["12889280012528697340","3069950471741016070","5615681593665448386","4003864048465526487"],["12076002163128211849","7905684872587687467","12548135668538799816","11841030084273924723"],["15608187641067273797","9187120450527894599","5872021126995065020","10836497940266620259"],["13193083385515323903","10280514626096798017","1711202777439668494","3616173747570025634"],["18133527418378060700","14450128785445657364","12648558633848287727","8549673551730897811"],["85047062625405184","6573432955084253105","6643772819134707840","16513705582849475006"],["11721576686919708225","17587994704864879182","14513208349584111081","15939167172266099612"],["12265189298843974073","12404092549491088705","681387365373197157","3875747828882464090"],["3937131025915791145","10363022442545307678","10844394000528363125","7923317672431018993"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["4461500932239555108","4098817728907250414","13821552201078722368","13659676474096056110"],["7438783130583385173","3629314704114864990","6532381158510403810","6291263194927099034"],["70372146469395984","14127523837330644921","2019741425639375980","10202677442763515815"],["18301325247182325297","4741207506948439474","3592825493464735972","10836177013577209457"],["6245454950166114485","1685021639366931402","17201396623613158046","7527341141838291322"],["1734151522553869412","6515178427267772359","9592689360400243647","813862638130786482"],["9175197953485497563","7857327469600954837","5519541511534061721","992521786316529337"],["18147117113496924224","3820052651100405257","2158907559307816634","5153078167015364181"],["172852190911183981","8229168653212014276","5313576710772553282","3296839142144363041"],["9250982385163002931","9684023696029901349","17831922317218047446","16024879991451263698"],["3412533420831482949","15007771642213947770","12388431665226840257","17580024243671536112"],["4745038044156757603","13059050373753595267","6420586131453437369","2629002815348274718"],["1294771717607709749","4076289611651959393","4037546171581288149","2106767516080019810"],["12455634633464483127","11738609060997859455","12469942358439558620","8536499026558694857"],["13711307280392633444","7574858397205532819","18081314936417804483","15183722259792286289"],["4561360026520687185","16182910120484315329","15518843147864510181","1954429119014999492"],["6026257206644090568","18024651779994853382","18259913655396672675","15069477095615335107"],["2752831541807471130","10271461139446708782","11549212032889633383","16293838310142574572"],["11714705052269852893","1225784866581541753","4348849259866568775","6305261573995915637"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["15580439006128360715","3523746290089755408","6941115580524168223","14407616778860060355"],["7259644923529436057","15459938941383177096","15368456669469274194","4968405053233424317"],["7696377688355827522","14410842805145765353","11996657106264294588","13390227034458933659"],["150593967737519382","11712324839065820738","7080030260102679818","9859009146792085349"],["17094672630545187808","5309189374502419772","13301274784640474409","7555756958024468531"],["16591182815799879860","5186314374718494618","17464186778889662491","12207186422454769799"],["10092361976822488421","15368800296181483665","17844110799465008881","12317321093213912366"],["5233188347367501772","882065462580578301","18058693875496461996","277151381024050827"],["6181420544544535141","6997091861900528163","17036778492201442330","8280426348682444568"],["9551697398312787867","9951419836176816117","15231331799263023214","11403201910090655452"],["6401854268228314110","11468584919079026073","12210658691684610804","8580450261599688394"],["7988833329100551232","18102299894385300727","5732578173470767552","3618271130350265943"],["822703781177349454","10391835959893357356","4177788340587218039","957995249915978141"],["14593662201724666997","589346209779373170","13103536831164421404","11046965046627870811"],["3492997165746146074","8422327077121483314","6524841853493752026","5236674039410005038"],["5749377027471733723","10179655572865273192","2051510970817133741","12256592160562952284"],["8075398087471495259","14165889690370834575","17730212491164481870","12096694460701205472"],["6443713032599401889","9767951857498316427","14930540836640888797","11133518785494715819"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["16885555666584364737","1030051350490836596","3440963702010609325","4270000967816204681"],["15515656397697851917","15175505188822420473","16510892945285193109","7587205707402700736"],["16411090077072149811","15507773089288431697","2816298004956497176","6894701765350650082"],["5805441491484006238","15462601625141083588","9500925358552868086","14569433924711027941"],["5288306980801011888","13770251545877900713","9372879878782204399","5085322326722080305"],["18219946390409794168","1686326416867492328","16386256632532683280","16703237290116497844"],["8282056979632648016","11237670930710417204","14175626729072968778","6065909823568332538"],["9549026830942165831","17040235429809047103","6047452261187193214","8730887626518393395"],["5603758522120256387","9146083201670127446","12542992351179952794","7727804159204570803"],["10177161794003959859","5700683358294167307","8180542705828541967","2449190596945430137"],["4148865704595560675","10436579189999717080","2846243947894623835","15425110117723297727"],["10544294891095105370","5684365901236828998","10071688161617309252","4657424211478914571"],["11180159309823882897","7362235586335583942","15208401914785105305","11121376865723089045"],["7896328127339248121","9731212572323833566","17012528895293406749","7622038133265798535"],["12269424051011123017","16246734922859156205","1589966944768993914","8712950652996701326"],["13879465189851453099","3701033310050211188","2084910071906582952","16104144299167292853"],["12166121663584996280","7514619790188551387","18066461882513256369","501818958624602315"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["3965303261380056282","8655116696032978693","7852950816935193154","7190072998394435415"],["3556814200823203263","2654448607052862149","6254891014264577818","16711594972821516032"],["18410076999613041913","7583128752910684190","14281426109038777929","13434772409237090413"],["4841317803418443815","13008183824293919629","189158855957115406","12484035097281681146"],["643939977708121199","1692046488030277584","4047510423986168037","1248138859667047767"],["14141273491505480214","13195659724185295244","6512815388606722403","2062336617697313832"],["18254054445495174916","997258427712216750","187121992025007821","2445620218221615664"],["8442586268832377118","6370705225591209591","17280721373653620448","15373834767385724221"],["17027266974835605387","1123579815658201545","14797027539104474289","16684798152763348974"],["13222679829785102641","13357194836428194192","13068055771873741832","2058271611727547447"],["8443192000176102582","11932004508282561366","17951996644395592862","16913630283222998349"],["2819641840728250904","16307046674651893593","8065177629508831408","9985669213539075566"],["5575726811684992347","17243373726910215540","5241507077318446821","946504318360917779"],["17918564839446321655","3948148530352130926","2347716432047025032","16759068928141638964"],["17312263979550164638","15914553041650965316","6242404972216083334","9992310918668436975"],["39518000357467613","15711118908383141168","11508701244703371418","14493779209338101655"],["8340897312956175920","1126758042341354431","3412236770268361089","810622246688742658"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["14452307090249442572","9047840592020191217","13050929153858519712","7950486633580745617"],["6860609762027558433","1038635918064614191","13581458992528996182","15048222351815461825"],["4947378763410911572","3922936143357275705","240793449228403999","12945667677706763996"],["10654428691575331695","6618155442278943551","4934160730573458773","3062120266731125316"],["4966662278257021900","17923888766701468285","114585645992325848","12095879541238797178"],["5681117201649515748","2251942964278799952","1508216212757921156","4077723267648860445"],["15954574759727927924","3014573953497358625","6554398652584690508","8990853977266471349"],["3994533130658299684","16500241513703071231","10852835746714215352","3057280767766124922"],["10344052456552957765","13932712278372826313","1018064066670231622","15176535400192203314"],["10054406123649682210","13785780939183787274","4892662779882729217","1246533588816225201"],["3287924880512539922","4595624755898319535","13180096034610113862","13682792441208541570"],["8145389866304388100","6349559963171049321","4260782688820212416","7270183582055663874"],["4664186280241484177","2010486395603584758","5931030460843578196","14049365850687906033"],["7204735395364881650","14261206228943751445","12585851089930687733","12317648831624778826"],["16928008908135212570","7923611183683060111","8024363894254340507","337101663044482780"],["2376984583531847988","16802107917390108853","5974679432425530710","10077947227199491994"],["8340897312956175920","1126758042341354431","3412236770268361089","810622246688742658"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["12330541973889532461","17569574995643406352","6911637303269376904","14361379078591575529"],["4024919730752255393","15945527569956174412","6901231776697328617","10571370815416137107"],["8762781885643110692","10875588018716760916","9863595219087707524","8855318221393424463"],["10166449947459938796","9320317461652839017","6052394415177119832","9141183189474737480"],["8770201858665361532","7632346328022504689","1788536895978504364","5045968571766884725"],["7164834226273662208","15459442487932792004","14689572478505894582","16678536382466550592"],["10071318016408286406","5106419987509597365","2613684341429341654","4665150560518064493"],["2525980664875204346","14230694041990732175","564475933020997390","11529842164565981889"],["7147985297297669924","7580365409365875912","2147622155904408407","18353167646640928514"],["7145518674832953935","10744483993008683537","11933911988813114123","652413805828635101"],["527477137965552846","15430842631438947354","9686150383541896260","18316134237716616750"],["2006216027153497241","2049318806684786123","11604600923008310466","2132068161641007288"],["9920418461199422553","15876715260313933957","12964953778867484743","16073659892630761951"],["3039174059168177073","15696638914349117924","17910467680043251920","4630188965929361640"],["12535657067623879532","16625479717588950537","11238587412092092","11778473967976279347"],["5749377027471733723","10179655572865273192","2051510970817133741","12256592160562952284"],["8075398087471495259","14165889690370834575","17730212491164481870","12096694460701205472"],["6443713032599401889","9767951857498316427","14930540836640888797","11133518785494715819"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["17015356206206665989","5900015320146693294","5651586352730270031","354172537919563229"],["5054090611906430454","5340812226944430205","10108706184637021634","11563111682092137458"],["1976492846338129805","9009079121345548958","8548798195822453272","526645520209980614"],["76372577475544271","13132773289312063337","5200624880185890606","721474541058409301"],["14337456908117942023","4631255827748413578","13360817705358808638","6485554945312160241"],["3429277780182876143","4805370133576540146","668555132237891402","10900991563708217109"],["14714354928599977165","5183240234587490181","13030706117159657721","18402368198841337219"],["8197008729613202555","10143316482721397269","9118358119082959772","703884774366236970"],["13652060490818582452","6214263900359220719","9552596006172140990","9459768312772294210"],["11359081902381361393","17959823795560783322","7739404114159063166","9850944503335440570"],["12457576421344186173","2991223488192392748","7395292288669799001","15415541881896223795"],["15642895703501495217","4484808427938465091","8032881215578310113","13636072897177249835"],["15446407680153388191","4598938568350142898","3593895882433692944","9821477047609591375"],["10678400192287921655","7768633940232499794","3260943627077521159","13162752110862358583"],["2523586086283141659","10391350835839403463","9189858423933129307","17266635907141557590"],["2670473228776590335","10713876398303997609","18324092727202731716","8155929359687928480"],["7097488789943943084","2109846742709810840","12842794468550268837","18421688336012727471"],["475009244574342618","15894481152125667920","4502162819845236442","3649534016505843513"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["17035571281692003645","5476365682217751708","10360594408657777811","10605897424315439291"],["13560036191525783181","15798850792364707652","17935159497553032111","2000166003551255034"],["10838323380577997737","13752194911562450621","9764125007500856963","15661357835151003661"],["14118114459569071691","14442162771024456224","15676741196234709371","12704170729152966940"],["13787361828017691208","14869749887986612490","8481242226649321399","18040263078982119683"],["2987909332868773379","11073684650122563148","5555213710815036092","7021000870189813771"],["8466286217354871226","10870890998704049842","4660222756031622285","5582033940877270323"],["16376685123839755748","4295111273365948151","8776430290221379518","12154620566757938486"],["10262876963118270400","11122572879017470008","16637504761627178245","17080372138243762912"],["7233145510753087329","12794596497048725739","10144244680368887901","17068843827032047208"],["11547870503932506121","9862842919585619511","1974332908294582884","16728854535746625932"],["5449493847162771794","7551656310971325058","7263064618309686865","3909748626365205668"],["10251187767054592156","4448622316387566061","13143382944930419360","15091855890775855464"],["10844411529761482904","1932572979975813260","13247086099951288838","6301470027364102568"],["13271511310285472054","11666264319396922917","5278678442822828599","13542597160892625811"],["17571341611404449381","865660158164079819","15533680951860945425","15035389235653374868"],["17788779284907331946","15537435062900797646","4338944474506995964","13863350675410312198"],["3937131025915791145","10363022442545307678","10844394000528363125","7923317672431018993"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["6202219523856594865","13926142019509093202","17559828930904431133","6238122459968821275"],["139618670090267571","13739724502464295242","12119907967265985397","1834874903654790325"],["7078214198207970982","6479161529536614037","1919875685564953887","12354524623115405559"],["5405703208508542763","13985565408801219616","2970612762871678146","2117529320757873432"],["1287777186869243531","374976615939085194","16126094617390654238","5585139411173361867"],["14524576771130960555","10593453328216518250","13451868036267925407","5318571053127419352"],["9672744395343073721","12991128294300306249","16906350519080978024","2630888605479822958"],["16979259235490748845","2544005571015787323","14085773225023638633","15069856696594676969"],["17927799473957305794","6893693053886098552","14704109110023846655","12609728613589231950"],["16499069642437658812","42144986942448399","5463111613885347706","765656903467919368"],["10155481195992954451","15872936733478466070","14848945193906893371","15087173159477019597"],["1546034468331468459","919427945979320019","12972413048765079605","3570311330887054486"],["2223187257177798137","645568644214175098","12085808946958699715","4822372027782344864"],["18209690772710251","9552275849849407531","17594774542296309736","5327115647580495047"],["10850818552231847133","13628166354310662320","17702076292367928827","16433522848197030169"],["16958089759110902766","18230926640652173586","15702118256047758721","8136822465480295591"],["12166121663584996280","7514619790188551387","18066461882513256369","501818958624602315"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["2200223285678819278","14585480079779614564","959331439001941269","13482621216055873866"],["4877716643479377804","17959645345809732523","12488321691575791498","7305365471228065685"],["1339014860927701711","13332954585481013121","11304322446238326758","7231476318706744990"],["1675849330241044384","10519113412814978372","4692507424623650443","5142581678909817990"],["5649296889306511589","17236392395401094824","9667354915733340785","9807449135304609157"],["1932241626340727237","16516661282177154786","13209611415013853731","11620808967700996476"],["14748669370957900335","8173588934194649048","6223289100937643859","7026154375449583270"],["2668434813398883165","3874145339915946148","12431868938456550614","15822397641305357755"],["17491419750918255418","2352318629805045871","12014542037295719626","16805397502667362333"],["14530873585936559047","56145801449574333","2302960224752110185","13924053230157042233"],["9347588853068708385","5131588678608028332","17821863697058052924","18316917520854532122"],["13692810710902740666","10275175538620115577","13895828991064827500","17914342191579172327"],["1470489170882668228","9385481960567223907","5211200076588824325","14578843848755088671"],["5263482363959234670","14634772518012923451","12870627622693433526","16874081241319076256"],["8274899353528217879","14328786105114114417","16889314323936217236","16886890558114648047"],["4130236002806063654","11153033105026526834","5727845669929381612","16386791967444891112"],["7099374182902924956","3325592865964943985","13404426535701646913","841561236030999688"],["6443713032599401889","9767951857498316427","14930540836640888797","11133518785494715819"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["16810511153436645335","10847012568035833018","14618102184936452839","7986187972210344346"],["3190048987538011178","12706493765513648065","15594841173096810588","8571973228641615231"],["15523799197785937266","4477359750640850515","16747800457490165594","5495522322483029289"],["8443173144418377388","16991588132727176673","464823329310861388","14183382938432901606"],["2905472204408129881","1573369455309674933","837699320953758650","7540049060372506646"],["1816487469462446353","12785137964520253506","7050759089610013319","9291963463526567578"],["1271525864084338997","13064923644119953743","17297480377946791876","3118148595049844312"],["13957181724690830708","15029461023169648518","4598107237021449918","4594805733516407129"],["1528998102448314937","5429050925958056202","6394353964030535167","17785773418471938393"],["15691851947891147422","9988049177705374533","10556871483940890514","2694241191620041259"],["8417938748816714760","2766728138281726844","763989506538424935","10071294784515654029"],["3092731485276765588","10983600683315030506","2716713613590312982","18248043876127943478"],["3501152290751856479","2626499665521092503","4507492467506452068","17170071754185539674"],["1879990575207808261","16645899746188415124","8857952163424393044","16188336327141272862"],["13711307280392633444","7574858397205532819","18081314936417804483","15183722259792286289"],["4561360026520687185","16182910120484315329","15518843147864510181","1954429119014999492"],["6026257206644090568","18024651779994853382","18259913655396672675","15069477095615335107"],["2752831541807471130","10271461139446708782","11549212032889633383","16293838310142574572"],["11714705052269852893","1225784866581541753","4348849259866568775","6305261573995915637"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["9899580681626891310","7303522538724605740","5861294923298466872","10031652697612596188"],["4721141478342455647","673589197701817118","1329805479340991940","17545306147459928958"],["5218719303074794226","15912839691597952918","3651668021745589018","10685691302147005436"],["3460729630978558264","13616729090842529807","1546620560466430687","13652804997280988924"],["1773749291467624534","10908723502425711452","17427943947708678604","2511919312912119595"],["9969487679061789311","17663136186353970219","3168306734602157151","6579293323814305176"],["10708944825713563840","10602475861806588457","4105533916842410651","13464072004995065814"],["5327233354562677643","2418858838996926285","4131968813176292437","15548199822554648536"],["15873035919104492090","7575721542676178048","2856143153282296137","3061972567882854952"],["7285244649641626355","2947400032782342264","1947963634336904838","10554704717445828078"],["14512305831463908275","10572829979411733098","1748264174805064193","721786520135473354"],["2176082445652392623","11314427811205371061","4046546032819590768","1377552966499339364"],["4427844662963892686","6375914462846460238","16182855614660286344","12947386955172781877"],["308317002742134139","9850691272534136352","10063416276757508559","7674844003996726516"],["3959086737317053699","15273716160376648799","12319099701456865434","5235022188392105264"],["9143454369520905587","3049149153353045865","12665662456544557052","10383679433702139462"],["6297284507298685842","10994199530054086978","8267997066797890630","8512416545013867187"],["13883583706498417277","9583816329066445233","1758089794378020680","14250032705571478496"],["11714705052269852893","1225784866581541753","4348849259866568775","6305261573995915637"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["2174305623347937510","8087675929406918793","7832622902403949628","10382139576410428008"],["3677442330970327354","16712064282851217781","7306828036790430857","4146196207725676118"],["12182576514218046045","2399913046324840717","11229298990991669237","14724539600660795358"],["9524894222652474430","8104213841815786112","4944884815384574038","2620109791945541324"],["1115315512544031392","12307572128492676325","9729289909397112655","1359398031825179436"],["13649766909982952717","3119365807544837841","14571883673700766911","17106223442338056601"],["16010054557371935646","1223008624301509255","14381333490308323347","3019641446677316613"],["9628046465150276386","5389329194172110820","17159345248497690849","5952590200584656352"],["2746985334396276827","16876186946105980725","13226142205911820493","5254781116406486523"],["12365941782055411477","1154760589700040155","11760591079110767409","13700123268995960786"],["6130722358544435831","17239008779017589523","13023323534930752870","18121545038844649196"],["12104415202892070801","6578973174905851241","5100173524814453645","10720515540037179375"],["1470489170882668228","9385481960567223907","5211200076588824325","14578843848755088671"],["5263482363959234670","14634772518012923451","12870627622693433526","16874081241319076256"],["8274899353528217879","14328786105114114417","16889314323936217236","16886890558114648047"],["4130236002806063654","11153033105026526834","5727845669929381612","16386791967444891112"],["7099374182902924956","3325592865964943985","13404426535701646913","841561236030999688"],["6443713032599401889","9767951857498316427","14930540836640888797","11133518785494715819"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["18043068613251971448","7701599221353337674","3480388659007217921","798796219826530935"],["5882890735239100542","12578475545057135856","7519369392168536045","5999411625527349313"],["16242872723727587094","16974991251014166941","2841835772843721666","12503060967549431318"],["5916610629801555033","11537107122759572531","14077618562395572961","17434570174683618725"],["17434236767480955263","13326302404040991028","13032478261141956533","6830826813780630853"],["4471091120661089550","5766970991075377230","8348860055544589226","2643965467921097793"],["5595833655883733849","14458442501781157156","2107592872569019124","2024999788236883746"],["12390637264296342775","9772240682144936311","7429995343387680801","11175533810062083199"],["12397753664041708203","5115689490138866426","14941989872294121324","18249786128771146157"],["913272943464809881","11370365781260026063","1679165775568949618","16209079886021955851"],["6418836250768541146","10503765239117498332","14595004391549361135","3159981399244717477"],["8684304657453594210","6481408812228797884","15719805101262762418","9880628486081893903"],["16148689888985655952","16233552486447081995","3022473490633202444","1053111251704690743"],["10387760378070093771","4237542877260344162","1462737388141023361","2335583515926153636"],["1326901214742935668","9856802499373229525","14426914794435142539","7325627954041355933"],["2308889792804448372","12543363474312902463","14167860077254490940","10630056519800132147"],["6297284507298685842","10994199530054086978","8267997066797890630","8512416545013867187"],["13883583706498417277","9583816329066445233","1758089794378020680","14250032705571478496"],["11714705052269852893","1225784866581541753","4348849259866568775","6305261573995915637"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["5501629170521157224","5594173715804214032","13235582828310571389","5515667251589039720"],["12079676844434968933","8785371952364143510","10022475731148638455","15965884057784950499"],["5620655162576057174","3332937373811134603","9961856052423746639","1794236629708828593"],["5658542093789171634","9500133668277422318","12951739663004393878","4351096849100980541"],["6037998642333869320","11728405323138448476","3396265138286277679","11299192940230878494"],["8475780678309948433","15607961162913814319","17902058062216414131","10500052591271636052"],["17973803251201484064","14919721386756936465","4537740561291266473","4279988515814066773"],["11909418381106426514","17577424516439165230","5269076742839247527","651344452807351357"],["10398512502836495698","3350160205386552735","12390100693272529377","6475328798625068571"],["11270423605568357090","17240522051925210763","3378866578666812117","4749060796883255185"],["10163548101093828616","5590845817359859547","1778156789580568393","5665818167493427122"],["17481263419555282022","4765796227334767672","3793450218520065967","12479511006151006633"],["9617387486903145936","15125953011617279852","8770817057049313176","4528201884315807845"],["10733840425180514912","11664318754048965597","15821289127432774268","5644981266762570774"],["18288905916215528959","11408989196596985654","13130714714118050471","13343463623015804390"],["17571341611404449381","865660158164079819","15533680951860945425","15035389235653374868"],["17788779284907331946","15537435062900797646","4338944474506995964","13863350675410312198"],["3937131025915791145","10363022442545307678","10844394000528363125","7923317672431018993"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["9279108509538231981","6098728085087107027","4125450161214592028","4793052931973851768"],["1170045010269219831","15022273732947310974","2217034266538196043","6817434401283043570"],["945649170407781885","2493409278309687514","17815102637414189854","1502851507603248651"],["6394092483653552990","1086530019606282554","10401209519728324559","6842188128154262628"],["7318440464843262513","3918849462772338416","9509289559880045212","240023266353788844"],["16584669857298638020","17774693658639565884","16558958790851594243","9217667175797807045"],["13185228763927861234","782359347202423543","12062215375093342878","6011193056540569086"],["7774151713696275641","3460890196304797261","10277891937540539349","1893443191064726704"],["15831167710360746407","11839350576104688892","8068459678182972397","5624341397613598908"],["13187585699595273478","8322999716641655671","962015840955065698","1635685765027049884"],["10155481195992954451","15872936733478466070","14848945193906893371","15087173159477019597"],["1546034468331468459","919427945979320019","12972413048765079605","3570311330887054486"],["2223187257177798137","645568644214175098","12085808946958699715","4822372027782344864"],["18209690772710251","9552275849849407531","17594774542296309736","5327115647580495047"],["10850818552231847133","13628166354310662320","17702076292367928827","16433522848197030169"],["16958089759110902766","18230926640652173586","15702118256047758721","8136822465480295591"],["12166121663584996280","7514619790188551387","18066461882513256369","501818958624602315"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["14618889233774594731","15093905059073412679","3249004290985797593","6796340331130823373"],["8597834004819108702","2740825039255527976","1723770321816917000","17361691604470570532"],["10766198439787856182","1305537869742285433","12965463753175036686","3341921525345323629"],["8364588911486626846","11589376488878436983","17083075463963473030","17000782280927223644"],["13043658211952850384","11862816671037680984","10264162265036786061","4119403812486577436"],["442142937165093599","18010411171387627293","8779835007860613837","11855191019038682789"],["16298164416006254146","4323296978725512433","13301026799492020895","13506903236100032725"],["5848573568732584843","15528536671842719170","4994644795771994768","14644758307080395447"],["13007646401846577624","12198458973464263634","3668217757999869723","6366571270416050594"],["10043716048671924596","9217810656376470496","10490280078771523782","5981065858828200725"],["2335443414734979026","9275240947105795","7151831380169065153","11156589736031091013"],["13527044671527431017","17403374252177574752","5754922034504445636","14989640827970198296"],["9630796226534705809","1857717826443270969","15093092285144565642","10644662218871740981"],["15988506296874943635","11080250926330461572","5750478007248376293","7404553645276744926"],["2221057181911158969","4786346350313613177","8780844212460287554","8940064676859149030"],["13043420011382489086","16812929745209669480","5649625027750825042","8812201389338526422"],["7099374182902924956","3325592865964943985","13404426535701646913","841561236030999688"],["6443713032599401889","9767951857498316427","14930540836640888797","11133518785494715819"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["17355654998024798435","13801446122244248462","13971895228709738662","5646455129275202150"],["3370339016109814093","141166530795655723","13709662208643785937","6869494214163266599"],["12364802352004328945","15298666552701428543","2255103203226204006","5565277258316708651"],["16590441021942744651","12252260117968967178","2855396646223520077","10746053315173201443"],["6079410307911509399","743038558626371778","12851106478957104280","7368774936520156575"],["12125506142070600615","12200199371445077745","838160003285705215","4458424237492836265"],["17347957762239101610","4975359662823991439","7797368065358233105","2451978954555876510"],["14244772534295550826","2750620643387055733","17128445719687734362","18051767239034906178"],["16664488663465050004","3886747561416965077","15350356155473787825","6971373157056412390"],["2630205879541438094","10300285209560451795","6553678855374489473","1732910582701714049"],["6085529468044340546","18429518750567353130","12639705431876849817","11362886757716397117"],["7059096181644191451","9114563841996016969","8530183026509604513","2836242139732948027"],["11164529797521623844","18035971312592268501","15962856899971599233","3104699551651191612"],["4812031793408408874","10764425564497366907","9567287076383396118","17985881350725558440"],["13327466292268737504","8698962389169083991","16827679931934078635","5087494096014734855"],["17711023900039070213","14796027058478804921","4391588367116677459","8240684651627505378"],["12265189298843974073","12404092549491088705","681387365373197157","3875747828882464090"],["3937131025915791145","10363022442545307678","10844394000528363125","7923317672431018993"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]],[["17532883334354227185","4048599582609398624","12100005747154511382","3820945383401193639"],["15678844135042435632","8495664500169438354","3972433393181675822","1262728527315149635"],["4449569366323077680","12681691942669616294","5598140712523404331","13407229640605117203"],["6722085091364082128","7203648295175916523","14624444128950071221","5039636137174629212"],["8030955205119517072","9123819580870603392","3857935374854356814","12944041125583133020"],["10858451551582014981","4626099360062657911","17235681923510889217","11177743911249452480"],["7190349695435896774","4394139997084775813","7885997013856232762","12672072286299700666"],["14195646883228600623","9922313824746571590","764681640102345890","10554328955794059269"],["13562780864394257350","9521901564508243667","4421006367976347604","1241693819847852821"],["17230068791571161485","437588819658605107","18281596464898715762","8836172142171348972"],["16442583423017591124","13106570792877811044","11386002999563721551","10526505563855449157"],["15592465970003122099","14018129218385070095","14433606919554452282","14564565653710831275"],["4660863341596042710","11564975368006904568","2389507972852194828","13230175015233773315"],["11688735747699700578","11735457693516837850","15041451846972567057","12043250730004423645"],["17312263979550164638","15914553041650965316","6242404972216083334","9992310918668436975"],["39518000357467613","15711118908383141168","11508701244703371418","14493779209338101655"],["8340897312956175920","1126758042341354431","3412236770268361089","810622246688742658"],["17441397094125926945","3754835336205717743","17932352015484169442","7376291061464841695"],["16659502063685619901","10472801023611229975","5899616035055166580","8329910901832979554"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["9039506225398964390","10935853323338259452","7129281398243435931","11625993714373966414"],["16518396751512476349","10077798030724282805","2291444627746834108","15654832419572018511"],["17499323270760974811","9473265141287386483","1050566822291155926","10257162492773452126"],["1286901348086678476","2216506991176445788","5673991416388665066","11119518957985551132"],["11970940154245829816","11871173921110908316","12426589827245880783","8402195262570691255"],["8463581916946849372","212587996120702561","8692634632657343474","18376422930886285629"],["17046565231188831343","14154596359148293979","5872900954714950355","1290227435601488349"],["11539277139025908477","10670943959875837083","2146048785795062442","6951536164774200318"],["7876420459127935678","17579612079520197380","6029390839736031589","16738878673404019920"],["14005621181252350188","10420041977186284998","17124843088571415992","17705676298372793652"],["5878705572964435772","1304121333365386227","15451323882546186244","17053107238589452560"],["17615196367500272223","4176105056612395712","1606810916977145420","2059940504896314882"],["11295315815809202281","15461730729744562398","11788970915662555123","9313584548352320683"],["16537119391700549892","1554077057560423347","804863457996797677","4426888038417453783"],["4664478227634390651","11864468483971373151","16523054761589784431","11257565924641928813"],["5713796116439696269","5999615870001604498","2159520368766742682","8149521765295977945"],["2717872171550586895","13660486777814830319","13101514235646478229","11135301798988593187"],["13883583706498417277","9583816329066445233","1758089794378020680","14250032705571478496"],["11714705052269852893","1225784866581541753","4348849259866568775","6305261573995915637"],["14132694022626528726","571567863563224021","7381483499102374965","14597595364056771399"]],[["14811414974524093282","1070901378266847515","2112224922409706582","8678966529326395963"],["18242064893098850832","10423692621416261551","858073415469820971","3663547889177933623"],["6813242419400194076","8546631551549056808","7558985127930809726","4803692071220917340"],["11046533437106940622","1139016154144109465","4283560466229360424","2044469886676968863"],["3994956966019167819","5534895402974433901","11856894852250911134","13417829336967470090"],["16626190717936581872","4080851127819770256","1248409060554480249","8600342250791546482"],["13403500805552898482","9827401346912549257","11637913338138222230","10281947870661997636"],["16865065289560324163","9327082197381388088","9231492554317857605","12688209356834220428"],["15419669683135671322","7510587031517357768","3839449290872626756","204464527209179998"],["4821590609546657073","11639752344055115059","1460611210259295205","5035674522185067682"],["6560648826552238032","2876566344649100491","73376917903562931","5292868802625460519"],["13937091323506206548","3347380065388738980","10233129910844884521","14364762072427171297"],["13661000198044419420","5167661822001771578","15089050911533870757","5174074511783393453"],["9085569428685605677","12953238043716284871","13541847834142106327","17259509915091532688"],["15727939709576727763","8167243108230487322","6165012261099007527","17175341706020622630"],["15255682346431893444","12937931425841739372","6963932015485442080","4627216351598200875"],["16767640943912163266","3057133834632271768","4008907268961934928","2539112982719839860"],["475009244574342618","15894481152125667920","4502162819845236442","3649534016505843513"],["3950590242876701585","884570276128579140","3976639561155207543","15387328375638401434"],["13403242187226406876","18220363871824271698","15691314532364831707","980687525450298410"]]],"s0_siblingsC":[[["16675142999956260623","8357939527412537243","10908241815045619490","1540157087646466558"],["1191365792598335473","11145381101275042803","15955800413350678640","5858508219997933447"],["3008780366501967168","13959360683452233263","17996475925708266380","13754978467109655940"],["17523407649003357270","7459234848840846325","4936269830444068353","4147621273144227286"],["9658954324755756386","9117818524898381044","11292695918198465620","11992458394710500480"],["4654073550503221852","10693687357260450987","7001560001194596523","2029973209704365924"],["15896126448939173941","7948629392733869546","5385753348305606922","4441478629719401093"],["5673672884349533586","6970328930925989366","4804422686699641480","15375436096314256402"],["12713069008026188217","11764883240746961976","12856916196654282989","10624922934727647001"],["14513346378736410154","10317546868957498905","16087351330276364069","13763963049214937026"],["8670431536836334809","11435602428591540994","14678107362552088417","13703467304639022499"],["12366546589537191820","17497925519583639471","16001098641548483459","452517711971327872"],["1046053786503736309","15854067877155613053","8615554538098888063","13752358458500560728"],["3137274713457012187","17661266442519519618","16607200224281330349","12338231383180419112"],["17740529841465646276","15784861764509695198","1041819893859184343","1643675341094512976"],["17924116705995692306","13937694832258603484","11001603289363490194","10240339462418253035"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["6623549251378254754","9396707704314674527","14408635855018285830","4635177284334618935"],["11043998086969394587","11956298200678100289","6670971559346460441","7194254023868901183"],["8603026404737771997","10156062843171266653","3108768383797863737","10565496230581683594"],["14814707386951550673","16441663590742622241","9301093212315067760","6059864313764422792"],["9480942315811386335","7440989746280733463","3559436248434603299","15706014518792413800"],["13987127411603975208","10272734386233411480","8389405120618669011","7437809688108493393"],["1142223063868824886","12688847901230302937","12359224683989232641","12374968139232075918"],["8662439265963655022","9123923413689493403","14510295831365108703","7815124491168094589"],["11678202235765941702","13357211244323825308","17324661032925704960","6501403447711656636"],["7992640751626686369","14675725027005811208","1098793027701817138","9379330592234578613"],["6238691986484478741","4620713026804357039","955781753171506083","14472031028798666637"],["16575519544353546880","6201252717165625004","10521133336173833616","11108766863086521624"],["11560884629323671849","2398477495303813127","3034327638173390233","6582503502300265846"],["6490062029361073661","11759700933930108436","7609617228210988490","6599172255588158234"],["12738407627128784525","14415966097692821700","383092442929893039","9656137787659711906"],["1752821537224067282","12863968065974140385","14431030335751594862","12001583380482328221"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["16213344723524184706","15613677938600855962","5249520878952202914","13410418997737122766"],["598029590859390208","13750973777184344594","17048078591160189499","11063843092494631497"],["13231307366377845081","10622468421095698442","15636423390051940054","17345876836871297702"],["6548141257084799982","5517687338696605253","12888815256082864424","5343203604859769338"],["1644714924892400265","1469036435944167489","12382200646213256447","13922136622936589606"],["4653251587985390112","13469914617308602462","12004970852817938153","17170801298883955090"],["1674103641592876164","5711142950354112946","14614831172705650979","9724338283185597466"],["1505340104932131899","15243391727975888774","18122587762027864645","13397880005483642168"],["13968988664323059936","683242212488323002","11947158117185537104","602606777178777640"],["3600658946886956775","1764913790016205771","12808192577209881651","13347708964498381495"],["13352292003743201520","767270174835430176","12138948569765903358","1841683458177211120"],["13643301334311672705","10879080892557443224","6135707630813938194","16538542063379536552"],["17021811096436364219","7142426702862646398","3795227465348263807","9273615205004319903"],["13755304146176472488","89931480688683789","200086631345257128","5611834660860019909"],["12994326954437957444","14579616132268523006","15774994085622191259","15650417143948626035"],["1455852678660655299","13994024557906383740","7609078167324927474","12007540167498037278"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["7016814527206177593","210343358111188475","1071984865269637942","3456065399236782803"],["15973625123083420622","12987777548572138658","3820125131197807629","18099589453812248066"],["16764714526516846127","12988394973278754696","2071756940199096472","10795152332914947142"],["9751825020647072994","15659461645332781819","9926629499015961564","3175244803533995655"],["2364059977175315751","14892791159406600857","14422322585111153848","16200909479976905451"],["17241247107895322790","8619347355976127996","4139034062169119646","2823748471798564418"],["9940968561440446437","4239989018567273294","10841601887513870049","16868274073725514384"],["229294711419600753","4266695251471756024","7766302847591625472","2994545866497496319"],["12256045599547180215","17494115261547081700","9811978637787581936","2715469931108673156"],["13480803105704297307","12389973700300069574","11647653734719452226","6304169278375081996"],["8758724149674620072","12318990816289739237","3549072991858847091","3380795004811213626"],["11397814245252619589","6199052409074036707","17958666257075072888","4220984083160364452"],["2524345590036180643","7210525362740895650","1917430157802944392","3420718587012449339"],["8926440727413754812","14819650308918481253","5811631523221757428","4907804367015246466"],["16410319377928217665","5613839697873235113","2487526580781448370","1225935547748344874"],["3811231592098720608","8448373105265692416","490653320868421865","12125837652211539100"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["6465715271592276695","1799386418293254741","3040983738168028442","1675907860055416434"],["15579374917509750689","16638549766062912331","14059109237231129852","1731694602710376050"],["4933174766669672873","16724687206229777441","5989262765565603390","10778061256893537079"],["4528695386570346017","149013630275771630","13584562192920974037","10959398054098244708"],["1572932408083970384","11119525389183604138","14091256587419451253","4059747422738240423"],["7548743469584131466","5380521845542533637","11685507031641595307","5746656021863274200"],["4605988547133410156","2090045758007032258","12594882324365132671","4210105527708655062"],["12279975041118048899","2221576281694089208","8384110422706724144","2736436060855017765"],["7598963479772061452","15793739663726855223","6936214574728774379","76309544400549186"],["4144563071198987864","5189995815392930350","16576389363434843083","1512088783348635278"],["6888707893802938791","424986323651486609","12915063671312950907","149736349768277476"],["9307018886439627813","15769532705922003774","17755281941910827674","3578526301595835778"],["2364505982078771596","13224351247740138804","12231650898085308303","9512965386078181985"],["7289977229574998444","6533739941374505688","6501860018579467584","15293995651042805308"],["4001070594949267244","10674831702447771274","13890128037108786805","5207174775701770583"],["6055050752109810422","2788675667959777030","5974438939114923057","5513565242794582938"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13975522978085124451","9434518370328156847","13733930117882561474","4081938701969590427"],["1139010460256036482","7938082310440197702","12456098492796787647","16974804020122920776"],["1598471264810196022","7299193320406795678","2105623263259428521","1920383380953397900"],["728736578584641504","4842015953355663025","8006139027641155613","15850316146615739101"],["12341113721501194636","6742843395204397214","7054408983450350327","6320349694239223309"],["9708919372796969021","6933566369657118511","4590491364247018218","7214194687262516179"],["17348378029939385398","9256740607542315541","3396043180496592994","15902708914219948089"],["16884768476461575029","12642354942891952058","2834944836667135601","14200577699992296289"],["345119127955297405","18373136572945825581","8083336140085008213","1309145305566314028"],["18199335967190628269","9939971638916377377","3656356523128047148","1118756839359833836"],["10974113773028953306","11806732068715699689","2874475840257435159","12219736854301143568"],["16058613269698842210","17733424856908454732","17339890471502347261","3677124712306353637"],["10482608172129006633","624824261301738761","5241602751511845848","17599039895604971802"],["1710049395677813678","1583434333759426784","17326034749407425683","12713811506961755870"],["5675817374869387355","9505369945203610894","582615405410151361","5041710785154183282"],["17719176309367561434","17716647259827084141","430204323040556277","3287298893748439492"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["6999315906110150530","8332574890607663559","6943290272508593415","1332574157201017863"],["17646115080609508104","11232518219355106695","13746636699697353026","4677953224617091793"],["17501860909354571838","3992822905993427578","15210796934634580286","1161444844275251240"],["15654270070063369983","5233614193627924244","3004360920119080600","12227103286299725195"],["1519345395575298621","10460430657322479675","17064168932879209341","8140128120877101047"],["8814981599878368624","7320818897366573243","3048142164303909937","923125809396800502"],["4475800528133490054","5138031227228472278","17861725668248082260","6559592936509820938"],["5016158787069954204","8414022501895062365","1422757363982316079","11078829517752706512"],["14635460346920334339","3859709974271630701","3231664958798576606","1841768109422332866"],["604822958591728922","12578420527240576206","10449967225613665963","7026120513754568853"],["7589722349182110149","17292980767879117475","5086921424888019022","4903324655948402723"],["4330034866660513750","16453994947255206393","6934034237145940889","2977812240795728435"],["13424950206271183572","4512384207812932516","14805699372263475413","17623313967443847908"],["18357219158907511956","14056652433716505309","2308884527086784324","16954001945687914790"],["15061623612188989427","12303888631045213480","12020358322015490093","4591718479463015269"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["2756218155782289830","11832172969745418909","16432989509606480379","1212371794754069361"],["8207398685705045193","2203519584298773648","17635356384392631518","11122669415994879818"],["6486997065630018151","12451985509033929734","15317781299390514279","17648268257979105897"],["14862285807936548088","14973596575152415004","3754934457530656522","14965490194519202348"],["5922384159604919218","4066529198648467329","3574462748572538373","4529903535719632666"],["14930690951254005319","10828035242053380007","7991806705516313033","12548749391456699197"],["12430382545864200532","4038886160282096958","15119233037289296308","14072091476513092851"],["7842832570563555106","17428707001372927596","3624844039205258661","15365147687235305252"],["6935706178438891146","11966671847521574841","895582265098638889","1239833263565528518"],["4960540498124537966","17603869963928881003","5018144545196953164","7847676070851013394"],["9668704395185430814","14193327504752891111","4004264292236586627","12592508182989686903"],["8985392267566274890","18356419275626773262","7002968402074226994","17921168725018971154"],["15080715703183698807","13280413956105798123","7836268719463181658","5601821654618983928"],["7137085448421361228","10761989018024548135","11381546161405512498","6677988979477345708"],["9948440898891712476","9087250942125863141","171961924272540121","6670816061416208105"],["7244760491117602573","1937002853230329580","12409734825103355521","13785445564269065019"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["12325630521745914329","9423616305074419838","16220707224096439254","10470080730503165401"],["12737218581204126115","1936701522088045405","13832197229722905797","4840324356909995217"],["7766807431969276454","12800022728659852472","13012581565971191731","10151367799010382619"],["18347256180997771535","1300903465326055540","3356023081734520789","10947824233862076372"],["17011983524286328773","14800830818699314213","7958457214365442669","8896894925166813235"],["453568389301513325","12380816845282546228","4773139136292176697","14848026967032676394"],["15937003041200358197","3621883365222663661","13506071905983943204","12462153533139835603"],["9614557361111743669","3705423593916375409","17272281786607382114","5580517043514636022"],["2274479564236588153","7830100749880206348","14490624338250007570","10637791042369895710"],["8895236786339207463","10846102773115108934","17900968216111672386","11922944887672169480"],["12232894065800609637","12492011570500201044","14768743484899264116","9382035962770450568"],["17143720823858213102","3096497602075557631","5119201602440949292","132762870566655662"],["5910579182476044767","3068674850186475642","4112330044033191628","843296950214129727"],["5815165770425607944","11657862528816656211","13470586765628277552","11085955552673522951"],["12738407627128784525","14415966097692821700","383092442929893039","9656137787659711906"],["1752821537224067282","12863968065974140385","14431030335751594862","12001583380482328221"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["4727670981849861062","1386952577213344172","15779611765529006634","14517103873071337044"],["15987347913146100052","18193597052090331556","6096964453983389575","5991391093981866918"],["5727549193285007855","891510417518174012","12571149338688466507","17700410012181126708"],["4685689029304305944","1416977254597390669","5483747312260934564","4159022325082698048"],["14262498523370409308","7321539604837125283","6680283287978719540","4644692892608280684"],["10977309452707882492","5268536704463289677","10421640417865946636","1768465985116545439"],["12610524783462623146","11802113594456488074","4201677992253496516","10842115906903684139"],["2250952089931701964","11559921153925446235","8758477081677228087","17233508155591421653"],["6830126945727714358","11329605251404373729","17325741038582847851","8191450988348701737"],["18401847926636076159","6635084992217894210","3193012506739275056","2435972785097743576"],["11057790069674301624","13805131678686836058","18283227199155804710","9719488814136755326"],["10122884061824530396","32904128278385535","16841623285834552780","3496399807185144718"],["13225508441156614632","8450176743698389239","3453739097831089284","11007855710884678947"],["4497781602184148647","9770309026841995511","2009126672296548932","3769487137067186833"],["10526101454538903304","5211596789505011872","11862554111339859747","7865850584889047681"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["684901144970134615","6980426520986987173","13894709778652701661","6605262836858433168"],["1687483443177795690","16195029498510711781","15215658015809051055","17605520919558582123"],["6779221909025892355","18102846305880066685","6136289873028132093","594816241013885428"],["5396527434003412826","17930471018332461816","15900518388998508070","9671082264598921770"],["11688512738646670454","3891544177014939258","3401024511192813954","2253990592464662880"],["11250984094604439504","9576604411058138398","8428733275065066827","9950901454746836432"],["6290336984171134174","6629431117049087644","1265903014762440698","859127955060551245"],["16752248280209470889","9308686698608493502","13946163244928248928","12218677612335199933"],["13007744232089537983","15159528940031870181","10505716359730600830","9906833225460623139"],["10270726953109381670","8641590896980414600","4140243916059077569","17675884295927374829"],["13353013971311128262","7870716756100625163","13474325216732187797","3741756936905852580"],["11142512025799694375","1698650760483338455","14209964195143119846","8623039616873683322"],["9949601133212348479","2450165425646979226","11946759600906593684","9279665097225095355"],["11207974022270202604","9161989558583895299","6605638310806213826","6419623511627585034"],["14229634131244634078","8499387728773253050","6742680990084762073","13105445553539953717"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["1306661275415425066","5530914282219925377","10471926915883727920","9782077230605579943"],["11974449461655694507","8904589267747188116","4159047587879676984","9099255312144544644"],["15836339113992395524","2643710073699992457","9117606581631259080","5730223327469759589"],["12908712032720970493","6266982007775763891","1363128027809384019","2699362975165622620"],["3700649157055608814","11746518545307898890","9241060177657952880","13847247127401959530"],["11363957375954419594","9159181870569751000","10964997344299961127","1916453704312749930"],["1005395790036000040","16175131107614476351","1679780019344512706","9716310655108492759"],["12636824265205747392","6339814160043396736","373591232725615799","8860353592335293668"],["11067051987888985424","14334879920899243104","12461029185457836234","3506507439579673677"],["10220505385994011091","1193222627904401971","1438020118673649199","16239950414420316670"],["7106776074765161650","6003536871480630441","9867861654062916089","15400208878763751574"],["15755035269065890989","13027564845848170226","825175849605992550","16502884505716102488"],["13720776928543056663","14175407478976250299","13493559365094739748","541366378773522551"],["2225074880355146580","16307586200456686693","11804267184664572812","7577653375412971533"],["18135559813920474078","14179383425470217269","621111700082686705","14208438022806712362"],["16851441821542322631","15755284669326269373","2965024818679882961","13508627732479942279"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["11840746138011684527","7403508496738367887","17763168900256949234","17106980168754087276"],["8040778008522252788","6131019272521414233","17667990682623267339","15905708113766290679"],["1585361536934715191","4349480421353796087","8109827167646415781","10828963508566370366"],["16431017611780212559","3327116426683594621","16366547955174165380","6217453966818750597"],["10586332154323283115","1991082764190079497","12151252175979544684","17623897639139256962"],["13144301346128453853","7293991808305524234","2218978273808439059","15049081034522194257"],["11386820802786509920","16297509964790856718","2664365152410217206","10416507546806309413"],["14069306423495949472","14896069660532908525","3688579572030927736","5803523867059162808"],["225349999561432315","5972426944692227754","3158719880760172517","16628956120178680771"],["7205009200059213725","10388021386762337033","16133749197235686835","13071217248524169652"],["3352430866180170035","1051562698687334307","5679156897961832398","5071927654532557258"],["5403062022254967053","11419953252736219975","6268929553124098735","4987116903070140625"],["2544787131364840579","9474179296014487704","15217655801632671340","11520143432103825621"],["6351248962139748756","18227826442727574670","1533870008153839618","14919756393816434555"],["13366699016221765548","2307384884043350452","10873909461142354262","8350243857836323342"],["3038917912068403135","13310620530998927504","2673730055619194553","13721321182010067542"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["17056520893106610593","11859448415532783564","15826522448366002970","13385045288076173620"],["9993389151165358030","12225589931644877137","13667691116753904777","7995813145403565953"],["5820275935935511433","3923934246554579652","6647446025748340881","17529482374208957747"],["16634403830367806254","1542230511760604347","4429338992156019817","5525315432669523390"],["16631868223928588319","14999984672435672896","610087020352824003","11314421657890027000"],["15033870933954314299","17254862243787506943","16440476096569604924","7185292020084661529"],["8161492727734606022","7648932962192986945","12509869765245810617","17926577408471663842"],["1281440272769698158","759959745248903806","17198104339569420178","5181153056073958229"],["10258809599567439381","4227292114233457880","4438507444107823553","512888312769483136"],["13999210170082415235","14247327590617864924","12137605213274888884","5385089191905931020"],["10286609818753229935","11975518413781139433","2962129945342108705","3143908889704947485"],["660597714599715814","7212848623943431634","2385452579708678675","16475126700906314547"],["489696336480252788","10103079772586498293","1322758140378775297","7740933768625416512"],["1407337365760144843","2286768676374289713","4440889715311480630","16593383170953035220"],["9395844085047905814","1897404399097945971","3412362229994687986","12307778403955881364"],["4121356699988936961","9856259977427066074","15334706139409237421","4096871072301176216"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["1287689553599656137","92325777823780416","18301082930311958763","11355847934216567441"],["7300433872657744155","9061390707897791432","11159949170140366033","892156175123008178"],["6339567284990556750","16097512339534720285","16859985016506188643","4217920481954060365"],["7185071581500054546","9801639621561175873","9680339928240054527","9646381841069133062"],["2764975581008004661","9570024553612490690","14760405430202175048","9131104560555377542"],["13659610832799004395","628867424886403573","15802143010073167958","5425193316757963482"],["10183678787223265398","10259027891375031460","15702255853652935176","13263575803690308207"],["7943869592871078054","15345672021995842452","64371061576856495","15076584286320625564"],["1502588639473795462","7019984533077722485","13191265996874102596","9938296983135331931"],["12954696992973096592","7340625086255521918","259329607582182585","6043673441096931350"],["4831824641390753719","13959688388156179852","13070733321760922952","6557959076597103631"],["4424413149971043782","6551386393832779088","6142065795187266652","3424592377967126565"],["11798789379196796794","5636943937681156640","3680983356555545978","7195603393587455922"],["1265369673081243416","13951239768972501167","3114443297743569878","541177053337379829"],["10526101454538903304","5211596789505011872","11862554111339859747","7865850584889047681"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["8584485924441260809","14779733384567861439","1907551940483652049","17743618833364479989"],["14492870106111322435","16271633700726752050","6600020489218066193","17356732642956824885"],["18416073029365044112","13289990980648439531","8637252568499077246","16449516289357713830"],["17384796794590078995","2444398008528122946","7823941389633004498","3270514664175824933"],["10032267135974157909","3570884405980789553","11659518599632620126","8886320364653817032"],["2680275124813361724","2650940514985376403","584804285135184360","13132054746580438960"],["8493028463272803350","15208559796748332271","2061379168376093436","12309011537143176669"],["4886408631722418072","15937956254945386477","16195442340391414412","6269792578184343161"],["2185121209326135390","14692987782934727760","16508182671415940734","5568852238677882912"],["5793084051374530168","7568355493692082424","11099198383492060691","1449786707530208106"],["13654420513612751558","636463146859221384","2020389737505319581","17765574100605701961"],["12595789801039478462","11901289053333467624","3168413682638573875","5441202032065059530"],["10937010999214740873","12689005042266922234","8481029949923102441","11736356249494077875"],["15441411147548547675","8158161385996003379","8230576474624409076","12047447596173777149"],["13909570486439425283","16721948597343436598","10389351594605360728","11587248071745754468"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["12995083173155353063","9080278618486939273","9697857778484050060","6915165445101326456"],["8925489072741343962","17206696900741440599","4409832931422564533","207547013565112116"],["15197254887558741034","11604967563643806765","14674036394751241530","10550493900919396271"],["5671809419787751337","3133620000976027333","256295953948233022","13657957915233716893"],["1479761577934731949","12130331412218721379","12069101224960331191","1817853264462782616"],["8925985974777018758","9372627998029474418","17170775070377353148","13718453821531758675"],["2119713652074539512","3376768437914984994","9520824871636829552","17898148620259603510"],["9781830738453481813","16558438091427705962","9894290804656421283","14169601588951352666"],["2687012926105170984","7805571979785539882","7903849939145765888","16271159935992779088"],["2480532704400348083","13205292873915265097","15860675413861563795","1803495115633415726"],["5224545043364604382","1864450161417035548","502332191133473152","6291500422190750324"],["11479613750428666846","8508479912576207373","13049444879449440667","17187673905952409630"],["4457070201000365296","2648656939269811682","10952919165823356884","468078083682691242"],["12754063013263229805","1671086844303678030","13653866830773686061","12587352829167713901"],["8213826642880230310","5380257643276080836","12312253082579889005","14220840311348412999"],["6055050752109810422","2788675667959777030","5974438939114923057","5513565242794582938"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["2451417457341479907","2005108753525504305","394382811596513744","15265339679836762728"],["1495787208305354728","11994125126068465728","15480658810547111340","2782595287182907039"],["15671559628783463808","16089964431674370025","238346999204774991","3803941090601205778"],["3146381919547379452","2436338477004792329","10319340579280522616","9954184415083972080"],["8877967195724931578","18010641857879007952","13922096426757568586","9395268716928689014"],["15572786798056242620","141224902875907696","9460101794864242252","12952940883578226792"],["5582990172478121828","1972319896849669643","14508854133192942333","15088239604500778659"],["12402542932522026758","6022834320076957534","675503504380267249","10287133209876003003"],["11870629129847047327","15286817734409591953","14362828364399505546","3166023606731507279"],["9049003472044243890","6063507487631164663","4385935853629792669","17879903212454996823"],["653881472223698696","17390221059265840256","14461691666697140098","395205189113384774"],["296496145237459458","13285353341293037331","2641070210397509378","10350194514340990331"],["15080715703183698807","13280413956105798123","7836268719463181658","5601821654618983928"],["7137085448421361228","10761989018024548135","11381546161405512498","6677988979477345708"],["9948440898891712476","9087250942125863141","171961924272540121","6670816061416208105"],["7244760491117602573","1937002853230329580","12409734825103355521","13785445564269065019"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["16140568393924239462","14727103556808517578","13736953165619675837","12078150505510239552"],["17220108182341872433","4147026290987450214","13499525054448011031","5708591434119440564"],["6858796835371284906","15143085409132354570","15678866910726022650","14663218802306543609"],["341039680064087677","11764325474011772391","6819769248903322467","5931391803590270217"],["7761861677075503981","2841604869503375476","7731188527484431590","1834264549876994879"],["3958101675995131768","4611883897952659683","13558502067026713130","13073985746697845358"],["4854432401688288097","9060850950218040310","9850867484299377474","13777114915311561173"],["1047195888930458899","1420216423601607993","15802086277252926692","10973708124563060482"],["17197081937693649485","11690832991386711001","14935404588165929609","6358247481486967128"],["3623999749590556518","14231246728335613559","7186355945187231048","13713790429124737010"],["10886271617151591606","8633981409795546387","9930252172074296129","4745744505095632031"],["8636577433180753822","1438535788221477457","5495666497006870809","11557372690021142947"],["4979377751016153019","7284173729282912121","795074585478064463","1829672651012826282"],["4033660004034283757","209019884650520705","1344876558863557245","944450827842856380"],["1326685953664694256","3109332314831955520","11392699433477899227","9725295333074540145"],["277638638648574701","9583542301685115269","12371050104027221794","11061520894606344142"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["6129225965778483555","8823646360795448040","13877227443053614783","17631157962898945370"],["5842806970875558985","588776313495492732","4679396070471319744","16522262979070144550"],["14829178581363573069","8386469221819772496","14511481257362519908","16530344889127045177"],["1190249970081498311","10504565625688383802","2011602240423736897","15331959357325708575"],["17892301278887208814","14179125763462762018","14822469918688310404","9541431066001989927"],["7159841627351060400","15503155008720296522","9581555378102275794","16603460372369361845"],["17320823163929639813","12619942746522722622","13932835189651073922","8465028442937736709"],["7288370912739944350","10814353457989024102","3952280285497600370","21258594324211557"],["2497354125041985029","14790203440170899130","5269543225228074515","17181972451796300600"],["725376163315811998","12068059722593648086","8427764116011342761","5583452143092589783"],["4557626577146658267","5834348067124490468","13501356943233528995","9508306339043077"],["10826238353514300875","9189348982541999625","17084906776368488319","8234213210366895753"],["14299230603199950722","12405899149204567397","5432015381493448366","4268017714690867516"],["3521872841605428972","9047840043272709150","3201299558376722894","15539753583346570860"],["15504457575091738281","15676410867711816187","16072986184677012431","13901222333501322658"],["71480934665987796","14923658959496530109","2716278954273736787","7178433557381053809"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["9207092245668356978","11811956352915364246","17365154940541220834","9376495225081477390"],["16951444730010349108","8570039289262211121","187370292528520538","14364436236591778317"],["7135549585908141119","9881671599776590354","14857660678401675828","17558418276048153118"],["4232860030783404183","11571182019032510817","17932491964409921826","5590266970460634110"],["16545267404842721400","8118462693042034277","8146299236545263309","14624866298463901527"],["15671619810255807797","12984689860192202967","1453505735452792669","2624987644645980663"],["17147796709300407625","12522536892620722872","1462021031141995947","18226733292005711493"],["6113483031507300218","15902660031453132133","9384163725447632776","18180854677250358863"],["409743623172596253","15509073118049104358","10034746113950356522","8359480959820414395"],["4249067182653200054","17048097510071257323","4866479375402729413","11980650333223190166"],["7857724367595129745","18098226875068952175","6635687569474162744","18177421098252013371"],["15881734986630427504","17526947003682950312","8236517526857536935","17600686736123050659"],["6757494332795562949","13473938936061381730","9038109045075178814","7405343395116827862"],["18135743288924020353","16527943016663471945","17619287463800618098","10266894335540556803"],["13005582304936698176","4602500652577313890","4226410521232787537","15610131963921216811"],["1835391189247437086","14546475408653048693","7945598013241966860","12707689623850437143"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["4087332399930468970","398147445365864255","4225242230046334847","6682028603561072395"],["12640280030144850107","5643398310922152960","1373932120795426473","6412072326835863137"],["11329474147453101728","7704929881689948622","15936887302729034023","8763274218908776886"],["12348605784897282053","1977965644374271770","11753659088061177897","14548071546372299880"],["2603177410951482167","12257364963504880854","17020070082164286510","12670735052949418249"],["15769640193628938123","16048190515837754522","10756257793658439517","13064031863609212987"],["14734670105700254950","13126287142033238052","8860048697902468550","11645866071736448826"],["5904411201342518148","9109786446120955869","9505418598012672914","17790388059769271876"],["9392015569212932515","5044266301040038856","7575095340521378638","6326413875241631775"],["10939225728910013131","12381417838739747232","12149671136768483374","2722539608950285269"],["14121629819889661593","6639561816418975053","3748393361805058936","8158850222295046829"],["14440355858424712732","4114506414934650964","13347539588814562038","2915339276984693408"],["8469944100709685980","6535907644730683382","7881181760883000337","10610909959920608059"],["9628568819732347380","12117772422792155106","7756473715058440128","6869415155551686895"],["17597780936672004466","2636402624346807413","10167692533436607434","11986675106726543953"],["3811231592098720608","8448373105265692416","490653320868421865","12125837652211539100"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["5395180044012836487","14214761196040515677","17328311871936240931","2741909936378906644"],["16488770059464265779","13371229590378707872","9485478592184664026","11656571174023510101"],["1871052207065045924","4693327412827146500","14640879028856119366","2844249781802224822"],["12142734969917275991","12934971183740218225","16639955156223154495","6834467915911859189"],["9126948414897690009","9667641431153203815","11573303510638809466","16869563617077351808"],["13507656498968883057","7453183540405485127","3042578042316289426","5947520298486301656"],["13501075112631698207","3409652645690996127","3064346977071450769","15079071164232027354"],["11181957624771351048","14951717217087596609","9082218027314238803","9433200881382870588"],["13102625104385525895","6108982672549936696","6314204100476958387","8492724525237097379"],["13212465283814407036","10107654939304017794","17489054728730443783","32806740816888330"],["3447246787108337243","11261982978652297601","18111838340473863294","17747882298882341230"],["17908783418354879406","14868524655787958575","17418195230833949215","4400157987947450776"],["16034354397799271656","17740617588813620579","11202744804159441900","6699698821914706676"],["17178960652909660862","102426368209761494","4096172792241084896","4065362095143652147"],["13807359242727882102","4816648594013379520","10069905745827705382","5099096122554035634"],["8447565201928322726","13112698416159375992","438510426692110218","1695316806484809376"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["16305065269743235444","8367396110563539877","11935305506072146490","9507400935635556910"],["15980930701595005977","1700275266649340112","17826602650209782259","17997103882493604237"],["17062297123174835214","13307378672523678355","17392970378827224546","1447800354898894605"],["3509287530918498085","3786524246645089630","13401924531934590650","16352439420457243178"],["13249584896154044439","3744089379880887310","1366555734501398184","13322776603233118223"],["8250560951144282615","8582806302174762630","9741710552650209495","1640824150180697636"],["11546812636173267448","987106474814271960","18328064752010835244","1339813393132034904"],["3223081387962763482","5083053226073665556","1564350468220926484","13864090075544393152"],["4469604126616549690","4966800878328597702","10701671955765776975","8420560741370558644"],["17033616295678805323","6660727041415234623","10003506774760956679","1162039903702582060"],["9818608595766820277","15844526253884761840","11069997249125717443","13805623490349194540"],["6178186409264815316","16621859813103593704","4384272016285505969","1694988664954522590"],["14918217823444970055","17215710664250129667","13027683813313189638","15269033738970328685"],["17855238883771312742","1529784305523954141","17773837241700053256","1316408627920648816"],["8588415995626781298","8734196427847099814","5050072335024715544","10193630682321730731"],["8671292656581937219","606088484593897193","9580416314639011041","2510868533830991207"],["2192928023062863610","16866694036386262182","17293519033221418220","3712372753953897681"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["17940059245636157682","4377670015233022459","2275228549113928158","6307689325174818064"],["13670489679313983306","7767057935415813705","5426188160166905649","439039588320871633"],["13619785722704722799","5392160159909868046","13554668198326822941","15289621289525794472"],["4817035448485006378","12364611710498684474","10166796406146756192","7754744546264899135"],["16724434640005268262","2802538822300188354","1594799093277949289","10008821927990047654"],["5499410076691539411","3688126635938739462","17552743250254950596","15717859390518064113"],["3432452527743615578","8785533802650096541","3202193526062974728","3508705978370885642"],["11980072388356566682","11415922528267141580","14917353575908211414","5318059588847413762"],["885063342380599473","8017555084563371651","5735284089194407809","123452884335842199"],["6832818114454371355","7905529075753218669","8813560765923185331","1311599827945907542"],["88823087057724050","12414620544747919371","5003881243983125197","15550954541314138196"],["7732556432062994216","501495816107551894","8105834924904007940","17273686799131210116"],["6170102248994332370","940408970242300203","14635360541876679361","7480268783531457982"],["16089723366443409121","966846039094628736","8511667195782205298","13994952768040390615"],["9203603097314931212","10679441803873230658","15314457486439199866","5018207089951443370"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["10822149305893806910","15942747744407799512","6085672375323931910","11351243268066537420"],["10047721059900077979","16471100796486754435","6463370783885677439","5349002020428273586"],["6600272204925857207","2097522585768049299","14319899941601048646","12761040011438904260"],["11449668443436355953","13839054334099027850","7477918930413281208","1192058278116348954"],["2559942581077344105","18039883600549489389","17749932487877649517","10060650366237771462"],["2766518374564852524","5920936841362919641","13065930121752880527","12912474267566134154"],["35770050582930478","13146987694341968150","4714665064127281880","5861150211881055560"],["12118466282432292261","6469706368730705174","12818311161044391326","7742106615838849839"],["7908997033144336810","9552119264456157634","18045663329443333592","14728874610070207024"],["1642822598107738657","4823146702512022719","14020212180464420069","18127587552289198755"],["17278876714784338751","7080520600303316521","3839311591796863119","12207439852797999347"],["216430552391370130","16239991186415608669","16947542547366908140","7581094601201632984"],["8357201638878824377","9142862390381671075","2541356466079391085","12782494170515263154"],["3303978163494319558","795482097037885768","8648486193124349573","6395643951462967893"],["6273897594145983808","3048017189743975810","3447251849551019225","8151067508856838492"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["5536944025147314964","8813240865999140721","14813290707427891155","10469840285357414074"],["15471473715120235802","11053104303091058817","16633423374913004151","5423017324876537991"],["16225813047797687601","7518282606840237708","9618508957351333149","2570494104641433515"],["8333510832989690546","7387062955062313337","1926981995899816019","4379915810862861253"],["9959875990683426430","9488965335645950996","15344516832255511381","13681062804805911444"],["1366070097671354985","14256592277189120297","4970637967056867650","4783321694580360031"],["7916499478343979561","5631128388503679003","15299494102943867515","13736724854928589244"],["5814346816242188761","6088134287167780219","14666618684596312451","5820973210949886419"],["688721567070025073","8071438566609971184","6138865369403552817","13404853021167864751"],["14412530032307186156","6570922944122172034","11624811518247536877","10612010796829300734"],["14936971243322782159","10714405827310407622","3607422786527522920","13194689866151841845"],["1335154869433916799","7218029822677872095","12843862685708294087","14785100649774782160"],["14557904446314990825","17780290819481044150","13716737966780346905","12153123805126776535"],["1407337365760144843","2286768676374289713","4440889715311480630","16593383170953035220"],["9395844085047905814","1897404399097945971","3412362229994687986","12307778403955881364"],["4121356699988936961","9856259977427066074","15334706139409237421","4096871072301176216"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["12754101465947982290","4551632059056942429","7893017501359919242","5260586294823660702"],["5863507842530217225","11876633178634585191","11170290915282285175","5406272686903002809"],["16504319748063023531","10704890672868669550","6468959310858761363","12061864612039985947"],["6956730735597723616","4393682917733021694","9761463040451488142","6276176489092114339"],["9751040620974938618","9119514615828553753","9222073800642790504","5591119794194770840"],["16833869814438181301","12323287031180410735","5852510012505343677","12892786129456100146"],["1819458701793414525","11091338788293446985","12604733367546471920","6092468316060684009"],["5479984099672909987","12646159040295721874","13416019701648284934","6260871124567827028"],["3179069020599083650","11251738462808349667","4292699502806640239","14351647806314033343"],["7466137119278500505","975043603455786968","16527073552957608038","16677242324007445094"],["5656074488780384953","17239452390325533372","14704574557832523805","9581587849615704978"],["233936749703037540","8011853592027649380","277173798425372861","2559375125025065537"],["366419662561358185","10015589248852247660","4782794112878039450","4310240479764902514"],["11396317013495698252","16822786171480234151","1837468165041187475","80449943149855381"],["15341451037994247477","14318485947275727412","11528373332288582141","17694555396561992896"],["8671292656581937219","606088484593897193","9580416314639011041","2510868533830991207"],["2192928023062863610","16866694036386262182","17293519033221418220","3712372753953897681"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["9357617329755839494","8815156622536744027","1335616545360414948","1842645541779715663"],["2048190766068490110","8044508724816825957","9497167521183294651","2029834844027378932"],["11856160999190081757","13586985634185936914","15397833662731486650","18406809307079988128"],["17163974326832137558","17205691202960223964","6938616934227889071","5665042912013517960"],["5817073335991189502","2337093857866234874","5881910916502865950","10531706108764122091"],["935383275601450319","16089896901181668270","4763616596421384681","18380736224857698496"],["15972969101527338728","18064304903896998299","9285853801360809679","17401215579549257114"],["4777017483789296252","664258233437339529","9249289992937279397","10832620831476640565"],["6736675008966426545","5520209452396540369","320121944807665146","15539890908484973886"],["7680774544308447704","12076311099763278801","2111375036363822486","2006363519447269784"],["2652824914497996553","13052619765055106287","13120536271169126783","807569480939988448"],["3820508958088010655","2371800822927961059","10807006092558651481","17829870115196921168"],["7755380676201795628","9580903547161322204","4055876213239052840","16170306310025897868"],["13293623399021478647","10139075909300141405","9347589487572685809","2521245772313997543"],["13909570486439425283","16721948597343436598","10389351594605360728","11587248071745754468"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["5977420304783991958","5155380286712087062","1479177771150454298","5880643531379930263"],["16887088745595662111","8796022741963129584","12677583393037360160","6960942877066147969"],["12799088111509872334","12320622568195674377","6842130197301765113","4222246116433499575"],["11400033878698896305","3142323670846176230","4033105379800035219","18147879445542979572"],["13219247024475411827","460287523987004582","14137685442014342611","2978614453737219559"],["13173922739902847781","18122927678701776383","8052828309515884895","6575350327011928071"],["4345457010078019639","199216950358050590","6881026321367979014","8551132610463473170"],["9805637802200395730","9688106334135574185","10539974730977176094","14382430284219584215"],["1041346503703986235","8919552643685499530","875455586847120978","18422808802783016038"],["15972742834403154523","11651747791467581134","17397163545357063645","4333453342397511446"],["8809775934411972122","14312698515571140223","3201080548392243234","7517018530954589702"],["1450631942013335191","12634192596856151442","10416819645535384242","7625108254139074973"],["11807717151977190840","3143218498039404258","4411688657907083875","5695680419301600078"],["10638379641452141949","14948583011377418085","6281385582535071742","12785933007743361269"],["3978823544199906787","16301888691623004092","2500636796429483123","13118662680404425297"],["10509066551531909793","18051754802660513565","4613257967670994689","14727975837904249345"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["10883110449785142826","4065155827213724563","6559015484409997919","10295190987342508623"],["5186945714036600703","9431339983736785213","2727544625452567383","15559371749066748256"],["6438513460696559116","16313164261868292730","7716935920497808757","12372921163445541733"],["6693043981682864236","4687999766024885210","15368452092170892888","11885620161290768322"],["13088235136696195004","15814793160164300209","1155319953434015371","486882261145722427"],["7374662329243284035","13801804926527016969","14272985349446028879","11021454388519542438"],["6239620738083940508","11873457721986471743","17404101072162291374","10191986586503490454"],["14210696410639775492","17363947093605286508","11356727883477644035","1512352797905583599"],["5433253604497719473","16610600611100025635","14546438750659624607","8034571936466391993"],["17674424205436099110","16770379356784584267","8287667674959901664","16463317572580109167"],["6756742737934430389","14066016136182196795","717151861947172874","14385887667041449984"],["1809228899486087932","801307318421858483","517491580220864025","9235265305260065293"],["1131030283534461078","18099243833451922155","9053239802415248779","13914446117107072782"],["3548940322824343406","4758059464806003740","15656427706262731682","16490396767891246696"],["8682519169052780224","12056697286830859920","17926222374132884471","7979100100259600039"],["3240705440698160524","16339929511207409510","5051540480786876646","8059988927684758093"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["8764480047352908368","5368291112673007848","15168435419998629532","8522515511017934949"],["10533284044769387764","16679451454999356713","6187849723861963929","12226153057461238598"],["3840896681434106243","8093047751277691569","2113939561261701329","15611301674329725929"],["8299708634446790497","14604715893036965015","9995056242448097410","343995604496485748"],["7816939388533722270","166465958236832908","6439513637760369072","16368669557726410895"],["17129380494656174911","15463187405988909848","7640015082425600794","7797808061596988925"],["16998046779170055728","1694295272058151911","16483110149704846221","10560131483158816922"],["576665950048137065","18312198053240760714","4449182980593492727","4871970641461707567"],["4274346464766087529","843283950178824014","15922684112515691137","16625484570932886880"],["4087542621333650886","15385955031983496951","9370072585543788485","6626647473493453896"],["5931021761912144117","5251069522496671130","4844487078481708867","10796420454703741164"],["15955499041577061550","14662913497555127852","8832901355795263881","8088781481772868531"],["1651935682308909484","4152231865548395802","8811175738909381149","3513385643225536771"],["11767135248158878771","15134563349838462437","7077488312615935026","4941644119218907273"],["17387715544615760989","743897265308520935","1602365932922715952","13150001061730498685"],["16851441821542322631","15755284669326269373","2965024818679882961","13508627732479942279"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["12491712601364656433","2587088643975715246","2454506106080218500","14833976896432889643"],["1229736149781786761","5709821006968746804","5912721534581561339","8741557137213019601"],["15948515642731236799","11030938104936536209","4613495375992603978","15530832342023595309"],["13710867415355339722","1308316230493180306","7004001575378811516","11229283911373112798"],["6473089548902735697","1875346940955790936","2817424245379932465","16846222666756553798"],["10574376390820906675","395096412313194786","5589279566087196150","9824301700211829134"],["13146792548762929013","11744606372895191519","14888902682448000533","16264057031044206967"],["15601988370420530948","5015108015953185368","5625077510296284706","6754881740389095832"],["14086584110666410934","11078044525509500503","5472603006657162155","12131816866119032354"],["8740149715189217470","18153321900105686175","14026878517385421088","9518864421970401355"],["8838825605849010405","5296594671239668078","13821526939398071289","7417620849437429498"],["8818757825826091499","14108472504008763371","12012320641121061510","2626195176160602640"],["5040636044315747296","16773309591028861715","18208980883861480890","16612849471743780890"],["15980429833110365253","15167382632828604396","2304557911358690440","17772222319455800185"],["13807359242727882102","4816648594013379520","10069905745827705382","5099096122554035634"],["8447565201928322726","13112698416159375992","438510426692110218","1695316806484809376"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["1748320572336078648","16430899029023135889","14422261527382258695","5480745000269369293"],["8627317373032125474","1727703368560882143","140080168289917426","2576429608547778945"],["2819427158651310488","7650592781234456210","6273957139499548774","15507514123173740699"],["17909232689047336950","12314080966371586841","16475555376332886300","4725276618922314019"],["13934853264849259754","13381759340560479507","6265679700752681413","7951703815813965834"],["3888114561419725204","1513369334783054302","4977533511345853740","6037563383531581450"],["11140476609381595810","11377691796109435929","6745204500496485530","4605574501284980125"],["3464625821505039188","1010952008830233865","16866324384739581682","4548117254540613900"],["11411216372390049683","1358808452217541572","3278056649328341450","18381504894001755848"],["4353462603028833961","10376739380024724968","2341481027011749779","6590798285746610555"],["10974737789303764656","9703266855334967979","5530666204294738223","11736962898968721128"],["7695177350277204245","2808065891373361929","5798878794253118737","13261120060400457322"],["6973935538285867217","1839715072050718335","6773329767151574031","1581301786086785270"],["9908765180309493171","13925735509572017118","4312705065621485702","5192923528455703101"],["13975107105567499765","4776493725633016430","6066579632369672869","8852984207099157985"],["6775248609466444160","12442777071342522240","13361447808815528497","18247472270039453264"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["7566076151863547171","882062677123615851","16918913557226071090","12608411615821999009"],["3937107362615273879","8520258408591041733","13767786439728258519","11079184756202960618"],["5461089385455365605","9537128906283659994","7711638939542578908","7445231758291285012"],["534900872950635009","6110048406916421652","2261893168378246744","11974771693348493163"],["8728105604164902569","17365743649368387781","2887373326059824491","14734703315922281066"],["4994255025901761240","10449098704333499598","543213297523629078","5219073420920676004"],["11199470468226548793","12296173414718994423","11636628054780104720","16314626632734448979"],["15935470743255798416","180086552919194210","462025412091983647","2401064169450417878"],["3034467807910961574","11050466801448902616","9744752078548340053","6165066780284579114"],["8318080431772390794","80759942700317967","5806005190762691670","8324180758252151709"],["632644381937337839","11260826658640623473","807266889300583457","3683867498762456506"],["16874108281700316373","9408219248908600102","10486503705450042306","15098410771985214997"],["1651935682308909484","4152231865548395802","8811175738909381149","3513385643225536771"],["11767135248158878771","15134563349838462437","7077488312615935026","4941644119218907273"],["17387715544615760989","743897265308520935","1602365932922715952","13150001061730498685"],["16851441821542322631","15755284669326269373","2965024818679882961","13508627732479942279"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["17816977286561835882","4248376713070918803","5061345898276808042","16403469404332054762"],["1120804650819568394","11136646699814977858","2543379454091801201","10997888342958195577"],["18219341118265541146","16510525894941125911","4250170339583956742","10470225326924327449"],["5070810215575826634","17238703162949721727","6565104357604321473","17543792225990912306"],["9259508186162128942","9865014412588345486","14167039867701113738","15932183383898959341"],["684770164792758999","15532311109445408503","8837146533042615417","4002230285713475793"],["15406491820253692977","7910307860681453385","8010484803690407240","4187873628607155037"],["9836353825792448382","17659920642053772311","16246037974753944765","3531923325915901663"],["2246772914547949242","14285347088026500912","17672190839635525460","15901640580599265527"],["6133254693068148278","4762800685765342436","14344148435635189677","3628011289321101263"],["1994958806428913914","11425612621630280681","3383879008089346367","11535996327373239084"],["7803370454617984465","1991892789040160658","1508569976047459755","4141487014116120660"],["7366327769341190973","5440506153919016644","13491363161360031926","2104537132279890485"],["4033660004034283757","209019884650520705","1344876558863557245","944450827842856380"],["1326685953664694256","3109332314831955520","11392699433477899227","9725295333074540145"],["277638638648574701","9583542301685115269","12371050104027221794","11061520894606344142"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["6666086536089842927","15376760891485404110","5801016441175450103","10879617819998921781"],["10765426176273585091","12785271566381462628","13487798828541597451","1442565421239400676"],["11843901476543779391","3144362564087856497","233880320446998914","12797039211779349010"],["18195491794337609001","4610604837704314559","2976018349474963092","710630540460412493"],["8386079854373090574","2962053139132417396","925091291366712429","6739823252016643835"],["9918249984960646742","12009942910958685351","15773972920433601032","8469601194389880057"],["14618287906052034420","5583026216910193630","750293887368144130","11853510182571050968"],["9056692921113400293","15642800964309116335","5615280349678406881","5334968493415130885"],["13684126562284480145","17074474517669049571","3358308020878962533","8726951336431353401"],["10513167568785259561","15861288021377270500","12275555732245698603","11517098492447321785"],["11313088056494301464","11593681609711489054","16247557550322507138","13933241849262309533"],["14964312794630158068","14422625669542856755","4236496036118118908","5123238154155425453"],["4288407976098386314","10824994051975631165","17024270377218916858","17679088401927457289"],["5212969627063838264","12487245020785104927","14995711356615357414","4274310505135844688"],["16757546928331904371","3444523653431191017","15490011556744613788","1546052053539445393"],["10509066551531909793","18051754802660513565","4613257967670994689","14727975837904249345"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["14924522949556051317","16353479277694574174","17557900282593062153","3366270853346470414"],["2935068741896642598","10068824858539300554","14159121729239503481","17871784268278297223"],["13329253832677303432","14555396464521342970","15039993296052823158","1616274480805315570"],["18299380065878206025","17471608430826355848","5716783368971915508","8834018210162857894"],["16557329310567559728","8071257347532502690","14134464465865033020","4775081460806196032"],["3810078091508122743","9826257343700810587","9070864375215605489","13606846717208527919"],["3037329293818624031","9485495615064075478","17157772263288467638","9844497464911883573"],["17168580074467754920","12077858083811694526","1636894021157831177","15900784493126653857"],["512980145370128676","8808461923638128498","14916126610937963798","13836121959205581073"],["11562059159747396313","15892793657509439506","10918192073029522228","13240795552867829617"],["6756742737934430389","14066016136182196795","717151861947172874","14385887667041449984"],["1809228899486087932","801307318421858483","517491580220864025","9235265305260065293"],["1131030283534461078","18099243833451922155","9053239802415248779","13914446117107072782"],["3548940322824343406","4758059464806003740","15656427706262731682","16490396767891246696"],["8682519169052780224","12056697286830859920","17926222374132884471","7979100100259600039"],["3240705440698160524","16339929511207409510","5051540480786876646","8059988927684758093"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["845424474239891701","17988964621393029619","4820865545182436655","7416899123453178148"],["16564574007954172980","4751161738414676668","18087522347107503252","15092858922641413527"],["9177689374119455016","14366920502114275647","10014536429417990552","15682451387278703147"],["14641220674815551585","7400924707661695763","6643086363506930146","785251816363698051"],["7470691218545308237","17524676216028751728","16725470323617029355","16542179050814322320"],["11597135943893306983","3611561406603933752","16232815354144168849","14032327394402000811"],["6296509307194462451","2659131790925061721","8606478487905068839","17632999789343316279"],["13637430049491150255","18382873226150521410","3203508325261151904","1050748920316415583"],["18041436738952521588","17277251726843281640","6310690032983987959","10483348687200659179"],["5177672554118879874","10080294366252895707","270114811273426229","16327196369728949086"],["1460609088561987061","1083923561516585102","1227799476423407366","8171221023390763001"],["2130915099888582367","5382528745727799301","1629520723304245304","15430617937180125113"],["6426884673016711644","15955945294541249653","10932219372843633000","4816911979048092758"],["12858117957920608522","3127184417367944393","13865249684548841","8401943724287608362"],["17700137526180119133","8342976164666078544","2375412647472110483","12748203749331802388"],["17719176309367561434","17716647259827084141","430204323040556277","3287298893748439492"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["3169200021445856891","16472759441855295431","15678931919553296156","16434695130105829683"],["14199363069854541639","3135398791925045167","9318933571372843192","3770217162678850685"],["13015076383672721580","8376622883006808990","9539763563523874579","2212983192598482388"],["5261152003824653235","6716769904444184899","5173072789343247514","12913448295172024543"],["3026718241172953869","1856520009432140341","15936207964462073049","2320087154423891295"],["14865868080405924689","3795256849471439057","10537242331115546843","16274131542150167461"],["11521069097592145756","5466486864965250554","9609289516953554583","9445385429000621601"],["3708300421891726697","10876373139966981484","6538047919847501451","2234864532408580981"],["1337536557065880633","5966553335607583388","18186958388275792562","16704879292002636643"],["11988370727626440625","11295931043288130594","7303701661975466118","11397049204316703916"],["6217753894273251906","7710580320978301291","18381927910143010573","14348196307593654779"],["15147262729467597464","1532911925283685197","11323177222480896268","890586623539080294"],["674305716346683862","4474257366070021446","11595094077397661324","7228133143044955146"],["3653078621938644825","8265117845559842949","1666743035186547528","5628709764174838719"],["976408255402963871","10391154938601194912","8089522551291878089","15147080784074376526"],["8280812836316470731","525459528857064349","1224234600473223565","11407072143640540358"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["4138002085057328480","9987835665694335318","8345013702629959983","9924133250301556737"],["1552007101479450753","8698479200541118403","18140731428667325075","2181738248801478981"],["1097709910524668253","5200173066187029007","17982478472512029395","5357031257123477801"],["9227739384006862225","3807385479626887752","13492024281013148007","10764610425034065591"],["7407489294202422635","3737067361601694366","1052533474687476527","17136856125144188497"],["5591990549534569637","7271219438301821532","14476349492484955087","11671274144529288262"],["18402231094214002899","3757790776016608983","17842801179950877980","3768206637544475007"],["12712554412396227712","14708134299609885350","14882124781353839862","5699686734126893691"],["4951450065987713981","16546348110079812130","12043057815383061367","16085650698345334024"],["3688844315709855663","10455087270219173743","10493319173259508650","3458424190161590426"],["9573905948171038303","12298867535384767381","8849014390409087334","8033183886229221148"],["11167593255149522161","39569440381843712","1362043397948802537","11009188845085208999"],["5839257437079854080","8123105674088484438","3124237801695930648","14923768427908799246"],["13300364744000111854","10077841917041013644","12912639979234144816","17552612679448460832"],["6273897594145983808","3048017189743975810","3447251849551019225","8151067508856838492"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["5364422787491047709","2867859605869776346","5943701325981119428","3713611553164877773"],["12713312526172517763","14163200403044099242","18086889780690380757","17120265085965266533"],["11593675383115879251","13286627096987252270","15339803358463287070","13548333062336614652"],["10483584420395079924","5895329863059996708","1649566910968366694","11189881694089857436"],["6240307289788895659","12499436321178065793","815678125825135772","2389075025414210097"],["14946202096239954321","3918169274680536588","16084277064815746690","7206231282476060122"],["6063350904418343580","6901123370325228075","304405647187009547","559147996917964613"],["11426868157996707032","9492468094867025649","17974745102831719531","16227942665085726897"],["13448595735744998643","14331881730645428283","14631522448569946959","12722985635029737783"],["1167057649768105825","5880849986897290403","11219060927440647564","16595521734239277994"],["8998168087043345137","17394240341968947804","10965388292102565355","2134898718003865731"],["7967337760084505193","12093033301816148653","13231011259824668980","325804519966146933"],["8522790912285717851","16036133184490602828","576218666448855053","6199640463484907101"],["9196707652283242843","5427835495110086551","4487808897870593492","3641388250671223915"],["12994326954437957444","14579616132268523006","15774994085622191259","15650417143948626035"],["1455852678660655299","13994024557906383740","7609078167324927474","12007540167498037278"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["14803772874467481296","1688822205281949689","15800437529354329583","18120161608170308543"],["7216700591590145565","10842771656891113300","10667596607380128813","10832152026766175358"],["4215188740023067912","7179789913274376290","11571636489680552652","4144938364490735135"],["2020532441071282107","122767138179787045","11442483926004948388","3381457160065261153"],["16251293070288502241","14636098245327139377","16976234852700160547","4280014091192957434"],["17883069004717262406","9375110084593416217","5218771284622817341","4257150191091605086"],["9129007016700551427","14018631963108820398","444883018695099532","16030533480995071353"],["13685363896668807457","17456495125022289535","14180116352260480752","18174879735188855173"],["589112128949217223","7550642785866154000","2265134671328698568","3051781209478628296"],["5633689783119904268","11277423301133383760","2955135100840777584","4083999912092200557"],["10072160796640932990","2927200348924300027","1699776732871177568","18437644382997926582"],["8963204508562307669","13317731340112336701","11900531056028460746","10151206229134514337"],["6887409430875898126","9062127043981514597","6211642007511813564","14964681423338707329"],["15305831683202690946","5587917291585781453","7057720729868361120","1591644146765274526"],["17244552608730262293","3147964563199372565","144566775667219345","2768859083255649648"],["10694538855342918323","7232999051568857037","17107091126648886142","6628092254097025151"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]]],"finalPol":[["13897783108917437200","12771179474436027796","7624982965908770128"],["10605983775594583627","11984458729667660763","11531116978231978914"],["507865785938240752","8612448882899771151","8838811206389664484"],["13279345188134213836","13673466897485252479","5040526850573788035"],["1692731712858671658","17447646443980575978","4226847872406529845"],["3910357803296294406","1481283439440840305","8752676670196833192"],["222149887509164979","6910579787257093657","16286972565329117479"],["1332525003536875844","975969498898119815","7324298727699834221"],["8934778662816481067","4712435338872501184","8492017808046258102"],["17939345343138282778","17505737946621972019","624337340057244815"],["400165400825439649","9488967873938135186","10405200849308469396"],["795397480125933070","106640176391448286","13453358938943595398"],["535088722596946882","14678771148142311893","10115881121023897126"],["13054504693680229891","18105473611445661365","3695910677026973344"],["2777671657546252746","15628049943534746986","14834614061480155931"],["633889509165029133","13825365023631124140","10129767661112775581"],["10632780768768893575","12494952780632351021","784200587844448673"],["1998335621834132170","9577795736926909163","12332703826148590727"],["17833110068438785798","14597264725733694152","8704510966542159732"],["4594863698366813892","7135430555972535239","3101919190913975099"],["7390007723100406335","8231056131585650691","13492175933159668510"],["17636656792212045522","15385404414681989317","320129346155120373"],["12220478756373694565","4696695128378798993","5854950883694935344"],["14627941627457797212","18353858058457250018","7008016754730807145"],["15157885620916538306","13725909614037469089","7197068888901892625"],["15563467838290494349","10157396574394202349","8451762939128381514"],["14841615652569593752","14926622435687794335","12933137215612560735"],["14534826163287421304","7880732690840868028","391216514006989614"],["12861639409997414631","14996954137212548757","6720707722045059559"],["5187769124928848946","8519782781509147531","10829069268404145687"],["8527112312519591481","3861624476446460696","17500169121360883584"],["10279567408386179622","4388896891988135776","14889599448515319397"],["7307369262379324650","3091784194367035736","6473208751374777343"],["15784859850060159219","9745457977686462546","7268103307893800259"],["9481541171161100248","16840070559270909966","374663615898570768"],["5311397793639087223","17845498313514701327","1643001104436304346"],["12159888457745511997","14019270957662322012","5660383444984991779"],["1719794765016042391","9271978927998573695","450731208483024195"],["1847038431357513158","6682180610643993789","10566207886648685805"],["6630489669228171349","8676823711617577879","15808609126455465216"],["1851588862332683090","3841721207297582438","9111570625366131067"],["13523761330478356554","13379210921426786089","12952973736161292150"],["11010531084672105835","1885356238883815001","16455949276365759045"],["16252702815230155498","3796450280662699136","2081802872250822022"],["14736155984630697763","12740109569924328832","15536848998452142985"],["2002695636626512852","178858411764137492","13651085040906621735"],["16239080193741376710","9186338073113735231","12580459925148757523"],["5055185653011628542","15547352178343758040","16318889740027072734"],["7540011531735879989","15268302144452498193","1485128577104071525"],["16713214022272876297","332450065159803096","5653667102245316741"],["362877193916690507","1937369227931801713","13746075750051289555"],["17389146272706299583","12436300858881934344","18041069904083380244"],["705818002188023136","189284891073660718","2490830511808104842"],["1061402351318415295","1518218718383509369","9313664456620256722"],["17678458117657566272","15116826630508705635","11074263457746006153"],["16784845567399096713","16882902452756824014","12637056299688268884"],["10381214204077812434","445696483989470736","17521978743175683015"],["2021188309690749638","12116217355615724489","18322235787270011679"],["2818961595008509449","16510625363153599010","5678552136968143084"],["3545732610455125905","3477461464335497354","14937261572513177720"],["7175337939412793588","2495632027918121633","446481343841637832"],["12683486785452076687","11890980932861077119","11676890279929057230"],["16191422665239890400","4269686588201401206","6886007185142659301"],["1912223514345687575","6147557491806730832","11467407328321657942"]],"publics":["409865990","1532343231","1119281276","3207759065","1676250601","2167891122","2704683386","4055653212","3630531959","1318468224","3079352940","1116871439","3921828236","1130885705","3781058510","2281849594","1870","345","9","1439933967","856158330","3770800063","3787124962","4213070671","831586085","3154883471","248878296","3665948663","3322817433","3782674047","1145656272","1803015995","948619087","170496919","224589704","926997818","2291304450","3097553221","2761796246","2573282801","2985864328","1403923277","3237549865","1871"]} \ No newline at end of file diff --git a/test/vectors/proofs/1872.json b/test/vectors/proofs/1872.json new file mode 100644 index 00000000..5814b12d --- /dev/null +++ b/test/vectors/proofs/1872.json @@ -0,0 +1 @@ +{"root1":["8518621665590222551","10478627123827673368","15550911059566962854","12841209127474227903"],"root2":["4869072528223352863","6275850450145071959","8159689720148436485","8979985763136073723"],"root3":["11950620943991676738","17867127133130771806","15068009101790806433","12632115325948678957"],"root4":["3564725094474676589","11843357309515649512","10063304565340734806","7991884442942097577"],"evals":[["13247876768405730183","3949174442021621458","10530924666678670709"],["4002134769715360211","11242386526775770735","13139085774148419469"],["2303121438530989106","8588900391031615181","3810531750405487933"],["10734853137825772486","4247205589624113124","1323548239453790393"],["12146129865063189715","6745419336964069430","7408483635065535542"],["7398256544847268723","17265927228083647872","7142777432043750872"],["5996525824521938522","4530591978855571088","4253907673361687052"],["3406468740867155523","10709347363037093259","18066397558431156556"],["13510882080243030373","15144550417219230398","5085309396957579652"],["15934862626371813948","4502636902566077788","12798830514915892361"],["11172169161242702432","3005206460854545056","14827727304588065611"],["6289506477706808669","15930793384902380671","16628656820742729742"],["9703351389226022422","1153883984614128666","4457026968213654962"],["4160833546465262060","5107919869226265916","4459441832474174826"],["15995660826066067606","14847555282195605878","7701519859065420676"],["1201633273859352945","15605600484033583499","14845909735759051526"],["13419536445558912523","1754921645376606606","15072782906740804211"],["777665927101834842","328984907399115210","8255207528460808586"],["3514795032351720587","7901301681998719887","2009270468064059751"],["13802812609269891372","12921236954512961905","3069627659814095384"],["12836963192313711809","1578120639925136390","10616046016114099028"],["4763254849017338547","5253293018278585124","8265322475125513864"],["17844517562543332310","15625851662284311567","16632712308820605299"],["16698678937687820222","6474225293877657047","16487315788589663828"],["16497447514772804667","3290198858638400877","10688138097125925985"],["6676384925231060383","1191987021451619990","16617453626071689211"],["7233872178672298359","6136460635540885187","4531266968858567887"],["7487307336813152517","8467854330636042242","10871538266732584630"],["16174213480908656255","12315056335561182319","7606334101458446380"],["14698988486418768708","15752071523411213462","15200385112379371376"],["14281663154216662616","13890290221247285398","17632752347891346120"],["15900636213954232619","14093948219171986446","7906069297785342150"],["16868075715450084390","4331474638518682777","3059376387245275371"],["13283213757414485016","3032013293813651237","3468697259936632972"],["15738809649845479932","14145155798949732274","15220139227743499301"],["8262868934563506940","837742602808355290","14908088333940909026"],["4673705256289905133","1477330620974652367","9776163792307023977"],["2276740138905129158","10507863694680381390","5516613607229204247"],["6491648521975379137","13567334212746639144","6640883736931707037"],["16748222977104146700","7350170539988433972","8035833428224084020"],["12596343410471340286","940350978711377445","16323729286850196997"],["14201787390413207340","14973112305951953784","15335611770579473622"],["10200496582668164113","2547531714622119919","6914591406648700731"],["13349529103529105193","16656975086770637300","5896084577005592162"],["2180255935571068458","11148145144920793267","7530412986593664344"],["4734629864373136430","732534264058223050","13455783085441148635"],["2364061638438684717","2704373591210948040","8679904311941833915"],["3402399663564783102","1593300398645635454","413566422806221146"],["15457608154929528660","11108531653932640830","9671335830954777839"],["1709715809503047823","2165411005814389477","11690798181177088343"],["15730386878320257890","13685517083773223416","1965664463245955013"],["6397147808766933098","17102837778201655629","12429149401025154508"],["9877265685479993545","3324075196090921371","15661414256854914379"],["11630769195461633307","6198887577946061724","5257988667124027169"],["17486865828419037714","6749755147848721676","10356895789404372226"],["7958221286063082477","6407410437361104704","14010876589856727321"],["17279269462990815648","11617877385201455039","54177475540267792"],["17679305219544577440","6175790369863466074","6352401775807451991"],["4896186763950507976","15135639348515538916","6052573616666658347"],["7891711207294605672","3421837015031134395","15618155631709576392"],["8624023150279151146","14443166226586210532","9975928686647332217"],["9898620669713141836","10520293794432892936","7648814577200674193"],["8159255962208409601","14203860092179794901","15689104191900850018"],["10876549829820773089","18401449414454981914","9927999176351100572"],["2674608379485142825","13477521225764640844","14623049895424014340"],["6151629408325558818","8047546424992240080","13525647796478280105"],["508891794067684534","16680422221616719810","14372455606333316706"],["2502091769827981708","10565076315201622149","5732777418371644848"],["6007493949957560022","16875114690884357114","2484242109333809427"],["13592411536026464607","11315372279113045446","17988946869726961998"],["110591787450865775","5404121858794934285","4384110541406981555"],["7512508747484050768","12820178901917707825","7224180835377703937"],["15804509773964923602","5553799279985041488","6618141023881783099"],["8523403221406245057","8137858977340235295","1083126587947709455"],["17164051096678174164","14451346458614433834","15295930003433462725"],["11624758589217797577","1639081064586825852","15742821559907396740"],["2558935319289288167","7887918967446045953","14687714203064101229"],["6750545598200052164","18337428854737196210","15357798706252426278"],["7715482784395627021","10828929552957191235","5243248367530836850"],["1401110270970453444","14636983277924381008","6875091754270682754"],["6812384657223355700","1185267232697216346","11872456816467358378"],["123976110109639186","4425882834696870187","2807395976190803693"],["11393108801022286668","1689392847521595769","14400122648056040027"],["7401469743057338915","2725680085886209710","6136146158225715928"],["15757167261895126837","469266977178357776","17851475696858332466"],["17082605546216740670","16491212433887205194","15952364338735671930"],["13072118179639402126","16637931411797475975","3611124766066379568"],["11985469118347002560","15804064423756180944","5790591909675840421"],["11274163018808273970","4797154450136543948","15959587720078922346"],["11314878582028699892","352749613293170870","6517348576620864202"],["7400254570808636227","6520187699841281902","6287996942072431038"],["435170713282036856","13574655545988727255","14546608095063810794"],["9635353877645143536","15850229038917304926","17057813870946099272"],["11637038148183588096","8606426474916166167","15021504063670344300"],["9169707587203857881","10671797171833585154","17159572157442253848"],["12851628861014647079","9180268259401092653","18259229537391955064"],["12524050538299480187","2049578077811670295","4074683608586593447"],["12140139893721766505","13168602817523294407","11607798834618900841"],["18219912359511201692","13575975397851595941","5659245362245556293"],["7535105603513815041","10416368469795143245","11357768805739767096"],["12008062449037337155","1944115052364306894","9762646603459048992"],["3804175736056778001","870212831503002775","14428794220105281296"],["7345906150415970752","13824245827625882974","11028465714452116292"],["7439954515064029742","1416413685007598079","7431681491808966452"],["10466928810079842868","2339195660323382849","15047071065439835030"],["9875907605285487463","7361809584468372954","2236672778248147907"],["11922067117714274387","4263994884522992870","7700233127744643085"],["14997482935272904498","11900442835953034131","18355088115057431281"],["17112192923373780247","16259923308801614449","9045873616209103668"],["8947059886294766003","5104203464210932838","17220289067491403553"],["15689682899884994057","16738299210667814204","5492901970956917476"],["18159099184337491713","17157641014650467786","6346090880246691755"],["15812984221757259138","7497605323467978580","12417928379043054475"],["15343513718927321002","15116688732099674998","7831851425901381071"],["12109394068312599230","12222605233180095735","5166283207837857188"],["1576530962049834062","8783729421253749713","17831896862525849444"],["14300472954184565056","10112028639201993978","12306931550938029105"],["3850542668878842325","15997148286588169717","16837281502439773195"]],"s1_root":["16657771014523910992","10185564840378908405","674636467571786013","2131595902367730077"],"s1_vals":[["16303331473565240024","6580201007954126054","8781891059914074732","17149313752796139045","4661836524014768048","3171926310785827287","16403213363935983282","12520863100498340764","1208019249637402928","386141996973136860","4198510508924406326","619984383865933972","7885401059255446820","14435740297054850141","17785516352057974754","15924110167034588674","2033619928462388833","10240724876256929603","2621725099734039074","11549517305578882184","1418384973803339919","9984570116099252785","14306174331553186768","17978970690534445463","4229848767417740649","6540614140553279400","12344213854175926434","18394278937389501200","6161754022366056042","11702113570287132529","10453481336289243886","6017820764306393246","3101644315310750435","16042436081833263154","15642521863101318709","767283676044728015","12239087530371646980","4849713014972002255","4408407458900782796","15516952093924217025","10422696146346274009","8129561001869853953","5012286433837574991","3196202910493556896","10813371447904580157","645362739127155321","2038654983137205956","7225589740341311011"],["15974852221030763162","2781705956046055754","10948479985457500703","5334158161480865228","14816942317733907382","8959107530041513927","10582222179514698746","11888584136616075256","10556132138877097976","6336662913087596739","14304941885320485995","10239707956863757146","10413449241598916620","17080666811431532477","16563370634380477945","17006087722915543323","3502211606550846691","2082067598604497458","12246156560953940005","11350267301118839398","27020726907845162","2540326741455940717","5769660697421225302","4111876726076306864","16605163724774894382","15945863335921862326","5840154341111430912","4146593349152507192","9910917533685530299","7394299512073731243","12495394068436990688","8290025615215269170","1387927248145755110","1209074864086013230","3461372728506655509","8554440088228142867","13578838187462125352","15741854149315071197","1838423712885960677","7673742567413883977","9721976329706973424","8891081242262169636","13164599164207445991","388461070088028372","9965071171576278238","6183434669460658700","17769502101134319247","10769285204054577526"],["18054375516212268819","9114314893932944957","17024438846435220997","7017624306054692684","13393211695433347359","4007230217089166998","17177290481052066651","11805906988498484025","5021292534955355427","6084578914447476319","173223284549484953","15634529518988964256","10093805456188151161","13986214437712787818","37001561251909563","5315424940043232376","219863887649712507","10398778186289107082","9279043729234022332","2267895320917768037","16147700312466235364","899615034608597862","6075364825379288556","15604415037816797206","15437667934715772081","16022161702978586333","8349543578478120487","13984863930038519597","16938508668885909717","3580912533141497266","13439587928135188311","13731541481802210782","8423854897312042726","14920126405322271445","3350264488585373381","8579821770512935551","14764378958405301435","4078854644293103072","7669387553246008457","9773783243313812603","18292783756397033666","34998480054705723","13024916803726225619","10167911110626465110","18271329220505302327","6596657702301105243","18034465500655260150","8899394670770060842"],["11424683918281088780","14216844276055740673","8906823716666721177","4269520759275080735","14647960907553872252","9328234744046699709","11373025357353329019","17517280902296436098","2009663538155324655","4264752452693356210","18359307448604178625","13252316602466683677","1320736104727368792","16273561600635434094","2852998737817520340","3746338726515978258","16233458889452118195","3862371647881488148","7213512085144713366","17457723248434612403","6088846978538602497","17340794857476334095","1050226066780770319","12629242675391162392","6632304668758686342","14917468378813699380","17761685861885329752","16416160585304556612","14692362481706224675","5628743722299244956","15401195768688104788","2449647886915877739","451500089543073391","12035169794044564694","10866390623463037269","4267105853424748971","16442147055170281266","3094010261412420305","5392119692138309018","17725018141508333800","11376481718000145347","2020765374327439335","15079067565298518875","11366682726199699974","7097097471261323995","3745968563502760000","13319636981672926622","4290520020650630981"],["7825954731329643125","8370681957190154416","8185234848395073828","14836149892397886308","17084517486272150655","5942561714425748209","3937939072261542357","16699513945823801190","12922080305839834878","5460690513010428714","10488508461539007811","4997709221977716711","11187380869178022902","13342098484426800851","6608448420503233235","10819664122522033380","9827235726999011178","4733257269863364611","15525976178019366129","16056963169647149070","13610878104133657727","15219139549060563347","2891731903936684354","8725642396166685985","18329418015035379432","12001490348009620260","16011578276956436111","7019602614016463186","3531205955591930694","17249097165678160052","8488194557765995345","3540192097112032864","2306493442623331030","2603944385212360565","14564947693840473460","1195213954697256976","3052887094394904309","6890883979869693964","8500427845111035407","14231793022815656005","13937985544478890600","14584244340092122840","5521918654622655878","17261726224494742968","11297110032338511898","6504376752947920483","16922469287502803639","6841208769984678272"],["8829103356393821020","11372359537548054711","1761256504695301384","15306927592297648493","6595365112122381055","3376134105335509341","1689949298541067831","16076450822134569999","18189226009684564561","14359714767509017753","3562679970429892891","1858952891232110923","1144226120550773078","14343543705658973031","1752920170323210139","4225500601411715011","2209180794049053032","8533829355317165687","10229641663193764531","17903737306029697611","13613100164861778547","15054703313211025820","10249401216157366680","8699727781817397420","4662383827243547256","4014576750186557799","3100466271808374036","10985713125368092454","12075153855110302609","14221937222158242601","7002819927996838023","7587043507783061202","6435141490586167080","3783545983948311212","11006437517780680326","17757170498871035685","15080332929668764258","1021881213890707675","18002612410302551557","6744382964884745061","1969617198346242133","2496009319330625920","2361618247672558399","10809017422084982662","1736676400319257893","3886644755218164859","13932393412375385587","4645990350538633397"],["13543582211529587752","3499945878462957442","1358319345870653240","3308968648816778898","5859703183574394480","14926631143576606126","8542301675337561258","11021000487077656685","7049000832146385446","4566148148570465225","4506163545190590899","15452797275982821546","5628825583050557570","9313118424679555601","10659683030972387949","11381314686272216183","17323579055982338032","11234438176184985069","4265524754896906248","13340641981377600699","14549405787311836775","17092115211711646856","16943870776875030222","15354882096589652285","6973543863880188419","17846505608358114020","7452610374670669264","13039700762509905187","193194941732457267","9251287188957944245","10844205292510545710","3468602275868285868","4552453605279807345","2512560483071114875","3765839368840765145","17209655676286852677","4036317376733959737","13364918410894566714","14763188670504010334","10643073861301263822","12390643693904324696","15549446880842827638","1520763864595016464","11141388186935180460","6579631243310500509","15210754485453206319","16264040142241199739","17044903270855449315"],["8498304441395988634","6713299989295861862","16363742126094457123","828352857672303199","10557022757340145464","18049705286910150547","15745624053907402191","665815695478498868","8134100881523227431","13844725713709627259","3572354765156382249","1625242098377349027","2514102919017887481","6274207000177272523","10203929941436551557","13175344022585877874","13790796828980283887","5369270435985776007","17607178365597236082","2188036541689133369","8279698066428677669","12825028710489391967","4701173930635458289","13846392395204402937","2337212727756439870","7853249204054213873","15910275303834459975","5626920752200305498","491263256439496181","2693135174287935260","361864305136546555","9498246730836351143","3860198966804003724","16312519431282870971","15102047279352507069","17017321699851961801","3687213107942930768","5608498455404326195","3307385606767246543","12375433009819142274","12083160174252630838","16519857116683611192","17009983377785427404","14853736319020736356","8119768978955673859","7037893516724300914","10432414349928808672","16743148197382255847"],["13420735461662584060","12079975354430372351","4523161098005183084","10791214638869252432","5603208383544645395","7659386202403206076","8605359825855095955","17577989218861523389","12180934427171771747","1315844970188506918","11727442992929057606","17608165335883029303","12826166189606093736","10309392255526549078","10798966096575923824","13796002809666606917","15272755801053945725","4204747954630604246","5686299399312618920","2271556450638173648","13362523397344499349","81911503581235863","7699731919082785740","7675621759026397332","11887063744976846771","3253354224414277179","12760964944602399531","17033862233770471238","12517058538187194030","9194243045515903955","14527310252279120018","16422749939085018459","9983451668234389233","3702816388282831111","11013721203298674802","5707618844522172246","15381804717843173266","8881820389756559460","13937588426031233151","12082055047610629120","14040988164322707909","16448287683755263955","3642341266066272393","2941432833987248916","17975909948813422972","18020498025844168604","13224672888766596477","5701053366211673525"],["15078313324476020835","14827748887895205511","4565430603667221647","13780201991490355858","6676318643620899638","13951681227415169936","15396542569165259700","7450306768589198511","5213983325286009950","1452567074696585703","71575226634813539","207545260216835539","14325215578665492662","7763781001420416100","7047108601886638226","1551202101475018001","10975316535082417774","15763166799680098734","3339005474311495566","18325250768833568886","12474643910190008101","463970264660430854","7685675801416381953","16850640797037231233","2362343851923317124","16384776971581876109","2148312752462017779","8189556542592677321","5567524605019354226","2979999089176877616","15073508273977047113","8342967627615435121","17748628922329149433","4595549424921682708","12233999254195470480","3025844463686128572","10680327514399966891","11009420523572440466","13140566223949242942","10597316062338592162","15695400166244335633","12392147248344408808","332254332750009221","8684906123878960312","17637552142080931640","15560497484241508622","7712379902780897294","13895964451109310168"],["6942970310244795115","18127534936088008515","11840859072490938086","7113777895618548413","16276219568117356704","14843107508211596015","9812672500392240315","6849348380646833657","5300918579096058266","2619947645968899065","18351556311865207919","1442865912000794020","11022727178611859042","4967801959938493750","14872329201606473953","11756487156455303683","2587516686514656134","3712547438152877827","5780382090353996326","6101433897962574096","4710447075728501312","17573815045275014367","18327956081429932110","13880577790475183136","10143939585447055986","6256294189458143023","3921287017589343613","6608592788098972111","4755398862464708252","9629520624684725869","14942612442729524182","11479597397362741320","6839932203978584593","3863943242459881071","14019784868195255048","1032561475724919471","14520137066716672672","4982007044000148645","10466923140217174503","9020301165711168070","7689888326520081781","10048420183942245929","7450708573388193951","15239094869709216762","9000297846018092806","12940108696468948229","4190733183741786341","12848326623881874059"],["16153243295830027724","4732919922618702900","8711169543392587651","737051912219763759","9687761906953810871","17485020376163229743","1636865194727867918","15481629269838463415","879333884802948457","13890743403090736186","9912340352473309629","2897028875893742654","11969406874533735420","13705741279702524540","14256776922897053101","11050443231125536466","7712242282114937665","9426603204818227523","3291292924958299573","2858529264405492619","2617227278348896687","12419148428800714523","17013858238152942579","14834864404692486216","4393880951612137972","12086415393190621394","16485833153601177111","16662529126474865633","2145443762141430522","2423671569007046876","11388145817365797164","7833879186460763438","8784977439722515330","17039849336497400059","9807404095902209480","9631399140948764128","16683135371850195553","8083555306648426619","14616422426012694896","14933819253961211354","915931225405997899","12227261562210311384","7819462001633207906","16530865005363981174","18331401643899170896","2738973002491977552","8212225137030437910","18434501397669991909"],["3721882407142638814","8498233857529200711","13730425459158229559","7360424453510777987","8153695594537866692","1794442012630301157","12506789987298475241","7092463874548007824","4651722820779820866","16915936718977735641","10053262607517124874","1347876229179355757","17229837526452178612","5686404031256181446","18133691917176371569","3394514545169665440","6637653398340417077","5852630687582542040","2457897906074771798","2654557340332506542","4342738270846441833","3135021547675565681","17393077234799030810","14679132861489588931","5055296786875123184","2092361166259938149","13394325467723727382","12894898834958918431","1811077518708735173","1671827343014287241","1547301348605325225","10536659502339401944","5634114458192634446","13779065296733809025","8619922114737922520","7812035454244561272","6249640269697127806","16231475278917242742","16103254790752263477","750845313194477149","12451044022183500969","3255149135709866250","12404227782512094210","497068534001319041","4080091285477311356","17621536802394655421","15082374579238093378","311656350115031245"],["7813891705900515275","7783906953864886364","3236754527511560183","6245793195851464608","6780416577015112495","10820514106645071895","13323927516649458410","15903526079811225574","4061573275652125197","4872557336600823776","4179138443775625479","3575736754483968320","13477247402344815402","6326753529191674590","11019189702828342459","10047306141553902997","3296620465286869119","3419189313082990495","9649217172804050632","9864975394299564683","11211444278121209794","11326891366149500453","371618383302485276","10061383169601900422","4750070259167615649","13317704065115665783","2606093910203464641","16087692954014016653","8194717332119302042","299635423534530378","15380879051217443100","1461630355851188999","9139123577034624301","16941986176227965380","10121588930989972369","13204307545490838142","16882358440757600390","11371306607913870412","3494042685171308271","727728522991377283","5182134962768557501","4905178436822629418","18343068992774962425","631995490970979155","15246845396219947084","12310068693565466463","13870707428954582249","17807226278068883433"],["17524327217966615612","7103194014690210677","9543563934018667593","16273785995016795120","9780812792872945651","14696243978145713340","4526054011455373190","9111632021972082209","7334127750706916550","18405763988650628264","5172667774828924358","404163934264038929","13782716595889214058","13389299521306642852","2653333965485726814","1778374183691985751","2955184705077002259","2282581533440664210","15035844626369212130","11043728296791369194","17005206554128893134","8848318608831999861","14619782875456260436","13914836264754514039","7245298999711247933","15910241113203081945","264440215069146003","16653222838163112437","8834905315933389262","14158639514471489983","10527157097852322819","8354999911727382431","2947779667651194578","8433406512811407179","3565614860449954329","12846033780811006072","15567017813631188095","4327401850964932867","6143887464757521144","8357541599926502452","15443639825614970713","3950192900299019804","4351957148770759611","15890793910144271330","6947353632913236980","5820393206264317298","15359323999241318414","1859735435731909126"],["7500293597390686511","2859052653658889084","15203210688575821380","10480731724342168959","13886679256490206752","1772704832727324618","8866360114685073284","6126050513977597170","17021131241893525278","11940211453443746850","2064164240928387413","10395060555236702952","2122322965375513318","13767873025309123630","17691252222224470673","9379831415735047917","17222228801908639345","13136082047654595228","10757313930119844825","3486242372743478670","13003081615934092528","5111952955471066347","7209103897291376054","13062947449451983446","6246912839722733576","6540050207242887014","18181987444049730002","7847783192865448077","14205264749231665863","17985128803375537456","9736669356701113097","17632174197165597965","15121312243541942466","15985071697815106271","5560228280937564707","17534059219142287539","3172589411593040523","7569120624857935019","1836657827400266408","11878128520144946080","3845852718238464662","13111991615818385252","11023924859336683010","17394024883109924250","8105685309238866744","8584841670069460258","17732688026534449699","3686906982914095674"],["3482380861492148978","18180077299172279344","11774111733977281277","16858989753741687951","1452212649442191204","17266015875615573142","1287851321644058784","5028332761954307523","18157793753726082930","14281722010949162419","11459739176648334333","10660533979325181370","5136319520089067593","5629775263556334856","13050313228867403006","9286030617653995648","16758346723539169121","17585387171849854564","14505020505114452436","4190167503418827360","5061950370024525503","9533422336283572766","2540961041526242903","11451008683601651971","1876427704564356093","8591620848655045245","1347753216983653090","5570851240334706593","6085207514301556994","16205782070707875862","7745561126944341945","6474334769253557438","8917818101338361145","16728929506323573274","127246308444776388","1795054419318187478","5780785157465396993","17642338664535396741","5494322440805808640","11628166960729103552","11902238388490944917","13317758025862378449","10461962420694866907","11023716555714660064","3937571382259714688","9613311401128772916","8019718160816679964","7476782097508862855"],["15284468981069534833","5165175722983436282","5236076196965171972","11751525068638293414","2234641441761356661","17152989754475702040","1888856317321475390","18071069862227415607","17743748840393518076","3901235317609551594","12407416608687271180","605567590890297485","14930446263702868239","14979804563165377563","14384089129375134486","16499378560319385766","6627625088596164537","3690111875269612318","12252827319988175333","2272524092683429154","8981311205974744072","3702732976713455119","17516901336426284186","3481831250456844154","7908183709627908400","5259637518670761336","18190514250497079035","7018834815357411373","5306788295538599158","8404802889725347554","8784680340162361404","12090625274217219817","16238980169675445355","1433114470350747264","11993378737803516181","10877852723181835630","16508388880673703870","7286451026439708612","10202686587873366452","368931143188778649","2658471124272676617","169958118162766181","12892533302437464521","9997739541404479342","13412075678342145765","3989380300556746952","12838733785222799621","13577374997426345632"],["13317422768375896962","16954939989935763697","2489958086982401887","9898050327932571150","12146779963789786243","3110599778213528191","11043803765918862579","6385277844191754223","1162831875343275532","5467198447535011043","849377113695075980","16376652243482575952","17161708320268914475","1669173219476958414","4200765636801898430","2149716590471208066","4881174921161399694","6009465158503563584","5007106199926308055","10558397655523902063","14797734633588564351","6931144535891931513","4621536899638092478","2443266575792816545","9126186512417768211","7071815595273554149","827636379218814766","6183051585083342679","14252206575016276410","17578804605691078812","1199592394868938668","1267181134843116122","3645976038705398881","13723353856260884472","2181476136608783223","9378941083803510096","13157549887233780854","1131087787588036683","12732862032848517024","6513849667159855298","5076308660634478634","7990949287150047978","16778530594445115773","5664571723851588780","12115344371019563548","18330313306434512707","11023811188747082850","17684631394850090644"],["5293932290216270418","4866588786470983817","18148926965689345090","14852670852641134693","13650307174440509922","6607987415695728902","2866639701910781319","7782182544785984104","2859314184608542110","3751513034832219443","15620988668845904421","3373996658462029763","1614700373554185825","16639886077277833495","17780521797002960661","12476339463015409763","9220737669130527075","16037782579411132678","11275748005931669016","870573399049288019","10160980171468559866","609276950106966674","11202658429428871439","10822574548384683971","10876534707529641622","4194543632513193252","10157960560990313893","3102352305868141959","11932231883528556636","3502124600626801439","15994833460665249814","14018005842179596542","7079442067678439599","12420740606536397111","15016430016934953784","17186844204570188043","15896072079580082454","2030953623875172109","10296087166048652651","15577710180553133703","11226421965870008125","18420434035779221493","14891561174280213056","6173558103726221177","4634653470364837226","10328992579611813988","14914319909283295001","3255460238958001478"],["15247103539670974827","16130243265553432782","11804076811802299987","2055369625417678118","4974900330995303305","11935041484210781540","13365481006772391938","18024274416722536787","6878449631852485622","5050307541409764778","13919964831664852633","3630048976113026357","13660984280885049255","10947223740203056380","9334416183773521176","8786067509931162135","13773450006385546970","3567822938553919570","2036451095349504429","4811602326327646195","5184883003908978598","12116540038943711814","9038259355852829626","5895532112402720848","18185365686858618384","7952133852884629623","10544377683085144953","13618037380779071252","9597408377484024151","5767406318459760070","7844869184401287002","4090502823742668672","7026057007201194561","9030383131311117895","1301577368806039094","16375150033166121148","646318838817457034","8694118439213365334","4919847084482374144","5618749950946930662","894838763916542490","5237827890158688097","14042478583114816100","7625425584027731198","3907486699362876500","17472996575173198160","10723259654008142989","11183540182703795569"],["3636020629446924748","10419867287718986205","16587711409996308388","9980723004006837991","8569381201893882513","11003373441022885144","15151411216842447607","7206572792347718950","13514635186804870601","13997709973776519288","8848795974416316740","14679325281226400777","2363600012515607877","6506862734947458368","2116732650832736961","8455371746492472679","15419910495886055625","10987586215007797873","2709534565546681718","15518805529805457086","5985631990791931433","6422782794348076881","4088986050700575987","9138243370113180689","15543291813762179564","13909492295855870476","510503234868295281","15310136581930765119","9952040398201656711","3598126885507199194","925976286458124875","9972633628555437405","16309969585376904669","5517463689926909225","8065545022434845902","2415014411372542737","6140952142550875436","1330534377294799352","12333682830605909010","298006773184828258","7805013269104835622","14962977166492298506","13979367257074065059","16553934749008502285","18191210830427294773","15140023513350252711","10148618955448198666","7846126306808158379"],["11790000260144153934","17950966044878828081","17689008466259330150","17353088820578137923","2274043793875452599","235039582067038342","5997180293042607687","11806621120821210440","3991389647213800974","17378999540716324910","11233582216967129892","11580064128963651623","10955383447921398967","13857308507726980761","8191227258813509368","4169383325855291234","4557397847468702826","15135210548422474312","425979189092536453","8523852549586604995","1833907821613467889","15600846501846312255","15228416794758015261","3748865668229159358","10112921881117602136","5141791765663804518","15450421154562427985","17534519238947401583","3646220658113730945","7895588285232685351","18219594352654154842","8241452999315896482","1346678074553595547","13082775278605549868","18179648188569836318","5729420419980988189","6887125896769785638","14939862964072231381","7222098398832563422","3652835333519361602","5696915568476889036","2644900478726759655","16569423660624874544","8259113271964783894","14775739862678785282","6288478952094441622","7693540414505251464","15375876544021697971"],["13368485166176579661","11505214348345449439","12661111448727126735","482191125953289967","313213677265208504","5911290318458061784","13531893357426302360","750176844038216302","13067074033240748463","14389737627835819662","12122252578665909606","3123164356875369010","14857381309956383495","16101961287096346347","8978126537487623413","1996645875679556097","13280434344035236145","10043109563129529381","7360110498150852693","5296242331640787031","7966203293615492611","9089945087149491484","8886067832385979638","18404979013708518966","11129318877644423194","2709393943379844587","3177155242831014891","15205470122531987311","7984741285837649064","16548089028254463948","7995734602921779140","9372279588961389152","832555162618607618","9640114421704123717","2849896730842522749","10736966055020386277","6115269016702508777","1212558869689909755","5540327412284110213","5342402779038340755","16274465285881983151","10671391464465349812","606633248099024587","3263519180119239010","12310309382211499323","17110628700638182927","9755510853209511421","16855893832067458838"],["8806671814910025565","16250871857095988507","10416738461810538467","4450267104812442587","16296531595366881683","12695263365557236229","15649366269607138314","7520173149496873119","17277723691439417984","7485060554659082735","15169658461864985692","3224877580943169860","17316802357895966240","14582308869242767894","10596370367009508084","7194221811565931225","9531902564574600963","6972173065320197704","8576186680756086706","7114618767978699232","5442953585444362320","13452027159893678009","4829909214601223638","2597418636300646029","8147125019049326016","3584373916566117744","2234328467202951267","15579645875049990270","926857451071488436","13246779234783314208","4700661609707822158","230691268156882409","5955214351967428889","372057034806542032","9356792149012337518","2189639341478862850","8603259028768863315","6588677390015301530","11251316841074287351","9833981438439804667","841015914473277573","5827757902661981148","10284827950020806374","9446959958906135264","3537670702237466829","2880751670584731183","13717366496230466199","17997653160432567504"],["1790672742854025944","14769185545233703033","15250537289848634556","17623187296683461335","15861263057016710757","15268698092929711501","9435004669741015881","138923569493133736","12465631617585107050","13419667699640015163","7175929068937592708","15583502744904149871","18279590910786291281","3083971807462421273","10824633769898905039","17434309979368970800","7301591508230045068","15560254324423248377","5095935334163721586","15397176363108958902","17845478009962803972","7778861226634333549","13180713316680255056","50367126520707372","14862139288406185489","11197169353070057839","2130357339513113908","2468359459095216080","12687597266491143760","15812502095369696372","5413593435715171038","5990043935518679206","10097440606321333439","5501215356059110171","9340759418410959846","10584227643916566740","15474115579522526876","2674107003662684316","6930752778952288844","4790534873909096939","12027503201753007936","5245603838022401949","4022287061677871181","11773121684293433615","2006612957228796811","14860633961329760035","12113448253355735797","16022790279811904014"],["7876622338341103635","2742833205420128845","4998951192573558616","12943110235990846292","12156733622729162431","18014364117079259544","2606095558364649837","9454596981577580395","12694638183081078361","6053433240320943311","8646660405390086821","18046961605096222645","7998643492743064402","671971354718324190","11189606061737202841","13803451478757390578","17725326079361065560","13921797498709828756","8185870968010298145","8532241640188954455","14553065419292955435","8538835833878315871","2607880742358861836","14273464750784482053","17324881705278518039","4194764252653333936","12618104791310322815","5360127249315227319","16374972420155746355","2004840164538109930","17900017246175872692","6759065361372363594","1524868768929685544","5604637720713403455","10685952692207292697","10960581554642672216","7942683804431792587","15595185569929151333","3757690053152260356","8451743055815244172","1159611155516365220","5334639101672812530","1520566958300268136","6458126527169409923","8480280453739884562","391121364141447666","1035361039373512712","9585147974825220145"],["10305055910180204057","6427732558045368164","4339435526755767302","10544493457776378933","13935080120592481389","8651081137269373294","4119758716527092928","8130276987912745694","10331658865467891548","17953477611515206347","9867961506115369437","5068246171855532679","8927489455629471593","12178719349316041827","4252919973802836685","2428635494814489535","9673223490551437757","15921866784511371487","9340552168960950425","8407139028596391236","7215062052018660145","13911714832250768801","358926100466526091","8263951363084969475","11502025962193058041","14684171111542219401","14833409341227440543","9160938040853248106","13790398087955025447","4433846840480265530","14524499794471700865","5858134792124184935","15999258814039532549","861345360356675745","13087411184291939618","17363593114228202285","8462982973142067042","16639816331352892808","654228645465507242","579625238406236740","6122130660660330968","16628996105041564089","4261066860798917558","16984804744344378328","15905593857792978263","10951882788672428903","11346594642857812995","414907405850142493"],["7885519042920282440","7046592198075369912","2280993823941502878","1879851481747237775","10410878879642458744","5875288505832925727","11431669322577310674","13974344586616338252","16762542363218319530","8419626490126447267","14747263618750103105","11725466409290653168","16910498824991984306","1078098442131696310","8304518432796503143","7230815142376162153","1943927458016764261","3769283985030564095","12903295294596941058","16719451058277399292","9715905143917576357","5581341212668182572","13203402387380909340","1035015659003436317","13519952677742898475","11889919264754167637","15090976797184474564","16345858208196693266","13751324890701622587","16995157084069315108","1071788438424350472","7646707450925216380","9562492029903891255","6699584906050045764","17868257351390919265","5803697832134708084","12945885492911103781","16727589336501659251","10334833602667881018","17347358525480401661","17196647877153090054","1317392903844107861","4484904584480038270","12851273552962333726","344126713070944373","3516405855267924408","10383447921689747588","9846402236744045099"],["14310876748037083877","5566838436615948810","13574751851067668991","5340314523153464322","11863559197930326445","14314717916439928480","13308566022885262942","3101191223223943972","11385988931266393047","12156707630438329962","6906833770644752058","16124051151633485238","3663943420164900124","3284767006621213879","14704162669406733943","16870283804010399130","8703154490942923742","12623860214354228620","79519792975576446","8424497361250933058","5399481794012393199","7697214546119460585","1088303509471453759","16816769614917454265","8393321662569800496","7613645827453822622","15787168190925531075","1808057908916766609","11950524747464385565","4777677484740002319","15477548104831149027","6230637168987903582","3062440851954121590","12760256272906043617","5857313848399416133","2783328571967810098","12047037173392221754","157887361558110346","15692671888276854715","11979744485267200823","11302969773947461691","10501452468648960123","9117775523985990728","2046023648833062667","11435058986013504823","4072823912032208855","13898725749468301176","4349269085659362364"],["2959122654505371502","13925621510708315194","5576533740985090072","11823394940869030573","14264120346442338750","9597362535728623257","7527450906073975053","11907028938581665473","2262240985835747386","10570024373957535822","7334034757145397179","13026562264437668340","12203329285002711318","4935447311965146640","6220409505239699458","400306922751516698","1211575998049777818","14765083606992764622","1928018886009948131","14596584322886064806","18168504350295539026","2937694702684762249","1990280019832281124","14643141607868007088","16678945677272826426","17439159635060675858","7444050434362360494","1688185408937367551","15278606696691844705","6765841117965149436","8507305128389199643","890119208346203909","17207067837897289009","15184032944259573451","15120854972015661178","18270632402440063769","16938267270270744524","17328995249660952900","6227762537173953110","7307314507166907132","6297977119305124551","771825016936797887","18146284395211539724","7631715088406567072","12354144869024884681","7238846236830332869","13148784056411168898","3194600695170698277"],["12411115012734786147","5304001541293838796","234347710058012068","1015091103601664668","14931523175276892376","4047661537204323310","5221986248794603685","8591909418245883002","12760721791360306897","1345485817747985711","3321795368245182168","15274251093567799548","10776797345763760308","4780757558683326228","10154458936250835028","3466430699938386830","4253822555956020627","16023969005102949554","12190099758504345797","6728500797483761792","14766399276121291837","13430068900269539782","4317773811935252358","222239642087412963","14565015527934319103","5910730065293605754","12700307139752119643","4241512326277743166","11301890785255362411","14413131412796999973","11971620992765887340","16228335727407825724","928771690984293246","13568326553529914342","7373151698166462592","5965873933518333664","8014041883661617914","6492103563099364002","4008393402489964742","18111912153742128764","12993212686543116952","17235020171794735347","12258143658996218646","15521606165986391718","392488611100159056","8265178751127220388","578798722213506124","18071549188126252424"],["11008371973188066367","12141175706662604499","5930632597904891084","5407996148604189357","2085547030430764618","9344173413158126880","15913413783313874241","7576354873037410432","15157500881195684253","12545399704092651826","3363082977914385360","15127899300239002386","8101948869742068431","5250843071909873642","910849355439663523","4234386810477327881","6870945600203237380","13733121946913271749","9565035125015057080","8502211807880034748","5170408754195254932","11899986304680394057","16960294202784266330","3098957606288993798","14958600322943007206","7378571779081793571","5456865643938168456","12662042445912086488","8301593372927058205","16007261858439463175","536731381560818231","83295625489416880","7488467922628037632","13325962689813179549","3307397597293561509","357280080887135735","7754935075814349915","16634787309048217218","11902425384561461792","5363572497308871579","14634864136334059917","8773551757422665647","9585510901491594552","6988685729897772085","3315067483360872817","7049143126201753518","9709397739057520674","7019965020301356696"],["11194837511686580069","2578771552171834479","17991763407605499309","10485721085076939029","6076693745559261274","1694287608645263332","3384492248209043063","2749051119386230025","4899783442904235742","7103146515896561588","17807059223677804315","16940156027327299123","454470877775182505","5970412506056727940","11288960694716354752","9766910227311081839","8543990588241067012","4920609734395482741","18409446891389763519","13926267358802247124","15416858577159490101","4785274097047174567","2616242627728209218","15807633666463795345","18420215878396244665","14113039225612447185","2030992648403607680","17222103746987595650","5393875111288620327","11511770862811964583","14416432459809390538","8700331306200450184","9654375757145474705","14101041706139393606","17221717581208296873","13029323690174384228","1679768584004103036","6940149761853835432","9009223868579569305","3416888397777917059","4454521792701122368","4027584839591394935","11549172737605798275","10002691090482492200","8523338758498099358","3420086028586237727","1616170967743289276","11062170954300798791"],["12398147802207738190","7380281480056646446","17837395098641077996","17655520645926370130","6138016618959248315","16045929918947447746","1528149662570111097","9867993378380207168","5833976392349193499","9228637326989206342","8396243476961466349","1574840503686507043","5257206971148395228","496290428385108652","6605789140588402660","6290952624749582556","10654204912417642040","2476397361858853452","620765027313944644","12500276945885367377","11820029185928995954","341933968240187834","11387259529500626255","15794662181046402758","14485014859710643658","18355691080457007664","17427499776101844446","6102403594836169064","8227432207822505760","16443394244750282913","8798701653801873205","17906940242746602984","1507813837507473805","9690770574128954690","13757965989814459819","15898219826495066041","14146060397489197264","6762849850746998479","14473220582115338219","9398310163736337951","6478878757683800927","11179238965385003366","11411809438570637325","5269585287838426009","4975508880611066505","9471792680447099087","675573652913744778","2629275369465027835"],["1106309696072427779","16960484316936628897","15768680893631171200","8737073516257653055","9869319001108883308","559019466157084483","10851211888134199267","12853898845007534512","12809220916929461526","6263880344967616785","2840393908539895249","6641105254355810240","1289723981213184868","10775147230768475074","5348781832919249795","3139073460994378701","10696935727730313536","14114799083382084120","18204730099550783125","16780165693410453628","2980199315026111194","9674723571328712007","6856808833651294463","16130762297601676819","7338769670287252638","14651344821017840949","15353824179157073233","10031223901921102513","3002364612069183545","3497067362478642039","1611894693969347847","671571256721911511","12702682672891127853","16025363841199892599","15033795265088145037","14919250366097569263","559674374944783825","15000626457808385760","5254644750962047250","15321687209157961599","9131388213454058254","385756237626167286","9461659955808024992","17229941256789299874","1254059684325178911","13390230052773227239","12483870872781640267","16561956226408608000"],["15561621953799475370","16565515876159025053","1505031081586672249","16536224104293473592","10989219155175526213","1760498295298428453","164616668185966386","9135784672706838165","13162153395901463993","8807132754582649192","15242188582884229240","8301893487503318602","6154492807497415479","6278542595745068805","15596468585901831390","7083329168352086521","6890882275478936508","15648030556677739494","2406214322315850941","9333436349952573318","4699978362466484811","17832036640269316657","578840022456276603","17994637179386326537","15130277990117006023","13536233404963971706","7449654290271659519","4639956797427377628","13762852037853101247","5069321407581178287","5574877038373766809","5257875804083110926","5400323492079520027","1114794999906596095","3453958002866792357","13144801917601244047","6328050628947590069","9779929932046897081","14013317452907239310","7812970653911714636","3608114714560790495","9895624680955440225","8251023273120355790","16989585259916976070","1218479365775164988","179706240459558931","1113358181334929264","729666715314305846"],["10325356856187648629","979128631542442104","16213068874497412566","10415271456415827414","14332715027543906157","13258210798368432785","16451747118922452356","480440251603227517","2342756973645113954","16400380315407957998","7874901462996698967","418386044279230937","4944113357856965947","15290609419102743462","1564316650951152919","3511232487307678774","1948827215551232532","15402029676850437310","13465604951531568287","2600744353425969192","9352531195798245449","6664376428721876717","8255546563205775271","2485869530858084342","17178183161309951292","16782877670983518960","17984157002917521693","15002285022834909151","11310658722551948060","12306471176087908025","5023229591825771411","9779904396889985657","16440801895686940144","9869769292160326670","17044300244844345960","7579876488183528471","12788926391104085025","9570777100462878025","8703429329852548157","4167985068277935293","5317126701424728564","8726308426257673567","2548393933873877753","6410310472527003714","15170686577931220360","9290701215249830610","10878723226859196571","17882528760824994840"],["10194720142680971760","1497860527754583310","14059945288062450640","6905523515997891296","4585360625298526158","18185052515618635629","14145123429666636533","15845225646954471210","4388669328870738007","5948021882590079101","16516306750089755134","14041373138637915541","3769944546350304935","7191250715903439846","11355757432914481658","14667821875135417812","12706999737511647067","3892234572029843092","7260727498392782197","17451503138099612718","7049338312964922456","4348567303000150429","10285237710766891619","10311297316697294120","5900388408956287528","6172609294514854127","18041674420002614749","4381323870489406609","5522305457330301589","8704329771351959633","1769388767818579418","13271389121341299066","16351014170215148956","7617528568786599970","8911731085615714298","15055002734193556528","2131411375315141148","1069842841564340179","15098743371524675184","7145096643466251461","5138950322589461720","12052861625992836585","7929821060527896421","15818353691996281071","17151582787112143062","10660542871093861815","6960218912619118490","375915495494910332"],["15779004624791569222","2286638925603796902","6541049440985293261","10991621944620019256","13920606332101047358","1328358158611594319","1651713001236230864","7024773483092521383","997143507450641531","3537144961521546599","8659350932482009075","11486982562680263407","16561057504878397451","11635643045604379054","15883520800128922113","10967220080811747624","1721047510541138811","12349987785689756610","3719160864648881355","2141910491451133252","125284705410415551","10671705686037978085","2093558851955568422","6593946821478413275","13313992689460984239","9273986136406707303","5183115435906570569","9322491926413620459","4224256201822015440","17042365021117321904","17957705251713323375","1820674347123086279","388577582543151856","10379351208317962822","4089674263682561332","9829114258577574250","5444982575879610328","7531185267101290594","14469817069388820916","8461785683109504468","6946878822393746283","16383792038855192278","6517508700055736932","90888695264670183","12639215508357622936","15064802467478934739","813464684817006799","1751280403819744186"],["15153753099561453030","11205561805768396120","16404963369815514180","11649056751182332753","17544483680527315055","14368495423967049905","11790081956039087903","5242149833978660531","15928296431045026811","925279102463304451","4664331501691301090","12486474719366595777","11213625855478947243","16089068973161184573","16777442169327124733","18058321552462022318","1382564208927642117","10471648053570264596","732783594098146730","3386236595041545716","5231943366219470383","16208216624720620221","17577304301277406412","26521919568062750","16536036317468242049","13214501577432200137","14648885827381439702","9417298252246767732","9144948338168733784","13691850887787845960","9749482357300608747","3649585288511285171","11029248902730133235","17361053145875206355","9351951866658718369","9688435003740161785","13242465645043758901","7991137414789171882","12489796408402694930","12247420857029520734","11806597019400701545","13191738507347366013","5855155562292345761","14400412936140375770","11965360215877597810","14771822144464497916","11617041826485179912","14645712083142729581"],["6265803386337129979","17725042168746400021","16422038659405860591","6333518679154689426","1665155173620353373","15728606993439403276","2685724089321553907","16790970131027926806","4321169169763357602","1807508127933403735","12904116399463057908","9844823389425539763","13897130773528111200","3929784826093403089","4547431854676522004","12677170027001043079","13857452747935119998","9835394730898381553","5332638441242571476","856145925003865893","6660471502908066324","11538023800270661603","3946676720566199143","2963004942429254674","1702099014152285432","3928062083987108231","16306413501503908210","6984477864585019030","1164167341390773628","789650903693165919","7610275294826278116","710141069068510412","2701771619187087509","8953788489993548897","3994970460019524177","1207094437428372131","13097738123202358567","17388860939033802381","16317764944708817467","9735531690939597618","9497139186749972447","8429080808217045574","11144737968183149646","9756429532243308185","18072396771844008900","10426011404951037841","11471417296092037700","15416840199133693354"],["2484345711818745691","12150689422486707713","15575071964367267009","18369480375457570703","525568007718134048","10898966260756633424","7854936215352387006","6988038418841566728","6405182953069535384","5487684284933633758","9524373294288387919","12226388342927671255","9370746481902523079","6806347689421832362","3514358102763337020","6106226303836575319","10478524881958229879","9025792328233141605","17906670208359260353","5253474477011922153","7200285790502801879","3454712965060197109","7984421229087142755","9571777130268892883","11186110732169339878","14328356065397847369","718551959883049063","4135100097341310553","3171663732870048394","2508388517653680162","12068807394610998656","14031601745221459569","7593709512800036983","11989852130002241377","3711009326096590255","11949022209730727535","6911967898592475947","13269099505273823767","17282646299793293339","13473622525770793826","15045034746022940394","15327429816445618287","3908156830422999272","11726372805233826899","11893917413543133001","15074606779545380630","1773434415441952982","17883146730220591461"]],"s1_siblings":[[["16022577076733611193","4855588699889755877","2018697356104173956","17689330893918500168"],["15477346826042767124","15944786711271302886","9840629913924605632","18092244343432207966"],["16346136682695690350","17196070101089283989","16366617720764984783","664470948314480646"],["14730286295645775808","10655557774012880102","2869935340481757386","1826283869878731210"],["1274641517250440417","4389592197049762940","257319397706065603","18168178498209880621"],["16900622279970166039","8508278138947938245","12223141520575610203","2409885137421783348"],["11220670558312179256","14687364360482559807","9152783414682238626","2275393315772714251"],["11129879864620991414","9358923968265384970","6119202178065966164","16634073315224926597"],["14851126915674508057","10751620358136423736","540327502830779208","11147817815692102263"],["13835875634020564039","15997885222778199571","7839936952748850482","7226636378973668256"],["14301585465203437734","15054569918053960644","17509895814287948610","38495265439812875"],["13016977328938795145","7363966688590849573","4121223448339215668","15222709166488795849"],["3799714695414537102","15328327283960404810","13351101973726465861","12726140337175880876"],["7630437868803283660","11677820831840195281","12741644338315000807","15570240570843497824"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["13437544771338666972","16049209883690118229","16438129327395779816","17320464981122142691"],["7461502410739706862","18342560803073566933","1941282092267053984","6421013113525838923"],["16359683347350434386","2909401767785546707","725032821066733121","3135360159247258658"],["4127859774716983494","2955683498555100672","13079049513005517913","2508291797265241645"],["9033197141896076527","17726123038687688294","12825002914831471257","17271055467737587555"],["7819975146835342703","10278668752583104576","272142778651324561","11240642059302741869"],["12268120991276202074","16854131357359166509","13545724048792484102","11641782212062248014"],["6152586645530334641","84519123495795063","15569720048541217001","10838483933303998725"],["12236285439554220151","389268543772459411","14887465991743694498","17783264773102287162"],["12341919621529377300","1519477773578392441","1346868317407503623","16659261424035467669"],["472959359707509820","2888255715946383640","18107082268971416750","11347773493331700671"],["12960624095547752437","4205637182817600530","14916580903341697663","13505628030851199958"],["2006537728239262456","16831739113769479597","9714627045758550847","14973892579647284445"],["11032932166197294308","1106079378731637504","17218762515397368486","8435980379570444104"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["9482958230420846034","16104441734849704101","13039381362524138947","9634332650510518999"],["14503235181226864932","14487699848705711868","10427226895736194010","12381422828633260467"],["7055382997459629072","9229897707084130995","4081585883471600978","1918970746838660163"],["5368255981606785627","15930891795054914166","14805731041555339324","7716213960577861324"],["8642590776245670769","13663508787551850124","17649751475896347554","14763950955635246068"],["4176017416048433351","15478376606894337036","15755494395670121838","9772530318092660944"],["5683740199194770507","12925159367952065714","17664245257636894871","5629026178497459424"],["2877070965900188759","6889216944970320170","8683757299470702561","9929682510948724212"],["13570178684937993061","1545837089633792647","9976930741082808185","3971919819676087195"],["16192285240254876649","18401820373599288634","12313821449583958177","17166017154854528832"],["17757891461499141546","4920909759019591380","3398908867503170760","11122168695266720702"],["15084903088328602446","13534239432065973790","9224593767984744831","773737977355287184"],["7889193391452186600","15024077709308099166","3950803357465469338","17485299379848031593"],["2773412265346801014","11057941775342649807","12054074628758432695","7461174654277549808"],["11768106197675247029","6058895464564337361","7148959511628755273","1289283661516006736"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["18115345473880034770","10013220829147646332","4735339790923281184","15606097423469071168"],["15095149520194949865","3660233216673226036","14433712498356059029","12096977483241436849"],["6717058104898884923","9876138643014187190","1723405084821018877","4121691157827884942"],["17038538143125601673","6694297293779800071","7348641244143523617","6348493846795443779"],["777923223801440243","12191278611534054994","4320659276819438366","4355647622418833510"],["16709089589644372999","5177038735089736757","6995591476752093851","7964899154401029537"],["18029498330096655659","12516457436955564425","10562871576332746150","16380687536688507338"],["11329904519591417218","2587375660998101928","1415641813781292535","16315836657551737989"],["1231531655901018978","9174258885171393259","7930411739935666372","18253808847946314640"],["13139656199241928163","6481638495231009268","15389921827149585669","18399765633455864524"],["4668009073995887535","2295040684166085862","13001214258780291680","14017212814627813899"],["5971316324729125160","8976000515975314495","16432094214932520980","13978567187208956642"],["11908012871072385676","493751014430708329","1628668284594815133","7899707487705428532"],["11032932166197294308","1106079378731637504","17218762515397368486","8435980379570444104"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["4243010911047847041","7906552163864789429","18293200009516701945","661849323524526377"],["6520507166629135802","3091463437239460917","1699710775591981172","3558646669629173274"],["16315817712047623756","6833708543549708384","138873258600227954","486663347775138589"],["7309722334098057774","15944222326245844849","12843545082379046406","1191278355323127684"],["4834835743560464771","13794129967689700796","10906804638835061093","4486927763480666237"],["12294828013346019189","7111497595689973245","10319573725424100843","2862964267611928718"],["10551995982986604875","4629451758367887066","17716021540278792230","16336486014264380789"],["1718619967861458390","3656241259260699971","10423691373107946713","7788196633671117387"],["334223652379407839","4396376000725210269","12082586250951123029","13268229825797469331"],["2302018387486791511","14486278355207652514","12398725996663496129","8510861135168563848"],["14274653702741360402","1079467093399963106","7871319886414057960","2963960373412629747"],["11198856758205865156","10442867359628531278","16760939368977050216","1756634217860916982"],["331710721895327589","11774442091885724121","15347948639718393659","5073631492148395414"],["1065842777653845386","12387371938635582795","17224363510240810250","4069900180926297940"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["9933264697787727549","101080064076341857","10291571486358788384","13581592467666290470"],["845816499927756073","12972653811216738105","13135608853777134695","2924060551144651843"],["17429336282410557384","2656985310641454698","13842578809595917386","2276257235821041396"],["13680131015879870415","16098465932058341716","8854596435112429027","18226052013143220662"],["10296345602438314809","18352726005002256455","18330415501686679607","4609817030017401339"],["15344606614118648595","11704917271058306344","4224804507664338479","8882414363404125137"],["10175895894665684211","5068438715606213513","1234796749566151929","4285856771076075132"],["1589391835097247828","4758861094099593217","6499293407608773232","17209015745323903900"],["7703830390968813657","12683596201091204008","5595437349899764896","1841069439151837669"],["15951263884951549976","9489803881758391583","16376867207611007171","6491947986150148524"],["4668009073995887535","2295040684166085862","13001214258780291680","14017212814627813899"],["5971316324729125160","8976000515975314495","16432094214932520980","13978567187208956642"],["11908012871072385676","493751014430708329","1628668284594815133","7899707487705428532"],["11032932166197294308","1106079378731637504","17218762515397368486","8435980379570444104"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["5214580173762241352","14033428435761206613","7007966472812775928","8527604247431561198"],["11235390715422956943","5881576586752303560","11188852099184841728","12009335065120724174"],["15400995276380828684","15905376758976644816","13679864564956021556","946018055204360455"],["11785108478917539445","3021615562750658003","16228139675647884906","4737989136649036574"],["8472405961429906514","12374855709132338785","6871723990153038014","3426252348975822598"],["12992417463197352353","6310682220022953240","9156917657971180552","13851002237598063103"],["3328661112493968600","3733415689352591729","2677044885696264303","13470521809897705015"],["15513394909363452008","4787710871249868229","14271708908920690151","9339379474035461749"],["667414951425377992","5667747060143111942","9907451886936755552","2361039837165720190"],["4997559197172357557","16889077980111243502","10903805841735271183","10115857772725990540"],["12941490455501979394","3197074671169307629","5928285905705066935","13259349232875679197"],["6663848564085180269","11991290179900201114","16193394304085400253","2326302698437077289"],["331710721895327589","11774442091885724121","15347948639718393659","5073631492148395414"],["1065842777653845386","12387371938635582795","17224363510240810250","4069900180926297940"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["7665152390364134909","7161598504433764186","17318077702255180252","1251317251331764213"],["7158694359784041010","1948710182014169738","14509078145000132978","3048130786969870909"],["315096294286523387","829121648673897244","383300303815170375","16965992380425718845"],["4106160980956775250","5817158478401173291","15267437810786837955","10383950361753885827"],["13248495160474929261","4625497438678064827","5061478770070775272","115307487769951552"],["3270614610598626354","12438842170692414324","929977101603214227","14690343882838865751"],["1417065349357201728","12368179452356217740","5244609195043763685","15783691477529117443"],["13538227779076679407","1902592709472950338","8804123079755876733","2705832744525536080"],["543969252479229513","14893027898509244220","10321792284182817148","15238852900925159128"],["12121810814649933658","3758489012134444375","5178236778997967955","5201927626758092985"],["17518215962841253927","7518575493921435039","11028024823316599490","12300679125245209374"],["16565447952523412581","10431161982624788597","577905761451206163","3836504670819007428"],["2006537728239262456","16831739113769479597","9714627045758550847","14973892579647284445"],["11032932166197294308","1106079378731637504","17218762515397368486","8435980379570444104"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["13743533692272771488","13601987096388987914","10124538846043130741","12520017211853140068"],["18409984981455932757","5952577387470966318","6279567658358990306","5066644123715775951"],["13460277168812136158","9536192360220781714","18317215329268890604","18076169877471785506"],["11148876053482669116","13495409485303867988","17573210079407889647","4257214573199028182"],["5145542312888080597","10210956663536299490","15727953794941213178","2019897441884421766"],["7961759433242982945","637851319029406751","11841834575746626908","5635203462198207907"],["7406129213454778201","15094298822427425235","15332850061673101393","15391076304902760295"],["15565160511331668240","4479073544690745734","1623016586126026635","119608003801785819"],["13868453871860597125","11943277121552563868","8901280329013741330","10138355604294437993"],["18131724682861679158","9180780295424419790","16612835895735904210","3178540692432935261"],["11264822331990004390","12086412812405713678","9298440193577137332","7091992121373766851"],["16771938095063115380","15666042322851232771","601103249885380170","7953136630461360281"],["768582213718932716","2996915844980840531","12258570746162277849","2856797228279442992"],["13276854715229618285","15432213816364245506","8517138633215927800","13105854106671432659"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["13040429674506916186","2124294909583400103","13951101195719927996","695352388652085228"],["17823707186205348237","17828982797926025240","10619115501577038989","13184474040766180745"],["5215655464789810615","5551458154867544606","13547912581102516150","11473605025981716066"],["13047548346963692059","2913549998629503732","11912358675568237415","8910734078583265267"],["6236199530283220058","1705619075513454030","15835191996747981928","15069323563055394797"],["9373524678189672221","14239588429619268656","7322910679265399290","16567338207156096870"],["13128948554369385492","11875180831809387059","2092476274259360968","6333798689883302960"],["8119452792726087918","4895068899437585456","10133848509456782604","16011078441570248872"],["16546639521205472879","5367928559992302103","8622866810303878588","16722755000485340574"],["5532147490768966534","1008136734704458067","7130881397534442096","16159783556268998012"],["7106173186813309633","8822075149725247672","17328293010490294439","8438326427141249228"],["6062365647485601363","3429272304581571505","18287015862593992850","3758487191588151708"],["7889193391452186600","15024077709308099166","3950803357465469338","17485299379848031593"],["2773412265346801014","11057941775342649807","12054074628758432695","7461174654277549808"],["11768106197675247029","6058895464564337361","7148959511628755273","1289283661516006736"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["2891065391626847901","10187371011396347979","7853892143810957461","7959301297125040652"],["9988110576423398341","5466070610864221338","1488109335595623558","16274512274581047791"],["9748634945297784447","8175734270723630924","1928071213153110149","16676412725557541630"],["17452625363968948911","17985518795461561722","7760253359217474438","12245215973672178749"],["1716843657788052334","12874142275188090232","7486506630649057907","16610909422643546515"],["13047258668020441387","17754962330826228991","14577878834866815338","6424352408418513817"],["3721900676328762783","1375026197137576137","6556475227316926659","6721017916131981855"],["1562754515612686552","10168763526019139969","7496666002541387361","13347433693638032734"],["13015026533743017429","16048842436371663690","125401394029643174","7552048438058806171"],["14925543717811983987","8498338723539713725","845867355821979544","14888173438660060012"],["6810613019523188130","18307435935751260209","5501139683920101332","7089449931457814210"],["16771938095063115380","15666042322851232771","601103249885380170","7953136630461360281"],["768582213718932716","2996915844980840531","12258570746162277849","2856797228279442992"],["13276854715229618285","15432213816364245506","8517138633215927800","13105854106671432659"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["6920943956117050971","12138258680077102212","18396876268153276454","3681388522277195244"],["14129731202431856770","11322376953570418045","14076435605627022606","6502912270561957449"],["2038515641796733004","14041185448988177206","1306833921687560326","18160374592095521388"],["14557861162194744724","9849188806093596155","12087634072691397844","14265936993456076009"],["17914047280008717256","17540952403850697882","13302991994983771080","3072062347004449195"],["11345800673819763837","16865741713813933081","1670698999682922489","14553890188437692219"],["8067333315125054645","6198641388651636452","1821173117527361431","1397406118231894076"],["13072941887676012712","7498140402555988318","7550389157022872604","9068907162445948027"],["8792192194441642447","6454024631348236945","1531120486278847883","10782675449996555063"],["795735374219773711","15654626679300099906","387902253017354403","8561360275095025560"],["148825233895997533","6070017136549481455","444597138671000197","5761986512563220933"],["14406586576913055557","4011430420193905332","11074653077150879190","17053258184573579719"],["12449928636991793540","7792681008827015552","10133522172061735267","15847687484732434985"],["2936686047620108343","18137051521289876157","17130884285695665776","10118233232883515422"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["2385898192745434025","13067105217866379598","10951227462408192400","15507023748577836971"],["10556504842135875141","15179409151792302355","5675868027955640484","1126252836826461764"],["6509165534447406051","717546824475257651","17465369267699019658","17090328016214649080"],["5426477254433170683","5405954690735462585","9837392136474194157","544552829442126507"],["7171348930573678284","8022574147102499923","16121013287784335110","11481981209083820669"],["18281050901460970115","14718591560534914923","8425186234548039413","7678202792079193812"],["10327501264161643923","602965597425333765","638344850437551274","8035905300278839139"],["3061861461565443232","10060884437352222760","13747744075747380165","9968710946234687445"],["5049793599634708024","12551439718096453754","8653677577356697060","9678615453338659094"],["14186738587938690269","13371125549312562812","3705924665875053314","16764290373028649219"],["15173397469743722441","5179551220195942634","12054101732572204470","2050946419838855961"],["16565447952523412581","10431161982624788597","577905761451206163","3836504670819007428"],["2006537728239262456","16831739113769479597","9714627045758550847","14973892579647284445"],["11032932166197294308","1106079378731637504","17218762515397368486","8435980379570444104"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["18196343757784002770","14050019044973171217","3756598349666614764","15538977012087144171"],["2155192346656186018","17894409955857989620","16654505389749570781","12139537189768796324"],["1318672637385034344","5228680721544833561","18292339336713951072","6437785580069608390"],["11511629641251992205","17574520643826848859","3535997055913894524","13447439367937620201"],["12378733641602879576","13428687490924087780","16944391359460402054","17670482481990946621"],["17149532734715489789","15274333684352510595","9919583920505746292","14448664693898974099"],["8435230423705121322","6442636084577124481","11161530359060738273","15747693279631568245"],["9983515789108905908","2818299341168355451","782773690371471457","5961245174224476012"],["9947152050011577847","6890185907291078026","16782099117233504579","10212094799625206670"],["17316203775965620342","8677969045783666304","5339497621686710794","11418981852393871604"],["1435799158485174216","1899162613087961382","8256337445363031270","8534237948200164039"],["5052335223959320752","8733520401669896671","5293054757272060414","15495383066911073132"],["2930000315364939690","15119103888786542008","16238083814455830430","3679552104276669310"],["10025491843763868797","2407098133773814989","15291331712266813080","10661840166835395567"],["11768106197675247029","6058895464564337361","7148959511628755273","1289283661516006736"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["16096906317247148442","16967820732675697380","9127996174068822039","3512078753422978012"],["1528561436670178522","10086256781014608436","996578477664457783","1683690120973593699"],["18153031531556857947","12532449138468051378","17893384771528315356","1913280332901695165"],["16956365591304299145","17337318269963362386","4557595163478121953","12238615841166885341"],["5385127959396180127","3970369882772624036","3917685252011743471","15992839075870865858"],["8829368506474069401","3672352953741158868","4917297532082030120","10726426902954384976"],["16091672188829469183","7908726921389886525","11255051618940864792","3565241624150061968"],["7071825305782395116","17321457473451590035","3698734945033095464","4518084697104050375"],["1803836360267557903","15759359567991516240","13054974928686844561","10376962549006246794"],["96851972437477615","7008710620852993166","4589673235155356133","7157094865357822046"],["6810613019523188130","18307435935751260209","5501139683920101332","7089449931457814210"],["16771938095063115380","15666042322851232771","601103249885380170","7953136630461360281"],["768582213718932716","2996915844980840531","12258570746162277849","2856797228279442992"],["13276854715229618285","15432213816364245506","8517138633215927800","13105854106671432659"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["16802733662404162073","296198812744605143","2598181286239744898","2029358140604699449"],["2602128391191417493","10766988147158297605","5559902815577396164","7478805125956220415"],["11031826780200604720","12821975535825311562","2175834181968839470","15821472326163673973"],["10907556681431672566","10396707202849651315","16650404960889411205","15707966134860683631"],["16077109356019392576","11007915543500902951","11451705140017075844","6223677494935205401"],["16191980094087367801","2788513821920961114","7789703324502228490","5470379909487196672"],["10911202876089301799","12042698998861067544","2929318722734027697","16099923764317521294"],["470860483070586220","4738716598457769636","1655948882739704465","11066561988397594642"],["4155343565387999150","536027025244003534","9766934297243542896","10656969961191632966"],["17659597474201558449","2106649080868851754","13237783370411315571","7229475989549623439"],["12120055482389984353","7695324161786822885","5546152152100066583","11668075759799979419"],["9814387009908354019","11903108360733789550","12817287117739896955","10043130177978533578"],["10230591937975030685","13703031331159705413","12773735958676379408","14959283966567576614"],["1065842777653845386","12387371938635582795","17224363510240810250","4069900180926297940"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["6785111674045810297","15101481360697653522","15221574924779689077","14265112710168704227"],["4345935365711749638","6479027071158043772","5311218733552273793","1825868392294878425"],["16682467897704561173","4366984254991629435","11074877901124948562","13655677873501587539"],["15613081734775002639","4772934201858507238","8789051060987496988","10237874693002193885"],["9513740418494846871","5871822043327276431","17885043940310975419","17802431763860710438"],["9491767444132409101","7857508382446286476","11926042806490834831","4702531874891197604"],["1107312936960963218","12626596383992134744","16936373905852976119","4902147769667168702"],["2203030503721462028","10711337919624309591","9979081549821094408","5972506625709548465"],["13358512516349337095","17420690239092199770","10698562062671764447","17681380527687106513"],["15140683167274572779","3428558536100023179","4999556180669867401","1238745842125484975"],["15387243626633106441","10081768384354822916","13182482081556137906","15915937795574407078"],["5162599157309018164","12694621826048269001","8224088020850015492","1613907585639949286"],["4545001891104030758","11618468737564107023","9742608268574203654","15446318212241162118"],["13276854715229618285","15432213816364245506","8517138633215927800","13105854106671432659"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["11175176983216541281","9702560849849903574","9236548722805692144","13595752444775857157"],["13749872073839373805","4243086194351619076","12711957924451010801","6389130038305102925"],["2606371720478783625","7955765181825278483","10541775415384270975","13958147840735313710"],["12989624073889144498","1143903398565109272","4889308915603455346","10198296804685689117"],["904026270641935602","14257796634680799469","13765538171535130694","8251324068997917999"],["13278582938020721416","5807941401602920987","10440457274699772073","13192413336031554007"],["16819945418720175800","35285925508939771","3335083600622139542","9576863593804471547"],["1421294087526770360","16761427319297314434","8123030129797533101","12639988043803342408"],["10050986047118398117","12609315418698712904","11189265142664279472","7034912442897582698"],["12943678024788775220","11673829542578695929","2527084973728974646","18003547617598086266"],["2699619829645588566","3487000054603379192","15713961738765100493","17443645616605458936"],["6062365647485601363","3429272304581571505","18287015862593992850","3758487191588151708"],["7889193391452186600","15024077709308099166","3950803357465469338","17485299379848031593"],["2773412265346801014","11057941775342649807","12054074628758432695","7461174654277549808"],["11768106197675247029","6058895464564337361","7148959511628755273","1289283661516006736"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["3703231117548197253","16883247533262690024","6164200482140404069","12421023143188969737"],["14583149426529182091","8172646165075971580","17865469381197299246","11660722241853382992"],["13793936208279091081","13279211147806022674","13186922609817886843","2700630232908850404"],["2872278706848509149","7956865289084482270","1050908280771463608","536727528715827283"],["13811261242600000927","3926193130607039742","13218390648180452341","2516426923277513846"],["15669331067968061784","17534082923811191095","15777224465832547814","7719108827430165600"],["6895601666828488788","12936015005365336662","12911692799552715230","1385714839674952675"],["18257995610796565063","11179389429389127560","2426774849322540029","13383552444546416359"],["8302204972583941768","1141493432573354624","4131439410056471743","8949046794011837872"],["15870422191182875950","701633236744797513","7013699103252943182","4902649117059917546"],["14796551389199699471","18243123468152295496","11302484698767682329","4302767941272156988"],["11198856758205865156","10442867359628531278","16760939368977050216","1756634217860916982"],["331710721895327589","11774442091885724121","15347948639718393659","5073631492148395414"],["1065842777653845386","12387371938635582795","17224363510240810250","4069900180926297940"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["3044581611493992716","4241285063914313624","3149289024690958319","17351318485759262164"],["12638744981092426896","11195939480897644019","16884330880544874198","3740029048201830919"],["12352150590916568938","16628928478713581204","13096343330332717625","9442315939037640258"],["7066774462991370443","941975818320849453","17673467003288741508","978601256538473840"],["15443574393138579979","2528326880587848351","11271948197175373439","7510053802408037650"],["3941282009927909861","4230615327330021877","14894450182006518917","7283714354589431163"],["6739729386654556555","223531144547839151","6935429448935226075","15609739693928782541"],["6702145730333343302","18361016358027237504","10966528493413557358","16730236280897196824"],["12406341479369965334","2568799240769977040","11884390039684284484","14577933499935394045"],["10850296393470523476","16684010346163827096","11149979850964041856","10149339503052492092"],["15278612976296231725","6206695955308709755","11375085109303866371","6226333406329121551"],["2050067656075220270","1155344813007523057","17731736265517900167","1006155691126193855"],["3799714695414537102","15328327283960404810","13351101973726465861","12726140337175880876"],["7630437868803283660","11677820831840195281","12741644338315000807","15570240570843497824"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["16583728719422446990","8299166336883408032","2668507132988177510","17390054047638333085"],["9859804089448677349","17017130968953318005","2045664011843073268","10443457019532411736"],["11777545136006754286","2701091069195699633","4634332273033137353","14199479373604517782"],["2302206289811162761","12314616250644802835","18122907767092136738","15893818663447500315"],["16407910187239603017","2909966926189054806","7673603243733649189","18355975571928547217"],["1208016213412311744","1576686641368234426","337526049977536542","15013518074687191171"],["16880980007447054350","2489537216091637962","2059532109511652546","5410839655843879673"],["14857814265154662914","13742555991202439372","12412795450706842749","16635124847623627288"],["8302204972583941768","1141493432573354624","4131439410056471743","8949046794011837872"],["15870422191182875950","701633236744797513","7013699103252943182","4902649117059917546"],["14796551389199699471","18243123468152295496","11302484698767682329","4302767941272156988"],["11198856758205865156","10442867359628531278","16760939368977050216","1756634217860916982"],["331710721895327589","11774442091885724121","15347948639718393659","5073631492148395414"],["1065842777653845386","12387371938635582795","17224363510240810250","4069900180926297940"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["6091188611629386664","13289159721034033821","14690216828653084578","11874544212139436108"],["16483260514760976121","10616167179298153850","6477690496566811300","14759645973061029859"],["9735439252009970122","8208286603983400233","13891405356226205930","10008330842578453225"],["6174403439131357370","15060356052116934227","808164688031787354","13975123262487153024"],["16261022492462402306","15052473434599838401","15306192734530197580","9809496639271214492"],["1666532560795015885","14495828784713349400","12219850685754849308","11888044813336827989"],["7673029951067809352","11973775457020149712","2974741434221105456","1162216048857051014"],["15036283017744766476","470503681739805127","1254003534229850274","7812587676113903093"],["13484025175052099451","7137899901056792125","15943629808176967362","1946581566570758954"],["11173428196590667040","10707652298775499948","7402581737541716938","13538792245142181888"],["14274653702741360402","1079467093399963106","7871319886414057960","2963960373412629747"],["11198856758205865156","10442867359628531278","16760939368977050216","1756634217860916982"],["331710721895327589","11774442091885724121","15347948639718393659","5073631492148395414"],["1065842777653845386","12387371938635582795","17224363510240810250","4069900180926297940"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["1359112749733463672","17253275589897877773","12815472984996254599","2170501375029445369"],["2481693393587628092","1723571121983576738","9939401495995929676","2007650643204186668"],["731749426354732566","2268052897897913721","4583479147746258390","17690406074513894290"],["839274582777130245","18017866310679189309","15744396953755181858","8501216293160663881"],["11081491076991973474","9239061386369080449","18284913490123888736","1731654191451535326"],["8086798731081608022","16397108667063484215","5907907614332802514","10043804902308557202"],["667054386925136721","3674986723386732556","12992657929212210384","14201787998528671269"],["9123316615454259179","12244007239343258185","6515957745081624895","13409384257184157677"],["13330442628929391474","9641897745274640495","10805519370559732035","10827036678626747851"],["11159316458086109765","897315652462670088","8263205518278065428","9283562561059000296"],["12294656608827346738","14498743596753294745","10554675504870959196","6435749802557516921"],["316269499293580082","8527396493056116260","2044496637764574261","14095597591479896923"],["130015575638710771","15561550058479944513","5763669547248584971","4932229049250413008"],["2936686047620108343","18137051521289876157","17130884285695665776","10118233232883515422"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["14226483263373645171","8242057509139448436","13567067251782097817","15739143353851568764"],["6373573448343984743","9313719058018482673","16401910944217015886","16194847128836229452"],["10271438933382055916","7904478042761343056","5454611841144241794","7418437275159767429"],["4036549184352392396","10672831514309151331","1849972255657242334","148016613519972588"],["17409750406059347504","15618221814225874618","9346440731943835559","7240565670348998348"],["580738155730582208","17710800569379804472","5049493916793256375","11361280153931316604"],["11325587731992168962","14582187108434535693","137076107107586996","10466271588278263411"],["1549748940011899637","511748031033607667","18019008793585992266","16483507038733562331"],["1203683947562027052","9759292539326863693","7209912809761881738","9583799489113838141"],["11672694154794583422","16881402638427921078","13953948496337188163","15587860759394956595"],["17757891461499141546","4920909759019591380","3398908867503170760","11122168695266720702"],["15084903088328602446","13534239432065973790","9224593767984744831","773737977355287184"],["7889193391452186600","15024077709308099166","3950803357465469338","17485299379848031593"],["2773412265346801014","11057941775342649807","12054074628758432695","7461174654277549808"],["11768106197675247029","6058895464564337361","7148959511628755273","1289283661516006736"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["15225754575131730318","1113748087435285909","1390315674864066135","536097975403110604"],["12625933840388042294","5060268591591568211","868257318860452747","11684437287864949377"],["12373998187464569977","12997025366422386661","6005899672052738348","7398539160375039442"],["17449578763281448310","17811318721936337190","3049977376772587274","15099018114443104407"],["1250548365110318049","9033517047606504963","10695010372841862604","8753231909822055064"],["1223147446716194091","286883903702872071","2588632776236352459","3647340844511128733"],["11659656883060562587","9027309927299677599","2716367680052440688","478976206925876572"],["17816720561586256048","8247505102732681611","3540095260726394027","5507286358518051787"],["12061156129584522795","9196863424142649446","13626059136275490380","1240715273067759376"],["12337050590605557683","5142979389148423282","15390874464036376213","14169112342255584668"],["14301585465203437734","15054569918053960644","17509895814287948610","38495265439812875"],["13016977328938795145","7363966688590849573","4121223448339215668","15222709166488795849"],["3799714695414537102","15328327283960404810","13351101973726465861","12726140337175880876"],["7630437868803283660","11677820831840195281","12741644338315000807","15570240570843497824"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["3483983484081660855","1228320172634030246","9016483868586954036","4219856278882261079"],["16505081541925203749","15477718347194404941","9778883086866374145","6836330975666798195"],["5690433891395457349","15388451994584978911","3527886838538282609","1784536100529612887"],["14788964773598382173","5930834108675052371","1867415239552632877","17721906235816015488"],["7074865923709468010","16895575359581238777","3968494358445593421","8799476038537764729"],["6532761086890114800","2763595357122998091","794793729962028116","15460166913574131614"],["17515948607981849598","3932186645501581883","10792271078721280552","10044422492640383780"],["16615821431855623129","3630211991806853532","8438343219892201081","5900037658347846744"],["7781581756269355839","10737393477300416921","12682108062887711274","2289218769636259705"],["1114877195173436241","13050884712361058412","7241244819587751022","8616680866076812058"],["11658234395060990507","17198744839816382206","10834437104155910468","5988555758385385292"],["16415399705769926117","4106447698827586234","8289555387656107780","11365687807017368662"],["18341678698163331131","16070731922758142012","13607837254202053110","7054469457148189003"],["2773412265346801014","11057941775342649807","12054074628758432695","7461174654277549808"],["11768106197675247029","6058895464564337361","7148959511628755273","1289283661516006736"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["10802672133628040591","13793546682980225908","6647869297565734258","12895264990016100050"],["7500791721627503423","1215837636936204526","5849883927548077434","8431195372985992078"],["17017375276672268633","5456707472987790188","9204788703271228784","13483330865651262118"],["13813148156893421761","11201032352813347266","8442453392476415398","376256955267875288"],["7800780017285856886","9137274998016240428","13656803632659395679","10405967420688802924"],["14283012406819999060","4337033667740081025","8400371647090074365","1363170816958872946"],["7139632086632908744","7216373066341915085","11298934148013866458","16143431816994858880"],["16825421043387499048","9148185073836523034","3874276813674651743","3198358647703009350"],["16431212848402692262","2869310931436846720","12180783600270753838","3530217678654785092"],["9430526568660151134","6805195906951097164","55541112055928489","5545625098270976170"],["1641739122389647288","7782705079362057608","2598465116928923354","13815853622325127495"],["12690616914178851816","4355906466427431843","8982327277578560673","17971601983395635976"],["18326221492687138614","7057165813712252857","10436097494246781755","11853775218717649140"],["15752433223300912517","1237947802439466904","13774319530327708677","2427443602867086275"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["9761513394193501615","10552934919585041612","4320547836867396667","799796619269271685"],["17442885163230887081","10050485109641011726","17345576067064590309","11893516785243930861"],["10567419799332268522","14567979536132405067","3199146877193085680","9641863400388535260"],["8336933918734890211","16998236053549063157","12975051110605859515","4768951317663649520"],["14186168460110692581","7874713170390900657","2655641734260008251","4884371848002227388"],["6114196213068070291","10755406011260530586","13552345701139367904","18084199547187746403"],["11542777349978422091","14564510212765480511","1624446535543973365","8725064010362947909"],["1798495840146624530","7813357135201288972","10386370312590242344","2492709967001346543"],["16434464562676889494","9118070208170316000","8144333022490378880","12934533205619608675"],["9430526568660151134","6805195906951097164","55541112055928489","5545625098270976170"],["1641739122389647288","7782705079362057608","2598465116928923354","13815853622325127495"],["12690616914178851816","4355906466427431843","8982327277578560673","17971601983395635976"],["18326221492687138614","7057165813712252857","10436097494246781755","11853775218717649140"],["15752433223300912517","1237947802439466904","13774319530327708677","2427443602867086275"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["9236361679070285018","8415491709778819402","9555893089784815596","7461519191494529216"],["2352664908315635106","14429083951610738101","8369878561903083529","997267288523703265"],["3891462430909302886","9202083773681533161","7751939519331177510","3711788829605313903"],["16030362918438344141","2318941783189064746","17014535571658019261","14072534594978841897"],["16739607421614411571","4070880716947029176","9018098597457119117","4814382311262715443"],["18418082124145741770","12053317071096873437","8121334267810299380","901847932994667862"],["6428014482296981766","8178072444090087938","14193380973288655885","10345304505128034376"],["3557922234437653390","17917973017460255177","18320201591677413651","10612178112519800430"],["4155343565387999150","536027025244003534","9766934297243542896","10656969961191632966"],["17659597474201558449","2106649080868851754","13237783370411315571","7229475989549623439"],["12120055482389984353","7695324161786822885","5546152152100066583","11668075759799979419"],["9814387009908354019","11903108360733789550","12817287117739896955","10043130177978533578"],["10230591937975030685","13703031331159705413","12773735958676379408","14959283966567576614"],["1065842777653845386","12387371938635582795","17224363510240810250","4069900180926297940"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["9246412018634795126","4057251285489949705","16483012208404144065","17045516856245049441"],["3050382479064070222","11745600340051326520","220113998080027321","11057425831144306306"],["4708307523988238185","2583084138515393552","829611518816334462","13240280615343976545"],["4743239508309471238","12157474734005410658","14997727759369550764","235245794665434851"],["6748004037569933510","71132488334231311","10289927800644184229","10671498786745115588"],["9810721104719593979","11224250129444175742","9473809550562421507","3685008474882635309"],["3557632300326134299","10585400799248285206","17094041277466042793","7652528758207285978"],["3204704610282254046","9681032469818703452","2293458174832242131","3161801957218505689"],["12583628565822156023","15417032663150891436","3385821953270646130","17203499294208671245"],["18174594234693218181","10603867247846189324","16206285888912198754","14658851864050985037"],["2173688058941584314","13485621271361238371","10078189628920793984","16542536201884285600"],["11404123729425482633","1670900401070281281","578509137650539453","2238664257601773702"],["12449928636991793540","7792681008827015552","10133522172061735267","15847687484732434985"],["2936686047620108343","18137051521289876157","17130884285695665776","10118233232883515422"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["2008684811702980202","16226984530811620449","4472718191349890383","3900818088199342913"],["1048128453807606332","8090909594397169003","7038788975615470738","12358830495461000600"],["17027101996325680014","4437571527673023897","2937464370477428965","7231932971590551257"],["8962240577119534583","2274597624142377267","1211792115042538108","833539836017204787"],["14649341104345863221","11438177593740002458","4312115774802158239","16093734222932803093"],["11459895034229826982","16216137256158234252","6889731504063307525","4079588534568887719"],["10859456901429962643","14981140943602344453","18357404615852723586","4215113687455933052"],["1784825099684373600","18282683673054526411","8548304223255399280","2348107499590132518"],["11320672144867008604","15084673479768146810","970571614953308791","1706989286560969822"],["10468604871505469643","1412737075324450672","12134519924531420242","1012930880098861002"],["1348084586046419985","6315351680973208719","14914841340402543327","162271641807955994"],["778970352410042079","15159524057603030447","10098244060754955290","13201837079235140866"],["18326221492687138614","7057165813712252857","10436097494246781755","11853775218717649140"],["15752433223300912517","1237947802439466904","13774319530327708677","2427443602867086275"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["17235794499866794003","1926021584751263480","15257943041104214517","7245875266415023789"],["5547175079220027314","9829641288717554318","7092735758500434362","9603125028426751874"],["6800553409844074481","13025471298380630381","17060449410967201261","9512558096927583547"],["9784770901192147847","11231670177417106356","8201060004602479562","3040926767034534855"],["13956518247474748176","680992286802466003","14114362219908400917","17777642679612332174"],["875240975793586159","17327897268131781324","11231640246337021165","16940487646558473302"],["9769969601813861710","9291045094527157890","5402466294755159471","4891368888535968625"],["4795956606697297368","17085689005786620950","15802025069480249456","15697360411199340562"],["7598988612433356620","9499827789042690395","2808518480438849066","7293443400847178394"],["2818167984523885303","8489658549925829854","6980075335490398060","1771346575022140226"],["15387243626633106441","10081768384354822916","13182482081556137906","15915937795574407078"],["5162599157309018164","12694621826048269001","8224088020850015492","1613907585639949286"],["4545001891104030758","11618468737564107023","9742608268574203654","15446318212241162118"],["13276854715229618285","15432213816364245506","8517138633215927800","13105854106671432659"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["13105165260253958134","16938629282142258578","6582750333222612003","16478123245072094836"],["416066112360109631","11556631180695742682","6211320362174471089","15631125173084553164"],["5382511507112020055","15597217395016911889","6776894847657523071","16527105794354397659"],["11106250657870323558","12467212555645793380","4012573769538967762","8903860803062140753"],["1723600908838787538","9673792717186292605","11528933216291683285","11492217406309637316"],["15331160131465101999","17353738965202002721","10919939829246300430","16705582492411700407"],["13689060935426730925","7691817400840060161","3224989644114654986","10607562197190973403"],["15687853197741803164","2935873008372697196","5104393886715366945","6454694216771470846"],["7358044239005802904","14432952176761931656","7496116378276618457","7351362977276743675"],["8872546388813562669","16911857587466369165","13500500763857221862","1416518111569800831"],["2081287838129854097","4047396045076834274","8801392381182936483","7844486637895596194"],["16099018906938510802","13258500864986096564","9872546562365969253","6797680761628928886"],["6770532354421445509","4682092427203978774","13284843096505694280","4131287249627533693"],["7630437868803283660","11677820831840195281","12741644338315000807","15570240570843497824"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["2950360537773038876","12999900675228011892","15336592791275290500","672116427763522236"],["1040760114217539950","14442297732118813352","1124187571853708276","11323465531256442877"],["5740869548085911912","6946105029746398923","17327903054244494604","13146129457452544028"],["5356032552668115852","9736323956769951614","14269285549360208494","3610823312535221749"],["16635345756816022494","3818697831140050295","3310219160461684301","6735849844482305485"],["1081869875368536834","3980279150291911107","1754699380491686746","5173329561313763939"],["12158075269446015394","9973033861766361724","16452734120011686731","1156458004849100746"],["5746155950983683260","14772481260300944961","7521372213866849024","14521324352005898599"],["5375836451804625851","17173923927070792693","12382669129447032229","18332078178375024460"],["4980446106878678812","15957143242152258569","16128049228420348930","11086346476657939710"],["2704173165764117862","7582267763349937539","14360221508024924380","12556282818553444418"],["8294601432051572081","4821332771759518693","15706916325454714725","16599461233841131880"],["768582213718932716","2996915844980840531","12258570746162277849","2856797228279442992"],["13276854715229618285","15432213816364245506","8517138633215927800","13105854106671432659"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["5290588283814833574","17786107869678590113","12793557200431456954","11378320485166954999"],["12072927668824150531","4748290183725827678","14807334484834509834","11366229779635053596"],["17615919742450619631","4105546976555612047","480344476267386639","14787938082795416387"],["6430179542835663066","10036215578691132333","3015637477796389960","12012494790151684171"],["16699247922766920318","7015653533582380289","17426176851711947524","14805166736645227226"],["11500365539180542622","9452197791774368357","4938539983209911963","7909581835416478803"],["16588502724031220009","7797437639704027995","14010237398581293596","11847718711648074864"],["6934460447347375864","15060447647372599643","15199784611104467033","13668646343100932475"],["18259731282639781269","3028360206107275857","11047128251830104053","17755203188733592321"],["10726027322109086068","15092122456244230813","6913224962745906424","4720681871595029070"],["18068547132179025743","10682616549322397352","3570951409116469083","6149099129239118768"],["14406586576913055557","4011430420193905332","11074653077150879190","17053258184573579719"],["12449928636991793540","7792681008827015552","10133522172061735267","15847687484732434985"],["2936686047620108343","18137051521289876157","17130884285695665776","10118233232883515422"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["8327827971988049341","12025608827863822980","7755307656257945035","12226081786876287527"],["14557562197570450547","4175147086955223795","1749878204200392502","8119747852923932343"],["10705556164146316546","1985477233648961036","12244065976905072145","4504887922672107347"],["1122060488272294692","14886407980298780021","11407728641711417235","14313150917951959453"],["18294745199482308166","10835195939945032440","1874215778336033953","2034330035119265309"],["13294266216326814824","17476028549373390772","17217107177851266713","17035683514716670451"],["11383565951010021447","10626921261065720910","16906365224124361377","14080053768762878632"],["7046244976437626458","7603016343196360192","10235394149885561754","10791847391401304011"],["9994539708659119657","7962859697766865031","3644958938875803925","158131076075861699"],["7187440007973094082","8423269214073184215","5512363937960174572","7231435987139267474"],["525115966642039034","15866714692520219632","6189464418699312260","2947159574063937228"],["2050067656075220270","1155344813007523057","17731736265517900167","1006155691126193855"],["3799714695414537102","15328327283960404810","13351101973726465861","12726140337175880876"],["7630437868803283660","11677820831840195281","12741644338315000807","15570240570843497824"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["5217113526376889473","4230022959369575131","4297387074810924335","8766835793263314817"],["15913099295584442541","12291520817944324922","5821897953143490834","6147004326740236524"],["15505877943214257525","8598124634798035606","16103197667562111242","14870098267430824444"],["12985511471735092389","7816243230557783608","17894397807418426071","15449334363839239864"],["15201053388844150826","3348952780519743063","6019668476319319676","13845030574940458806"],["16459607494036768968","11516091912038095348","16449508729431946985","7222563121651245374"],["4312448919738922150","7584275375645154652","12016453633497853435","15911868003841299249"],["6419196302045402832","2567985291610632953","18132128543917596811","15128139668809540701"],["4815776488589521924","7761473820869777665","12740521038403168965","9837583898240083355"],["16037786592509305795","3538577570940510867","10014525498752149979","5792213265586153307"],["11981777925642423551","7326679191759688533","864587123349251837","8516005319277055531"],["5617993357923400906","14561902921514580927","18351691547060050850","991811570798552556"],["8312862481967992179","3033879016108453295","11102512466246592891","15293489183603357412"],["10025491843763868797","2407098133773814989","15291331712266813080","10661840166835395567"],["11768106197675247029","6058895464564337361","7148959511628755273","1289283661516006736"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["865350522665071085","1050121368548357143","17264175069188970710","9213647194628590059"],["5506465543292252263","11299206081003515619","5788683160745252551","1137859974201158744"],["10636903174490247257","573362305461349981","5480439807534199367","5461900518550974896"],["13349539727430192797","15283972858621362800","7550444200027260558","8347005298330750049"],["2333775740782737574","16724026988090327013","5819832404434761404","9716182063437733290"],["13732514770661397816","5956178929479809024","6888564403328905275","1746216981481189848"],["10326309701764877309","1818387061766942329","10680220776732461888","2962470055707212015"],["14205331612941880742","17688796985238596982","6512887029503195448","17622247582664279522"],["9235446071438838202","10676566860736185066","13107291032029831268","9893888515951047269"],["13576471150974492430","11134132653901827540","7694374588972189533","17044707812123448084"],["4936438085256793326","10760446505487837555","7605475423270327020","11253106989100234619"],["12743094103737867188","13553170652075895693","11914426991743984681","16281196777115922894"],["2930000315364939690","15119103888786542008","16238083814455830430","3679552104276669310"],["10025491843763868797","2407098133773814989","15291331712266813080","10661840166835395567"],["11768106197675247029","6058895464564337361","7148959511628755273","1289283661516006736"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["16386763672471045373","1360628130769234708","11852890084846533062","10348591910521284792"],["3658513859528415755","8670841044248392175","12441136657920246389","2720652487890122907"],["7802269880065814346","3571696636380296926","6986003326713398424","12189324638401212358"],["5611950051056705019","11995471995616897825","12705876247209373506","18430611509777066222"],["62941586756359612","16630984718437276962","6439648156006693473","1358762877805733700"],["2537007564886089087","16813640560566833534","470090951407154976","4121930079718749757"],["2462020127098548844","6028959620453080553","15991134875278897271","12785601391875680180"],["10794903002006483572","5329542432027332435","604773296986940471","10371705691875370209"],["6544108591987694204","14145110552459314938","1800639624055236574","2106419584172487244"],["2700631301381887008","9708719519204429353","13396162282128469295","15603769493903317173"],["11981777925642423551","7326679191759688533","864587123349251837","8516005319277055531"],["5617993357923400906","14561902921514580927","18351691547060050850","991811570798552556"],["8312862481967992179","3033879016108453295","11102512466246592891","15293489183603357412"],["10025491843763868797","2407098133773814989","15291331712266813080","10661840166835395567"],["11768106197675247029","6058895464564337361","7148959511628755273","1289283661516006736"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]],[["3586720691357928429","2405752567591428535","12728848795925952204","16908115735354885797"],["12414292264467799716","12602955238253211033","6606061411044920237","14082853886527092378"],["9152004634169200145","3622687313545202654","14775209283135608264","4228469046706846002"],["6013136393192113939","13614874094082512869","822280062594786132","7033361504979071327"],["3720931001185631081","13688117801638766257","5578211666778864215","3152738574229459734"],["11592261002628625406","10768917480923082590","303649669525094504","8900395713706306864"],["18289980742360130086","16373594634536882781","14751221317768500360","1317524798785560854"],["3928349014850578888","10009777348525901794","1199598769048090326","10267357292452574410"],["668527270770044457","298241172691411042","7274535587768448091","9909317151168527385"],["11173428196590667040","10707652298775499948","7402581737541716938","13538792245142181888"],["14274653702741360402","1079467093399963106","7871319886414057960","2963960373412629747"],["11198856758205865156","10442867359628531278","16760939368977050216","1756634217860916982"],["331710721895327589","11774442091885724121","15347948639718393659","5073631492148395414"],["1065842777653845386","12387371938635582795","17224363510240810250","4069900180926297940"],["6264521658537870383","14572858942690137252","8211355165961147782","7413973633326324726"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["9138509292761298914","12250610814950977525","17004573199845989054","1387433100935894884"],["274738198870300995","9598977754528934173","10810858168886527505","5178119160268090800"],["9074683654030445427","18186249021017058660","10378101682565615388","978937302125695622"],["13479415265672545813","6876770731754273632","11837478624730654415","7280280396751575908"],["14574678339658078959","16044399754492203524","9435846427148407646","5209368625450292132"],["8171920138081488429","14795971634531809678","5677094402328317242","296540855681721859"],["11004358193105247460","7416762758133873294","4001227396211523330","237282682809849122"],["5821087097695192937","13720013833253574983","13612152742205115262","596531268471415599"],["15684194195889759403","8489378202041308723","5258912698751572869","4695892555998184718"],["7184444518597893138","5534848356096586685","772262869710286944","8307863706793500125"],["11140319002692086302","4767056346473425745","12058062496699937718","6457379289492460040"],["11893707892169545480","7585536898331625345","4327197944148471393","2901283145725907056"],["12451003438167530394","14647175660466505895","7387393873317800522","10412392456511728078"],["15752433223300912517","1237947802439466904","13774319530327708677","2427443602867086275"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["2548883689828923618","12147497342511953158","9691426160780738125","6687820173884504469"],["14137793829534046046","12489252629944621917","12791440883791709312","13367236447718508862"],["8943023578048262044","11554568250446101126","18058405023330341597","4047819220882403079"],["9588481385824149576","16807450272776114552","12688871666477148567","17354386303912003741"],["18352808685140013543","3233780632522800536","13285222946035859390","14886788939783603981"],["9934266499426292663","1487962553355137328","15494068513314955676","6664957501955599634"],["17633000337849574804","1565720175587069860","11444838234164186040","5758796664166804981"],["16128069454962323449","12995580168577246834","14828069317939826245","3522472378055612456"],["15262654463204796505","9645358705511083937","1482222213269018180","11818570010801665772"],["8132822972590125668","5697661729923844741","14483763630868255981","355322058433876590"],["1641739122389647288","7782705079362057608","2598465116928923354","13815853622325127495"],["12690616914178851816","4355906466427431843","8982327277578560673","17971601983395635976"],["18326221492687138614","7057165813712252857","10436097494246781755","11853775218717649140"],["15752433223300912517","1237947802439466904","13774319530327708677","2427443602867086275"],["496744594787441274","4827588581262219742","10777764583491046949","15563663489964560746"],["17649106500877332490","17355730749617064672","12618251141316063989","5786390483316414702"]],[["17764329259663832780","18077655208132259255","5793753142492643782","16916996611643486050"],["3035023543219980264","13786044944325679653","9707908408454403791","16034355896172730546"],["3302951630540108767","11377576211775516823","5680873732858100621","5619474735361842338"],["11015385761305078597","2805557856249914274","3778861999818559030","2481571480407373323"],["10297586990751288064","7107205769648515796","10235618250407023176","7795101341487410649"],["4570426832905413618","8529446834422277954","9343659481402536024","9224037614485011132"],["2688174251576261071","14615868121425435514","14780954784704913610","6443223468519372242"],["2199179712772630057","4375067500449824429","14495703037212327441","10767289274078980902"],["4069083819780982683","8938665592781898459","16513190151524819081","1398595144113271018"],["12337050590605557683","5142979389148423282","15390874464036376213","14169112342255584668"],["14301585465203437734","15054569918053960644","17509895814287948610","38495265439812875"],["13016977328938795145","7363966688590849573","4121223448339215668","15222709166488795849"],["3799714695414537102","15328327283960404810","13351101973726465861","12726140337175880876"],["7630437868803283660","11677820831840195281","12741644338315000807","15570240570843497824"],["1274248040106812914","3715087801975739276","16085496810038023814","733816180985999356"],["7563136322824636110","15370769429355259315","12092542613945510235","12810387729220226291"]]],"s2_root":["17015778322757968737","15300506696020625443","14138313428112514428","14040627955409062342"],"s2_vals":[["6367076187057022370","10033435663687883828","16220818583545531451","5337073060583442436","2873395504191212318","8739480935641463252","240442215151947151","8969981044122872462","8648459987847189048","17386803297748867422","11944226694103989565","496899828584558149","6875646577735183045","16715571977520423162","16651066380526526212","3649058999054258117","9642290247147689978","6941088515471097987","5054984318812077348","12642235233726059465","5446846012683678680","14213766793695842422","6789872792001167362","15865940629095629396","14396214985255794905","13675938924529565555","18183422077156582926","9520934463151608292","12289341921076415391","17730219106205958488","13397464984241480333","17168393963154549582","375237928069214877","2363139809577334457","2796202528183151603","2535609945288515213","5528895135418004426","12119374226879783586","13553942183572967523","1445618692250848104","1825914925533113762","11943397727812699080","2011899504296368505","15292048726607471531","378095740979048319","17173025989230853734","1189511372369286389","3176227348917831711"],["7883640940213783479","17357503542804443421","16958996007747470464","12686157060102437772","6773006377356690366","10311832714197522948","9458199701571988307","13931484219519343712","10166201434793940219","10778307767051034797","7665512872702377689","9734592690320865074","18408709760710134202","13477795427618166564","5776030961135270821","8110045478123145270","11326506707922097552","17025227728950760268","15141654279687363419","3186797269720203150","16361040677444710394","780178587373147613","1485030718506990629","16404931038069763254","17682344720896358194","7744109215309983108","15320602708889410657","1847812303083296118","4881617286390518252","14306957390541293697","1476714499734034844","12724087740310599468","3127029614630107066","5187942993177471165","2132660538816062104","9567014441079223232","12450408377860094025","13681472184701081348","3292030422891874590","13555759257985554813","2167516459723091449","6714265963961215914","12960700384277723195","11122234911349204453","9669649467997898866","13509721912492254059","5969210220754716003","2143125434935538769"],["10556109263784708377","17848285295352109094","9651955305655123665","9249041505328135344","5287184064396326947","17871667976414488962","14858603491967944703","16578631333861166727","14801800545851312708","10090057371103484647","11059596710762786555","16526491381964150920","960034479655537164","682840764892467210","18170348609197716232","6934765109208313468","12157723032093063338","17676711000690035214","1510692298049677221","8960806841571770963","9709579662777086090","8032661903815030540","6906735077906851281","13339965882569874161","11052053952485696707","7035822731555802124","8779290561632283831","7695886244823864147","17748987565710489417","2767406788259718191","5904506308102967855","5341377021698248586","11074989232631575428","6634144639105307274","6158838946861221427","1409886660348724656","12516192233256568385","6258399841330893796","12484794101427973516","7111180026758122351","9409551101438686906","13417145679826819646","9079227071279675612","13486773365942741980","13756877823911017004","15882005572366067735","3687287452191751566","2934836867293326076"],["15100499790828127819","3433819760614171212","9074562539553498312","8090199718486521420","16775872157426359923","3243281791474628241","2876877163582508449","8573470202798059247","3424820111921940103","10110850926399458882","4090337145302472223","15372426695618703741","14429049208295525200","10597513377986902325","5586058006939837688","3148332870767211323","15806977666160570949","17425732378486189452","368345960945527583","3202063202109875489","11945644504148037829","18404635533761411678","4280156751526389295","16179445376222474412","7122585723065369021","6023699432877892021","5181596193655473410","8948364183019268179","1584872177924371992","16516138871395789807","1762378444971966354","18338399928130444199","8767375801451512168","8219208560876614884","13991210619535416114","11170158045508330678","7934743493201603675","8598067390069381520","3192491846222549125","14833009380360959529","1698053854119783682","18021317496020267370","6782078904434947628","17228060030862503129","4095300998189957703","3784597717420444615","15804922758209896204","7813288370060820936"],["17452099148722077132","8075292326784250872","7346361838761550657","7792998060469766663","15264423553666416216","12047941327156154919","327058233203446965","2388218821913674923","14932896531967356509","9801311858689449694","17335015089675485859","11446032560754021942","13105193246985503905","2908131445931529619","15999874194652681761","5314708266334185228","11505804346941600109","2516397379936593155","5885738423229686990","2799235103220666990","5210337575246748668","9989974518376043732","16645885829586955337","7903287258494828265","5138013643835294303","7389229757650066534","14170021661868768355","14811541226675383903","2544111723307324479","18197647659551285666","3212226796130905642","7054345586413155373","12029421525121816262","17465513207541540097","3979241679793025219","17349778149750443404","1736773122945414986","12717039745871406426","4518517077297962788","15816695038570189685","15695282545584029430","5640960484294441511","15482179706043994761","5589746589661127004","9012793354829149512","5800795046620855915","55632558515140611","8865079955515741572"],["8717150341663732573","5070023494043734734","7368575208890532333","5935553300842301011","4266351711005935143","3948196443101394317","8688030567687425889","1873354172165114740","378586642962799548","15011658046922138478","17594235354630711465","5292908279530349803","3347173524133987156","9894128382414156252","15260876673388125489","8314656655054219389","15419107348623042419","13295036288815848757","17425298094945621065","513109929822127956","14752356161050074922","16482514718518708074","13493784391761616453","13961956472455873126","6357624619437282060","175488177959217505","2717167863570404797","8911334803360998342","7389821974237619495","3741122390717240727","10499661252224631347","10541536125185051570","2929532798344600177","3755012758353616923","9676202123446247959","1579747870612508493","15466776471641296660","18345520202199330629","10627075562866681682","15345865509880126425","16934341065830778888","13552134538436221656","14342742254760622647","2085475843437380973","7913675738234064674","10055689101495854291","13045891980271090973","6623038793219920676"],["8507675377683373587","13391212591069258096","6024110078437201411","7064942151042770095","11341120070163102414","165459364234997006","14131156706781736871","15912606689533489574","3864359223576945960","761219251601055887","3703959701508769904","6264701835179743997","4135216594969372121","13571294040925762331","16905176222038320591","12657578688854049918","12761698038900823265","14360132912310411219","1531898416248457380","13666997996385150624","3617296801732916706","13519840950959146438","3767179685108559490","17720972906065291591","10312364859934915865","15911420158029828337","13319136333359443940","2277502358226537993","11576312266887858792","14822829695937454534","4827740947265797454","9919492044345263373","10025126434325598015","4672111568569990260","9616105986674961245","3201173417881364625","5147653116872628438","16067804429684725255","9104939422366859773","794266544741428410","8982354569895402694","653287601255568986","11192053145029075457","5588739720742723405","14950734288472507346","13977835441244322423","3668149524121001935","15616739781776024539"],["12748418195179198383","3794845469717709830","448635330742936572","8821346321937402198","17128683753086469097","5802777580282407829","2788468161919687900","8437231454197276803","6780254389506361726","17221689248752133246","7282690918300792640","11311535520323218586","4846735633023690998","3692382797729039602","5745348077091720678","14877080152698891489","12637384082929994459","8668489006818329438","15181477140777779459","6054884187128417697","54187249881420679","6576469846624555261","7444521025772442982","17857917935978823239","300277810491908640","11950598381922842250","10839637843889625863","9870823556795578152","10219811635276833419","7045586023345539138","4525929663714153506","2604038145848842771","13351429285645382420","4517250142734050324","3651730694131359539","5775796651233924757","10220625983447313895","2546019836525323626","14635199096986148422","12846764598132550762","2079236756227240051","13800787411297760816","3835958413154350905","7174344741741068352","3061115448758805265","1496897418020712221","9541583829692143678","662717030129408413"],["11917897242670565149","16571689952693815294","18267232128019537022","18187970239056885613","13497656397884071272","17524066269442801591","15849175701647500394","17667467879476401872","16001816718916752965","12780726701909813703","8742633182607694060","4940468746576528142","4778534363504752628","15878321444630408089","11521737091092783016","9258741135764143128","16765386156733533887","8461748059652029339","9904760990175726292","9375764010824486593","4758505169381266768","14638887760780382425","5271003007314677968","5710052115043997911","16644719074741709382","12178887664376559318","314529332728759691","4530716438166418835","6255989305985778136","862517121592327881","17219981154336172849","7077853735302969690","15045921812593799684","17806642426592208769","16819937437673803267","9978791037074974602","7956431982034812555","18005107259980558027","5199228952479490699","5176019177122007236","17457851397338570893","3311799920830144683","13040849454099115104","3603028346735332788","4917338228931807500","806115928459269201","2524153976338285540","6096584621358299013"],["8333817828989381285","5115337381024914254","17990965930843490654","8617875176500496362","17785281003187329749","17175025655403874980","12781041716290211714","14764073914982623254","8276409413191657690","2217255641643981692","8501896408784135873","15005594398484624956","7579593451781559250","7671817122150921138","8969732310153063781","10548897026848137415","9208913871926147990","15484131995233867585","15302174198216384983","5459219225370096256","6583552187508531448","4616573374956790244","4489192197349438928","6017156186438050342","9839583385750630740","3946243400902119290","11822396611904034702","2837044100268190612","502933082685917234","12584630370195152980","4548566526254725101","3798659429371070651","6744450768847739985","17365125370841252600","18105152220099094741","8323300208697124117","17131494014266093527","14841734379692136822","10673937153372478856","10013185164021564214","6208538485237318513","5021511386474505717","7550522538535866474","14687243484771592615","13976224767253135144","17542739377234434452","17754987069315797689","1744159284610146011"],["14544605019379781909","8855569225194530434","4552487743417027079","15573922580581935089","14795581802412169283","1595255293676164554","4621899742176466397","5621092930563428563","17698155802567878264","373297253930535687","16900263202129087264","8967319709077436536","15886603081475969934","13936427148723782377","15390295909901500705","11667223522969336700","647117336896520936","12677774598364416212","16170068693708928112","612252430612003990","13497568729693133031","15665775466629973300","9847223773548003826","16696037802977835155","4936139980946545433","9560455783987616126","16158659164272609852","6685303201459238333","15105090700669053067","13467085141002843105","3173906296262433305","17321218474542964802","2280028501886234271","1090083496796408185","4062476513228730622","5612650116312045161","1050651490465360897","13667408700935643240","6659950440434764942","2876767843561968174","16874325016121660562","1380852190075422786","11469363756249725766","12748564369726183676","12129391655780876216","5587737433426487587","10317799744556524436","13940437390096052353"],["11254744560031042063","6722010410941158131","12012844816060358043","11250473516322568613","8579519090554911727","4347798536615949562","6136765996761691682","17302919382006628510","13903281224411635959","1594390149727035836","5583595736365463312","13790256847022028267","323220042512294152","7664039169609946593","6101773026022900391","13442512149015406109","5608619088148894496","10709961284309483647","4760937809261848509","14324675438410683430","3218204129764165745","9369483709159111661","11328312732910998918","11642628897251820985","1640387702868786364","3341851286771622495","7859313472232740760","12500108278906693835","4966857081451679987","15175744867011707469","10264033526029796125","18092680575208973852","9179444842048848210","1295471309033786973","3139505333892660991","10713463510843374766","5888976381139259772","5403954875787420007","12123182216482101407","6481845292320081434","18188593992665727343","9605009897597160606","14711465566707211056","7172183193213969535","14948925893014932532","5122227880393206390","7067803761005026482","14068175844466632517"],["1121512550512017704","8296128574263962055","5140936410137619845","13015766492909092712","9716776091349971156","13694165349959773644","3607842159174984980","16925764337486410872","7881910520813382753","8077547721648864244","18418290238755036158","13378826467875613132","1898083892502148988","11877213180989157803","5521787708820583945","14915469596215885986","5322301914774333279","1266649915412383205","18174935595626225227","1460018202322469438","9127356549761744400","1317493327054517568","7756467247945921179","7067138554405179726","8092750357793357188","6826907060922937402","15587158058043299203","12465418039049490908","13198087328801308283","9442672711243704231","1219236355345871960","18423656750684044796","12336666861839672160","15992160419346765519","12906432338322010462","14225035677254947261","8361043701721450392","6344591152423788857","9964060720183609985","12805918173260402531","5945666957971131865","18066289172747811697","14087477372164174058","12083793130724256255","331313329961615365","2598553255695123436","4970979710280801390","3849119870343393565"],["4631158468869754159","8691226970944260280","13876617306935135524","14599310171375899870","17594797293131417038","16059443090363264452","11098045501350527279","3620220682648250827","5672894270511595997","14175398306012784734","13182098261766744305","2132419770905332408","13255260613068771373","13728211066659988847","132251112614737610","13409068142542306612","951592819735472785","4190387722689692614","11126241315976993511","16323168067011122969","14409214893393016026","15419228618781975423","7130956518782591458","8057460117685755192","18145906147338422239","7470084237591160038","15547133653139075322","14811152683822358808","17976666067775719609","17949975217238008460","1701254986383540344","8567660113079226454","2890396555750347509","10487367310691411324","9406202408774437163","2110954297360150942","388070715013083935","1643377233980166101","11073688124094923401","714451237728465435","212640700020148531","9513118937657926356","7561205190753600107","5851610864952437792","15889988356391811214","9796575089135397982","15784569646027723389","5131766664540714947"],["10392084304181610860","9216721467998263976","8490710500711377183","12634990659833944904","14643006038179989992","4468339099217273933","11402006404485847573","16139385531852100042","5505375580712221721","12259408994326207453","10097190035779275996","5044085400422714830","7121536653304732378","7576299469565814306","10617206172166328993","999467028293870369","14456617006828784713","7114182047225337686","4672765932742588761","15524134902983840730","17821164227867106011","8827819446919355121","9967462181130682592","18350499428690323596","16779394406763995460","12411140112236829367","6936961510406427748","7983286045296673140","2827842836131504255","3513717768608736852","17708045946547006626","15577432123863616158","1673720040972914441","13919936198952333323","10717755993917621431","5836394595739869172","6518845816702141199","15922506873766148798","5724227156670335625","4928634579865945437","11653943739763989943","14178145873864177879","5918221772931855302","12033722772794143974","8227335344750780889","18099191946436283940","1916607858365715551","11939725080685166946"],["4571895066309942169","7523627850690595100","5872492120203195815","11159624652616085722","5178395166239168864","16852887406202114301","12978037924347436313","9149390036685566939","5012483494604105580","3702266839056684728","9017942482933593197","13119938281826116319","2739998602256219247","6670177351568098121","1349822208544836277","11711952829769626254","567021758197148416","301298886950486939","13622246596847279075","12236606004616090897","17777045924375061240","12152517356990602724","6043081788297145056","16868545173121357834","16259449924204397327","4705379070959494599","4903852079113169732","5910637657482314944","11875327309655310842","11748248003449792304","2563549878105717794","1709964457719439105","11239201387847539610","5511489117408832119","12054189402926631461","12562262147641761895","11738786611668555855","13756299620166010802","9242048472403943796","8779553225781963038","387058719281226103","7160915041973728191","15212921478738483935","9797917229312309722","3201254218233843649","274823265935304218","13881894445437084169","206694947832224051"],["12575005424708502282","13114539643754413287","10670952197072925060","7736836294128928425","13895118888335903385","14556499745056731380","2951049918268831327","9256882201201922754","16714758872178084376","8715840731253216628","7956885574050498744","4328339427764091993","12006223966938549579","8801406647263973653","17337542908522932917","4394627975544958093","16687450934374702306","13999860411183386014","11229562123022120534","16273179144590723241","1519104659745274548","5043789090388308934","15957682987321400095","4479872586807449621","13159226283492310978","10761705064521952882","7621262387645824913","13679586330099179151","6961272888562367109","9992582994903493909","16867945672268107887","11337897543698596177","8186918001282457391","2055341437999289032","3400580558186702179","3525000947954846407","2659897964717924679","5828399372032787494","1147804255754048773","5656392533351683971","18098763864694164337","62321260025038289","12980554029145177890","9141777590780949678","3740431304958904494","13778942298154345156","15233831590177463127","594458624197485845"],["662127925615674049","13487647916989774426","12695082767565731615","16530600251172308192","5312173937509177102","9924205084411224035","10800753107972955077","15736924169990424789","5428471159338057105","13611579094226385007","159120227110385908","5974393838757705511","429678760186688569","3536616355599153244","14526398299759599879","7824338618921364897","2867501315198789809","6212905193437544156","17453005864023456303","7066082720802123393","9953494452872780188","17715193481547537702","5866931650084441409","8676289705653871620","6344357234409206534","10025795404195364742","3457915074046192700","1507915661668734868","8467683722367353370","330991305799115842","6888105384774609704","3620353976505154733","9184533725727253554","11757409491461050704","9509090158332292571","5707986420077475838","4397683092769231555","8776584167582586800","4101751412341709755","7224409514970390559","8821950786674908649","15025841317796483370","14181082782778711381","7989219094832211459","5442372595201384952","15965596275745050236","6065317713258112102","1326578832979052758"],["3322691505863608075","1660619648377427555","16397024958302697173","14375481875531214943","16066111391383706191","14342479709879856097","5866586084468196692","1336583890341159422","16827252600562987314","8586424543713633136","12233725649709677042","9113881670380567909","464250856331134239","4532209856748757660","8197539921501671184","15278913796317282789","12410696570290566207","1871171212520463591","9708114065990945244","15451657035936750151","9066206365673562361","7380770031301489433","13081932251238631606","3390565726700903104","2256298811016733311","9814561742070128388","3696554175663634304","11851099552633672802","18350298218210930012","17500648665102098627","11762687649868839690","3615558967836881459","6248593823446628918","16604562880291366373","9279659250245659966","11313191541231170419","17261992449693604425","12163003163424140828","2632156278760376147","11850762876041529687","17101964039370787113","6637742927548298003","160832479150209346","2130727111337478101","8624886336654307894","16178346369629452098","11042466142993224000","6565679244688719921"],["11797330115251061846","4928112223774979424","16752086893222888818","18051380293144214673","13774598017005308013","12712895334196120055","18054403711777955229","10036833537749917237","4940044033868301656","14291047730838109788","4480277503716100485","7586741544765677396","1986982726473635862","12633296453343893067","2698477917910277180","14732232276063056006","1214620392071551472","13297254566776351695","15027559351404766369","3784363331560442249","8252401769971384814","4189451352978973393","17062565490898230083","18309610754068798987","9890639027429646946","6386726308975408331","8474002481550796839","10055437655123667699","15626121488996405821","6492462691197072879","178474775660228432","2581053408330261803","4987493898237913942","14107963587586970979","9479621226093158722","5979729923287741537","5286542806156059572","10307121435095378110","2117671515377724755","14135409707112948448","8525627825463032007","11930892209213990641","6175116904504846393","1342866407199265884","4465490910782941398","9521480036796463623","6584877236602463192","7762867857499053739"],["12857556660709112576","13870546269848479671","10912071096611468709","12439690379177274051","13178600677413498887","6216457417345250612","10709100834167770735","15461234094879828776","10068370209405117041","6845399012228913613","4607260417496634996","17767863511210786085","12185841710888840207","4572794945802035075","1707337237286333997","5676159124030600872","16006149381168262263","15325440882239665319","478821250322720899","10577459133157920904","1801375421550165337","12531951097498190424","3160421731448507639","14098441648642246024","2048659382153231965","14158223783861869859","4084873871054515882","1018473427870939075","3796181159449403999","1051360500636979181","1272814990675806759","3576166149560627630","3996508059588619697","6341944498078029692","6505747405743720771","6897227293551914684","4672171502532477629","14145068688366322601","11572664300155084939","9155063031092388335","16066585758869398831","15964029185788192304","9965609778786175940","7568594304129241602","4083979205708499124","14620580047588337386","14422116401325564966","4584730552826907587"],["7040288631196239682","9977888325394884371","5381506443089204622","10523294334561923969","13492386798381448386","2023304372277366296","623535251629126187","1477820414233661344","17594797045414547861","12239561696713388004","15983228272216062049","128289419809203659","5638714523648755089","1282031349378031677","6288982083751128024","3760295494240646155","9930366539474988245","1643204920743582880","9393639002180825108","14107221932024380560","14440714927536709342","4198008558025138338","11410053875993521824","16775403053457487044","12547128764911490342","5271553905371278905","15187815875834102352","4785183416792380355","12386908386582817272","15954126612469441623","5210554680193752868","17692300074509683116","7578536095574177731","11103089310947956570","4796023429443141581","13382621879659688679","880718844486215747","8117834833945736970","8666406906661989157","7809978679294167103","3250287110286815015","13728195437745298807","11320159974006099662","753248221446653092","15481495024276562500","11012567559465432870","6103175721467158398","11125267416138679493"],["107464972592670232","15575254233241620212","443165938898605395","1946395279869547844","9361201208422590353","18364007147118519465","8245247237518322067","15229571153098138522","13145335701833812004","2476428583348544004","12780438460036218370","1380951209924243864","15235129408266497454","8386672814231792357","2782428702337957201","1795823604703336692","12119805100827491471","5465714048522910337","1538669814677962545","1954620839994415665","11665793921645051092","2552101674142693396","8930680004807032541","13465860500904947094","10314069586498808618","5063218099277474058","4943066730942571095","9740172826474446017","7191295476715178316","6410065670149815840","9265661283539966582","16470252292182444371","17615769044287580193","16648779643143824657","10336973752903901114","4252144025977938476","5479493390254515436","18422366578590754306","1213429850764514081","9305387803444536426","12250311994114557595","1243584449090894718","17147039523051194742","895358463348451865","7936083626743436004","6372712011005437519","7621919183423608888","18379113467569267647"],["409149263832535080","11441953790074588815","5794727867856031807","3033667386289032602","543227243998160745","7244451866400957489","15242846939900673889","6480449240894970002","7427412319179563237","17201553110672950786","14691594711474274821","17838948072113068566","12610043079838442609","11066136548628359518","10979507659947164697","15159088574084019946","12234514988358722842","14278022080743306524","10274232772033275055","10845495477598046010","15039319386747158289","12542121551257119950","12816554036859790698","10853807620419776022","1839721730289128438","2148981699712455157","6186432781528526432","9771633067547415176","15461696179126157659","13875934142990365870","8725616320876024700","12027207003113822183","8630764689497678499","599131138712981550","16268451265739578897","9431446160537257296","3365913360113119683","5004418672965940126","10078432366075280707","3527720682193010556","11641577316364551792","18137802507627038395","15607435155505346774","8643085617544931813","15954814982811781711","12639476751920204492","6722796880218438275","15653768454800980367"],["12357402980251120577","9293923024427369467","5166797304537768021","18270152183757669082","4269219729038350982","11442793087367963255","2936128939663261321","3357444392313186190","9449173471633755047","5244427293928791630","10427319258628897434","15243566905420572635","8028918490726104262","6101970335465058217","7887854611236679337","12853106827154542163","9619491100669570799","13237968053513866769","10340648004735561972","3094237468102811712","15207235729424233798","17290675241644093762","6207818639116179918","6474970316039677581","2779880763981470137","14907327176102361312","261171581412394655","15787115425616737279","11585580526551232154","4339768148272910014","8641313080628794630","1621963665930283842","4564196889866261235","1937581954980048460","11772133944992961192","14450096328697940715","4587017339202466022","1028415052544391846","15511613960887298535","3105084288462994584","12206995820731221524","3323751818497804824","7121908898129077601","17804638109635112522","3773521212933384979","9458423763036563666","5826556303782174383","14250044972037887147"],["17776831496943742521","16358980395315533695","11640300548579116448","4799198202606855174","14863218318075007355","10684805480207708745","4589665892360613927","12772669051392950354","9224603395771289553","9800093558866628376","9061976124073929385","12725768248866192693","1656534941575976856","17446921941359770470","719203403324151141","11645654398429783893","14179041418333619497","2926040435600501442","8344782233240422769","10741272015840851861","4158953506272916272","1184732074349272456","4591743733377866355","17564683457894177485","14464205486130758149","14978871171143096864","14763053137349522095","16171233011745407703","16595670779517151657","671886940016376002","1729383693136811398","13054364574342604093","16507886231455095336","12428224211977021017","15240673277355538990","977458270660166459","12990517302921902697","12848429846313690423","6720400572588992119","2322626203861591273","4256029890118658455","4108469905187897650","15867043878031379556","3418187791927623113","16312636950899177506","1265876084848737141","6226166571041338474","3177565830433868101"],["10480909583530376016","17220626972351869734","15784742368377182439","6364150303245292009","14341790094693990792","6378747097901977589","14257739615025023667","13530207081831534162","2955469905622519018","8426340671618761840","1922744316698184186","609670088203172700","6484929194510594995","8105507399601607527","13870042536196931619","14262133923997394004","2310309539613370948","11290903657441027595","15540200495303448283","17462944746696205368","4466676217313706824","1408631104853819564","16856989739930881586","1201132315663841007","13744787501061251303","12500577246905924443","7932195947580270189","4170918347773842290","16066943603436408394","15588089095832798035","5256300602814134388","16293157700588907277","10558016217926718637","4836905341008106648","3545875279530581162","1037586910200840809","13958077129542504640","13490192907450412621","18027154426307968608","1510572211038387169","9806134997481611454","3798876833645854098","10469846947494020069","16458782408724938539","8863296513473575745","7928382134275763920","3778934625101432040","1663047228364007312"],["10387199321866558476","18137157694038761098","18167377172715452329","17437233281953724425","16643918522281827633","13307443695172203329","8761673693708414023","8973359670092084935","870409645844101365","1745415748480594515","12716881140606148380","150543434264352943","18014039531857429251","5083941774277553785","10422588499836098122","1238818817894248211","6662588991336351112","2755261036376202235","9369958760257774582","11148627875666681087","14255006947761832929","10787163298232070580","13933331035271215565","5819718672242394493","16117042594624514038","6666909679865047499","9962396598081382858","4213621204873257914","14709656605839065189","6673789897775478581","14635941724046917486","16669624633617338244","12934567139987830915","18228017051059159564","1466858938833031094","5032204483889085225","3216066731655166131","6351436553353033745","8033336196921617978","13054127429967543483","13651535537149315101","1421164287297875886","1693432500359348274","6209985648855430194","6673183113695205947","388382509835648825","15207537886028772627","1623822021873703944"],["6502842574618209415","15281841333437353903","4942374743707598270","2631351128272441297","16562504349165832282","10794657890221976602","6750605966796819079","9439280577664607107","9187235920448933295","3688781209981625454","12634874920341272305","16466870777722249365","9329181462260611638","1235487926385171950","1031662561244235639","4238745837144905295","18156792978549344707","8516127763645048763","3916661224854407627","4955922038180019607","481122185256347291","8928762043203171088","2747092275881159248","14949407477295847147","2738900289927229089","4281245126263062308","7991658532163595884","14252528722961730334","10080141666939910229","1228443419461354645","15005606264069447804","1143109318337689715","10633456790559020875","4778797110830921540","222410734166111776","15632521563218668984","18398873470170298691","8204009724722231155","2862596747909725594","14918093612036491250","13000093102452776830","1896145580790196229","2419673791551643286","12757964714022788347","2838493290795209747","17479380204386027195","8544500539415814166","13772264209600157021"],["10874874818550473274","3238965536918417099","13420650066610998526","4374539594769661074","1494781706943465932","11406982878550766620","14312284487839860919","13391067709808157512","17286778881867700573","7950780083760834963","17355610941609691995","1094784591722053988","15853645657389928897","985925146231763908","7964326269359262610","10817813270914743148","2520799487660052933","6743419098080224496","12836040486283881710","15857398565775555403","17149094890363028760","9821068314145668540","12176586622738151629","4301928643667392400","3919830412802928482","3580912866921918343","6419869293548100331","5528676848881967462","16986721977948622022","1619552128200695119","11264651562234484420","4343268022112391547","10473257466275219680","18150248567376170476","5071202813466700263","14216391326122632348","6546983962268456790","14303523845421256938","13332662039019640553","4373792132021587715","17955796190440459551","15536444273767588138","3202854070253196316","10732506415993416238","3762911184490049650","3938263419022012568","7050722979028808894","8459030430998765318"],["13836634287953744272","15219992030217117761","13590761466168053830","8242087909549020661","17618910808322030834","16467563476303359981","16063970131176303870","4321581796547048708","9806400743415845592","17603466944840797547","2168786953795858175","4640709940179288895","5363641066434034084","14695847013004241251","13422905846009317497","3925561220058815502","8199117028514992243","7678961709608828312","11785196800611046717","17316827425951910225","15856176647056730692","559276176352343543","4817029127629695815","5309383465618021390","7976600631929421279","16389395787658537620","13501313466060508340","13820894238563452406","1450434320549525174","6896626032490322982","2054842505501167952","9152800091357402261","12926157472915874","8971026815947958005","2676983129957417703","8712295855037636872","12386939889457162317","8867845693172877313","5560608500966274271","16321127569862657776","7496353038027312110","5708296016300885552","6577686355996294272","14313875636053867948","3353765867781671480","1924558602626400393","2553344559785729250","12945099538136760056"],["1782589058920969740","7084545076713286940","17860552798091099424","18156559650753510457","13457375132366481058","7551580620651860435","18268018353143255871","18230654915213542600","15762914850355661921","16062195963461816384","4448015027730242675","5024693784501574648","14529275274469205749","4500358222042565607","538765036058100996","4660113931680242957","1497659627831752656","681353680652475442","13292247930126463356","9882461459946076326","16583671982612439884","9907255343190635609","17737035231860194151","1518521685150993129","5583575338400347612","15890119111653503414","9561849760997110539","12581878303785728136","5180296566913259782","17744352117252913264","13485692508643804530","1740578782216103614","862721654718745588","7857763661679868066","1527296714126831437","11063515597198749971","2432783851849164145","17160483684358602185","2735191305619215284","4623040598575371638","2719468192252875513","12707237175175186765","1073433803276740724","15291161395010046871","18245347497779595580","1672893131110891518","7224588217288741647","2711673832040494546"],["10192259832188826720","5991374080986707605","15705853912652127470","843206574656433842","8419164775261542780","7970624636074787480","5677579978474032109","1392183536433471207","13271367861585429932","3332657761056896547","14216973870954850036","13625568266034454986","5519132999593602277","16606080220551845533","5923635040076834409","14136116371806519094","12277926061879652335","6199039836181009686","1350446641154431930","1627002717160622473","11633943957177316072","9039074940053714684","2265375593320853152","3860205132820288572","10185968099688094785","3485187431347642620","15764752704674492848","12177988979226636327","9037396645177599999","7386625870045347614","1766703552909222036","2018557789232368592","16940359358263674501","2817120157024733478","2861656855679327116","14565355885050014843","10405593797210792070","7384583962267386734","15321854586963300335","10959640129434405968","1789349198509299324","10921018818129159365","8569983951548098774","7948859644157852784","18384757863027386556","14285992641233125170","3225959186499118568","10943710639183594207"],["4191534703985729032","7682095371933904739","8244701803615574994","6559657541030189213","657197171802106371","566079830072477707","13165775314143500280","9940731894908410018","15056477531220415027","9248450925460065337","9983829456080683061","1328965235314974705","6556747684483817119","10735315999995433525","14446864046362737172","1252805016229922109","13905519143155136392","2284703214561448821","4328719830323913638","3114001393139957178","8362136210943889324","8795541452927917362","9927881545868853365","14460420473785105605","14361193332655340351","8939025490725384281","8520580232722300276","6351264003872721166","17499097874026900195","2633925716565584400","14171328895200408123","7580914164665881747","8088414558906410085","12372629719110845094","8677798203810570474","2014316266013518823","7920677836233578635","10931604152491065708","10645817816481296453","12589860224973964297","14244568317345911699","3500877163777957986","13238144290194132568","688395871465301034","6212001805849048682","5102608537088883676","17471170226623098629","1688058357423782286"],["10846854721104365925","5068767440769686043","9790403025723359234","8013951761817645338","9858640277009856708","11281427648239425291","14960834180015728977","7749534040285205514","10470196850482580905","2190228462970680418","14714595744936870851","4412080340283477771","4015220510867980572","2781896750835134960","12802830576945207036","16821345792987084280","8792986499752308998","1127269348791923256","16176379562374468144","1297082739786511028","18080130977848911924","16568844798038436111","10668767056916886760","12549239505397226513","13258448951673625686","10222370442560379459","1934150052512643952","2318712841999293474","12863905441658293704","11621081980789677282","15695324910949586185","15055654105466082168","5032797000924595556","8213393226340840504","17053663101267247006","14076645061153582287","2409619399375536460","5583601756217870590","8621278017460504048","1995252050793967004","18154725477336224056","8260820733185110162","14907566026925718936","8615812681417811815","4525852834626182130","7203700444198329428","6256291502102668561","14338816717327272130"],["17581061448143730618","10703515341173684302","4411085648866854348","8266330894310182207","14785271808441606769","7645316290068140893","521823368905095900","6184377156832543501","67062570328934275","12110692211934008265","3064290631312562187","11951332637734613223","15959782698148629981","11796121089839881398","14587952994536321399","16383957729049081875","18076745385295811137","1994715869668182315","4737980722005377012","10609500514928112592","9835267657107335053","1827264211821911962","1543486445136407644","13915742523987382318","9266405293406115036","9414877388475043538","8154405697419918697","2809928510331265805","18057991535280716531","2921591785046197543","15876270411599197203","4544258300459301532","11317613262833424844","15385357051260407410","13707875088156219297","7118072719766089589","9637607946217837478","8307313235726654994","7182595659840416622","77531736852724762","7355878901593572006","1311300990623122814","15684016298446414038","7336213945356196866","17526072363426691843","14886956535682082076","15256656574028942992","10614916619433102551"],["15663358909250792790","10230489881771228935","9464202551379568274","8479257464702244237","804302436607867411","6953721367971667969","8840296796243657857","13954157755457061559","6499930920779852232","17601681086695446014","7535883717358329806","9836587244094210544","13786236425814255166","1012195148226945406","11942745161670767817","7027284842335294611","6749288195103946143","747815042630595169","11069729020746445718","16137478993428552116","14676258051705051493","4679549723504151186","12094385594357158145","15666605982259025158","1587309216674221371","14523322798457285232","1179156899237028967","4460113273765138960","7398868145256680483","3991460453126143241","52678693850014054","15809317014706207967","10305824235192835253","7155644533158854733","6799691711537626180","4279165566482921761","5412568856487375741","12021928509234861047","13954043802418405512","507102894218710756","7404376864761317772","3911527466659699398","15803581413621274862","17828130902721402","8792037914097576821","9552509941436286126","12576754023158955923","17811622754496864610"],["6312330063004407045","13861626225378959567","2642416293568113995","18327613571353283306","8914169774349727569","13452464045036391243","16281502372880522915","17426084365454798749","2072953268259651156","10029043949661949289","17518132924561650731","13221266448114593375","1321319654898059668","6443384985254114729","2359737847635879862","2403618739863894259","1804229778054935816","15653817954270209711","14261781097469715845","2547642886540317530","6494188014558902656","1567224512273055557","11250853918646397815","17017554231892070095","16598439981296256906","13501758354923097346","12690461336131911799","18256783368239838633","9447569349510761215","12142942435183618191","13334419094294501491","11974152087998520588","2081351604596229742","1974062134878227647","8769295912646628763","12218581782547967085","4020112323588532775","16257900154960396563","11993385041791821352","431692492069969504","16194241288146000239","15566245164265295417","5403244371973846160","15826791784473468068","12947065345257947228","18216841516353558621","18386709575273894225","1789901412328273521"],["12517125927960636533","13540197451399596063","16425000096129088717","13531414246186665504","6515962779060711185","6182173991031128284","2619665812228538617","2550978425930980233","2342648598238984450","12089527028613066337","4893273125330143691","134130932372426868","6269848511099040392","5309291851123000763","6239126454801703329","12312786632605067653","10279010265314670428","4212593050707400421","681000903951483326","16574548625707039572","1887882865604635422","9852928231359073446","1312249716308792269","14185840054938628097","16030854567203992451","3304754222395438038","7417992076743314461","8935719043284904101","10278552331972321864","4142076142591034051","12967760223971607399","17105650668418652593","1512932403759740935","15613714779656684710","9414646067668279564","12960435980090512750","13407099665073385412","5024825789691519024","3960928957619570246","1149241892935568496","3333312821384988598","2545137770435656306","8806372813524616484","8066081728420694899","981491296753452214","13646061608272603633","1147262048078326752","16757901869771840656"],["12252533511193281801","18316734848931487930","9858770009590834409","14056700101020614555","11148046290145839453","1632767772564766498","2704549662158432831","3060483965842716863","16606725157985850939","8602514970136082595","5316663950753851490","17742508160786013881","10196728936531746284","7515155163956654603","15939399743803466222","18336370734399189301","10185294287841898004","1737004675694451908","11504089551959980344","10113768072457056753","14553226128934388854","14743164146688206398","2977533178867335019","6073853929758295509","16411817439877485735","3896004538037826950","2796527668260211105","3576380067029842101","10743872914147016319","5324682523869697501","11613047153406299870","5706930711631738277","7237733060753016238","5853790384764413647","15225431829706522809","13244152157463944141","10143019949006558108","6881379966597481569","6748697240223749423","15544998393679213741","7534613649004899509","18344018262592351544","16421510916939200416","8333479289717123691","1677672334335672353","17035593121175641307","5305758508023580792","11550101477532381779"],["4671563895209033373","18098897966057851173","1357049656849659816","7488746658703677196","5928466837551633787","4359084752706421748","4617081422713257512","8488655530317845150","2956968659772338084","6809207319787873551","17860146850441338967","18227555314234400336","10964617035724739148","10147797746225859965","4609687533692821606","2125400452305694484","15552547133124571411","849754285952481149","10557591573788699221","7905784491025269469","6706490397757715923","13303069178568820369","2624254122477458577","6136737138849349092","10622069573358651970","16700035004285986226","9270508312994964934","15644072496108339472","11553320405060968948","8942172487541476127","12575595488627129350","15399287425631096364","15376550790623311922","12437801267069077057","4061042588191652140","6544009061062523224","4621927972334457858","8021402657471331408","6855859032955427606","5661759962730952174","15872442874851416065","14771721457559000991","10091499587108889986","3050947762369420399","2447115149775937562","3933807832772577526","16929032795433964967","149735589426124678"],["14544605019379781909","8855569225194530434","4552487743417027079","15573922580581935089","14795581802412169283","1595255293676164554","4621899742176466397","5621092930563428563","17698155802567878264","373297253930535687","16900263202129087264","8967319709077436536","15886603081475969934","13936427148723782377","15390295909901500705","11667223522969336700","647117336896520936","12677774598364416212","16170068693708928112","612252430612003990","13497568729693133031","15665775466629973300","9847223773548003826","16696037802977835155","4936139980946545433","9560455783987616126","16158659164272609852","6685303201459238333","15105090700669053067","13467085141002843105","3173906296262433305","17321218474542964802","2280028501886234271","1090083496796408185","4062476513228730622","5612650116312045161","1050651490465360897","13667408700935643240","6659950440434764942","2876767843561968174","16874325016121660562","1380852190075422786","11469363756249725766","12748564369726183676","12129391655780876216","5587737433426487587","10317799744556524436","13940437390096052353"],["4698104283668461017","9412247492764893608","12626510778210433549","7292214218707760549","7245312680255463495","12865350471564817375","17665570546477291417","14715389183750456774","14265644855998363274","3795500861117588830","15061001997604164464","2075062189803492944","13205838439826265175","7531723778460111980","3234371498498736918","17343774830155078157","236960148533018172","896269488390801562","7304112152495090547","3046314248819491667","16416825182257182244","2411523581489229339","6389139544795967297","1668142181664738000","10544643565326367908","7621523129380939968","14387615438123675596","949864935290223316","9498551339372597073","12914685929168835310","16954797795102394819","628511575653309126","12885513146966766660","3240013848703569989","5670516452038034148","1548867547623326527","6283449059393098867","9700789305545143848","2877743549013989239","8700682519738162909","213092090005268717","13474408589946129386","3556710166187455265","13524476520001422796","12624528864668389261","15242308615103235099","8477774845948721138","13533992828367956072"]],"s2_siblings":[[["15398700077206669175","8496911131387745015","18308564967047449794","6399336225829358923"],["15027403843963942760","15523568040939176140","1379891360039267032","16751726054019615581"],["4841759349225454179","1091771722638770175","3088528727912428679","17821207306376279824"],["15342802028424230437","9822594801648722834","3691799680071204977","13349428620960015538"],["2380908480292353184","1675697669064850620","9489079491273220384","18082538256390976146"],["7583817016061181510","10508195418629495031","4211335378545664879","12611363990177817366"],["4745219723703540634","17437478794531425373","8081865301411265454","7666281884522524889"],["6536560404196259978","14338295047623938542","15089484244152122028","1207456580122437391"],["5378530240737062446","16358272330356195648","13586350766181556507","1494975118906435444"],["2700513111870296612","6314849827031882621","10812522701082138792","15696937100182214002"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["6783197512672898530","18306262063320550430","4502967878505924801","9766209640453138028"],["7173262190557490444","7843697169378073336","4831182276591167644","9073884627055842093"],["8038102872427550436","11151644483309143078","15181819447724852839","7297364033160637633"],["1008970278289551413","17670381145317854475","3539835348239494278","12967553070025378769"],["11404505321499596633","1964881510687114586","3810230544020032623","1037266860194117842"],["4748784065785260513","5262467297699184116","4141232069265056137","4809956534400803871"],["16272089131118968222","12930554041433702981","17660509719346898306","2177961476204831665"],["1641401341465421988","48457465867460298","8744221957036377180","16186388945804147761"],["5378530240737062446","16358272330356195648","13586350766181556507","1494975118906435444"],["2700513111870296612","6314849827031882621","10812522701082138792","15696937100182214002"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["13176792826493674208","17005243091592920983","4500619706442354289","931423528213791236"],["2968503832544935128","10927841909172975350","9677742028985001391","6814490468234317146"],["17762345528366618803","14453121904923835543","7855016092504333083","13709478722658542286"],["14568432245376734750","6649763067716935745","14949532430721293515","17053904710437626428"],["15310712951144338527","2487816454474949942","16839081790561958714","13455346542358154994"],["7714113222269758539","9178724278501186539","17050196140618408058","3932298924793710002"],["5557566818795771018","5286904619137318490","17508030940685542645","6409341144146242379"],["4551906198411418131","4235218928038270826","18329497730527954859","14877660610072645731"],["1419955774996713306","13714336304642438278","5451666778568513763","15440544494494690643"],["4504816999739572474","9632670118840620249","1180169010003542491","7320118674558686242"],["4329762996131281172","4657064038668212908","4148471095820676896","12188262804816328060"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["14870392118916743453","6612832951700779985","941661186848968591","18030051889669743952"],["2076923272496847315","13686024852262917422","17088755795072617589","17398856414001247798"],["6171028382282797730","7877155051474216862","1110398456902014930","7899097474221402080"],["15990186611156121144","13167516043686086428","2327065323932017959","14370100518738478300"],["13729896567136293723","3781011263248110539","12472064010304545769","1853644901171964223"],["17798673794193783485","10681158179644196845","8543931282445549090","5303305371517994116"],["16138161455045669055","15232051674068336484","16381084983512346853","14562937805968661930"],["13016931117655895427","1908983171462536550","14455429579618137404","3778249422742823835"],["15737175346005982660","9566380083735122810","11072622188146678203","18003444061160805071"],["15681123005371531346","5405755441601395175","498618155116262482","4030454527759712758"],["13568533945164405389","8201137447203153971","9093957330370159895","3249212595344375264"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["11482861425314337227","3892384328835019744","857483015514149381","17773606236758314873"],["2505835581559491998","4618529895541863714","10310089529209517074","16800427639154971347"],["18237504362395072376","7072953789517184400","8849801522825604062","15248109923370475949"],["13944474333744562658","10243787560393022256","8314422639989856320","9089579951785296837"],["15269375325741176477","1996767078730946228","13086132396481381651","15858387672384129902"],["3474466713237586175","8255961353122570829","665572698101739653","16963173700044880342"],["6116849960735419960","16227391487307910702","14631874610504430228","9768924566389309595"],["4551906198411418131","4235218928038270826","18329497730527954859","14877660610072645731"],["1419955774996713306","13714336304642438278","5451666778568513763","15440544494494690643"],["4504816999739572474","9632670118840620249","1180169010003542491","7320118674558686242"],["4329762996131281172","4657064038668212908","4148471095820676896","12188262804816328060"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["8720493118335578301","8223249654881965619","3462516636431552014","5195330403539947841"],["886336800749556211","11196934835585647926","11704451866639215899","16618375673673142372"],["15706787126897258427","17829361867134304334","8529837617553651748","4960028430150388907"],["1743536064627673644","13333425620249409053","8098256181623585882","15320864677425599108"],["7222418986416083322","17844171519053399829","3186517616601132798","12103399024382979745"],["7483219341358846970","9509560228239553383","16081527281617659914","2508205126505952559"],["3942561555609623629","1198025593278545635","9853394538807328488","5591295835418426820"],["15145992810723473946","9763564055092670763","2884971898981522559","11903443327512378529"],["15878757401269033482","12878592941333371129","17239822757545209880","15999447206951164222"],["3866505859158688769","16239183896694796652","3400320229581165621","823896886387516124"],["13568533945164405389","8201137447203153971","9093957330370159895","3249212595344375264"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["2938951626096164573","4708012201021120607","4601517258575088426","10766040535817145579"],["17113752557565157542","10342035836165715790","3449691506294920457","15656374354473450457"],["16186475728086164667","772573569392700387","1107652318443153287","4623321505683813189"],["9276136741925258631","8148995674538175542","819262751748605107","12382454650989834129"],["14672124551226653329","7021818845133152529","4147670836700594243","18224351143140597720"],["11589873603291061921","14548759080735467963","17747908898846588818","8692828458476674818"],["11288015444700610473","2758532360517575356","1251513350880968332","6745523629214408505"],["5850059447135113806","10875831709234300141","1469528551432932324","656393147189324269"],["8928894877990459840","17869655538437614950","1258717438515084070","15038347673796769819"],["10421090023928065955","2673137246008063046","17875426511067082800","7318150969941681986"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["5614272067957976923","9144624403134588537","14848473394135040867","11809639674849092867"],["8674602635998806889","14241742311449279336","1509737340228308684","7250326417192011821"],["9442564903481936492","3926907550007427414","5567164716546658000","10760993548957441564"],["11169399986139677673","11522002659859523864","611613058633109023","11719865747359952346"],["16732266189722524604","8955333467654739303","9944402168543347447","336672552821167688"],["7046101230633213262","6315174410647742652","508983411666223014","5020116972323522345"],["4928386620266924107","6900917183349433335","9309621383773259526","14127683911743296046"],["13016931117655895427","1908983171462536550","14455429579618137404","3778249422742823835"],["15737175346005982660","9566380083735122810","11072622188146678203","18003444061160805071"],["15681123005371531346","5405755441601395175","498618155116262482","4030454527759712758"],["13568533945164405389","8201137447203153971","9093957330370159895","3249212595344375264"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["8511636411467880882","15348369097015413732","16192473585758389413","15413697641371771760"],["12446566914063547120","15394313468585987980","2557040567013128197","7257237264212771923"],["14017929764350209639","12249451239170451654","4418764423225223225","7984888994017556212"],["13736371178080423080","11771793416513764539","6271683215994613902","7395785582797874275"],["6531987167255898289","1978958677880207108","11015068235024646939","10210920315917324916"],["6478261944913098695","14135123303545667392","15955166816610263956","6094392445032592416"],["7569917884301424722","2554633662035038301","16845387660862029843","1728833121785397827"],["11439760113093233704","5074598460859141122","2505023386232538904","10164772584923548226"],["8157920207093873742","10430834520554526525","2979439591605014964","9562202650473457182"],["15691844471368866725","3621930785304940299","7415340602480443144","13078402767103666457"],["4329762996131281172","4657064038668212908","4148471095820676896","12188262804816328060"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["14228701912622412489","13325216220669113101","18018808860407761826","2956004081602198140"],["6669905978933314719","5947570143250428625","6137151857166114866","5595357885857742522"],["8586010305039173707","12990308507529242036","17514478590585565750","9758028749480456734"],["2446696145404264318","10042993240852835117","2465971705034348872","17613183314042721336"],["17489359816428097536","12202701729790534856","14949034491015911971","12086571141792693961"],["16435885974427622040","15846785123286161855","11002979333951088367","5317240912035357733"],["4704831577373799275","10302721286206846139","9929095700862603981","8674588131590114254"],["6237260752504837564","15958388509555691824","15576645380902714115","13767778050551667048"],["5431533101970780308","7773628045923148851","10812861492798466572","11179912013322848067"],["3866505859158688769","16239183896694796652","3400320229581165621","823896886387516124"],["13568533945164405389","8201137447203153971","9093957330370159895","3249212595344375264"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["6314861197697648392","13001502201064562896","408712037534252945","14516913833897101265"],["9656910677057516675","9581183421503674131","4840472398867761768","4067079272673580047"],["10942139675797518550","2136487545522022012","15013225556036496664","13560632312725521723"],["12903395137244386223","12697539879801901686","15412613895781206300","1183117915713638958"],["13436856511360494285","14141821171006910066","17770651524970967884","9736839353574947652"],["9953202325055558419","11464123897755913119","8869576301007701412","3056625001262616643"],["14931307584978243878","16750584954796649299","16285335340702452829","12484990672445574578"],["111304494622140278","10310669870145373064","6053570963680918081","555757195079031738"],["6825932191083426690","1085961034632789547","63461447141558860","9041352154230400769"],["2591210778776702806","2103017880750362883","12015912113437349893","10678826465616977209"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["8690184604686865095","3707831139112016992","14110005212468010145","11309406796915355615"],["13004660799030249001","16714559626067603148","6227878960601404955","16409289348640729062"],["4728107729884326791","12229657714939987696","13675792238638717478","13215232675555706598"],["17020700168298395433","14750883777531114008","9235955780680389297","15318569672934208106"],["2031802916320176548","16222520961003088851","12524324590813370585","8996913149986291868"],["13995222713703324604","16973705475377422887","10741208739898262369","5189001738945314584"],["6701225835244686143","3326911284305582179","3385545841397101798","2288763331671430105"],["15284187107182773076","17120181532635779190","16205142860597371749","6529712522857658689"],["15878757401269033482","12878592941333371129","17239822757545209880","15999447206951164222"],["3866505859158688769","16239183896694796652","3400320229581165621","823896886387516124"],["13568533945164405389","8201137447203153971","9093957330370159895","3249212595344375264"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["3799920833690554647","10685859439042562160","12127862113286330697","17588135933265504152"],["3617337749484969622","6738238105813763016","4720202708794223714","14613590053253513027"],["9626488779927162343","17013375497250315202","16457005149488946085","15240518719085233685"],["4608337079552034697","7632418126245512502","13990357752927251827","21452085649263230"],["10296201981462890589","11506237324208027416","15695636189046429490","7734408519058279324"],["12230844536279596272","5397045738965813010","7587551031452256645","8550411296853803480"],["8732445404600828713","10327852063606644931","14647497066903920471","1875421378608804365"],["511476553401424432","16889393470521259361","11146274445792634676","6444609521782507784"],["15010129799732063634","5422269648492478375","15774131912622527458","10236331536063061932"],["14413980873981297493","16046810422443588175","14165163023062693603","15355738760344905060"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["9921460290409564045","8791805352467722237","16709196522859471868","7150701797078907054"],["745737472986733161","6268121594444602189","10104864575754735026","5075425360814258717"],["18390076111752658881","12422896789142795453","6253982376992787799","2469551217142746311"],["7387754495461028406","13274217765942936368","6116510191584213950","4857915198138201821"],["3777915130729687483","3944579486020637993","3642422084710585091","18364616454142402865"],["17946265536693663446","9664138152135607230","3637947374641475994","8847395165040800372"],["8732445404600828713","10327852063606644931","14647497066903920471","1875421378608804365"],["511476553401424432","16889393470521259361","11146274445792634676","6444609521782507784"],["15010129799732063634","5422269648492478375","15774131912622527458","10236331536063061932"],["14413980873981297493","16046810422443588175","14165163023062693603","15355738760344905060"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["7685243163718391594","162708968182694703","7951680958640391229","10720291981139284565"],["14327641434293818763","12662159160305879296","13782967452353010468","9798460246911872438"],["1258397128229793528","3148101701158321642","1125098589718131842","1493100635224126020"],["9454039110987357073","15424693156948855012","14373630553159443443","10009121934861302525"],["15836750004825543879","9535186189624492517","9379983707438285753","464184340775656458"],["4748784065785260513","5262467297699184116","4141232069265056137","4809956534400803871"],["16272089131118968222","12930554041433702981","17660509719346898306","2177961476204831665"],["1641401341465421988","48457465867460298","8744221957036377180","16186388945804147761"],["5378530240737062446","16358272330356195648","13586350766181556507","1494975118906435444"],["2700513111870296612","6314849827031882621","10812522701082138792","15696937100182214002"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["6003729883027321907","12466020552060151101","9952601933453980439","15811684386939584621"],["11239126906035953983","14340932068174659915","857286970237562117","2100104005364064854"],["16653220219835571716","3178231256426843952","8640070425399463643","7835583427807488568"],["10976402558679218926","10461871837929851408","1603578186952563414","12386573841416556527"],["15856468370399705041","13670592717015347257","6241440487002112540","602370803172939396"],["8358361076996649356","16734212682831456046","12938431451257469626","15339721924734002978"],["6800468195018661965","6401538554864204988","13544082149660281733","15534699960320855019"],["7904695853955569333","13806858052559634689","15966885892228289833","6795024403608202495"],["15023990869374417757","16824578069317518283","6435532770348733442","5288192420896325967"],["15691844471368866725","3621930785304940299","7415340602480443144","13078402767103666457"],["4329762996131281172","4657064038668212908","4148471095820676896","12188262804816328060"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["17732833774069351113","15069727992723313767","14561547005436897098","10161684309177043225"],["17497439664768379841","2180474554829300823","10464387238616572572","3788897624834568884"],["9341256023865178834","7314904673444386651","2901218740177144375","12683351952482157117"],["9077615443641356618","16569128838774531270","7036930973497448079","17030659232835640760"],["6687227601428626563","14964625538921270418","6607592144143090845","17989405818095370204"],["17938514737428168353","6865585645788922429","2088686363498339654","15098266225500816874"],["9005995761792339394","18342160277272797043","12069985136140388025","8624261768659489362"],["9681788306968233021","6899845223895149557","5070111704634449047","12750132796510370629"],["11691148543986561797","4380313153719612705","18411706146708257783","14032693996308575486"],["14413980873981297493","16046810422443588175","14165163023062693603","15355738760344905060"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["3626136694078863769","9543554658998959670","14067390305110952936","11679275975401561181"],["9780357746690456994","15112222920891487188","4690996396774031686","6454299292618287691"],["15708041817100764540","6923689126435198428","11111550483844221877","11301895802554881044"],["11998530714199993220","4384302521591907106","2928849079010401490","16070735383092732557"],["14312516419723752346","17927131939720569503","16321544010493590753","11514812306878205421"],["17938514737428168353","6865585645788922429","2088686363498339654","15098266225500816874"],["9005995761792339394","18342160277272797043","12069985136140388025","8624261768659489362"],["9681788306968233021","6899845223895149557","5070111704634449047","12750132796510370629"],["11691148543986561797","4380313153719612705","18411706146708257783","14032693996308575486"],["14413980873981297493","16046810422443588175","14165163023062693603","15355738760344905060"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["11741222493303598318","17856477071958397806","14941158030934113034","11007115599763149014"],["14536190652272538893","5446872818538874785","3777858660428763116","17870741023015809248"],["13519928112004195494","2231440921177341043","11578850269150571833","4576210896480914058"],["11082627658061812350","14827792816749997513","8947468792491090500","3119006569779098933"],["5624567559478770313","5090381209805248976","5446096240175336532","2928021119745233084"],["4949159846353660727","8295686997617887297","3455857299441251108","3405510196909839421"],["10290817744387206796","14025073081583220841","7214559900179435362","6867865064340768175"],["11521041003838856616","17735468153318604270","6360015763464868884","9043031111883992170"],["3693748946358810436","10822484197658153079","14426020925318478605","7172421001142342982"],["2700513111870296612","6314849827031882621","10812522701082138792","15696937100182214002"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["15698836773742869645","11935853022173003997","17296897776187022689","5030712288352930197"],["14952991251174678386","10881537720004346991","17760573740304946165","18336034315365989452"],["3367125746697439327","4202078804028370645","371484740077938479","16887523005353242438"],["1638877292153210585","4067278773268583446","16466451268342415786","16252068438308320501"],["4475665617346732189","11432605411772474682","259422376380026866","17285433857415312749"],["5360212891749069129","2336074551826392960","8300072284753092292","897807675469834119"],["8290147366653687029","8619426473764140381","8487691525023090070","17731585523407986517"],["11585216368446013789","11285211836189007334","15603094160083505741","14767200197081193670"],["4687143070046110205","3655549954678054066","15426033990974862455","4587849911614743390"],["10421090023928065955","2673137246008063046","17875426511067082800","7318150969941681986"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["2373685548010234809","1874875283600153790","976902351731769709","23598313614393980"],["18376392695333030194","16287405688532824654","16871709893645360357","16818161202978616324"],["15233742762966041622","9177268606917871675","10779221562097239882","14226589287442962915"],["12744746858725041335","6853278812380042232","10613048743981464777","14435117940087473704"],["253251741058002375","14822857772763445781","7313744417501084173","10864579959023813345"],["13252968378922486473","8357002245524452015","3771669135206226351","12290301569629643438"],["10620377543996687701","4992596503908716896","564130610866055162","2863975912369514307"],["8906601614834092398","330460942611277196","298335515022993012","14617343949218991777"],["3693748946358810436","10822484197658153079","14426020925318478605","7172421001142342982"],["2700513111870296612","6314849827031882621","10812522701082138792","15696937100182214002"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["6143432808399955038","12263413668694997865","10129783874556798055","5552093853563007565"],["11976154228751995883","16975551491074435089","7080018635721668728","16866801555241202113"],["12764754637798312702","6617425266022507051","7921607886118537549","16166449145912605844"],["6309584074784136433","14122375253691404049","7595240532697936903","5609327164988641255"],["1472632920265064047","14034161550452314798","11013229858654148069","16563417388768417291"],["8358361076996649356","16734212682831456046","12938431451257469626","15339721924734002978"],["6800468195018661965","6401538554864204988","13544082149660281733","15534699960320855019"],["7904695853955569333","13806858052559634689","15966885892228289833","6795024403608202495"],["15023990869374417757","16824578069317518283","6435532770348733442","5288192420896325967"],["15691844471368866725","3621930785304940299","7415340602480443144","13078402767103666457"],["4329762996131281172","4657064038668212908","4148471095820676896","12188262804816328060"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["4750902109431639358","7102048371640475539","12116477260888883687","2580024349938802072"],["14640967831212422216","10500729673300591520","13261271785922830612","3828420190314997432"],["8313456429728212717","8789965289930282546","2366154307491834250","2547772712444669375"],["2446696145404264318","10042993240852835117","2465971705034348872","17613183314042721336"],["17489359816428097536","12202701729790534856","14949034491015911971","12086571141792693961"],["16435885974427622040","15846785123286161855","11002979333951088367","5317240912035357733"],["4704831577373799275","10302721286206846139","9929095700862603981","8674588131590114254"],["6237260752504837564","15958388509555691824","15576645380902714115","13767778050551667048"],["5431533101970780308","7773628045923148851","10812861492798466572","11179912013322848067"],["3866505859158688769","16239183896694796652","3400320229581165621","823896886387516124"],["13568533945164405389","8201137447203153971","9093957330370159895","3249212595344375264"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["12957488804279856833","4807893723202835748","5551767719512058841","5434856866180886872"],["14862937600775067042","6647511075805307209","14017978812267869723","6084098129011843649"],["14897329410540426993","4446723148020136369","14563597048387260623","394183428643497678"],["14179080762353584790","14569271494434977745","17363719443125620495","6122266355766146720"],["11403961131123275019","14318059426865171508","9000957770628651504","14203753723936147504"],["12348595926707057272","16841510863060733791","5061550381855748822","2759710698898874230"],["14956498062085155371","2629362605884266457","14750828365809087080","2583185072616588918"],["6497626341670001679","1237126229757675177","16889482437481114160","17564825639635233230"],["15023990869374417757","16824578069317518283","6435532770348733442","5288192420896325967"],["15691844471368866725","3621930785304940299","7415340602480443144","13078402767103666457"],["4329762996131281172","4657064038668212908","4148471095820676896","12188262804816328060"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["668280845871154304","16026904050978570974","3633339307748271277","7761545431279815598"],["14753458474853565555","17717144472146701199","14380026623957027231","10680827994386999091"],["4161198684030629805","10346600348056029160","241395681464075177","11313103096478718712"],["16280697244915436134","6662358651444294968","17812258386088502699","2018115732753397930"],["14397328525201861768","15933231825656947320","4884905039869512849","15677505774444807734"],["15880099317569510916","9875678939133312855","17725432070818339200","317125020001692759"],["4665733997417734719","16720251874226565260","15583750419083867915","16494038392804134433"],["16852083045731544757","13758839762151258008","5156980666542968804","9245505126851752803"],["6825932191083426690","1085961034632789547","63461447141558860","9041352154230400769"],["2591210778776702806","2103017880750362883","12015912113437349893","10678826465616977209"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["370800769836238099","2052329010686807895","16414652549396966479","13998629630057321360"],["14932155203760589749","17247892814940004490","11919493936201102652","1965016450765821193"],["13053906531879585555","15897078361458734751","6420429769780821523","7682050801978884771"],["1935664188428944145","16490127335102224841","14845197458102475075","9569490228557198913"],["12618642379729786684","6836459587415872531","10089505464482745286","4205240819338557980"],["7714113222269758539","9178724278501186539","17050196140618408058","3932298924793710002"],["5557566818795771018","5286904619137318490","17508030940685542645","6409341144146242379"],["4551906198411418131","4235218928038270826","18329497730527954859","14877660610072645731"],["1419955774996713306","13714336304642438278","5451666778568513763","15440544494494690643"],["4504816999739572474","9632670118840620249","1180169010003542491","7320118674558686242"],["4329762996131281172","4657064038668212908","4148471095820676896","12188262804816328060"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["17443099845144570153","3855239540524895300","17918882240272118129","5333068491296132223"],["12474912373555772780","18113129943523058700","5620140090349433741","8010224919410710873"],["517420831718628416","7037595456486416623","13796963857024433969","1500254755341813891"],["14720432514605507742","15572531469335909105","5040177440836573722","7910495914274967874"],["5151853763806736344","12671372191246979728","15112006817281691454","17809151891807563685"],["6697125310770735894","17423077661138522606","12683691007908549623","16962024490418424376"],["2883193692508782151","9972631802717913416","2795849947901316546","14619576359681544077"],["11521041003838856616","17735468153318604270","6360015763464868884","9043031111883992170"],["3693748946358810436","10822484197658153079","14426020925318478605","7172421001142342982"],["2700513111870296612","6314849827031882621","10812522701082138792","15696937100182214002"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["4792123485970137345","638003273484505186","15512513266070613690","11786800972039073404"],["9601057576687260866","15542863148910351153","1675830056831220051","15533000117258691037"],["14902047759200570361","1628058051995492310","6168041096411420709","13222074735171558401"],["13475583910061163555","9161419539916347638","11719235040401327692","262332469952992120"],["2380908480292353184","1675697669064850620","9489079491273220384","18082538256390976146"],["7583817016061181510","10508195418629495031","4211335378545664879","12611363990177817366"],["4745219723703540634","17437478794531425373","8081865301411265454","7666281884522524889"],["6536560404196259978","14338295047623938542","15089484244152122028","1207456580122437391"],["5378530240737062446","16358272330356195648","13586350766181556507","1494975118906435444"],["2700513111870296612","6314849827031882621","10812522701082138792","15696937100182214002"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["3165579308459311315","7712432094757898727","6650567524272462780","6745469038273072121"],["10072634588181888064","5883656189575160299","7743525643854319101","16360221889141649264"],["12564744044941055248","1408168537858047294","689665262362644376","10041083346001363780"],["9170538801210438821","11942987456081985364","6818031904129838894","11934977935670963699"],["10817878224789599525","4479984793657247721","4651224959113666638","17955372913711844704"],["12348595926707057272","16841510863060733791","5061550381855748822","2759710698898874230"],["14956498062085155371","2629362605884266457","14750828365809087080","2583185072616588918"],["6497626341670001679","1237126229757675177","16889482437481114160","17564825639635233230"],["15023990869374417757","16824578069317518283","6435532770348733442","5288192420896325967"],["15691844471368866725","3621930785304940299","7415340602480443144","13078402767103666457"],["4329762996131281172","4657064038668212908","4148471095820676896","12188262804816328060"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["3557102401807455418","7374272677214204307","15258919166153124973","14161224191820798"],["10657516331230015134","16155823560420045246","1278409357593366632","15516568591959058787"],["2296070445060397707","8446382092228959325","9886657894242329692","5925088343468732171"],["11311557840711676571","5766628947859096798","16330512412427943400","12403429248537496702"],["17859062647284947275","8318212786594845275","8467911100822232728","1006058794516411196"],["3046414751326066544","6534837527669479002","13989441714474925602","9240525879361800755"],["15293463566996789960","7436327462856634085","872261233046064067","13922786133041504275"],["10583199229802965078","14574635711612948172","9219280276695447792","4019738729301779303"],["4993962310314686192","4447150137763246691","6158536849159167218","8322291287753548698"],["2591210778776702806","2103017880750362883","12015912113437349893","10678826465616977209"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["12994026634513343036","8653242446807766894","18316207772840340253","14609054382596021476"],["7461830011413920927","8550160486514066977","4320839745154180807","17066489358374845035"],["4306281594652828507","17578777628221215125","17477395661966336603","7650254409562759701"],["9120149861195601223","10373354073762120177","6912669524083323760","16908884994534031868"],["17835212672541818665","552909770867371085","18041405505469050279","15921256716024140955"],["6330945399906576303","952043779316144777","7224974641080417941","1463995969988935373"],["4704831577373799275","10302721286206846139","9929095700862603981","8674588131590114254"],["6237260752504837564","15958388509555691824","15576645380902714115","13767778050551667048"],["5431533101970780308","7773628045923148851","10812861492798466572","11179912013322848067"],["3866505859158688769","16239183896694796652","3400320229581165621","823896886387516124"],["13568533945164405389","8201137447203153971","9093957330370159895","3249212595344375264"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["1880234907973882470","8398736259157085235","3890140364445366266","3175354627281839756"],["14578501571995195500","3093243892996738976","7670778105632955162","3838120628080701129"],["18284950438356381300","15285656285076366087","9098437428661915006","9862890147838484648"],["3178876989278297327","17665786908753795197","7578578159327766015","17828026356879709854"],["3942250084426913733","16129278214289189671","8957020982807003806","3469079274515632177"],["17259781069892916537","6179853728102347077","17935332792696092784","3650019522844749632"],["11288015444700610473","2758532360517575356","1251513350880968332","6745523629214408505"],["5850059447135113806","10875831709234300141","1469528551432932324","656393147189324269"],["8928894877990459840","17869655538437614950","1258717438515084070","15038347673796769819"],["10421090023928065955","2673137246008063046","17875426511067082800","7318150969941681986"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["9376691813070582099","3615398765873873609","18427089300336603497","4328468960639778548"],["9239571835551276168","10306786720813852796","12894222517779809139","7988440518399145493"],["7448473850300571179","14694688237916408339","402416180221149798","2689623824629657009"],["18237216773243311423","2646662424299154","8529773407041734612","15598630677301968315"],["17102933664893003684","13409616678936586107","10588273440244477415","14684106174396360043"],["12533518893620552564","9045668460892903647","5169541362270937310","12586596017587039115"],["4069854016361692278","3257004620142655669","5231850614034541904","6491435445812712457"],["7760856919007256876","16345150159294765441","8699568545741308414","3690267755321336656"],["11691148543986561797","4380313153719612705","18411706146708257783","14032693996308575486"],["14413980873981297493","16046810422443588175","14165163023062693603","15355738760344905060"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["10414068282025389938","1813846593462077225","4324473362254078329","17045350509916392226"],["17834854617350680840","17510952670269253066","7197277932330432410","13223101331278723343"],["8372299929728878582","13352267052391873653","9622677682360785132","13040921138532279047"],["12587960508353025402","11026312949557619550","15354076008966295973","17263311847515940822"],["10245564500479417945","14803422857825660821","1445103619471106216","12533376223121580707"],["1361305843143529707","8550630772986699489","9513297296926607239","8141875125159554465"],["16994930036506859886","15978302262266315904","5229649931133952265","2923183389572461086"],["6747069592480167956","16721986951829011305","11920030011074277890","15326879604218399884"],["4687143070046110205","3655549954678054066","15426033990974862455","4587849911614743390"],["10421090023928065955","2673137246008063046","17875426511067082800","7318150969941681986"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["1576645799068443654","6432208003728675629","16210667570967780494","15174209643405306090"],["7838182853768142366","14427104689302899251","13672914748077283646","6789851123667394079"],["18371308513895597913","17985695869912922839","17752380325935799808","11543996385553248726"],["8400961476242541718","9601966573013213406","9597490862135685148","6989835169784927654"],["14018868301698108368","9641492144218034910","8529640455979885469","10651442123078928726"],["3137107973991091916","1037714177697607565","15187283404404994681","18327665877295542998"],["14645646431700692429","8530382729988177113","5434521560555968826","3154779740549101811"],["18284052006011084456","10232413617779929715","15136110867591891718","12323202758264272046"],["8928894877990459840","17869655538437614950","1258717438515084070","15038347673796769819"],["10421090023928065955","2673137246008063046","17875426511067082800","7318150969941681986"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["18032796555577217895","7720166691556240637","13614053981638886088","3750000173300866473"],["9314680524736444394","14578126407749910060","11976738241408338066","14323333030927794117"],["9397542371461196206","2148106162042585923","11877814842986651479","15930551875123675296"],["9054859817873953985","11211311816468857012","1194463929476074270","311098863384623963"],["5031670704388458181","9925721290859125188","737322186774038879","3802983648197233103"],["9129022704399154241","6322408932582024989","835550434384524454","3892957410246436765"],["3942561555609623629","1198025593278545635","9853394538807328488","5591295835418426820"],["15145992810723473946","9763564055092670763","2884971898981522559","11903443327512378529"],["15878757401269033482","12878592941333371129","17239822757545209880","15999447206951164222"],["3866505859158688769","16239183896694796652","3400320229581165621","823896886387516124"],["13568533945164405389","8201137447203153971","9093957330370159895","3249212595344375264"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["6987451659115553385","11375206260738821514","10209247548188090352","5468148834809804974"],["13448218935509236256","12038452052322961567","11783609843083506478","7029562529732504914"],["14905981358552285365","6599593505614968338","9969439110496960904","10437188365307746762"],["860636933670878969","11847441208928677852","17216899239854305652","15390913591451571059"],["7836197683412581677","11298712425587974215","12387693145719805592","8925085052411820759"],["14418725624281756854","5059641476458473188","13084081112415807794","4874221158264773087"],["5249056097267054926","16058027708167327273","17381619386673469070","1933458385569423077"],["11585216368446013789","11285211836189007334","15603094160083505741","14767200197081193670"],["4687143070046110205","3655549954678054066","15426033990974862455","4587849911614743390"],["10421090023928065955","2673137246008063046","17875426511067082800","7318150969941681986"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["5978038172086847263","17230816242357410162","9641970828714030662","7312325640878923891"],["2186272612645031979","6576451514645998159","12606423667576090988","6741210249519217285"],["9389274451890337642","12124548919437081484","10991957676356783373","16083547887958447971"],["13290300034807498725","1467980758157235651","11736616963852856279","15641980592983272459"],["18050173289261621763","15247797329665598570","5269896625484588650","16028079715554419241"],["258052581185064959","16623367182882558044","7101712222171885200","2218940351482730875"],["4671859508243455870","3386942511143872344","3459936773580661808","8342918845227773695"],["8906601614834092398","330460942611277196","298335515022993012","14617343949218991777"],["3693748946358810436","10822484197658153079","14426020925318478605","7172421001142342982"],["2700513111870296612","6314849827031882621","10812522701082138792","15696937100182214002"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["5305849043765262570","12730600175215444888","15668482260010471636","81804812521342826"],["14514131932374367839","9260058938430872846","16937500740758647412","2094922377141691093"],["12723730902947861814","15648441453342250362","6409009201877038814","15210149940769078463"],["12207234633143079229","2885450107016664658","9611524828266363483","17980427710098116112"],["10836533136173127504","11059426049851237955","14625541177996783990","3955196682689118161"],["13393065249928706107","11546665264876425652","11132686157230974750","13250092132285131524"],["9698260249498061382","11488828173563657518","12187013698840955181","13617879691957914013"],["9681788306968233021","6899845223895149557","5070111704634449047","12750132796510370629"],["11691148543986561797","4380313153719612705","18411706146708257783","14032693996308575486"],["14413980873981297493","16046810422443588175","14165163023062693603","15355738760344905060"],["448276154560399790","8921015526619113914","9677609636615811284","16333171799132974934"],["5111849152002020803","621351421751550314","13973450414665372433","15263897160393934549"]],[["825482990991169267","6550350970894916924","11473776070535600978","9121577225496749181"],["17522257116227682863","17791579306501574464","8524428656161246869","4117966218207161169"],["18435376558618085055","9648641924367024748","2916159322858564681","4337716343954178699"],["1012697312357646798","3581595416491596877","11077507782763043809","13649884520049236546"],["6531987167255898289","1978958677880207108","11015068235024646939","10210920315917324916"],["6478261944913098695","14135123303545667392","15955166816610263956","6094392445032592416"],["7569917884301424722","2554633662035038301","16845387660862029843","1728833121785397827"],["11439760113093233704","5074598460859141122","2505023386232538904","10164772584923548226"],["8157920207093873742","10430834520554526525","2979439591605014964","9562202650473457182"],["15691844471368866725","3621930785304940299","7415340602480443144","13078402767103666457"],["4329762996131281172","4657064038668212908","4148471095820676896","12188262804816328060"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["9615069911309795358","18138720087863043033","1022174376085284323","12053628861369626327"],["14734265397976473489","11295293477869724587","11326182664090003275","13569826491008315338"],["2678154727602504257","13065129422463527314","14925643724772828301","351643454980260307"],["12365154753256990626","11404207313121818119","7929908524169173402","11892642693103516185"],["14131765995799752989","12022535528217367625","4159853638270300654","1992058325402246880"],["12905795934970157112","12696930266822085553","1176559882304800031","9616307367894810464"],["14931307584978243878","16750584954796649299","16285335340702452829","12484990672445574578"],["111304494622140278","10310669870145373064","6053570963680918081","555757195079031738"],["6825932191083426690","1085961034632789547","63461447141558860","9041352154230400769"],["2591210778776702806","2103017880750362883","12015912113437349893","10678826465616977209"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["6314861197697648392","13001502201064562896","408712037534252945","14516913833897101265"],["9656910677057516675","9581183421503674131","4840472398867761768","4067079272673580047"],["10942139675797518550","2136487545522022012","15013225556036496664","13560632312725521723"],["12903395137244386223","12697539879801901686","15412613895781206300","1183117915713638958"],["13436856511360494285","14141821171006910066","17770651524970967884","9736839353574947652"],["9953202325055558419","11464123897755913119","8869576301007701412","3056625001262616643"],["14931307584978243878","16750584954796649299","16285335340702452829","12484990672445574578"],["111304494622140278","10310669870145373064","6053570963680918081","555757195079031738"],["6825932191083426690","1085961034632789547","63461447141558860","9041352154230400769"],["2591210778776702806","2103017880750362883","12015912113437349893","10678826465616977209"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]],[["12409310480266101107","10649848005632357350","17581504264932478750","17139844401257651432"],["861389319568150278","2002101105689116000","2951770489301667982","6104135620819023024"],["3919059887635676716","17365345109510922384","6040392496761932270","14899225730646443297"],["2123881919305907684","9999587881807010441","468144727936365278","12963328625677325434"],["11107019783555179773","10915189575425688515","3704766651151800728","2876446187813605874"],["10105082593006316407","6701071185041662327","6814746324393609660","15369519757662246940"],["12094370721287360297","11784859493392211782","13351735508899766601","6847574608066258251"],["2970136905754113395","1190920319781106757","9325403758048316524","1450410863685706013"],["4993962310314686192","4447150137763246691","6158536849159167218","8322291287753548698"],["2591210778776702806","2103017880750362883","12015912113437349893","10678826465616977209"],["6529245968278469197","9569513859533481160","14394657613907853055","16501893852063321247"],["8042014491930574428","12241867880117708846","16702797143313275255","1947905153480803542"]]],"s3_root":["11041875058619195604","916567482253876352","2789467845646130033","16527800174301520201"],"s3_vals":[["845213309658421810","15156765361147845047","16050931128439967636","6937805495791400919","5327902684547805312","816701806474646560","6566240922780123640","4106144709542018053","14029821238459354172","6003949027437643179","15589119865780739741","2633788001806107540","3409535512552052620","16784314703036785668","17086008237846396439","9853834635678060934","7689880906664421258","15584653226934063851","10651697444994262530","7172484055119040326","15917544445431935176","4887117128622650487","18024499551350733757","4941654284116555312"],["1214722941515153877","15754936895170101414","16036207376464390900","6453966583485715348","14804815445882313935","16596376858698682289","8521135746199622942","14839965357477711429","12703552576859477170","12885627826760686362","15171312005864985311","6704357465702015050","6298104306317796192","835824163641767473","9160245974785540718","5413907837734777225","15761155084693956032","8765733141208628032","8403649791181385063","10838749019227320330","12871922646518592839","14449269704239731621","12539366952670798233","17339706649460914838"],["5474394361874096299","14188287141048449956","13303113010874346245","4071638847668188771","16605447846987925951","4369223970594042412","11085311301850142221","15728601001720048386","16268866356195238202","16771633783760307052","2151176945284428389","8200955027434935289","14197452396061298162","3988353116093909252","12009279733907462598","12456722891183540354","4247226357825120481","15528748666635290816","919319545083835078","317651626731769248","2922931233009057452","10102520204795968267","2367672120733441381","6389756035039374812"],["439804892473319481","7518909303658957388","3596748285531511599","15211711932982784708","8732738956324796163","3359914619443351954","6898561936304300593","16459480243305669084","12786213117276436052","6162150701092240667","3831696389298386968","17754667796032452655","11584299708547552474","1672636350502388000","3327199933198313048","16742852684009076083","15421095409725782858","967020323340379592","7699099617299505115","15430638355839956633","16364521097568033172","15274337621812663700","2540771043430969763","9043460868102992305"],["3476077504021409742","11744323082184617436","15004371400512578697","10392396444826773681","2394043131600910687","9281314427110974845","17942207888467764945","5346455992848795192","1015603339671292665","12064838113944151590","18068682147475270127","1562097492361641919","5427183307328785789","9666927089600307935","15290792312933059679","15644970413225637666","12972410612436949541","8603404935544941258","14444357951466591859","4171484640568311791","3014836676800846792","12964788466490540920","668041960040473407","13188363167787124642"],["5798974679768844850","17319242334102105438","9989647089943033360","1771381469429290318","4393979212056027345","3730548941655121804","16439083142872590246","15307063125865955010","6126195354730194654","9758404399902273300","805736886796972543","10057985089172967132","9788119068412203329","2872410083744112612","4432697767398553283","1025950318874733876","10093654895661118999","5296934399087786873","6600237719606076317","17383619684324926737","13400954697658089918","1904805059252419895","12977865583443818776","18384662829095533988"],["10987796928051054509","1625362364464478754","3829566193745446848","12041398481516112427","960740518324977389","13485982036787525650","10316861318529252618","2729424932993121210","11540819161187736254","11425038694833484001","11825766421172944026","13613364168334241380","17625412642689137048","8657765310349420628","15564944686354426976","12338574852280000370","17233445347525421198","15784691286604037548","13583618662431871133","6668501212474736873","14207293651359432267","14341239406235813647","12665786857897366232","12484767466684744229"],["16004705674871554324","5815315326532274055","7938368463041526229","12267864446144006690","8208501611491334302","11550438377548168002","18411426859308776859","9334493886271082238","13131652983330258003","15622946984007198384","4367424798508911929","14036718338398784066","8292719470965478755","16630564200524317546","6721337050501594896","4710211664853010379","2066380176646685410","3507949856017344291","9146466539846648022","16504341499327304533","2289959319377664335","18217226183463388375","13554818418884075457","12975077349972819169"],["11794718579834829593","14329962361332074977","13948289881901082451","13817424726364060687","12553226666920235277","17738791726941060761","15161024147096658415","11140596964683862214","3295454147772788544","14835843119696081387","17502909344434063627","4886679050002181028","16748109590551276056","11379088085763725789","15061613348882281506","15451751302785501840","14609965121962908770","8746894177287450820","10496078739679630000","9955545090024466574","16425449295830904698","2840766018265303561","6620404308418078890","17172151290021225346"],["5913052735224844721","10390003105477524019","3854596397954199441","5977620970861556194","237776139150694014","236240082914901361","15003152286849924800","11786051859891707023","4752221528398722119","10812122775133370238","9529504918794724845","1069161454521752761","4948657729658475915","9239236506192975306","16193415173816706116","16421709512558335965","7038246171976447828","16078345957871219502","5446997074990135666","9732755744542743332","14516617370687401211","10831918709252617274","15474968131189288006","8226706689406666803"],["2240032494992073334","4813818715299537005","3064830312238810350","13554820400763290129","5616918969833576811","8270936034250572454","15291656681634235027","16190207319040625270","129129790830379539","611205360380351312","162743201534775865","9113000480169606272","4384848584623798847","8081566783529975831","13158340035879808023","2974115574954349681","9284585957941219781","11480059047328278671","2536283582030580661","18276319520945036228","16600550963042065803","17267183910271343317","15179613089018322943","4520719609126873160"],["5909045281424842483","1269303264739226898","3365219050377502450","16970307536331706920","2545670793170972201","3598514435227214512","10366119585227030788","17046107531164929055","17158664291738493938","15422040327769376143","3705742343792248767","5114170855859993529","15343813051923101121","7521386779357951171","8555026836281671709","15058491353405645828","15403356209770283661","14329848635210274316","8695422235022073245","6281817840977567483","11157509180544231360","1212541474699445937","7513579094622252684","2954726597437199522"],["838911574503552732","17416948257834968313","6858220435317589339","2649776939818141813","15774170180214602499","132053486713463655","819213899209984075","9455144388058281714","18277376804880729200","451016282926337680","11782313916025347773","16946967580715089880","6456745405460554383","4892131632109875679","12258173890121169433","16376306664071350229","5356663930298885268","3044961766970160813","5701261954407923135","11714738592299855865","13940164880216440084","2335489391808473813","717313432906280321","14957823724683590988"],["10377789073571028363","4363136330050714475","4993752822186624140","15526255242647174171","7349795915028825857","8849146796119895770","2155508726175466767","4599135223032957113","10865073914441722427","1945431722370286053","11810114014928125752","1606427037265945969","12267061482620549549","11843839428463103939","8117543277473005538","14681394628100645225","11095003013145441126","18297315695694405082","18150305778798734135","16438743625535790967","1122571121330215366","12111320149973223819","17522417865032733842","10096982489023229184"],["4218901289630876841","4124644822322750919","8368325451339247759","9095128268500204051","9032548914227448778","54557015834671481","10020396299175751525","11466004234544965081","3947398643057812521","3192132003163361383","6138405214275015676","6163891192418788142","603033433401417001","8145587175180428792","825416559425686778","14788520550151813770","14665041704667752299","17760607096899229993","16156433572229615198","7365746380827988980","8874683586607842393","17507240568060897128","5260488053332738742","4472840218597741362"],["1401808697023635748","6221936570340402805","13688999507854093649","255976144887804481","5981417118103371159","12771179515562609034","10535285809205850734","16047057343739013744","13636214952319496963","9014166857582134028","5115921655311993315","18282024354648566782","9345279222961831510","15861974557555357198","8872425121354958990","12729100512843606848","8201890340302403554","12361550899132252776","17920376288254224149","12169006104070729623","12460366216588766647","11401053218999042154","5879364009663597001","1790997470150679395"],["10994272435454908296","7586749964243127205","1624779496758068775","577584731384037204","16457929053240929841","10941966253600474322","2877698857042295461","3085907664831187103","10606615920156255204","7738634724082467984","2926040284339097046","8735537725969987672","14093321194896545969","5191432827406704339","10678908024113339612","10397845343428700339","16459329641288608786","16230093077967952381","12579085974251631599","16782091514157630598","3336817517074623071","8463662093900013411","14343900954255088313","11890298879671172835"],["1939735399855145525","6380213122396691618","2470880334799706467","6743758754123435598","6892508568789866693","3442413295951443816","15049045966623638023","1445588737513355180","12466988828985565626","468070224744933356","5234428004150924783","7181230372303495089","13653516102891731002","2732740563024276095","7390089415607669152","14003527808052921330","12200316733840410669","3946597063649552803","8366333742368675373","13559075142124795396","8626201339424199895","1578307514021420240","2975824632422292021","11058524674545458637"],["3612162480841724066","10114569932444132959","450186272956534304","9802802392253451221","8797049761344489733","13436899473832737463","13281594559463344689","1961159769874850928","2253539001907926035","18071680743129171608","9977401542800722331","16261498076507081830","13721470541539011432","17230273373952360340","15678238751995661006","5510874505434931943","17939411070916305674","4630557116493964707","14538158278289959644","794664459863931417","13683878526475919806","3523484995499169606","16210083251148097045","324392607965566226"],["2629113049835163043","5695781324217806481","5141065069832930950","3871266325245440007","14347115463688073595","1994481329349911489","1269582265381360328","10486498492441639633","3470775681429380466","9493963931983048089","4363936839063558325","18409956582609602191","3593651085480488914","3483987558553577102","2196599873077247850","12354237110192202935","15141681804757943144","15056528312629760144","1924883028564345099","1207271269707602677","5238804540002331392","1499852450525413704","9523120055753303787","6399001727073886997"],["8925690299120717692","7965516168037055263","2903738090314669215","11766007024170308500","2952436217471011401","10546265546954272485","2077412047901370721","6893021611745017369","10352127040314885069","3612266182037298572","7547517364810436283","9927154173113299556","14586348198954364707","11492718479350330124","13527316473010277","17441466197971562378","3892826904332936671","11062642128561367475","11050673171259362013","6590138113335560093","12508677889154040228","3896742159229573286","2796167294629470595","505120200857430131"],["5017657510529240905","12164471132432871935","8489683876417085099","6325135748741406225","11847468433880751655","9211360101632216981","13260813529409068913","5365031689235283910","7322412165029382762","4728878911084840271","15867600048872056720","6119174483887317478","6509007979643530703","970652193786772689","12945455309203863833","13373244433413373721","11047687320974076622","11724288114714800121","2193226302609381783","13717769324108646018","12824862825363060722","12936169933811826109","9326851115271191053","6343246133897339514"],["14841146446686353513","8833429034522409008","8678278590793258793","7774925471844759494","15398529221214855150","3230812774763326202","17453468105298218611","11981887052201031433","11096773632949051039","17241253399764192421","933738832884585919","839430126255735618","4558290631753355346","3737375973406007870","9896606528822787528","9761621887642281509","6867441814490030333","9473558114680929940","7202290736015236298","11622075700241729612","5727652475209786810","9749011341544972905","10696988608465164197","8559716072352050547"],["2276604835517654916","262091924044004130","12356765521901269728","1431164989918576916","1516066460102248562","15594486292530592385","9919916529686717674","15877894489899922287","13195858683645503571","15698004763016774072","3675536146060714711","12866446815369486601","5032656849586430232","16357423965962206962","7619330432971805964","4946204794348079634","11212099448292219464","7924200554220733264","3406888944365376699","87415881667208559","13774421468524666316","17945104671450722533","7969348496310979464","14844443027523076682"],["369452611511072344","14375755022454171014","7406822749203940351","9026332035566102731","1946956453856793418","1052671046519726628","6488529735400870843","4604059290060603067","10676417086290907120","7116115241733966318","15896792115386046756","8996218746979114355","7934022787386887760","12229497385442516771","2441118662396986492","17417690725210811778","8622555111698673351","8201501048894031027","13546557430320727179","1699446974718288086","1358889182535638970","16135794863955370233","7690395528688058456","16273565019627933060"],["17052555956082635442","15276392998772891492","1929137023812533190","136041364668688351","13863062911953690700","4095092018359935858","4779333225828063286","11289925065265935079","8803701417982301230","11452196163297170227","17567064175990434011","12521002305859774619","3037798247231450738","7341067921781761571","16110375390977241036","6228723118291110719","7515290565754599094","531385675013967966","4636744635542000481","1427469998682688681","12013903374916089041","8346982336469262042","3476835644261050626","655451498821522518"],["7766665270320005794","17232249879866731355","17599560006053838147","6964124455114674921","6813016916669628212","2480671373764557422","5926286798293631888","1056973212082467607","1574939525357803258","9312344779845728347","5686957246236155196","1485621951703571157","4132773439618526711","904787015470316485","8792175085446211061","13815798514067829314","12572249070743125435","9000386298790826761","15579337280225709950","3409181103896729358","14393712139946379169","12682316741321871113","17084872291517311618","7238121085310608713"],["15117457408817649455","9167064739956800729","589837560610439496","14895243113195979929","4562654658312929626","17808734431149111100","1932402908804639858","6890807604095904566","10790618107044638790","16603451012003790871","7144796566292180058","4177992611934158615","11584669664367252651","10694162918621373913","9780016674564995058","15665915113111895447","17857510372858937368","1792341712520494323","7074947249127122265","17983078130728181138","6830984254498134325","7980119245125685871","7678557793451149335","11275798939114016749"],["17916111973565407407","9609183485433033267","16317044159996642581","15628813986121137219","8670380411702998681","11073464381206013308","2335883223139080469","12664390695607407751","12544399820333798163","1488356549319537498","12604588274095037120","5239094742757406185","13341190667355964220","4879605861222672959","16573428147145289500","13950020433932201508","9718783767922531226","11267366815762133940","10993661871410249883","5758009613227061393","517928222385704575","5074171867928025187","5342298313070894948","10469929287019123851"],["10064533091189995306","11751921232044332134","8004437582514748392","14071534054021905503","6042036335943659494","16617784552478289793","9192025368160098731","6357706351504461375","8547438353151490853","9274947038791752399","6881121071738278474","917510867224250776","9706386637240136671","13517761334044563844","2147961678431694054","1900748729074028313","11103251593286815965","3150848575924659245","3354759759992978549","134884405494794733","3505800864441399746","17066873543522630726","5084804744475377190","12579386969040931506"],["763877979162538873","2301657940203334075","3436370842622516674","10161800471673869369","18145259186821014858","15710295995698046847","8105834067828796179","9548514245084837366","10067400562605919069","10364505615112803924","16427174168744746631","580231440676884078","9237919607448082434","12544833753846554052","7853248629668235778","9411593581207608561","1898432476304668455","2850708607047564974","8020867574331079427","18333324114882805624","16706666467112148397","4123273988149680278","11303456231930375195","654249724631732224"],["17052555956082635442","15276392998772891492","1929137023812533190","136041364668688351","13863062911953690700","4095092018359935858","4779333225828063286","11289925065265935079","8803701417982301230","11452196163297170227","17567064175990434011","12521002305859774619","3037798247231450738","7341067921781761571","16110375390977241036","6228723118291110719","7515290565754599094","531385675013967966","4636744635542000481","1427469998682688681","12013903374916089041","8346982336469262042","3476835644261050626","655451498821522518"],["5000763528540091576","272658588126795401","14344821308457257359","5183837550569197903","1146338442497677823","622035768087356589","11127978162364304279","4202953102392420216","14667337980275375015","16268436293318426058","4942630626738958392","5517450856703432957","3975060002753992563","1885531323861874193","16536484305800372233","8603656579112552801","2248630103722773973","2758894451307529137","16146669315392714211","2764528189968276247","2136504603595196012","4000968839795227144","5763996274399046648","5311095876106671393"],["3807662427348150575","13010514383634742410","6485971325619913120","9810621440149120800","8545811037672712807","6794504687875293224","11979629175755589839","2211393140242437419","17028632575781958624","2314134623670971599","7564569048194976203","2083573019995042846","13009129089098527442","17569203526839865440","16320007913279355016","3706957309358533530","17720549650616548925","11388385099153737147","15116510819961774741","11200587291021478090","13397569528904794980","5998513329238099053","13397068837087698419","2138817141628799534"],["12352495962394630350","15327575561932595483","1190216207339082832","8006518207214965581","5003064426784378572","6950932066974040110","421591067985400251","16105124276079572180","6816478064080305625","3687164484481708361","16533700957952449728","4627802551853651324","45636802193869663","3288044893565419261","17612090581343587563","11108789270888086243","4116587832179348953","2272385446718856144","5285873409200559985","13252590348991885562","14075188583581274849","4157390361307081729","18048680312732673878","13872301027144254349"],["6681696035007326882","15191333733312774593","17815334825378192546","17835078809071225721","12771349772182754015","10081388294753712635","8962298862044773331","13074004172078670299","15202206868629582978","1356253821256497049","10837871787246070850","5451090438879903368","12981713548755258035","5700218765492034334","720709012528405062","11248217134351597917","5464170112580898931","5391708547682532793","2896524704130902964","13602158384424390141","14330789050439823922","476094344763064967","10722928783226665270","4265852725715003754"],["4339385163513152148","8504455413901782213","17360278589320470075","1081845054085389616","15261911787726954728","10659205879130626648","4478401923982899170","14569314964350999649","7642014251247414250","13729174834251881054","2179828263959597961","18349772790568986250","18056568336493917493","6698920187955427258","12733574361240026576","5071496412404159024","751721795450200538","1372854713521716427","1583569833013529823","16344595472769006144","7372562230150222245","14908773382846514029","7598336468227810907","6872119972639923866"],["7070871989347936755","14249224718292580062","17821515663689453818","15778536446924835468","3075364791620765207","2727629150173088225","9027714178128601901","3755743875689192551","1201355395246101934","12768886344159977848","5971843405402744469","8244826485846100598","17772129272830325193","7589549637059783601","10299678779845888420","1559349572336245192","17626867917087741028","2778975863128040196","10870405297627420853","13248584239639208232","17360835823512428370","4456595660615308252","18216562300409221805","668128151862082456"],["6394543077662692581","12332832642914802768","5042195788893063190","10722823437340105924","5800147232324852725","14492984957294278243","10115301425023149292","9299912768613455530","1036358236888870821","1456497797261663715","14159107412524801534","6272666737278644933","914130772468956712","17920684737780184148","9848131053993910423","5883047875480253714","4653851066742310720","6879689631773011323","4167968968987644118","303175929797586549","328339119595917589","15789432478944445812","17555540623508227600","708998592363003404"],["1896545337623867364","11977654608118848839","18387788588419935380","709326142918880313","14272434176922414495","2897771945536826606","15450370893832237286","10552155165448599298","15277220535879035878","13965513628706423458","10043846827504306929","5658486652673424726","3077672791410991770","198588571043003766","17481844025545844631","3951337427042806342","4741622321305821426","1645702293973102813","2262635901998374843","11838344560352074528","6950695408448946039","9773604527767028162","4121945686885941847","2580570296452480190"],["488908302478178770","9717364648765679383","9789137504999022826","15654415745645868095","10910616848440461481","10281760834121288760","14411210956946412839","8999774644022650772","640238460936863189","10459905648801293786","6328902222331030878","10191568705852487369","12220205682438698336","4433788657932140012","157353621509897763","2031120338065939606","8136148483779659489","16623594455605363456","12988828696932144051","14746036331408233585","18393517114224885848","10935411777702427021","15428588244070239749","15472142123380426842"],["2240032494992073334","4813818715299537005","3064830312238810350","13554820400763290129","5616918969833576811","8270936034250572454","15291656681634235027","16190207319040625270","129129790830379539","611205360380351312","162743201534775865","9113000480169606272","4384848584623798847","8081566783529975831","13158340035879808023","2974115574954349681","9284585957941219781","11480059047328278671","2536283582030580661","18276319520945036228","16600550963042065803","17267183910271343317","15179613089018322943","4520719609126873160"],["17758400841732150132","7610614360936174293","4646994018317313712","8122633784992800347","905843246952239766","17103744161467096408","3735103084405468339","3518416094720337142","9614627000527590840","4713591843501991260","17095526408881220161","13262179516300387615","11224238199608216278","1089102295744308958","6095411217139012830","3251336904263769298","4131846494682570517","3728185073005849442","4934266232971640474","6990103569403381814","10738055603424598542","7425817090075557033","3939234088118288763","11245933578455658931"]],"s3_siblings":[[["1299207054764022900","104015716779241291","507244938063042215","630729185934063119"],["7829695813681187293","10375347874325245025","4008040208625513118","7311950221455538650"],["2090769588240169306","12609162673670746941","16370664786896940918","16660367396099438132"],["6177683329542307029","9553978708226950980","2202503754485651335","12281519975930938561"],["7003350224529575701","7952631189256623530","17534691110286357891","7331793569401081857"],["4394502075240011893","11461566858036890552","11886120704765703408","9123774490875983896"],["15379202569031394699","9604282599596410001","16363523932233142729","8589504063004526558"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["10301295763344687185","8945698338923091823","15795109330079547192","6210476299432102308"],["14727482506370602177","5821980841460829958","2018526140092218895","6008870624357171098"],["2694744284131985919","11655246268911364538","12339655782976984664","6030169352515831458"],["2067905243066601609","10830962604125962462","987454379064436680","3913855778524304403"],["7410556656879313135","14178654813797335188","16272157455404337608","2824970953290778824"],["9765926899392533950","15187449256357257569","3549561230866942235","9157581572321909787"],["5549254862189788816","1389925581823592229","9482489591619261885","15268273041619041393"],["13036261478741884461","16310538190577570326","3866721368232175268","10347257385891613204"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["569738711758251298","6011751453286348784","6145555870340470294","12818857966957758727"],["15297599070116756482","15004369043940031925","12205477709137086879","6959410217238289303"],["4533189292033768803","2952587184471937375","8543134453396219140","2807919844448743164"],["4908391060337009925","17805506481625300899","6803002293812133305","6090301804998038092"],["14175506508660725023","9738764837571973120","3381957807382710825","2407552579202684469"],["11582822901582851961","266856607133149621","2164574367120703441","15446424103772150237"],["9418211954432311629","16018953826584034807","16744460174190374657","16838958557004888529"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["17050821296442426744","17375878939177199013","16660583866144696779","13489675311193388016"],["2853153625431802052","2042227329534386705","13110114252608062286","15141890781038037449"],["5393256326081167178","14182248105771776374","4243733953699159949","12581319867033458737"],["13194934731996286369","9833577043785120872","18281260895550830469","10007757046621788133"],["4405531154680280012","2522311583720085245","3461851178139321428","18354249349331530172"],["16685999092661901005","8688753604152410","8859295418288933696","11932779698979348616"],["15379202569031394699","9604282599596410001","16363523932233142729","8589504063004526558"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["3964674283202201782","3934604399641815511","16582050610961067955","8235492121524665212"],["13802719813287843100","13398379580212624798","1706095893178725024","3096522237109904557"],["2308878681716186971","8405357432145012333","6891655079942449170","17716444591834482063"],["9748528739783994979","3826590207707726738","8422243752393132492","7170055252679964028"],["4433944952319400260","1699665954160863935","12671731301157285584","5108695058838689851"],["1678088985983361964","3116313127243311318","2343336457714303011","5080275090140252645"],["5010916451863632764","3628241373026483191","778502425386001888","13053057011459856090"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["6363851976521255260","10816127776660340107","7085227655291721947","12878751839508338154"],["18330379908916500733","13878703625373986978","17153943548524823211","1548903464556667708"],["10844661368839676082","17007494744397461191","9731405004413135357","12220660741030713343"],["4358527050918232914","7060534297901453306","10150692433992505512","17652617504477314274"],["3387145998995908973","14695081239493534071","11238056051264170876","5346481059693241393"],["7605108994419412309","2187838271853430415","7591980252136633139","8879599704159041634"],["2812282603775624995","16528524492126873627","7050277657034024714","9071103348960646691"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["9145867060547422193","5817731485362102384","2120355786143380764","16352458665976798631"],["14319517345757376517","12398477243362218919","216370403485071318","16620890317808401397"],["8598667400798159689","3307872140021095634","9965321656914163829","17112740154580405230"],["16534234202662669232","16256697192305258352","15437099509948644732","6763128221743529320"],["6715484876307012103","4414171206368431315","5807988502289831661","9594022651993112982"],["12054892000660312635","3974673710079921986","8444499246309335160","1785281798303930738"],["9418211954432311629","16018953826584034807","16744460174190374657","16838958557004888529"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["10040828840293319936","11342451599098106183","12241623448284889507","17007801287737383229"],["13073427095300926203","2884945060656870535","3091957445174197657","2177889836862807695"],["2970379117446635709","455415016170981899","9292834763617748339","5768962124166780526"],["16277478195351341285","6999946933864354243","7758475845416979525","10583656348510912493"],["12844854011549828303","3191569052038852562","9451251948335057746","2037470656549278203"],["5417790743037090217","17140551891377843387","13282830320824063558","13939423385185950719"],["7483393090459967872","9117254521478311647","11037702922138544905","11948584764288970584"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["7119215055447017614","15836517119665428365","9397300533729896568","13271966739010599917"],["8293765817078422699","4437813125193462457","7362912422645792266","7590167477344085664"],["12631699793084535741","2449641374133242669","14814971960531147120","16651720459766660595"],["6655290126734648618","11371262840124621990","1547422973314336669","8272393239980483327"],["17275920097929510707","17589888821771759862","14601095595159899418","295383264990311384"],["12861761783724651155","1384484475889120313","1362786666666279848","17214782324867174228"],["7483393090459967872","9117254521478311647","11037702922138544905","11948584764288970584"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["16461841283703682250","8120972071870174205","10069365736589913345","13553909141376541763"],["7829695813681187293","10375347874325245025","4008040208625513118","7311950221455538650"],["2090769588240169306","12609162673670746941","16370664786896940918","16660367396099438132"],["6177683329542307029","9553978708226950980","2202503754485651335","12281519975930938561"],["7003350224529575701","7952631189256623530","17534691110286357891","7331793569401081857"],["4394502075240011893","11461566858036890552","11886120704765703408","9123774490875983896"],["15379202569031394699","9604282599596410001","16363523932233142729","8589504063004526558"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["5664739524032749667","2425582191620212912","2655699331435766152","11859550160497749286"],["18375117686842829282","16613334840742599463","6538520184424195700","17538534836978273098"],["3665941997262561177","6646872897008580126","16331020279618533531","2059064312813008609"],["14667581061632391400","12137694884070175150","983908069082444740","13038356773480653812"],["14175506508660725023","9738764837571973120","3381957807382710825","2407552579202684469"],["11582822901582851961","266856607133149621","2164574367120703441","15446424103772150237"],["9418211954432311629","16018953826584034807","16744460174190374657","16838958557004888529"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["5480463473235574726","16072451329398479203","9170344906795690832","16324828170388678602"],["15297599070116756482","15004369043940031925","12205477709137086879","6959410217238289303"],["4533189292033768803","2952587184471937375","8543134453396219140","2807919844448743164"],["4908391060337009925","17805506481625300899","6803002293812133305","6090301804998038092"],["14175506508660725023","9738764837571973120","3381957807382710825","2407552579202684469"],["11582822901582851961","266856607133149621","2164574367120703441","15446424103772150237"],["9418211954432311629","16018953826584034807","16744460174190374657","16838958557004888529"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["1874492206375563676","10865067269630440028","6680382835200689236","17070672163559371751"],["15675835757890134267","937066262594970385","12438853930177572212","12150610515771434024"],["770325406662193505","15958259226766584999","13045967555187787698","17255830268325691422"],["2729443864266293526","13636910713961945340","17315893034229874090","5339504693075457667"],["2587861808088639376","5990137291035157953","5192583024620395899","14804320656048244166"],["9578423892439664036","17598913395257708477","5821758673242920708","11943016011651383210"],["1054251680706833878","10826553495304588554","836492225055393848","4340777212496726902"],["13036261478741884461","16310538190577570326","3866721368232175268","10347257385891613204"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["10052186603691177230","1426929734068094164","14624643411038168490","4631647773071191781"],["3010296636701979377","11969314978705389288","3882291199694391389","4599909406314197966"],["6651585332708003458","10968033976320357106","4760735951644014378","12135437442537243156"],["12834949597849775245","4956849174080098630","1600112684249368791","8018522227090096970"],["10371435306411281601","7307504731836245182","12601241409758397156","15670049917277986680"],["13543738640264345662","1563220365344148625","3823973447536562811","17475486531495149929"],["1054251680706833878","10826553495304588554","836492225055393848","4340777212496726902"],["13036261478741884461","16310538190577570326","3866721368232175268","10347257385891613204"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["13188404533871302276","2919155609926255654","7589563440105545860","12513671547219031613"],["6354053502623988745","9047839953732300240","7344761204910215385","239099810841533739"],["7201273133713608572","3968879284539715126","776034139774621719","3302833889920896716"],["16771999250470574961","15442612772020311571","3185666519917181089","6849002835724101489"],["771126270732928178","6197270063870426176","11078407339705867961","13851927242998493128"],["9765926899392533950","15187449256357257569","3549561230866942235","9157581572321909787"],["5549254862189788816","1389925581823592229","9482489591619261885","15268273041619041393"],["13036261478741884461","16310538190577570326","3866721368232175268","10347257385891613204"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["3262532848990762070","6411599090900035522","12596713280323718087","10838592162873480230"],["14614882231960289133","4480251626610416686","715789864386806660","14208992953899428636"],["1798485140012373823","3167973486733000553","8617369237004395262","4828871429082899495"],["9945223270833900512","10493442756174026224","13185920710588269868","15564940281631818525"],["16319759475035214870","17047506415955909223","9593770812285437388","12421814985549570456"],["3634412944592691986","2559361469886575752","18212673408416745172","4756155255841585022"],["5010916451863632764","3628241373026483191","778502425386001888","13053057011459856090"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["2952119617806191309","3892722101081969672","10627053886448212922","5498400719529983716"],["5899794268664362359","7158542159887111268","15129835872670069279","13747529007300264699"],["9300083958508003039","16761566088521628542","16680439602565647577","14484790947753114456"],["8799891610873114416","5600990004642427605","8690978840008143218","6505218268318184149"],["11558716160985158484","8732333075259882360","8577899744584187531","9486555340969969386"],["7605108994419412309","2187838271853430415","7591980252136633139","8879599704159041634"],["2812282603775624995","16528524492126873627","7050277657034024714","9071103348960646691"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["12612095337121147687","6590957815084664921","17531763776146800165","7547776125710730270"],["10599824645992578716","11417606239817492418","3171229928268425469","763849501879939242"],["13314256483178040269","10840968052935695260","1104570928823404513","7932966538377977526"],["14501386493331265531","7581662301876779956","14155921816730113546","1064799555519034697"],["3387145998995908973","14695081239493534071","11238056051264170876","5346481059693241393"],["7605108994419412309","2187838271853430415","7591980252136633139","8879599704159041634"],["2812282603775624995","16528524492126873627","7050277657034024714","9071103348960646691"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["15506899153115564643","8117818509925964802","5748020919183980288","16869999418621863038"],["15697274977722149142","18281910020579217181","8627175925603947118","3732115562372174525"],["4533189292033768803","2952587184471937375","8543134453396219140","2807919844448743164"],["4908391060337009925","17805506481625300899","6803002293812133305","6090301804998038092"],["14175506508660725023","9738764837571973120","3381957807382710825","2407552579202684469"],["11582822901582851961","266856607133149621","2164574367120703441","15446424103772150237"],["9418211954432311629","16018953826584034807","16744460174190374657","16838958557004888529"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["3700053274777105494","12968522855940540715","6544926173801555754","926141073651007483"],["9484982283099751638","2760601389311807699","5737232805662737366","17805370319618619330"],["4309684888356840908","454147861731642092","9149968408045880156","4209246274298356853"],["13194934731996286369","9833577043785120872","18281260895550830469","10007757046621788133"],["4405531154680280012","2522311583720085245","3461851178139321428","18354249349331530172"],["16685999092661901005","8688753604152410","8859295418288933696","11932779698979348616"],["15379202569031394699","9604282599596410001","16363523932233142729","8589504063004526558"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["284666894961143999","10451903763062670358","16844419920980298596","16744248260052375526"],["15628734384857547841","10599986555054628678","12733158062177363938","1599220771980352615"],["8158979825080830971","18300435868580178028","18437507417556162874","6170974836037940510"],["12638964570207958757","1439519089870485346","14810129387259220719","11057491967801717629"],["5091957817263454856","17701262537324257101","6358953003321476905","17351400810068826198"],["6211787018160719640","14723520710917077291","7429088353081079371","7498211604345090571"],["2812282603775624995","16528524492126873627","7050277657034024714","9071103348960646691"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["16391378299639731367","14611908361462722426","2398998969992140247","2464374088919182622"],["12902678720494421632","7026314479213954485","14722297191621256392","15744391546554349048"],["4922726324086392273","15560132381942253563","10967999895730725915","17616816613080850134"],["15311768378741238321","17943776397890161078","1001475292317656365","15784692983863385512"],["12654466591448422636","11043977909865148423","3427765597600093989","15337531107848001315"],["3634412944592691986","2559361469886575752","18212673408416745172","4756155255841585022"],["5010916451863632764","3628241373026483191","778502425386001888","13053057011459856090"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["16576341362672650691","11075955586204888328","5465361443702224313","9101296118849338583"],["10607301241593067190","4565805909037013765","3577722558508190681","9689069591392354585"],["10508132930126593648","1181650142631762346","12032846178978369334","1982040785579395008"],["6177683329542307029","9553978708226950980","2202503754485651335","12281519975930938561"],["7003350224529575701","7952631189256623530","17534691110286357891","7331793569401081857"],["4394502075240011893","11461566858036890552","11886120704765703408","9123774490875983896"],["15379202569031394699","9604282599596410001","16363523932233142729","8589504063004526558"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["5239401393264927476","12257911851531188055","14356925863517079674","14440829473512177793"],["4089698109775937384","328935143837101104","14515262878438293798","16705712873536961030"],["18013614513035022479","16198643801406598442","13626153324188899197","5286844452480535137"],["6516095786757743751","1041702886690236902","13788356135531839004","8181535038832721023"],["15013008572703047868","11230664065351952170","6244762274984500306","15520590259234744155"],["3077994930191203281","2311458448388558828","1594641414687738609","15087852112825896502"],["11386069213650117288","14481349364357126408","5611516665231523700","13526976169633852125"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["1720843173936247712","2997654669819763592","13997160978843881845","14631316872204483166"],["125578564691170662","4390757918802515490","9122204991921611048","14546530481443251770"],["12323905835773094675","7528150030699013127","9284216334567252622","11388840329651686167"],["14264921925410178117","5786952365113146601","569408948672862573","5064983711791334422"],["3066544997890225402","596244103426786424","1913489417772650411","11313136282936571154"],["7906206985274550347","8903206031809400414","12720049176900779312","9510966883357741771"],["11386069213650117288","14481349364357126408","5611516665231523700","13526976169633852125"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["7965343993868338169","16217424719232830075","4307037626309029116","4842925071613843910"],["12243204254331957599","15917264126667811462","14369675871216861007","407544706293344056"],["6590960961674046211","15094844839616650394","10385612032239911226","5993470988611613183"],["16733116882061441946","16952570806557142322","13845837331441841368","2210197120999942391"],["8366095819939114151","10319178766133834628","12164150070789845752","10954354645222333971"],["11582822901582851961","266856607133149621","2164574367120703441","15446424103772150237"],["9418211954432311629","16018953826584034807","16744460174190374657","16838958557004888529"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["3326047429423541683","6734703587486907735","9746254162647097349","17315698534125243751"],["15262152310750125408","11427046627407424897","10041796992399185559","2076631436368122403"],["4922726324086392273","15560132381942253563","10967999895730725915","17616816613080850134"],["15311768378741238321","17943776397890161078","1001475292317656365","15784692983863385512"],["12654466591448422636","11043977909865148423","3427765597600093989","15337531107848001315"],["3634412944592691986","2559361469886575752","18212673408416745172","4756155255841585022"],["5010916451863632764","3628241373026483191","778502425386001888","13053057011459856090"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["9707337172872002184","5753039885062630254","3814356171944307540","8063641834725041170"],["12569765423914454418","15988571269669964247","10201142030533235900","14452462135761370685"],["6125653295329606660","11870526574813093274","356364841652903517","1910960922101883621"],["14017395802427832275","16734326985361126623","9933448515897041926","6066247003353596022"],["7003350224529575701","7952631189256623530","17534691110286357891","7331793569401081857"],["4394502075240011893","11461566858036890552","11886120704765703408","9123774490875983896"],["15379202569031394699","9604282599596410001","16363523932233142729","8589504063004526558"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["10003726239606180705","16912814459606848944","3677284568380660683","16122097785516800285"],["14891409751490994856","12532255624782024981","8558569149882939619","3527572600301521719"],["11250235184787507300","10028699731490952443","1067647396823769098","16021643918062998031"],["17346315909191618608","5341990077757080000","5763159207694058204","4432883501937484036"],["5441854881953400072","15695475104821378406","4038977919021543126","14840753394956524132"],["3077994930191203281","2311458448388558828","1594641414687738609","15087852112825896502"],["11386069213650117288","14481349364357126408","5611516665231523700","13526976169633852125"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["9988589310534834240","71321630439895916","2784430856168819615","11306118893382372784"],["8748354735454524060","12903576585998162179","13743903224159423703","17566774769657212856"],["18286702886200401209","783774241429899767","9207044628048734943","3549332490428786907"],["7917626929167010250","8016302246098147251","16538084716555922160","8748259131628399876"],["14139235714840747270","11634248575051318631","18199465916979187728","97618873700514676"],["3313386784690277357","12103274473966240185","12126020323153960201","7873158101945760646"],["5549254862189788816","1389925581823592229","9482489591619261885","15268273041619041393"],["13036261478741884461","16310538190577570326","3866721368232175268","10347257385891613204"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["4158302249926171610","4161096764579741492","5146140535942413260","270864345688343085"],["11311684311735884631","9125192778029208594","9338883994885481921","3271963670729710852"],["12674461251758128743","15980447766239186167","4367333275717090025","17489172827665790453"],["7415158455596811211","4063568300769593971","4323773241140476620","15722665457644606066"],["4405531154680280012","2522311583720085245","3461851178139321428","18354249349331530172"],["16685999092661901005","8688753604152410","8859295418288933696","11932779698979348616"],["15379202569031394699","9604282599596410001","16363523932233142729","8589504063004526558"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["7965343993868338169","16217424719232830075","4307037626309029116","4842925071613843910"],["12243204254331957599","15917264126667811462","14369675871216861007","407544706293344056"],["6590960961674046211","15094844839616650394","10385612032239911226","5993470988611613183"],["16733116882061441946","16952570806557142322","13845837331441841368","2210197120999942391"],["8366095819939114151","10319178766133834628","12164150070789845752","10954354645222333971"],["11582822901582851961","266856607133149621","2164574367120703441","15446424103772150237"],["9418211954432311629","16018953826584034807","16744460174190374657","16838958557004888529"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["4864243310966367486","12951971606157513604","2298548132173834532","6322140741831761216"],["2365226567599486048","15542674152486607462","14666074152447445035","13484332514877010742"],["7339572354323276348","4901798707167622016","4463333555982204768","14313161967398276325"],["15311768378741238321","17943776397890161078","1001475292317656365","15784692983863385512"],["12654466591448422636","11043977909865148423","3427765597600093989","15337531107848001315"],["3634412944592691986","2559361469886575752","18212673408416745172","4756155255841585022"],["5010916451863632764","3628241373026483191","778502425386001888","13053057011459856090"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["18241063116305308342","4787186792860069539","6499735710384100637","9282512585301170557"],["10303183951210357032","8824474284759027419","6708143101266733417","4188836732356317885"],["414922459206992144","2710268393186165125","17504664462453311898","8209882537305059840"],["9191745484011619554","4806315379327149139","7291053415305629819","1875117488847303076"],["10186164503108645736","7473777267005651432","14698140612066143114","13562055507232433782"],["9578423892439664036","17598913395257708477","5821758673242920708","11943016011651383210"],["1054251680706833878","10826553495304588554","836492225055393848","4340777212496726902"],["13036261478741884461","16310538190577570326","3866721368232175268","10347257385891613204"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["8625607543594899958","1525516415704779269","12671186541724746593","11993210267335528013"],["12117356416478973630","5909631356551214353","8680253403125221596","14689707150689556941"],["7388631033193230413","15700592462455656674","10553040842464847521","14822112794064650483"],["10225898294568929557","2995572101255490060","77832432450848340","415220040409047723"],["5091957817263454856","17701262537324257101","6358953003321476905","17351400810068826198"],["6211787018160719640","14723520710917077291","7429088353081079371","7498211604345090571"],["2812282603775624995","16528524492126873627","7050277657034024714","9071103348960646691"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["14748371108922016283","6101779670285439624","17024551853168089974","11190558096558209243"],["2249809413255610652","17842196997939783523","1961933092062655755","8542333193920358990"],["755703883839645508","17466463648857177371","5357434980759112769","9505781972738839291"],["15402927614014613707","2028258990815948720","7337724783068012329","2055365894113150250"],["4638363384922678426","1011603924138661333","13691101072625793626","3755660758629070373"],["6211787018160719640","14723520710917077291","7429088353081079371","7498211604345090571"],["2812282603775624995","16528524492126873627","7050277657034024714","9071103348960646691"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["12739982311246933780","12726962143560644899","7133606649049129590","7771443987396427785"],["7739175081732133528","2492194222798549071","5721496543835780689","5253642604165638554"],["13182223481134745175","11944737360289361136","16133922428878442743","5758675847708211586"],["2004087050856315608","12750896475565204478","12512296852127567606","14923161817026250725"],["15086087432013538053","15256113802956688820","15686475516268603132","16496214033690385582"],["12861761783724651155","1384484475889120313","1362786666666279848","17214782324867174228"],["7483393090459967872","9117254521478311647","11037702922138544905","11948584764288970584"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["2561312088478638321","14225779128752956153","9539937760594399017","18133421820909847612"],["13139580294375904000","15773079430218462225","1563958341203088054","9032037613089898628"],["18435374357024261714","2946962682359389817","12879439112434550013","17975471162205855384"],["14123258774059985575","16608349997859155226","4108615884070817777","2246209243596745544"],["5441854881953400072","15695475104821378406","4038977919021543126","14840753394956524132"],["3077994930191203281","2311458448388558828","1594641414687738609","15087852112825896502"],["11386069213650117288","14481349364357126408","5611516665231523700","13526976169633852125"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["3232113066657580117","15745534562090128723","14921260341317514131","6987931352255944449"],["3049277941280114399","16513317058494960105","17458279620495669597","3245483686686615859"],["12908224576624895584","10273674625828888209","14554385167921995089","1802651927855065868"],["14264921925410178117","5786952365113146601","569408948672862573","5064983711791334422"],["3066544997890225402","596244103426786424","1913489417772650411","11313136282936571154"],["7906206985274550347","8903206031809400414","12720049176900779312","9510966883357741771"],["11386069213650117288","14481349364357126408","5611516665231523700","13526976169633852125"],["10706164004808984561","6469729126332675974","10209978523995285398","15728072173572906087"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["15306323463710406025","11997380399877998571","8425781597759858803","12945327359813219014"],["6847911642499671466","16133161279131815747","13039359781959271701","1042870710648881554"],["3206682337643224010","4180337168248724666","10213264868263320294","10697172380991779786"],["11371260345213719208","8768989758833322143","404001121658106761","6361381069327637625"],["17275920097929510707","17589888821771759862","14601095595159899418","295383264990311384"],["12861761783724651155","1384484475889120313","1362786666666279848","17214782324867174228"],["7483393090459967872","9117254521478311647","11037702922138544905","11948584764288970584"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]],[["6781937992882704492","75310869461799454","7237243916942202034","5844982914799587305"],["2370344989703036024","9541968813783130596","6883151288860500071","7171714684543183940"],["11631108566835305352","14044877967857121355","9910139670453080931","13958931314607268229"],["696101674336386307","9906361171116461723","4338296978078465886","8777528174385005326"],["8329399497105746475","11910955042832077983","15432626870030088771","14197714981808575763"],["12054892000660312635","3974673710079921986","8444499246309335160","1785281798303930738"],["9418211954432311629","16018953826584034807","16744460174190374657","16838958557004888529"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["5664739524032749667","2425582191620212912","2655699331435766152","11859550160497749286"],["18375117686842829282","16613334840742599463","6538520184424195700","17538534836978273098"],["3665941997262561177","6646872897008580126","16331020279618533531","2059064312813008609"],["14667581061632391400","12137694884070175150","983908069082444740","13038356773480653812"],["14175506508660725023","9738764837571973120","3381957807382710825","2407552579202684469"],["11582822901582851961","266856607133149621","2164574367120703441","15446424103772150237"],["9418211954432311629","16018953826584034807","16744460174190374657","16838958557004888529"],["13516979441563272046","7335147485674767018","12268268404914555779","17718813846798954143"],["2993411223576399752","12633697757008477637","13093663084717915282","13258998218668120579"]],[["11975402683355782692","8550432203504776783","6298944494544658448","12581932298505257288"],["15089586072040312221","2906325373837345976","10313676466496726904","17961233389532448664"],["11170063680307043551","8482428631500632927","3410608388998743320","13413934715971226262"],["16277478195351341285","6999946933864354243","7758475845416979525","10583656348510912493"],["12844854011549828303","3191569052038852562","9451251948335057746","2037470656549278203"],["5417790743037090217","17140551891377843387","13282830320824063558","13939423385185950719"],["7483393090459967872","9117254521478311647","11037702922138544905","11948584764288970584"],["15160553394633779730","7107781553836178593","5289824084464302353","1390684588543394155"],["1524789531748109486","15794972278158002058","12245720151636116157","17962697849148400150"]]],"s4_root":["935595241616482473","11961785830167694823","11240728945598833319","7580578626116016341"],"s4_vals":[["6460642938541058814","8784761305817635565","9007165961594577156","16142338401269946457","8151552422603649578","15918959372196218265","4047656531637715832","3599582433151900883","12127828173528788499","2415271512755800657","4044302029257626002","9905992587504024809","16652654883112939419","17050212434652178106","8475791202448558190","14378674983260121660","3636546456735841345","1481111338691087015","284847411197123186","15227929810261177349","16845753652983462209","8407361361207139077","15999783955768461967","18257141825688600472"],["6951601664166887274","5842424500634051506","13863813464646381888","7725570587709955494","17802879975402406356","17847600968647539539","12933855124120149065","5491249376894465833","3474220689156682799","14040953156325713232","8648231488497608360","6906888908619709442","2120099256355009129","2813205190651505496","4723495289748641293","8813289435257195544","7968206185791929939","15332067583010044282","11110889228402036960","11539723860069702175","13766399204924267932","6023848717178964202","18313940638181042502","10904297067671514194"],["17667373047547010268","6160560710303267429","17913107407881265919","7599437588503441716","3421805875235214561","8661985628664811468","9617025259373652102","6797801056674060180","3165539107211222007","5011260234980023928","15664553494994253556","13310619882072271931","1041745961133149027","9401769210717535189","9501233394723390607","5720250596926805818","6714618535242719269","8434252362761336182","16376059784996979526","9934164479455718468","13213975073939658530","1607507292775381751","9238922081521283545","10435812288437864377"],["3833805701557627288","5046428562994058519","2963272434567234018","232646943592622325","12702626171500778508","9117561215718614915","4874266115862482765","337664931334794605","17820783664158386320","8051704518028897645","15334417439216137259","13206441027145558629","381827398940947346","10208156303872586431","2118336775328089289","17041060722252655312","14181355938094384273","16060925797535603817","535419648215701497","8687444652609991421","10700179030662678804","15502291912892328173","11407685311588251301","15026990655223120384"],["12303549730040092190","12715530752040078585","5351700331371983039","8449418417538761005","8714086902716603736","15522186384084167782","4322118473640531393","13858135960343073370","13922666322113156100","14656147439054149227","12056168084119102553","7076061306949276986","6199688449803046270","2510194167138241040","2859567689921044016","14830665491644226268","15805562613848248387","10124629472316254752","11988067418604841322","6628231391125614801","13861891521470382438","18256359753895921545","13645114647215388948","10609161989898193713"],["1129015372554366745","6008107405955296863","17426350508677212485","8188884532007326023","2365658673327442010","5821613120630703500","13817259389501511825","17212191647728268789","6744541700401301793","1954078200718154709","7310898001318928288","7476780555776935320","801627045473053881","5497497110448956745","14159041394423657122","2903729437212111441","15688133420219698814","883305546665697041","6570754163707878273","1368469680646561332","7642424507836873810","17850219357301078628","1804135181556427105","1069289338951335307"],["13565405953912652305","16749620978621030589","17154446343497954768","15468886923993376353","9692654548580647223","1250768493488364528","6537905742775422285","17330311791305729565","5750775030420064874","11892907243973594153","13453230164641831897","2467059495589146944","3187786478062805398","11984615604654549618","16406123395383739199","2377572915239149831","8587288982073131885","16412209706344428432","9467308496387014112","11394196791554978585","14995939918908151328","14815712249963486223","1842207389830587624","15973731953597697445"],["6951601664166887274","5842424500634051506","13863813464646381888","7725570587709955494","17802879975402406356","17847600968647539539","12933855124120149065","5491249376894465833","3474220689156682799","14040953156325713232","8648231488497608360","6906888908619709442","2120099256355009129","2813205190651505496","4723495289748641293","8813289435257195544","7968206185791929939","15332067583010044282","11110889228402036960","11539723860069702175","13766399204924267932","6023848717178964202","18313940638181042502","10904297067671514194"],["8170176399436070427","6352351413401809939","9126869986937539520","17463059507059399031","12135672284861647120","9792252478910340794","13985058305194814575","15782883309491274295","13263292657147748800","10881974601282206628","8610950157671372627","7131950198931255039","10918246110306553884","13600557721032591890","11056517719128757813","10797800053041371660","16154592485405116858","457764237067773150","6194283591800612786","6106163689575561459","762679070222046145","14181972754935137908","1759197737439405364","3216107743568313821"],["4317594426701271932","3212839656471372645","4672771541971184126","508514278627284162","2136895066966017026","8690082255119138979","14883656674787313422","12221217950789901324","10894348971042502470","7235695635859155061","16408973572862530285","1695704292545294315","12651865183981861840","16156261102360400746","1146739640565469154","2087898354802875381","1791643183777015180","8098570063541068352","7029889622069227384","6475773481824321299","16680778609906554802","6570726099071022854","17667508034891274216","4619661870100578039"],["12614436093018555852","3141875310403771350","12921688177611154358","16119017151493800041","3183032685344463180","1165007697695762198","15312191937562561403","10626355046794857025","916871371922312317","1912376367624248611","3608633121485750903","10656341733162865178","3112160280787298217","6400981788647743509","8876254649262020781","5247010124642981573","1351400363158286380","8712127005910854569","1092904204911954058","6851676039881968082","17235813255071108333","2368501335161688252","341231493583623712","16567299517897582479"],["18385000354479875713","3154820384158516777","13983926452268306954","11228652468076170754","14249432322155476748","10154583482314608980","13763931495749422533","4791112434681219474","14057142572033082383","2145412516670272956","5096454393128172235","1690722894074713282","1801400907065267162","11752568695257085919","1277325104325031332","10322096018674539819","5376903928509299760","13704833749515661111","7911048344766745559","16493400419869441492","16485832477605496821","7485563883763308673","10834175043061734741","16251883151731100429"],["11652720612620663248","17574305838963858982","1609159122859078689","10636480007952644625","15275752640835991413","3052774537860170708","8532243954232467955","6688078044429259271","16209977097769772482","13395301533051334699","2591866225398608525","13236690031017180625","4222092969267446642","16054030130325462904","1975595991186583265","13119850100133856315","15849491396700111367","15333367904585216854","17014979554061925241","2501339102914240511","13813486803147103001","4448165821934797520","15612866027180831667","15456520796430455278"],["3833805701557627288","5046428562994058519","2963272434567234018","232646943592622325","12702626171500778508","9117561215718614915","4874266115862482765","337664931334794605","17820783664158386320","8051704518028897645","15334417439216137259","13206441027145558629","381827398940947346","10208156303872586431","2118336775328089289","17041060722252655312","14181355938094384273","16060925797535603817","535419648215701497","8687444652609991421","10700179030662678804","15502291912892328173","11407685311588251301","15026990655223120384"],["18002754061830266230","7464137134670199903","6781592172552919455","5365381310513968195","1827863674817737230","6217051514755396067","4504402836049176742","3171436710753214290","16708402753680684134","14544163357669315128","16278100080438472883","2055427805907478476","12880109764528678959","12865556599516468206","2955317272314886734","16082037000112014586","17776291219292237112","2935564448520323602","2750616059807354502","16984618260793234858","18083934200709864820","13211264700723469759","13095132493680012387","14863179100020925873"],["10537126743231640051","2997910666943131545","14522386358475570753","1195685835492965813","1264184304396856668","2646275057408824295","4366752875898947407","16221764604998101734","11175123879251008669","8786944791725002154","11526625577534524393","16743319450542360896","17032999810132514404","8668442286612112895","13739209276030727535","18329795433933039051","10380322885194170394","2099400496734926371","7073646016742724267","11396955632772352983","14625086695173074560","16552480492794733315","1548934278765799245","7072368491149366789"],["17667373047547010268","6160560710303267429","17913107407881265919","7599437588503441716","3421805875235214561","8661985628664811468","9617025259373652102","6797801056674060180","3165539107211222007","5011260234980023928","15664553494994253556","13310619882072271931","1041745961133149027","9401769210717535189","9501233394723390607","5720250596926805818","6714618535242719269","8434252362761336182","16376059784996979526","9934164479455718468","13213975073939658530","1607507292775381751","9238922081521283545","10435812288437864377"],["14187889804270344728","17176772012289135095","2915745774934762868","13309553752711384078","15801638041435690812","5608499696762541788","17046599878226608247","8074472497031804265","4294904150094390560","266861758334670568","4119751240446044136","17032354497115387677","13423138676275364419","4086490561101111879","6000309770062032814","11559746229824807356","11315829230959419173","16854038718506564302","8142840823414120944","16447090274570608209","16959005935530450434","11318903030383731909","15296387934697480153","2415867673806135408"],["2820712107022893263","2095662287604698796","3477680459991513643","5337568626661141127","4122034064808651126","12518334757049847880","10275858359016597645","657461869268626949","15979261045506617431","4508423016599740931","3539960193341002747","12843881119095357454","9367019620349513050","10642293179524714965","2358657282332437609","18342157318816729348","10928607005906617922","7477693217889016670","1429775902239408922","9234610573671222301","6998682293720600537","15659356089235563376","10966028385982208573","5348815918755780467"],["12303549730040092190","12715530752040078585","5351700331371983039","8449418417538761005","8714086902716603736","15522186384084167782","4322118473640531393","13858135960343073370","13922666322113156100","14656147439054149227","12056168084119102553","7076061306949276986","6199688449803046270","2510194167138241040","2859567689921044016","14830665491644226268","15805562613848248387","10124629472316254752","11988067418604841322","6628231391125614801","13861891521470382438","18256359753895921545","13645114647215388948","10609161989898193713"],["5325036634649846036","14560027846274133066","15030522869165470686","9947656236530738247","6492616912517888547","16867522385755497441","7791493246510448595","16430778772347343805","14091169432092491763","10433726260482907522","7896363078284616891","4482613559897640243","11954153904282612250","16648351094472845413","10638402366709672059","5948104769335045234","10866582394645704108","16574954867259585993","5741765720234743867","16191434591456768662","3957554403015360673","6221151357149123935","18095251956028239197","8165567929347416188"],["6777759318760440455","2787217026981736558","11697935046162820593","7082712584874402195","9527345005324419936","9920143276200282551","9227581431656133302","2227248313685921476","4335903616651249863","9030923644887773336","2762750826765833231","319830101340176981","14348441878931747833","1463756839412833028","13282527126598095116","3102589839979011859","17153410256693981921","14170453334910034085","14107684830746858359","13973301111802396695","6197112104066934752","14454458527547534180","8332651545984290644","5545481144313125972"],["18385000354479875713","3154820384158516777","13983926452268306954","11228652468076170754","14249432322155476748","10154583482314608980","13763931495749422533","4791112434681219474","14057142572033082383","2145412516670272956","5096454393128172235","1690722894074713282","1801400907065267162","11752568695257085919","1277325104325031332","10322096018674539819","5376903928509299760","13704833749515661111","7911048344766745559","16493400419869441492","16485832477605496821","7485563883763308673","10834175043061734741","16251883151731100429"],["1129015372554366745","6008107405955296863","17426350508677212485","8188884532007326023","2365658673327442010","5821613120630703500","13817259389501511825","17212191647728268789","6744541700401301793","1954078200718154709","7310898001318928288","7476780555776935320","801627045473053881","5497497110448956745","14159041394423657122","2903729437212111441","15688133420219698814","883305546665697041","6570754163707878273","1368469680646561332","7642424507836873810","17850219357301078628","1804135181556427105","1069289338951335307"],["2191294442929748404","14844467507843548111","15150026786842798381","4838502198791605389","7295275405338412997","17591981716604789567","8179119622608242659","13310940525908545986","7962909868695405897","4366175307231697989","1502993284307329542","8867807506934220509","12267961306775453568","9793754418053544983","14171793972710167775","10157651374104126612","8354504147225602374","13029790355823570193","14371501202119796371","6471994905045797804","2888928678282913354","8352210588460340466","11252315575794484294","8987800936789817891"],["11652720612620663248","17574305838963858982","1609159122859078689","10636480007952644625","15275752640835991413","3052774537860170708","8532243954232467955","6688078044429259271","16209977097769772482","13395301533051334699","2591866225398608525","13236690031017180625","4222092969267446642","16054030130325462904","1975595991186583265","13119850100133856315","15849491396700111367","15333367904585216854","17014979554061925241","2501339102914240511","13813486803147103001","4448165821934797520","15612866027180831667","15456520796430455278"],["12197005788162951095","11997418898741239944","12229051879436550815","6553696713314584659","15300447235757826434","15617012410096596560","1841226669881786581","14262472254032688878","9418914764131500075","12521741752336571970","3495656731795319617","15859118736600156606","220609784596111106","5866861018448080471","11064599487916952093","16826001973256899984","18425105655050077485","15599171198455280475","15416914707804673761","17236450059494744389","5743496827039404046","16208873357789289505","12391797891965360199","12349684125310663081"],["13846081068268607146","15277537549500716439","13606049258404042254","16450013356001342513","985902420989254510","10522887368270535339","2301099102270336375","1897568815305257964","504316419802049230","18125922424711810870","2270640304459220495","11295430098270657495","9960158461542126456","5041781518455200900","3653792325069427590","13410005903192305818","11622556218749094646","15554536743174054869","15207599628245806605","1682499378920006558","164855765179111693","12388164811094778659","9992753992109766181","9104445422781142046"],["6536818975775895617","2202929976376908359","10511433032998578769","2106579211571132748","8427685791864856887","16291557866508979006","10353154711163677239","2736912241425151645","3595524058985020937","11242699716131600772","2822860292722836692","13114603979129147444","9036929418910106044","6899219489001160818","3566992751278280578","6342994116025388029","735221695974751493","17817062830385954752","15240642363404658931","11875960031709674497","550502925214243840","1864245310151245400","6383279677609302848","6785151554214208071"],["8102961019046466609","4139920340852337341","16431623972748682143","8792520449311905930","6605281824267461029","3994756129578793643","2621799266936323578","5266715132190056227","14024427503765299181","14077886944593933410","12168390063752459093","1042260238453137889","3098610729765512331","9553368894925769302","17286189345915164721","8669556597885860335","9332342704253243699","2110171981814549921","6361437500332074717","12517367702372406449","15973288128943880281","17740819550697459635","4831006063971351102","1782638960217168105"],["10022501636349623622","9949206446665515752","14582236126189053182","9564199726390473051","5369460871069536356","5297298519841152618","3843842843543343385","12139125473531612439","15171357287061555756","10045475450572606831","1186851771251056760","13443458776107216632","7134990952731261282","14674027283409223539","8484109956587692929","14401771385068042274","13912491630153681875","1972496507928240907","9834835055726194051","17935563792765767130","5467151412009183493","17799396341150414588","6438015247654634989","892481279051945218"],["11652720612620663248","17574305838963858982","1609159122859078689","10636480007952644625","15275752640835991413","3052774537860170708","8532243954232467955","6688078044429259271","16209977097769772482","13395301533051334699","2591866225398608525","13236690031017180625","4222092969267446642","16054030130325462904","1975595991186583265","13119850100133856315","15849491396700111367","15333367904585216854","17014979554061925241","2501339102914240511","13813486803147103001","4448165821934797520","15612866027180831667","15456520796430455278"],["12614436093018555852","3141875310403771350","12921688177611154358","16119017151493800041","3183032685344463180","1165007697695762198","15312191937562561403","10626355046794857025","916871371922312317","1912376367624248611","3608633121485750903","10656341733162865178","3112160280787298217","6400981788647743509","8876254649262020781","5247010124642981573","1351400363158286380","8712127005910854569","1092904204911954058","6851676039881968082","17235813255071108333","2368501335161688252","341231493583623712","16567299517897582479"],["12614436093018555852","3141875310403771350","12921688177611154358","16119017151493800041","3183032685344463180","1165007697695762198","15312191937562561403","10626355046794857025","916871371922312317","1912376367624248611","3608633121485750903","10656341733162865178","3112160280787298217","6400981788647743509","8876254649262020781","5247010124642981573","1351400363158286380","8712127005910854569","1092904204911954058","6851676039881968082","17235813255071108333","2368501335161688252","341231493583623712","16567299517897582479"],["13565405953912652305","16749620978621030589","17154446343497954768","15468886923993376353","9692654548580647223","1250768493488364528","6537905742775422285","17330311791305729565","5750775030420064874","11892907243973594153","13453230164641831897","2467059495589146944","3187786478062805398","11984615604654549618","16406123395383739199","2377572915239149831","8587288982073131885","16412209706344428432","9467308496387014112","11394196791554978585","14995939918908151328","14815712249963486223","1842207389830587624","15973731953597697445"],["1458641738746367545","17441230226617627567","15259934946593099851","15884437280814704209","5129845226766889314","2575416493033007511","15565782991682067874","13667209961145901034","9228136719678957835","332468837448893201","17940294803126111815","2310472497559371906","15917801473351263168","13384480038696373862","2165278609098350718","11463653269277047262","7552841006609767424","3064869443838044692","10804635663064553051","14849829446163115382","16618087390445577147","5349998631821472451","10055970691681973966","7131150033583693922"],["6460642938541058814","8784761305817635565","9007165961594577156","16142338401269946457","8151552422603649578","15918959372196218265","4047656531637715832","3599582433151900883","12127828173528788499","2415271512755800657","4044302029257626002","9905992587504024809","16652654883112939419","17050212434652178106","8475791202448558190","14378674983260121660","3636546456735841345","1481111338691087015","284847411197123186","15227929810261177349","16845753652983462209","8407361361207139077","15999783955768461967","18257141825688600472"],["10992218819082039363","10384816381026361297","16622241536473346135","2829232898381216109","15654396886200423715","15575631433821519506","9400186346009962704","4605952118232830756","2201223008531990821","17933169324799175953","4528989890860902954","4151395256298225145","12327049050672526280","13585273524699479043","17843268856746540586","1700918914713617663","8230856480021275994","11265256627530621079","5606646041333591794","1926359448041834619","14183396898391871848","10942050558033655411","1823845523759989960","13944447770450823802"],["14220243469051000263","16292704552730523294","3926028058004958379","17037657945667838473","10294740222633327027","18385827565554573400","12333371223255778075","12976570244923217838","8306968583413742111","8768202763248786565","11253058924352146671","2230201111697893678","17965886951867820873","8544834236018427","12789046328666825540","7800097967456966668","13394937843615999948","4941844470763968625","14641347562831348708","17899166082282238405","8738100941630425920","52726373316222979","1617928922858467707","13906661201252949242"],["15558733333080182268","10628226880157544851","8386150235416165303","1408803032029227601","17967854940828503339","17825417125362015502","4349730510601109027","15773907852830476164","7689132459658856932","10919169207086547192","2270785269334318945","1704373200228161846","14804277494423139121","4781446304874390499","1680539127174166895","18367060800889695810","14271594093984500321","3370823559666139075","10907364789393414792","17908568290688271473","2700532353537595036","1453785464552563880","15880737076869344775","11950281682593160589"],["12303549730040092190","12715530752040078585","5351700331371983039","8449418417538761005","8714086902716603736","15522186384084167782","4322118473640531393","13858135960343073370","13922666322113156100","14656147439054149227","12056168084119102553","7076061306949276986","6199688449803046270","2510194167138241040","2859567689921044016","14830665491644226268","15805562613848248387","10124629472316254752","11988067418604841322","6628231391125614801","13861891521470382438","18256359753895921545","13645114647215388948","10609161989898193713"],["12614436093018555852","3141875310403771350","12921688177611154358","16119017151493800041","3183032685344463180","1165007697695762198","15312191937562561403","10626355046794857025","916871371922312317","1912376367624248611","3608633121485750903","10656341733162865178","3112160280787298217","6400981788647743509","8876254649262020781","5247010124642981573","1351400363158286380","8712127005910854569","1092904204911954058","6851676039881968082","17235813255071108333","2368501335161688252","341231493583623712","16567299517897582479"],["111324965463427756","13428895374036074547","3089228840857158003","17095484216411024142","4668440953664670032","12245565190926300962","14844117167044201730","7682251305340355472","2023162502234839963","5971655262009562734","17267894977533874213","16076677215477188333","2720522029274654500","15901776344824977771","13845776331260510138","10480205877564737261","12152840273215661238","7526762373336691544","5859788783264725992","17755910925650987790","9862638958717497307","2674598503465479633","7134277532291520708","888941275560752173"]],"s4_siblings":[[["3990097421333799936","127375665161099147","5476912711549188822","5123549231282928160"],["915338221699613524","16229422731680930513","16553321672006625871","4467968461003259449"],["6866863715089586075","782087930525252821","2821672344076899163","4529293883842757899"],["17596407659661755967","3222129148315530597","12523880815477110352","2541377834622823649"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["15594411734668510523","6898367337781362777","4047301429505829202","2559816974285923965"],["6952002560875660292","2522708136361012631","16026222562214096148","17933311872907270774"],["12015035440728821792","13532574489685090644","1586837764016452868","4167682234315190232"],["5737970587293554101","11811328646249120483","12712697053010336887","15623635198069306458"],["16539351186362108210","5338518661366283097","2573909061537976069","17315599721120522956"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["16821982664536505106","8021786024142522920","297117006798317015","5615856838170604993"],["6886592783692027183","275946966141901009","3880867201476546642","1731368876700208605"],["3010178254877121918","6084222068324979155","10760973085161036130","13022319602337374062"],["17596407659661755967","3222129148315530597","12523880815477110352","2541377834622823649"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["8357618032253688264","1158477263866222603","2417042035461095988","6572783515822938136"],["9986942741110722551","17758929831892755225","16980677495765786080","6231161368802957053"],["1194773291080092440","13625177259010970149","8711836863689649364","5897129642734191665"],["17064733074484675537","17063134446792225932","8937252564222871991","3815523116530060767"],["15112339704307151831","5597347933901317668","8522987581592268694","9307828925829857714"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["8289244822137443996","16976088086159588545","16047861809273193229","18120630012366606967"],["9396353658655291084","2600691431365771430","4667928068550219200","16699045671660353840"],["15871977060255758251","1492842992753513493","1982425916906500932","8421358345272384508"],["17064733074484675537","17063134446792225932","8937252564222871991","3815523116530060767"],["15112339704307151831","5597347933901317668","8522987581592268694","9307828925829857714"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["7131136059648107862","11580656386630614734","10709947159243516048","2272025402378019417"],["5104752914289405528","13033454896300932903","14224096723768194668","13967274704779323148"],["6265387134699510406","2650051895494733900","11057257895163655324","3049871118125917182"],["1580158511560129268","13871892777527232863","13821780379791112968","7427881461147271002"],["14961860400864556168","14414666633475163502","4727356659258287361","9783792958456894267"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["18355789596655597375","12494114614077020423","6543469863572618873","13787546043418900040"],["11284792870590052644","4348818435616082007","10865840752144032885","12896581950307839537"],["12015035440728821792","13532574489685090644","1586837764016452868","4167682234315190232"],["5737970587293554101","11811328646249120483","12712697053010336887","15623635198069306458"],["16539351186362108210","5338518661366283097","2573909061537976069","17315599721120522956"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["15594411734668510523","6898367337781362777","4047301429505829202","2559816974285923965"],["6952002560875660292","2522708136361012631","16026222562214096148","17933311872907270774"],["12015035440728821792","13532574489685090644","1586837764016452868","4167682234315190232"],["5737970587293554101","11811328646249120483","12712697053010336887","15623635198069306458"],["16539351186362108210","5338518661366283097","2573909061537976069","17315599721120522956"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["3752326973547267757","14832792623949638085","6733683373504235467","13981718944185225268"],["13554332846741600215","10104615123818319807","11544777114829609122","12710171333072782395"],["5920249257919647162","7714071323651756124","3764797395132525658","2879197415205527638"],["14757702940947651773","10815639683254883286","1784409845289980700","11110399910766959187"],["14961860400864556168","14414666633475163502","4727356659258287361","9783792958456894267"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["4751336197973106539","3310761438207313631","15017512602334319976","18019704401788089006"],["915338221699613524","16229422731680930513","16553321672006625871","4467968461003259449"],["6866863715089586075","782087930525252821","2821672344076899163","4529293883842757899"],["17596407659661755967","3222129148315530597","12523880815477110352","2541377834622823649"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["12261288102869811243","2808888298115162988","8304164519855601836","10531759777120423318"],["2199557447418065482","2975768255738968331","11279505974737465765","11527629154502906642"],["4334075982130547584","57959593221382058","18144572615834474249","9369257383583965168"],["12714820081251385484","9741306955331781418","2854311228129483635","993764902093357622"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["10189180992257996944","12648602332455449756","8399008569934828003","1789806369996916983"],["6886592783692027183","275946966141901009","3880867201476546642","1731368876700208605"],["3010178254877121918","6084222068324979155","10760973085161036130","13022319602337374062"],["17596407659661755967","3222129148315530597","12523880815477110352","2541377834622823649"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["4059066548245343909","7443308034057836282","12977936858244101507","13940151267696567857"],["15809547962156051966","11609952914585353383","17825666791005661618","2285700008726677753"],["12151292156418554157","3791789035420751680","9312470031611198927","428573291950522727"],["1580158511560129268","13871892777527232863","13821780379791112968","7427881461147271002"],["14961860400864556168","14414666633475163502","4727356659258287361","9783792958456894267"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["8357618032253688264","1158477263866222603","2417042035461095988","6572783515822938136"],["9986942741110722551","17758929831892755225","16980677495765786080","6231161368802957053"],["1194773291080092440","13625177259010970149","8711836863689649364","5897129642734191665"],["17064733074484675537","17063134446792225932","8937252564222871991","3815523116530060767"],["15112339704307151831","5597347933901317668","8522987581592268694","9307828925829857714"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["7344195296636380254","716442741261053830","7206886418837949211","14443600593835106459"],["2959576042571330420","9800251917754325044","7642596702260774723","9839507155558684397"],["9867718845534895404","854759293416844006","12284804227664572312","455404344098991844"],["8441942719284478238","13385846304281495754","2263649501359394379","16268868529228826184"],["15112339704307151831","5597347933901317668","8522987581592268694","9307828925829857714"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["8885847419903602533","2156535449133627672","7734348333332267194","9757245885495824719"],["11568581081524026522","14132826136839429579","12723990188209696670","12701054300137937575"],["6265387134699510406","2650051895494733900","11057257895163655324","3049871118125917182"],["1580158511560129268","13871892777527232863","13821780379791112968","7427881461147271002"],["14961860400864556168","14414666633475163502","4727356659258287361","9783792958456894267"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["16821982664536505106","8021786024142522920","297117006798317015","5615856838170604993"],["6886592783692027183","275946966141901009","3880867201476546642","1731368876700208605"],["3010178254877121918","6084222068324979155","10760973085161036130","13022319602337374062"],["17596407659661755967","3222129148315530597","12523880815477110352","2541377834622823649"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["8252507852248524438","11406177224434382592","5995041712765440142","11831255656936104040"],["4156058273776801663","9702450337339692837","490388712024581300","18380685637669002731"],["6198102022869283082","16916171114115006353","15364378900709080155","7047777047328252199"],["14757702940947651773","10815639683254883286","1784409845289980700","11110399910766959187"],["14961860400864556168","14414666633475163502","4727356659258287361","9783792958456894267"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["11295794140037204348","17389892554316696308","16773603632170721742","8290104339013389538"],["11848759577021297419","3388977697543128331","5347630473502659718","10997598041339927634"],["3010178254877121918","6084222068324979155","10760973085161036130","13022319602337374062"],["17596407659661755967","3222129148315530597","12523880815477110352","2541377834622823649"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["8289244822137443996","16976088086159588545","16047861809273193229","18120630012366606967"],["9396353658655291084","2600691431365771430","4667928068550219200","16699045671660353840"],["15871977060255758251","1492842992753513493","1982425916906500932","8421358345272384508"],["17064733074484675537","17063134446792225932","8937252564222871991","3815523116530060767"],["15112339704307151831","5597347933901317668","8522987581592268694","9307828925829857714"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["5298337317803768895","16684178236130958917","2790236284811556661","4579902577173970004"],["16057093377197029989","13813306561841877689","13766862805576445158","8104586321117248504"],["2217793290364213876","94274246374991443","2122177641256096384","3949694221649695234"],["10939127791146211534","17378586870361270047","14215336896325529062","6101300240681242280"],["16539351186362108210","5338518661366283097","2573909061537976069","17315599721120522956"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["18293574922863847481","14208126935746602917","1603647970681847932","3711138151328191061"],["5217229114695922631","1821226850480749134","2846030091160138339","6871225526658649891"],["9821412267841460521","557066106846117027","12510029905692588388","9374158654928379336"],["12714820081251385484","9741306955331781418","2854311228129483635","993764902093357622"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["10189180992257996944","12648602332455449756","8399008569934828003","1789806369996916983"],["6886592783692027183","275946966141901009","3880867201476546642","1731368876700208605"],["3010178254877121918","6084222068324979155","10760973085161036130","13022319602337374062"],["17596407659661755967","3222129148315530597","12523880815477110352","2541377834622823649"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["7131136059648107862","11580656386630614734","10709947159243516048","2272025402378019417"],["5104752914289405528","13033454896300932903","14224096723768194668","13967274704779323148"],["6265387134699510406","2650051895494733900","11057257895163655324","3049871118125917182"],["1580158511560129268","13871892777527232863","13821780379791112968","7427881461147271002"],["14961860400864556168","14414666633475163502","4727356659258287361","9783792958456894267"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["6261214984510315328","11480798208173479766","9695460866018321020","13399679041617897353"],["16057093377197029989","13813306561841877689","13766862805576445158","8104586321117248504"],["2217793290364213876","94274246374991443","2122177641256096384","3949694221649695234"],["10939127791146211534","17378586870361270047","14215336896325529062","6101300240681242280"],["16539351186362108210","5338518661366283097","2573909061537976069","17315599721120522956"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["4059066548245343909","7443308034057836282","12977936858244101507","13940151267696567857"],["15809547962156051966","11609952914585353383","17825666791005661618","2285700008726677753"],["12151292156418554157","3791789035420751680","9312470031611198927","428573291950522727"],["1580158511560129268","13871892777527232863","13821780379791112968","7427881461147271002"],["14961860400864556168","14414666633475163502","4727356659258287361","9783792958456894267"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["3120080512927597410","2263496606574329484","1447546925640242168","6255988392288498425"],["5570985846872123199","10269083633028234687","14852997852666335692","14900862405199845691"],["9821412267841460521","557066106846117027","12510029905692588388","9374158654928379336"],["12714820081251385484","9741306955331781418","2854311228129483635","993764902093357622"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["13513311007928491664","4032974156232362330","17115137348095123875","10784665739915900220"],["13968810589385525747","8140048126203853167","13930181481867147984","11569370821904227337"],["4334075982130547584","57959593221382058","18144572615834474249","9369257383583965168"],["12714820081251385484","9741306955331781418","2854311228129483635","993764902093357622"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["5213274416617373624","14097654766063340808","10172921916922800769","1678571462018783286"],["15545170211800192739","4601305860998979321","10740477913975266860","6066284082119452459"],["6866863715089586075","782087930525252821","2821672344076899163","4529293883842757899"],["17596407659661755967","3222129148315530597","12523880815477110352","2541377834622823649"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["15136050366738231112","3887313942457855708","9145819475446094192","13326322410862191677"],["13968810589385525747","8140048126203853167","13930181481867147984","11569370821904227337"],["4334075982130547584","57959593221382058","18144572615834474249","9369257383583965168"],["12714820081251385484","9741306955331781418","2854311228129483635","993764902093357622"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["10457946802985314603","16315700523214099642","15218160211578924031","16744280267165320173"],["2397617265841846021","16121217580128561682","3197066283941232415","4603189129360264657"],["16216983223838786990","1824524530460956281","11772439407464635267","17207957014167789843"],["8441942719284478238","13385846304281495754","2263649501359394379","16268868529228826184"],["15112339704307151831","5597347933901317668","8522987581592268694","9307828925829857714"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["4059066548245343909","7443308034057836282","12977936858244101507","13940151267696567857"],["15809547962156051966","11609952914585353383","17825666791005661618","2285700008726677753"],["12151292156418554157","3791789035420751680","9312470031611198927","428573291950522727"],["1580158511560129268","13871892777527232863","13821780379791112968","7427881461147271002"],["14961860400864556168","14414666633475163502","4727356659258287361","9783792958456894267"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["12261288102869811243","2808888298115162988","8304164519855601836","10531759777120423318"],["2199557447418065482","2975768255738968331","11279505974737465765","11527629154502906642"],["4334075982130547584","57959593221382058","18144572615834474249","9369257383583965168"],["12714820081251385484","9741306955331781418","2854311228129483635","993764902093357622"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["12261288102869811243","2808888298115162988","8304164519855601836","10531759777120423318"],["2199557447418065482","2975768255738968331","11279505974737465765","11527629154502906642"],["4334075982130547584","57959593221382058","18144572615834474249","9369257383583965168"],["12714820081251385484","9741306955331781418","2854311228129483635","993764902093357622"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["18355789596655597375","12494114614077020423","6543469863572618873","13787546043418900040"],["11284792870590052644","4348818435616082007","10865840752144032885","12896581950307839537"],["12015035440728821792","13532574489685090644","1586837764016452868","4167682234315190232"],["5737970587293554101","11811328646249120483","12712697053010336887","15623635198069306458"],["16539351186362108210","5338518661366283097","2573909061537976069","17315599721120522956"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["12410550348401167565","5636735730226391013","5963128229111720288","5254745585532400881"],["6517175236130649067","7649842170214960399","7991349669887814137","1463199855875608157"],["16216983223838786990","1824524530460956281","11772439407464635267","17207957014167789843"],["8441942719284478238","13385846304281495754","2263649501359394379","16268868529228826184"],["15112339704307151831","5597347933901317668","8522987581592268694","9307828925829857714"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["3990097421333799936","127375665161099147","5476912711549188822","5123549231282928160"],["915338221699613524","16229422731680930513","16553321672006625871","4467968461003259449"],["6866863715089586075","782087930525252821","2821672344076899163","4529293883842757899"],["17596407659661755967","3222129148315530597","12523880815477110352","2541377834622823649"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["4284977565152411229","5790750825389273022","16274711260200868918","12808377483240271829"],["5217229114695922631","1821226850480749134","2846030091160138339","6871225526658649891"],["9821412267841460521","557066106846117027","12510029905692588388","9374158654928379336"],["12714820081251385484","9741306955331781418","2854311228129483635","993764902093357622"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["3223088174902747662","5765344305350613698","16292399947272061482","6555918326520837855"],["5769456680985629383","9599111860251060645","6307456708347618394","7734371986520693762"],["14502930589110122281","8398695187786086879","8048567118238156364","1357321660630270328"],["10939127791146211534","17378586870361270047","14215336896325529062","6101300240681242280"],["16539351186362108210","5338518661366283097","2573909061537976069","17315599721120522956"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["9031353807648485046","12195115391567095713","9593803035786771556","10962666823387963841"],["15809547962156051966","11609952914585353383","17825666791005661618","2285700008726677753"],["12151292156418554157","3791789035420751680","9312470031611198927","428573291950522727"],["1580158511560129268","13871892777527232863","13821780379791112968","7427881461147271002"],["14961860400864556168","14414666633475163502","4727356659258287361","9783792958456894267"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["8289244822137443996","16976088086159588545","16047861809273193229","18120630012366606967"],["9396353658655291084","2600691431365771430","4667928068550219200","16699045671660353840"],["15871977060255758251","1492842992753513493","1982425916906500932","8421358345272384508"],["17064733074484675537","17063134446792225932","8937252564222871991","3815523116530060767"],["15112339704307151831","5597347933901317668","8522987581592268694","9307828925829857714"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]],[["12261288102869811243","2808888298115162988","8304164519855601836","10531759777120423318"],["2199557447418065482","2975768255738968331","11279505974737465765","11527629154502906642"],["4334075982130547584","57959593221382058","18144572615834474249","9369257383583965168"],["12714820081251385484","9741306955331781418","2854311228129483635","993764902093357622"],["6136878341189671342","12580695484577641551","13626565675873860595","11759860883904835890"],["14975779700460466270","7256667896364602864","8691429540545073685","7299837955320522158"]],[["2599141839202319949","7946479406401554556","13131225505788489503","37078127352670981"],["11076192425127917768","16508700332727759286","15569339727251132604","7921641564915238984"],["14410215117494414076","14503960470657246775","17339519787533041551","9508863655385790344"],["5737970587293554101","11811328646249120483","12712697053010336887","15623635198069306458"],["16539351186362108210","5338518661366283097","2573909061537976069","17315599721120522956"],["14805412823555929694","3090273040795219891","17673280721431854908","6030533293739474056"]]],"s0_vals1":[["1547541474593902846","15119157000305926898","8683177935379333717","13795180935666818826","3728192555521016897","12693365677163941675","2052797842699157765","15378985871745913972","7201030010744203301","13270248706309765338","3272256495427669384","9943522072908867492","7345350367245310833","3593018342060132294","10852337533710936852","5480845957235148682","1741259053413624980","3104120555858577510"],["12785496784075088625","4318517041261723625","8211729903201135934","6094766345191218708","2115274644783974526","7946371698752652235","4840054994154950561","14719111706141367293","1060171385307987669","525702749949163794","11792155997948242252","1695110292397723778","3917241592614504139","5236143367643289992","5797979517351008632","2822030507468012778","16220824952396727806","8522475503603144756"],["1836612554361010016","4629802999478498710","10169190125970695823","16577021537484811353","1875848691079512788","13951647045178596000","5789114811758381415","7714820369156359733","1286595296006686501","645745777726453081","16761938192180742714","2916724612464773001","16133591285338667386","15154196530409280642","13086596181073587446","14654569766754665090","12267245469088805368","6085005374850458787"],["17496713588728831131","12215180238707802868","12623314001523040253","4320534606881500401","261500124027791844","15924061447069976475","7508057302810888476","1025938314031321754","17932267394633384147","989685897678853203","2925525465302047355","11703805243914821985","3650951695631951057","16260424774070963128","14619846704245703484","11327886258857059468","1523766556188699518","8128511933994592211"],["12307626073576954445","13265757012960026821","14743050392335335396","2956635005311530637","17483971907196483883","17744529641431281524","3286167365739561223","2201180296641274141","14402881560417776248","6277121635377657997","6736668308188855781","10297772324338345285","5866835688099687519","8267963431645791579","2664909349230428448","6384578725025739799","8774055687867516733","2878289683896463868"],["10120926599530262256","7638745345523033088","671340319618642801","3542615269802191728","15636853400801099184","15751503929048191458","5507954978737428852","3239883766010185092","17428251772157970135","9094584946430665526","4808216291376190332","8885162080723091200","14493099882750894633","17797230945749727474","6881944161246337616","17536442824474296949","10913520960720325038","2343169048494885791"],["5174635358166026650","1116757167121021981","7761872850679106110","13122356468156079867","732105183508508667","18123112950594240185","4624659330594459594","7843985789349524941","8074131618467220015","14211222461562758838","11075545114875955722","4267967115221418710","7271373490947619216","11158809976886828934","15457468726129761360","17114959510352385545","1896133771036225031","13452297966892102674"],["1617418400060844425","16632022380904368223","5746739737668153295","7092277204448202675","6209984460064614681","7221682982877113401","3071858465179978995","12475270294646143852","10577673733881370020","15475286502855196869","8548127063004115502","15175012014592249798","10174208132434313492","1144838232271451064","10281758818232128660","17235185724143625797","4597913968067045879","14270707470023338620"],["822199584867159582","1386018793268303093","3951272729398436078","15112577184627233438","18217070634784493698","13775624381788022779","18209204523808437727","1251332043785978331","1503930966505441046","15034223216583652247","11417677042652786775","2420116153311229475","838442460790353605","3924413027441386475","5047173203347353401","8744256479977763157","10054201723114979617","6316183973713909675"],["7571737501836968037","17395354970127111179","14231150052963844570","13572472946441723619","14725958290864448947","3327322904442040953","8913733035600000026","17360098407006400745","2554102343068080406","13637568945470690605","609921186552272209","887998473508010807","6538689007491836970","13003469069325226112","9044074950201581406","7731446098426491159","13888235758224089774","10998098961600388794"],["10471863220833404526","2312593343312012866","10335341070997858159","7691474089472714387","2179925813483609269","16041437160382156922","17198754423780422921","243329803392154070","17326214909964769619","17929175139602587590","7536166631155125845","17852081872746055298","13836646554730285712","70320773416384418","9201984085526523936","8344886398950869971","2423505067159738953","8198446425186831158"],["816485944784332203","8845464861983325086","7406982012257768640","5788190464510008318","11016632242599145574","1977714474614325927","15082353026816083676","4131469321138874544","5694465351584083872","13197246479103594496","1362791818771500337","13126566759299418934","12817299612948425928","9001035887607490778","17124709251303595642","15555545580972514563","6882854880143921294","9301544042598062299"],["14678610228555758962","2479439543203700590","1532038793227529928","8008148318438746786","13839810320116497565","11855056005986619123","6279802259678049838","14426535091035001698","5942037231599123229","16393296122647238645","12061273327581342899","17104995904857813917","6860248137111520099","17417585763598736825","18137691773933747337","12713255044989594100","6750018724707446087","3958134739351922909"],["1441590420020738338","58378781461218948","15585359818268910167","13545385945596850854","1108051129256657386","11918649137173087116","11059284399966426469","3312517909033590175","1082777464858569448","317533899214947237","4845254842220911816","4964675949905038494","11982727051276019207","1719289196027440662","2258961017642268980","12602956885398622881","13051203969265022103","13573805413969099164"],["3927922163969673598","6791149239992405337","12889155832288850158","10092956598577974256","13344109211399297331","2203617212485698913","2345277649092806594","2299656181670721916","18433528516134129294","4312098841963852364","10349935912456561992","6221814294624694975","6552923395503199520","10570940166378061818","4654177563246392470","15346289457309711441","6688749499012272681","16631223858471091621"],["7870428026108697806","8755514947486669672","15288571990126375029","13133344037169021766","14026417594648703357","11515848616920053300","11904342036951936529","11702641686244523668","950797816263294388","11312553343884019378","11584187644180213377","3590902287569396768","10338335243399463162","9447617511740420958","960830577280465114","11124413109617836142","11827097260378173336","8079870883899100205"],["17694202699932566655","7961768666087370265","14027576319704776435","827803352099573650","564905061736936246","11988984573571283468","9297273842250193716","15894951600954066908","6719619572366754872","11317492691780057800","13019104708746442777","8510617444838064649","1743042246482682920","6052276869860605159","5877058519414883793","5566942370376761099","13407192692656659368","10438598145323563307"],["229832285379598561","4569831231840956461","1213288511470934386","5492964400816935501","11258856930574744305","14361444729444747921","4179051781151666506","9573614487795943227","15346345594469344937","2629577622186380587","13203280651408270883","4919797776816544881","449800739048076953","15998168338141873480","9459306548399495182","10775475674223329666","587727474454677335","6759438719834020107"],["2311282746251388517","16768246063013754194","7203020931854930102","9279050581945502571","13547764566548436903","7007647678384727808","9760552310776153374","418964644084081783","18184983678447219880","8678723860927409472","17051749561391343936","1639778269775875354","12594250869199813502","11568803630059519946","13696198145628106537","16073149072816120897","3511430320609183532","1344606068794287172"],["13237718945903419319","11557532619300239617","16501613651259060761","14900054944737267891","13190629001482080199","13941613055249792306","12925915060671523110","10261518317071666902","1629440536088845401","13100772012110804493","15988078525707403849","13476736164341311114","20124191502913090","3360122660309242221","9324450145228595927","12383044495413411149","11131277803477802722","2488519356394704146"],["6166228855037320394","8299181868002993752","12158071317010840931","6754964063485652500","4366982043948265496","17633788880828673217","11702200242978618393","10673610702400527902","14313351495167295074","2009749363844626453","4931002980634813204","8963365871723698852","14294132838428056487","4404670990567883893","9303816755779115162","9925492428573988005","5738003094322700454","267410672223967850"],["9329050624730944305","7533058281676274528","12396467903321172847","12827783842561338146","15558039057065630083","8405924660092865757","9050053384714030747","12420186310722277226","16712050380029891971","475741116572889808","13519439081610859645","11729973741646468189","4993823354880857603","2415241872155809039","9312022757850560078","4533956220511946571","9431252673319630121","10216332439232518563"],["6742590549187274493","11773635866637602553","8010613125342082603","7925184195917242539","671799287778941465","13621965649437995799","7003797501515195329","1536998339975115775","1738081625071336713","14936204335787454684","5702583238394286844","15124764635734443624","8327158306584047634","2845023713605453419","6367690648630764754","8568700232321250837","16610533256133619250","17508875459157973741"],["17079349288073615452","2784837774759798775","589003667052091394","8998327697163732729","2467928292462399149","7130671396969359085","3546876750106521972","2701410216851150279","17395503786569708755","14098181689624775351","11026062926279889694","9119332472788112376","10716917047478970336","13048274233220532076","9047620563301088371","5419250756734019646","6189750495558536816","5644977576939976517"],["7690721033661170927","18037226653207369671","6095481656367810495","10850459679437542217","617986712358521459","7293772199535683430","10315742737042967760","7033906559929016584","14214440808187504850","5514885330110238631","10278669523085957446","9217035453798584294","14239497572340136154","11018752159274487173","17522877118151141491","14407704252134162041","15581172085187818784","12789501884993066739"],["4094424318402475632","15981999503320798087","15813802042904312417","14471674154781464731","5559382340577131053","8794704966905427100","11392519639523097650","10880352938945107831","9036067530935481464","5080867426458581773","11385893443682250606","7150124413028930064","5640473919998106336","6696063387362887744","2925481104080656007","9963665342001876838","3470528066568999807","7594860831465643127"],["10390088503295837156","13851724547555942815","18113545620755962802","8380558659679400940","11730118649550098997","11323579525333033575","18022060453233243799","16680992977701306981","16876868320522385698","9240489887173101144","1496130424023596917","8183747468517936907","10771057991835333219","3354059466666527778","3811160527146109727","14588361760842456229","13036672421542795852","15452982118148957159"],["5663961665793090074","6957328539446627313","3145880706904177023","6918701987182274721","3023646005859568480","2432938147767860439","5297636763111904210","4566912354867019133","2001154149308882929","13530815536632062455","9168935339922029599","2019529222516631470","73103274565283807","15539806653185892430","168756661104894","2354846818603334665","128596638054137473","3514656321338733531"],["11723946650768372269","6312246118171671194","678853842183128046","7460440992544348960","2842498156840021670","4482055575859721394","4149588761105491368","16626131662580803694","2995073180712276262","11680140668349215774","7543713504027129675","14273022181180269309","12845546404593681971","9773659978293163","9259558768895598516","15700018202748833494","744370191875369271","6394398119639757385"],["15940162112036896160","161250362851747916","13102845646925204436","5402254104341204774","15095557483720078864","6683627502436151995","9743211703480681177","4599090760996069165","2379019979347321713","16330977089475944625","15387291965652164750","17804114490637042626","14306158363395320547","18125957816023179035","6306057405885633180","2660548559489099468","14849706828808009033","9502475771461087537"],["6977445337822147766","16986792749298443764","4146090632423343512","18297087604452540857","4596371801749121654","8543896926572950792","16370086184867437232","15212910684463416728","274419895877295214","7989873816746229397","2853991139858329994","2753565833798477856","7740896416269182590","11788283542162579968","5493326928137225141","4312305271854564613","13698425417163051066","2939227039468186518"],["17182868025779231028","3514344968369834233","5215200631427669891","8011285869109685387","1696033109068715318","3274192718996662127","18340960901243234812","14904982598178199418","9070092427316156770","7002425269652787466","2675008835883539443","13026014785135387643","4937985883061314230","16765965754087246489","9933735954828946423","9389373133842226204","15030740813252771441","4604856427855254151"],["6107488954584141909","16227072719095475628","11035956088810931314","6657198937843247258","3619962678834715840","5222910962125107400","10449193689468960580","11903913483079751585","13007082706888354201","4831923195571534884","1561790124954762331","14291875421789708575","15456893804307232562","14660984903237262846","9641633416605122929","3574054536203753607","5703963994340011277","16038960913212648221"],["15889891439287533210","15319679242620282929","2876557972349854956","4188991560453609959","12062223656259434069","13757792509494925975","9968294822303584134","2323852521743134193","18276380919331659129","16869713355699013928","8569081691821421987","2672198050002063985","10281401915098566058","555075567130819452","9590388554165643135","899937396043574883","8502166605887878448","2351422168744113395"],["16273303715291479429","12479089120304615930","6046787430293623100","16304275358560629770","10959040026811013270","12898595249850857118","4764591527627980909","6827684096518607186","114291909353627843","1014430238883521227","16786189549903323852","5986462340898745845","6093376677180694993","17151027466467884191","1469924238818348981","329159600231023868","16891226629846296978","16672922588034712410"],["17606484149164435720","12234374077621631287","2285320738597229942","16517566632149412787","7096453322469226757","17365671337667742202","16812970077076676898","11398758481396548901","18218115120084598617","819664271024490247","1656234872082370681","947155549404570980","13659893383157080261","13291708939711322656","11062611860986748797","10027949731601243198","6978452710977294229","9722160736969719359"],["3766939813200987186","16078122989665363840","1727172934130560195","10411682872555330262","4467924890130905659","3574137006548918030","10932393393740042735","7247490846922912014","13214241244438140397","12767947189487286382","626595956515047430","4611323040918888509","8002126734901001788","4283006373333332755","512430382893466618","3882842688396661766","17295430552370083413","3168308226063267529"],["2135701722298360821","15793864403478133786","4476162905307442207","18187632600456406905","16952129568646026229","8197135765128378351","3469586779860149290","2796914103039051255","11073991838811550150","6435926447367455780","12638596177380678612","10624175543346892495","15542776850929846005","15724454575665993527","5041303206275006321","8941862194312720027","16733466763595372992","15067561703850435157"],["2241883676335217087","14082944047480483486","16175902014152555548","5250839036892765791","13142267169489433646","14870218545252256603","16821398848009324821","13021232979168182224","14905317743251350614","12987780354760247020","4583889082784991322","2661936072537209085","11330908432148049049","785891329659396480","10071029765731864374","16634575622488635329","10802529380425289071","17562892533302182261"],["4170126005257322821","13970274153975168578","14973355462765385352","7650389582481170562","4864572987455586056","17026967892906788935","9864908686287026856","4819701443487245771","175258775248594571","17698173017587829621","11368494983479835237","15398418282293563652","4622147112484355061","12508582448394048726","6745189313673191498","17998717330748620139","6173172455558647402","508379808930605430"],["15742737545523321128","2685002638574343805","6565494308580658616","15066272427288439081","8909640352871174815","888774170284816334","17455488962974145698","8453384722888791362","16702513804194895537","10670601810630723841","18218925994824131199","16676752761729036162","17336587947705452564","8436696960260772200","9874639487034840418","18167135645519980682","16770941552582775973","1711231037443261856"],["9711982407659112074","9751072019773398292","3500130799819377030","16675047588376523715","9972842168915394034","443165942172674781","18005386810717074876","2464426159897600327","9039307949399299836","10112479364706141529","752187806766310769","11671140124620044945","4898179695107727503","16629966130972976438","3496050742540511672","13358312707514182928","17435523453014332708","15574100675151129185"],["3525207239555240315","12750106610836512064","12291501599598004935","13792559275305611221","15627328679303016595","6695144548560154863","12136209902976171666","10666024128395390118","4499606658089827276","796290156403094214","11003634524077976309","11333446965989328172","4009243386777279449","17181295423464053122","2758086378015515699","15518943427805476594","3894180871392055012","1655072170478766883"]],"s0_vals3":[["13616978485684299050","1296944590518287663","17513823076471980101","13147012771926125478","18172314752437333597","7324131295175917708","6114890055163924547","9765156035388900639","6418267968983093994","1138646456607818404","5826400630903288196","15075712751303795741","14224720537393155044","3028146776653294749","9348556594761299581","1239069411353089915","14886780232398030086","5983349257538303038","13578332614234750450","14312152969189203041","14483191800100281440","1838531056828734544","15111091544592344921","11135577645065114685","6078809972606412751","15052373240294967011","7192291105875417715","17724318319628018528","4144921215043885885","2310546101853115638","7787074834439702381","15234268170177604836","2778321738061152817","4800209711116620141","3364040387244057066","13933325069901987702","5574589815698656420","1091817153689182195","4508103700186431861"],["356794709539690608","16736221770448075527","3769942293786389672","1115232207202076097","1585331755660411148","6759247512787944267","11716749266877447091","1651379501010577805","9478295276222021186","4363176047267549714","18201274813961492933","2520837251067317999","6176124587417804898","4171371643101667467","11115697485465652357","12282131261002977654","6559212084003593708","5252746246853508707","2446552833075927503","5837116965925785207","7233878034221258677","6416030600300662076","5472238612358279274","17748171567196062195","12098352442150484025","14148177279568780708","15031248210011576336","8063552312068495918","3773043372157128075","7435298961541699715","920826022550996607","73559530442251633","4736267592743269581","13289054396659980581","10185172009535850857","9460535609394198008","2582543032487223032","11779184784224433505","16670425036669022508"],["2281912450220520300","5946301269089989095","9935980619648868966","7406208299139590954","500964250380939966","2138676021739752762","10361960267777981776","5592712063721580007","8744241355664116518","12677125324224563831","2924975979070325122","10257125666869614321","6976108682536742329","15613959750454659123","13336949705308383432","4148553525970510853","7471920005357239608","781853769535481480","9884506620724339610","6593226518736628429","15912613635462449137","8849388931545925635","11243770466866419103","12345077680314494204","5257569026804378219","3448645223871661360","9189568775382271158","16902937157475859306","10667657016089732844","1200448383702723419","13546599576549859575","9745726388828829352","11974189793368945383","170953993177761997","17722103803689942810","3634539615047178083","11317762031050008973","7471501364792054113","7067953215817534455"],["13762076934544665815","1712733661477794643","17475134885771113225","773222293902477454","14120584924051370336","10869629882436625358","13194313238523344992","14230504330967493250","10105979476237681202","17274296487400009644","8265968350973803389","3125845170054826860","4869761377273551133","16859740533031340398","1117900190024685945","1040453295322444959","10012214871512318540","8043520702290555114","4981075386327645388","3786522558347461521","9307100944389556199","13608579602443520781","7836684307365212165","8809245542123946108","18132276647587651901","16988640645273437572","14487395867099040675","6007089014997001558","148818235841058617","12824970463403255987","310656137259997407","13208760732078702335","15710089672910391192","18203927119253848412","8149027804279222598","3819024613925540550","9284863338931773186","2201696602554409181","9768976372507988413"],["4185118368851508356","15920285222889367033","5378417531541644306","9621990432198310125","8865882470336505852","16825799194890896845","8680358919814242233","9931555357739289442","7865940622706714534","1690469168875015254","9930328799433426009","3228685210817777209","6012648730749499485","12430262228032800303","6171210096992503466","12487188053597523585","9624565529782126333","6251347340953538659","12376131130637275809","6607915310550360985","17510718974599326923","2510063016030082436","7438609068717460144","18044670060126197184","2033667688597581177","8399087026814638376","13316603358591157611","3004043203874169634","6793503031913737765","13451005094648383306","8117663810460076998","16195455954823601370","12233549712871829304","15031322346239860363","8138448150511930258","13530078038597907390","2091594262197744891","10166650342425538947","17423026899315760847"],["14845050762476395492","8215709891196639334","8510454056633605038","7373781178151854489","6999594057737484658","16413924948614631823","17005805480189863692","14936266570814238931","13624767361690149077","8877847592633914944","312288137164187817","456185161885381193","13706709681199831266","9547330147101166618","11750096252666773453","5491060697962252237","15893426573622311288","2366705390177453032","5871670823225341379","10577871747876131813","16970313056811896557","1416603001489551860","5547021171710049084","750013090768911255","7254749200694378714","16694064628108553017","9783575795781306158","1941625269685379267","4040259756043435909","13150194802692239020","9855980689679889791","12304643392200403688","641679692642241311","6221931147237425142","1401479889414292927","14661685267611759404","16904305976393838424","16169363927168121489","6088384324979705302"],["556272198700608418","18353959168940270367","5772977497375437337","7345223131499495171","17813693756904819764","3581915443318890606","13485601657390550593","9452019303339277028","2543862468609652782","10555543935818420888","13493132279739868986","10796780931837758962","4079830098059586400","2705721816832065679","5997736481536591152","5135271225606769048","13407888000581128862","3169649679444335240","10322648466373741490","7804178969616971605","6830009137818399896","16000616256492698242","8056397028321418865","6738777551470776138","8380216263203095422","5247179528998954773","12012140207025722670","6597484530128020412","15763325354980855833","5836507552302509020","6699029438521499814","8779328814412285667","12023287858906453318","366429729823258969","13971383102297597900","7341821831309311935","5436135232615252006","12715920044022878749","1695715595558903348"],["5635557402894924751","1834133042664394770","5048081261403372035","14997572997485078119","10688785441007592843","10013203958087876274","17175715159064810539","5162502071817451250","18125307809830800134","669397408218316086","623293615502885135","13403987679067688032","574481505129015472","3170952852546208352","2008492024773208627","11034495627041289205","9086903777104884452","2202418463881130360","861916588958509789","631004655522800626","10158060292992955301","5122861920573072894","376739875978408241","7081442760209609164","14830964188177817862","2622769999594089370","969792868819109068","5924323220481739186","772856427290372941","9353088432628582433","6012799275029699611","13554565953636785198","3933192958196268912","11838778350280537170","15038970811675834161","13783811916497260613","14076471231719046974","7170831806180757733","110149262245572438"],["15567527930984128043","12315354131795043444","2373045598344886399","3171921211805936165","19674859491736745","5609321580298065920","14802895737252365060","15393669156520981687","10969298538412822283","451108912765554976","5920063840832857842","17056817596992806974","1632409368299575009","11212214060755709115","11727785000606190567","9897075060054187485","8658718467672563495","9259551933003816798","6094287945478502797","13703299706515976683","762826745450840295","4899813106513544493","15998768491345766198","8906500935220168896","11690409776762986236","13354462198304750411","10017153665564287895","14552294075993103826","17498706008470314674","6309251860819515682","11506198818670627881","7290999609064944310","18087386128412901192","15967789952617690269","8944061758495191930","8359226519113560746","11746973563684813702","1345257718677835724","10395655981158366471"],["3875425770285392610","317712487673912052","6294474851464026603","15245098626792533714","6721885657023795111","8997272812035085783","8605416450361951212","15887479075242249859","5266702448378958249","14328565113170019037","5707891632620684347","10436213605984575260","8766865559465871096","17331728609326735794","14463180549637058386","6600339017602092927","16181719190163312581","9230605542523500679","2394747096700937735","4771289193784624244","2706412170105159107","6126021281320103994","11961942176522734097","3463286536728010166","14403667262398312665","13579078566723234858","13925377593438777646","16284358181609915055","16488865676217244808","5489840740162392757","15661289071737781021","13582605866724929939","16522991698940785040","17079030702664608085","9690571838285666290","16572751193502684946","282671630595117608","2878722876062139517","2758477298675799774"],["8812323297120641455","10976352999668908677","1162157012615371905","2402704616225875236","1856586215021591260","14355436356897557537","518112857851092541","14580073263808641718","9677800957525368694","10026923583643519632","12829884414912678026","5208883664149439729","3202877738445327962","11121844546064783064","9773449626413102766","18087233023000079393","15267322575750799063","1506557027595415258","11271062685292462757","16195984285789815896","9708010541953541073","2968384370852968720","7020857561972591449","16073196569935009814","41009456432699403","8994064856745299437","4109476686592097278","15173572852693867321","7508682873810885568","11876582645710209466","15590885111911916805","17777020971419814649","17320505913482321405","3854286153318096671","6990816201890494247","2698485474074494975","8153250335558460245","13669104542675716320","13605127825184735636"],["3982884232340690757","13459774402564300209","13754559477132664182","8889206093257970071","13073334444913510224","11806446204352893761","8884826122173785892","14567516124741260172","12397328739140986584","7916622663992165529","1032321088765921122","14148983589858341093","12865480913937237850","17717236795560938210","14429122046681770326","2907081417336561391","460634401007089157","1611303738882013379","3505723230823966557","3914356397106388033","7801893151180645633","1262015730023562201","7394166266090448745","11779553027989885216","14651965428479709884","305266025872164704","15053124707049457437","4636520547087595989","12641233221966234765","16360786485637078112","12944171206861361601","4052847540851849654","13937657423568058962","11935706771104015730","5518927994350207347","5108574880039337125","17509928688712745599","7590807104600079768","9908574440842877298"],["3687963343579835902","4379385760130985162","12425546500987020706","15440263902916698968","10979678720245425539","3803374575798083007","13199639553446044704","18429858769491457855","15370022492215724452","15378993587999689485","6728406305115839430","88152300289165443","13831775268782951297","3433591795988119500","1969530205384494380","5169168341007738192","15337044064942594222","275628077929087006","14612768247703953131","13786602415706205160","1053809816217074775","2123339381728256163","2313578063063239482","14824919208927102020","5681005329040554577","7712965688150546837","14040707331520491800","15917861849962597618","11682864694786565657","13128699260171604986","4641869392162597080","1255457488526476356","11710717960231855276","3891516718355056612","12323574432808444016","14351433742141526482","1524303349000059817","13133554478036043047","18343698487276913391"],["6163960704073327431","13363081760699741744","5702322826020698181","17489190584970845815","13043494154980346248","6392302005163553603","9255071621857242725","8489828225523368451","15294501026716540640","7436735807155983183","7194143323883797327","5754349091012089311","11681297209217401475","3859132920560746862","5039716204037639413","4507437457604614687","7695860965375239404","1355793550136244618","795871853033601901","14550606027685861868","10772443782168149199","11617200842882145650","18106231567394964079","17527306420036880935","565250820942177307","16406923260944228223","17875090276383401939","14271253431274465204","3181710323925705323","1201353464555871043","7363311948070778654","13031444507059113946","10229381587723635479","6330919079030907808","14608544445014270121","13882511069349260041","18223586205963580380","12753927348374423339","9123758927197080198"],["7142146104879147344","9335319402736102468","10788268714268435426","2795650494661793666","15455218420832289178","7949460644623085569","7124560718123928582","1825856619420808227","14678516451179946109","8068140617913647105","16729046925145509159","7664425725063531355","5757113317945021517","4093358962531745231","13149388131967366106","7144036760089779055","12303126763846012196","17161956966723238366","8725884527185804874","491432326374617877","645516145662652876","5633413782929999907","6422643842202164547","3849374590942233800","14351309233787698865","11136622254437714114","10529486402041596276","16571237752864747190","10784848111426200306","9720611896790660911","15392507537241913703","7833846139322095080","8308479174778215225","13303598056478850068","13541561123643014944","15513016462106869180","16551833748815673981","16182590007216582104","6556234070306114821"],["3164032817564562854","4820866921466792925","4809217273276142056","837816310411753770","7847278027582265300","13434156305451686068","6080350823359889045","1462403641305477131","13591602879533716053","10983258728069073285","18380186073719100162","17495638641358689738","7699526601618707637","7754332292417310075","13027676050101503514","16350704849961037552","9153054470106701896","9254663052013562696","9276142561726882097","7832741688945955886","10116561754482468882","10096755003225256833","10714289584986825962","11941198520099402470","11278780406815782921","12010007088460869610","6393840644141340817","17488586000635140283","15774884791696925526","15939112938347883991","5056640879785310255","1215745148043060872","1405343941250237069","13192949664818623365","7231191271977788977","12855361546388138456","10106355856855243699","6178507159076822634","4304080838440944042"],["15864941889902118182","8537370611467897625","10495875836854300159","5184574732079169445","1727562518460702595","5752283036112653141","13502677395982855004","12394348943546660895","12504602503484466279","9005868455452403875","12952618447572551331","16802127770146737124","1489520405559968293","5312692374117220712","3105549194996533827","7113209144831143357","7140824439275232835","16501236550745994530","6807011734551427064","17132599822178752542","2024119624320797335","17077996144744743262","16921867527110834921","5259253100284418347","16877183531551067430","3897497840377941269","5884158297964484518","2143637967945777260","4899714417539932438","14833334776076200253","7215273409229350177","15990000595733716758","17675262846099988419","4450760015390644344","17344857521418871562","5439486006809910599","12171474553318605366","13891222258864396856","13526990241977583809"],["16455549376792481013","15568954897217961774","7852982932104624888","18156671728081018888","16895976530000948091","14966458528937773903","13610520666462908983","8878991825789935244","461265794977811014","7303148280703131079","16933800363655622959","8274293340285101629","1917771434289053000","117863370438260774","14957260327541568075","3334773302735619614","2009480769234038794","3895622995317694385","18268004589454304803","17281818599486821115","2584099513827391228","3568880305805700633","434461188507989329","3715220852143172917","13850264444136441291","9129066105476107542","10252403402342631962","1742173529128195438","13964834030732361843","6627428686071931303","5757752516405849821","5134270746518731846","10720138541314389305","9945039013535651369","13832229525088366166","409480653703808379","5677400606175904421","12694804925833433519","8356312069210665698"],["11818895149451529578","13694607140944824670","986520705695405935","4495298566607292982","1019638787655589387","3673159946340377389","1151692191963117881","8919638361281636470","6155433360093317786","6417153610551566576","12541871746236452834","4102043489530635385","15510773858210849348","8896213078360802158","14495090802354103411","15857641839037279136","3555013328627655483","12323532718219363351","4516592337635871641","13852309294505509235","1579507838129881768","11291962090271435738","5598442495001498400","3889163178934434500","14456620470181876358","14517832820532798943","15538314844213134571","15511629751875832246","3668736512649415911","16687221083931785304","5675577614007199042","10245783879888668094","8881864724740130394","5642793610270191077","724024919093942572","13520850994987081348","3739290662996733582","10952347309408368312","5415958531359174195"],["14438174562261479738","7176530282519607658","17501391849468993815","11830395669274275860","1654324994907149473","12752119000922682962","4687344786471735138","14228571987256431791","8446524844854862228","4452570789977427789","5321726875045311063","17459166439358952068","7215091799752811187","6770885365617652412","18002393860283966862","6489629491385006568","12161412597071680508","15344755686393521058","2015855474685717495","6243037258344268699","7270324816272310353","12570840885355620614","14247555456403800138","5268401692297997591","8200209878136628447","2482307246682767814","2771695370579562583","9352333386249695813","18445707727214510378","4027214724183226099","6220986883066332243","6708996991617690818","14782084207802670389","4614071452131041710","18358189630203862971","10548077844838031283","12808280471160455616","9766885385144750996","3033146053332047646"],["1424537798934864997","3755465348529236345","11009506982324417769","15728923734814933588","2364952105454972647","8777363357769714282","13532766915610364243","16914150846044076591","17941547226889941674","7754538182195348111","7694136345015534383","8083638733681785","3717743731192433630","7472520936357884349","3059480937828159880","16224334582103221130","9622047160307981555","9384282824443994258","11180418500323784482","14216748059171889453","10507299107228926910","9417634462765989268","12369994583744576378","15807237344771804130","6363339741630961833","6131187249100559797","18322747345956519141","8512535659378468435","6802474286670074697","18403325525131631201","11414169301579011144","2380279833889137304","9814537967727680281","5062420386222084882","7953489011026618241","6500825173734551737","1070344869718021641","13278776076085477183","8878281059213635015"],["1424771992826512167","15999700860185236613","12173854161864414084","3754603525919869600","8209726975623614983","5610831161314796913","9244627608149643764","15199591525052971068","4632698790034271685","2277098760627966545","16845812697504439700","8198217762685230989","6240763501548117804","6138991096815222329","11259223999189462448","16890891215591309055","11709980449997881032","1671233843448909398","16560331724925746110","4553049333164206557","17460572317458023777","6957874641330088025","15761218059145916720","5081300661514284223","6155078673855039524","16121761855168205071","10167751156537497206","10009840702179719382","1672200596904527915","964745836977885345","13904289054475105985","5252170150529992322","14729908926468452484","13616811549573603423","12774518812325420532","9856719985256563176","3437508142362012784","7494892007746792641","1520445764082519900"],["17476103092807468439","8445489223504203847","8317074152240064610","12889455399910436700","13408654625560679363","8556879262988697285","3114098067045127475","16991676848337912946","16517688584708992218","12987642717261651968","2624954361152116311","9308302453703404642","3116729040909708076","11137750927239065096","17134654046410652885","12236293827851713596","5217355186776592609","6540664077689699637","11112900700197222899","9597790123700365412","16832266382908282648","11205312697598005874","9682312306184147158","16368286296296098578","5671025042741438623","11695473932475531470","16228051893227831011","14153432380383075996","11103592466559904446","16800354934142834099","2177044439170888261","6600920642947514327","12828626495761441963","14362706304699098021","9614114489900551906","14490320174011812074","2123352875446480121","11586183749197781504","4798847628583244490"],["731890873186019622","7862735927762222457","583975499820249242","3505696580448254543","8138708372452257087","1526328795682115153","15179979282721026402","2426233047935577069","7960385914340133461","13049407282697198210","11983209275235155232","16042350962009949194","15237642074387965162","836305749452513591","12794230938911418125","10353979522153535819","12382182237047258255","13076268857367607323","9948180829812578717","5257148673619502483","671870598752046923","129612928768486165","3179846357540709118","6783823752622018823","11862622862173513575","6058405937747230881","1072342699861600715","10763555117987152520","6573049452708004341","15467858554663494975","12284652862706682307","491446404904987597","11742877339200478992","2445450729956570337","4789885145569391169","4374780856513432672","1355896279246105751","3203740490542244015","6988301049367587647"],["3346580759584845208","8453688542587824167","1937250250706452413","16015206759142499295","10982523095249815359","9479220308554009010","1106213299182330654","18195398446159029650","15515724215388591761","7237497972741338447","13087500001099531963","1635059260255605177","13949356606005840941","7505047014088485084","1461036113785669793","11109834910089631989","15473059587591624126","1777627950068396004","7065529268930378131","2540959552904596666","10299699564926452063","3472854457814702249","4616444987813190799","2375714728475136560","11942797672005663095","1897738238143288469","10541352206878825538","4565922404328728632","18250983180210657431","14877070858417311340","1325165224253855424","13691098222482568846","11937668519168135139","9130410520957087985","2878847453270784223","14990373010470093930","9512397857782469866","16872955450404330080","4716631617894025830"],["17897737900456983566","13057964214402740643","14959076749746616688","13542658870490594385","7572345384896504703","17342010422137604063","14317178693730754261","13556380083758629360","9720988211169780637","16313982470216407916","13848032875978078017","17813251620327326481","17380933674413482254","10784125656818725791","15032670901082136100","6031773042044964235","604289051125711427","10060574070855671236","11365512766350699049","1161074054773523994","7214439086051649750","3304881154679857357","6309263815364640898","9884346037161807573","13843832776186299689","14298894322341937723","13458525907348818453","7472894100728793908","825705169268348881","14660687604454286047","6205799374174015479","560442158308042904","1018752785788305570","9553332665572856071","875510274421204797","3827612307066616472","313810832689063964","2776673584540082474","18210732642857914790"],["4821051952351562175","4518053745644153332","2587080093609192420","10401627195012492644","10263489946794600430","17039828691271145880","9116311934478806176","11038554578819611098","6817575596705115700","12937779158937997295","15993411526998963092","3181931403931545517","2650130172385814653","12088873376685964556","4804203041323797905","16247539604675860807","16564873801096677675","14030531353761625074","205496358120359841","6069322599092899229","4875923284209517868","4422719652151322374","225437030573762803","14054932492832623166","19388711431176202","16860713433299771949","5356817435691578664","4000112003629929625","9096426455408780824","9794238613938054565","4605887647190806945","536069986495219063","6246377377197560106","10082028112701885573","10900844474866316927","12123717465613710677","14739430033556770240","12739798762646713912","15132892496583511942"],["11256843472100441223","16041440122229766294","10683202355874151211","13213510335572199898","10742108424680479116","11702655540585752205","12533463952282996093","15308009557343637395","15177361449654842947","4399965749724937981","5406852894484574884","5526976121337116003","17546511372766874993","18278529329221464757","10469167659983322273","4804859406109367790","13555041681105362037","3816798645109473227","2178439901547507693","3582604731873064064","4314692387505543993","12649809387418150463","6772650682665208695","14425089708477986217","12537092974793641025","12590521132326139246","16912828706426936090","5927972863914533110","11275725181705201995","16360014655085783163","384425101106120004","422913344571837630","7906971243887059152","9712611836268074043","17726317096859975035","5635196493399163618","43499893298117450","8464089931696190348","12577183357024146412"],["10763458236591431007","13522083273658222816","11763704752267632708","682558844682274480","17545718342479322493","5123374640234593798","16217176605471558938","6925113896300568112","3802593472152842354","10516269491202408659","571432362335512811","16756778564536197932","1984146161084118602","13372687213908938390","11939600505038604562","15294911876487054444","862400782192992161","1510417702987209496","9488553044775371388","17271219314629706797","13230171949455955059","13938067800111037122","2115165036473946361","13605512277801423982","14527514721513192873","9786078258035524403","12767693357322872664","4691234958528835616","7993770483339675498","3061950339039737372","5923324770769123587","14377119349644236082","1813574068219112469","16462816825696600956","13799043026570732401","10228151491560790645","11308779630965662746","16293369106864400994","7037130839634426366"],["5722276975411617470","6994414599562456590","14421016356788262773","2231179766052713075","9523243610391807244","1189329961450240643","3508720746654489817","10534890227281220354","9782922762135824602","13852159559361096883","4370391626586988069","2990570339970461071","3021920306081693864","17784536794429951087","2446339476378071149","18226459469048796566","9606205893106087125","4142260116795293115","1037071353132560746","12199356597070027304","15960128518907121448","7788864056780748830","8524416939415166862","17433697576381765094","10655282373583980246","12938426741061386388","12491078545395997861","13522152232363279594","14645874369105368704","14763399005154142837","17314775809870466731","16634343678608487292","6554087377639944044","9082303627148807052","13960430148408816446","7556877883356248868","4952864114049220827","16781081419546394906","9696968053293291689"],["5776811929608887688","10209052987190904437","5122349628857402653","2609003357447083610","14094162294500771893","2970242505666952202","12343871222438868302","15827500628649490457","17868855158802183754","16024335377498603971","5626505496915041122","4477793286333723881","11462393341969054912","9293391782389721716","7648203253220032534","9273362905390092435","12421414502565284434","7846727005714246947","5933628179470684455","13389006218691865552","10227436905046037526","17997602690915087337","17493845429228778580","8746023645179755805","1438109934840037745","3019557987739224674","10769196856349122875","11293411825206046729","16948608533759224639","10178759863506521336","11020612854201157202","10394971081080156133","4017382132721560313","16570686545251706116","6238311190553315297","14981893868280527561","2296200475636019832","17868563874423175173","8500164648162020866"],["8252420922066706131","17739226654482225601","9242821139402186408","12814137194398467523","8724556221877272384","405094080858781371","7674884121050368350","8483500070469490068","18325470147256716766","1581428774428964566","9524434368527517463","10676765911446243485","22255736935120122","8688480087683280418","3571995395672563589","9299024886054846351","1644305129023985151","14655209658911102508","8691834435217089374","292078067406037732","9579747376821869890","11051788309462243228","5961124984505437475","1101718158840195037","3420723351534313290","2688649989156016088","10273517477782159955","2647236574219718664","10720123000673194990","12999045992062658362","9435381043292042924","3011050818629350010","472350082328334544","17069129054378474344","10395016158622968871","859240427479184230","15022146053137430613","14845560647854213183","296081774704690008"],["7448591219404247163","13632370559226221324","356336546162791606","9278670804230325967","11897300574896579354","3362826417848468947","5919882913725388859","13042059266386171103","11640200906708559863","9621614980595887269","18094714094710033250","6606191414101688240","16621494540203293586","8590860232669903027","17658247423288660966","17306962872225718571","13386595133291675158","17106837172198297443","748299812683005175","13389068008842925275","15281961385104877336","1435673245769859968","13979260997973815319","5703617348462334652","11616856201755342088","12119335673546410682","4627155857382230484","12665569948307296995","15628289992120185577","7419198851812943976","13596335977900459283","4383019013998695237","3561339320960130826","323954845851618060","15225923384640084653","1215732607922222307","13412247085553252979","10297975852600953491","15355929730050283875"],["4257560268071042528","8177284128283627632","16616546205666914138","7937063727986382701","6369492530346989703","4360043853063833247","4510283709455135681","537224116055255825","6467096908461026239","11006917653229328758","14030865761157214331","11752325144013165001","11123628262737294983","2416018439577349790","5420207364397408692","10832356717201287072","6874564510115707411","14243191682819690940","38459166980794640","1262359973964312129","4952771518553336314","836396006291256574","6613263655683998093","9633007910849580157","6184694485747883858","1018510255195151338","12589463853069464875","10239219631610171476","3663958431500470371","13172865926055318088","7308330178360385244","8704782365449786024","7474329456972013676","5418159195319224412","7353815570695558531","12337040719624160759","4574757588286941671","17998179655771803206","1941996714533770050"],["3345187929898012721","4730841611787026802","16170789414295022484","15335341195612594477","11153703318166890660","11720192083791573039","16778828210102015444","15435493484295340174","8455149490752713855","2391566059838534170","15159681695540936721","2831345998215011226","5312897164735706206","1284050518937559624","257323584425184761","4012155110471962956","8646727477280513746","7276872802539048163","3080980589700433463","13935087115772267480","6864536255320355037","4601631342730216468","2111515728106697870","17067932259259428855","11491582757811729323","17841179131245580204","14814576863281921014","8120637077389732505","12820004300083950206","2162421450015670317","17620344753281146300","12207624669321595599","11773272643545703014","7055655558222903333","6767621306917276604","1003523136508771054","2974213472662293404","8172811239239127152","13811238012732440192"],["8128364959623114728","8195567985930485758","13891595113129028515","11535715213914985569","9921064602380746652","14898996826793573513","257472368022276161","4367694001070991649","4804383223659229628","1824979510613827432","13076596107836580783","11750316723935986887","562090287202002275","14657100022730268934","8284023963071089562","17175133910380349880","1719707545619889708","13330661122629552717","339384168193054866","1935617858332897561","12885523660204974745","850967593087481633","4795577367035957731","13716701846429091061","7958247544305717177","7140810805640892522","14025890770601257506","15696233233377859706","8768938667597860434","13010273937965237613","17917501316727173548","16582860691412601281","18178200670970984368","13940162859458402185","17517811677193003229","1620931544153599932","4400017274742937151","18319267686433536855","2708961838472472697"],["4012457661723891401","819221406283864333","7970863300026729719","1647116643319860882","13908992011566761088","14803637668305106585","1540434450060025269","5203602678619232820","1543696255096786564","2308699361056652379","10367681982634105765","2616358012293073155","5573117823959034568","7349783060682967762","3536469508802061104","2913311479869655979","1604519262493357493","11499577943265882603","2220665249551811851","3169186661125135008","3234650684434264555","4490210352377666088","6317583990197081443","5966507363636767528","14091665976700279081","10155537766521159470","4654341273240455132","15812885489181183093","11964722487058040568","16202421787535489928","12085583049085588901","15785621351362080318","6749544839413436807","15055819465730259877","7221381460911265078","15371232294517253386","10160988501520683019","17823566091511519767","3534789466870024923"],["13724664081558146558","2635831000155612245","680257498539470448","2343439946103073917","15531476355467038115","2443633272956514388","8305546315036328768","2282932481586287347","14969227276047971030","11900310859039229175","14646816440885518171","18420330485182102582","1376570432629860664","16453871898863118976","1295341336369293205","14742027523834261800","5532660234369372069","6306910656740137884","15271751891347167041","1950555907046936209","9328615646290547493","78922224304059491","6176658881217988028","9112277525494788933","2998870422495823962","8544399337083402443","16543089412981313603","18110747954524760227","3747509734259760485","17090534200464077053","5687171818531450239","8174121504922813124","14542853510368964784","13994005274364820225","9009062280905596198","5671955296472843169","7612287614002046568","8632437728373495046","17427029991751160421"],["8093804996943946815","18040278919015279788","7939816846934366464","14916999174932730520","11165978066470235330","578000768375919165","107297788772069860","16303339627701902163","6231547813430718863","12851819690456464500","13736993987364535662","9381328976553452662","18443036563834016014","623075517543059299","6818476190952433878","9711308796029799560","11470447966770808151","386228331986512082","17513183014090812685","14939271444629789931","3115805985808837498","8531347044706176510","14643361504996709135","7344791931557660453","15829103533369547802","15327202372185546573","15702699598656676959","14753300333072063277","15672259279404269499","14121320648391754301","6799082668013094015","6678512607847640046","11758001447351317614","5371262413029385063","11392952443474526939","1471794053085972847","17671028962742493861","16225567966567162194","3376319534341771404"],["868586800873876950","4907244427023661931","5200060013549439823","12481663682766720998","16858457937231948846","4536955369442402875","13967123990082009224","1994642583065476737","12264339897515160106","2231456113947802538","17084984653896716977","12179857950989032459","7068949286450514938","5673496942239173399","7472668088353416699","16633261552584952733","13445581111817590837","2547474306989903203","8362686336813186444","11400475532037342379","747662595963001260","7681009231088089976","12230675694902930112","10665445444115801166","8819814440344215180","17120720441217520688","12441351687942391126","10617906176519432140","17543138364609500307","7545866466943197472","318767043693753443","8994606166779882605","9940942177581083436","77886268812742509","3264955913802278036","14743109533497603323","13545936647669081132","16313321871759404903","6707478755748946685"],["2917301549531381161","12249087821572927590","10384359671971337391","14456965681964572936","10986606919833986910","8090308339773094735","18099352023657047146","7052706849907340209","4209419986283566720","11515057406829908976","13362781052979154473","12642517875274230555","3705480910587521798","15786777158442166824","7663990087854425795","12748393742695432122","8338816637671649656","14682078847044686122","10826815715143611960","13957590562952185214","13507774627069687578","13103883893067953124","1750240295838316932","15873250224480706002","10631727794943500979","14727167930851930781","13691393678416027237","3181403672177375903","6851987149094849783","1621363239022299654","2162717763093148616","11972555366620864671","355256029392420116","11894312469798344896","16464645078852959858","11606436260383094122","16445547882635915773","13735257932624872136","8946355246175080593"],["13884372365936661572","18237644406542994524","7808825016676732290","1638752499954513846","13266347333046600096","937876034684920908","12855061587084281563","17015825190625545026","8316720237999193245","8115923704261180493","10147889648164665327","9492573848260649986","13911008089525007671","3952001484790064939","18014812548164396299","6255287846423800140","17022749991116842857","5538417679628045413","3285368140642444396","18351181184581374840","1711085758629391023","503092131575296691","6716995577834374044","16648516816246503952","5245912899752193589","14777728848767977199","5277108179848590084","9598734254990100329","10425989359723250705","6724785760220159813","5818909378661345241","6904082808152994592","15409425806007113717","9125354385577574208","13524391389230526101","2552347294294650396","7606772970179854205","10308671481112562408","13375077112110503274"],["2835439646056025871","16807809500097221384","7144706381981038445","17745675532845094490","17419682600356443225","8398055254559066715","18166898775641350957","18293544862500319625","15522950041455716747","8475600377275103720","12036261490065978284","16693437138248847690","14260491380904631969","10443716355001984325","4714226716807817621","6657669498189828738","3494266037698883449","3459135682521970872","15233411875917150329","12592699350024728761","16907283772455691222","14735524327083878510","17811828043734667975","7030491640436507603","5463095974040408298","11269924671385492368","16785984730549471252","14758366046507597589","10667454215033982276","13523706685251224809","18176703395117276722","17593604688216974815","12272506930723064223","2202630359464769884","13622790338519336590","6650834449467013336","13967961614995138623","7861634913991052643","17595879760895927938"]],"s0_vals4":[["13666734112490777779","13698028196338128848","13455439904994338713","6079865218579744037","17628951924653284977","15692235232452514221","14025632502819986625","10097196435793906963","18018597594626275903","10436274534786339559","7769877961984398409","2456846503218910453","8836924645910095219","10603832754461688934","12205687986135808689","550552132813847405","12523389377568569161","11685103383305469756","1362283922199477495","8186178750105234400","2250689264456785272"],["7956228648298807763","15592186376793514615","8481558148676061242","18263752962097485931","6427528563938876721","17579680776922155631","9307968828335622431","2715973457337035334","6234759870777236092","7205917785779060149","3673122236561663468","7736274773876843125","12142820340472414482","8140645004852425772","14028456159978475626","1298698476558584615","1692247283645793559","13393242807238202861","4473014061800246841","7930818519728190984","6914797395085194211"],["11236562480025046289","11080040459047270355","11587894975057757765","15559165587061188816","6040785146105230184","3591024214728483470","2382189891069043907","9420273833743363171","9197768281941637120","10626608009751460985","237109013017249098","13387885762688639749","9639276861239716487","15961471074822103694","9605395024281539977","6096169691766787570","17643854056817684852","2973431184083561643","17787101752240562633","3467456329803786891","7970234347374053407"],["7085434477671027779","6139221246648911436","15783832561758214008","12048218194410226346","15360376795050986647","16520648111592587751","6443458919791148944","6782385735111385887","11108037216817039348","10740738854377222755","7700671879014904860","3233055769310696207","8842471037077328990","6069937704693190481","6966678853232386194","170176807770361347","901430955702175211","8887381101190111799","12461870337675372233","5624794271209448785","18407701589291837326"],["10569220495363181952","6750824771275003016","12272533610096766584","9233122508150008720","10681142810555344921","10229813380264583372","18112911230407026034","876735115566699940","4719114975908942007","12085734914358010094","10009749286840900639","5746442912593905236","8294770371764920498","1226117991412463588","17905475208742416700","1262468542205867725","10702415516023986208","13376055317456897356","6284893822296645368","14640241012296581411","611310210825127239"],["5313239155994318285","5260221260233171819","9181204006407328279","15554942341766359168","10844048051802792463","14443360561465560207","7083164207204239518","16695790870153407814","15120949897703407698","13429112727078314387","7760308222202815921","12947277508588430306","13920521576501018174","8245232259356090589","14637316530228382237","2905989683739984128","16965709117712919574","18376864055802203824","2307417789070501056","6743825584338589027","9251985420478820577"],["13548839884401841010","14041071858760501501","12788917437347137871","3727013846624845539","16973653656880839274","5935363739756277715","9586870541438423682","17476154347905149734","16347626005978531842","13893108913351870675","6040500855947459145","17859576497383643122","10763222713696939618","18170799901346565738","10513975448113863720","12023522584886267181","2245333170824485332","2665596147348197945","12644651562328660760","1792832204672899150","4477902590560907471"],["10971086962846399768","16679627108577185567","18435028826124206481","18269882180433580331","267080748979787364","866060810578866667","4490805980328636069","12122758596959072973","12531998225173353878","8580519002044126311","5172873224159294266","10399059881928109932","15332833372935064475","5500829357622206357","10635333696170516746","16925891006554832925","5931870883158333712","17116321863908107321","10569290700323191914","18167674252795673971","2904031036152884702"],["2964472663550261018","13041336504638114924","16082809994389905420","16680646982874161404","4402266643931461069","17450594622921832317","11175901970075486579","4695747273620546619","11228703058579666562","5290896255446442053","8335255159660648201","5893104369415613101","906766488331706823","15041080347568208505","1899961136264091257","9038884620957995434","10874903413924711386","11417669530654565655","3753240291230409349","12255460822592606928","13750404101873090399"],["15918260616845191391","14014250625512412732","8823567488770380462","10151244285483217987","15985105435614454098","950120259067398261","11682776208665312572","12887367075176379821","6987561925608228279","3968937268903037971","2468637408110181806","9150769807710384080","7513469005005142252","13987140863579862621","1286402354970570812","9336864287907837333","10828637462860286664","14377626826498378989","4574742733407604848","10134690389667275507","4006154385636616655"],["6408556137960793792","11263851844062151213","9026516790214767876","1449545277104809963","2035533832687694878","16504595190851040146","5451580577099838720","326697659266824951","6924825040799221063","16722647036285040847","8634455737840558745","15298572148002503171","10353843543663784889","948657404166763173","9169431488527240641","16946740230925626744","10315174765744880623","13945735049258985804","10571124904627432483","10946005328664273936","4399468888298253926"],["1095265170488401013","10193410417177039397","9794413968463395302","9886840460271597214","2240318812653716298","517304576983172511","10464278178995700951","1101415068681312042","7268874636151662131","10761063997564437237","3210426807004373533","13694055139682020348","326215273999389890","17692572969170720288","8490355209965650442","7121702421461533846","4826728405793279359","17176854654927366419","16116183996350254788","6015936885826075234","11781663236383207817"],["12527085041430422617","11821748921314138755","3204728970974716842","1811154789536319809","16443899093960054138","10961123808050616600","1325030552410652603","2879338590615801055","9266755009705095331","3451358781883126389","15005251546195546860","3536171646088814274","12325445846581143704","732677416661880027","15551017860994922339","6318403779916414742","9093116278352880452","300933936710673764","7059531291268671271","2503747937315458811","15274792248499552281"],["9624437864175796549","12524797537258920627","10547470108811536853","6838871897299722260","8307088565787621941","14750677138434215950","10087754049308900987","13019985216410809376","12590246974342729693","12667736274323947996","7253381452062166446","3883302389841477714","6311658336644919691","1945711031962038336","3352713637323522027","6380484076340484975","12766284432826486924","7879730457837746633","14769981754388440677","10264519205294794420","18416124871576778648"],["8626167510565946902","1045666229340752868","5243923279790802580","12234126270398821753","18020682002967349258","15028472564521654912","8098862378870308766","1198358092295262725","10309322381895420946","18060395896202182847","16213652485702335594","10502754779040229909","5238308499154135039","4292802340088624222","7336396145801645625","11002141604327361491","9125187587454242136","4799317207517660736","7480519510086383952","1699039190177997907","8684282946768883303"],["10451984197674332524","2410587162613501848","1332026628862365573","17256979293767740080","5568616994315016315","958998126079546092","2223421426071854280","9191311043445845131","2983800951609630323","4757203848910977906","13686913426635862343","15708044579897028380","11347052968215616079","17062053671784071676","7494388786204621982","9595662491548856438","11062210777347261743","4275087671585217949","11650072019140593225","5491461747281842951","14122455060285260722"],["2802104409722770225","13600779650215584012","4350224257398646913","5469138523862360651","17162492726144108984","7797460942252842418","5982180331856853401","4287035979783386899","10130774385388703859","14820807557320197059","3946239355332774858","2064637238524879838","15706544417478251699","10276697463915052178","4897821952014789075","7579595690547465183","14276336300269440706","2222085697078134711","13059592653694628053","7201675320147249786","12265975526551663142"],["9033526892453492315","12572964548152622644","14979345742477464790","13375971101455270848","13523690317996997712","4112029203214946696","15779854222548597701","11073595271004146685","13451675204476951795","16031753299042073975","11607900243157859931","15483168080298575371","11471243092178355950","8398992684931915692","3543770828839060398","9087538441434967596","4445085821958837889","7377913778539647850","15363731073057962321","11633301468628439474","4864929582094869602"],["6843528679927094601","12754539761090182013","17029589730894227980","4427347165258844168","9003311211475969405","30339251235335470","17790065474865148317","15184731532758218873","6616774144174550888","359582080399759646","14415396121735231994","10664289845265563452","2677606535892495798","12458646533468904210","16270902831694307568","9435163361955144024","6679663295590599874","2220737017974163353","4549600454005218442","17043699106893893032","14414519559226556342"],["14905399300153911783","9437799173909118527","4248857920903818098","15840276372480533070","16333987352346259528","1230791843665820497","12008997416803236615","287163766261297458","4076293927633061579","17884178514343168491","12723856366711452890","5102986087011224381","11663678153488601907","9947283355298398619","12377307342261975919","722539299665860577","4161750477040319408","7156012268113123170","6063277613181395923","4696165601113900528","8220853598221190478"],["13645061355545144694","4958753090693318294","4971117778453799413","11422023942699714669","7252045923019889974","18087742039784154375","5033224659992301973","7624509999637298405","14417160737305195803","1063978056860906477","11875065034085066894","15420995392441236402","9850521849034534106","10875668635501062675","17729745585694397542","6247348519135514075","8324734964810500235","7425143868118190003","1574323277273334540","11351725087169135973","12217540178251577889"],["12173948483965556128","2668528786885731241","12015418294495656521","11902565761412771551","17094552323307403837","12009817378415974372","4483516467681554895","6097841754610147983","12009646315599536079","4381370079753696562","3327628877203453646","15894825809180529587","16056302998349018508","15747330896820090362","8205941119560612076","15658652518017797035","10775491018549740683","15446097011003891887","12429467458431587800","3383774588865297788","5952580230010802139"],["11721175089021897300","111278281411850676","14957558155765965672","8029058860495294149","17591168337353026101","12699221013799833793","3009127513191522457","13794212048402735347","11336111297209463956","16805460895959668302","2808604655780615387","8086543858964701146","5146741569917810792","17341542188221177175","8248188488263189377","7044973742446552416","11921480365077005125","6013905514478407643","4444541417472192622","16990507469352118167","3795116358436361263"],["13841477092711695215","14572803992058043951","11853913259670409670","6680743602418230463","13185679332148001855","14867650312937964530","6824001044387569501","13337619443868150811","18272927941748931622","7699706469705969504","1107746055275953369","401180205651570576","13822068916678867045","230229137516168501","752758949643749317","12793381044963899403","11850448126798969899","16220882738690707580","10614421795367633343","12191663635910605134","7979760409057335613"],["1422257217103845890","4656795901210569343","6711521316832521593","9954886241330877845","9432067191659349388","11041611479254963226","13552495481206597678","7211419324809120008","16713496268370597978","12298021329357705459","3530678965469990998","7025243637496727070","7355648318414165593","12619336421893670147","15344318804404368049","2724713196974702918","2380642266711377361","13401510584668706449","6118766014622952108","6903100817526223044","12642553318434250442"],["3341075599962133816","10847398778930027458","17530834092385378949","7786219334137716899","6384612620179125409","13242835379635989658","18065026277801716699","670251675834083839","7769197403799665840","11349822607266467603","14583756104893357620","2969355733415772006","17021319297748104018","13847761842966405279","15193238952718180375","7695700904341082387","101650016530430640","3530897948556872536","16919428596566272106","8529859298394469121","9965846108604770612"],["18024211984519597423","15746504253291765396","1979597988277961024","16866483940491743031","16413615487046935596","4739010362703239027","2122792498006293797","17900368420622212890","3530913410044623321","10066371996146933428","12180668627096187201","8043957222036738593","1677727812721613764","3931778401380590622","9022708431688277251","17255178939053239343","15475469105597929437","3247167292232741991","6442388869026379589","13661885690636999200","13152698116870694588"],["5049441920489300094","17347997881352562094","318377488690108170","4126450298286132328","11992351613568126107","11911960641380418755","4835505599550488729","4605916498007218712","8490295918524812756","4474117888016954035","6025458588027121658","17279187916956521395","10514822891533957006","8783853019413042895","10218064453148009829","18046662859828224815","14738591615119014090","16956148088037385017","11893222375895324752","1514673534367297351","6599753549876411169"],["615919079625719088","6276616447528730279","15009839098326110452","1906375189698633136","6812253831318433530","13100365612924313091","18152348379296891251","1894166534985567684","17650503290707617292","14314738230230833175","2498387096529701017","16011491728515273396","5793384137258597957","16073260762672718914","257272703204545466","12454398434246076664","14359265412057027732","14340530847979073329","17270574806726428096","14420943209439962374","13590487392336461241"],["16220231506649472578","2502636178988437904","4148267021281502219","8059831376859524702","5999060673165390143","6916519942176917690","13987207914410068633","332370370865459239","2428639397651671866","2898340706346218962","17778779563186030184","16479671696105676607","16346676177201475301","5241850737774695357","13909929087471865955","15346867572722874763","3980481682006050394","1294555019364467176","2438291746167398389","17668407184548346600","14658148633941386084"],["7207658626599266906","7414763333959147078","16617243435617218494","3396186271356461857","17931424469312471938","13769587644840130054","15835763594105469475","157141950857665890","17837559520045461575","13059385651539662946","3277713815728210168","1238400182362828020","10000148037154715450","6109264504708219961","17114650375497582675","16722848940427723361","3748598876656423051","17067838088274569495","15168788412193170379","17023578767479020506","17185672216073411194"],["10782281620768458016","15436905745349152728","15561054124974143083","4646539780619434086","2224430131365770528","3291796637743446148","7488496069220794644","12102713516958192095","1554907267532839378","5819069234219784485","11863560328034908610","18053224335444480025","4352313961450202359","13375830891628092675","9777361088417122959","10618198627498235873","15471917377185185023","1741769085539592534","10943685418154715870","9395854963658435575","16050817222389024434"],["17817753540704955914","6259663529125962825","2915179192095872604","2650188799997581475","1219292549053374347","15235792175390419543","10358849879101180995","4139706072197406491","11637834142386972033","15138546728058228505","7672971142067828736","10918306055501856736","11216431259053963652","16505283552897157997","9185454973020997175","6958586704060501394","2871923363383498720","6791347231764652526","1888240552773602729","11030837038492273830","18372571258865019678"],["12214554924084462827","2145613196949152920","9981518166709905160","17411307645849992252","4003950072706728180","14348846433643969197","3965609529837514341","13522262716857693925","250602296896962029","3191275560029385090","5681070447459374090","4806525209315654688","14269346800480295328","17887591497009943787","11552051579437064128","9674361378006576678","703970209256991538","9926859056954353582","7341104847239324609","8479319681689723937","5496247687955452417"],["7144039975315721477","214863444357021741","8588377100073606275","16906616782643242779","13829273315949801009","11258397558585718877","15635419876773082713","18099346546362015895","7721570398594523842","158030063275509049","14928891689022659906","7804458067207649879","2219580508273672459","7854167214999360534","14688364636968626196","13477693198665271933","14976228010448981612","16749771046738257651","8743203666967544688","4037418478611052779","10968199959694090208"],["9944511073187955361","16743497172813625469","5003255847495215773","9031579790794208197","6205226223929812024","11270127211035828699","117035535572456605","7831450404745028049","4527113439086162132","11259554873369918378","5780031817060332429","7073871313252943078","4800212349319021863","12302633171236408612","17805148679933581806","12928237218795559876","11108377215346120516","15092718255823575404","4417999151604192180","3058624217908165354","6709125422496943177"],["3171942099383517607","7725477044150704060","13537709580293959785","15741204854543569931","10535811684760547148","12629850378360051605","14490829815193183920","18139566382704352158","9923903456315951530","4368003690309108211","6048602950808721239","12789308257736082956","8412880996766321578","18250774084359300661","15038240123475513935","17634003166023227697","3191807330678341855","12298620604303596118","3797288422500463291","3903663122255026484","4084051381051020639"],["6765882047102365099","10297847431865879046","12723793240992992609","11547941165711034148","339804671327246365","8068094926112473137","3627826435180906159","12551534539900251479","8592695506348482219","11016952170459940891","11841140627286525436","5548863474896310154","3829516082708120848","6955875245176674779","11920443462349732366","3178806104676215159","8347585092505183802","10762796794889159670","4286218575050614643","10534729893571724431","16343414736609073267"],["14226215243607138029","16576803677684440098","563407617052654989","3473160604068431950","2700353181185949394","11623806446368616397","15579796647916307148","13858713149504163400","17489202025516049072","7467004113587682599","4383459329526049977","15505853591266787712","4836995121954218121","14383724096705258806","2989334476711746378","4831090116449455739","12433614370609573769","18103494085095445563","11115796920504635344","5226832417906656732","14514261818078552804"],["7598674648333440390","3652737831099419702","1247939090953374308","3182716722004025830","7174139381027359794","23436456280318981","14798764081682976707","12198667572971152384","5161218849552485910","5084812749200980067","2316974571749528051","2478286148267072990","15351150303682456962","5781170436331243712","9450417665989893977","12567922527978941251","15834725272068544112","13418797936813521773","15302479199103250506","10748981865556835298","13832482781450888893"],["13332116939575238035","16502662008469216766","2047447915578792600","2703143848792592630","11296611889349153698","12773423338492658707","3540310996455426572","18253852554740402585","17219881098411166036","11546879843927261531","12648983432049648155","4534524452945902545","7092951126800481258","16638773307548834717","2773097289396540346","2456164512172249939","9044499144614484738","13946557632484038414","3083714952953055331","17246782799232501236","589606022614205557"],["17684807812019300743","5900942685885410316","5107275279629486131","16141817095256881248","5695601319016710748","1831085768805039399","5566141360778727749","6378342481809731470","10100345721843135574","7802739248590051842","5181187512449903298","6282561659445305651","16632962845111123795","15382183575519119718","15682883987297933880","3667768668006371129","2606240564370334835","17226151423733077220","11235696162924957545","18131561976985577147","5148250886439691697"],["7708171432117731706","12160201820981509983","13289281534456907601","8751514659446314893","2246732440915350110","7184319836137974597","989690549318730393","7617746173888667112","17597654299047336911","12847536091408736702","13626576568596411140","5133203195962902206","16442708926136446629","12866758657815982085","13022493800848570835","3757391119946519888","10706583959422431087","13371594375805197863","12419148324417185470","3642491307039730847","8836491209485827114"]],"s0_valsC":[["3920997218149659020","6195203975534190531","14487962586427886955","9931983996913575778","3222662633385391166","13386061265208041215","14809144074687790043","18242317882934020052","1785719050869393575","4749240267992978370","14067427620195067756","3568623842358324147","3576741682900127533","7155980820145144735","9340416602664352622","6598850372819967187","13691694209620296413","8683274825383492268","9360790717257921087","11039335864035374986","2976975121369529429","15874296562930249063","791940065959650459","2280279687569472712","1654707497609458820","15115251371812324403","9274337702397506478","5467458631576493289","17784675212075732407","7239295451166407818","17084864724357681695","15256173930167639557","10544312701105097423","9274818196629892342","6256328629149865826","14981263571314648443","14671371355770922490","1472249647415917801","12721442140574750806","0","4411712442189497913","17144004175250929995","11539019385913435043","4164890867028465207","13082115546963477394","7694738503602996844","1623998293233861547","4204482563659912901","2356699037017867180","15378879588404547963","10929771508587539430","9991771027545316781"],["14953979237043972013","13606740174303612581","12116696138689416724","4139599931133069263","7194148385707643307","13137976062084034440","6919106949794222912","15667483923454792295","14699570495724849375","4361847614230776877","12192398729608952396","9410833941556777237","9450210421837242376","1378416506447717926","12103050752741903469","16005954923247007449","6555175925336169513","5737868088109550653","2848690758510734490","4813062107311459015","13702070233126146297","5897705672702941139","436263206297583927","17384348094275894104","8603251088057631033","13305299834803557578","16253058929446627309","2381454305174752803","6767733610058057468","5777433366841484728","319771761788631984","5461730953982062306","1150151428546875068","6424351150300473159","4120832431187404513","1519960634056566169","2040883895464627397","11559622983950434410","7421714025947513940","0","11626940151985755819","8133880614395180548","16340787498796369114","4424899691547463857","7437849530016503289","3177501796635883305","1494477021359971116","7862384465457274441","11562642561220774691","1051385619120830869","8292691952694814941","16382153728713460718"],["1973427441762091564","1280290911013017186","15302416223712684853","6199663636475117910","412555316345837772","10946193125295473756","1421764058011646457","15553552779044209426","4397958155912684295","5681058793325796429","864250717651632052","10174231877438534588","21995239072568032","16511230637349492858","10184292147979829176","11057961108296961613","12511642780065523472","4035107317011705019","6776246568799809279","16942392407475695957","12351088503073136445","1612764516214721184","10061701820618308633","7696850376958985906","16258764715141187799","3898673907944021405","8909144964985112333","8458848386344504188","17386848366561840103","15942681538680181280","7079980704538709852","11913638800552123675","13686434086633594483","12344112952878500685","6799071581152394332","3818372249446411503","9292358359682536119","7637054019069995845","18212344417919661057","0","8749768147602444672","16061302466716248868","14885978037357645775","10115768599056572108","11452089914664380756","1018679989276988128","4164952032524491617","10073218595563274116","10456140873629209426","13765430225740493296","7454899433811765912","11202017677961742604"],["7537544828110831442","2346497186929861599","5468892816430159253","1789908036580984060","8947519973010716902","2272734066867695247","4738327600587731453","15972938946259293369","5597044025495920334","2041783858858246592","10769523367808669487","2634496870221663607","14721160437563699277","8392786180041706096","481441352426720736","17032790767174814106","10953323311570692723","13408597705877548004","2548423337538366249","15608749853151479326","11685022950587166854","15598722185092438155","14574201510535105632","7363016954038935293","11191676828397312286","9148906071789175687","1523764602562535566","11631597536833405410","13821028332846129026","14470109565327192965","10653737213898641492","6376617361055841099","7503399536614095793","4404071489611725370","13501200772228712291","522467665390502342","17610470924879768485","7689392106995106087","5240828091834337876","0","16982138751667130271","6825817021568646527","10459760961777338379","9601448786037311769","14538478320913776394","3396218714043728617","15251164197738410192","9975644418771106743","11707542168766778122","5287490815935704813","16413918625390831306","17524348629157492910"],["4217306054000761596","14354446828548144319","13297503034035320625","16142382127212771766","13361414947062110151","18287341503286647845","15099786265893657533","13085928376574117160","18305812744401301423","4092882956448006466","15379563197979049567","17019896774806062566","16226740434793383511","5812191196142814776","9706988019169714203","10377184299070951626","4915825427291882695","6866074956330580719","3248116710774953210","8325212367927017110","1927646304930436469","10389693366524409391","16037299261394647069","10255831369883399024","17334100606659759627","434362534378214521","4351066502577993237","6680563299603806204","14555619914127831615","15254001636327343447","3970568103916357031","15287287113235265143","664153955015277487","9642987854318928551","3891655591725488669","1444855877732679452","12240761093291922660","4364947238951409254","8401204127104417040","0","10349933708210831316","11385968028761059672","10235523362529773106","17525477241647686008","12374829343564496413","1131893550314764254","14512557498716573818","5924509131930423540","11779960595501337066","8924737396119173051","1275627114163060587","6955799413631573265"],["14760700476868119850","10695529764365294244","16214536362779582785","14872773970600870006","13621960181691026081","7974936977604290007","11656609680655857362","18397098298277721855","7403158767694412743","8498156899197249173","8795180142966493365","13263592586458979757","2134163701706243192","17688625626533304792","9037151311611522449","15928202652402366326","5431801188468707188","8116107529223991844","6445503525916164756","349783662933281861","18155075095088986694","1070139793945196225","8452019782641826204","5497537269669209254","11306071616581680598","16134778873017556129","18013002002657868407","7532248402522649431","18002356756869550333","13729684839128335672","8632185303153749634","2898848431510896685","10095441029149604669","8969746701832179782","693590304562625038","14018651463952479736","5616364185667371792","17509985803026321943","3938380043636148808","0","16451882621327267772","10773887646390852927","9860128812457387589","14751578750918243592","11639621615523088187","2942053499560936483","13324171024405814848","5064929110414187599","4704880402360390788","7857236626890946626","15251821059174151665","3790132455109581226"],["12273200556879617753","1315195605642512474","14224453062882502369","13089168575607245338","10619317517050223542","3893055711614607652","9445379601494540298","10526871756162478740","12847206254438964518","12431430811486566119","188522214147677766","11857882197751419016","13960695921000066411","12745370766757895807","4479616751926489309","6896873572343792272","11721276171806940107","11432524961687064033","15885358371934885883","9911380981259819013","16024808999547523157","8380543575655099490","13159811587972468207","15882113401406241612","6100711613820458112","3081226582126554311","3743620552676381795","1980784549669011786","13183616669236085109","15992355570519393904","7996942766880195367","6922560838290654259","1297957389117661875","14500303171004100189","18168443072028664681","6671218544957980073","5000442581910930114","17148391283081963504","8157810733207351063","0","4893775386399103532","236845460938344209","13878271776963776936","7350924870522082078","2273009307837143838","7612883066213080986","15611082885591371799","2580366024444651874","4008031153387972997","17876392602146131912","4112287902350167894","6624215805330010146"],["17473222995682223025","5934197012596203391","10034939884148564160","13314377289376791392","16610987797526591100","12483933374357788365","6606312827651200086","451759021629733958","9544530773296116755","17930883865702926138","9001283946872910698","4929685162237185742","2924478507877391557","12104349513305390157","7538518138581109465","2667780162680726770","4381157728020317317","17296231586328397308","7043675124998125719","3910814215706992664","464742652343075595","8936310571171244930","13272285057062007947","16069638200834633191","8961748216932193508","11099307306943122552","14933819750228557674","6084928289110177613","9140577872105721006","14976922908331221063","7106342490855083274","9802715348394998002","710836678547142701","14730352834636931941","11178631436119240537","1277717573862068705","9812458058243911939","4385305410659927145","7968351253757690814","0","5116283471054446903","18027451816966433870","1092341259271939210","4766778224291929383","17327437021520404277","15523005316866672549","8274111803144545831","8450332501998107370","6017263543723669679","760426431766699119","4036054458201229718","12151269812543464625"],["5668332715633074436","11495607891682630014","17070130474834509291","5474013650037217599","16607967931506988614","10327124712642693044","8313676248909573203","14257555254885252726","14698787199451280622","14137738976523240011","2203598899548088238","14837771249890615623","16876750145213361692","877168168523585617","5501029242411630496","8320083956355014435","7454622338058890383","259735327391048066","17311316056966300796","15899152826859140604","14030423819572934809","13480606610780083567","11671283304860267611","2731909785796215524","11087449836110557860","9618036954716755770","14384099428395095819","14350222034354828139","2450756449569304838","8710590764154726038","11650067529689635294","4070828653613052675","14243239180214990500","360552510857411965","13791984328533754954","3649859458568846148","6629147853235746399","11214560664423455425","1260923194144704016","0","17079410514104935113","3543462450292907066","1992826600811190664","10491689728561091255","7850911323644213136","2657446824023874719","8416826398491848566","10499171467104436657","7152622307275075315","8571325743315923960","15250587489027096587","7739431665595168418"],["2005797905347342840","7003648831794316700","9481559254319797519","3032200512340625823","7839167147609609887","13704942490520850368","15921601851628387321","6478804318519053312","13503730767907904332","17397585594808479794","72577977287450406","4796424285472336811","9092669613623986332","1607532559590299612","173083052920147303","2420431388643669658","4035390467741158150","14854855171288190113","3744109379451175839","10060449862920873816","9357413918338823544","8588087878820108702","13523846621545928915","5435346250292697507","2671424998892846062","4414312502143781911","784480946568849593","10299746630952982259","15526956889486681663","13195138080419492671","13781553445749632808","12786907852370958343","8533123209216472694","4543584265604165920","3595287425719693326","271254114931977787","2796058168210664441","9905874185886984944","9284764187416062514","0","2487837309341909946","6939659204674651695","17756103814148478762","4999522188669311004","18368542885707511030","12427186352441362029","17590539671250480522","17708731893985988474","13669744648071476799","642281060869037718","1238170593504655026","11243500833677847905"],["567413745830916674","16571404901902697257","13655103739008042914","16167462231723150263","16338820663399192271","1955010426347550305","10316766859954411139","11598326024662871689","10459973916420859431","14256774328004320703","2986614951474387017","8388603379789780168","17427113651335463105","14168663359117371549","5342748494257802702","13764011034475709707","10933895755595935805","14531942667810007251","12969553456086364044","10063912929642012092","1746932259540195482","1549214244670472716","6948325924122857995","901790771374527197","12329763693277289252","14475872877075747251","10167420909216447257","1550680879302245508","10367563267233328116","4302664000916362031","10481673835194331291","13772321484822059094","16504853074013159891","11494252080068072712","3896900669109763623","5170665286745265232","5733035370844083187","7326985896259033517","10258322414137340737","0","7728108266007920726","2353985767758522558","4918601559980371251","1644452356091000852","10962396417527649592","14294363564687515929","9230466624432031301","8075084821822708568","2646803358046993388","6150715019017275647","11425568404443787688","2261958617158771035"],["9406144251020357831","649383456887945064","1757536959804147422","13066793992694819933","9444539056513750497","10918608359744025231","7377981712889737091","16015118570057524045","7069566819630888152","1505134319047311917","854061865861865719","12004712020943004310","9226170249533959114","5870998503099787005","15375375902966809030","9281644597966396296","2400724733070236111","10431372771675133121","9394669984558598336","10963444235637422708","14292701558007052803","13539859487654350199","14382072635965218344","6928267368624931849","1898844536052485475","12978937614964137011","4173149386121867449","8360205397762755217","7505238896833482269","3929456353916062554","2166563340600531883","7556408117978728350","10512312122500837544","2214502615423155391","10384833465885126946","630903127129029701","7973023799749325938","4086267970457270456","14845430284682710519","0","10639727582252713837","18102682593423013873","3479308414994824698","9541410378364531744","10763850297459386934","9587200019895090909","12811024487255579030","3741059596857545612","6108603940289368063","10621701406646801550","4426651734971703392","7476079777274189544"],["11088095311197071467","16520581691745699304","17893600647717242004","1782829668756438340","5529466622547679918","15953452551376874307","147407066963669824","18144374391429141933","10473669396698791799","3863011979970460057","13863395180534189122","11129906876833355887","5339418097725852830","15668197006009114959","6203981506412723433","6391224357009156754","15113259782929016400","11247159849749660465","1397582914581985962","2293990423287421953","13301619354325539257","7467839903932883127","13041726392288905184","2140753944765593543","6386972400099559128","13922067304005682604","10010647884504712085","17334532705572258890","13505016487250834917","6543585009643510607","774835607799401944","12916609080913576202","1320623435460126033","5362992930653554389","10712337487170151004","2730757597794409567","11439348609488711925","16214537747964497579","9175544922532657265","0","4447934650727449001","2835664861599599428","2405299627957073454","9586474131942015092","14061540522000920896","6063350379431505788","5413386822564222823","6648493652522910220","4385029098793453145","17055359220030604454","8708464043921441994","2842503648707186537"],["1736816387017500271","12451367720560742079","372717915228934164","9054046036641206925","14134706166536454505","17753541791888775941","542892753371410110","12567309299568428037","11191204015513781126","11188423206252203920","6761043725467134735","4010657051594577206","14870120880222970582","14256462423159675050","14043950828584813726","737117702732421710","13471487216690343445","13533270594312984716","17942815817859782369","16944479963859771080","3125744714897258524","9652956507537839429","17968390949755419392","400779949701768588","1072077394244546411","11575676638649580734","1805308408868392974","11290556284571404456","7916812710750028146","14921784076811326726","5162533733844633061","6554324754645249745","8682374876953040961","2604595875819959640","4623900488124065724","9529467327697199751","9536181698082558248","4882762783582741820","18371797203933489765","0","6637838156914529137","13127576281407088096","5524250478189041288","1887183252723537983","9644406344742477307","13300296519330565634","8873397109050038245","5585979451642384140","12398658923862060185","1395870259944492605","15020084825709247651","1154529147456980475"],["1765207920657666994","393773518744230313","16143479615000035549","5830773580259104518","1622219736752758987","1499186706479604557","7899609188239140985","4936714934757075041","10534223150099045935","13066010787621786683","15397147736340316586","17297670303394544665","8519422982002966902","14709719979778834241","758572411724621844","3730920654873893309","12678027271540926420","15501978501939859846","12048527946041803905","10739453570567097254","6944575147521746487","7651393551276045238","7755056412407389053","14916889223209450075","7453928246482177303","14571195086202800531","17017636299093980005","9133855293575485040","231198975757869134","16086370922210106120","15699312448331394496","12044398960535845423","14413392303353448581","12245019541899655291","15062234820933092378","18354103473977689488","11850853529485790579","11935712692144204421","14270997754897326014","0","3294003585971987150","8141044398016777929","15763774049566914905","12832001368478318411","16314374559986256905","1257105775329759401","6890972687704466050","10354693474423244986","3235322880553980515","8383084642313627848","13974970113463960995","5654635439423063856"],["6575901770269852776","157859260577181581","16623844777442800321","4015163924394766845","17680247983324407137","2988056094513027432","8319678285170782539","9311627230267204473","5868797002306043508","10799437849543269206","2291276401431025672","2470705818434253769","10420005330381770117","11339133876827389283","4196164120361366149","4287588189639912605","8231991013269052312","1551569512820828846","10370560635124809326","14949510857749333617","727034732072356537","14492672704467665438","10222789720724004895","11013124411077326304","5646909250667003204","7712579987826753574","16972421577818200436","7888095922639599297","3400367571969679235","16269897519775719430","8207399509099416982","11456357721877982427","467856642063284109","5348919529524017913","3108689859362565600","15955005872279007085","17947907372872935812","7654489214378070234","10325804355650276212","0","15455648897585992392","9186392885584052420","5953753638019213576","16167720295984317630","10560998523072192889","9384056283266962761","12457963980155475807","7711918853144206106","8455179799239333301","10637327059281573631","17346200100734726045","13727124978385520308"],["2490086048068009585","11434317967470089551","1742073488651568646","16687176853691021053","11857031477226504612","10856412575237935191","3328227149629712360","15120617405432017905","9596750619359897952","7131656866880753664","5962053162793129233","9879808811650196416","10383231310134522789","17471543273918946024","9153270346930171727","4744294172433024137","17278263964196859238","15856334306115772995","12589042598384914034","671810223884638919","2642101112285231789","6634493204231599799","17389998264787401582","9640905730060866238","76094150348643954","11416956725552799572","16896045191388520601","15528040477645629710","7046931221323351547","12088818234254916364","17931923392494872241","414014860822793663","8149699809458831592","3391092195979761675","16362249925948811078","3604666034312368989","6476028502747848267","7055930195988713950","15658078603450218609","0","13032854588539456661","7420311218820385304","17744357105757509357","7188682420594068473","4908543840859404231","4091257983968427570","2585228970223988164","4294620859609149807","17583171608690797870","11791421018207196674","15940700898049707317","627991488700377526"],["4483391166225342907","1046915829447037335","16833480293091336496","2705120540491511154","1546082419684891155","11139781306387043123","8724596963068028545","431062262861527527","11015729638789582168","94734626624833872","1528715483762237652","13447204042567587293","16703642435748671617","9982044097306151864","8884854845500332666","12299633968181606120","11931700941171741324","6106997859526441216","1971914799419695670","2666989795775228195","11407119054511275886","7513806723848278509","16636755415905007142","14325931640028591188","6002103354045974856","12012578283556863500","407422196614358459","7511151270873153758","16794645260505852179","4688171055208967677","16034489074889589893","11305381587407771633","13276754973560792573","1024147112436088555","6264313446251794968","16053215031768608175","8137225419324830428","16867868286402123649","14100754494125486885","0","3656762316902987928","2011606373606526934","14125360897595291445","12072413618601653371","4335870822425226704","12366590155359462456","10977768432487434676","8190443439702191175","8874893121448433929","16905579076364524271","5000292765578321454","14558123781504950721"],["14912384676301578281","5196738745736470872","3933398501514475825","16317327533733478267","12556642191136423562","6660256524949800324","12531420541773822767","11234762831785949473","15247659068424308306","11941751052470440135","1571582114020496119","2611988998850184846","1852516897154400548","17001065771933261629","9484309514460702611","16406273849841264469","1567283101446761593","12495629795024948066","198118179312933897","17388369930318547484","11205361337367882243","11180550424032639738","12984333596156271069","4848181089574604222","11519929650314691599","11659548201416403666","9432366052984361269","7208206414804172687","12330134622734844819","15606933373488110049","15715419348851278883","8301464224958660260","3703122274515984019","986763075298880453","5868846598482732620","9893189851393126936","3898482511971643701","10703583385553513342","7135861937371697111","0","11211234487170737065","8103187179798047534","12068008616693172190","1694557828777556044","3695868817601064294","16722574606539770955","11671432413901187221","8636839377405239573","10456874948449035631","1208968324368563635","9534194177936422936","591985379983414620"],["8691180314927059066","6295393961366649591","17354804837446038565","16113280009143184651","12683987503735881360","2587164006644711649","771517138940745653","13872886417883854840","8558932001867912152","89925251268331811","2455462234092114949","13281255857361672406","3334407789107596728","17635521457759705525","1413225484596243651","2007347631403291090","8917637537673302654","11309141495622534037","6741901137731496628","508690058364169008","13966267652059571381","4917289404586652341","9607834305724676225","398304827567969788","13957092429013766506","13717235555232851946","206150307920643670","11809611857999006622","14214279272782581320","13194067596455683161","11496518991383268708","14912612820397063145","8883972438688107908","9501923173836626207","15264727795822223348","1036208199680613395","16889814933704174919","7307648898469056181","15121558878175787891","0","5486004206127160375","12394353646149854144","10584059188663436725","12478864571974961972","735737361175016236","3262938116395161775","9995071387643272211","5078818260297154342","5901193416820557516","7277800746546062081","16455513135366405674","1663154959592106754"],["9352943473365319448","17441505777674222295","18259136324115749063","13075031371239961931","16370421030311639438","207038982013481132","1251930305488252564","13464185291829422162","3762375543730662801","12640947163243910888","14806324327502150789","6770660074763138312","5114254685305330722","10363023463024432800","12888321110388604803","9985671861855649548","6281472532196396476","4032085579631141710","7686923899873493351","3553395169307398535","1682890637986185912","16812341580980703092","11036464641279847542","2252595663570020176","15588157347494034884","3384829677451815618","11709821819179262175","17744129371176532794","13604552256893639228","69590880182389959","3014860046665509821","3782180825030726237","15987787822151861789","9032784295318259602","2899510499275981111","6632678052818760032","15617844092192773560","18311655307125117450","12029915668606309185","0","2768266095435693789","10942255788786175186","3502094666417829309","10439653888801161412","10757275256512199746","13687458306567586898","6176434694379078340","2497172911936645026","14678759719938619755","11082530273954472927","3229676009415791982","10478945030147391561"],["1485528528313933315","13950179512355814698","17480470232156254847","2391961291222845468","8073756361614958161","7292737772909416053","702548788148027418","11338754878506297982","3617423588637986100","11271945246701286226","4903609696349038942","18092760844790751079","1984143804265753289","11723881441199401728","14818595340404383152","8693548219236147716","303414264929070368","10156111765905185491","14628834693854059839","16094927871448224626","12566295765945320718","17992451186447113667","9890436269355592067","9471520861568412616","298491363913757485","9831209220144726421","6159232150046591290","10811746643887981115","7829888481850056664","8650655968447858836","17235661039315060332","14846543150220930414","5184450126750940362","5144093853749820890","13060775125344564095","5398385397945557380","8275220087801811081","9360372249640462563","13547599459626365482","0","4839570598267700684","2836349703841795701","13233788236325022113","1965335029574924071","5786520668022640195","8451976273810179651","7099076950447134973","10839985354695652385","13978082377400420832","1413054302273841485","14590693065658603047","81885057804016592"],["8448841539187430282","17931881877150466245","9548256469243748432","14930135208019037082","2270864017020780426","3288944018627205753","16572958127816565682","6942314187005947224","8968801728278597091","15875335757607881246","9521492978417600186","1386819750862638304","14760939262256479447","4586742896441100583","15303936789321867703","2355032920374395649","7575995041894896017","5244199629026824252","5613331033538088513","8961750592698329140","12168857234917256041","15347075810574736823","1575214405776446854","15619787486118884461","16075401592918914665","12308923511239445419","13477699978675689353","343271258723153193","8111878797736671960","14664648248105974062","4636021191104897260","9118244937096488993","16935331514680475615","17331087912873561049","379546721235719826","11708639796754302573","6553706078683656119","1655082277590094161","15078489015023627807","0","15196976518335262754","4621712117877232542","5719279423067717205","5201853685031589049","1535238475123802737","1865243760664748972","10528785494602140692","11039038051578093691","8807309280370684980","8987167792726772077","18137125017229612293","1438616651766497827"],["2756437097676175266","14634258085096044030","17527316850750830737","6400287342364629510","14995277630371977537","10876028550434413101","9242364216448267010","8402403074195971641","5382624636338145367","16973491815468332671","11920010461116949019","11629993662768971589","1285403107750325021","3909339608965838876","10288357544445203894","9637360861012537969","11308240705636060168","10971494441162558198","13329967014615601582","9554700226956844518","3432808714830811575","4597134070626967574","2895340206828424401","14051493053650793538","16984193596749495558","14430269564092718289","13036252980438906809","18294873201841140006","17746579921560862702","10593744840686779258","3214148388282460556","15857369829688740664","1680270912756979509","5590136068204179357","15422531252703299505","8971708185799153498","12255262499362784148","2045283512266282276","18313540177860142453","0","1580871736185737830","5070140857739486048","12159705260318868731","4052465570962629944","7160124528423868718","8275044664029008985","4955705484735960451","2245696295782575087","17874336099610224968","16417884441649852242","13590921625093102057","18180260352086468777"],["10426030281131028587","8545892924335035629","1516742850960368375","8909186803300943915","3679261635493520661","18031805749957796231","4755487050206318552","1332229640020690564","12993858889569367486","5156783086743313931","12880994228659353916","15120022501121306708","6417090930608214032","7651849924279554320","5499850145844380553","17578966037709597530","2617356346475956081","1610207382672316421","8052606298609784661","3364864658638774557","15878130963634031426","15139846754474444936","10648132780908208082","11448383685705040935","1241705956113528656","10251473046053163310","8357253319472928656","18297991179532651452","11519725131491152142","14266054726833455499","9565352247148431803","16081779817326372075","15638435914251933802","13918374726995479634","13202011876535895721","16559273974719577941","11122106580268926958","2890260985998133049","10156685367087972867","0","6585491763497118018","9720342132064932284","9520561656493661405","16178982579246859452","2906809293860636377","2809949057609652440","128630427118709109","11045217321324378058","8607177064187107598","11080683006640792103","8123255244109512633","1483434796268847900"],["16931825629872169462","16177568609264526568","15209147485649492687","10628773907174494756","5942994229895552666","5716900653368091341","4192330047313932290","962786757645401877","1646659136133754916","3575992791644009697","14389433691120814858","12668010723551466192","2889398738299198906","14517865494723017895","1992262749941005110","6801277015323039065","4927929291602522482","17093803331558275042","1778276791515461500","14974413310721923301","9241926331022809277","3542963571376074445","6177391234408464845","17969353563019020707","15862675352298807647","4370131596535698938","323259543986578200","17462432064783680811","4833717157258207324","12077825249612246990","14186845482384525947","3610582714832262004","1429379752811659071","401652138813976947","634821988259329440","2693217817118909048","11137502278738391759","18007663027032304590","5049913556701773447","0","298473038753370104","8204072176165872966","14540550520799300354","10831638795583624191","9780527828048310776","14921373088629219032","13403773212485509959","4376557464279309506","5842420610221500784","16453553389286495188","8576414061296117713","10633010808021355756"],["16337750298788831660","5514158682596425253","14880166756266898618","11277649171578478910","7776846364695418422","11566654741441960729","6438238495509639908","5258536383874022373","2176593088140069848","661670233920814070","8468234064062723752","10305979160296884702","15672501932263245159","7944559244189712654","2757019892524341648","11912174957525092643","915214122512534552","13531403535242618383","5658223073632065708","18311186245495970279","12975730232867264342","13026622120036548919","6707079586393639841","8404540350986764746","8243925294781848542","3272528991965018828","3268787787741094100","13567220755295839590","3604156888177070757","14622406488771124320","11178773212662904368","12443107434539191746","2504717379670582577","10466396414275961345","17396601482361224632","2938692042720149432","10267648956022176965","7369459869971789026","2236468286695541559","0","17190911729564184327","13385266162196582668","3359182819536899795","7280802599646599014","10066810676560852857","16575567636701884637","12791151145943788912","1876551994526990156","9376334661472512988","12145029977989626642","2973624485711104760","2873811347353208468"],["11000822003124186985","14815959956899066139","4295981990782206540","8866405075838530025","4733501063018929137","5586649401962579499","5463182672995427661","16676676133640053667","5949189032250924683","14377664139147565495","14367175816045779861","10179423268541867801","13595997292156341294","171012508639492687","597412391075409210","12964440659453969981","10754282671592668329","3359634791664679264","10613481042395562169","3912802234190447036","1191472978062615904","6374778325107792639","10634683841352088388","16193775192627012034","10519102106837456829","14827544205758207096","4799881749010751320","7716001295514416536","11379646390151559948","3549393585282715600","3643232361266406665","17941463511609882714","5077433201835329253","14873108615417442380","7282312183870497470","6946521129235792630","16329367041399410050","4101586722569673740","15081598061190774113","0","12739158074055797570","2572981916680122378","6810262556215507105","14407224471939034811","1278545474262821651","6968914378635869447","16903972103911432123","7004410747605973532","3833644638594964536","4714745100691500287","14525991360455850984","12619788036392681215"],["2912924715980959851","14186663249207361463","16336670306368698279","1587583561365838994","6781932847394688330","725794069373364735","6056067392969770286","10165118331745298135","18337618010957276424","2417497065802594325","14272579862311462900","9020408216051083913","4352896598517998779","7141190019199839354","1106463627314706070","7356755519941945026","18372410275666796950","7453112131461421068","8211002038917857723","18029067453344473099","11791519059162326399","3196818462124990330","15208280428220379464","6535368484629987165","7412223079636806643","5639622775703529553","12774358013319351955","10291693448084355044","8229353382529579156","1481913603108331398","14232571044517245518","947299423256824651","5869767755420955788","12513604985772826951","4329529478648284867","9994502229834421085","3848572778686886664","2816235849041475435","27962385814599350","0","6815268799221079471","2694442606492490128","16785290799101194879","3028581267394438842","6852030988997769630","1168611021132206684","14703363898453027472","599528302402608894","7173779687566893434","6395119328443338019","14827276579367255611","4899163652496152542"],["6229946951211021417","11021507977534154813","1875524917783949678","17970543131059216277","4318046723818400363","2613370152513400823","5643615785785886320","6666376247858688168","13910686001744868971","4178415498174250199","4473486556250828304","6769152787322787461","17246233943917334622","13542005718998511037","17195947560350788477","10793361866637410532","7443570273469806844","3247535444074185510","14910166819127250810","12169498344109144776","205590714141639088","696713167612655066","14731738820555848173","9135944948631779591","12186509397936849204","10600205574436181614","14393834044637494211","8357298125148444930","16986777850561839927","10091228474015977164","17468479705351805464","9761065479906752442","14396137200700021803","4925649271938481788","8725459628829215589","14103863544876331832","6454877778936667264","1115463569295986714","1605115220837768022","0","12559466013340365712","7575747517002052786","8965908794334471686","12540324286996304603","10191825448327410261","4793758527447029610","17455171714932680717","6720465131363283587","11530155936309983264","18247135200161761685","15424801111908279332","8443284872689987512"],["7978242077291142708","978669317534653905","8334158459906673914","4286772646211352538","10106750602960519607","15678935723736428710","9924380823105690116","8173039087003106836","6554297271715275606","2957780613643275207","9562449087013730124","12651624991359740235","9618908179356313793","13453357718232821668","12168892994984110911","2304410019015449199","10687057915790015090","1417002837594837834","6799734769129028494","6626532108068641923","1635375205072053070","5452261253891512326","14411006715163586993","8847995508659855601","16718961974647347034","10816101875914652591","7103670607259184889","10898693672847693659","13705682003258236465","8034463189670589561","1477679395002768217","818419393392827713","15851267788897830545","1008753042059863107","9060446514123304185","4452583088376997540","14710936654453324045","2416214108133266764","15298368270647587411","0","16626533463451298444","5149864128027031488","4727778650688503341","9161663109994742066","12766132615303838525","16153418313616015301","608591893081219881","15729988586940185911","12276397441636037226","2142430817181121098","15992201216658357183","7672219926558258373"],["14155994214393005874","10137226689749888082","8533253091844756945","18204235264517415322","12412579109228830257","8917707398278255830","11569600540119304177","6831603359616866390","9342667794860439309","13380548185436742707","11528665741336905834","16800043555746328820","6147994286082881140","10241788802855564962","15158022250592611820","2106068788056041633","15016375332601968125","4236923613656859613","14468280932075374697","2471255475235546148","1375097172048122439","3364992660601111053","15827536220362198663","13624375573015568244","3851667347261739421","10810977233087161014","4645851903410619924","158763232894255900","18041314369326442107","16179106503708291613","9267085225491296476","14349309112610572115","15789320138948823468","14116445226847417063","11464571090119783258","14829006259839265636","1163070102965993693","1041582764048628706","5085087119041790003","0","14347102627591916371","15483683598347739410","14086670171252356314","10766159403973666425","2450174122938787083","6704423027574534849","17610353633570096102","12879129418585233316","5034966871297909040","9294231000900234862","8997607800547061208","7363533982565685509"],["977876841444951852","12834056404202027197","4847998791567797344","4985655190750208889","842632793631219960","4829547071314520066","18139289061983644086","8959708887213814210","4497004158945963705","894582426794561377","14894328882646750092","3495830360488291386","10733397994353627983","6737117228029862240","4295649612915382606","8062818425842179788","1652045323705478240","7385616668645577902","5242670222027938060","3491298176791546454","14458167777116471007","9889596396541982117","16634471195101000134","551131863978796783","13659945519191934440","36834783116417427","11223869478478906280","7745241944723712468","15167207669624486390","6345497055010193576","1905606288374219513","3980502796899919675","1423753557787302400","8244267010065508071","3872971237624197675","17421631389381990687","1454464023963322566","7463518332305886717","923142683853041405","0","2848214131972478079","12429890532008199449","5874228966477170046","11709198072082498","5819551869497738021","13774176370039694867","11292599534109409162","5564838770761436824","606055785417280414","4377678346839669554","9380031001705798949","229670548661220149"],["4816036513930018185","4683122975396018061","1531005432809742773","12551577517349902371","5674397216454464757","987456413128015089","14972709133934699949","2474864339988442850","7467668253517546485","12407504202946560711","15785591918353268054","14427802026217626901","11008621854677796674","3941362282456955768","8670442335788449642","6167693240949560156","8036060979542216032","6545299520259165832","10649569110929065889","9564370785189475691","5124330733298020168","7374249037553097147","17157220634967256476","7831675343795402265","11788255841528298155","9647255952909598264","11779391488447938762","197678374757021642","7679564289253843847","16235083122088401713","14587539845350756094","7271675535079915672","14889854864584848461","11442233162547025674","3923462823070923612","12064818609453507132","1674648353208163286","728433353224620762","952515164934627316","0","16695586978549188416","15341961658256738632","8807457450676914457","1801276222734682918","16563355464104900560","9103380118103591076","11326743329651283957","18159373004028315766","15003031143672911643","16572642389495693809","14151156053299297411","6067908519122413378"],["4291251068173288222","15238591529249079915","12297072628456577993","5843425051280702229","11694620099884701615","10785252093328984410","5622235133307464694","8020854764629363605","10763385359954581368","5762253625979133657","12166731499049721162","9067051611877430602","1007791163399151167","13772463206087258808","2397667132212526446","9734045663323901516","16333426637105313073","3151968405010876547","15618670644032753735","10894811805809079400","9326911438417905874","244811499433049865","6100003226180495845","17779171273551551581","3911342221999315796","2305197850550867921","12107981341318428926","10408002128605106428","13025395744352087015","9576084454069225709","17116101991743963898","7116651327841637610","6631805012327202810","14307205599105370003","8670149816561414963","5921891423204631208","7037195330660031688","6872043372525326450","6801120320161949622","0","18407066196863948443","16907158193928769710","15096560755220442643","3075929882209949639","13602237918247871524","12274390025606939759","2997990447106720019","4662023609875083752","13095792367303997923","16354415022305907997","1904678994185082835","9293861220943154032"],["4368855542505060977","1804187214460697735","9442493058612087552","9444531982449052023","1780976195014534812","12843388564960374054","9896977741675272390","15101381194071700757","9167506978191273782","7254418894651163662","14422223640074979495","10014278915368900073","4957168108017451579","13942749173440997435","6587682821815210509","17586451136178227464","16353013840451359148","16566036782263188938","8250359314685638794","15252785657969191850","6477735929494845382","18417394508944419585","15867051138802010199","940940043268262935","4922676585658833707","2753136939232927374","10566744712432199947","7394278314880402459","16923339291135444082","16734234788860183392","1677815591287160522","8918688926052265829","668199402162972787","1823238990961582123","10402008694496378618","16542149276627914260","11982610762874309278","10370156013140838044","8201564676421279250","0","17480686948898011715","382240376467086435","5855391966385555696","12144839178655704907","11804751403775290797","13880401649168669579","10441823059985308256","4732488636481856618","6353084816454644530","4494511008554555082","3255907888976648397","1420071264793775585"],["12910829969087162691","7627900743450589872","9160475369488780402","10813462303363589906","3132443151260217044","10082545006997070706","16780880621100740728","1462113232050332771","11690951003072994408","13138429092890071896","8538890360709859813","10313737582671373748","16811181276198150209","14949897066621053476","4131209477577015317","7371122561100986973","11200937132601438157","5076687765862778862","9296231418546533274","14148984959214437096","12862086754127614720","3555212161483713847","10416291520863422562","5834661408306654627","6954609795631498048","2036258408387111599","16178392428400272999","16710624044390251777","7083762297158750921","6768601762399915223","9176852008855048685","4535236647687641506","17772845448936118184","14852230858539676001","10011370440215090710","4254963555598821762","16165915618878556813","10515688645730309482","16746095977202715937","0","837717417575849902","13501221299347758567","4553890437343463420","2403407964711846657","3677275783539566517","6584925016840422214","7615009037694589662","3146653748673358699","758096919954601038","3343605144908020066","5319100192513561533","15247055305399679817"],["2026213299286350232","17805192236323903747","14936255261792675671","13861132408133499497","139636180393418967","6154386863484686963","5079757204091356017","11199642257481976566","18163480145459234034","5814844646208008993","3730760468059236447","18392419044185486586","15277631326699700398","15076731219959184977","5943303618878021816","812968363594335102","10434764008722826911","643400577928646455","11161489570218347030","721916161568486140","4007276927681658305","4135824185080045102","9633020337643452295","10642784157648101192","1258912746816945923","11880110221041802719","6565875931032428495","14484409394910256849","13013690160927007544","6982857347789934221","16169545414939273105","17313040020419014137","15014364406910308179","2608721072091470664","13733113746685193282","13588188586988687582","1894903491075988462","3490758620951077307","16456236481417008565","0","12017185626919235034","1472263542409020019","6944795090767976218","18414843583063570997","2318073418003037209","2913734691357738238","13765368752004837278","1022840378001665797","17261869262420740090","15537877336704501011","5793638615793059111","15725544970222426714"],["17015738058992805143","12902571662349978406","13538003206372592160","9843426311156545936","2361387304670481206","15698866335865513712","4757662643533651495","18022666854556616000","7481881956505742676","17683714971285631991","17090274371962284336","5615902353809061389","3174521566249857133","16686259040997078064","7546043905019125214","15975537725242262183","10150181489756920834","13914379282702545296","4977006586188086306","19995316537776758","6963716610427587920","11778556592389011609","6708365556194858594","14820932837750073960","11256371905513916732","2114042710560620073","10032761667850029462","15364113863652312378","12151133735893203933","12900906804109884223","2310665343230112498","10525907356611230373","15663496625777176527","3418283578394362254","4719523478913116785","342709083035258464","750407992149692513","3269525030693716754","12987409822978161416","0","8100946567441574782","8437819678287542714","18088349452118223257","14524661630421906044","17540348634446732282","6961963460046629397","1157815825788822888","11470320333002033438","6178966807140308248","16597532637862506121","9572332760824124255","5843589481999671047"],["15318602652924371307","9687239487280576830","9478160573786658915","16746739488410281619","14369411524740922253","6946581044655384546","15331468805523360151","125896582277577094","10547960486560827576","13586017962221424144","7457437275153284528","2173390655468046361","9060127846744765862","18353459082486963920","17911602425655454546","11213780337765407388","9789448819610180404","10546189284778350201","10508250693396633829","8429848319923282831","7733168469744288407","16517992073068705220","3016584843121230876","10204468377875927749","13283379036731894702","11438279572790590696","6488963887968454210","11495784918765171240","18285511487048406742","5575495893743909384","1612388109143185989","2179406615697789160","14321695126195009721","15515343424710879703","797544517675402086","779442424670611507","12786772262468068807","5718166030133811263","6810626546461298054","0","11843978780013283968","11636819870428245683","15774991638987374309","8398164414559107297","10089170169902178071","12983384169339676446","12939733793386004162","10993177243255649513","5443210204675401344","5904296519840102720","6183773037757904446","14423906956162448347"],["1709254436684095030","316292963994996283","9526716679769567533","8565410512372065629","6166069124245322964","17646332842025004910","112277924740296498","7001936062539471148","9735704648558315602","633883889197318589","13644648239325947610","8656391898897733131","4164502464684710615","13491972529381835779","1465076360768237572","4002518611163661173","15825141599755228713","797521433785677987","16605937220216668822","17843073063134513585","11181829926955454743","3353348504974531900","6929663879924374311","1982525857138568594","10173344791330402659","18277624333499397099","2670562925124080906","2769605265950000582","3523432313136263094","15679511902101725200","12544453813379153289","1525790352527591926","16761475239414251071","241255804561934171","1141717040823978493","15606576865023365983","4785009384695811226","16146737960329244252","17083132000404083933","0","7359569652771663542","12320065294047992502","14400942644068443404","10436779776200736115","7316364053871272233","7201864017386956520","5765695793968462816","7647843072177537532","9842673127520115572","17233882380745719373","10625346247442585049","4706244282164500811"],["9249208338956337976","947483193170942144","5453745057819827502","2955137380500523626","9040970585331470252","15831752171559721585","14912998305757626147","15313704588641705321","4838160674716264376","12176236672111444407","863132677717095815","9077633264108936997","15071896775898339987","2686796417769734172","4197639932153983250","1878700774797960271","9441975146066165636","11765955675826961617","1164614556879594907","256556497732187324","13016692659352069283","4917356233279074428","6372609842850955008","2725807062288854234","3342559148279456276","11609474402055923237","5431527088312715112","1010306376780061264","2570233118243945305","15694115764360924165","3076957613246927932","8380340409735023402","10007921708768547550","9390840910824441646","14560363167894203498","7740040446030436780","11312557260352333456","12066984145443826147","12152532069325070393","0","13909503047779618662","2212484174869030516","15074804740523217097","222514973899554180","9414092282343704384","8982172841357495105","14665789170104564512","5584693022373371934","2708813828224745204","9522356469517370178","1064761768985803369","17961169349404298429"],["3238246789559939099","9026560786152790595","13592580744424128204","4741681200046320115","18418310990511036409","12289712531822833023","7714417247033712935","16074368395388056922","14398659583230629186","3606210228947894462","9830704993503781384","955177988139152870","11054657162978278814","10566081144620788734","16744739540790201173","13239726629101168438","3954601189282260480","627952307284118101","15546660384375110226","4157680721849280916","14774517888681531603","1443965281714848110","8187128392283469173","17841339443455242407","14917454827591058400","10580320184745354375","3668267515432310905","6651705325480072277","9557141032672379172","14865602286968415080","2227756336545550975","10411743313443564324","14052929696922729922","6468053793217015156","17199023507809005979","8507996777789672750","12414267806189557238","2949145808160281570","13514361381634869856","0","1682045696158928145","10863465161386036435","2621319777201226783","13290794574329913265","5904123316260597509","15070304290549417663","12285166770207422255","10422170228142344707","18078346439297590828","7168160594317387297","2784109315544377554","14652737039992624094"]],"s0_siblings1":[[["18207363163359696653","10507335264769696024","17070234427028110692","10872487485928785040"],["14411305104346408597","7155036338867420672","12876574864891567735","10413015613022988278"],["1321072489092064388","148110483891010829","3051022983198613573","3647137155952829076"],["2904045213578503675","4084867314615754804","5918835312033065430","11805218831514309658"],["4124481992531664211","12951389154364626057","9439270457375222278","2497765424669392481"],["12603082338858718442","113446198730285463","5910945862267292538","1881315151881657071"],["16766279497894841628","28261302894901551","7676190214456067551","5078884104763064116"],["11535627479414893939","18320194228435285168","13783709302880192835","10788457134076292499"],["4127452621700166231","2452523293732898086","11654455188285322162","13820953088463497357"],["5282135044586360522","16651194859549458346","10519751067259181202","5833639038264896285"],["300865061995236292","4857852960148433451","5289651955167791635","15019460095870984289"],["11523047633275798079","9489602830692274606","2107027112959611612","4224840503998435990"],["17047444363687660348","625898692956993986","5698875107047595799","16473218997066292712"],["14384466778419719781","17364326191198297078","7289161441345346931","14190083657279551211"],["10346018778825029298","2125018557600752664","3600846903339763219","1404914315289674478"],["7401712824857639441","5047305941689700733","3224946923725596702","14595061585852898129"],["16008494226924748437","973339928931461538","6665032646255839997","1778941985352342178"],["14692581242446115351","9590881671709611475","7827795248550986032","2044901265386947645"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["17479748647029300166","5177636220671200207","5803970873164521344","5020895620404728109"],["16412025498717396492","9577824348202200721","2788543598016585138","8228866068670479686"],["15842090679365702230","5688828738748627929","11527848971427011081","10385476433319149167"],["11887543206371609183","4019212664922299732","2723110337162755602","11028137305496434016"],["3489955266945934903","12930984239624269090","18160353894741614872","12433204088456721367"],["1769916967461716832","7478292870130300133","17628262955099209883","5394259673073362562"],["8520199951490891467","5972413376370338055","7726144860224014620","6244253648596335368"],["15111005780637580070","14313787070270919120","6239031432477238741","6450274182270763514"],["7616335366096428664","14413784476492531754","4578687267762878394","11278063092527962473"],["16550391680848100490","12043749478863567","16453462223282227640","1587474442024146367"],["2560034373352518702","851847325581339606","7875180201317479848","17924487937185749737"],["3671363012945510259","10879834490356142695","5600380322829067805","7521366298576793310"],["3325614003175928102","13345764523256452500","9597882776212353385","8427168785227821149"],["1799067082931066497","15492715079866435533","16447806153968844473","6291670586495098934"],["7140541215719801285","3724662139361436934","2725986613812731187","19651838412423135"],["13493181182693035619","6994874866960831466","10216982539954479268","2904130498071251268"],["1994813945872828313","5664806866220653702","4941056744738397539","4701583099238902285"],["14562899774898863927","9564665071798030808","8598924023565976908","10398759511559578747"],["13511468974184801344","6603278292769152271","14658651793900646256","7533309651141492914"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["1078533405640573789","12543587553251321272","11550787802413545489","3986598356456550728"],["786916684928303230","15339719489275046652","6345497291279936706","4057706632948284723"],["15578848175654100672","13203270689974535778","4152363790724377208","13649831192567038609"],["2078971130140154361","12704073232955443123","6674115562811717195","11069929922695178234"],["17376333790069646105","17002672426386227458","1117620462829189553","7612445911304588825"],["3453105403711592232","14688267536811569086","3175223291222525315","9411880289933656257"],["4568836181989641546","8359942190728886159","8837718741802586533","17218459079029095520"],["7195300731104405919","14579196382270534958","369572062920337922","4503365828976365491"],["12338697502256581525","7948103322179535974","12136005324073702545","8742779318087863903"],["760418553404727154","12927616969926726676","7767968546929861170","11631512860198045911"],["10689139421323512394","8957708221495680684","12929332736731666890","7518309701407567593"],["18392823985672313129","7342310795784329171","6208577241192531694","13586129027253027352"],["10668602458757602340","6798251643503228538","4171453292610912304","14938474662462851374"],["6515386586801084470","15287016182307162773","9490528284950676958","7458594592096071780"],["7546764392068280584","2768565813062925375","10750947764471007496","4944014625520932662"],["1034461157803691302","16269015939941039216","11610870518212914771","10430931666218562651"],["8310386040164463166","8506887453869099763","17078157002217311032","14637066983532784103"],["14562899774898863927","9564665071798030808","8598924023565976908","10398759511559578747"],["13511468974184801344","6603278292769152271","14658651793900646256","7533309651141492914"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["10863580134357470312","9959346243944931798","15100881838126271214","7299881670989055863"],["15682155812451271812","4095703665554262864","2562696261587849768","15603792066912373009"],["13649326905286282088","9199082129155762072","13850760098488758471","4067904828690396623"],["14593201479944351939","3759277512273062625","10846323697978488681","11391244976348311465"],["5806057437725141120","9605659471375457169","15148885393242837733","329916223170173187"],["17105387998008757536","13935528938824102121","8738924458645072967","6449557824781897966"],["16324896782368218386","1545876747642508428","5724344730337259511","17251142849715205967"],["1354155833021204465","3822529173840130574","16115752112605779780","5449036379211982819"],["15427536938416573828","3743461844333588091","15855405224482361152","14450852408608672523"],["18076797969377017333","2780150263028320938","17425586953039058710","4797506840758212388"],["2518644543959170772","5560442895490166242","14235629836884986478","8502214515918883272"],["11088729271216758467","1884786031721338033","10453910650451001995","5323262406984404114"],["7008674488102679639","4540434182871114913","14172302430778257321","4962187224960103095"],["8633654337293567967","17615062772009468705","17338684112133772406","1414940255306786021"],["4975246935988789813","12263667770815671079","17852206817955377236","4195066182331966781"],["8552767768789613238","8397640631248039815","4533814267210077049","9183868266348413931"],["12546517772948610189","16283086334057154541","11407549108937547588","15516481357389464369"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["6105810918108771744","4238690962904587257","16642569940379710245","16163580993735454456"],["8392927097150317099","15749754460596269744","2423579861177325849","9359557677122325914"],["12700290500827359352","10034530995599630858","4445765670093029990","13870760325715076565"],["13573718638581564866","15771910387347447753","16690447195757095614","13407429280255269111"],["12823770490938504530","1623629107680091938","2471226745290481808","2699056150504371227"],["4753937664435646003","18362113598191883062","3716274453346506085","9537925916206426143"],["3076081812075450619","1552794660751653592","16121431281081178841","15126235164596834530"],["6446801432691951242","12441226918560353918","12063775993799167057","10677487370883288919"],["2888517123005820143","13148949887573942729","13759180261481325988","16688157522062652009"],["11948680042201104207","8968578755238262437","3435269487464181749","10941042105061764106"],["14344169855559132401","15136987811924499415","13599096925732255365","13339770664287918238"],["13972276350909714770","9947351323674492894","9827240491059432401","4184734572291452865"],["236782826878165247","13856471200709982063","1575839479255148665","2095319935723265209"],["11057662779683262365","13908755814461491271","4807033988507922366","17917749195799190662"],["18402075817757301441","4045606364382849858","7516908322834284695","7054551586446371294"],["4962446072102742928","8031484206615015520","7812740782706264334","12473167219514129410"],["11866539680645014706","4967104545658661930","8250321468357763085","1651154803174202253"],["10023843600322293114","9124708931175440267","14354524952754042908","13220327546608944993"],["5285846713981279652","12909298862066258980","5952762879823642499","2773631715868083337"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["5221889032727017250","1436860517441367311","9258249124863146894","1792114162129966616"],["1626440455140139468","4193927532272545259","12255208215014157583","4731005701673054916"],["9884120327273158200","1411779117201149335","9173106035970439057","10375895064380235636"],["8995582635915445160","14194944310864554759","14865120840991346741","14248650072600150459"],["1723521583305406674","6012166372036337761","13626548125763069004","13867296837452391897"],["13237811530090806919","2978111187340524785","9455064308206109551","2389751868448770352"],["4605297769252926945","10500356982989600025","14396618367243169591","4788713287970672094"],["16471507178954135867","1932020652874210338","3994260470625512728","4544940547441281746"],["17639640349987848797","1041742042666753038","2676080877911326922","15383797604010782818"],["5729380457499328443","8614000155999358147","4272265528087227599","18219204215355191008"],["6882270299689105276","1364344649699386381","3515761371484140559","5383250462130122364"],["14950146030998449968","6041992337335934575","2468813869667288305","13848778049480465175"],["14129567560832501959","15058078834293819568","6443047596408442739","14443635353747408804"],["16378153829955397129","15215984335099000937","2919376201957687688","4831859646903187700"],["12670872894916968435","14475885186300304112","3072931602437099850","11673283789482200683"],["1007611044548663385","6028053188221219408","10819847215993200187","16662720925807355648"],["18237757737116713477","13335673608396107104","5806369088504539346","8460588504513051009"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["3371814237049811927","1952100962926378145","8477946353162682276","18312391327725201317"],["15384478623050234918","10325165683794176266","6684336711619766645","13759282539076295518"],["3170413190199433700","17073425651312329642","9125407274694951528","14996037815228148875"],["16261843107880916512","8822945622147115440","16681701408738658554","14674563244849000287"],["13571049418825438589","5239940851407925315","10523892208271128528","14673308733702621986"],["9828725342689746284","13800671837883213719","2234255104459393472","15214925667450773626"],["2549499781751509994","18254008763449283668","15078383357356362140","8133219844307254089"],["13390195375316096810","12523987942225960345","2133885055649792162","5419874445265004354"],["8226932839141289659","6461880086537150291","5830872930945824347","13946385035101001125"],["397854048297530376","15900986300920930658","2240299406622954509","10609987675001812042"],["785398017015042309","4909871318930560468","11440366868952459259","16643426728012085180"],["17809716917342681562","1825986353148215943","7377838197004047511","8826834497841438551"],["6377357924628594085","2380511350094339336","4988710647670106898","455518483776729716"],["16320627270074357316","4014894126851360813","168095291138154902","17506004782345059187"],["4808143442913027444","1449535759214198945","12439297531825075985","8887192473331752001"],["325700881340137770","15563962534199319493","8084233604364887270","5150051029500844918"],["10752518685571109437","7670063305715237760","12315612743620118841","8154073676706968800"],["17114869616440021119","18241732697510446044","12489046660499787469","10895907512106811699"],["5285846713981279652","12909298862066258980","5952762879823642499","2773631715868083337"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["716140660231524804","15611459780187106623","3908516005340208311","2687599925477590335"],["10942165663194864201","4267316350962903809","8126887206694720090","16015121185665300367"],["17335280846341197351","3531498352360160237","8608524008304015862","1409666403047090691"],["13011277876096147933","770340539865322039","6104353249699286964","15398464066479039234"],["8366741339922535956","6878825180748376112","1955717994714786884","6916059980893317678"],["47683918673326913","3811871320937415134","16700771274890403497","11413700962265272928"],["8487459492980510371","1608303864414306193","1255387811158363094","1197071495031895140"],["638260600482742008","10833277453835109557","13676711161862736080","10781697782320144668"],["15866733255773546814","10903676885222108319","9892905864883363170","1101442103668728520"],["78028846235258704","14905789765684938715","1082828229934359448","14532055415162296577"],["7163819430956887460","13593284192776148216","4785392497671210173","6496922039189719274"],["14897508458275838392","2449594142253776124","15680407218362891555","16472633851346290394"],["14949246816105546950","9109543032451642991","18098749652891414815","17678944604303261895"],["13271600588109236279","15706367370225520369","8843080567363543270","1661509554060887522"],["18396315720798691413","10095967579797069350","9079388091118973343","10690486660470894587"],["13524770311380728471","11659651697249030121","12818530841255335590","7818973376992772423"],["4596177163330752526","14911037473554453612","2231551469390438381","16903511588842956495"],["10023843600322293114","9124708931175440267","14354524952754042908","13220327546608944993"],["5285846713981279652","12909298862066258980","5952762879823642499","2773631715868083337"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["11373367196395826589","171295972662383876","10027645210866528542","17470889387966515894"],["1492655140356793695","2059844483463250692","10550706830367371170","3632931310780239931"],["9583505913609574829","7569240075894976568","11172228527162217976","14136019703615267786"],["26959060974890357","185416315423321092","12364586648155738887","3076505255012592331"],["2617154179715296667","15709597980606909278","15463952460072957750","12723246592477072087"],["17159124424319645807","25543677205941301","17098001056292561524","13611701968673362489"],["5232725349299785318","15195451596295764002","17713549389295673731","7963795942229735933"],["15714285711833826339","14301385723226264674","508178074964712278","6803602026796880126"],["3238772507473819079","764476875288067695","18169788408209693697","10258175877725297329"],["14400654216455466861","14862837570264301299","4865358805103995118","15904519480498871553"],["5432518375935416949","7171469055922011737","895362908810429270","12956357487548489417"],["14133619682935331341","9705306875672580459","9686535010513273990","13630586136606781311"],["250841686532650386","9695122733631649272","10806610846813000733","3241668107306774814"],["1953484067547588585","5773536017415717480","11429279239937222338","8142138041035302633"],["18151894070221521186","2886998534324725285","3499942456693683517","2971318454812440648"],["10516218338403134818","14468161882266535674","2325831347523636581","3657037644388510757"],["7164543738859979473","17495679106448138846","11259557623093536826","14252260985366303391"],["2562445026994683916","5677275343201680613","2373401787236444093","16937663538893089041"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["10508218956200034020","7596379605153358475","13171796945712563489","6634461730594930169"],["6094329722443340779","5576264125962512044","14675741342856837697","1575419756467660159"],["2616540187950964224","13393958614738562406","4681797816148427416","4186740771479449838"],["12018777468578360761","11509147785582445342","5644849671027500067","5047753170098763099"],["6551877670294609904","14845756263634785621","17815891604378505414","5490665000591727945"],["17829483152892903915","9360150757498168052","2010352670716682209","16314814724358178914"],["5522495813826838272","4246393767195043039","11492929184484427060","8124945233398978847"],["10883808436813977222","15153401526824599316","15857718248945710528","6676556547138147814"],["4601529344956051546","14438447345145331628","15757183454847408630","2487775958498006014"],["6160505975950379592","12477588539661640796","16345427751748353288","9782313931566555662"],["15935678372233427384","6986655391396098820","9822064609635052591","8828735065590626806"],["10153468136066835088","10972634943308214565","15748107318080048880","7145348185841543376"],["10668602458757602340","6798251643503228538","4171453292610912304","14938474662462851374"],["6515386586801084470","15287016182307162773","9490528284950676958","7458594592096071780"],["7546764392068280584","2768565813062925375","10750947764471007496","4944014625520932662"],["1034461157803691302","16269015939941039216","11610870518212914771","10430931666218562651"],["8310386040164463166","8506887453869099763","17078157002217311032","14637066983532784103"],["14562899774898863927","9564665071798030808","8598924023565976908","10398759511559578747"],["13511468974184801344","6603278292769152271","14658651793900646256","7533309651141492914"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["16921196303560555650","2592209790115547533","123109014042437339","14855922489085583047"],["7147531757549660087","15124877999252665100","2939392211285700558","1044619048464613011"],["4216864657319037161","15292804293995644889","12794918020594826877","16833383673464188782"],["11813916532594183065","1655646530443663136","6547747924532657050","9307009703157653380"],["2336260301659259512","6636367614728247839","3986450950414205346","12001903468479378692"],["16516445657808718149","15282430189794361889","11469356720352733570","18013030610215659124"],["12516426753469160574","14559915536787737718","647512716300370470","4504493764940469182"],["16059638746300446822","8396057296044147432","17581523439653067829","5768961456339457241"],["13335299122455418699","2931914280428026707","5265367509720861344","10650743949336648332"],["15686565654652246224","15050747472679110885","402438024864452631","12345441396242622175"],["4137759121844924422","15351573999727293499","5028420792770144622","3454892021634420766"],["7232189403609262727","17609262800612011594","4220019197058059168","673480600457286575"],["2438136474353500771","8635342824109957481","8655400436172144764","7763852374929120174"],["1859245841776465083","15680288202311551661","11469185241384371609","9810678492159930608"],["5979019377008907543","9565470733505268338","14677233500311459583","7688983743596778962"],["13493181182693035619","6994874866960831466","10216982539954479268","2904130498071251268"],["1994813945872828313","5664806866220653702","4941056744738397539","4701583099238902285"],["14562899774898863927","9564665071798030808","8598924023565976908","10398759511559578747"],["13511468974184801344","6603278292769152271","14658651793900646256","7533309651141492914"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["12589468727270085446","13156453749098594735","15961648617933116048","15317841945478061810"],["1652551235992384986","18025904571973077138","12777939632749055302","2275969179068681654"],["15735934218468950431","1039612904039457088","16317983746859982616","4895471109665449234"],["1746786440585065546","16062165878501949490","5521510875781366681","4872259528025054600"],["8100790474829290071","12662133041202502041","11390589313301783191","14146195824573860427"],["1535182956767525752","8031927112273834579","13570467805468124807","10909082759685629065"],["13261108006171786092","4417292317501200921","8493376485479042245","18064830887791820217"],["10171918154287461962","3816203729586364141","1246919275518134904","16685426173204392890"],["4775309301817641057","16678585380495118486","11985188038127721870","6969160865552492383"],["13868063554835311822","15760351725381789959","10969959334650523071","13226496860425521473"],["16225083379114690872","10264399919041000570","17648750188089156717","16270092544918461859"],["1183869621250933744","13145928993951708427","15812603021927546541","5172429235585993343"],["8101785599689135532","7052431041608195806","17772282532290009331","1651342499702370224"],["13657010723892427283","16448239100004084048","8817641952724464962","15556639552418348977"],["16290565714022010690","13542477026633961819","14891883686556783245","7406336915746844611"],["29262900284369771","5630428920510709464","10752540129029255557","15866752829045460575"],["7164543738859979473","17495679106448138846","11259557623093536826","14252260985366303391"],["2562445026994683916","5677275343201680613","2373401787236444093","16937663538893089041"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["319180616206858439","14137615938492541861","774550725517610493","13144112250452369372"],["14196801031795033395","13162575424653705","14909139561100258025","15109846837983001985"],["12794778229029079711","10274863996647778314","18435449133221153480","2204644854569551774"],["5743105164921329592","16279582912863060788","154770895209929409","4878670654479113117"],["1468739932234600694","6206892501497357553","7749684866219413079","13979524909783196854"],["6780139339069036706","17854543820357484995","2040817400833189385","4053469905446910344"],["14210395732807448212","7444442320969456556","11696158928873750061","10103279868853647420"],["11913405164597081649","7103957812989794131","9572736278550432598","6683847662554664387"],["3124553452870442748","14756273696379270830","15671597389552706833","8980746746285586763"],["15905984621402075703","11523550039616113132","17819538378603301776","2319395843829825753"],["499619630273865371","11677864370763935063","7868524369622337059","17029426125524276956"],["4906040387346750269","2261701358207973041","12834572686310460107","9689599543643278123"],["13562457499005012266","12983369176496212466","7682779971731182322","2546628606533435222"],["1888287721061337000","10980641514226862617","15857546157393081224","2190240099860584538"],["8590723168867284773","16864423734300616683","1900688767665792684","1571016160766492886"],["9713024235381718676","16736072448373416370","16249117397211693998","10536545031984267293"],["1636751904930892593","7488801433735571249","18287250542675466294","7154132074511454310"],["12632472725080282809","11238186286247101737","4707018093506098270","5724503883913507708"],["13511468974184801344","6603278292769152271","14658651793900646256","7533309651141492914"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["5439017678678405975","2881899073531419730","17719247460980133187","81170585123342379"],["664919601060176286","13805054117190839130","6079031035891909139","6556520913655906327"],["3308389127751625478","11262666838864920266","10364631193026084857","524424452630370619"],["11737383865555684366","1380494238375596956","462690679008735064","12338628049258304971"],["16075582783094168313","9183069046569775339","4096043359737411239","9764282006975196929"],["16789610719443098242","5721760346785291501","12747777955514391156","18367638264085056443"],["5331011145543979275","7270469996959906872","14687305137399396777","6638849187348005493"],["12310710354041424029","7138524631497954180","1281623448634874878","17037688604926144362"],["11056233646418664674","10294992071449224355","14075726315307931405","7509759943202511385"],["14833717264743592929","14765274178833709157","11492813886790091898","17875807713564401770"],["6519614117097482751","7879869577707961968","12963770601405098617","16656467107202536527"],["14158329882696556308","17288940289618348738","2944679366585818492","3075900900048250625"],["572226081049364178","11770612264788112297","11812839982639288739","13481670750587352940"],["10066464241458738278","14196733176954103341","17472021481325933457","2445067000606172775"],["8950324275967980159","8089092310826022180","10042818737773826216","16929729175450614689"],["7436568903358760945","10821286648976443744","3430301739048635738","11638038348958917967"],["12546517772948610189","16283086334057154541","11407549108937547588","15516481357389464369"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["13281493715753822747","16829029091280497914","10541377113045031691","6681168241696772762"],["121913098573812726","1129481646655845650","17302338906359534865","10678794767755373772"],["1691531287001842752","16888903975670740764","10389277924451890995","7359989091130156069"],["15022179045364587637","12612273853807799653","15812775843554933593","10241696693199430321"],["12618890580384010128","7811444833554071479","4052865764548883106","11552620950000933975"],["13226222164223411391","1576915232548892839","496317115130074604","12727060928649898385"],["15835066901887418814","5880950427697550589","1183962820129537100","2210803733068035662"],["3338832936885826942","18006742891860605600","8326424419669389513","16885577149101403135"],["16132750229469758383","9108757086770909372","1124489871021002004","1909232826620431474"],["218864211315858110","13094245185692087731","7290575171690212358","703869015418499987"],["733504428727334371","9223858525048921140","11329055755603014490","3118868532466423704"],["13846994020869305420","17550443621947423254","4550686063536003089","8124673611980134762"],["112839447988938633","4691171039158095887","7069820416027521576","5658098832647230345"],["6583603888131179182","9177717814106422318","9706163190321461931","4763242045785791854"],["2630523337664660111","9478460314840763797","15268924770732423656","10101671663855945117"],["16901573683781148941","9337152710453104101","6916378736384503690","18060358621002889967"],["8310386040164463166","8506887453869099763","17078157002217311032","14637066983532784103"],["14562899774898863927","9564665071798030808","8598924023565976908","10398759511559578747"],["13511468974184801344","6603278292769152271","14658651793900646256","7533309651141492914"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["13820486836348501729","10025810239832993384","1003327782288880969","17943414026170553290"],["12309039146169977322","13632220285372784537","6957754179234214787","4356198158525269087"],["16685511391548942308","13120444432384623844","13644056134828293444","9234593910641363348"],["14565207682094771059","3681140314399871799","7714627626950348521","18114177071218059370"],["13306133064882514643","3856870281109667671","2382897469306801526","15625480900158518018"],["17542323442057688174","1106196950050472181","11624196394945491893","7155188234559971333"],["5235664063171016142","14524622944841249079","16472738852400546036","8409611810524194029"],["17711937125507170156","16697977486586688893","1087058521089337059","9558699303512077884"],["12587664812012430405","9968851734860307601","1267409454064984084","7313975877365199343"],["4294076425735051941","8427177133736841880","18158872474969679362","8102874222501598464"],["1503770918998046122","2089733920445625086","2903513364815982826","15554848139866712335"],["17116426789679840973","4774399961457607198","16991496211217808036","1880876973905363549"],["12220713474132199137","14743902784544813566","11954539756391190909","9229110076330648038"],["4178724593801308019","11255384660750991914","798912261878253814","10649385545762969536"],["5081353851623463552","5987673968527901916","15239447493830434665","17262204493563076122"],["10966132398791476074","8259606547279824696","14865145325556761039","6196350413798285270"],["68280656767083704","16287068786653159133","268354270603878452","582649735825662635"],["1828994021896739212","4633820623994055563","10972539855878278194","8150539161347350870"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["12222028642490897180","246553077729345628","937836284159315239","10793124993074681529"],["10833524297292785323","12059791777754928360","3454111185221226832","8976482081392136504"],["12839940338620796814","8422483882957371794","4831046377515142556","415033843324846483"],["11506913017333775200","2446674925466573504","1045209189008691972","12639376595070796462"],["3079522211530954618","5807342612461647338","782076108200735834","8586771289632038574"],["10487223332494777066","8584772489664023098","18174214817417571512","6268736938069964010"],["4971842454813924035","10279113673530454167","1430246386069157430","11448830203512767156"],["12669005840121015034","7978953676474395785","15437522919265318061","11714916348785332503"],["12202399654627833961","812661192823283488","12819521312486535964","1086485300561261083"],["7297894401470015854","2858261808481564224","12309117162707363733","198610744207226877"],["12852214616328328755","10932327890341097856","11742914996566650076","18200492492923452286"],["18376224727415910061","14914952727457431173","2566959425783303321","2564734635088214623"],["9614886208906638599","746013713333477019","6586099219822356805","4464547124680910522"],["12128192630252277989","4620301229356743458","13527319028740347915","6719469540505327086"],["5081353851623463552","5987673968527901916","15239447493830434665","17262204493563076122"],["10966132398791476074","8259606547279824696","14865145325556761039","6196350413798285270"],["68280656767083704","16287068786653159133","268354270603878452","582649735825662635"],["1828994021896739212","4633820623994055563","10972539855878278194","8150539161347350870"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["3210519792614184037","466649533561815977","11111353876932717174","6576666743818144272"],["17085479406542473751","16795063174916985812","12670541028436074591","8476843533740535269"],["1063856408353770172","15995010800886963704","14156318980673529039","9659171323949624480"],["16783536700155044449","8071082106838158302","14674318878578041952","14241358373793454306"],["15984874299239252300","2500950543107805525","6869302729643510259","11841056642893173835"],["16595103705497303746","3852646535368569406","16695036001851566109","14766159231511348167"],["625801691298291460","8792345971338878581","17656564964990149270","18007350269463985812"],["11399614111391805422","4244031919667033099","6779625731825486894","422402942938778399"],["251031405184275805","16656755454679383205","12950150222750479259","12468265056607015532"],["4571680081269535628","2531874059588993644","10353859285514436595","690232688522479328"],["2804913044307691550","3350475931124516429","9150493658388032918","13194565266598700110"],["1491423465087388807","7981968850615968858","2216700843132735931","2801783961597272114"],["13569360491614895282","12932222107906425611","5638722036491379566","12187639618285629746"],["10730819487873799954","5399790213507189239","12959960857652256306","1053280142055752212"],["17411930459181983093","14860696053128765222","7736913870600126359","13649618192377920564"],["267701335576717194","8797919781050669501","10496190932363362906","6952366361894121513"],["68280656767083704","16287068786653159133","268354270603878452","582649735825662635"],["1828994021896739212","4633820623994055563","10972539855878278194","8150539161347350870"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["7828358213431289358","13227288295829196137","1315095417150923541","14736568857748668264"],["8664881221647180635","12353910919115560069","13130074978772168789","15924835059006692342"],["2048845550220667620","3570785258060721633","5926104010901057313","15704272984558815051"],["2078704814030719229","7203641891766740130","14279779370846852880","5294832317643530415"],["11868355809033210534","3840912807524786208","15321149292327620569","14655092428688898643"],["12111215590563277023","7874460091605688369","14448286236072325702","2329765757043507904"],["10091868048917326066","2890100917794980549","4557628033295247825","11162766300541056001"],["11663510071682188946","10337753194938464230","15376427960532946427","5585509607784178407"],["9016171291703270749","15039073265402668880","14033525199964856613","9601764254983366579"],["5025503933076025143","18240642585554987940","344703563324057071","6208291293583995015"],["7811053574535307854","928393416648495141","9789790225347321739","8667557547392009338"],["11763418870014015916","13653174402541658726","13160157986767919927","9134321124810654077"],["6718495349403782428","12654160204523744927","18178561466184880689","5772127809667275872"],["11260360662561954816","13239720101332570806","15300460555605872332","11876613504913656344"],["5979019377008907543","9565470733505268338","14677233500311459583","7688983743596778962"],["13493181182693035619","6994874866960831466","10216982539954479268","2904130498071251268"],["1994813945872828313","5664806866220653702","4941056744738397539","4701583099238902285"],["14562899774898863927","9564665071798030808","8598924023565976908","10398759511559578747"],["13511468974184801344","6603278292769152271","14658651793900646256","7533309651141492914"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["13231050703368393443","7118235508476457449","13385342911336262650","8856962881571130085"],["14045285418215235235","9176205701494949712","13860915925801140156","515175612278717744"],["7824604959758958392","5374463697991193468","18236189081928457690","4475544347107652725"],["1181386716035695969","2425345618470856988","16258248774434582487","1113743952544786582"],["17710757305033603785","7944591083268259625","12802772399193602753","15228757420446171602"],["10525783363243003484","18267049047500782672","6337578299361271270","3634197128476570502"],["10983330982930319994","2399228326690774137","66007099931192945","17179020873339137019"],["8932906459468377681","16769508411717365026","15146247728996050132","1451077105968172464"],["7008943808141240464","15255772871417344562","11796901343278238034","14905379737711311604"],["14407433262121640517","3929379030067626203","3240513210374230184","3443589483006108536"],["15793822717429614624","81668552900377811","4141305220601894474","9151946680103893011"],["6459209962578732086","3350702133416944430","5951363603996035467","10540281583837674155"],["2182742767299475626","17191548546880860550","4772972073058486169","6808372677543783051"],["280764913202788384","8751972759376667802","3731420991825960375","3767379354794044498"],["651309402831846726","14800662614370454017","8855121467555463143","271399157696952072"],["7436568903358760945","10821286648976443744","3430301739048635738","11638038348958917967"],["12546517772948610189","16283086334057154541","11407549108937547588","15516481357389464369"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["16757135254228099430","1777076331601643657","18119513043025613519","18098781070417798393"],["14114856513822893471","4341026882305200221","1549085006611267929","15790706386327243163"],["97720591543010654","5589182261575592159","7350809368022226446","11584359896560879617"],["9201316869649103851","13627338691657495220","13499270492152989260","10990614034635448529"],["6358224389985790160","5748722146108811847","7698532432417583110","2799548840058701023"],["3046832463736961567","11232263274044574170","575483435636140981","2842381543120753459"],["18101541598786087716","7732619687574374856","10671098371686041339","7425853256356929515"],["2456541169316140855","6814093000721870551","1694192015066828487","3449387867851583638"],["9016171291703270749","15039073265402668880","14033525199964856613","9601764254983366579"],["5025503933076025143","18240642585554987940","344703563324057071","6208291293583995015"],["7811053574535307854","928393416648495141","9789790225347321739","8667557547392009338"],["11763418870014015916","13653174402541658726","13160157986767919927","9134321124810654077"],["6718495349403782428","12654160204523744927","18178561466184880689","5772127809667275872"],["11260360662561954816","13239720101332570806","15300460555605872332","11876613504913656344"],["5979019377008907543","9565470733505268338","14677233500311459583","7688983743596778962"],["13493181182693035619","6994874866960831466","10216982539954479268","2904130498071251268"],["1994813945872828313","5664806866220653702","4941056744738397539","4701583099238902285"],["14562899774898863927","9564665071798030808","8598924023565976908","10398759511559578747"],["13511468974184801344","6603278292769152271","14658651793900646256","7533309651141492914"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["13408948036649543415","17543035577770166432","7539345770784971304","1658989770240541118"],["14799878519025885743","13983747898486635405","3324861991777545204","18138698836114365114"],["8767976393661859881","13819627834684672133","8274694828581320883","14621878958779539616"],["4461692783119848676","17440542514255908716","10929449723037198118","15573894788668121775"],["13324309008142784783","17152163046385743881","11777623875515107395","12644706723669824933"],["9630064964240959546","12689866674588613721","13548817765096529532","16951415114265483267"],["4368180038033030491","13600381405441153298","810754508558069957","4556314621777409631"],["15160506051379332813","12657907807891244284","1794541257453611276","2389001504835425401"],["15978658016227192687","13822565694683980668","5775259630945718235","2062782580579917568"],["7162634684732895651","11687130105342862451","3070653044378323023","17071938452822967951"],["7655121169379875151","544884469075479352","9030907408425913706","14932506253385507918"],["12681931852043850300","15204394808598647525","4066752372251023010","6895319340994303327"],["6377357924628594085","2380511350094339336","4988710647670106898","455518483776729716"],["16320627270074357316","4014894126851360813","168095291138154902","17506004782345059187"],["4808143442913027444","1449535759214198945","12439297531825075985","8887192473331752001"],["325700881340137770","15563962534199319493","8084233604364887270","5150051029500844918"],["10752518685571109437","7670063305715237760","12315612743620118841","8154073676706968800"],["17114869616440021119","18241732697510446044","12489046660499787469","10895907512106811699"],["5285846713981279652","12909298862066258980","5952762879823642499","2773631715868083337"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["1012807932909956882","1597898267740914716","7919965349610492599","17537171091556285171"],["10403207946572650695","7105941247135954717","9463338872076690447","12523758942856723437"],["15845406350619293130","18432293101777561446","7742203867181384664","11035985825596533546"],["6119654968232927958","49518013180749343","13389149283150924860","15486942774940858010"],["13579629697846643680","16111110009235149415","3149564368344190830","1362198081130851788"],["13749843943241327037","8677529448880199629","9144531033100875173","5901608551452454459"],["11925319288600253581","5060829518199969258","13004425180958943039","16318465104752050832"],["17844637526066068167","5780990076281125783","5407180247784965462","4624292543759175888"],["14676483017726343135","11866929147318310496","8842646144268155280","3674199101634974673"],["226256417238541730","4433893302485769346","11886973941926692738","13620055535980155918"],["15243088433748156738","3483874581047719851","15859321830054339794","5045798933051151764"],["6056855294430166707","453876221910144400","11388857339694097044","13772296803512609125"],["12575073757096543545","2951751709134665665","2625645432845782348","10193389221149147176"],["11869213855459784871","947947552497498891","397052415440580674","12978733898193848187"],["2505605494919006085","7809604498827932577","3147994554397213320","2417626397604655031"],["267701335576717194","8797919781050669501","10496190932363362906","6952366361894121513"],["68280656767083704","16287068786653159133","268354270603878452","582649735825662635"],["1828994021896739212","4633820623994055563","10972539855878278194","8150539161347350870"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["414775106456993052","7014143658679814205","6280575894236823785","14458867145271286380"],["5411408631962864662","12882937333227948670","16701024751767020967","6562817049856716924"],["17278363612328101077","13599574231605842466","12714595929121981823","3728303275974427943"],["9260987658219862259","587069367363114251","13946166428023176432","5453069209613090722"],["2006899419817097147","9173129936779598461","6150541437362697322","12496914362388179996"],["5210754257088270108","325607200495643274","10823761827090555156","3741028991344139364"],["539786455835836756","3944749716709223206","1832468939626542556","16149768058698617940"],["17882163491099910234","16609818017308152169","13223080804928881134","15364847857974048646"],["7627597210972651722","3983019002520447433","5701801259258685047","10970373310675982183"],["12209511175022235178","13788434890500015204","4761117931725765398","15698420329115205925"],["12513771000846028904","13286130612736143023","18446680308429012389","1857694517750727583"],["16590275944273336492","3711864600181626340","8144689432865506241","11509407746057540045"],["18291557991742662","12979120912778871000","7068803025517679717","13191697268522447044"],["5114407932411468163","1986993253941845167","5155445173043827256","10820938310342038908"],["3262799347301195197","11258685306524470192","10085604132924541859","3037643265825925711"],["16666286050689845888","2159623598448851731","4807514713395678270","15215063468610219925"],["18237757737116713477","13335673608396107104","5806369088504539346","8460588504513051009"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["2615501269975422535","510446919195312664","7219446838551460863","5097433384720446140"],["5735751821955639510","12272865621463884589","12513111897275325302","5263962345010364840"],["1719859852656292156","12512766213157294405","16068449195771020170","4109573442421578437"],["3287884520407958499","2786718937049447968","111449307600162884","15094345474022162134"],["6116231149001642178","17337419104819096751","10009043084783437280","8237394935834398389"],["5310317788318122804","12799797700614418034","17427711109132577713","16814260226863599846"],["5549545369074361021","7079139572416209007","17725578287698372335","4676730495011461134"],["779945445562451819","8765727164504777455","16028275998139591310","7290696276443840395"],["384322659625914764","8253555454622185900","15936379426848274485","99498036162559289"],["4870686649325429278","6361625644607576245","12329811244228580367","13068691344643053595"],["13902679369717544073","16135713140362545420","14272438140439635710","16170830001564613143"],["14662339357339968887","16057608437413116518","8980150810606279327","16381967674246308276"],["9555489632403702372","4480740384396536771","14611010339375148827","277399423612329767"],["205291392368965885","16268617747423554950","4003905880130170498","9797799253673765149"],["8267714992174317101","18239915013781278894","1675103665710504200","5422308404894896998"],["16666286050689845888","2159623598448851731","4807514713395678270","15215063468610219925"],["18237757737116713477","13335673608396107104","5806369088504539346","8460588504513051009"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["2705278029039319222","15058806349493611364","11978436588753963876","10554457474485006210"],["11363802824334631873","2156941511944581166","3374078711364992805","18152651207767713897"],["8616849069597945055","10539828559119059623","11007622037864753600","6596628873732482912"],["15572499786192276972","12068795675015208629","7568718761454512578","5335508733666226955"],["735069628498375404","13540425105989023195","9314711280087214605","14912187274279353118"],["10200399012745686843","13250721000231138457","17282233728189870717","130938866722788386"],["8924734393230211318","5674140557784647054","17091885280833852824","16912323344615898379"],["10033257463672351615","17823065590641351305","17212905507500067568","9468811583736664565"],["5509216134785344796","15449131391123759086","17389827371749413450","13551764517978845911"],["18206151899410711102","13575353661027223127","17337157288638203116","4853927388227527700"],["6074970762776313771","13927928533189231089","8320217241003112764","337845894835256338"],["8357483324217132762","8784021660306652921","7944868732141361248","5302464458856388609"],["10285244413865130507","14737410505414796508","9108595164401838034","16036396032754145938"],["5114407932411468163","1986993253941845167","5155445173043827256","10820938310342038908"],["3262799347301195197","11258685306524470192","10085604132924541859","3037643265825925711"],["16666286050689845888","2159623598448851731","4807514713395678270","15215063468610219925"],["18237757737116713477","13335673608396107104","5806369088504539346","8460588504513051009"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["1428479564320241441","10079265185300737501","13718225391042425466","13657232322274729753"],["14233318009234940622","4562372829625278078","13628409203083510317","4627435868626068037"],["6099236148757230188","14919474427221437898","10676882367623601679","13827783149911778607"],["14849733172711207637","13649820286891523037","11942265614901594206","1767250968853596783"],["15246831180485728308","13506155555082733225","7798609836849128119","10715022278101761757"],["5540907856110826945","11307928842194522926","15912622398238992945","16456601104987298277"],["8139435143405190047","4847091330043751298","6108522104809437561","7170208488024887508"],["1243283923772535398","9777461640858361065","10956539358879106331","15282898142917387430"],["10994471032566295168","12620405703347735818","11187993314702477693","241454209773002541"],["11990219031309092156","1991306215213757206","14546032916424267785","9820544408596010607"],["8387478056275053518","9606720226168921559","7309089380045075356","3132361521433348248"],["13797751988509005319","7154938596051393770","17303021508824464282","945243379660509799"],["10334084467124511945","12942175217829720255","7586043928521006448","17609851348311836760"],["12923358082116439926","14673876982708017134","7882223537866511241","14832891428403555033"],["11616918846740813705","16751407224661219647","15625811674593391613","2527665412542812284"],["10966132398791476074","8259606547279824696","14865145325556761039","6196350413798285270"],["68280656767083704","16287068786653159133","268354270603878452","582649735825662635"],["1828994021896739212","4633820623994055563","10972539855878278194","8150539161347350870"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["618913227404722883","12346435211242282888","17003674523754939357","3820716683078096776"],["11237807456335202103","13222966084555700866","9985033822907978815","13890555991233776843"],["18089865975213230805","16687833828938943626","14189294167581609529","14378681783200300627"],["13440113746937150948","6175310192374400253","16046404836508582538","1408927321806062126"],["2223283980659804713","14313797854598846706","14176505618850710281","18158603158002960447"],["9645308959413379390","4061095859585555598","3875911586105615500","442852624834883662"],["2797466563238517702","14645724466748774977","13815653509349490755","12456300708423393952"],["7248443409540908200","11926314750656088854","3783644051334786084","16965591219577166552"],["7317830688185086804","6081728419437081346","7843941438076095935","10826810228676700684"],["17395544820543391258","6551529643773483785","3382487068351046763","401956156579399940"],["5786162955769882073","5032402508566375280","8316982850000826518","98970660324621729"],["7087983971573709849","6240926415853409473","15364709436034400878","13960872281572267167"],["8871674705153899804","16691485133811983236","3949732627447056944","15252252246113048425"],["15218044134756903913","16230669253877808064","7531287138853397203","5667710706080453383"],["9905949713648921606","602056477397705388","5946298822161555461","12694818495410744520"],["5056995832976289817","11477138352501556957","9463379305490541470","342916275635141881"],["3351473306926539747","1359309970883451144","7583473164560590343","1230043235257722908"],["2562445026994683916","5677275343201680613","2373401787236444093","16937663538893089041"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["12248224548437709591","12243546878912878725","10115108094259996638","4864361737336208806"],["10925124437837447641","13716691069535152015","6738663691852990678","7746389990460404275"],["6614275952609063384","6301050766203079803","7171002127644088193","14034435431929218915"],["16947709805907894775","15392249531728553381","13098593294432167456","17596039518033698265"],["678035714256050668","10997071017675667476","9363435280597012462","2052060837688786778"],["4770945074866718129","12434202226404606853","10740921323023331889","4236992367126092151"],["8460660235768435147","5355258876734543148","14215961080085888648","10721604677843054766"],["4345072411067187586","3603031676668211516","18393226411783575444","15277222391262452702"],["12587664812012430405","9968851734860307601","1267409454064984084","7313975877365199343"],["4294076425735051941","8427177133736841880","18158872474969679362","8102874222501598464"],["1503770918998046122","2089733920445625086","2903513364815982826","15554848139866712335"],["17116426789679840973","4774399961457607198","16991496211217808036","1880876973905363549"],["12220713474132199137","14743902784544813566","11954539756391190909","9229110076330648038"],["4178724593801308019","11255384660750991914","798912261878253814","10649385545762969536"],["5081353851623463552","5987673968527901916","15239447493830434665","17262204493563076122"],["10966132398791476074","8259606547279824696","14865145325556761039","6196350413798285270"],["68280656767083704","16287068786653159133","268354270603878452","582649735825662635"],["1828994021896739212","4633820623994055563","10972539855878278194","8150539161347350870"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["17117269463586764788","10855831456875445633","504670060477551186","8756027539515357756"],["1947403000966271124","7554736351078976138","7109486312271863429","10088676273299063808"],["10808785760324929246","6736701668405581707","7633101340573678789","16838786181988371996"],["776240396497915305","16754258641725309005","14791376050183910431","12709934450238211577"],["11819270368436857271","12568796714491223309","12790803926956509901","8384735978140284468"],["6188377358995937605","12051129427754035959","7235296608650424617","1791066081199910420"],["12954398443582517694","15048758243805979182","3332245502517482130","10688727636615103191"],["3365356132944363343","9536226845906401765","13150630098306576606","9342318962346292802"],["556695603103133180","6679421931927139530","12857689871894087301","18272929676473440439"],["1687557823896673189","4184433790159553446","4319755687487118966","11291104435695158215"],["11400226857310893982","4733423414550353460","9121758694624195058","3537401999022892451"],["6672731755568808901","14100425228134807280","18379871575563132453","17024001608248004694"],["8101785599689135532","7052431041608195806","17772282532290009331","1651342499702370224"],["13657010723892427283","16448239100004084048","8817641952724464962","15556639552418348977"],["16290565714022010690","13542477026633961819","14891883686556783245","7406336915746844611"],["29262900284369771","5630428920510709464","10752540129029255557","15866752829045460575"],["7164543738859979473","17495679106448138846","11259557623093536826","14252260985366303391"],["2562445026994683916","5677275343201680613","2373401787236444093","16937663538893089041"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["10266583653702200067","357236731867178141","16562908727463828898","9064216308493794867"],["10542032299943763542","6329390147207663680","17316057184390078016","11249633554987664934"],["17470932024997203972","11419958098825678207","16703358491867279474","4410534396340768158"],["12658896402042108973","7473319590457926728","6918864724172021041","342189064819623952"],["17048198754720878809","3552881790506533024","8000276669188095095","16873825878588928301"],["16988265068449261887","435935778602365410","14132948888221841998","2192404331859883421"],["11255934118460034619","14044270224323801521","2494736841729317756","5210094053180016760"],["4860628006232649841","13132799871921348440","6055688385716631587","17879253783344562976"],["1156193878021948714","16245399434251132081","714836139103818061","15501701710610669341"],["3020332539621109901","18302339509944026095","9179159027508685372","18379351409886071320"],["13704644530960165593","4552280397795249103","12230283660867085199","6007415813277915345"],["4404490579250549686","6696621397766257667","16554873089635999087","121630640428340645"],["14523748574446233747","11562059909187741615","12937059209339310884","13449508093980226878"],["3063035822336571634","16959936919387818381","4218155966388885171","5060226346682360007"],["12078242441639133707","10326976662503542267","16076712455680999969","618479703628182807"],["17720433875492188348","14249737596912448986","789788488524837824","13799312949371787652"],["5513143281259806985","3516214008043619842","1978980061052398441","7403160810100828542"],["17114869616440021119","18241732697510446044","12489046660499787469","10895907512106811699"],["5285846713981279652","12909298862066258980","5952762879823642499","2773631715868083337"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["18394658172952576374","730501712609190058","1072698978377483548","4177011522583982750"],["437678922984884126","13048343719549655298","10782600220799167074","320729528563713099"],["17993487036451409845","15484680084561779187","2996282297771132379","5072148629754391027"],["6624550295258948342","14023664001846635587","10077814586049601882","3798241804643141787"],["17324304486464471819","4358146890879780254","13463510618587535043","11814683824669643210"],["11786095651388269186","9138567000314273748","17520850938017380839","16674540843091077959"],["1488271161574764876","13871308528018115534","5508561733811378645","11512567567344914494"],["9642779723493457161","5978929675371084209","615796815425053889","11600096546743597605"],["13188270400014046790","888438318579901572","1780843630709706351","7206235701443144111"],["2567957062133848129","1745922069499395592","3899340801904029619","15820092077026735296"],["1362384305979143836","16088564174607704087","11138421318217362807","9340759515264066715"],["14051790516448106271","13042636012115151437","8630939788460732366","3495966348366226214"],["16497290899263510343","457585377567764584","13203727634034824930","1094669669692102136"],["16917651021404954439","3899242800008771486","8860137659535919301","17424130082058749883"],["4946929458997179241","18403391304419380164","2591146837239565420","3651723304624126670"],["13524770311380728471","11659651697249030121","12818530841255335590","7818973376992772423"],["4596177163330752526","14911037473554453612","2231551469390438381","16903511588842956495"],["10023843600322293114","9124708931175440267","14354524952754042908","13220327546608944993"],["5285846713981279652","12909298862066258980","5952762879823642499","2773631715868083337"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["7672643462289028224","8866999731282716907","1290576096104310088","15290708503414482476"],["10798994950709099056","17734601754480469205","10005299289246599771","13737998594747683668"],["15661032654311027727","6538353231352769832","764642921333891500","598038454847746182"],["1590968255971860629","16186480641182952640","6498700661800753443","6714270501620406523"],["180370227428283467","16635484805035658821","12454982841837955449","8841607192092620360"],["1369263402345912999","16091467101624308738","14904851889007432568","13044661408428156794"],["13439434351610931474","14237498299809048584","18299635210725943421","13067413241359646012"],["15009740627578070016","9937034292709137554","2903409428639537893","2224815822826988765"],["14627483596124124443","14472500060973172369","16569425037971774615","17602002863456551234"],["17714479282777578838","10568161496525056913","3840068851586719165","14892906147273041515"],["15905300603872980412","15029980568437825025","16342898465867852517","12165376675616294253"],["10625791816213835586","6631353121766737740","3525468315234008764","4525291187913239325"],["76119356878619784","2179520475633916153","4078064908302771394","13011688792601117122"],["13830322898160492128","8907709063815713843","3025659284605377040","1345047021840936080"],["11948438273789754725","10336426729998569975","8069041865812349420","13519614191576245215"],["5057422451338085061","13659748410276803366","6171476161708813640","14364440923593965518"],["1636751904930892593","7488801433735571249","18287250542675466294","7154132074511454310"],["12632472725080282809","11238186286247101737","4707018093506098270","5724503883913507708"],["13511468974184801344","6603278292769152271","14658651793900646256","7533309651141492914"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["3663799918588975326","4744854519654647857","16967614943102451469","1002499581186245605"],["8656394729536309024","16821683862065562563","10770376173464176251","14246814800405079533"],["2196779629064292141","18095135682657372591","12107243360481650954","7518549271713811035"],["8364075172457561550","10125412436760096197","3356549949321938364","9364333919216141833"],["6144580122443927157","474234523390919273","11522091276229134428","2432783052259381552"],["3275155049618298565","4739536891751565725","15648756359459422422","1398352052466533976"],["10649353213967617379","14731113843910668070","4359568696210670050","6767473203653801729"],["3029813926310012968","15901528005390310436","4170797975542905142","8458304686588556423"],["11712185169253918410","4931267255236610452","1445640921066715271","16877578855975743757"],["8613096720371647940","10315387213997839543","16954562239631056654","5931057230580977419"],["4569739690416212486","9025889316918257269","9455013634203827247","4825137948943109879"],["7558601609681865728","18065563042375306264","5348099717284954899","582782291219021484"],["3598099808652185521","10705294564336463670","4027078473279527401","1014253361398090411"],["12128192630252277989","4620301229356743458","13527319028740347915","6719469540505327086"],["5081353851623463552","5987673968527901916","15239447493830434665","17262204493563076122"],["10966132398791476074","8259606547279824696","14865145325556761039","6196350413798285270"],["68280656767083704","16287068786653159133","268354270603878452","582649735825662635"],["1828994021896739212","4633820623994055563","10972539855878278194","8150539161347350870"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["2691902306145885261","15846365178579299257","15163383728916103735","15661310646784424425"],["12898284881271309032","5749665501466600585","3741418327175800448","8897332969074303724"],["3417182498871520571","8869332641063831575","644697885184676545","8637416312028243152"],["13512209348650833430","8372831921793619089","15351236404312699300","250391754443185121"],["4868656806433858305","3839928932616962776","3872412785992100572","13089801811654872455"],["14635625282520780617","14707118671066359103","3384792636571966050","7438533316642246321"],["6824316604388799993","1222971951408739705","15879042834838838974","3701150992366460447"],["16367488862520678590","3932941532283781163","9671860505076254706","13035637046154732856"],["11416296380441872522","6573853062748664137","1790180446485743923","14975260378083635928"],["1532845083258063823","12171887376787929408","14095613348100953921","16432220213627933236"],["8407008006290166245","5356036523565537034","16590085574373253847","2987777893594109304"],["11165251881536101382","1439154989018155110","17399692820077234565","2825416789194169986"],["2789022269371203829","473076908267566259","1533410714916338935","4663155167615632056"],["3417087477416923775","5630524715491737380","9701451949434568098","8935943600014115917"],["651309402831846726","14800662614370454017","8855121467555463143","271399157696952072"],["7436568903358760945","10821286648976443744","3430301739048635738","11638038348958917967"],["12546517772948610189","16283086334057154541","11407549108937547588","15516481357389464369"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["12908546308963033445","228584489631075116","10299072525588871043","12374232276059012202"],["15763436178908076654","17226451229484544169","48684305847920133","2633403629533786385"],["4591388707297087179","5131370288162718121","9236745284757022700","15394426851850752911"],["2284750366127161128","16606029590867915641","6983041149235616802","9735397756248920838"],["7188804599916297107","2703603945248482886","3894524602774608697","5682040489204090140"],["3067669625643198101","15658478985552184953","12510498546182917004","11705990942987739302"],["15575841708056085253","4239670298010586905","1043607128095789165","2105858525092299834"],["2093829614209245655","1928376259996073927","6292901882233012725","9083417271412055100"],["505671990149064728","2677086674072195779","1380389277629917048","5008127094049412166"],["607352096419266701","8136125628748345670","11845259666514115273","16329648984961301393"],["11623645114170252797","7878088449466467727","9043581035634390969","16654174527465835289"],["1229446490003041870","8067025052307968707","10103766169874682816","1509786546108964381"],["7961327702699605655","14498749815940987229","149342196666756630","14212456786639985668"],["6547547759390468734","1557567229743324710","13901167269749959457","4299796667684337399"],["9054173570579843192","10308038517990706106","18294409729673192727","8197330822869861247"],["2274285073793767262","10373353707782273133","2141158552570553378","2574600285742536613"],["11866539680645014706","4967104545658661930","8250321468357763085","1651154803174202253"],["10023843600322293114","9124708931175440267","14354524952754042908","13220327546608944993"],["5285846713981279652","12909298862066258980","5952762879823642499","2773631715868083337"],["11498736717650216937","9619632057828224601","3801611663146588760","14748134507337983045"]],[["4449244421692260381","11909809143061852908","4763761963621417778","6301494261946181654"],["16424282479886311085","18027744108437720801","5584367892533401154","3917375546256863074"],["16074336530422409075","8662595374900567567","4624534395283256439","17858364206985573656"],["15697647798212711813","9943334176209229398","14659675445870725679","13188953532135388300"],["1571591053108636495","6749028539821642626","12489324811714564883","17567148925896998563"],["15644389414124004258","2663907321128669039","10976915472746491557","14277958436239398592"],["16293040353909527161","2241221581162463825","14987500487817147462","13847051717763388947"],["8828561971783964075","6216251624461210501","387009043933220995","17118932107294482753"],["3641419864272055654","6241882102214986774","6595192243252873302","7528088609912243370"],["8867131508011781118","10225762631292782340","7749811924051604224","17063737158694881888"],["10053585432918388694","5611287576296505186","16528282816486006722","14876487481508892424"],["11588984843140858053","14994646357299258140","4329168183010031443","12914869382574536000"],["13649704126331628593","16998364784559750704","16618502269122573423","3593495630923680992"],["8364209400539714434","255426841960841208","6663050965319206794","16638716702184984293"],["7654991979387582095","9192477150518447393","3074881419115184545","6579457348780629721"],["29262900284369771","5630428920510709464","10752540129029255557","15866752829045460575"],["7164543738859979473","17495679106448138846","11259557623093536826","14252260985366303391"],["2562445026994683916","5677275343201680613","2373401787236444093","16937663538893089041"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["174363588562330108","9429867549152289968","287729646832397582","10174802613666538898"],["2694965970800378128","11288063200667137064","1092652947922982807","8309603192076960561"],["6360406059867638557","17641248410175536727","13952362966084142224","16790675361833980843"],["4143715423889134511","14747518189024752018","15061949154816263881","9035910135065412494"],["2275295611749457985","880424914717617627","18205225196954372330","8091566340531579347"],["7766267945428044591","11421384286394815946","15711559497197810252","15319241243499019175"],["17158727919113102488","15439696626802966839","4665517789251173730","1501405318704736922"],["12910575644175866989","16445780642513218748","4188724450005036000","8846589000690579083"],["13498839261616746490","15586859619334772738","1285154308379310029","10259584155309508150"],["14058054270640758623","13744055694799610653","13363597459487372542","3709871015741055120"],["5489277797530683089","16696219106588299243","6948029053989374485","5567450735901101572"],["9997485938913138791","3042847780434716092","4008355959404125268","4211856999549556068"],["5668364071336188613","6744547884098887036","6963821476154502804","14034391877458941882"],["3146695354995396954","7294559162871462367","877534700242259975","3541297271683021107"],["3262799347301195197","11258685306524470192","10085604132924541859","3037643265825925711"],["16666286050689845888","2159623598448851731","4807514713395678270","15215063468610219925"],["18237757737116713477","13335673608396107104","5806369088504539346","8460588504513051009"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["1537857670628478766","11884920489850754634","618112697920075824","6772003916797196288"],["17461499811486488251","7259132892318810472","16503568085602428757","15878498566632853848"],["11469978421243475386","15105308684125309192","17257977453242067937","2857119212350395854"],["7062314846941187040","7461571917516686482","1736525234422881786","5797414629281542118"],["13573209966512921517","2254196462838774380","11437459831094678115","9633530279346453207"],["11460867273163959218","12231519079149765725","17700153790480949551","12002743498684311925"],["1679197557933013024","61374548568720240","16927156983027632407","9925304429519335490"],["7572010914640609848","15085462267149522485","16180210815108861389","4501806178034566975"],["13682270894577868716","5567034276650185891","2157135250728085235","7796382916691943451"],["801747326202848101","3299835292441518190","10085088851863855071","17281926525243260286"],["6385440358259995538","7378012751772959711","9255861754024424157","15271893460344509959"],["14389365557712875967","4209257968145762591","5041913588389508679","16891491486127414126"],["5541865155395348191","8142554255740431058","13949097802338829942","18136776240152172372"],["15926668097946102543","233951702413774735","16435382769779354785","14815306081553672158"],["12323987576024460186","337928580076758712","17662919269503718935","4645777882222339384"],["15563933297019092751","10992544122542915636","10940421373103341235","10721435693350197969"],["3351473306926539747","1359309970883451144","7583473164560590343","1230043235257722908"],["2562445026994683916","5677275343201680613","2373401787236444093","16937663538893089041"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["6020725630195534462","3883941499964927814","15875234300914066314","10605255910015877527"],["15530400483647934688","12391349539150862444","3117175922164917223","8842903360355652437"],["3625584731804493819","13901234374354740745","5576186706401185924","18117400318680213865"],["11321557408804003477","15247192062819567637","17649312885400092372","8859425520320146439"],["4010461161388555484","8629845231204767738","15595393313005523574","3665846010410091632"],["3052478145410441969","10590530647748362249","16654647697117013916","9219486702951712348"],["3345239290506626614","13705234317560040104","17618754160488098992","3928353374365055473"],["16743564518107689106","6229942959572296331","3614766921775684951","1716974133513018544"],["14004595973199034015","9298554029061527772","257679275973228065","6775230103018141460"],["8604079118274146907","18166437315871170616","9284612250795031092","5129670340389873900"],["8888868911374357962","17064100292499708003","15192293038192735915","1374472936567614712"],["7992356429524812208","17407626720442849454","9554350825404678337","15326868880370550972"],["4389846549111183422","7915354164363109809","11976982382275677127","3698650309137183450"],["16707800312395540124","3008165085775604686","2641747930337327739","6652313142092596343"],["12166908545339776149","12050471608094460698","3746325558397949879","10103201521334869971"],["2518338572158695748","17286420880593720029","200886571609860045","6171713004408685108"],["12947321720810984746","17216985823521269565","15335738320474363751","8200608298977128330"],["1828994021896739212","4633820623994055563","10972539855878278194","8150539161347350870"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["9285865767004826284","17226014589645223453","13079863458359801167","6983496330428856380"],["17116600446395408693","13171391607070539704","3715854714263401747","12198575517631486484"],["10936466341809469133","924010501334562129","17673952115421361127","5199272398950863592"],["4572003455604937139","5365328962984969005","4915903400603747186","11995367828627729123"],["6847891049673995971","6158194508209760684","5878316692860927957","2215274243337632768"],["10173582263934107737","7130755631429217773","4103086763044873498","4130201118351440666"],["10304295804529538450","15724890188689734156","9035142602548290502","4978824080738202465"],["17929549555963273166","17545890860192314355","9627115195389748959","9712524097521636389"],["1044895122846024167","9900711444323211631","10754096802764298344","18380234830825236044"],["17511090344821954292","9311015227828164127","8529941871281462849","4812065974387869454"],["16732352483871043239","7418503279890151488","5976342835684535114","65376463829797127"],["13464727131084944942","16495790202417723074","2280253868119268739","13235129422250099827"],["3707093403487743069","2235754828285962211","2315061475348953001","11238700403322415456"],["12380933053654138892","5313395800151465238","5552480175336468015","15498635459684679924"],["4975246935988789813","12263667770815671079","17852206817955377236","4195066182331966781"],["8552767768789613238","8397640631248039815","4533814267210077049","9183868266348413931"],["12546517772948610189","16283086334057154541","11407549108937547588","15516481357389464369"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["683568858535880211","6009105892238117721","17360631661865825831","1582400079440964398"],["6129646163607116037","6592133594050261882","2638030795505584889","11866759195152704743"],["8754921459339811036","5528551693446493070","5529693509767334404","6180479718234892960"],["15055428584183460721","1222075692202233920","5254333254404651246","5984075084589639520"],["4213580076567871627","11959761688408824101","707672594348303255","1590756096515053921"],["1619976884207100030","3955408541081819518","4206017451176651995","11374289175117161774"],["5940187008667853054","17865941830320590622","6129158683990980830","4795438352840741590"],["16166956689173417935","13456705650103179447","15139417635085535587","8695784616723416681"],["13041324219443234832","2111063106918365888","9959801232132046613","17817054484889991633"],["17338173168128934920","2193443586993941896","5272523274538461156","13360165422309836321"],["7712013880257521138","16100867451310023627","12866349829953248715","10037929793565548949"],["12950666331259696842","11832569351551422080","2903490684517713183","13908929149036484874"],["15140736687857278594","6728858291945529219","17735316353871283911","5014566167793877293"],["12380933053654138892","5313395800151465238","5552480175336468015","15498635459684679924"],["4975246935988789813","12263667770815671079","17852206817955377236","4195066182331966781"],["8552767768789613238","8397640631248039815","4533814267210077049","9183868266348413931"],["12546517772948610189","16283086334057154541","11407549108937547588","15516481357389464369"],["15489489847588629974","6322411974039848544","69360912978396740","1189820169829756475"],["3306853136230197650","15574662373742667761","16894479604366520095","11747005676942263947"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]],[["12127795208644257195","3645320856880594931","16350360002016337128","9815004193901794964"],["12712786921175442105","15418511008843625555","88409566043232533","14337668122410955918"],["4249279086297603892","13502826162046235255","15174810018730775260","14784395186290233959"],["11601091861553515315","7160805382494384468","6836170359772141131","247470649499033166"],["4288529216819650334","7013927539668952761","17997191729477805258","11964482684879801217"],["2666596626263369633","4642196902594611742","7795881948379277682","7371250647404522351"],["16260321434562403168","4205833876834514786","2146988747088154804","14583111671610981085"],["4211741003756034149","2746080231385188218","5881079623161675793","11355381652911837364"],["14626187403933244181","9498204522941190405","13767197492470844645","563802389596691161"],["8149138115923894457","10618676437536047819","8944744866907220182","6824860705735890179"],["12174054783077781096","8722265184885284288","3125761511596832858","13990747738585851185"],["3404829205514051846","13483023074607749525","16922823146488297512","8434899995378043274"],["16645240443261261128","11761672942747170326","13688249208967886394","8293159385041223273"],["14896362765947300690","8907749604862406754","2033591185665523532","4517645172360960507"],["2604653735062441149","1782761555496767244","17217429494860296298","8224691302341590200"],["1134244381638333361","10196098542956470325","8298386124564113806","15874093718190000136"],["12947321720810984746","17216985823521269565","15335738320474363751","8200608298977128330"],["1828994021896739212","4633820623994055563","10972539855878278194","8150539161347350870"],["1936826994754007786","16548963430612334956","7256599335654584638","9609338064875109309"],["2709041359213889277","15224056580479772086","27329528203319824","14324022043119738858"]]],"s0_siblings3":[[["12302675693888704561","7644486619519895228","9176930512358236231","14079272322836241680"],["16165555088574626589","12569056188098121025","11032080830412514414","11508643875797027055"],["12430435991007538187","15140990566628459051","10054359674281643945","11746691586786102823"],["7524360080370047674","13892555767049661711","9240870406735701034","11283923272257688061"],["15637423431048795099","10643740879248146891","2127150336824350077","10688167906940091908"],["3612881919623501117","15061779786818412075","5391502460913146365","3142678494101938861"],["14340981582331858092","13780283583280188469","3514318954534822949","12692928508505598005"],["6571420161297270711","3157424048335201025","11328673635824584432","8057531104153729294"],["17643290182584392957","16649994277849378834","3691044855742818884","8153528552454017343"],["10144860263478535676","315027501385477265","10895223574414269260","9376923628577125554"],["7631068240464333389","17690822187359319003","15150171402008396074","14698963809691360560"],["14701213110838398550","500144421726667586","2448668203367914221","15008929221839510988"],["12081477601083345158","7456820415160893454","4535061335283319435","16656423262981133752"],["3358027528838332116","18312443165786339314","15445643124021136756","1940821757244765972"],["6337887030772054593","9835489692967042188","5935895560032431724","4811025422072322484"],["6418411511555042731","13677013856621607146","10964132989605373625","10174207876743593255"],["11226124688579483533","1277384465103536574","15050155473549050335","4224468638195130246"],["18210305032474964556","3342593925421284009","745004479997165882","7114814080408891717"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["17728216127368825589","2418985653227815549","7200847561519812771","9544982939562605277"],["12386547062311803078","13985848880554058342","3000369702700963322","6501606995478367915"],["11144529196887141583","17462556775937807720","12384391132149654269","13323955806364123590"],["11976564883467980269","15887231038061129846","9266362568711037265","8855989787289795077"],["9399805109895160899","1183775250068503466","525674074048123884","13670897452942532951"],["6820877306208222959","14036166755181108460","14991506938117477604","2195046000883922725"],["8506312746820803329","2492731547704438459","12063366209415986385","12538200104068796428"],["14339882513481223267","15345378365242719075","16421875840870459194","18133320025796606989"],["12587351759970317401","18219178216760342486","6965858882332724121","4981687158500458788"],["7119927614144261459","10927777879171987057","17761292993627152108","2351151104047950879"],["712987848733688925","3412877213730198024","14240095672170762702","10382725571016444404"],["13243207763835279192","10653530677345406833","5112871314071792678","11053915354410787287"],["7864485425912268498","14849011735327654928","4830776930122245778","6476923994384029028"],["14197494174606588702","9536771045265770727","10589042600037286388","15687476536600291385"],["13391586397020692370","17275715361839157335","11115008422695557016","17711739644016349473"],["13302235236331385396","13584607086272959015","7622606537258887510","8465326699630062885"],["2541284364314848424","9878566250521250273","502886742075003392","8084318113016435795"],["14486701354811627543","968362936060400003","561239040796220865","4139113992246758581"],["14356485028379435832","8655366826391592598","13940011529143478555","18097197584922044267"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["15380526993397725973","11490123415236510745","1650432315634956419","604979086593077191"],["9411470112005225927","14714588462503282927","13961720011322817151","12875355816599819842"],["11523086479230688661","16910364971939581890","3120776366681605151","1052525918317888191"],["4970761234324374491","7768585956884315047","10337056147566626097","6408502659025394120"],["4922941665164909702","2276868493990708508","13948927135774675087","15060049235307875605"],["10700745896661062993","17768225072383512145","13138500538658813703","9375462629146574346"],["5314738441073665347","16387698496475370284","5910232291460779246","9865098768975107951"],["13883521156331100317","3814593645044785174","63395184423596305","11761072113166696599"],["10409581752977241926","9958626201225191846","3264866497115612074","15762414001256608884"],["4151941818889446180","2331829757967495725","12949895526977181487","2428533424954713279"],["1321371088001286415","13506258184125613087","11587050686163113962","9416933358476938678"],["12234512276428512395","562651625413627077","4492167688985621173","10636204484629808663"],["14445732902431325928","8140304562218213496","4580195560287550438","2632788456118785934"],["4400854754203384627","5966591759237519481","14397240776761552428","12869233446206992768"],["4115348605951915354","12886873246886809372","12815857334985616406","17530159910353918340"],["17458784091962225480","1800872707643928268","308315955371261798","840695675481714361"],["876856949266344150","18269271881212356109","12565837246817349726","5141782863336742363"],["14486701354811627543","968362936060400003","561239040796220865","4139113992246758581"],["14356485028379435832","8655366826391592598","13940011529143478555","18097197584922044267"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["7028938956991912442","3266816903412895400","6659028343832396514","13366332857907499533"],["11542372790071567244","14325313932131003811","15788852888838093875","9592481586190790425"],["1264183531112916628","517649156791360564","14421451405061420801","13392873890902165405"],["4872751851221398044","1883929996168948029","16181268013636677796","7460639754222793863"],["11792780164205007067","11810965336794896848","3621621226143862535","1638054690162929328"],["649435154768061596","14685517395986468739","9070726039883315134","3744467733663916067"],["15292631952177259616","6079962823908638153","368354167451361163","13591134836639977008"],["7969478622943154532","11698896210913684533","2320351301367545300","2680790796499485800"],["3817374968731824544","11545280874159282535","11797891110460162192","2176684604254492467"],["2599130137677420698","13926523814248931657","17494946603700237837","9022331277811638983"],["1209950587192849833","12085736685124220602","756347593029150783","3480234755842767270"],["8487537282043125258","1451421674307117483","11809674508471686695","1124656555063129543"],["18061795271163208268","969151893704422717","17616928133523235780","3846275291939531134"],["17158168039048340192","2898441171660911203","14044086933836005754","5290492127324390331"],["11450714122831093626","5760857224194394821","9073407536425264091","2730503461730425661"],["8001143025008475389","410016560126437861","4630716509370793223","3501287169448410856"],["6722357056806048794","9329527258319846661","10911464354380594855","8635797313379592525"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["3682546007327337493","3028888058461878185","18239096377186826666","15646621272182218359"],["15031180527029637510","8013100968207723248","11081360964952673103","18297268186315009597"],["14609938362694350026","5620547130353583201","3943217655141429776","14433172934286587324"],["6572696474531009099","1967186638487744788","18427121364291488548","10152753024746381103"],["4748796435563442975","17047920515173092198","2686325822003344023","709374309134725476"],["5862664066216040606","15081530404543132026","11179043957255930514","7483342051456457268"],["10014560971741600673","15905711532620334993","5068668356297247286","2609039557313308502"],["6217154022460052923","1940499330669074976","7625913783230280961","12039455322793978601"],["6579494660684834429","7494540057979353120","12412408187198516257","9737505750437613672"],["9903478648092538075","16023465603083184140","14270797196664379250","16607149410824361496"],["17180596052364560401","13166770619466558817","8386155847993231066","7384774436365306455"],["14902699581109108230","14771241575035509260","6751207914279175025","10501918174472938158"],["2641960341645219524","15801782590212929515","15004465812314075119","2359611483029912032"],["14769862419806045409","875249317773006469","14192970670388613494","6172402960611674743"],["15308419200748223907","2060449078611729124","2991153332102822003","17745856910071029435"],["8135666292639544476","1331558397197732001","4968512129377843616","13222312159734791568"],["9161267023606792633","4199094783864928331","15848689948799209333","11192191797771297640"],["13328744049191641174","8935060434204116106","6959925339013998333","15122615061969911164"],["13348086681626181054","17456317703268065403","15362620621176668248","10321505291039169528"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["10647435458995256890","3886378499150761427","5487190427467606396","11160680459082260962"],["17144960684274560053","8569171199604806247","8565700807918376041","639949682179997740"],["11949035007261346590","1190703801100382069","17093758951308859941","15216626768490632398"],["4091294438372572484","13733091951182232796","7262134271121456909","7116433459782578186"],["16131711433119688208","11363778215534732493","11083243528638701486","17332844057812379667"],["15066363702708668711","11426627091732263817","415643107824410762","7762562001794528494"],["15827809856269231356","15686254998784822600","9437816258812681812","14450413361458618189"],["16084484248727938269","8555259488971067362","2474025126553184538","2982134895923518693"],["6563775623044248331","1741226790655832843","10702326684715557117","7351426593283195397"],["12664569881875276818","2807756593972045672","3099118404726977105","15765656468700332048"],["448287041695274811","11685308772068701152","13038752985299307412","8299843817528021683"],["13522084303001574283","12891329494294180","10209376828857441490","16003160175206816491"],["89204427149274970","505236032241242210","11423588579197196930","3394538796471601312"],["1344706088541740944","4683573488773326515","11125946152816029123","17009031368491054839"],["18235639733358038705","2715789701488352190","16637508216276704059","5360037260887504247"],["4091539926831381803","17403861116798036963","16795937494003054208","9658473321449718840"],["15156870837687691931","4380297543063237888","15785962086073825108","15556907819329303857"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["9671559769400878520","7580563734933359609","6899341333375649790","1233467653186178890"],["13133273900871062007","3898474641588545254","18019084963121139222","11032064117395076582"],["14320948781571610427","6791141547475514536","9889095749952484349","4617031898139271438"],["13688189696855114395","12931068741857357472","17916261781834397688","10768512777647587857"],["15839568933060740381","7704765710850877117","15334469658546296977","12158262647702400862"],["18168405488796475310","13954876021283114816","5714919421526656463","5249691157381250971"],["7275232443990580552","2676603183682891375","1316247453712504085","12218313038580591830"],["3202268489836061426","17686786268201373688","2115896042764840359","667557938389639051"],["11875664343292642145","2125019781728656008","9005152820324926242","15267681021754456697"],["16677146093109948688","9513620881271826303","8497760732133120073","13609101983990931845"],["17982334549420987862","805123546965932846","7001348707612988048","15481638351923506216"],["2265169000096582208","15002525584516757876","15103387502781870268","3199872434865640206"],["15023544923954417220","15711827340999306294","11268607936124764737","8136847494946647615"],["11780471942987807864","4061811744755799899","10427611512144684958","9035990239655316226"],["11860072667956093398","229308955055942912","4647551169237205749","925937695737968888"],["15405278817926499922","7365680315647229387","15215061451844634893","12877219362695932747"],["10259909002131995798","17965389491115851490","650732273539164367","1870321945166848480"],["2225869864237818709","15972857530463741647","10198830764594393921","16786113897608605302"],["13348086681626181054","17456317703268065403","15362620621176668248","10321505291039169528"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["7468643238945304624","3234116568289038851","11043587219820969048","5875173257238475716"],["14551524201681620620","17860061520184312423","13685353736631880870","204877853565401424"],["5437255461896371576","4180467078231273951","16553694578579889598","451189588717454347"],["11225244883622240690","12651992154147164369","16688815409059521058","2198609502553024765"],["17067772115853631858","14193444291802740791","9435236445122780821","11726284039721084568"],["6316067883961494862","18299224607041313926","3799523352870956176","12080721666984267853"],["16795572581707749900","4675737162369763555","9065621309976359268","6380191319510651665"],["16385090190212681657","13785746970168060004","12297674691049848617","6157889084580292211"],["15931628270126702647","9030665258285586392","7314836251730200286","4591258859562153328"],["16795197570899425601","2891704897185812124","4285186713495882735","2115975444038186189"],["768966693212952220","13014769441908501420","11437128145269266435","16045891009847541779"],["15132569168874568960","4140657004188687705","7662449251452520922","11399355562611576286"],["3998811187403370162","12181243924543189644","17599905400872071669","14134501282476782135"],["18235360144292969158","17436349678695211094","15802838713828448461","6833473886857732969"],["13230137273186508157","6305653629248726342","15144310139846108637","9382558503924776689"],["5459992320839796566","4510903192143316376","4012649245744608152","4706033459860705367"],["2757962810453681389","17199817302676866135","18106695155409528002","11747408244038324796"],["13328744049191641174","8935060434204116106","6959925339013998333","15122615061969911164"],["13348086681626181054","17456317703268065403","15362620621176668248","10321505291039169528"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["6392309544499715810","7138738443440875245","16255745877373378731","10048932184349017912"],["3259745260402961911","4499391317528673414","13639078496427111400","14031445363407929020"],["10379523729839925506","5548027867563423062","12195724537440581899","6548348091304319206"],["863624944032222635","9420272772549155267","10548751373954209920","5311385871483619339"],["13641229782891992653","4338394868806658258","3341864872232226612","11471669549722129451"],["13423662015673672797","16188372395951803730","3027935660801201619","4494690334929445792"],["8255137488430652202","17254144456712627341","890048581247046995","1445800726744116360"],["8080021224074091089","14027455141510506915","8711645631834265791","13267729254517223470"],["12470434400372310444","4608762589028908458","15025915284053935523","1999110543798063672"],["2035676080643411829","16872577523929224319","12104538694728991434","5336960714254217978"],["3619679159560649434","7717385150849734237","2367371489132618270","12135694663372257471"],["13176305373365478906","4884975779169114409","15556664895193790848","16946016340666811919"],["4950884239418101216","11855327220674071836","343319724707100623","14768129643588860186"],["10903233133910163824","4857546192744025793","8859269862197797567","18343161325097658036"],["7360407139098667468","3055053918251656118","6405598591843344865","15633489107526658676"],["4434052165815582546","8519500640737509353","17137606934580201450","18271089352175115693"],["12421935786681258288","13435251239734825657","5652505526343430361","5376394132233244836"],["3146949523484163824","13498428094086137675","14109922650536184662","17879357300655503514"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["12326691940536497883","3226391689405046602","5287399590889390441","2420369267647563704"],["14400193886145544516","5111967215996040162","15397771749807566572","14379360843108250017"],["10969343990373817900","13647305200770523123","1678110211261992038","16356588275017691783"],["11210744407340616822","14201523114740693961","13466426788043932760","7946358403651259975"],["17912064297036563889","15880693948321515698","1846916219188930756","9816486585878160133"],["6584057443175632110","689773925611624249","5435183776586781063","13261423764784113181"],["1702202946848274678","15818158774926372310","12557580818889437129","2417954365098564277"],["3244777010460989197","8248206319284119648","9524216574519557176","4821950076125837333"],["8412925198134754043","8775528900457874806","8964769597730177359","9334902513789891295"],["11442275755231393202","5868135334305708978","10947341699608721699","1491106958850871219"],["9220716531943583535","5296663245908346348","2705738311266229287","15642435097417569578"],["11051495765502200728","10477064002501256168","1716996580661915722","15439260788066379012"],["14445732902431325928","8140304562218213496","4580195560287550438","2632788456118785934"],["4400854754203384627","5966591759237519481","14397240776761552428","12869233446206992768"],["4115348605951915354","12886873246886809372","12815857334985616406","17530159910353918340"],["17458784091962225480","1800872707643928268","308315955371261798","840695675481714361"],["876856949266344150","18269271881212356109","12565837246817349726","5141782863336742363"],["14486701354811627543","968362936060400003","561239040796220865","4139113992246758581"],["14356485028379435832","8655366826391592598","13940011529143478555","18097197584922044267"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["5664630150603075753","16074198090465781006","17580015998279349098","9282972908234539871"],["8969013100617869275","12892247427613345409","5607106730871362299","11288829249762389656"],["16068715948196158846","2125614427201993572","14689026225587052540","2204077283996152585"],["6665030257699554687","1707951185184746768","366124080063524334","15462292596013012840"],["14999465205355503918","9464920428680643573","4531467362103983523","7241789378944668286"],["4400230149263508962","11818896881780407470","4216671762454812811","7813211093792750213"],["9657120868084716036","10188716351133698331","10400029721581842432","5942195994795486981"],["8323189749074707427","9594001133171105040","5659983515809037357","4498803146524084077"],["2651507050595471420","7993212418494593194","13804970969699156464","15934376939291531297"],["17852971220860593789","3167800931137800134","8111803123735229574","12984273984043661849"],["2491828180939968743","10657141447264565500","5302931831779460149","4391289894765774345"],["16829001046928569744","812445032317652061","17222313379917290304","17402434777956721853"],["14407820129180830471","5765189655613684397","10793990388857649545","2834145224121285101"],["10628108501979214525","6865300287638292542","2596265803847651189","13926401560458122902"],["15451797574348424723","11924989015124846841","4365231324365699061","14068498827871183063"],["13302235236331385396","13584607086272959015","7622606537258887510","8465326699630062885"],["2541284364314848424","9878566250521250273","502886742075003392","8084318113016435795"],["14486701354811627543","968362936060400003","561239040796220865","4139113992246758581"],["14356485028379435832","8655366826391592598","13940011529143478555","18097197584922044267"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["12485243260847965327","7414010152520447616","741865558986060875","14284847960811063946"],["8665238691607807181","784265917679657802","9448794215836113552","6986379313323865600"],["18445886791046319638","2772773104617274961","17327581517721679336","3576107894431826507"],["6015349804285568380","14391169155445423645","14198295316483758542","9636374625637002997"],["4259851681460331271","17308534707245536376","10209063941930692847","24473096411209004"],["3885598168536704822","9043370474514226968","14982323348534836742","7535259391455710067"],["11705142982127748720","5492535634813733308","16662319188279134699","11319882837523910737"],["18139209498079258873","7151394029824823850","4666502181640837167","6203620908706159898"],["11724485730667090154","14441991049600774746","8859405633409387662","16999912561115963944"],["7811610293722364132","8450668651751978620","18094698226202946189","2315608885922446632"],["1106780269892800042","12680789362016724521","14100441050256156529","17911460874552657596"],["7487776976366439667","17075004387201845090","14050956565859080136","12785787895780264094"],["2456626738344335779","8277264347677044876","10729134914508570630","18216309599199716741"],["2548450645662896802","16068544071458233510","7418230362363535611","1419292532871466680"],["5756041624043968694","18247538533616054513","8828483249548067801","6712287613277293726"],["7674133978820865863","6979652382481204640","12362336183065196552","2791762042532505727"],["12421935786681258288","13435251239734825657","5652505526343430361","5376394132233244836"],["3146949523484163824","13498428094086137675","14109922650536184662","17879357300655503514"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["4032866560906628109","14815419501805691214","15199456338005552539","2806416709077722263"],["5519105998163916486","16894442562735395422","14030031540381662575","7617292500946978450"],["4110280046483867300","2522195172491564513","12480412378553914664","14790609113683640999"],["8803253193383507541","16048594719783788395","14709918653728050131","2471563441385570358"],["16803670763284714906","11133992984977123085","12393301365780608444","15091281364971595851"],["4835137432738983952","5692362222535480916","3951860311464574660","16679674409900497174"],["6885013177867032208","11759786725053076315","939287092467391803","13934706609711925507"],["5022114903596896345","9730976633653018417","1222972843603196454","4831814603306202977"],["15508182254577881232","4105447883811429088","7716136625064520629","3083783530809615406"],["9132690523171946316","17703642360534885845","8053508281840975338","355097199635481024"],["14668571111829554369","16856590607650438100","3106921895724043711","546314965001043332"],["4215362943482102124","17244918621152588283","6118551615933863676","6508609405973095875"],["8782569929246554365","10144989285997469966","1847878765282402165","11567023578712262472"],["10552682709364762533","4639620570298282694","13151802350269210538","16062432469669398275"],["17767255829290536125","14110327882937972467","11494183403963536085","17676644861687274376"],["6888289313060025586","9197552058485694311","11727628489508524546","4959686471142982008"],["1568244323274402217","8316852528974254414","8179482327518416420","7278868269868508859"],["4533632575793368317","14513889429017386091","7614534042301268972","8625576741845065083"],["14356485028379435832","8655366826391592598","13940011529143478555","18097197584922044267"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["13262817553964666258","6028749384892523182","5322937812218214698","16349364229693643603"],["5058967365029856374","18163950440469993207","18405877399461101550","4319979315967359988"],["13682351297571534904","3300529180164196004","16362307604908089996","14070142080516790196"],["6123351124444254681","10684307437248956804","2789880760692012604","4337502653971264761"],["18141822684409722152","955624686148613522","503363025394695471","13646460081472977215"],["12260508586077234144","8054143291097680291","18350106672230122338","5058535683099485626"],["3170766587772477541","9545973718104098675","12010002621056726239","10738221073191510627"],["15798532934854539926","3798196971216253218","15668768470576807548","4111736598533642271"],["15294793677670391104","11396194833046479696","11701858939271139738","6017884836216872730"],["6478974309999663537","8340348957020180813","10993453027919005920","11665953157348990210"],["5623515156411234913","10483785036303211416","13430747396211532473","12311327998978972470"],["18378852330115172903","1640958443156182295","3336542347951812246","10812401660502161502"],["1901273292496116351","16316066549674062031","1707889054418492638","17195759458914195653"],["10814495356251478171","14596814424579280113","2977980277760781440","2840175728466092652"],["686036122493219897","9647514743227732473","8871836726786772643","10696237499824923096"],["6632012972508105991","3982758934525209489","4454277104658918601","4095207100126223603"],["6722357056806048794","9329527258319846661","10911464354380594855","8635797313379592525"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["8750090045892896030","13754846796384498002","7901831571484629931","3329533405128586502"],["18144147559975407870","7387530458703420739","7099328940307007594","11212530523486735072"],["13408708961040220837","14833338875380553754","3067024978704516840","10262494298543530915"],["12016178718495606845","13083673602865684688","5487568621336413731","16971915648419305637"],["10094867077561844330","17819686222773725786","17777705075734702875","14654529219216217530"],["15252987195452619057","13024178954313694787","17796599156738973587","3341346725032187823"],["3886972186751641141","9389562688151987084","1085274064898185770","3043548137263342885"],["18352030237975640581","649859316355955473","14054291477595449271","15180171749771173438"],["16353802831201677348","8712775664237719409","9553969317771665771","10398769234119568"],["12897786549207725615","6367629785213519747","14160602635442709008","2163655155774424525"],["8989133677246628333","9313083516820476550","7128028189216280026","16890583175402661797"],["329156674676420080","4445058372182608076","7314595717720877060","8856243135760333240"],["16264754108679703629","13820835997753362919","8977490671078314048","2110042454768188014"],["13802055106556315188","11719563937867305545","14206921751880516351","7689396682514766442"],["827722884811226551","3829972576075574690","12426786972437612201","8369709405004871148"],["8381212969649157765","10103073606847836080","13278738086177144286","108452427417105952"],["876856949266344150","18269271881212356109","12565837246817349726","5141782863336742363"],["14486701354811627543","968362936060400003","561239040796220865","4139113992246758581"],["14356485028379435832","8655366826391592598","13940011529143478555","18097197584922044267"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["15368380646327077083","13655262724701422226","3861830034341978257","11331670503702641619"],["4835379936185904388","12048879764891934219","3985643370442997896","12429855659004360561"],["9038599372078461440","1257680812558767156","10751699139332426827","16914826735708614929"],["13392542219369415205","8024489399434153040","17234098440430376730","15830367751285563355"],["16086937793762721551","6328474187742439334","10450706220421554395","12041229952274634821"],["8448470075879954415","5125454826301751788","4691599991882710151","11377296311537925278"],["2150479225950907300","18193271541744349717","144593703164383370","10502602011416933622"],["11490065653512919169","3666116020675233749","11894097499433790146","16447274178672380558"],["12624707395035128357","7061394275836228422","2415518843406674931","6192816079616295194"],["4845519094403122990","1561410270625257897","11726522715245134276","15156394915581419064"],["3496660280412735368","2348894539037202","6781009697434459590","11999989190644644988"],["1596563544975186415","17257769553213159308","1636219053832349594","9255394762034880203"],["9877436840973939985","3626263984097205701","6948992109932175310","9305040534747572449"],["4004262434058565563","263556487483417405","6195949844304327660","6241682555895884687"],["14062275584318440450","8942274152538679928","9903276939788314621","5053819170926567957"],["9341987912790637054","6172024484708567208","2835176926792526078","345818059101073425"],["14711428732406851932","5253466748954630731","17414802194191806682","998591967143184195"],["676126469966429376","596157119412447469","13839629098825305496","5593022159747370291"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["3967396141046770525","11756093856815560505","7526784529606560311","16997946706461136092"],["7805812227266923130","12391288461687336842","8362081913662443555","17571220572579040024"],["10467925202083323921","8534057859623482851","7872067664843755842","6248229321670588481"],["13241020818035356920","11297626715307812544","11873220105471659549","18082671924310153503"],["4930203165393518124","17768416267266877051","916471213779179821","9697510579250896290"],["9208283209242173707","755378847870342468","18060295840964832410","13948319488783395946"],["8808577861232376176","16876776576019293420","5527587024988769005","5579631383609255326"],["12947155969565965653","17289966273810747036","3643111848413391654","6867159782714686140"],["6883529962124456126","9859009109769634089","15493211778150357991","6541572990790155627"],["11538986178471380667","6538103544158381739","16616563189335853558","5259074009252220658"],["392620006021089986","6992753396395303813","9906609941988164516","17946677565952361149"],["4863421282208468792","12117503100701950492","10047937678076448975","1170683543503002775"],["11056512506005382487","16521645581963584805","11365019747400624597","3494190115764647500"],["8077715258864271199","6906619147933055378","6959954167315691795","8512722624229442434"],["14062275584318440450","8942274152538679928","9903276939788314621","5053819170926567957"],["9341987912790637054","6172024484708567208","2835176926792526078","345818059101073425"],["14711428732406851932","5253466748954630731","17414802194191806682","998591967143184195"],["676126469966429376","596157119412447469","13839629098825305496","5593022159747370291"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["18349037965642345766","5433469187978534006","13867751338868003951","10044989099989533192"],["14955632569664595180","7523435728831994418","7329842781622381757","7492253977985879508"],["10179968524301230811","4219723611197270806","8828841343863280804","5180934084645618041"],["7873956575075803955","7445158838557974164","5096374879434332220","10336581944406292813"],["2651578843117366050","11617601706386019647","10409022884926147741","11970058791175897800"],["10822257067586377781","2511678316661614097","9124461780587823660","13678052448180531132"],["8965035941757357621","7327167264796370100","17214738310679924612","11827044306330398825"],["743785292456431748","2470403199507333975","14742179082883963868","6159538034048393469"],["16822995458256984476","12155123912418695463","16186539211822233561","11872414280655793157"],["3431821250996821667","12392771934892519091","13954426836596291875","9622417815877760341"],["17664178637382136597","16414343746467545203","6425568281863805322","7737558323120788246"],["5779855453147485356","13281656895071814293","754157206322455852","17898147898839693367"],["935197347269013244","14913223447962608463","5800527971422082085","11559617675581316338"],["12419548295753539278","1988358360517359792","8303039097895098314","5594102885863688236"],["5335504061819870606","1004281555993412965","6916068207840890723","274904761457516753"],["12227013043555948142","8524176856963004032","15021419683398462043","15154565290763714151"],["14711428732406851932","5253466748954630731","17414802194191806682","998591967143184195"],["676126469966429376","596157119412447469","13839629098825305496","5593022159747370291"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["671074168724172217","9225549199097466183","1252556422937669979","1461740222212566454"],["14339207523055533454","10806638586414250927","7688851286018181697","12336363230110063182"],["12435517592424713073","16694371835673598508","16859245745395333543","4880484317796629221"],["8312933286070722647","6991324413920229323","12305888913860424655","16448189750104710376"],["12439952790182942225","6666362307218541046","11251242150411787043","12761384377335605101"],["8236555249269404200","10730856141389276024","4900392157650152406","5986666084809617139"],["11094539654054143192","3919349933378932630","1571168124189105572","16917852758813221584"],["14167768878052916169","8263761909589078651","14000550010336361965","17771508904092905560"],["18029749959809676386","7479750166874123425","12064329418633347372","1389437176337794662"],["3562632480712411395","7015397845314717292","13997034426694160174","8756179753415515616"],["4580895151962726196","3267981070457517269","6664663213718668012","11388541109149806652"],["326714580643337534","17547624757770435752","11142292657595641173","1260276435331815575"],["9083174769220052467","470197727076992854","1641128784006441674","17335632998009000413"],["14016540575723522045","1939526051211452945","5398836910285546633","2810686420179811541"],["15451797574348424723","11924989015124846841","4365231324365699061","14068498827871183063"],["13302235236331385396","13584607086272959015","7622606537258887510","8465326699630062885"],["2541284364314848424","9878566250521250273","502886742075003392","8084318113016435795"],["14486701354811627543","968362936060400003","561239040796220865","4139113992246758581"],["14356485028379435832","8655366826391592598","13940011529143478555","18097197584922044267"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["505105100960553436","14638314851144958209","13366797110871298651","1630873582547609581"],["7735954783913763848","11833068728724493446","13934052480607796598","14992841722302126397"],["12851164450104327738","2119336809948581473","8423461004739901726","4077298459443312890"],["17703513599373144947","15473932777257387167","16862545792872865564","3866689826888897670"],["10426775258598551485","6509625615809963614","17415987204479990778","5199755978764328056"],["15431399378180564224","2045419772043615392","1726221747443826075","17241507564240314848"],["891035650102273796","15070946465297217789","7676111766290738212","7620699299131540969"],["2716877069383718672","8720059080557466588","8678848957440533434","6847526513637820820"],["16789030366445878882","12047874947481233794","4664258607229669930","12613611907062010229"],["6763438631331550830","11203836561801451255","3486428760517422896","10772205079690842379"],["18149676690836643089","6672667282685749069","11361965303276202065","6614712779980747319"],["13010688360931391636","12592063838442195303","7980650262899278967","1418067809478076711"],["4246293855318024058","15443278315418039649","13947704048479488214","10884256066782939859"],["18074828736411073541","14324419604367877078","7629196033563912107","10127930132736364125"],["2532307237211071193","2661057135609983751","8500465301948210323","1810690028251252608"],["6632012972508105991","3982758934525209489","4454277104658918601","4095207100126223603"],["6722357056806048794","9329527258319846661","10911464354380594855","8635797313379592525"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["4475875031191397802","16098207202938173209","11215433136988377015","8195296767484010201"],["4889643484300579066","13189794026220156892","3900477541798301246","2736944351144960000"],["6605295783611282032","8140228323662524691","10134988537007223477","14442575269399258592"],["3132474536159978958","7324945976119504741","14165844424391152482","11021372474709808272"],["17098697622625597536","12521392019318755445","5961916102762571709","6462986862988293977"],["16989866945525417803","15259076959331812284","11341331839651052481","15873048737632180950"],["3091580557200877686","15867123195083290313","994103741397119985","15988787429527561866"],["8462036215868412604","10272428046554762845","4807201431230302512","13767276760220452405"],["18029749959809676386","7479750166874123425","12064329418633347372","1389437176337794662"],["3562632480712411395","7015397845314717292","13997034426694160174","8756179753415515616"],["4580895151962726196","3267981070457517269","6664663213718668012","11388541109149806652"],["326714580643337534","17547624757770435752","11142292657595641173","1260276435331815575"],["9083174769220052467","470197727076992854","1641128784006441674","17335632998009000413"],["14016540575723522045","1939526051211452945","5398836910285546633","2810686420179811541"],["15451797574348424723","11924989015124846841","4365231324365699061","14068498827871183063"],["13302235236331385396","13584607086272959015","7622606537258887510","8465326699630062885"],["2541284364314848424","9878566250521250273","502886742075003392","8084318113016435795"],["14486701354811627543","968362936060400003","561239040796220865","4139113992246758581"],["14356485028379435832","8655366826391592598","13940011529143478555","18097197584922044267"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["1664665094713553138","8018355721912132177","5635308661340513582","18125271328799863903"],["15490523333350352077","16367248776002581558","204640598271095398","10135731257065566856"],["13521563657636911255","12269483279174820539","6612173492952539285","3379983692956618158"],["10179911263680435139","9897504916077697265","7752429100830127963","13593916128952632811"],["17572882100856748430","15818193225995696634","9801775542338402584","8080295688778436274"],["4767336241709980790","3535631076821880194","4403605572213739286","8563425278825162647"],["7520751998013527736","8648099463824274807","3924916330156946040","14261946246210890312"],["351814971631464733","5167821946024122055","11056276794861324586","15451847715306946108"],["5471218412507330081","11642018843123918631","16276629921681557074","7988800657021633870"],["3403967536357275035","5928355710154073755","1574861036688781916","13942360042753552371"],["6199972422696227115","8459707369543598503","15580643353222147524","30198697379082546"],["6467233061320426065","14036352811466599363","15841023876856977853","11649730075733551201"],["15023544923954417220","15711827340999306294","11268607936124764737","8136847494946647615"],["11780471942987807864","4061811744755799899","10427611512144684958","9035990239655316226"],["11860072667956093398","229308955055942912","4647551169237205749","925937695737968888"],["15405278817926499922","7365680315647229387","15215061451844634893","12877219362695932747"],["10259909002131995798","17965389491115851490","650732273539164367","1870321945166848480"],["2225869864237818709","15972857530463741647","10198830764594393921","16786113897608605302"],["13348086681626181054","17456317703268065403","15362620621176668248","10321505291039169528"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["15409688775939929168","3215901911141719265","14332943806320871277","4800073297555739383"],["5336067968754811265","5321778163025921148","3432291069927208028","635536894985832858"],["14086242681822800445","4450392666106958154","9821637472306469870","8316765871132455599"],["13134477278830648666","6660684502936419221","7669816043789964087","15752804695971752074"],["13778858275950686942","336332387561987346","14968689918129573954","15576212259653075811"],["1060249959612805876","17701842844813879389","3230595062032610652","5477387108266519518"],["5901221922596639175","5351804284371388740","8521556626435554758","7117970913707190938"],["3511301289877438695","2847754475490679911","5098468692381729011","2476066272454566939"],["17624772053774755677","2661194485668099932","1782245517864938","12074919953444884394"],["11229137585313029859","16097811962301876854","15007133562339085081","2934264390343530842"],["7150887803423837846","10902536209859933485","13251996652671341742","11261770941509010730"],["1018698173950260509","10875987618442881160","861399904207406387","10719993377958034516"],["10239142261467520466","1704290420703681907","1433867053695241021","8688740815765045669"],["16249749790152257060","7846631633237701909","15588572162883236992","11510379086572639267"],["29889625856305950","6412638575954460305","6801179427335202398","6548838799977813344"],["12227013043555948142","8524176856963004032","15021419683398462043","15154565290763714151"],["14711428732406851932","5253466748954630731","17414802194191806682","998591967143184195"],["676126469966429376","596157119412447469","13839629098825305496","5593022159747370291"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["2429950738700102551","13330125621868414606","2974480632860589910","10731296293892124106"],["8923274713869993072","14593682497432165930","11870095801398387447","18156560189443929996"],["17525344688791687620","10645753637001957656","14394717270524691979","2778273445080074171"],["18166088906344550984","17273364111005094545","15234413343207451675","4316757189394913540"],["5176844053674668420","419326797521344863","7540979487887731861","2448842777260947553"],["17624709160983430398","8023079726077325626","8390386381764287676","7379290853827538217"],["4433369868098501369","7992339117534223919","5005380648341418327","3280303971928462891"],["6492320293360665331","3942807782040555418","18300433489517290310","14233758635007454479"],["10758546720569778169","13295929983129414600","15218695868771253294","8585230259880674821"],["12194830886236663568","6087307238299656401","1200007908139638180","8980803364396012110"],["13622322734082061742","17141598517959030675","18198147837881797429","16201057805693607148"],["3832626704157377858","5284648706054315866","12613594652602334814","12586549716025042564"],["301426905688679235","11291818966539149130","70743556493961448","9953600826514967783"],["5813885323798718498","6870986274409066203","10481871089514246393","549711483025397312"],["599497808863517107","15414407564969078209","3567714041748761756","3666415236525616368"],["8229758361811080115","15305193809847821110","7576434122523548445","6597310085908474700"],["15156870837687691931","4380297543063237888","15785962086073825108","15556907819329303857"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["14826911023837815091","17659815146879909101","18240841889418415473","13592511665754323565"],["2506250046445475184","4496609270036456900","4128477819983475599","9330993171675851592"],["351614518228997187","13562805622579634494","3629009245903701635","15638713010354753514"],["3106252520031583386","13138085766452299748","13920485959570669691","7021951601550069352"],["12409932157888010610","16035815748119754106","18330334186457236685","3133477380250177229"],["14840688318799000797","5555837753604175338","10630336902975087460","9316746444875858509"],["7605283567893645127","4558436247563735279","3744405957673573240","8544912108550349824"],["2243211437562140888","4882118534253354677","13282548534016072751","645698873510178375"],["11669453009414808070","12535921234053479841","13194244486446637949","16033287425600226582"],["5428283165763918955","5386504762306536263","15915578925056912938","5387444515586408241"],["14814598570453339779","14393075664970598726","16700792395550462668","5580458391873638472"],["6322597304743473079","16084015635533053691","1464457488478041465","710580180054917418"],["13890289401736424692","17318468069131968860","15022276119626921330","7811699694787669027"],["15758647265912604862","11427937658735379609","9623546601246372625","8223281706321940824"],["18154278657756432759","17590198504094801362","13883864437076866821","8949633262288813327"],["8229758361811080115","15305193809847821110","7576434122523548445","6597310085908474700"],["15156870837687691931","4380297543063237888","15785962086073825108","15556907819329303857"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["1246313010642077601","7706278039375735376","13941274052473670184","9805068186814747247"],["10922477296114941827","17961219346962923399","1937898090166942966","2739570049683832632"],["2617189609644978871","10793708850892126566","16392448899280957345","18103089493581794833"],["13266803511827844481","17825840652568178288","16122618341265920280","2021250974934324167"],["6849282845105476161","7824399431272041078","3858635769883649985","16178416887305768876"],["12045997550992510333","12358553366951597898","10692201625215583995","6156489678185497283"],["3880605001638540264","9644136840298994846","18055162581082889524","10382018112733804050"],["2529131796083022073","8685767506024600055","10880972453739887902","14960704023588503437"],["16068965230366234377","1592831182141907996","17788507923403691761","3530220856663443132"],["5918386676723122979","1875354397569858349","11848545017650035633","6294186909835047995"],["9977662113808056582","16669258658929123596","6989678880816571858","13755529030007272534"],["13568885049872049728","9434774711775778262","7229674277391608466","13428418951336329358"],["14212400925562382217","1932652727601737243","602938632579484207","5465630679419821386"],["5813885323798718498","6870986274409066203","10481871089514246393","549711483025397312"],["599497808863517107","15414407564969078209","3567714041748761756","3666415236525616368"],["8229758361811080115","15305193809847821110","7576434122523548445","6597310085908474700"],["15156870837687691931","4380297543063237888","15785962086073825108","15556907819329303857"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["1512366722226960658","6292019954466836165","761909332361379425","11238436851309763290"],["4037924327313787398","7917536639139802754","18181419600457533523","3143982399890300623"],["2985763261195724442","9280498602484779585","10546597845154499532","365774892066762706"],["1842145320635094453","14419233341027180379","15418720291125037939","8037126142073636908"],["14628886806245347036","17638396730394131179","13821067056540803590","6379581311967334078"],["6110410554819399912","16613954984487512969","15773305342245648501","6984023105286381327"],["10178400048957061246","12685107453332578091","719236897301193174","6071663749883542511"],["3853741315461803873","2367172600215789055","5989738482025838213","9363490950054339593"],["1064041576848711117","6849590040093734978","1058992404669793961","1285822707914403200"],["4170623975158018674","14312892089824713780","10597365265530670681","9766699042903527062"],["4831358739676874060","17272752136943341022","103703018755148447","3517820701562834067"],["9286141985512596880","7107172642183839218","10549964111969579771","13136124776552420117"],["6518496816758552779","151724392280676960","1696876469486375069","6819609531559016873"],["12088375758932496661","8079269242200320613","12300840964563263883","10577412827400595443"],["13039922029642149552","13306494658682465207","4282922742926595900","17098631139734686647"],["9341987912790637054","6172024484708567208","2835176926792526078","345818059101073425"],["14711428732406851932","5253466748954630731","17414802194191806682","998591967143184195"],["676126469966429376","596157119412447469","13839629098825305496","5593022159747370291"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["4848840891368367020","13490889186484657116","5881875317277398135","12228144061869267071"],["2153465396675087921","2338707779654937338","2203111683345340061","5727961009962517585"],["9305148781323286104","18367607561011031795","17273238255105160254","4280538796868228514"],["6319986872124563342","13041284736557623523","16136623242242681293","5843083178989175261"],["9478285284680704323","8659537346480787452","4709922578066786734","9701836988242034392"],["2306502177106485934","15221472925949385897","10123033319022687656","1857822698872848066"],["3956106553618758068","15989344304514689550","3541979114594678478","1870273362275385195"],["8699604953817367727","811329966255729964","10376329460484555905","18090986604933162218"],["13658010842796055522","14122090027912594219","10551302338044999325","10838214832280272249"],["11061400306429122143","2511779890946788531","2396290194921184901","14273330624880054701"],["2879093159447919855","4240445036672809672","4298103040200453534","12655468566990908329"],["17648544526517387898","14869268794567740171","12029146728357651854","7308366868944453355"],["2430833237544746271","5238195898434481051","14317549856810923018","10011489805772971544"],["11246538830910208790","14993651151367730993","3519865163336760613","18405161242181660302"],["18024300851602207751","3023274540210361734","17983554603052482788","17445689547262274544"],["18308961128844476506","15665429010322044854","12302056158636220230","5648041376570144650"],["8659300634992323985","18293387040398680911","12138855907900958022","10896600463942616785"],["3146949523484163824","13498428094086137675","14109922650536184662","17879357300655503514"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["11302020691500086250","16588475411876164761","2883475802848661896","3638750369083200885"],["1215575633418684370","1272221920314251069","17149454479028311329","10850359546769119936"],["13732812146996148168","10745173781301211365","12768068501211222198","14294184870512863485"],["11033745279874233047","7451017692945024603","11297647369351464077","18401447159287313650"],["13442645649131705714","14587115011034895970","12874716971214756945","17736432165692896889"],["13155115223390358390","6544015425270447669","10578103189881994712","15061941449951448470"],["13047626234586875460","1618829116616079958","4428685102460775287","2614532082847526125"],["18081923875261500091","5565297238440924552","15205627207041666047","13939731260383736913"],["12624707395035128357","7061394275836228422","2415518843406674931","6192816079616295194"],["4845519094403122990","1561410270625257897","11726522715245134276","15156394915581419064"],["3496660280412735368","2348894539037202","6781009697434459590","11999989190644644988"],["1596563544975186415","17257769553213159308","1636219053832349594","9255394762034880203"],["9877436840973939985","3626263984097205701","6948992109932175310","9305040534747572449"],["4004262434058565563","263556487483417405","6195949844304327660","6241682555895884687"],["14062275584318440450","8942274152538679928","9903276939788314621","5053819170926567957"],["9341987912790637054","6172024484708567208","2835176926792526078","345818059101073425"],["14711428732406851932","5253466748954630731","17414802194191806682","998591967143184195"],["676126469966429376","596157119412447469","13839629098825305496","5593022159747370291"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["15281749082001977763","4960516358338523581","4596240878933993250","12534079697262817491"],["5631676899628564574","17944788500547755112","4865022244728357867","1802114294588740866"],["12215999547681147484","9666070462980528380","12763042928285423592","5874588556862078776"],["2269303733339937628","9084808969641707498","5705264268571921937","14262650124274801359"],["14515739951212518044","1313956147457978586","7908883415621945499","11658749585473123442"],["110286375529021484","8740586724670071041","419110872492997317","1148573544406859021"],["15402389040319449608","13692027370948560509","2303296504408990420","16579805796309967672"],["9897002365692727058","15041167509119096992","14002195809983392099","5492828742773408327"],["3861096540491136279","1568537345539884987","1452529600936541502","11255420310659356480"],["1223645014521321458","6381356674933194463","7222872852597996336","14611569815051057319"],["7414114089212435618","7046745414238408216","5459745348091245968","3229425826307385002"],["13338075636891779578","4475622291555482566","9354596652862127387","2439296045478329607"],["2456626738344335779","8277264347677044876","10729134914508570630","18216309599199716741"],["2548450645662896802","16068544071458233510","7418230362363535611","1419292532871466680"],["5756041624043968694","18247538533616054513","8828483249548067801","6712287613277293726"],["7674133978820865863","6979652382481204640","12362336183065196552","2791762042532505727"],["12421935786681258288","13435251239734825657","5652505526343430361","5376394132233244836"],["3146949523484163824","13498428094086137675","14109922650536184662","17879357300655503514"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["15593728176941004682","7601056704153360428","3315241050943469244","10478985099391250794"],["13141997578354430951","12657639871787962830","7683318782560430197","4465282355874124505"],["8845186012316674532","104057709380005951","15729527112338255684","14850848480805532920"],["5072820848742180541","11853514575659833376","3023877807286149387","14672168222162663184"],["10607593742165894648","14294870385045145764","16767857336095016834","14691542899318877252"],["5418055862824555640","12567069790755868017","11078307024093366468","16546056519690458638"],["7142624737234255278","13809026418371207662","8383763832042913876","10273734782070826246"],["17012713052360131884","2848714028491608753","6702303135077481725","7964439836510071745"],["17155064739232951996","10348793385611688549","734570202191357860","10715505148992440190"],["12825166639879413259","18039330597245416004","17458851522778894572","7069230661355728914"],["13344928779079447535","14546453494189499507","8016586252070787575","3890480127984916595"],["17513313138219045859","10031362449889192337","17249080841829486152","7708030013243928664"],["8441837865874759761","2497945663996648083","4975601925371707380","12178938488670382423"],["14242463823725526396","18390732246233981727","10841031994571427782","10783120577132628646"],["3419458757614225243","2812401210792133877","16922291282061214176","15782953460273228298"],["793273565152912271","14179327966746039537","7485461193647216023","16491046371602284907"],["3320001093101298627","760688750402895114","6534845087304268555","13506525190189654263"],["2225869864237818709","15972857530463741647","10198830764594393921","16786113897608605302"],["13348086681626181054","17456317703268065403","15362620621176668248","10321505291039169528"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["3010467110252036049","2720797086965493710","3779729598835005885","13951700415018614223"],["4136712456149150012","12018530941887262090","13516100480977026925","9846640493985760341"],["390771026000989309","9181609880503080164","12930531911763493147","11366431200740067370"],["5629027026741035265","14684633043780077229","15375388849583239661","4110495241564994013"],["10037373782230485022","11985642478505904550","1755895193206094892","6527583137908115001"],["15944747932891668155","9953068189823417272","3266717035208388914","9380506785946989222"],["11670198678043113401","18168401964294837910","10613855760618219930","18103127798364051064"],["5508218149231492184","14169297528336754673","14323070165521107135","1570322466410397151"],["14365111806076039817","6556845150178193783","8659627764528685039","5494501559953359268"],["14747624785581982622","15354894023810685442","16895350597009026019","7631017467735192448"],["17571625634392643444","9719220244149111919","18041966811747098029","17739936573416187540"],["4002878715351285480","14314370535452366565","15254536143057414638","17511571215729860633"],["2203006547069950162","2392269145860517102","2566208830632759246","4576364768575934594"],["17636413933130951320","646015078168567545","8509210885178129212","14074689665188494460"],["2491086615952833456","15872592455895171230","12067004805525460329","9706632984769026145"],["5459992320839796566","4510903192143316376","4012649245744608152","4706033459860705367"],["2757962810453681389","17199817302676866135","18106695155409528002","11747408244038324796"],["13328744049191641174","8935060434204116106","6959925339013998333","15122615061969911164"],["13348086681626181054","17456317703268065403","15362620621176668248","10321505291039169528"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["8708523402335749933","2731740868969824555","10761050455495203408","6856180757009335475"],["14405553451110271724","15374849068531792868","14896272572056717185","13364381907911397531"],["8726149888608051029","14139259950468449493","13193484596330069193","17841851726448687032"],["13416448869492416162","4209489397692097062","15928802777358533896","1796319633596575943"],["15369384298592497078","18237108509217272688","5462632598049551223","16253482434244438892"],["16346955243383463131","11843746102121299911","13260551820946688364","2581402623079483682"],["2400714078532677079","7554927159070201153","4303799290738641264","6055320421009830662"],["17754388700837990080","3181600772274858900","481744511922045336","9876984852947627678"],["14296683990059233706","15063903831792037711","7189657651214022477","11211312894839420643"],["2596769214521785694","7524492938394360155","2614042684033465387","7451229007184982846"],["11446724592337744779","18322093508568092828","1106779251533586007","4257861965784260385"],["7678551610899982751","5212103919167104146","15816488828856239030","10275309540536692287"],["6825888278357408700","9637616387870025314","17482754492312248862","9704589326087231554"],["5472953713611804703","12928764123998688410","7670573464151389476","3370054744545302001"],["15455194664692289822","1638639182738089176","2866686533033194358","528379171447094821"],["11557939062715876625","6087137882853130784","671227286886065962","3846437381629075427"],["1568244323274402217","8316852528974254414","8179482327518416420","7278868269868508859"],["4533632575793368317","14513889429017386091","7614534042301268972","8625576741845065083"],["14356485028379435832","8655366826391592598","13940011529143478555","18097197584922044267"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["8982478560335173911","4711879533813445008","11958873590203182764","5317081815543273802"],["12526717923082393077","17208992647329495216","14627395351017607967","8135355079008029666"],["14697524758208571388","11708610035244982923","17756511900482089708","8538408851358792309"],["3336070988626128449","14480149661845416879","5612392672242111355","10688933752450417951"],["9962395436566273549","6517461502726444396","17461857600928532071","6233432699306843215"],["10154596473529731201","4810789605950714195","17544780464139159221","1970851110583198346"],["17016387710932422171","5684963768579170178","8363917110736161609","9847029131736793557"],["6027458862092102765","16484493671294619288","16608246289720315196","2517775698558455074"],["17479901593850656289","7083864733198143282","12406832760989947357","16669245091428044670"],["13126756628010852765","4703257143296176369","12990438144215208176","1348132205199045886"],["10932445829974721668","3089082106942905877","3720799210355456452","1393784145750925847"],["193984665165083984","15893701762687343378","18126805357773906215","16916941466443794932"],["13972203137247775007","13864268445343312145","12561898626399445667","17914812267029037329"],["8077715258864271199","6906619147933055378","6959954167315691795","8512722624229442434"],["14062275584318440450","8942274152538679928","9903276939788314621","5053819170926567957"],["9341987912790637054","6172024484708567208","2835176926792526078","345818059101073425"],["14711428732406851932","5253466748954630731","17414802194191806682","998591967143184195"],["676126469966429376","596157119412447469","13839629098825305496","5593022159747370291"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["14330873963379465181","13217349566010355379","11158332959646454110","12625357484984865773"],["9061116460044292089","306742693396749705","3055990458379368069","6116493617815404401"],["8103669031695950791","14639786763260955261","5378648205616823987","2009276541875622725"],["15644826567167774707","6595243548102798622","11211017036465605232","6640984591713350442"],["15208774365105491773","10444889898389216731","15890043313439400707","12590050204255019434"],["16980574686148440287","2858479272360851268","14772152375781839752","13507618720177948862"],["2019714512833569386","6704324417791314497","10791402879581432095","3421722768355470842"],["1910575059770622882","15598580506081662007","10407837643993308345","10642219003969193280"],["8949370882882897493","538355634952721743","16253421795307607353","2631474316909753837"],["2147143427796603058","11776743562087509380","12974344212618749795","16325119065360404215"],["2442073953439766062","2226270079931484052","2456042075124332760","12026214625938198219"],["17018084553736836731","16539744472588310834","6931071077278757189","3323070660345803017"],["4288379404465779174","8775197312554137914","7260369439908987567","16597634437020398195"],["6722862196974216520","4669272763773853471","8505609046965484282","5784026244374838974"],["2532307237211071193","2661057135609983751","8500465301948210323","1810690028251252608"],["6632012972508105991","3982758934525209489","4454277104658918601","4095207100126223603"],["6722357056806048794","9329527258319846661","10911464354380594855","8635797313379592525"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["11585483792444762095","5324073257724030458","17203598379502992317","16675772346962814665"],["14967137327029368620","14626797512543159972","5401070166327158725","17251844483179556422"],["17070388266480132384","1186465204752655700","16973182823362860530","8934657667938810878"],["3252783794732130766","3628649096478241450","3852521212646765500","6346307773131360407"],["5883502989135166625","10835523058152785004","11500736420390854915","2534057319537103137"],["15228530155033224281","15090453907450841437","15166263080134627508","255367516657633629"],["15263982269816511487","6466373367319214440","12013199332617171101","12951863213071395678"],["13658199845629156176","17995921798489842802","11871530902526386274","2543822116330158670"],["10518486072254207804","8495019227214973965","851577653967916804","2880424664624051434"],["8978636990964313558","12636097763807679448","5320495330401218897","12080793259726449260"],["1041329028664573081","13863218829384018729","5271376044424134738","10118859395189284447"],["5156444560967370983","220799376813879835","3770003182511333019","4935495110995345379"],["5831561295902652884","9546508544640382053","16955678630148157994","3485524984094053179"],["10083251399598701075","1623394107880378047","16273110339188096574","7095344171155373524"],["11924756149683618394","17229892729616520028","17948284051751097286","14609166714384772423"],["9494316555841708298","18050109658844660790","4187765896790507862","5019510264860593379"],["9161267023606792633","4199094783864928331","15848689948799209333","11192191797771297640"],["13328744049191641174","8935060434204116106","6959925339013998333","15122615061969911164"],["13348086681626181054","17456317703268065403","15362620621176668248","10321505291039169528"],["449585702203731073","13138886331959637385","315812986225248500","10926573078815073129"]],[["2929880677264584482","15788405786353922047","5628416236584235534","15086689248366071249"],["5707873868774945658","4883627348305891160","9412541202958506604","6725253881294450977"],["5551639908047233162","1957784229982613754","14717191854314705791","11745867462702037219"],["17067466767276250549","17215356642745125406","3700353711824752535","15606842285841247362"],["4905904273363002035","11666034930198123757","4962066187906594802","10594902568914670049"],["15063203261631599792","13169221761789337117","14754877712374856919","12060934444428519003"],["7524828729213656454","2587316592160615525","3741448775399816091","5960033573252840262"],["2812711859333119060","1004367327177250382","3923473820903992603","6015468699334153033"],["11212326249222844624","9059155960585112544","156809140168547529","11971028187939245661"],["15494444920668029584","13609849631921382374","6742937218221863425","12357527264025981390"],["2891251996532510763","6178391651462034799","18231300679521738927","3419099686816617159"],["7512630043346169177","11189568868830009358","4047950358326595812","14461457377886696917"],["8191989988555779844","15857578895680523906","2695129520875715920","4158780926066299300"],["2523020589536409910","12782356157419872429","11613190495389301401","12588602123613433342"],["1531041642132641985","5565496514536011724","3217221860557454685","11984546940244749932"],["7674133978820865863","6979652382481204640","12362336183065196552","2791762042532505727"],["12421935786681258288","13435251239734825657","5652505526343430361","5376394132233244836"],["3146949523484163824","13498428094086137675","14109922650536184662","17879357300655503514"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["2700055011801962601","2859182575810213134","17691129807478144372","12109893276239890199"],["6231493944481463688","15740006025216318259","777923810162509772","12691101268391852620"],["16240049432537007531","3652113456882703665","6757880241259932431","4612195699060994226"],["4768267784954332725","5633521001368144785","3814070929105976612","5140418046340851403"],["11120993635805454919","5578308846584030079","16649033531483790062","10582266257644278897"],["11222144600453192145","15711634284723237658","18005339140193814927","5547635302671510097"],["3207050770677267636","11334726129637366255","17102818787030981039","188322003674443204"],["2244759170695909595","3057708968396396161","17085290077967155949","1834036182403151699"],["9813739963946520480","3708888050786822042","3184574874043199899","11703869424543130991"],["4498109874826427060","15618628817090460201","7128269140949583703","10745219292823764523"],["9812118378777345481","14391253449359338570","15240327065653665239","1673725565091204543"],["11815193977134270810","5067495497979227825","4364745830265448018","13177568781377542773"],["17962678973868604931","11472840322813490507","18142594582199676707","5456330363583927270"],["12049527808509596776","14701869032670761422","7599218467462713734","14988596522374779221"],["599497808863517107","15414407564969078209","3567714041748761756","3666415236525616368"],["8229758361811080115","15305193809847821110","7576434122523548445","6597310085908474700"],["15156870837687691931","4380297543063237888","15785962086073825108","15556907819329303857"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["18133043390667093157","13301623165866051703","7581359350827784722","9083363462591521397"],["2727757731446783629","4698335793280756351","9188878832667386972","17300316081108960368"],["6759973998332757678","7049221850966297192","1660571932964637352","17413447326177690565"],["16018373219862396957","15213152621535857741","9730107410549066265","1563629290659347455"],["9470290674576560384","833024713248165649","5036640487675376202","6461544563130935083"],["13076463583719753792","17411738377011201724","4294233809005701495","14486097690259479835"],["6180593819849276224","8202187357590597230","13002192533887901627","17704967261388538874"],["5022767552623015564","9447405492032828347","10897017444631504292","3423661475013700877"],["17451815104909468151","148788250044122259","6584813260196344570","10913108057439739954"],["1924779011719967711","7368830007459844248","9117605237306992559","10813076172924192412"],["12963452811072712545","13782323215760145115","12355042133003474166","18406669562576908619"],["2549077072356791004","15364092496532074452","5804878193494130206","5869363116015774729"],["8892754229327073508","14778518987093135889","3597493211063589452","3979790793067542734"],["3637273352706292091","11234341318258234986","4495504147819604360","40388142324937080"],["5062074517894842006","6821653798252965401","14604438478036263708","17827072835579722697"],["9883253959890248038","8933927879021821547","10010869498061106105","11082183927766453649"],["8659300634992323985","18293387040398680911","12138855907900958022","10896600463942616785"],["3146949523484163824","13498428094086137675","14109922650536184662","17879357300655503514"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["5148650477923385456","10521085381630101770","13292834871190452139","8853540390607324885"],["10449277406548892655","10589813063691463851","18024609410662501032","5696468986109189954"],["7722011897923961422","1022529430781193925","17323269843916686612","8766440413211250430"],["17499467503888540124","269892981729324502","17216269344235285978","11245943847742819558"],["544493845258493430","11982783567193773732","11432018684432656130","11120870300205067708"],["630721347402633861","1815779098395985228","6471901041346994000","13529796466030654235"],["9004884228204075593","1267604147411454666","8598427657782814273","17116319980807925901"],["3021864614479898116","16585763213899298535","15597411461095947465","15584059173611469832"],["16540457072216989638","6780070577079727293","12891507472204860080","14674225024814094738"],["541694583909037930","12812506909724931276","12303978967065597151","11770904444832879152"],["15470294380062895337","7539292503050189093","3154429280221335074","10841103594413491074"],["12855597923276214262","1669474216462836732","2523849451220241862","10272431274745744953"],["7063282372095457620","2412552112289218413","6606855584314403591","10108944159978362914"],["9111015598854443074","12288068238714984912","3650890844635550848","6547606988469616718"],["3769377276571800608","15448692656748848577","10513758575052750008","11757938549722324964"],["9544726598508879045","18320488469228083021","2475304910099471098","16214919976808542535"],["17463376892506101006","4613312703718514457","8712118174583546977","8303387898267045721"],["676126469966429376","596157119412447469","13839629098825305496","5593022159747370291"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["12266028937834671473","9028508599972514491","13036825912849816584","9783578865962457933"],["6658068849703524276","13793451390336861725","15300030232949915517","4915868990727483615"],["5937486617982328658","9336345542771947378","1490314591971434393","14180305230011989354"],["2744854005687938399","16085291235503727629","12589599532435140939","483959793093564974"],["7319663652661884586","17866854853717872107","6304856314541020286","15627080887052052420"],["995409993190835032","5516493003107261115","15311724382418420293","7193681455097547578"],["5611149401926572922","14629555878974901290","7579949306747122438","394152053087740593"],["7597213168093461411","4312115372607107063","6200804580872561102","6569273588299492412"],["17711640074213812307","13766976109247954517","18019787491802998051","12199508910039916745"],["4359030554762181386","6920963955848332817","6532046085998037430","4584067261252380292"],["12822624754558390306","9045738052540268855","13528947283916431830","2043670581306118539"],["14958930316547426105","12552280555989178565","1048071350354401000","13502463378284670503"],["8308673795158228114","4104584443803296659","9304265675796990465","14461603418620650003"],["6987289116450785614","8402324727028659584","3028071990540691490","653599031823797359"],["11450714122831093626","5760857224194394821","9073407536425264091","2730503461730425661"],["8001143025008475389","410016560126437861","4630716509370793223","3501287169448410856"],["6722357056806048794","9329527258319846661","10911464354380594855","8635797313379592525"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["2727668678696700479","17950084673819484654","4224152730241593139","16357736962703557651"],["6522812369907912027","5259918351028143277","417108005229887089","5908988660277799938"],["3980295093551618181","12002080640402573657","16615623243119736837","10705328505938957150"],["1104303752187648414","18081071357680925793","3372101948307281006","11034836290775812192"],["7525458867215424461","13230209179112192556","16373071860391144851","11014387297645254543"],["16438162759014788397","7994667508884801803","3905528844756720753","5074606555086993524"],["11092687623159442021","15741733977397652139","11604258611710032050","1584071602723077035"],["17016456792254951777","10934825733320578804","7843493669831324475","3940191765843314061"],["6742446106106150286","14259081197346476234","5158400011110398526","12373279613050533253"],["15081547009745717296","1426943051434521016","4177321303762966343","8859735840487887664"],["13351685299427777403","17395529622460051709","16260432691551577271","2509093232789538929"],["3463376404377821658","15791552175821471659","9315612534098451452","9028633672499763178"],["3766500451534531002","15574374542192068939","14712935574915365106","5337937946482046872"],["6987289116450785614","8402324727028659584","3028071990540691490","653599031823797359"],["11450714122831093626","5760857224194394821","9073407536425264091","2730503461730425661"],["8001143025008475389","410016560126437861","4630716509370793223","3501287169448410856"],["6722357056806048794","9329527258319846661","10911464354380594855","8635797313379592525"],["11899699831222484403","325928474344241270","1446690833827828605","15213303944119404199"],["6774108812779520601","2176684219365049403","10177406832806772181","16257065567253060924"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]],[["12198645766296357666","475383649169332577","9299586716355922236","14793635155334922805"],["11777420037723209381","2372751679310877708","313090636388893118","10533538370351907949"],["56540283068835805","6194650884055954905","12878408630347260696","6779422624770415237"],["46153697994925174","4699352977415801568","15370699916604552488","9544333603603979550"],["18178242924121472958","14625198476828428281","12067504608469497284","1941447593516977350"],["16099474500123986346","1634199549357215237","17306998033541821985","9039042074751484216"],["12818186104841391222","390711478032397292","14278974288474980195","16292811218062625547"],["9115292202870390042","15746435785771843086","6628389123234670678","9554728135603102453"],["1004573968169467404","10662928205480562368","18042360262691759908","12702720550148564984"],["12361474239071247178","5813653164644576969","7660054638725161593","11163453640432644318"],["4601750290332850835","2591559692991677485","10627328138464802706","9959395518762652273"],["5463411146039050670","15907416886108296428","11962675211101455388","14686818052326553787"],["17971195072878632240","181944567219814423","13321289243045382828","16805427136699646565"],["6150670914642028531","14295030847191928117","4471326805117436553","9810624480465270711"],["10067392165458806925","12767920486099558050","9216788934123439923","1116172973266801752"],["7664499412576252037","14471383334551266297","15041536532191251653","5413990596469083198"],["17463376892506101006","4613312703718514457","8712118174583546977","8303387898267045721"],["676126469966429376","596157119412447469","13839629098825305496","5593022159747370291"],["13135558975924561182","9773168139502433163","8277887368055186079","16004574857756380842"],["4335103411244027681","6894576799258075582","16857564911613974189","7566310134308956045"]]],"s0_siblings4":[[["1288727014439228320","4180805211562476796","10040345608620642064","14932707649816731015"],["8761288294815477212","7496482083643289413","16784637978600155156","4755392584150369908"],["7122376444414311080","16104346348264864278","5239597784556310058","16231358460641949005"],["17436634639861068086","14084044228522296658","2771882083887121263","2431968502778895613"],["11869514745271240261","3659064152174374551","4744208099085943638","14479353160588960226"],["15946415567717236855","9930941859903837764","6186136497186063376","8335774112345082354"],["16902950664324407146","795051340466277277","9777092591380576091","7937579766293957408"],["11309721509457143711","5229309407338563197","6395156976308189798","14449170505614383547"],["7726265426500427338","7605601504199433673","16319767672514542859","11384310504521451842"],["12314420526471068319","12611990154825182669","11711712077670865509","17967543943294600900"],["9967015364101219420","13835950080811511150","17171242004089270705","2068394097788555462"],["18264215419805819315","14825519346929306184","18015398358731045791","16333925270781523367"],["14699091904169571742","14081553805812079119","18347216328877819513","16482084875000665078"],["10025806888391406118","4557570862961469326","18076421137742292748","6046021736703139013"],["12880566305313678168","3112141409496200341","17441243473870970528","12565369629738176380"],["17686039558951406867","13998645345529397018","6348793890962500203","10371246335768831483"],["8829016607550784310","7619546794000823630","1510962058976177130","3119097196578232436"],["2407454198079048051","12276011138668669602","7233093094105508985","11292038229073081581"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["5745828232936307009","14338676750820937393","622278084534887511","2072324710045099467"],["2300569099402018758","1418332223544039107","3765999350206978735","18300010623392611599"],["18321339494481377862","16521986148564745561","195386511343354600","5623463308807120389"],["10628707048931867290","4543929559274932300","5771230347909870167","10848408543003460745"],["10335645120633400651","17987270832498825425","2816999458288129738","261822453822442217"],["5469080583289417246","12485599738407117086","14218268282845335593","5462868514357197798"],["8555886075468290971","10863262262672085618","8156718619032329995","2755948410642689782"],["273860465120000133","3581845672569452686","1925724294532477450","6005251351981718243"],["691984444464627005","16329943554918361603","17043095310204761359","12248121287941418874"],["17449463411465382111","2457301343572160954","2033454055264944481","6547537020220164375"],["13045004207627165553","12468474316580304156","14202151785397727469","2050948631430841760"],["12727027991190674988","17145882684648287328","12617443419642905019","9868577132385076248"],["2301738683092922215","5292405598380565517","17373488910396007790","16382376295998777056"],["10919631706227866506","16645801476358369492","9619411095846628408","8863703237013776262"],["6277266254019098658","4178971664522926461","2263703578892834336","17939459958400330668"],["4742870295323522321","13034432880284081548","2924348373654482278","11503540659642170189"],["17992052246092174190","1268140086707775780","12276109602614760040","1454032203703160409"],["9849256408619836368","12861820760300620868","7255477078468504564","16312035136087299408"],["7766717324427341509","11696187940241059902","10829538770481851978","3572606170304143504"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["15601087633710006781","10340085785606837342","11585182160000052604","8785827165475132642"],["11315940431214244385","6365417653679532199","15510079874161377282","10131803155318682272"],["6340798992986998673","5571323345050564360","10614518532087497961","9871923090048935451"],["8540145819879701901","12985463125968471834","14436248257966665843","5199617394563544727"],["15330619363348031936","3361391300451838784","9476631374094491524","8595960231410025256"],["12991690176749945370","13755028708190009869","9290216951201946571","10274231137675877232"],["4854139076636711399","15571391978011445520","15734776881136481610","5369341894143961340"],["1025132392849451236","15495779605922363135","15814536698834115799","4862760152719523953"],["17624951287016289060","12255217075892341251","6019318596348526432","7913816672979990870"],["1559387176828394202","15557246124996088390","5535643116551543896","10246310299175758832"],["8221215469901330803","14115947511907186804","11569901306463802807","10073459600965598986"],["2241535459075174868","2243861990865896671","13197513246850829304","9007066483324996298"],["15578118251015804163","16959406195014156582","14486009081610002543","7775654120958042510"],["9887089094422881922","6646941147999378512","6979505137561861554","16050931554104207333"],["11044183803638347971","16834511586864743157","4613894424928354295","12624651941287660148"],["1134084713890546809","14763463479328162840","3219874871117172632","15023642427031780529"],["13783899256017862412","8208847297547014090","12201402277656094037","14810445643461617126"],["9849256408619836368","12861820760300620868","7255477078468504564","16312035136087299408"],["7766717324427341509","11696187940241059902","10829538770481851978","3572606170304143504"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["14223264306118695105","17076620133486909051","16366060860129030717","10939070875062573321"],["15757605963135796308","18328500452456067489","16604942767383190476","1076042107619692648"],["12033261986226956028","15857252614765832819","5134902067486021952","5442011143304619782"],["17471150277532000929","687783788020183069","9959019967929240862","17525241824980742607"],["8328821909153041810","14524478247420291605","1518140970400539323","9250670148422780574"],["8389189801519891833","4578858649789732554","4154636046231868813","6696578513912179668"],["1579871993329036583","4055705920246859963","6468572568720058564","9297058620754202748"],["12788333224305085080","1332545368887616977","7926598239708556971","10723760432597598007"],["989175936298917496","14535933569663142665","1464544249334730868","17891141709290988526"],["16073828737852712818","1027805816118555312","8730876943453294982","836798935110201288"],["17252839323746229436","2953535333505296902","1440480048392007285","2372275663770417879"],["12282369935336186025","5168388906834657488","10689913556622323761","11704949993122531047"],["12287984245020535300","14205647906481662627","15053674871781200937","1078911478251677775"],["27059770961183935","9376127379789576543","17846403480032282415","18420581533812471769"],["2512149483582232005","10174060079051718912","16296418475764003792","9786689642750433923"],["14981079639281291460","192747477853801802","8138209262772107550","9732102523253603642"],["16668197378131898233","10186277551292276257","1197250387920849505","5189794656727026113"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["586622030185521888","6697391391739824468","8476524390270297009","6210236279975601192"],["9067525831817263245","12620493338337512776","7588062174148145238","15437244225588119130"],["10543638491132713223","8088388151148173787","11130932379478083784","8705950458370531830"],["1765661350794827008","13714454705307955194","15541815440225407872","5972221854731337262"],["13404106816118527261","2995856864472030862","18132969480101165118","17465443030679757197"],["18042527471450873096","2763375204590588195","16747942549611490825","18010495797146723092"],["6924046413722170593","16781680102703911705","14839979839229814440","16730425716997102361"],["4215025380084591613","7647169070586111778","3617956049201398553","1065239397179245604"],["3277759001697538674","4804197837338567165","13923611831670610655","1847591858720094345"],["6294650019239180479","5482347917356127339","541023566126801562","4986291838329299825"],["6604072403347127176","6476887233729049597","679837679336175602","11472563444966190504"],["14297062612203582770","10593737165203140651","11246275515578373250","6492831880627215487"],["1438680954184403522","4222608836826394364","8615238227260642773","10141590418265066467"],["17321458773276309864","9599600167574591317","13624507396387713579","2726229109400979577"],["8345243939553574737","8965920999565695792","13249663108670314012","18140510447954909398"],["16745665826308101115","14385466028784935392","1351287200693834214","11941296668877870302"],["10471090221236763695","1017348351254801896","18332082375418640310","15491053979986296200"],["5987933186971512748","5800930593545380424","4662303213545100226","14987721840591378509"],["13050109757740658861","209627358370672942","4569980852978972914","14795364972499281385"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["1822241492339338863","18089515381181828","16723442865443011180","2120311205963227205"],["6040907139478704996","12194809881715007740","12357962831633839867","17342081368665318351"],["4079598797114489241","2889671918591858456","546946795825418279","11785749122018212189"],["13137497810895177425","8092176410047729104","11668745422258870239","8925048488496617502"],["6973582188566242094","10473594814580147220","14315202156542299262","17604806469048420620"],["12441637305917491468","12289592491356491521","13751431313065216894","3129659540401979756"],["16056487816060023589","11712935879522418873","354209263580039508","7542919393208482541"],["17686963628278837975","6083835620161394301","3341622607990808641","2955581035171044433"],["9511734351926622406","9909556632464989110","3757221564531630608","16794321864563820342"],["8874575109193717277","4494180476054021465","11583179570372684895","1010288538525552412"],["1567996528874901718","10146821802402722207","3841273324213168773","4984057096804256158"],["4111903821901967893","10633829166266532057","12539005345570975570","959610102553550083"],["15343522727623357561","13053057362263901142","15336031946011838922","8616570068319194063"],["14483447420150154658","14989680852400736459","17756321723828667177","7283577980399055211"],["16148142190810922441","6464793766219165106","11421682654916597208","12581829151556269370"],["14748021147276957797","807351388749119307","14597553106937111094","9039312318639998993"],["16234317849410772227","15412748139198934644","7582787313040101359","3877176067690424923"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["759420076869430039","5410217201104165994","7854867708047147137","6637479216713221973"],["9861659626052425980","13040034547037936944","11979762100808786576","2687542550781904066"],["7734791736103123379","443275236168918108","14478128544223705240","7262741432364549950"],["15496708932721660048","16446921396772130088","7432819452281895684","18366087119498536391"],["1985488982703806333","8809270072443166767","2895045636648349675","14464131498834903213"],["5763646282215298344","14296487765364223749","13661871500951568278","7877817795140563069"],["5828267072117626194","2342947179486445860","9583227042944166250","912213059405113336"],["16160228781684049489","7651722269614061069","14073392774724570767","4444246943894536338"],["6578216465829535714","6027619818281939571","4450097245542053558","9079992283129621293"],["14008862242597624885","1448060807341940994","941726425390006133","12387549248130705515"],["17744643219215820622","8724128177006942731","15350081849284968780","2914324951715197420"],["4726539396867655311","5120756936182319791","10421059475169968931","6385755232385137621"],["11091572097026772639","13336996086366404997","1482053899664393966","2621548598420586093"],["552560324775437000","10117864815376527476","7227014278146997717","3474145941777152456"],["3627803626679031316","5811218556848139777","13476658197072518134","10521325628476577680"],["7779728081695808339","14677697044579691205","7217480768395403155","3702494200226436148"],["852843276224146405","519524032353588161","4424847123232999620","14362856461615682906"],["13757310788914007947","16790950960688211112","13554149637396592199","1426961774846179266"],["13050109757740658861","209627358370672942","4569980852978972914","14795364972499281385"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["10420442329785074226","8823760722636959809","14897540818807110260","11789889091683484702"],["2119689394800627918","11045560050815589578","8941084399244669101","2872763020890597430"],["3063868017152140484","16516484185487905072","14899995872826282006","8218637496832382149"],["4674668214428863206","5347710811157530312","14177033430711636617","2177892716594072321"],["5363529336839874788","14152294402404689998","9988251457976337485","12733519198062644212"],["17372785663257461815","10161143367541643418","5340027700061687371","9772566212988916135"],["6265343493030727227","8783296131856845714","5181875400764428930","10843959617580623072"],["7345707152538771878","30748077245190582","16562977042384788863","16163975479356842591"],["9790207244856888257","15599488515192529073","14406838887886635585","13958464418064285946"],["4523575629899378923","14153578350495005843","3294724135126276703","13070755847206003363"],["442123671703092557","12820034732222040955","6626835216354853872","18245571362895443858"],["1708037670312406151","2775663135936936662","2828802661352145730","12438643484424357080"],["10239704066240104289","14740684298778205299","5022122122459319934","8605754840604466039"],["4805020993994536222","2276639255731102129","6422576302132968851","4479432982587457460"],["10610637944012923400","13377960702645123710","4573187023524861205","1272055672376593547"],["10890399334189965702","3338478845481169832","17177171306879435560","10099288256449392518"],["16123114097351490828","1075506854072570339","7834848564029687736","10590100641000538585"],["5987933186971512748","5800930593545380424","4662303213545100226","14987721840591378509"],["13050109757740658861","209627358370672942","4569980852978972914","14795364972499281385"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["1153460831296699005","2334008630841420704","5363364047815950703","12981463588746569859"],["10468555720759582727","10858926657032917726","6750106529075029703","9065621484054372708"],["11037494325841095715","11905393480141054510","5050788690798462030","1202936843338732980"],["3050359116901760495","11151721279068818946","6786147740440175947","7859694998035296616"],["713128947974862500","14012787409437756576","13344166341859951518","8425421847221064871"],["16037921337704752511","9503837730025163414","16986110440882175507","13442155624486703070"],["7134583134184759700","10416900925557041780","12480150854995276470","2338912796288197733"],["8594514359011530678","4180077193099292300","2434742542016895108","11196446597732839085"],["6350520437582259957","17100634538187664121","10142356054986547642","17689676309113967922"],["520463556312420701","9381675534478255825","14979021958923544588","7435076944009483515"],["11445172073554428815","13033340368519482186","9513819225674504863","11427223966331586499"],["9251203725169183683","15824690194870502194","10061092555067033166","10221438326855615416"],["4003322978189646860","671998514106625593","3218625580370487375","17897261710795270414"],["5607948280635276860","18349290193882952946","5572509222850672759","10905987484186568667"],["959965873913714101","12848065183678313278","5667335843465489256","8928321240460495161"],["5643293265337576874","768359431297663279","14084347111288696445","5184539477956018116"],["11325040294633658507","95796475129735764","5837929329644895268","3590630803801556601"],["13400565997275444780","12137755321936266887","7326972402986463288","17671682131548614168"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["17169729502835445406","12333649759685314244","12192670282167813222","2172311117724949472"],["4222351751049838578","10678023924622174284","2421048687728662499","4913667066308535740"],["1310880373782806900","3268755342273011372","8311170931686523815","12309288431794438835"],["4742140927448279282","14948705516729830169","2038346122071275414","4399141463851268831"],["15457384750467843205","4953110679580168533","7067936162678939670","9610900114106512964"],["2529662387636386569","4484323090440578515","11970540800782426134","16097883854278301539"],["6386361852196257116","12886058482147927580","12960886255900746912","10768749181934876332"],["5683326640331170503","1350546904178799551","12779848540804281439","1562544634351836201"],["1566030329964960692","17423789958754781712","10009672055815320762","12511229621990859185"],["8046578703603697795","191712369813512026","18009042705162853252","10136527413121142647"],["8165245909722102866","16406135447576996121","13554661015675651134","6612105114905664493"],["10324966165317810072","15977649049978855753","11152382430740033473","3896008742675731306"],["15578118251015804163","16959406195014156582","14486009081610002543","7775654120958042510"],["9887089094422881922","6646941147999378512","6979505137561861554","16050931554104207333"],["11044183803638347971","16834511586864743157","4613894424928354295","12624651941287660148"],["1134084713890546809","14763463479328162840","3219874871117172632","15023642427031780529"],["13783899256017862412","8208847297547014090","12201402277656094037","14810445643461617126"],["9849256408619836368","12861820760300620868","7255477078468504564","16312035136087299408"],["7766717324427341509","11696187940241059902","10829538770481851978","3572606170304143504"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["5834983632059762164","2252786500917601890","14719102164240340178","6366724001125185496"],["16239768477335346788","17270882129243852200","8485284182810307337","10716674053908464577"],["13790753002788411302","4639313092544989348","7588936112838884929","15555031481439063628"],["15179750393218134354","8825600197206870369","7820200194863287888","12557283833016409363"],["4734880143174198530","14066088221015172637","319986362721290610","9814440568058787162"],["848192859759202813","17586435091214809058","7176343903818626302","10423223568868822674"],["16070874351421180814","2375824868919196546","15415909691676633176","6523474701061735132"],["3538247154120645211","12966041964472036175","3282144226069084158","9984067385253161956"],["4306014583391350533","14670528266415783227","4375045624200703306","15825058343446601408"],["2762344016877847549","13219230614699032004","6104825636895120887","5957041975164914304"],["16792325197492357833","3517537333410511764","8004182549353194487","17897447567628659107"],["7735530608267441680","8906659172796946392","2760732004299462716","9722821233245025659"],["17977659619754158470","10616005676836607960","7853969339374489608","4153529304494317812"],["17923549338977248993","18445637079220213259","4616690603560967470","7025390108796201881"],["9976105366434432367","9374697348868951389","12485200201662241591","14265395704020913564"],["4742870295323522321","13034432880284081548","2924348373654482278","11503540659642170189"],["17992052246092174190","1268140086707775780","12276109602614760040","1454032203703160409"],["9849256408619836368","12861820760300620868","7255477078468504564","16312035136087299408"],["7766717324427341509","11696187940241059902","10829538770481851978","3572606170304143504"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["14882580028432826660","17443031194132134581","16793861569699019390","11426062978163543363"],["12339760130445698614","12396477261547014151","8576636666865763734","6574986983618426188"],["16327353951077522661","8084812670248640856","10004772142968718483","11679626648568443639"],["18378637807082736549","2536823782300989046","3530694676578326552","7907698684566263380"],["2515038282670678195","2768472930451740105","8056396078736744003","11639864438553502786"],["5775554685051341523","8483768704343700736","10456143022239956701","13588334649847245846"],["16378096979426182977","9330307632830371060","13789570829267545216","1519135346669256765"],["15529677314656889237","9285742173862428088","7926634882412169773","9596952846629344233"],["3142040425374439794","4795938453815221361","11356587243850916404","8611044460181228552"],["10064447850348111468","10889800227527830939","3755229073000432816","1537236677918032035"],["11554447808489964172","10990108270116836369","14438606305420436246","4132748676076010606"],["16999944797402719619","12307367397805142450","9361404130944013532","6429067330483466446"],["12100361576956116509","16642808975137368357","15341107949495376054","8731269343943887816"],["15158548998051053789","14136394643198953375","6379580065929532927","13504551118454391630"],["2785121163417622275","16861606984569687300","10063405612982077555","17931637844180625207"],["1189622491724760978","6213956362156521744","9839624801962994678","3120486566367743881"],["11325040294633658507","95796475129735764","5837929329644895268","3590630803801556601"],["13400565997275444780","12137755321936266887","7326972402986463288","17671682131548614168"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["17105564936933696671","12160928625650186900","16149400980545526703","5082307148569805269"],["15276738349541078766","2121463454599867071","3767912603989853299","9758807906903949861"],["2861088030914679983","15649413395349643175","13701586093560946713","10281972716035221966"],["70579585073446443","16127355884108687081","17617864480747816285","9505499177324002506"],["12162104863155272868","18322771212304058449","17487227149090859582","11524303776199092402"],["12361664647083376632","6554119120868870716","5989038697839547589","13396517405502276016"],["7276607566088353975","10216319378028186715","3167273078383134474","16788780727337322546"],["9841048881061380179","15057346609647026439","8511160348846117149","4586087770046829477"],["16411034602611051052","9305979542987958864","8739938509159878400","4443879338384566529"],["4072020176027427187","4239094486953628518","464906786897074458","6690496232835599961"],["7414263090665917767","17930831479891535754","16994720785666671224","5818299556370164710"],["6186158652402031002","16737744886500044821","18334186875479965297","6710573247129506758"],["2034794594046115844","6206899782042125931","12281932147582328469","1197514929770330157"],["15565017665901654036","3738259309160779045","9765164730812417241","4965911100069809303"],["47069088952911014","15914897187145142167","1805332294905146900","15541003742258889327"],["15256969274476150261","9211471305859566077","1771975097234441302","1714771290374261642"],["15875473099889904045","7111582823495509208","4562694409896169304","8918933251251577468"],["17415077044807562900","18433726231585018132","15697786411226493168","8306028039391575336"],["7766717324427341509","11696187940241059902","10829538770481851978","3572606170304143504"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["4483349307439943815","467589902191780399","11066887230460041081","18061748021094813725"],["7535613560933657066","10536199540614027153","8348975263237821406","1860177625339254617"],["11457756837954131937","9327126578805603465","9909764736077027683","18242706946501093509"],["744569447530054653","11425618707928995181","10762430021509384670","6464226213629382184"],["2247349904586323333","2283857112437129945","5244542332745542353","2784453829539836236"],["8643207705281060467","3006231381330525644","17345280298435661991","5755232265773583528"],["2631255091654066749","15939434979248451864","11141181074504974878","11080550680619828683"],["16312104599565809544","3480232061856843175","18293400973929204600","9734997982265843140"],["4241663298679320289","13834914943086564805","13302318385918921807","6823609756900232516"],["156989722109449840","5879357847474475000","12745008733636050995","8345525965390876912"],["2025959185053032930","7456173467644262699","1977392279419950598","5313007837138042383"],["13315816599377228585","13633077832841421880","6219786767190377233","18357927162442441200"],["13447587225365891053","11294647041925688270","3062207406372539433","3196858355896389900"],["9195746991063547484","7373537999183901520","13073841891140661087","9481232663474779655"],["8211922474825627385","14079728664936536384","3680921666986005639","3254005636025588468"],["345471635082259751","4501023148719294389","4080193936873306012","10381133626157195637"],["16668197378131898233","10186277551292276257","1197250387920849505","5189794656727026113"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["2657386649945557957","15667043903699635058","10667269688141127117","16036761837711529911"],["10945863237363319783","2468068918192585422","5981780894114596217","709412323166156786"],["18399944259152413014","16650494890834255923","15238722660418565556","1182223425015713351"],["11094051861824793594","13669935258794400809","15318202880131855135","17707508536137241853"],["5536519315542374406","7905214379905910568","605501696179045863","17418965709187666494"],["5140821728512237108","3880203617368335106","10471509138588231712","14911773003660643046"],["7216541988152887676","1808650560838071717","12065187198157312878","18047764115584858648"],["12200776303314789285","11909090788675136574","17237562967036952399","13410869389900991104"],["6617035452189937093","10127356696731747559","13571079418169124366","15099432131918074588"],["17227526506665390589","10608897491618377817","15546973882076375794","13120925930086649001"],["17868196939236010590","68168881475552895","853302426265009187","11903865713740749634"],["8144482725143381527","18314713235885005393","7372340762798047535","8739656962776275764"],["7668653795754813444","17693098282245245074","4799562569639082828","15943519697355286754"],["9373154886128220005","8434000325960258465","14222750649023153101","7341837548720506044"],["17418384529973368700","4845337170771024752","4706247748585842257","10098028715015523091"],["7862025303683002970","13410974414750058385","5678056380102120046","2094071680693785070"],["13783899256017862412","8208847297547014090","12201402277656094037","14810445643461617126"],["9849256408619836368","12861820760300620868","7255477078468504564","16312035136087299408"],["7766717324427341509","11696187940241059902","10829538770481851978","3572606170304143504"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["1665344458459012710","17071998019710518396","15801558013028892687","10386800236249725450"],["15864865724509810804","17846055000135124550","2698033190978485414","4850709362016781373"],["8450559268995279799","12430928174427109334","8601835000449331599","1128206407011697985"],["16600061317778089465","7476481699106082840","8447214375415390229","8880668168450686381"],["13053533115854406686","8328498925902087093","4419830059619326240","7928035233532858920"],["5736937338891667485","246255323992025166","2870218396750624000","12542825344600596935"],["15427344432603384834","1604097713067160890","15598149101106627219","16079607507086529906"],["16089295029322726483","15177325761987553844","16039021279285260512","876810786981196241"],["14527426463498669256","15089024776636909815","16381427523110372182","1023080827690969451"],["15334838956721046792","16229137789671418540","14885424308567696835","7366977687369914648"],["14193804805672725336","2385165679170532396","12194699008573519802","12962399342443016026"],["14833844638186566381","13399581645121612557","8878553004455261871","16325196229774314155"],["4700875899282531141","9753122246653070435","13807611487606518149","3856304255035151189"],["13932854970342330704","17137861351814958366","1505861157127491950","17942483015144448794"],["4355852669207909532","12115324232719646518","2793610585563602841","3117757990062190308"],["5570450564153971386","6988464083182473818","7409116759198466698","14163279432371002623"],["4138252440235204133","9700907035071581497","13405696583534140259","7373926748113594393"],["304148925361311885","4775616435623638996","10592218164291190776","5233277925322848304"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["9601476492930155769","2001904830024158156","8802453434829487146","11924478104158877533"],["9958825869317612120","1130872704985316621","3023902182084749577","14304287176479981039"],["15824575299617764838","11870070961379753196","14771902839341166907","1125328411655335007"],["11987244920704397490","4366375735893177707","14058695274647416484","443805255479329639"],["7795127019942462105","2524474653828000023","6406640546429270114","3623221421254027495"],["10198082687206623583","12971832257474094945","11325906234666071798","2576625471237192887"],["13062032252842056783","9394456996590653417","10446093732959017168","1959317499901256144"],["12922989825548300557","16219247088496438140","2908209777274446515","452930346310007985"],["16884126551317619961","7698703359827441238","17585021710620809802","14137933138065454970"],["16209366594744750661","7863223080119474184","12740804806184973898","9062155274732265491"],["1146394142809127813","18210471340659185344","2730263030842382397","12727516869987924880"],["6012838274257545592","15324782879995612506","12526300696759711455","6427896272293302894"],["10049313618841055776","3425028341896641273","8967947191628661853","6639224986349527459"],["8604672552986277155","16335397135164202311","6637846642939776511","11928859492963625231"],["4355852669207909532","12115324232719646518","2793610585563602841","3117757990062190308"],["5570450564153971386","6988464083182473818","7409116759198466698","14163279432371002623"],["4138252440235204133","9700907035071581497","13405696583534140259","7373926748113594393"],["304148925361311885","4775616435623638996","10592218164291190776","5233277925322848304"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["3767134558277259809","11717094663855312977","7545576392171498405","16515403945610161509"],["2518788261189153136","5808700250416719279","12114375262696367702","17956220734257040663"],["5946376755038247863","12236188392770672413","11665655758572534438","6450836082200497054"],["5665073438276029666","2541426610039339249","15443138916117296231","6279853088677290660"],["1509273692107754673","488578461509722385","4117542603104790514","8767161369314390281"],["9698904580750939645","12314545188508008222","11110455127466630132","5080874333985098383"],["8502254854595545046","17392986267080772133","12274003904849591394","15210729095560165657"],["9400314431968236872","14237376717803381123","13839772311699072834","13942371350980950851"],["13010606692063262941","3223969475960844741","8452887137048585017","8205837051763826745"],["11929767846346444778","10063968667721925867","2126686968978810386","5512278823436402970"],["9014347437277264189","18205979548276966752","3561460507001515177","8601822169896587371"],["8645986623519529147","18116304597881888055","6936035518565956419","13511197226268678595"],["186747305140182531","16482713503033671337","11219710825240305837","14080812636989799651"],["1759195901895264201","6384833017877356365","9422215734421211605","17862270280242448777"],["762507982320977335","13748035315503099797","3807590831233513582","9306411964608466065"],["2622909505118404735","4161882504058298446","15794742949250570240","16551659350792282095"],["4138252440235204133","9700907035071581497","13405696583534140259","7373926748113594393"],["304148925361311885","4775616435623638996","10592218164291190776","5233277925322848304"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["8267689465977528820","10288741510214114223","8245340249390636748","2239525664060840882"],["12779668736573023818","8035996013596569415","5776487392210604042","3646132672543006670"],["7118744894884017243","11947195225857644731","15386219354548661290","11343761268707279336"],["1061754044283274300","9199049212091832417","1075113971940953627","11067112959143605333"],["14737821875668337292","14972511247199117948","14014446308576106513","5890831542658555049"],["13275886495854329965","14738224614383247589","6781250429067130656","15966957283438451028"],["5015902288375320041","8523586975879319709","1842308720206635155","4429653720793874910"],["15759307241947398572","11755186924720939499","2029375310790509189","1725039539798566448"],["7212268894501097972","14821028448427224523","9442429069649749948","9301590316555392814"],["5711407409297938865","8249892065585496602","13399633806222520809","14479019013717988607"],["18209671068252474080","6669843590532167270","6534741212604874648","6028294844521659395"],["14740797437612506122","12532297279438637458","13601399694251359316","12445590267363644805"],["987227654499618065","1803141950101561941","12841014437412838645","4329963267125191429"],["2276381743518826383","6457828151930365408","8272566362516002404","17173875237276465143"],["9976105366434432367","9374697348868951389","12485200201662241591","14265395704020913564"],["4742870295323522321","13034432880284081548","2924348373654482278","11503540659642170189"],["17992052246092174190","1268140086707775780","12276109602614760040","1454032203703160409"],["9849256408619836368","12861820760300620868","7255477078468504564","16312035136087299408"],["7766717324427341509","11696187940241059902","10829538770481851978","3572606170304143504"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["1184879689206639550","4625892822657583816","15636811673921285569","3525463349143875102"],["6280124613778853832","6828528004461961868","15056612632905637695","2910710018654520299"],["7447689563096358881","10054962064897563349","2733643038282046629","3292429235917866370"],["3355910990611634888","7973177678328782667","15881763315590246889","8570951534688624666"],["9439909725251624967","7574241423326406240","7437219420913626302","2271593995506338981"],["9971279169020602210","12773945891462300471","3675864295811323110","8997768765626263041"],["17658144481986480384","8551813287370209158","3114215465481456230","17017061628790826228"],["14039609366097192486","6086884827839509836","11155086408234920485","8425964944412574067"],["18044100043100437710","18145339283852027075","6897091087470019312","11164499093279085562"],["12980408912845028144","6188338092600323516","18296754599242808771","5871353176720066423"],["4999951840531086675","15546082302603558145","1277450042880137557","225807635955393786"],["14462274329697196918","16245194660376502672","13227435032020818962","4684697136074879044"],["12162072035753025154","2511678531123256560","14561421286181943471","2180822519768815272"],["13986299293101540073","10813501140181677155","9220310902852612970","10092586081819467668"],["15118986775545745581","4650854580463562477","8390359876529818867","10709766452368944918"],["345471635082259751","4501023148719294389","4080193936873306012","10381133626157195637"],["16668197378131898233","10186277551292276257","1197250387920849505","5189794656727026113"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["4605242635624514987","1482994016538034028","13459113030415108355","11912967679133683333"],["16005115797376805557","16573678553680092902","15835992838402593064","14016637479873862094"],["3412340329729414872","13246494891229001875","7152607218286747885","10686810353451694614"],["15957122612374762277","10732082104807238472","16680452929463217691","11264775706513441814"],["15099242589885267779","1570211121876844265","4051811019710718024","15730089468583358971"],["13393415249873737441","329832129612412602","11420909880531664907","10420143910770168077"],["8545856199248580625","14920753447856790566","15875523569677171993","1272359132703158162"],["3977074335839528116","17274018415552723605","16885626310975313095","15102257994421238528"],["7212268894501097972","14821028448427224523","9442429069649749948","9301590316555392814"],["5711407409297938865","8249892065585496602","13399633806222520809","14479019013717988607"],["18209671068252474080","6669843590532167270","6534741212604874648","6028294844521659395"],["14740797437612506122","12532297279438637458","13601399694251359316","12445590267363644805"],["987227654499618065","1803141950101561941","12841014437412838645","4329963267125191429"],["2276381743518826383","6457828151930365408","8272566362516002404","17173875237276465143"],["9976105366434432367","9374697348868951389","12485200201662241591","14265395704020913564"],["4742870295323522321","13034432880284081548","2924348373654482278","11503540659642170189"],["17992052246092174190","1268140086707775780","12276109602614760040","1454032203703160409"],["9849256408619836368","12861820760300620868","7255477078468504564","16312035136087299408"],["7766717324427341509","11696187940241059902","10829538770481851978","3572606170304143504"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["6729309990033712034","2872263397932325995","6543515815393864885","14078262163486500757"],["11165982371377603632","2529909999845373850","16882477238772335737","9261245449050355107"],["5632798981485015904","1992762870035279645","1766856234931326595","16598190735466969294"],["11150940510166334819","10339000169036290558","14448780159156514749","11616475251869790974"],["3815905751955132086","15296061850623094115","13387533785765850595","8928175304187116586"],["9810081219852458717","13536973126870408714","9149993915564005322","15534758979322406998"],["1125215873316937458","13982856225435794282","15702999980842883884","5393955825911974890"],["10657398865789491741","4815862742247494507","9992163097842987622","16601744067929516191"],["17838358313371078992","18002377535009836889","13766926420358656391","8022774758145489216"],["1933040834636920624","15436778970930700785","11362768185304068669","11154707791501046193"],["13077683635420034916","8918005188741190201","3047283772999584546","13255865160435693203"],["12237895105700796004","7408613723308061571","16709399653469737760","5673330952011509034"],["11091572097026772639","13336996086366404997","1482053899664393966","2621548598420586093"],["552560324775437000","10117864815376527476","7227014278146997717","3474145941777152456"],["3627803626679031316","5811218556848139777","13476658197072518134","10521325628476577680"],["7779728081695808339","14677697044579691205","7217480768395403155","3702494200226436148"],["852843276224146405","519524032353588161","4424847123232999620","14362856461615682906"],["13757310788914007947","16790950960688211112","13554149637396592199","1426961774846179266"],["13050109757740658861","209627358370672942","4569980852978972914","14795364972499281385"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["11561444402266257749","2269944342666936868","16184627679645708431","11555469822840454517"],["9193653586984711556","9456858612098885818","2866125964365939595","17673025001373186887"],["8225672891790581223","6077355367700073065","7254107852344211864","12715585007374439954"],["2795574504733094246","4767966060393487115","15980170620932051023","748802116504979708"],["4160771134088066004","83011504348016061","139307769910753071","612043955654494060"],["3255202506068027137","12378628906845630443","11162997112910835061","14437342237324369437"],["112123924287696019","2208713016799153167","15776111014195825573","10262195301468681290"],["7234005912958487081","12856050343125862470","2320856169094948153","17266628370045443103"],["16277421314817193435","10846134005474212009","2843921064293928493","11332986416164819235"],["1049146567973797319","8913941456372210966","17931425625554369270","5129105291708830242"],["5067473193057450290","2828136894394218449","3904849558294481672","17589003677887532602"],["11370616640364692188","8452589496477950028","14526923178420110181","8553310445608253661"],["10688734157920562636","10711800120258131606","5652377367371813004","5073545031246665246"],["6860487791547207103","5668010955333422526","9724990021404905213","17963119158069723367"],["5849088498335860333","10305714759084457497","7855684027063453536","17247717398272631204"],["2622909505118404735","4161882504058298446","15794742949250570240","16551659350792282095"],["4138252440235204133","9700907035071581497","13405696583534140259","7373926748113594393"],["304148925361311885","4775616435623638996","10592218164291190776","5233277925322848304"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["810521518262329259","3410825811990808223","7989915094385402189","5996932577825594149"],["11679869848596961003","13890606896446342971","13439302960461616438","13787292658259001935"],["12486940714786677430","8293670802870464983","17657249978025358275","1591204157116850495"],["16915109307746761836","18353512236281098337","7925841802314979326","20996032818553402"],["2110243297384868403","13678849054852811574","14356606197982427402","9185717137876828627"],["9094412435481874745","3247469683724736037","1546288196583502874","76053093540472462"],["17454525818483252568","7450554858726990014","10544552898447474713","12381075561200508896"],["9467248205457631897","8182530975173881858","3146683940359818967","16473834109942058924"],["2440600572530608192","1790207409837584812","5197765602058749000","14494739016628184843"],["14513433617663737039","15260900179663113064","14884194656963226720","8392636482562165893"],["7326088652034124305","14541778701039400706","3373472421186024545","11020513487630282541"],["9778580222292446773","4055225954997787639","14472131838614385658","7065487288335148448"],["2717674665886331308","16948674077389746866","15433150320303580544","14524567312752515840"],["8252364331676423242","7933578906845664124","1577256929643359365","1351043104929546542"],["4977765371176189712","5612247468193967661","17948670138564630405","8842042218657252275"],["8657638248046236354","15845878050220359134","18019204909382193820","16893835860869201536"],["16234317849410772227","15412748139198934644","7582787313040101359","3877176067690424923"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["9746383039108314981","6105185880516048108","10676952489083796996","10378702435927087220"],["16449689520471512406","16477082728184807413","11124107486536661132","14500966071378404902"],["9764425403569256229","854504215022233986","602634677167380791","12925514504994555283"],["5542555529107075146","10322789314043571476","7223700088121022204","16237333109107866054"],["13331334627666706048","2844094885352801200","13148765237130606190","3694411336076136030"],["17311432792552672318","18429973279677999685","3222018466147899313","17838951383862223035"],["11740351461748222446","11964519145059511261","16182587331192120538","11530460395848967833"],["11453743605622891433","11616474074700483197","17078982839622402909","11924781249083991974"],["4524784908611780619","10978240863939929878","8539691442615473120","667112722280847537"],["18380848629739337333","3194290849968347000","16549918011990212397","16828747940899333172"],["6739362796235072933","16681682428563881411","5629383799862771359","16673937074991130402"],["15615056424122826078","17859786153364925445","8174515412336062716","8826993028721682408"],["17335715734224849669","7593566736104522480","7736091134226894229","17675070913267327165"],["11716564026339345523","14902957794625679817","1929351501743748237","2484534693513376904"],["859476710172100812","8517592304513641970","11860736004306283412","10818107429153448531"],["8657638248046236354","15845878050220359134","18019204909382193820","16893835860869201536"],["16234317849410772227","15412748139198934644","7582787313040101359","3877176067690424923"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["8289769163840459374","4713609043854628084","3771071949467176184","1485875025980079098"],["1256327736070049910","6368844910017212744","2935297506249104925","5672608990948735899"],["18110516178769452063","16901986275974240606","2723575879835584588","6703716314375951181"],["18100459804356965056","16305426516921282419","13274101549106388329","771795659600132129"],["7612417597339145304","5898799533750800670","16551181982662041808","15160679173460934951"],["18169757049010363463","10821733270800517693","6498443899809899714","13792920706544648642"],["1490373153096299311","10393296968923616232","5091239748516001365","8885696751278304271"],["16813068593103684304","1213167935155843984","14817038615180643904","15997038081689114419"],["1996023751954847070","12645393192138207180","12921876180083370198","11921948487707386920"],["14502854574051506516","5531359174987527256","3113801116156063479","3445298945164624485"],["14229346822674771592","9124206458242717147","7147589052709525921","8815562415476975236"],["6942104154240530635","1863145493490172241","4032372440060071733","14872292711416147929"],["13313404224181628548","12773303183967782352","3874749302430204471","16402372954412405420"],["8252364331676423242","7933578906845664124","1577256929643359365","1351043104929546542"],["4977765371176189712","5612247468193967661","17948670138564630405","8842042218657252275"],["8657638248046236354","15845878050220359134","18019204909382193820","16893835860869201536"],["16234317849410772227","15412748139198934644","7582787313040101359","3877176067690424923"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["15558173266215998245","5706902666695455577","15677072650627081118","10924041927970681873"],["7542913474629281898","4928280721914054649","17481176532203342328","14380438865905593229"],["10389346230056025164","4947427773620397734","13291326201996077176","185498698281242497"],["12035630013984374574","1351187329047559104","13435438653790859438","10090489768279177671"],["16952708698915744076","1424673511393834707","7906714635159402261","8683189304936825392"],["13307588573604852286","769298524590180261","2372816734614160439","2447601551800642098"],["17312434824288765772","18090127189428965736","9273000496592290811","2189396824878258001"],["8333587895930933109","6793736010038590526","1819213137636764665","11705877330219153411"],["3371567450762152820","18403890330539633828","12349405348221883264","2158439172305494956"],["917775568896783044","15721388665431848625","10826655991016554242","15259575845256246377"],["12055865757218157143","16868501615316279899","15827853270924808032","15588560163025438717"],["16029020784540536171","13911251552516872395","18020629384006728629","16394339132437637859"],["13811284679514100256","16122561303033389785","17921780760565621151","2929954676026859376"],["14035285528000874315","3823632039818309125","14968234137084706728","10451891706167258365"],["12433326587865777631","10878305914958189454","431698426778960929","11685187767573847218"],["5570450564153971386","6988464083182473818","7409116759198466698","14163279432371002623"],["4138252440235204133","9700907035071581497","13405696583534140259","7373926748113594393"],["304148925361311885","4775616435623638996","10592218164291190776","5233277925322848304"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["12076711960905863749","4696152100859986981","3171050707773999746","12627539166772497807"],["15209882769374354584","4585508164453296429","14290170733766943570","17212774439027489716"],["7262929895831731234","12425674423349900624","1064883850709418686","3892662018494437122"],["15566472436997476581","18133181419840855044","17873948410357052677","13665703729549116175"],["1431033524198357103","4446966712203654466","6273624579419300968","15871674334050760937"],["10141972071196665318","5328642265481906808","18426941052404033006","10757439040819463017"],["5411219003375594034","16123476475305122020","8729865233894480211","9362857949102831258"],["1912226843762117801","7936489441568024523","18355190916573964641","4922730233108699383"],["8498825476889449330","8228298271138067114","9445472175573907314","11846187316591865439"],["8063577838716710657","8574757772205891925","14558658167732634063","1644456359726015229"],["9417188379077546564","7240291104135533345","5272209161664344091","3270224540279627382"],["8994626114729345125","3020769759324928282","15634376122529349632","17351490451873033870"],["16961457708354118278","13379391559830812456","16216169816179575388","4304733178658710809"],["9351682973116207928","4359740695093100103","5214910324678834778","7336490560642806105"],["18083458256942962297","9253993038789978736","1933972983639317105","11010346542685855946"],["16979313317269708263","17130771706804288131","2963630524486855615","10196467156705318939"],["10384600272945626994","14376546953959038074","6199801564758578991","7735956574568067926"],["13400565997275444780","12137755321936266887","7326972402986463288","17671682131548614168"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["1776190959913026128","14791870742631613979","14192047390143400693","2991891498881670234"],["4926195571530266142","6960797068044217400","17863495397448026990","17340804181870998574"],["11601166863115088973","9427456765575741035","12155256474587003092","10739949664560681200"],["10905961526875494039","4653838353674137492","10338783861400691928","6838405229007316030"],["3291745276654625300","8331310030669399113","1168012192164376369","4256529618112137959"],["2679118242145156733","9149576628077903579","12192459615228835454","13042346780756105016"],["8504195621693308741","11340405041325912727","17661278149258543011","15479474085054687716"],["4610392690848130428","9360985564962330500","809795395776371022","13456728341047049879"],["14527426463498669256","15089024776636909815","16381427523110372182","1023080827690969451"],["15334838956721046792","16229137789671418540","14885424308567696835","7366977687369914648"],["14193804805672725336","2385165679170532396","12194699008573519802","12962399342443016026"],["14833844638186566381","13399581645121612557","8878553004455261871","16325196229774314155"],["4700875899282531141","9753122246653070435","13807611487606518149","3856304255035151189"],["13932854970342330704","17137861351814958366","1505861157127491950","17942483015144448794"],["4355852669207909532","12115324232719646518","2793610585563602841","3117757990062190308"],["5570450564153971386","6988464083182473818","7409116759198466698","14163279432371002623"],["4138252440235204133","9700907035071581497","13405696583534140259","7373926748113594393"],["304148925361311885","4775616435623638996","10592218164291190776","5233277925322848304"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["13799033804443393649","12636257201127206","10263615226330550488","16390308875996013015"],["5309678880674709105","15345238542230421225","8112134218476901515","9566945503605292761"],["10615508072412124271","9014676075968936736","177463230343194914","15262657672846956517"],["10989105619665827638","17131350418352370996","4153818275098143620","1462643578427663418"],["11762059745408457139","13764986920779821665","14469925959091205624","5386754980948262714"],["4308303964768386250","9225314310946245081","14868575375045406063","14240978602277939208"],["8999761576170008284","8393718093640017273","1792081917944455813","2531846637554072724"],["5041775713310763246","4635600836873062315","10715577301078801932","5766668337173865803"],["10811417600955687785","15501189906410875737","7935344055110269820","1295105743560716446"],["3271084158590024866","181975345962255008","11516900964721090848","16758851269172441890"],["11092723749693362858","5427691193650572355","16171755773343393890","5318240512771266756"],["6622594777958140637","5045945795727998352","1496520170302936121","12020812505113918317"],["12100361576956116509","16642808975137368357","15341107949495376054","8731269343943887816"],["15158548998051053789","14136394643198953375","6379580065929532927","13504551118454391630"],["2785121163417622275","16861606984569687300","10063405612982077555","17931637844180625207"],["1189622491724760978","6213956362156521744","9839624801962994678","3120486566367743881"],["11325040294633658507","95796475129735764","5837929329644895268","3590630803801556601"],["13400565997275444780","12137755321936266887","7326972402986463288","17671682131548614168"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["4326551154901760563","4180201359398502067","9424475959226765300","9263454924430804103"],["5391223317435220016","538808543614820592","4154232113342568359","2933429089320958572"],["1537533821551077431","9505801237534882724","9892132497197364344","10905606132412766872"],["4251989166540706750","15453033625378004105","17216907902831683515","5342896180675653461"],["9015189251038946092","13165633312050268269","2424485525710765030","14985954512982594998"],["12323329013974395188","6494988486817312646","11489825870775290331","9715721783019830689"],["13012798542663683469","9256630689943628135","4435520806056729203","4816614234768247661"],["18073200409538944821","18070588989400760170","12089314928206064257","16598614923851072134"],["16277262197517082446","15804435197436300521","765964061631930408","7788307379517331453"],["10814996038149546709","16434175365799129695","17489071893176357784","15051740157426866954"],["4901952482303377241","4661483044316832947","6245612319682108243","3172759984148873990"],["2890181827366207143","15075189137549371860","1309361966693600289","5529136776807202229"],["6394467482092208518","17121004275933279355","2441837430469528733","10280632788668910935"],["9926918189028495812","10415026996110710684","12687501752089390385","15603404454108471498"],["5694025968178934575","6229017826356003186","12518872744532561735","14424276770271025633"],["2132651834774118254","10239549174866341972","10083543377618671402","7663345301701238215"],["4542659940214468354","2276075338233072398","6002473801990921832","16707507983289077883"],["13757310788914007947","16790950960688211112","13554149637396592199","1426961774846179266"],["13050109757740658861","209627358370672942","4569980852978972914","14795364972499281385"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["12046598477818423746","3180785326880369140","4358444972538706405","7918874540790104372"],["6529363627375926622","14017091060953491632","4563406531775357940","13281318804859840899"],["17557453713784253452","12998891515906372155","7980299079964183292","15884119963030385612"],["5194136861720095162","3386988309211773834","16081772992935256895","10151703319479448853"],["9217758814701289190","3090323742578923859","14774692511249825561","11763231028574893855"],["13738017399038744566","6450284913141843328","13962833290545722747","5733008864634749178"],["11833257650973978095","2329189483044608407","10512303429294428583","518788600613822779"],["7609061121343418975","181283238216720312","5032618940683597570","4287174136454909392"],["10372146440587425843","3770016394925802108","10581725238245647926","7049231428254562056"],["12091840218008910198","13889807531357484457","8865729275718436671","5968952175292483024"],["16947655822495562016","4030441685952018365","10697835827685546260","10691561613385356823"],["11405692356811971488","17729054296201592034","11350705382717313225","2302600458883177276"],["1139388477163636654","16077049076636578003","9137473688397573812","15034674275535754453"],["1699127255502948858","3789064440965043642","268107076744548971","2687347529063285084"],["3078963622687224399","1640993487600860193","13532962484590174883","1118390283592725927"],["10890399334189965702","3338478845481169832","17177171306879435560","10099288256449392518"],["16123114097351490828","1075506854072570339","7834848564029687736","10590100641000538585"],["5987933186971512748","5800930593545380424","4662303213545100226","14987721840591378509"],["13050109757740658861","209627358370672942","4569980852978972914","14795364972499281385"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["603148744996634258","4767007951085095520","11483280247336947372","6465771170266545332"],["3215778343106792959","3103802753351736413","3747015539689037190","7301524968080604545"],["16439315697290632143","1246784635450071307","12166106266803709794","6195112041938475993"],["3734258419144636539","6236383844328962163","8509656433338712022","6362679640906172931"],["4902995533468183172","12839879151577238937","2628049748493375464","5254266202421555208"],["17702152156825389524","17148161440490054120","2452989151504690088","658042951376635584"],["7420974835681468269","500135182524056447","3050158590107044928","10377267984036342161"],["8086060117956022142","10222629853730682020","4371377734833575627","14974828151293847429"],["16988633073810051340","17466744381957242683","6810841677028871761","18265331005074451459"],["5534598485136324050","9149941597648522595","14557129687809978594","355783770103241863"],["13422530828090633604","16287871719665106847","6059324563414774994","18371737351406720476"],["5123832736470526898","88282063641743815","8867273999540319175","16167365820861858464"],["179239151717945802","3282788608289328295","12006576184133699962","10462883804113486802"],["13908054357416477386","12383812050320645246","14099424463000846335","2108586550060213443"],["13041984958778901249","2722873507423123325","16916715834855766949","359882199081652588"],["565473611706486584","15804523157056702770","12152301334856088613","13615111042016263641"],["15875473099889904045","7111582823495509208","4562694409896169304","8918933251251577468"],["17415077044807562900","18433726231585018132","15697786411226493168","8306028039391575336"],["7766717324427341509","11696187940241059902","10829538770481851978","3572606170304143504"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["17801255942941820720","6686280255577626408","2245768596067176670","5012578309473998224"],["12254927763230352275","8280003765249284580","5149203567487442838","120685458953042475"],["15385854449560498651","12664102728836469346","15025623368448015029","8601568014168745976"],["2365636516026872426","11676839825085517497","4773107044108438324","16647256132187484499"],["13234713324210905851","14079980962861480868","2055844775273122569","15252887992370602734"],["5294075891864147104","8302481152402300455","14176710782364959485","5760027444662376308"],["1917060710874689163","7306768088058990199","11591554584514643147","13540528494082606675"],["10690413140596328454","3823107409456588825","9202817181039893791","8206109297318931820"],["2995947480914554466","1034797695254596866","5164185435473723372","16832416665203692196"],["16694004687059816194","7597877656142455214","3679578007125824307","3947365761149062297"],["14908580241895526272","2659712195830258755","3375433402326302289","18319791848095073756"],["15421801379481671925","8437371299264019167","5391875343211854015","10123425859577582509"],["9441439128818910410","4028263234696453965","14952331824930459713","7253076345500811989"],["8604672552986277155","16335397135164202311","6637846642939776511","11928859492963625231"],["4355852669207909532","12115324232719646518","2793610585563602841","3117757990062190308"],["5570450564153971386","6988464083182473818","7409116759198466698","14163279432371002623"],["4138252440235204133","9700907035071581497","13405696583534140259","7373926748113594393"],["304148925361311885","4775616435623638996","10592218164291190776","5233277925322848304"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["14219073563316752844","4029625327130188642","15330658585126430784","14490059056663069530"],["16577599864409527427","17512031995079107050","5914996433803420463","1189854681809102399"],["2410713233581653536","1330845012866922341","17931875352305188469","6115942067437489403"],["15531614308923145749","12565488652281315632","7724411494973667780","667859363043016916"],["15883870111592766680","16849054956443376105","17678186152270934276","8507164176367131419"],["15425325100924357002","13066969086761464709","12865306913408056354","11777628507789329525"],["2281831842712431470","4157308498789352051","2080402844758807723","17768428091706490252"],["9157717140509164757","9304760202650801852","4953811037502328311","7656517392448750667"],["12518644831642200522","16309281749503017310","7130778670355638344","16151987540859752102"],["2795022848161544801","5705620408827937981","10025425725834771270","1490268524617320709"],["18306372017947103464","411450906900545788","1472637417692191110","12815985467780265853"],["5943227774283443366","1695493105759793279","5400666268764953787","8195583694329479642"],["460797690242161881","1236005537348759011","2646553626677187967","16848729374223749806"],["2537288489545103316","5253988991737617184","16314178988303862855","10137223423509682631"],["15118986775545745581","4650854580463562477","8390359876529818867","10709766452368944918"],["345471635082259751","4501023148719294389","4080193936873306012","10381133626157195637"],["16668197378131898233","10186277551292276257","1197250387920849505","5189794656727026113"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["2864283204028175933","8807639379703673188","2192063676633636008","5365275690143256260"],["16669709190328730939","536836318766058448","15980570414761350790","15354796402548133274"],["17600050596429217704","846956354605610353","12675918162730371612","9355525503104859047"],["3560283123706301643","921916299460571661","10266676710180681473","13144988315693018320"],["9543097952978532012","2336450900033830134","10004844145635513785","9067773257419451052"],["12356858694257506035","13005193391654697490","11488645072646382827","3485780640393588956"],["10648261037390904042","9657465204946482697","17274381170595029679","8414821995059179579"],["57243364679517841","7222773059849191498","17243086506865009324","14442214479892674788"],["3645494246696741829","2085551715972972083","2080813176463204463","1992923426455600420"],["1091359853101923064","17914825738127867815","7568973882201251247","17920827196068341516"],["9568853257119722750","4106505273789145993","17184501246244168621","15769589208468434454"],["6388592665043251134","10925510897635758598","12364637775119558487","1973500253946156623"],["16747978961322267196","11872596271014660866","11217201822570154540","18112936561510382845"],["18061109220966809986","18100694188460880817","14946901397402619970","1559038077401745861"],["16832861715074450920","14229581045179294407","2205605740246483685","8427307170925404712"],["2160540140786306954","4668295054512108315","17311435648912424307","11296103409087749569"],["10471090221236763695","1017348351254801896","18332082375418640310","15491053979986296200"],["5987933186971512748","5800930593545380424","4662303213545100226","14987721840591378509"],["13050109757740658861","209627358370672942","4569980852978972914","14795364972499281385"],["8122996513369249945","5869095934682082681","11724672152003947772","10579960153224021785"]],[["7256543209417975083","2009988227587765102","2870159129078729073","4073480486799696647"],["13970266405247352900","3942016198709424657","18090125708587454881","17231946926739236674"],["14399856040436412251","2996232636602666685","3495619151622054275","16034917743436806178"],["1104322256846706214","8696192880271455429","9327094905615603398","11777832092992082962"],["11059268418204276552","3478776697223339422","1588264661302516468","7790067329626709268"],["4127770722228748472","10935293490965717741","3046461935906599255","13456421314545849584"],["7353688471471576168","18122877450850555310","9724865797861607497","9151421684434645896"],["8331104005982732692","2662121168944948752","9589979763526617879","7888599868633560418"],["3654627249980310298","13212255991276930450","1084729747089503834","8604737808845546108"],["11919099787819602044","12247638325450926355","6803498788803141832","8642914457862620179"],["4602018111390610825","629410423366140523","12160326513580214539","17987441389029196540"],["1181304838371704981","9887423288483514677","3059387982366584285","17486602196919031481"],["15443869535314298477","5521914319248046120","11373707466338383055","5726339061020129294"],["6054532029705806579","8211060803381564965","6333236736494102829","8807678334603859169"],["8153165851610020932","15925682947211721446","13488979344136695078","10523927519105037223"],["1189622491724760978","6213956362156521744","9839624801962994678","3120486566367743881"],["11325040294633658507","95796475129735764","5837929329644895268","3590630803801556601"],["13400565997275444780","12137755321936266887","7326972402986463288","17671682131548614168"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["16081559508473770285","10648757338312630366","2736959044203403392","18121640725969184436"],["10261012991399854440","8180247788414541648","15732807505446691010","12699585738154719269"],["18221953904495652181","18390744663592243867","12675397270835898366","10771431541954852435"],["1659789465950619743","8284901565822648902","9995633215693062600","14260656687365898423"],["13235114687859403147","18033021424988729970","13091095850238627629","11496259860768275925"],["9571059069139372884","11495149703152583566","13793205629836614657","5109351813781073754"],["7697810538107303472","14907103893193031269","10699044819967953084","17417185752857978014"],["16285572408013287060","8185602849807896315","8707661260078383909","6078830347692281305"],["7938783028271186803","16084504191734622046","15935442138777950354","5146484667183672530"],["2971092770750065534","566845950552602801","1925411263843972147","2479418034456373891"],["8525473855592596004","3172642956023921455","18255261899411206831","1964893683881897971"],["9029875573960167753","17748495276931402308","12614144822842315303","15201881899451317258"],["3697952388448815879","8462740679187680984","8377779663185222143","13958842337275888344"],["17258930595514305953","17562500720491096958","12688199100518050747","2453449805809400819"],["4977765371176189712","5612247468193967661","17948670138564630405","8842042218657252275"],["8657638248046236354","15845878050220359134","18019204909382193820","16893835860869201536"],["16234317849410772227","15412748139198934644","7582787313040101359","3877176067690424923"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["10570690379553445776","15441539176931184136","8185367048423665426","794155750138313571"],["10402948431249187425","14638287131537272152","16676486507157428496","14166771921402307501"],["7007081462086906013","13735332024108432294","646453103604617268","8823873092754098221"],["4283973394472160880","3221086482722418263","13552532953645531219","17457045761727872746"],["6853796669441230946","11445156227671524909","7479486670048263356","4854904570958618238"],["17911092030119169912","10391699598588908694","14789080221456425481","13007097736542134025"],["11189544920063126584","18342837749521391790","12257646145206610267","13762268858641091358"],["13397777281877307350","842296694760960472","7288741676357656952","11097306670416250130"],["17797921629070589366","6264843527460589802","8344035248610651722","6656780639822268942"],["685588463632941090","12882845228575161264","10670069044018905109","6572090576358744051"],["7471797953372898019","7382756659392912341","12206999565962568260","3435528838628488779"],["15001979043730551151","2767876320763528021","13802771769948640505","13734537188869834040"],["1185189474921398863","8341413675687363587","2892783899367010990","3252423246608474136"],["12639390639365755318","1963665974296189111","15127011010856705127","9461407051980703306"],["4143696169800964783","2235312724149848599","5161644409168395632","13044864808147026180"],["16138779099015521369","14992403645571627568","11636323089145436429","15109393564116716550"],["10384600272945626994","14376546953959038074","6199801564758578991","7735956574568067926"],["13400565997275444780","12137755321936266887","7326972402986463288","17671682131548614168"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["6239295990016940789","1547361589255760105","18401640476709919735","7114094856108964149"],["9318188014312629532","18435130386169418329","3766480098071258174","3106557989134157464"],["2325808046777148269","1945848227843896324","2114106318558545273","521337289547209410"],["6986574788972758804","7830188190011954469","3794756259221108309","6394336961791836260"],["16606864708506461189","11582610625437030087","6237998892135769872","16334705201025544088"],["9699839362602832351","2360349923727821411","12723104577103579125","7125201879251624969"],["11556944907932527439","17757852210989313224","15862356154828389773","171731198319060864"],["11573899081912665498","4796864782081800545","10772870545377615409","4901887143149863096"],["4318500221954450850","4080756203215332769","15374891480437638663","14288982342436236938"],["7279139790879884654","10907579284978550702","4127721901660102317","3249295635056116404"],["15127065037723211345","5242166641884836907","14610857254734868493","2954368316832630592"],["17588343795953565133","17630132917494720071","6004307208886843604","1005746225605148111"],["8242856219372588257","3331358905214028432","18303878336916021434","3962837877419075128"],["17211268939170619356","4598464067295107950","12371851637465270833","11182183024299211257"],["9374025248871772132","8500321639940947705","13754890614945236869","8083596446919871001"],["4276471306824911971","18411171644858920820","16439599523906484671","16896915625146594970"],["1591165765988966291","11858064259857648947","17788384330140610896","1596294230331525269"],["304148925361311885","4775616435623638996","10592218164291190776","5233277925322848304"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["11290178202245608326","12104882818896243768","10427876997237061828","14614725664914190981"],["917916051807820763","6670076061156231507","6881854706852639096","3774119413616024174"],["9789620287312258289","7557353575323288419","3208095000734411238","1940232783504251273"],["14696984464769112606","12756172647105354803","16399225869988694783","1732459626643499819"],["4992398805628953678","11997703989996502878","4561370800307558448","6664757030973824514"],["13660818117796423437","11504590010802523255","4135554764883533666","12963371260867287160"],["15521079324290874163","15462284920593435942","18124171266769902656","7318719526313845506"],["4194108406321939092","1791904024342229225","8184316037385251114","8092208211064283875"],["11006999198176293737","13125266603387362406","68478877842893943","457850058067898397"],["13015362600078326600","1465666578442104096","2652682272990549725","9613660327459860934"],["11818257376188541674","17145195151613980197","7261870689426673351","1308231348356095238"],["11372810064646828583","18328174214769908250","10319300364364285249","4062184105420343972"],["2115431222769686580","16735017305874133088","3563453752131612777","16919260939021394260"],["9227634953694839577","1183639412048207362","1388608980681345210","15772555380622787732"],["2512149483582232005","10174060079051718912","16296418475764003792","9786689642750433923"],["14981079639281291460","192747477853801802","8138209262772107550","9732102523253603642"],["16668197378131898233","10186277551292276257","1197250387920849505","5189794656727026113"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["14910386769761668249","3717078370113337967","12413462027983798281","13458123681653496718"],["12856476558114157041","17941062770709696362","14464520702645053174","15876581991101145224"],["7816075368129690460","14252401016884440832","11628720206450223630","8495802351516969443"],["17439648776660991144","4270252545311569407","16959472989930695953","11338627481705433474"],["5435455630818863830","6037902489542764522","5335172691621133258","1970945777103572112"],["15316427087467060061","12891049242932005525","18293705908231868084","1505741136166724787"],["14753269666888918365","17920269516323433023","18407904340088654827","15441676196345902387"],["8412430505377935148","17835872176812533608","5580233758564940060","17657779196776025936"],["12698010253356663380","3251230011327087963","16600659019394755355","1193184058406892819"],["18255893868675943080","12010976280613979206","11521200364659799433","4517290955492987378"],["4836819412601651737","126366414351911821","12160675071793652184","14183230944476934726"],["5308412201784354406","10734844105694618064","2980729701530977223","11181299816453482728"],["17244184755796194409","2820941465191198513","2716318917339309709","3023668294632066981"],["9227634953694839577","1183639412048207362","1388608980681345210","15772555380622787732"],["2512149483582232005","10174060079051718912","16296418475764003792","9786689642750433923"],["14981079639281291460","192747477853801802","8138209262772107550","9732102523253603642"],["16668197378131898233","10186277551292276257","1197250387920849505","5189794656727026113"],["14585514278599246697","17535497653459161078","7564218044912578279","13889975408885419477"],["193168329751395975","4855928126358354192","3999508982572785220","4230235812795202580"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]],[["12314982056775210369","13867247425264489365","18291439970061529282","7034574818119105492"],["11366143138215084725","3305685263654853890","817933227959773687","6037348484404031916"],["4640693004980607622","10798403231034975032","17919054258127249062","13924297338560684041"],["11228104862010606602","954355067493891179","3809558800845125328","12862777969782921928"],["14784654431482724301","9036272977069038005","9076414221507500056","10155078172790940103"],["9604792822466691622","485660328938500853","14233318184346728454","12987671568200431179"],["14900988363255214398","15660865217757948539","5510446174729312134","7901962237051804527"],["696133246162708974","16633500714828461109","5310901937369172815","9658336670463109251"],["15896518006645574109","2348145024638478412","1066075856024128612","6425163991338438566"],["13687285670595584831","7655718125535458152","12616364618389097950","14626646609570162760"],["4818571947043222096","403950059945062788","5912940217963568736","13373025183166580659"],["10126558496688183947","12864113341117326812","11180854129152151693","12240331729961612955"],["4551781559043268974","12791883158764281468","2356939573599851000","2578932986951674448"],["5387116924274001","16701538168160876992","13012006362661770820","15413493535008471875"],["18135904251401812784","14013716016084334369","4975784017431746294","2304489282889253196"],["1163163864514663906","15965728070094246302","11784023944111716190","17618925998964838692"],["1591165765988966291","11858064259857648947","17788384330140610896","1596294230331525269"],["304148925361311885","4775616435623638996","10592218164291190776","5233277925322848304"],["8553007911274159383","7489646299684859470","8969474252917514717","4741741527778656662"],["18260455350337658094","5029316884275867199","15377724380675545821","1450009793549437626"]]],"s0_siblingsC":[[["556193422726261785","2044535384805739338","3550228070988199308","18095828970740305858"],["3008842906847266961","5645539711396100914","13547691098286262452","16463872737801090163"],["14944390570251251932","11306535045781981270","10260423364545905949","18281217410158383356"],["13615659212780238341","15258233567727803088","6156587776359908904","3777383692355462222"],["18255253159508086219","14766329672826233011","3720661780436535126","11010888965702972416"],["16340507880804039631","13309051471291772518","6695892606035822586","6138621299292829301"],["12390405927623307256","5086156352310565162","1212039881459097553","16590630763800190198"],["11287531755789255004","1400375694695961247","4808230586025221737","10538455958056493418"],["12217831188532918563","10352355095379022186","5095709185500013769","15505444717206053254"],["16048110807379614096","8980998312851135101","5030814730629251076","7160919539105659087"],["9807987056640790071","4261813312661182079","7691360982636694348","16211554408650802168"],["15881734986630427504","17526947003682950312","8236517526857536935","17600686736123050659"],["6757494332795562949","13473938936061381730","9038109045075178814","7405343395116827862"],["18135743288924020353","16527943016663471945","17619287463800618098","10266894335540556803"],["13005582304936698176","4602500652577313890","4226410521232787537","15610131963921216811"],["1835391189247437086","14546475408653048693","7945598013241966860","12707689623850437143"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["6926782365083931320","1486904920990214990","18030569620525394951","15056221422258248196"],["8282087376116952808","4990458878143862069","5945930201594067262","7585740951800053946"],["1608618735731840459","13724439939150009729","546370542995523255","7485808837980041255"],["11298614167820493957","15807803860817567771","2597580086611773658","5842767771047601140"],["12084442083629699247","692049807334483600","13935434069795593681","16516386882475982914"],["17753784955025400481","7831936091852962582","10193587262180717576","13850862868685808978"],["14603793718740430216","6673512446588662289","9019849876201662986","9115415810661469212"],["16507786772007007413","10659491649554913082","4824123059261465841","13422207802139084255"],["7012720576838781973","18048486253524209765","18420232616089659229","3649145143128070727"],["8072213218834833556","16601582892634940770","8732462058564494873","5233474466379880103"],["2157357070979614261","10377400759789309075","7184115130148088596","4745948474588975305"],["11262752303045335504","16887582167613616751","8080993783355542266","16164297995375797924"],["1131198042843160157","6031085895362624443","12695806623332587406","14931588291124951823"],["8051491648220739911","14599405739318932056","7548604277935751366","5739206015836040516"],["4528639246955485152","14398983106869424822","17847916064117318989","11884908539958076483"],["869108967374166059","9944089751214829993","8737861381474453395","9573125049396863405"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["14371246212817646271","11740735135126452749","11428884518625143494","11905117419595726556"],["15254503307886248980","7798581776219175730","1565706249269467457","1563652215244174163"],["17321602854468627072","2245307483335014686","16886892223934618303","11590660321913076051"],["12225833133537694123","18420362692619317131","14451483072168782635","11677801058358442401"],["3875754667939519016","16674413028867288181","3957018415491028894","11232383190408662925"],["10652660010682019353","6695743591252935540","5049262688428320762","1912829007830001233"],["12086202365921077728","981054677805132232","12870323062857659444","8271495551997523096"],["8255850510625739319","5726718960618059568","11611640691984169246","4017700490318218925"],["8782848087624970501","987205658536127352","6133112375028012441","12352746620712499398"],["15970063093399419692","663989974127259806","2350452757563959536","5693804757304109985"],["14494759928824287708","2917962990614436380","7585008378611360924","6785321712329158072"],["6119709571990051667","17802591317053289155","1005990479200763958","8870512318149825879"],["17961804717669203166","13047967114074887978","15631433961090541397","18082488280724200856"],["14105412162112092110","10479663333474028745","8272804786077259152","5438679345137240335"],["15042036128794929323","595727036637743946","4648248218180999082","6424853813719801220"],["8447565201928322726","13112698416159375992","438510426692110218","1695316806484809376"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["15679389988325186518","17672554511575847462","5308570445479052981","12537935740943608843"],["972724411920537911","4447354535433681281","17872993477070546892","17153724929196122851"],["3668724033479927678","1760194528749538328","9416632844623754469","2889333209790650414"],["16186219864421607005","14645098453526142456","10146540356845399832","4840418823072537677"],["79666924199144851","4794966166305748012","11546883781127694450","13899664351517709138"],["12998165165321796756","4063944783559854467","11294748963226526954","6496057692429204529"],["9019534005481759132","10930044769592250469","12290477270216690935","6261326687175270248"],["17393142111330985574","8168111849008881090","6972006455238610846","18139318015448963469"],["5334899426459351262","910936045069115475","3589947798910536685","8776365788212408551"],["12244748968469374616","4543871431969131089","3089319657049504148","4502271831328368261"],["10459465234952620230","8820552073462178661","17314851967082128014","1547300411717673705"],["7773035530914123376","5924868418725816835","5467838950386263133","4706095498121410600"],["5592745627303002940","1632189291847485949","10761087487437527000","8110040262657876009"],["15848832367796542619","2862690262038340837","8677367111271386800","1347707884457248499"],["6595841642477281636","12299002353628461706","3999284933147074647","842762483325550889"],["2295625485825794318","8607687931973758502","9866631591926537178","5962316801069057777"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["424360476830164492","9531637624978220368","8058364558367785600","5264306950967673308"],["7386167827664587129","13488723545052702276","5583711389801725277","10016393611812512923"],["10158724620420623561","15677158297631251859","1093547018042893690","5300494960302823465"],["8836839451340912138","17453085298202429719","16980066200258324637","11483408389665389706"],["2315870970223436350","16911246309769637894","4137560751342831258","13115193082988365549"],["7515520528961040481","1397321678272648744","9409852712712468185","3277074871976092331"],["6638480728904398215","6378323088558493482","18196701504847329843","11943191887187981438"],["13786332001717730826","16150296531865692004","6148823906015584225","10489255393760886186"],["9880085421886161370","813003041235988192","2952078641722263061","9773499596152453003"],["10069601931543589610","16042771639029857765","15250234086337449257","12278040617869620700"],["9006460117799257733","12525782987596128011","2256739060973954268","8045510089945350972"],["8493555742910630386","18285081793636848803","14409068838177521639","16653914666613148389"],["9061266199095058165","9980840609044611340","12481070419403269353","5004959698140916306"],["9651371438071263977","2789405715047902481","804885954452782327","8509402352146854931"],["9203603097314931212","10679441803873230658","15314457486439199866","5018207089951443370"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["5906402521605007550","18276096741112677610","7632984925975620562","2402522497922190314"],["12467877423110279456","2614775172519316816","16652035255870523760","11062874753404508401"],["4767575481441323157","16411076450263512038","8139685403038818247","2584748405567215710"],["14578938983548094190","15870236952990928670","3697455752311164633","6512234848396424680"],["14811238735989370043","14298405213069916223","15459098346462338057","13367185324036170563"],["875180403621482640","5047697289107650055","3154147310525671920","10878081081490038811"],["12850826712905673697","3802199495535957411","2188569492987760558","15819107184767275057"],["11224620601787967141","443826812212341017","2643526865849141435","2524950298870068696"],["12650319052765280234","15121833230202724076","15745538495252150195","1585043304873828"],["1703907343929809956","1938918386735876883","1417941267502593449","9925532829844812868"],["7572405877771701731","5584662783129153929","710328619471416604","17600176878898700645"],["5646366256665228516","10518106151889856464","4293888421190931990","16427680610231643237"],["16591250803140384019","1855407441357865258","13595815273447677622","16173614530166334478"],["7789636084622083285","8574832038157876849","10844693058793200454","12824185995250924440"],["10711371731927521202","9664183635952067958","10208998599696435940","5952422119534306131"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13348018794841156659","10093923628838584861","4326351566944361534","14196680324775815936"],["11397515753781047028","15940917114801080478","8888375903056938282","15898888909434005172"],["15954552518152270091","6600851700523241785","1827506287152518","15521147381062553804"],["9610752551667721136","13083466728672911682","17502795922558637613","6247104161353109865"],["8953242013511275285","3847498040951216065","14045675760083627798","10606178256737539416"],["11953564526980997461","8309654051967412354","9581333844236895363","5249314647512783845"],["4210130956096161046","12957480333903494537","11728138562334946122","16429158548419679490"],["13205590038794300949","347813346352766074","14571230152640377013","4934168551354511879"],["11051358648579637010","9374724968359598742","13750053124405578723","5151716753700712566"],["7708845446699350032","3085343975568149296","16622184306330565398","12649165559749611301"],["16629775232215836173","12335211332497311866","7609008647776713889","12499033795617300208"],["18443637027593524736","24633482674064848","14544283130693188784","9946826529963251672"],["3189144390755054523","5077182050224456592","17929884547023421370","4348779085618831918"],["18161838377043013552","1489026509950573359","2936074499666541490","4363687841645322815"],["8790651809719863585","12665664382608069520","16450868780220168120","9790792431970747567"],["13165348161613917386","14267220877698647908","6367680899510308139","6588464893904805809"],["2192928023062863610","16866694036386262182","17293519033221418220","3712372753953897681"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["1853924945616336163","15655310426704627549","11056765120996485293","8699461408146118129"],["8811858808211918060","6119809352685211047","9506272439195941906","7432359298695865209"],["16584092171052583187","12692070872231254260","11865856395819003841","3592555656404182080"],["8687360015618012576","10107153067001953802","15604751981512437014","5976543006623123316"],["2292392145602033657","14250815320617375075","11481759553054511174","11530036677235171715"],["8027699370676181700","2794752051366411926","12369540396338988605","5045882686941128836"],["11201538121419628855","4318377210337946311","3785221383672190810","2115853827143998390"],["8176598232273671357","12288895334467842145","8138951825374461756","13375662365323078877"],["6830430056116925702","5933588587003715416","7263026533131782384","9833257864389354757"],["3499694128963416080","6688867618266349610","9240624534397978301","16678250845343610704"],["16111850753918747799","15343334134288138831","16769305276982512151","7556999917964078109"],["6775048270421718424","9886493365205656956","17100713289399125857","18371455098724008263"],["8357201638878824377","9142862390381671075","2541356466079391085","12782494170515263154"],["3303978163494319558","795482097037885768","8648486193124349573","6395643951462967893"],["6273897594145983808","3048017189743975810","3447251849551019225","8151067508856838492"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["11735587105419016440","18211999220671355218","12734055381706526295","2011999726207926528"],["9054170699354278959","8982213179917525290","4920621207453608299","13208495807206387152"],["17951842099258544733","7939374800194209216","8437380582927577922","2992698609951865861"],["8992549566870810478","8398506309594418217","11012164230843631430","6012681038364695258"],["3290395111420125368","1570905602511495294","963559544046663315","14604439619143977401"],["17877766714652243888","16372444266601861959","9565949885990654978","16362091772100622559"],["6241012650600660240","4752063762911720162","5279912473443701248","4870367198421711578"],["9984595686448613293","3460623121313776015","10683763478594972911","16981744339132534334"],["15939316527454810663","1063243592792745586","10573689202381562955","11730421643318464314"],["3898071112124045004","7749758145644963117","664565174660205492","4359911609058619498"],["5525547226078060668","1824290475324802157","198771668099109521","865854679158741801"],["9544905418342616698","10791167074505210373","13928996758089851859","13973984695748214731"],["17158276843872225620","9625757119091099085","14542030826891036013","12509623511381767303"],["6299542262050410318","13616454144780327979","17996381811886727018","14983183766975772947"],["1570861705861335033","7250155633413299880","2751012162859181260","12465010399940768622"],["8280812836316470731","525459528857064349","1224234600473223565","11407072143640540358"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["10002704346432578685","5146994946783382926","9495261327254524811","17928316486463638279"],["11754681592552105412","9941740572207620111","12251255068739714536","182438343325073999"],["13741210923088939967","2830508555399729782","74710072213715959","2746290051825365239"],["1192620501771976090","8389157110311337589","4151434680017095124","15207848570847787972"],["5940028445903794631","16532223529298646478","1840778997399764509","13367874313235644642"],["9575800737146602123","5369684066847276862","15421779694955268364","12709512905396942130"],["16347004633177837911","15737443084793038641","14115151572399643906","8479401783177874332"],["13266256858115811214","6180257853095875065","12358260208193107414","18352161726281579438"],["4595112009738229559","13746270584702760076","3252389529474883366","5999918109413538095"],["17750604216232232895","15268677739473590886","16075463614563520203","4540361643052112942"],["10861429707810459372","14394667433074719267","4365797589280741503","12666129233560457027"],["10276481048202788933","15293858180772154705","12425291373264305631","6508784667488198569"],["17961804717669203166","13047967114074887978","15631433961090541397","18082488280724200856"],["14105412162112092110","10479663333474028745","8272804786077259152","5438679345137240335"],["15042036128794929323","595727036637743946","4648248218180999082","6424853813719801220"],["8447565201928322726","13112698416159375992","438510426692110218","1695316806484809376"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["16890956822992193118","17175549382297485243","1571402212154357939","12477268009629323222"],["2031341916209764624","13012893819361431864","10622447295350271087","15078334343004457905"],["9368813669818850134","8907793898801464937","4959811993385537857","2933827488906198172"],["6377095962337947411","4425447715762932054","10689345935182559159","1919635746757158128"],["16388126857453629486","6016348735622032129","3434936164842796235","6746704643834945091"],["9397656492704214058","15632356162200139762","16797561744653606458","12270805767614764216"],["10263069727154672694","14466560928770383020","2902657260863487860","10070049105545376364"],["6627347861144644314","5881837772193846422","4178875417856859112","6766133621665813469"],["2465113608195643213","517814459112672529","12690484643034917240","3495829141445964846"],["1815653370929609900","17329791950198036756","12752566594055934169","1949155976265825839"],["9217020412726948007","16164333082272840179","2366102595408610617","3983915416199617273"],["8134864750837527075","4869402811930196364","16094365901646809596","12917901718990193761"],["5757119841344221926","1047375555582422963","15223553911303908834","9139988638066409385"],["9157807594070968438","7279708094612740532","10011192364103547856","16743953633899216063"],["14279287621884984917","7251464831647525676","1575487492063749912","6276845344428371156"],["869108967374166059","9944089751214829993","8737861381474453395","9573125049396863405"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["2845566715197540648","17759861696296644373","3678424077255539389","17787996242425624183"],["13512606197974956205","14848890920131833023","10954002183406013746","8872631497040171030"],["15173682879536708361","5672778941690756852","12369750827380279151","16505499049021882358"],["2133558646729347805","11564229237794696577","13299340004494852877","3817128298194656775"],["18019056480530150632","5458341318818886919","6577880010552902489","14099356439269805534"],["4968087488841832970","2413084474105246102","1935831816878618494","75727003280417570"],["15151675059458230131","18073925942061828966","4702749278734908429","16942781477688705951"],["13670632725156920602","2280402127345039483","14125234673044562660","10367856610629448252"],["7837659011739156114","17067918309469637611","12498219237923974917","11202531298485455260"],["5833773765058914968","3784527232687262863","8794605504805229046","1168604473499228427"],["8224180342811970872","1973528960728664147","5729340013994112584","8015518457067087296"],["11397814245252619589","6199052409074036707","17958666257075072888","4220984083160364452"],["2524345590036180643","7210525362740895650","1917430157802944392","3420718587012449339"],["8926440727413754812","14819650308918481253","5811631523221757428","4907804367015246466"],["16410319377928217665","5613839697873235113","2487526580781448370","1225935547748344874"],["3811231592098720608","8448373105265692416","490653320868421865","12125837652211539100"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["5506037251603266926","11275586736609833842","4145311112594140365","2781592813179384829"],["12207513622910005191","4914615456214698193","15845995635751567147","5068968841483913390"],["2784365874312297791","4646525793437914245","1226652249378617731","3253212695935765282"],["16436852628408227185","3059816933388625007","16799578943896006927","7662649859416658463"],["17351607113759841148","10076977770962808019","13715791245421560419","13524468647038614788"],["8538470588318023127","17659487873273922631","4550507096212845471","9343858816832324516"],["4965309247507480897","13848498153719910863","5435408784642922573","14249085772641680599"],["17888663053133667928","671031253511659380","6771152062539951100","12847872065444038218"],["14515152136118876419","6800840770646192518","381052025158010400","8951629701093167875"],["6233620244982502269","1711911112559224908","6449079972317274239","1166201624390326993"],["17310042264993291263","15778994094714125576","7879854709060592711","12669359239722594356"],["7404824184581515463","8567487365182398061","17240324346692612606","17618088298417125346"],["17909200417644115831","16049626557126864010","14953709265310154016","11112311437397033481"],["2437624690343502159","11309835629431718403","5520688360056434567","14041760041122251978"],["1326685953664694256","3109332314831955520","11392699433477899227","9725295333074540145"],["277638638648574701","9583542301685115269","12371050104027221794","11061520894606344142"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["10410751719735753969","8632731365435761899","11357846961931743679","15304564799440463108"],["14413067626541762915","16483481785716325642","12902535784213824661","7091098448477189324"],["3120741932318862544","4423544834878754124","15089359169967782490","10352773364825870810"],["2920315173224953380","17045580749716584961","2017301528341190217","6586457445081297375"],["12437082503546300432","8403593997212216263","5499099621543781480","17742680312322635519"],["11533144980869361603","1029434794183369257","12284623385750132164","11001908122329126533"],["724679767834762929","1146414958576478226","10226271987102788472","4556628713916050850"],["12627077555263881210","17552441466753842280","11905567184304889059","894446619230484809"],["16596505423647199099","3270868866514550739","12232873732171049533","1153122261745697908"],["9619821786820965394","11281898913462862329","6800767397905385514","10930417712930733719"],["3434321528698792746","15286971763174655268","4964759943500553957","16994535482708930077"],["3068286401717496148","11614693152201061615","18043212548685567614","13092091234265786840"],["4556364824530023311","12003009127650377231","341017590922171436","10968706145254546372"],["8299971072893045760","2482912948236549925","14960897130531998052","4135797353724262520"],["4403802434878831881","5422227429683284445","9751218811148880421","14136944576102627412"],["7635239324268522224","3644193782740922068","3770420575850254882","8967097228445315688"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["17663940226274967267","14302170951040116917","12822327957141290475","13035290740551980457"],["12201960400091346074","6397838785875110628","3668397591092341595","11076429264702477776"],["1177690600906016698","16739776348609359893","7807856809472859890","10074544103181639286"],["3249841301570920037","7032372426710642787","5369774942154925910","11146647757503898898"],["12884534389000175205","1400517707229275117","16941770413245714154","5407782120422018812"],["3338422605276745887","9390153736065950815","16881106502308445055","5841479146305035461"],["7526344897908052824","12186735080079739198","12811902471546514373","17068390970537410493"],["14744398454614717315","9169469510508486147","2960429457292706538","512336013480947681"],["15735880328501516168","11836798146441306751","10168230003674619556","12935684534167339685"],["11533040527605274486","6517908333751294354","12474570199222356588","7023521472752950566"],["855793555553493662","9757457236877640274","9813919335248854511","14411997773150174508"],["5728832506286458174","16627785445880007596","10463613755370039346","7305411336325227372"],["9071520607011518968","17639531854513162945","5885508653051986847","16795213169527515269"],["5379624921142009188","4118201108933018942","2911365268419707597","6154550372664049759"],["8012788336744037940","10473019609825172224","15283840956305007116","1731319719417331402"],["11477233345027020212","14832645080858559662","2867355695204893483","166496565302566572"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["8861917658763096589","10196083263444373963","7854099700699568727","9103210598744624870"],["7700871565876311588","13738874774178790289","8307667476886711025","10645063242685742974"],["5786578665412686492","17536705446147331266","13771219750894101831","17012692440027722404"],["7513615130518448220","9396007461555939635","12418992357701893072","17207145180788027094"],["17474559919429126584","10719534196356741219","9196974218093846265","16033074022257901094"],["5322761196951935602","406293628975765099","7240931263468442406","8277201869361491536"],["3725766701891582137","4585758309786570954","17260447399805358934","8659455768174523670"],["1283344419270787610","17931311616230659674","16275059263171268890","6394161850010938473"],["16165171355684895522","15872461575700903736","493464889023425045","8432256214487376664"],["2159401339421360878","18066162348808483942","1844240509936119737","1799821370013721574"],["15111639637846231567","590091325430155205","7881746522894213700","1672382026427153305"],["14234372754840117702","14866617100804158954","14870864430511652754","6873393189332116738"],["10248341806500627981","8621420554600015283","4889946383995993171","13746349266461343810"],["1940642006623103612","15060965330190574573","587279249449110145","15542814158767802594"],["931311743981461908","17675264942269715202","3039141823971697722","12711775096583092594"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["12338849578223233547","532126337061082635","4191263636239545311","16882198142230961458"],["9793147606123355420","3525754759849965034","7644124476003892274","783915417293487338"],["8660523482149032761","17702601114258188496","7500779478152669520","6914195350113834429"],["17881111230158442947","5004103407982025009","5141093019158309453","11193453875640303591"],["12705902342523783418","10954354998943481900","18333590365456683223","17875053814698459575"],["4294859950200546185","6412747284186131883","11291822822739502626","5659027857330744581"],["16898191998515998111","14561930966681809037","11090450977021115985","241453506261325364"],["2351800856156761749","16896466040394264682","1529909630186863555","18100395439002086987"],["14527239612776635325","7792199319390218859","1483364296150205790","14284955841674965124"],["17948091016740865438","7170650702088328391","16089370029862545565","4231497415306773245"],["1096054893045793917","3578746407341036734","8063593578641991820","2296406433142078749"],["8522165528956379906","10728735037197586992","12036935752385112788","289368021401518465"],["5305072072754772338","1330265132656870926","17422636956605505519","4693617563143225630"],["12094330459166458859","16723933241232289433","4724036411567447201","13471587683652389097"],["931311743981461908","17675264942269715202","3039141823971697722","12711775096583092594"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["208722297038286544","1210330847899528021","6565518295851499187","16648380057058188423"],["17140223313645423009","15221334914363590781","7189346057915850905","88517551233145548"],["13479233477221060536","15465003132977326661","4044551703652224157","6455102527475220677"],["9330956990361355937","506770406882900531","1170461270794172180","9096754744769338899"],["3288573034861501778","17260898464924432260","2162002288961519691","7869970298671247347"],["18234317556568800304","6974399175032251260","17899184361518246884","8089657881338840449"],["13838254705986029988","10726034162658826766","14859947465840260982","16019659561679502781"],["13569189968735538003","475382589405632131","1934665195703171436","8264218152132760550"],["9923397461651572130","14674017886305071972","17972870126314762232","7247163165300131192"],["6616633982893218449","2100531925841381437","6154036035156967333","545351851802761161"],["14480060088539308456","4259985997439032789","5541486116362189301","3152670457467788137"],["6199541285913722674","12823137138812558106","8879145872612810451","15096726444455462658"],["14002399740919801602","644331932562146580","2184302631538524354","15577090271225100255"],["2110425116479051960","4408648259125140716","17897974252553279653","8126566130535062298"],["12713677693401806695","10379167785296499075","15254166850524763678","13970932605692209977"],["11866708173456013239","2780833642891994544","713924719285448435","17842510456506299779"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13028007630556460927","13872874112167298680","4769822138102126594","18000899559913895280"],["10759232122844037496","6393460211542393989","3958778935280416188","13081575271958619174"],["9984509408762632083","18005100222433349300","11428811078009690109","6636566592553841888"],["8465404112038564764","4512447781901518900","9618311260851716154","7013632320237020304"],["17451416399639657208","3307757447219684921","5261314161471078515","582462703097068196"],["13867978918160596722","14833165362892239175","2793741967765859039","15491145414929306413"],["2821713892895038003","7422877285947168718","12813589599729699633","8065062450866708585"],["8075182772991264066","6111563312005836242","17500939429017555452","15019079889229945379"],["12313772565482611236","885337324082030995","3694912910317034885","13414985587511531156"],["15537481920124901545","4061783653110772702","13718707618844646785","389688733475738485"],["15394820889710576931","11301831687559260913","8573353370321113881","12098423951465028706"],["6028733180728993953","17127022619109976983","3965115198878257932","10329269083048627602"],["9889143169437141443","16806080800339878520","7979767011817616717","10006073363052971625"],["2873049711665875866","6630911227292821362","11469788645814698960","7065643484272636974"],["14279287621884984917","7251464831647525676","1575487492063749912","6276845344428371156"],["869108967374166059","9944089751214829993","8737861381474453395","9573125049396863405"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["10933009179821656205","10635791600285905441","18113746976706646695","8030367122895072429"],["16006915004773885647","7151062075780776621","2210811797828672252","9011618445394672658"],["13736805734607045952","616353375203014698","14853215188143584868","4230685350285485966"],["9508361416103430004","17664123197049215214","2752916925612427558","17939558411377316233"],["15263008545484038640","14390633234048874163","5472535478812816936","15917268007822525928"],["10739732318754562649","14456278506467676854","4400805366786491916","851776667408424254"],["9401302192421076217","17515099839069811171","9529952990380265115","16461017530779719035"],["1682061120539606739","14255916538163613423","11529964556373201912","18436685091846880147"],["4575478545042829257","12385680729164943931","10314691883299686584","5424443857951328098"],["4111717046764404927","7484156943820720560","131219902725778011","14546108703992220698"],["10483564034659496435","9835195402394968975","6945922721538020441","11339621931613244887"],["2132441081847455253","9972437367103122666","2857036993046032948","8875822928431259472"],["894729242390721156","14193116502913201366","15971047318002557010","10350420962085972263"],["13299621479640663721","10970895858493545553","4944163277130024993","8382501423357404445"],["6857333481849779111","16454729710574526104","3989451403707511992","13220592893677479238"],["7635239324268522224","3644193782740922068","3770420575850254882","8967097228445315688"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["14279354919562912299","6542625278502671200","17610255874653176731","12900150628084956809"],["10534946615938090248","18137137242589119363","13850888804516247856","8275891641428156826"],["17308762596903892185","9997572823635746907","12139734196862501717","12362961821269139673"],["9933397316009144474","9969220626598505440","12043040286730957118","2628641764207660100"],["17740657926669220913","14875152331380325287","17972703941063388816","10151618762462667230"],["17948268481510018024","12800217661070332632","1656789528201389728","10048665381955969029"],["9674129137886479233","13611811327324190182","2349567536214999446","14671774432747140039"],["2121023068654656860","7366111751353457626","6257632488116180636","122087455354952531"],["12313772565482611236","885337324082030995","3694912910317034885","13414985587511531156"],["15537481920124901545","4061783653110772702","13718707618844646785","389688733475738485"],["15394820889710576931","11301831687559260913","8573353370321113881","12098423951465028706"],["6028733180728993953","17127022619109976983","3965115198878257932","10329269083048627602"],["9889143169437141443","16806080800339878520","7979767011817616717","10006073363052971625"],["2873049711665875866","6630911227292821362","11469788645814698960","7065643484272636974"],["14279287621884984917","7251464831647525676","1575487492063749912","6276845344428371156"],["869108967374166059","9944089751214829993","8737861381474453395","9573125049396863405"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["14921179092946072221","802400087236501175","1454113335819623991","1809104031822870798"],["14497446126502244114","5032070977304844528","1711841949384268157","7610232921292159401"],["7539869249017190887","12521717920712213009","337885214854046754","12101147916539762443"],["3263217566578399181","14527869666329119401","5259211150639009865","861357348156944263"],["4564276539895557000","2402908485497200029","2526004684211603214","10822595890068271608"],["13149040618995741899","104747051743902876","4146617214987431508","3199825815433792933"],["2303013280955793816","6349747520038461964","1952129809872054060","7956402392637737371"],["13986593636398651655","3870353101441661796","7131467299627270555","5058176989222510155"],["9493273908235193466","7560373300434706613","13058942955426859077","13101987325315703779"],["12631277700669739704","11867668804554638252","16420653577663422177","5330356546757822894"],["11324182531364354842","4327123003071037785","11526440789553115687","15460287715489723003"],["15382766063727461140","14690833126259473038","6844049837496152881","6103255306360043117"],["3189144390755054523","5077182050224456592","17929884547023421370","4348779085618831918"],["18161838377043013552","1489026509950573359","2936074499666541490","4363687841645322815"],["8790651809719863585","12665664382608069520","16450868780220168120","9790792431970747567"],["13165348161613917386","14267220877698647908","6367680899510308139","6588464893904805809"],["2192928023062863610","16866694036386262182","17293519033221418220","3712372753953897681"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["734892719524443376","14787984661445387509","3426562080566025653","15411327107462573031"],["11831191715181650960","5535411167078735316","8260835995147960776","17751292481334070937"],["6895131071923805477","17139978231846526262","4666404166642311895","15092881389965020971"],["7833031331428496843","10564058405976596555","10076078486859254868","16746123192738212194"],["13747416317343285155","5127552690274146240","18091130386211732966","1175812191343702879"],["2282310894359506437","12525571219860822374","10313806711961046431","14691152516475467429"],["13396004147541364038","5306544680415348586","9641027965024809967","5064964323276518817"],["10841907980812002398","14597159801337802948","9525877734031394198","5625600503348400889"],["13426396761476995490","4722045263031276344","1578034077853746594","17168895704843652484"],["3312779005605285180","18105301352487082269","7255669983244164600","4308722755668081687"],["1222029820138951236","14272623498178431553","11397072655360118053","9007270052610082969"],["9601296232981956253","10197184125948359971","17407253822978200216","12134711618770981936"],["425163841614298870","13644433719812780088","11944873143315776956","4475566952031976363"],["16223205256761480540","7171807651749867748","1099196382347469877","4048469882935385636"],["7794448169163567745","4915952800689168680","4841011479410791223","4010371936168655297"],["11866708173456013239","2780833642891994544","713924719285448435","17842510456506299779"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["3599623095435753245","14762586838168340783","17154898809043666135","7118117283595402070"],["4230758417607596515","9926224464346226585","520395824905605971","2017993194690648375"],["9535789240496533318","9543288121738025514","16460178715590722425","9348294315459852990"],["15618749783659909648","12157532245481683019","11768538432790273420","16672258594396947890"],["4519020373968410577","18133354755447808814","4961182528874017115","1745572867032754283"],["4170279699264637534","278140830077706297","4651133990535112391","4374903105094266026"],["13067067201094576625","11925747221596216619","11519730121016010145","10857851359260348162"],["17421362241340168085","2174021499404947811","133761767653092616","4881322315416883176"],["8811909056168902408","7624279758515159836","4023598998326554363","3333369004207015517"],["5139172263443142075","10703791780004016068","9949442696906535081","8896324121209296473"],["1958036035515151262","12986110765873247637","13600076535694037480","8012240397421526593"],["18422711454834947917","7742530408876858069","17145355074421166223","11179599106427430469"],["3072723001561370568","17234512080912317776","7688750149550802520","11507992345301743396"],["12402550458606978777","9264243139631678412","15335742766181822790","12083529126790553937"],["16405715829491855810","7732539388454477131","14396121244139795826","7992206723690287884"],["14787007877581615636","15497199559521197543","15420379068093430234","12646210699290383443"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["15168032935961301661","147465599520184470","3186315505560640270","15078915574517741879"],["8476137941988124238","13255010151416011130","10636349702719645519","15520083744668153086"],["12126051120324734323","11148200911843354675","5907806512503431799","7056294816175423187"],["7773606226912578219","7539293221842629798","7167898289381514376","11480244610031828183"],["3396318183312232165","6400561969377098413","13643594205518794043","7322870319045858961"],["6639707864882203642","5926779063742017223","18368112954734208992","6932918406534814051"],["4819753530147370364","11367948835278751449","8907917140472429788","8001787566894915838"],["11039955211311580516","17212315845183970547","1625276848532823513","16020702643867284381"],["10922950801998699456","11443885947679225503","2530985085118005495","684389814503457145"],["4311966310863252183","12154182177385427447","1018443889551295619","15394506256064865121"],["14012252736717370084","14564395271732504026","6693316940123620702","14410801981077164092"],["16340306908386896787","10564881098904673577","18187061491635526691","1300641683105779952"],["7464737119870760086","8398704060149589752","13561869236352244483","1639654592630109595"],["2544056665464517544","2411414607359057611","8369679784364164707","12048492323617851104"],["5741448719481678020","2080804365454853498","8246410138661681207","11965280283095628572"],["14787007877581615636","15497199559521197543","15420379068093430234","12646210699290383443"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["14830741798361269781","14194081197044333039","14409644275042485528","16073689482058169426"],["2533179706663733227","4490485141444637564","3237945270590728169","14608889581269087083"],["1501872851797515285","2106219770229919896","5678938260070094131","8527441820609737949"],["16386373997447481257","5036196701637449914","11537975596182110736","10790040729980114175"],["5393608173957933391","11994352911449174447","11975372609754389174","9641026616463684697"],["1608942169811379656","13325006531113298461","2803774610508959406","9918412008047323962"],["7926500895925933533","13213700564370129629","17249461466617900764","6022396869685857101"],["9200446749390344769","4810659603249350738","144141152303553510","1790357805241827143"],["997114259874521019","13319813007797986627","12369285469159008846","11651740857272641100"],["1659003858185771284","17528108391147732098","14249213342204893704","9714415971555832882"],["2539926724604162651","13189008687430267570","3681612012012088260","17352334648421772573"],["8781609386810928957","15276471960562210838","18169280111901941110","4128435796388783304"],["119545925783300506","6470127983187322732","8918140426584102240","15589390268890248515"],["12402550458606978777","9264243139631678412","15335742766181822790","12083529126790553937"],["16405715829491855810","7732539388454477131","14396121244139795826","7992206723690287884"],["14787007877581615636","15497199559521197543","15420379068093430234","12646210699290383443"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["17124816602722438747","12580713922793301787","4112422017483278009","3364575154652041835"],["13991495625149566986","4576825603989351515","9213068426979395897","13145773316306887285"],["2065986521999600953","12811620620018439752","422765305404030796","5815000275057601411"],["5082650869970358018","11011174879633092787","15321693738390056710","7415709879582638507"],["14686975540206430294","12482634679796468286","9267165670509660595","7008307073718443429"],["14595176098360832691","12376267667286214664","11796006742814560507","16956471032814780317"],["8865556615697805960","2490296111631089938","1669808098282684058","13442503799073113870"],["2484031585508120755","13852234447457983931","10351948414642223040","3487671611050765808"],["6220817795763102516","16173218003417462","10418545470176972326","17279688402071611726"],["8780267131224366717","16783290075636952014","14269334927722598233","5163395652923840277"],["10669983322114148568","15640951673317332213","2097850180369686795","6462567401275087952"],["15187287218692307544","9104042681180856896","1611214085146959530","17454013516130812965"],["1139385666069652796","9128990805822558062","9132192068291861372","8338131741287810282"],["13293623399021478647","10139075909300141405","9347589487572685809","2521245772313997543"],["13909570486439425283","16721948597343436598","10389351594605360728","11587248071745754468"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["15809477150979967107","13750728722507070196","1374874097197182149","10250214913274632647"],["15439689518973065966","7369339317090613057","14558912228937913899","132078816321860509"],["17082405545651420172","13452323329788465742","7293542823946480668","15727197471452750570"],["12413840169384851052","13850980522305205125","2439841225191478449","8014400488418527744"],["16539995716268414090","4827179405198945464","9596960547352175206","13138233498438996792"],["7497859695563686900","11307797636193706101","1284786257596053839","12630172197445178491"],["14554073892489884671","11166048045215705761","617185921397604931","9357097014639288019"],["12264745587090225853","16561252719329582466","2954737346336697064","15327366078952340073"],["10941646357237017770","1130412607356964462","2305087292926210091","2229690161420698304"],["2159508365576366991","4548354120164649019","13837660122515351050","5807562261196709904"],["11468088138554168390","8898350679888557296","9844260771658922341","4607295131265831122"],["14389844900446838390","8118722653453986681","4753669214155239115","851590380904767690"],["5300750215518512680","7893657183460418313","5177306017745607499","7726765461131955866"],["10638379641452141949","14948583011377418085","6281385582535071742","12785933007743361269"],["3978823544199906787","16301888691623004092","2500636796429483123","13118662680404425297"],["10509066551531909793","18051754802660513565","4613257967670994689","14727975837904249345"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["11552449351816795325","13304914211625811220","18225494093186783055","2634297729820743345"],["15312682480097711981","10485141176475516135","4937823000227967911","717999218480020904"],["12898032654988667535","12955970507669916897","1930063150774274898","10630971507741683879"],["6840088415935940467","6933250203236149165","14258471830793314676","7453125707570204819"],["16763273579502547774","1863947355507099725","15005034690359991627","13987145131665104371"],["2157934297020070242","11803553069286277606","15586066514653657568","5849292703375775808"],["17011510418320956125","5555771809122295230","7706508463952339034","3510032943941307439"],["1451165868330334619","5594133633625575553","12958597549333993386","300162527364938329"],["16165171355684895522","15872461575700903736","493464889023425045","8432256214487376664"],["2159401339421360878","18066162348808483942","1844240509936119737","1799821370013721574"],["15111639637846231567","590091325430155205","7881746522894213700","1672382026427153305"],["14234372754840117702","14866617100804158954","14870864430511652754","6873393189332116738"],["10248341806500627981","8621420554600015283","4889946383995993171","13746349266461343810"],["1940642006623103612","15060965330190574573","587279249449110145","15542814158767802594"],["931311743981461908","17675264942269715202","3039141823971697722","12711775096583092594"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["3145499761416101895","3024743822734106740","8317961340404101782","2533652931790886150"],["10660877515647128842","3707826207358967746","8831341598564168538","11046480573711242583"],["6197589416380845128","57273176423750660","622466837974078111","9584605083061169106"],["14889874875545432541","9140130857466123684","3660796797595048687","13202862316373169755"],["11447448954801329316","1247347188060676116","2431160595831440691","1128230729681687976"],["7169786521067909193","10021942560771281774","9643070758967629860","7673795133847196930"],["4177398315382419465","14313548064292742647","8670641714123588432","10346577065267647987"],["13793481424378673309","5427971354296819019","11381494875854981869","11961958976634410040"],["2095864588677659013","14907366592259519069","15445851612138650236","264331682590301539"],["5672010795963989825","3529163025642341576","1695618631122638747","9528540956174791206"],["2249198536218964315","18179074501300074121","2628057496435851832","8013531843594908317"],["4645813727498769944","13291637684394666278","13661968075229072823","16685133510308550368"],["2524345590036180643","7210525362740895650","1917430157802944392","3420718587012449339"],["8926440727413754812","14819650308918481253","5811631523221757428","4907804367015246466"],["16410319377928217665","5613839697873235113","2487526580781448370","1225935547748344874"],["3811231592098720608","8448373105265692416","490653320868421865","12125837652211539100"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["5191018998806927716","4592105036523348392","17865555407437757980","7485809579313301240"],["16522203115066487026","15371433949167116270","18128682853827616044","165370548921384358"],["6517624843366985106","1721694336026315566","4139411281645194756","8537440226099494592"],["16400531828500082374","6975510349298065725","3939656075308970055","13621852189804814761"],["17069899875913001170","16728104571962028831","6474482352820714777","2447177231377852818"],["4031718608643390383","2669823574907662878","3617697500245514006","18441823746452693251"],["10010666132564276740","8970951096438532748","9436869146777708572","12079541614956938427"],["1682099903675286794","6228119073793559084","1020426477829248779","3860754818209717013"],["6649719042141740731","7192294730179626378","7366648513592590624","1935444781555751930"],["15146565007622260907","15891073956649097009","3215493925944749916","3673378097269977305"],["11751726318183158543","2823498438793179675","4663002314004597343","11481473916319207954"],["12749421329051009959","12750305935829960928","9875410942501163542","12500385987037603173"],["5606230355294681283","11271312090361262089","8032770519741997986","13269566172760750012"],["8820128291023538591","4442357048507223539","1019400865021176282","17996494843852286141"],["18135559813920474078","14179383425470217269","621111700082686705","14208438022806712362"],["16851441821542322631","15755284669326269373","2965024818679882961","13508627732479942279"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["2860918028460525533","4888339209136629624","14796299139427534677","7979664398650741781"],["15453389335871812048","16597520624682190184","7121494842389008734","8698089278844278172"],["18294999536982026271","2621287035929970426","4880953174542559272","1612551261577056469"],["10079189625511686402","15271876710825619420","16828042260280696008","9969371201095778445"],["1863658465194444231","11613435829431732929","9401723884530791103","1942862739107862914"],["10540771676538700853","10592598536465708626","8003691159015512088","4592267786181829957"],["16679866283528922107","11061768466999464104","7067496392288839537","7750938453857249370"],["14354246060008706203","9791178576212619992","6995919958012142815","6258976680309084851"],["11540769283229509408","15131408298418017168","6096101275064798010","8030242273700099285"],["10815804464436594825","11239368037378197784","13658216490886663572","11578888095451890929"],["5384838063004742638","7843029233373551784","11257984100805897854","13786769105108631223"],["18372190593656497978","10518296568587302358","7468512821467750952","10335373227606408905"],["568186935838988503","17239664851571084581","2907417185908391319","14578917724706559998"],["4497781602184148647","9770309026841995511","2009126672296548932","3769487137067186833"],["10526101454538903304","5211596789505011872","11862554111339859747","7865850584889047681"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["8290008244911760954","2516173314992544722","6167670976939727979","18230496600887787005"],["5999157190999644109","10221154599478924622","6557899517243988004","16836669004096445794"],["3132507556405062441","12184437688701535752","1840701163760574906","5230155333097316608"],["7763014352820307230","16578670946631864135","9936673703477326322","15737435224078924284"],["16880495330657721168","2206685465830568741","6123741715446260422","14490972735083286758"],["15652611603788633135","9637772613023097242","7985216298296358691","14058152873444429493"],["18368104360763594885","16898226872281817052","8509642365431268924","14679606316311278283"],["15841210227568539320","7094251759241407922","6659454665574322984","983067161643204445"],["930002194763252166","6280399534402203603","14729956557326597717","8180516223305630533"],["4353462603028833961","10376739380024724968","2341481027011749779","6590798285746610555"],["10974737789303764656","9703266855334967979","5530666204294738223","11736962898968721128"],["7695177350277204245","2808065891373361929","5798878794253118737","13261120060400457322"],["6973935538285867217","1839715072050718335","6773329767151574031","1581301786086785270"],["9908765180309493171","13925735509572017118","4312705065621485702","5192923528455703101"],["13975107105567499765","4776493725633016430","6066579632369672869","8852984207099157985"],["6775248609466444160","12442777071342522240","13361447808815528497","18247472270039453264"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["6849480948088717847","11326943860967730335","14263068706150652847","12006151192820188446"],["5335503937144815847","9060555425570203245","11271355142150053000","14744658539716726045"],["8510844536694545709","5161352050005262104","983041852012802833","13423313790913980610"],["12731561567458988618","9175570125793936908","11467969066711045524","16764670005573826308"],["1361166471044085612","1017675203097096198","6154173218912882715","11506621080685659701"],["18406993471869342814","6966169305282345474","13037434567577282915","5802449229326120620"],["10075003188943694496","17470758794597232233","5708089070750627143","15448209359558825114"],["984090707135612301","11196401970856053697","18191868248339518902","6602991002269148050"],["510873156032123957","9553969483574048260","14788188798893783324","13421544359083310551"],["1889021808575202912","2606693476334701467","13299295178227877087","14482530074227237828"],["2071628921256541801","14302552965480835775","16107882740508797245","17787086223745050058"],["14821487844428546697","6843335024376524196","15033984247433545943","14665221078431133274"],["18105250858673806044","976521792088033773","17113176533113982796","17065371225606616443"],["12094330459166458859","16723933241232289433","4724036411567447201","13471587683652389097"],["931311743981461908","17675264942269715202","3039141823971697722","12711775096583092594"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["9459745536635833903","3954080069955649727","12922176713107380035","17495691322089043824"],["16724512782881220659","9489693525023176257","13582426325344887148","12828707162922635161"],["13031618251413693086","3239579620660104979","4085700533156988230","253948757143366243"],["12228262496468126416","16851133070250880678","16665462466179423591","11741473903484562727"],["8555570575601417524","4777714429992816949","3213862159779648723","17968171338591213767"],["13675530370272436219","14313943416467068034","9607443379918266633","2387314937382454057"],["17475074177192911735","8459209767468376814","18122446931007783968","1777079298605015876"],["16809118662733080580","16214909551079740255","17250268245582686770","12395859037719002720"],["13234617982117031678","11936620138608995913","3980754073701591758","5515507789525564599"],["10749076796607239653","1756272136693722926","2883229016753995054","1179946821815258345"],["9970873382043287767","5730798866120821388","7021778284324914067","16569561900298415888"],["15784096614974361803","16497413181971740130","16244943511682545756","39946193506463485"],["10154033099949431406","13629007020932447296","1963352821031372274","4737798543896784478"],["14507921013732777449","17341571213690584428","7129485917971425459","4404361755492023678"],["6857333481849779111","16454729710574526104","3989451403707511992","13220592893677479238"],["7635239324268522224","3644193782740922068","3770420575850254882","8967097228445315688"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["3266676861904508201","4702461246238889188","173598818891940363","4682637683631222807"],["12471615837195556916","17655129532459291194","9831308734216268496","12121433237071496154"],["9764384894718232073","12982632089616107863","17250042401888991978","2571438408299715141"],["679601735695377959","1745684785809122778","2508051541489653147","3812115912685842212"],["18134634777383616688","12193619419941118317","1072205350955411290","1504894593985119051"],["8772251481599040968","679105731007154615","16726488464644956939","5707949038848878663"],["7508400920036705559","1888761164630318501","18269356592197033230","15478791669035739371"],["15457502870671381661","6709559538756729738","2967622180170305301","6719797786088317811"],["1186979320470571856","16468175468470577744","16776259745602664293","14477459371672976456"],["3817101307735387418","4321687770229247493","7318254452434883841","13523849955518333919"],["12323471778842891687","16732086461982124264","8213176696777376350","16465642397508862672"],["7650212485815329241","11893416221371738620","5763966590163096880","12254807976282198857"],["63808587102862236","3202613549571905607","7082669778464583725","296962362739214366"],["11485737981941402434","1010340972485007757","1995322284597850454","5368473735208132514"],["9723744357300197521","13436526631136212923","9675491976960130649","5402805786407264597"],["3240705440698160524","16339929511207409510","5051540480786876646","8059988927684758093"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["11296702511429252387","14431845903511375786","14765342612525069610","12897520697303968940"],["8838935434783671547","15701864987019806702","13105377231016177958","615594848185784425"],["5346976777750000030","13261881484283905950","14989461933541196149","1287821406969272805"],["7979260063475898135","12029082783291938729","3773700122067317130","132482284741632262"],["5911144303737747077","16575559008281709105","15487883928001951150","4332613706321757820"],["10727020797771785088","9146771597289887199","9354234381233268929","6841553209359161084"],["5755908744990403193","12826791149909342290","4025208231472309555","229707360112089179"],["2057562368646505537","12182896221962964849","16528437673356791697","7693592488725425806"],["1017644218667081364","4093349289633898528","1042643463434443831","18293376504327571044"],["10279770156032628911","566008102323853523","13949598545346570055","15757991234796115945"],["6429414454933526626","1228890544802768174","717165535250196226","8156689951897023427"],["458157091911194802","6372025305245594289","8498254486315279472","4570580222364716095"],["17165742783771161874","16509809412134841048","3319280806863940604","16622185747350346192"],["9834398057682482569","2489227572762484461","3763983908711239507","399512117473279929"],["17597780936672004466","2636402624346807413","10167692533436607434","11986675106726543953"],["3811231592098720608","8448373105265692416","490653320868421865","12125837652211539100"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13062801460526753698","4679016954256887005","10352690389574784104","9538662645272023816"],["11456357366367594466","12620527817524375378","346801715506443831","8660962915834756699"],["17338107662285849924","15165289080688966402","10754059862038386624","17931371732079432047"],["8635777060335497960","3875733345753545303","2080929886742704753","4486008226484121762"],["6437491499075654283","5688862770743571621","7037348047272230811","17486936489265131814"],["17095821980504757603","18231099329826578094","12797408559404108433","12371252068225008265"],["7952609730644632330","8495224662722374130","2670336323921605913","205133967140403560"],["6820282358710398580","14372790327243236200","18252018604159415954","4127692216046537310"],["4020957843676855195","10436257783678271895","9207018524757362297","13316891429367531826"],["5051901641888578796","6875850607875596821","8762534676429957652","16731288959482693723"],["2966290267126886376","6641277821403314734","188993624187553498","4826890183259205868"],["12589167775767390248","17418009434340241521","6581013339845853011","5786567611846206726"],["616019435958695216","12809201406005984177","16213718762904047560","11302567698338629165"],["3193780839993219740","13781297985233689887","1555158172301715190","7392653084267702541"],["16405715829491855810","7732539388454477131","14396121244139795826","7992206723690287884"],["14787007877581615636","15497199559521197543","15420379068093430234","12646210699290383443"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13275020878133217503","102389865140534741","13716353221676095782","18421563256531777342"],["6844429098960957463","14370175797042324235","4967769040865378847","9252260483209566552"],["5906557441379803589","18377192781528326016","1923403268222529601","14121978611798065844"],["18040361056908490389","17335573450309926651","9147562785286987905","9363406156146026149"],["1686485681256437674","9244805889392173393","5044496145177661631","7295944673107137479"],["262343855676079031","5462958785575332170","8709245612132572330","10631550327228102745"],["222839026755488998","11892331952933705436","397139597960859502","2483151199463807344"],["7245405405240738938","4601366709967621527","12800838300999778477","6730730196677481003"],["3243061606323821475","6516297641950460676","3289987958526801722","9705315627961580279"],["12403733563484734089","9844020252951884820","5592676661914426531","13485886093968904056"],["7517211502293589274","9844341505443620153","17416800789154488402","3527579588900741042"],["8944732705613134455","9271642521924241385","8551790244998445647","2930631498917592960"],["1762648999425254069","10486742687366872339","11055476050244755493","1262877747994943681"],["7289977229574998444","6533739941374505688","6501860018579467584","15293995651042805308"],["4001070594949267244","10674831702447771274","13890128037108786805","5207174775701770583"],["6055050752109810422","2788675667959777030","5974438939114923057","5513565242794582938"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["10231947467660000834","1022098101566930272","13074519448410630163","17378722222645457974"],["17452911855947351554","4714314635303813953","8182609391318108583","13231815650318936399"],["5066605020889603825","12038953274869531660","8306988569120126623","10092067239966961873"],["17770494102831318145","16389403703883745820","12158613613159917734","13708932388692164958"],["2356258057433898210","8731410788485325093","2647552462702190329","977630819264695766"],["17685369482623920105","7685843919500973046","12003629971349327050","15580909503469667876"],["3679108685582631548","10201046172248114495","12338425145503676696","6947127341634400468"],["10424485569781620651","8316420578703004441","12255373945452272104","3722312864772519479"],["4455277945686160177","17024605096216246428","15549664274707253810","6564275827218087"],["15664563536803589046","18209430100082430708","6066680976032807795","11127023924070717369"],["12429012321096142098","10123855307849032296","16942448082403456665","3620662111211307794"],["4430150811610573458","115601104523628053","5684733944037834069","8186359526146707886"],["7759946857238350168","13344334147068919915","15955759428259039719","4641288900373003736"],["11001784005184561078","7898011166358098383","11374527884404001423","13907525617231319002"],["14657465395149917743","8595275927125344028","13396825682857237851","6949152477309874846"],["71480934665987796","14923658959496530109","2716278954273736787","7178433557381053809"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["12550124052778336320","6405421440273057772","7171167212711536921","1562732500254988541"],["17858820641120218278","15851707114518830178","11116936945897731849","8717649136827602355"],["3625832492357885879","5365074739055878707","9691865650459675453","12125233653106237123"],["1264556740148746227","15016336077841539104","14956013109399261935","16105813670947804489"],["6805451570770028479","13101216513405497113","18299162497518825119","2557575413886092814"],["8255880379136888584","18430387321104627704","17272632895952668845","6990171592138321985"],["7464669858215799771","9089243162394552881","2547947378610317121","12922013859667819855"],["3046538474551063863","18311918314460072763","4844921552281985283","17640012758165199052"],["7882343406825610943","15906714039357911151","9151277724681782874","14717742936457961992"],["7281385628907770270","9158633771837032388","16344927585816558848","1512253542071518298"],["527947843061015771","1966597448824751440","253065401308596161","7439212496706669614"],["15048186307789334682","8245352357964376239","17852875772325955958","5870946966449391881"],["2888613486373276378","16925367086728442753","16431182449665372409","3057976860470098966"],["18227111296662266545","13506785159277849045","3146045382732828264","6234377357882133062"],["6595841642477281636","12299002353628461706","3999284933147074647","842762483325550889"],["2295625485825794318","8607687931973758502","9866631591926537178","5962316801069057777"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["1415809723495203255","4614879611482816681","12900342340103487731","14290358080518729547"],["4599767452906144679","9820041719741300743","66731798706807733","5366744311399979490"],["15356276439597128972","13188165802496729051","2537882939735900962","12937177331863017718"],["2541620112605517588","11984060933767845900","5136290809258355241","11254771888323506090"],["134022575921791493","17027325541496158245","2628819099912458922","5568258671727773281"],["364970986689474745","18054720668420060705","7558541116832580307","17039967708219621600"],["17858587987641532749","13402894850417377154","13109582600114504243","7628975432727017021"],["3329151891519714268","12503767077372090085","5001752469914762124","10154219674062773169"],["3765420047096483105","6465200874422766022","15549915753788418458","16231292074190039834"],["16041641949613294556","12830565607472808287","1158310756212922015","5239653751290550493"],["1465319977982873998","1898853931581825894","16921600564884275611","1132067444881439613"],["10692993792176848132","2786999661354898159","10070428078791440237","8609320629275529080"],["5197595380598667210","14212878126457517274","4294914687251818457","10734719852094312883"],["18227111296662266545","13506785159277849045","3146045382732828264","6234377357882133062"],["6595841642477281636","12299002353628461706","3999284933147074647","842762483325550889"],["2295625485825794318","8607687931973758502","9866631591926537178","5962316801069057777"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["16306185588583678044","789437177617060736","4536294807903193417","13220096038422045426"],["14571153218371941166","2891081047313917726","6204789638744953039","11275207153101263343"],["8177016951864141266","132208404472298922","17780957031545525680","1719212631854043317"],["7865436939402520632","4938876305229956833","249944338539814888","15914605186095726562"],["9450916263238445496","5209312223895180044","4817603340669129433","4559552005088141302"],["14491988314474170461","17545608793423977165","11003714669761071161","5644120429897351423"],["7370352138465026706","2453750618771357163","5472763835690567952","12584879195108997053"],["11316163676120620108","10126412995704095832","6385835342004471979","17544277991999066883"],["16770739565925839522","3396072897832760106","14217243267158204886","11610873957208971627"],["8378226387535114078","4790198150006148139","10276869187388832294","16874581601445235054"],["8930383415232212795","198289385091072178","7231777509241400472","7149471951800962371"],["3918217430322931429","3536110134954525525","386213550532956290","2768137661192762778"],["12969865934969165542","4884626598199568545","16982979213398877409","16736349397729574977"],["2591736433978716833","1243205785127513145","1202266142338996750","8773157972937446688"],["15530886891817502979","8218304075146608571","2188809786762120638","9239621765334438540"],["10694538855342918323","7232999051568857037","17107091126648886142","6628092254097025151"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]]],"finalPol":[["10907610570490546084","5741997114421254152","13733450858659323916"],["2765288300328037996","5190582790708748914","714573879719102619"],["14261192261168468675","8588151018122987235","15003995581048047152"],["669364275873838211","7866457873845349702","5953161027715778536"],["1328884155260857393","1003026746014544613","10752702136328634561"],["14273419576990917208","4580380534965928205","8941967586461893645"],["4045471814107494954","4381627829755915186","12566558674588033509"],["18091635582840081337","9005536432429709392","2896045794833196387"],["2851458970414422064","12668325050932950341","17488500238206055555"],["2612281000647172089","17667593065705483601","11200828896335133809"],["1777520406109306021","5207691870296912630","10668669072856477662"],["9235090319043869299","8655611311351212515","6061127644152010603"],["13870935811158198047","11435216305271897337","15796811362828520923"],["8397315729260045180","14660045404238490297","11797884065529729490"],["18418288501825051361","4170363213108957176","17249927230908789124"],["10863939093588717047","550940157401195546","17159128499640415892"],["5497175320632621295","1353454052975357569","14978218579574067902"],["2326167486870850390","4572696256969521122","9124258960240776122"],["10696202389769192017","8854249918227025013","1405099986064113779"],["14733115607746022850","17459367003092767236","6947513667422768771"],["10862126331646896064","16084302644748506539","4772727980341035362"],["8623293464767788245","16210911932144760048","7991652988248624000"],["16717322823477040233","13195277495274531740","11242395614698977493"],["3971598552594819393","14234593601512905519","14078761642236814784"],["11354674259801976861","56716811981432476","3013554356808644498"],["14436123807797015053","1489887194966541976","383182819003704296"],["5165499212079400263","5990362114475720980","5328320400211972774"],["1549295420333583832","12945278402948149471","16245174122870036808"],["7590374855924142304","10870941783611365062","17640953915775947378"],["12309028471883396380","4067988885003931121","6992413732373529715"],["13823542956877632720","6221843304704587738","11764121876266668359"],["13761980578196946071","15491262839980004103","16825564233106221137"],["8596814542100093854","6686849886579760955","1177692430282039320"],["2874084033737011944","3742499153680222353","14395328821886033724"],["16890190306336986652","11825694646255892436","3484050556309548850"],["11384142335833925141","17614305114615000850","5587869240780993023"],["4085789654328667889","795076479945951579","13327301247106877958"],["2009633314016350126","18009275221998014070","5937688852043442120"],["2047770737143402948","2519176681866112753","7034047605317003812"],["6316011241865096157","14958754604889956530","16387461813734397425"],["12930629906114195393","15411669369791765146","13074034953865322051"],["4691024231073977683","4480528763690295209","14460679370094873811"],["9337970516140844868","607078397495603912","16545735179547797885"],["11308285726985490500","14900010233240269817","5653942618065031759"],["9305110913889088051","16420083081525077626","3254434931051761894"],["13924796914439402478","16478513482898439917","18086350394861917341"],["10290278435118898389","15865158203273819422","8680363570935266247"],["3097041623684659386","10076500456513925412","7856942250766797092"],["157459909067667422","9991714057387677863","9399459784753458395"],["17580460961405190626","12824924823150064898","7109653999366513865"],["633212370291561223","9952412323732982404","8762664521844179305"],["2416379281942525740","16786391296690891815","12804930832836636969"],["8076014002457892904","9555691517485246157","14967712613668322081"],["222413400044025956","16854956867249823816","12573012228202476823"],["7751441704829439548","8396040329141646849","6948255958856158930"],["9990452020329711878","18204714043363717024","6725997508964724883"],["4878260720678013705","2307515011985548575","7221182050950182225"],["9888654377440280897","4249529307184869004","4250842437038371295"],["16859040806818361280","3192601067448622467","440813885802372134"],["5878411231540281105","13331052328515858634","2385630029841253072"],["2054848474633794026","6500646866867742485","18020193135412578026"],["15860927397312195426","249657166385528245","7765123405377480728"],["2526711295335160846","17915498368344760534","4600422721528196388"],["9528169575614089730","8589427358793502193","16602935579231110583"]],"publics":["1439933967","856158330","3770800063","3787124962","4213070671","831586085","3154883471","248878296","3665948663","3322817433","3782674047","1145656272","1803015995","948619087","170496919","224589704","1871","345","9","482912177","3783436737","4025592058","759365245","4266243746","2747126796","3138302676","3064646014","4253668154","19875964","178909961","602889427","1360315524","143900307","2046621735","1055473965","926997818","2291304450","3097553221","2761796246","2573282801","2985864328","1403923277","3237549865","1872"]} \ No newline at end of file diff --git a/test/vectors/proofs/1873.json b/test/vectors/proofs/1873.json new file mode 100644 index 00000000..467cf7b9 --- /dev/null +++ b/test/vectors/proofs/1873.json @@ -0,0 +1 @@ +{"root1":["15570390641123323307","16081821869699894961","6863810426472714239","10170712061834056547"],"root2":["4869072528223352863","6275850450145071959","8159689720148436485","8979985763136073723"],"root3":["5483284199639158135","11288176805702964394","13694302064130291174","15096866425519955059"],"root4":["8523184183294149410","4548255525003945585","7749335389320270677","461009761074811307"],"evals":[["9723700763909148874","3158612906567296159","15290163735344178299"],["7470831584083042280","5073235761094395803","8301268590149428579"],["6386356436766253085","14086726873062673234","2558341473160093832"],["10632684183686799318","14239945850172613124","380351680852555561"],["7431242198044903734","1942018031238571632","1331341695590880587"],["7746295818318039837","10166229827790311055","6468107698775611672"],["4725403606581742707","12497735504008720710","18075705894883400423"],["17226277236408027025","8401684176883503285","15966921284757002117"],["8759116250173655187","7865503783191616777","14855347311221909720"],["13619894115203859811","338609377983212455","14780749882991497545"],["2524651473921459552","12976994168567797074","13791004577680788269"],["18015824444402303558","2256749650214656687","2916086668736750383"],["10637106841931787787","16034831508241442190","14195899800980774658"],["10286282847521605404","7866399829552050229","15075511964979664211"],["4307718612091347529","12551603599369543362","12983845914989322723"],["17604925357118959818","1577201841132119741","14511786742650705967"],["7152072455176777407","4555776309083988291","3161381487765623623"],["2966873807599809236","12560908932497042038","1520878406689306886"],["5430163051447817019","7775852737360662820","3563497549663223972"],["2428907728386746418","13758760971567791183","11505855220448609367"],["11277217345043936673","6087724801912836800","3396150784587385478"],["11169824795177707849","1071731334177019899","2738834322095734273"],["2767885103491009453","17424843119121298687","9224959855522579059"],["4192155017273881412","17360353838384254838","3757632605433096927"],["16195726800097440856","15762115025118464469","13197800802454072605"],["12784988430343866675","8673567407431583030","2038770648598865465"],["2667711107434178581","5637153700711843392","7205320057893696667"],["18060875528487643358","1237013946144088005","15796398098067211274"],["14250615321163531929","4401415928890387087","306182100424622058"],["15376867755425449716","14497242297994370725","13124108718258085515"],["300648700156039967","1468962297605818543","9752177992910818414"],["1987222440632224479","7935049666667660095","12208281809848510204"],["14263742369863991529","8624147822730792788","18416413356726497830"],["14937277047630070390","3349121048466582322","7006862743704207358"],["17231596703380910807","10094850637914367013","6494875401277175661"],["10108045354364493190","3378984007637695745","7325567612389819760"],["7219420831412586507","1348935974746447119","17978396440523770354"],["13510495051975543400","13037923720423772168","8205021493734763587"],["2338032050806346329","13129271403515062679","12207703831184073452"],["9579964371838546870","17488948043816052625","16290565495065911668"],["10816523810851052241","8195773968173486886","15646352771505181758"],["10159458397339584986","10009694084953835507","3893454299415969638"],["6567722345168469521","7230028626557640833","4478468476753329956"],["15216152286389937177","12891728566111086782","10282846871401638809"],["9905213711489148448","7244429382015052924","965128522131891438"],["2731675584805698705","7631779177911438499","5577091366774535606"],["13473391850269210244","3050206028131152238","11491399011687246581"],["3077465535782858686","7505741942709472499","13022855887969627518"],["8939240825671066911","6577395776799904312","16388458926214344849"],["3718862725717659501","2268664725854392414","6481838943800843480"],["4733441759285011049","4629097610409227743","1520088474038972863"],["10011999810301741263","12808991801513727614","1259739241720276572"],["1709760124649406191","1885937183342770247","13671957073442314818"],["13243312131568382972","10451256877026776279","16918369132350596397"],["6287579668371177669","16749603554543732211","5427687260182687345"],["8993896733337731001","4930361523635380006","3001705870229813848"],["3825534466949177917","14638250172915946359","4461586806652339141"],["3447660457780163603","13705375017266026775","6550046143619808429"],["12739297159847665466","12245499192003160389","3746291334735112004"],["12885132494613020485","12231883046368420134","10429481221622504058"],["18181284112463141601","8384316697543407723","4448133121630564250"],["4549843953114083492","12429862764986346867","5498940409171000627"],["1797363972671524953","6960943381184384534","5613361779704178977"],["15036165164584980732","7680257326005168494","7408555557835668885"],["16742930223146900277","11407406759868394305","3442995786985145105"],["16167753740133771439","6009767298233432891","4353711805282698810"],["6386198728882733219","15047738534500328720","11267136456718547473"],["1590578743094284797","10291494736119662140","7559217032924061391"],["4145885922532610939","8688048304471087838","8963410778150055539"],["12696704838111345301","4001555553878374769","1633444264566150223"],["12972755647109359853","14232772584700033283","8988027308255249974"],["9334721106897534559","13851191022343762258","13701712980836642915"],["5173365715531748348","13244421920407417339","587537978664989245"],["17200866958996625852","3502397627782711830","3165502300920864108"],["1188614270332933593","9847508595161633499","14582224336499945960"],["5883650335352749858","661493092799429229","16450534608622269974"],["2547804109367355257","1921254285913194622","9913627476552021655"],["15510079486518377442","8714106061473046756","17126027925964497200"],["8868197386083104268","18404595273684439318","5596963249815002889"],["8486531155523992024","17042675647643998878","17453884845110876557"],["1444087459722760336","14726117641392823564","11935976275021593352"],["18354679225448844322","10366505043587389808","3857164196440098137"],["8122938404964543370","4265099029670418346","16579545141967736964"],["2770463000264105992","1491056861853969960","14390708710055061082"],["164210379218697436","9739558962956099883","10328478375452298802"],["15991297664249450470","5246168045796324595","8499300344006561711"],["7766609124703551613","17630667976941245590","17103045471947826950"],["17202846229319130112","5280488986328069936","10178736882243508816"],["6931790163661333000","15240681317028863679","2269551573044519348"],["5976540715295083063","18271484821834027258","8984808647865573942"],["3019012936066887242","5924568686230345169","16641237379308746637"],["450908615613318339","3235913311231778082","10102043167608293783"],["16837898647454312677","13849162431579157423","10336540250583471939"],["3719048839133010964","11906944479230226913","2058943175917077274"],["16640648047272675317","2628178740111592587","16482451138692149514"],["13661322080631037805","10622641636721106187","11736858722160662389"],["2019336079809838235","6711531261883771292","947866293825716127"],["7049548318376307037","9738475165846859340","1357473521665365793"],["8369575881102768393","18309101819603920069","861961473066504794"],["3823908886188674308","13130519946190161647","8717232707823161829"],["5719414291175452744","13987449446132298777","10091091477011261565"],["9774705618264867462","7956681349007689493","5112547534190877458"],["13974568600516656812","15510802477909376896","196034254623089214"],["6416068922623759464","540426043144772391","13047236343068275145"],["13053679733689642137","12703784028374991316","4540165172502252912"],["17063355267866496467","446363961612306519","8041489880601232308"],["16125864547367982960","17082926171282882953","3989854604651015160"],["12879019502535228765","14992283330197897555","3869307606491790925"],["17506711969302575449","12697747465156913514","2023365898059702395"],["5735519591779101808","17092339553325809984","9135636655703878034"],["7635318943999871151","15708855885203615126","14168501121067331267"],["2090310507154886836","15309190624877918418","15104326940476767067"],["141110468894095772","12819136676728225541","2199392517007024541"],["3404722566220161565","14739474901128519106","7453607456814341817"],["6058743988482557903","2801885635206389179","3015213544177579111"],["7071112802691612666","16670847029458843045","16549214884941278284"],["13618580609514440544","14340316870336380219","9785009311143520627"],["8781501941981508802","3463131858155618216","974532764812801419"]],"s1_root":["1748222494328431853","6556513299685722337","9720595199630666324","17128427754984940201"],"s1_vals":[["16550326149686216249","10607624089011215748","3487100007152628893","11843032411981113913","10676648033300266956","12572796804287452230","14440299879824281293","14131582260585142737","741874385231818532","5308544039075521314","12561377241316962521","8692076837140859068","2829603661359710528","716059073007406015","2682805269049447466","2262508535952360931","17906243483680060021","11598202954729181263","11020443669608918807","12782910585310764236","694265805991120950","1255888420651612456","1631211443137953269","13976285985723710620","11098488011039850681","1954260532328541453","8163457427068282670","9082029051070382550","11509755132746481596","2021463239770445003","14711491930189675241","17344282949811836837","15279166568058946694","14709602777489580925","10912558050566232390","5265374733683934204","7644018168415203622","1655289477778774344","2513568741378747669","4690401176893730249","6696745908382896371","17323639545095844904","7013835643534495400","11835875565647453638","10797821832511543896","4520505296893305517","5136925853486174235","6250106974459739697"],["13934585175162407447","2835651815068228755","17806012020160312097","13590936073067574361","14635862273594494935","16707543789039321117","15745625616498752936","15035290149365490176","14496602503845048250","4171448664911411248","12036538432278099597","8984748474140165803","2468495890558953689","14150267141096395889","16732503238879957196","12059172818811395400","8077930643020808058","4484483895722395535","6895256058650481836","6436036400522033132","3742376725479805354","3998999401961262602","3310954264772021652","15039960911704972826","8076828793428350534","16503878957131860542","3901448644284266301","9720737475373171330","11343034897853268492","18325531253198924755","265028705128746115","11942577795485593134","6221294521314320279","17111284268204384226","4455691206941964012","18283698401213053552","870950977831039333","15055770537343793895","7916317671950162665","4264768917583464127","7066753641478248870","4120861726732062634","16164807809049434479","18332373930889291558","13858093257548222603","17037485228918741147","10243996334609205858","12167614979310552680"],["1429956721915687973","7874886667571888773","1620050958181231905","3571628366363348097","18212604964929422535","1182344811051992469","189046246890068146","11222888283187599362","8744630494504039526","1135391438667062549","16758588531142763004","2252697439502712131","7618133955271927337","2024012131050491317","14816700072938574145","10325510765575077672","13024325282629627870","43935724653482761","18408022928586383128","9417838280020403026","16500272827214408575","11301867157472469469","7024199430052900007","4814668388383091339","5392028903317347036","14346918259112324160","12722443506057530736","8527977327597344261","3746333048338640155","11226657864170423753","880904347969659538","2589687866027983473","6888199556733374597","4506103264110705284","2111575731425204124","976902137462491492","13059576045935356500","17953568252093091143","13981004834825758897","16913183447455433337","3451757673743901257","4107091059046382355","14837470670079354105","15386607324551201014","16134929439451497715","9484459763096496581","10117778691007519778","9576813817915269810"],["16549538178458918537","1093612711967864299","14675004269243086073","9233013356940474308","4604566387300674132","14798707350114509903","16711942162963317479","2095634342883084058","942584184135276103","1180127762554080725","16567366439585523945","7008454408901870046","6167718680425747565","14613369861538566639","12395288611905843362","11795799711024724076","14640667741117907826","5131046429766199738","12360719843791340928","527619238104238810","3399539255008325309","13598768145169572435","2277345041442680074","8933805356941538687","6852937992507098708","15616384479970841402","3859759262228833507","17658660247197897501","7540325890279045841","1973497736724341141","16427201012157496670","7056376367525152363","10734243189548616400","9628324072607561765","2378272295815970407","908959917467775461","8117791223721999704","13541075025073987324","11886704576717707731","16083185023927259382","6466016591758133291","3852232110218740243","8379533204852921581","10546459586844861283","13982987821798452377","8458386258670445681","16864067821426504148","13141066883517376684"],["13165210808634915553","1139007762830738634","18269218530028629708","6594459402348449351","4295586196259330533","1532898148069756874","6537150631726390272","16781571177516930034","841778636263031719","12095702218486335189","6012058826284325686","15249916768939462862","6098659571438475846","6490328359986306827","12724503769278463408","4985085247783513945","8422831761376699321","15669133219701991151","1234181572339468689","11320289804311307875","5798546093516015362","3302104823021157655","6466012057794802189","17669344943493353497","17787063978508589397","3001797075718310426","8758679049032646545","4609958052726124544","12978343674054726384","11127593965605154457","12004130726276850671","4857891957824117374","5375145485442770762","16010975028299257735","7203408551914319210","13040121273918496572","1674554599167601673","17891603016875035486","12565706839275185186","4678536236225355235","14960562130840247725","4163949293938403529","16378863935306641146","15998176790392485841","13587124601962487162","224604894010516314","11134038905252580888","4918640057771989169"],["1133227235300396945","10198629116524526016","15064200159117012122","16544212852817643898","7239516527217713139","17746480681731009358","14920429042802530005","4574671287245233668","9732813326836979540","6338754268281674690","384512815111685650","14864550560029138399","4678909705202332012","10592481511507233772","2170366889318103131","10011405594254834216","7194003490257785625","11771273592189848124","12844723052529763847","15835672209419330462","9802346904926932980","17360073006627549369","38650822776899755","17421991936006236427","11647199238319015893","6409619657535106043","12402640770906564541","1628502736846600179","8210706171121857060","7707410425769280161","4763265792794596369","15271258023646914730","1895268170816538041","2864667277599927657","1707430664474943131","12715869598062532617","4344479531205652669","939587095497001669","16784041418064969291","13161209996352572587","979509152851553105","17905177481699083685","4247965037743813466","5940816450246183753","10909945957795037327","10229022447095494420","17451790620339808186","9332841375399308360"],["16012801477581534596","11311793033443148352","9462224843612043324","309356595144693079","6604134656970718764","17779422617307451668","10350080010316650533","3278452367672903757","10987597938194240077","7671361590744518161","640985529312009656","5855703157079945905","2658811373669513783","12384569075770154549","9397613695528073857","8190706319057564035","5087027016825143723","11117604058485594977","9108172066793195898","4967271421839335995","543865254906430540","12804810415218346901","14841880404281899906","13957114757210966085","13475396187500461297","3559771879290777710","952611272027056152","4497572622417943906","9592458227092813006","1194781417713744218","3018265143966621629","15683562567140504315","14383531263508421500","9072356738800475252","13234409144553584745","13225056253459966613","10097361867700025909","9815812934609540594","17191566135285837926","16787797268207597077","14479094089946774368","1842522388180420448","16043007414310451612","2066950295097192510","15763691851884529568","4217696277379765492","13735449864219282002","15339788414393359850"],["427577415451056455","23309477746177828","626971271463458402","3582581972803969212","6610833301651691294","1455607541060863288","13355341925889036803","11774482849197047675","1503156244686679256","9161911098007713899","4257547277179315966","9039634957368546986","66713055479522363","14725776606515956205","5069573409103333547","13289995387461357273","14685150171164147506","12001563879014504592","16637178186981037779","7971888934221334768","15299946306703321301","12591429837173130656","5045395355243899749","15655419121309804202","18416707479249240298","7105160578558843209","6233866500671496308","15742198699885393560","9814931388425904072","17785929048573981278","9367744854326577441","11840745368982592331","15968497705519413553","9876546490318516602","12851847191653338349","3172115701011460358","12210873466809186692","5218233607788146521","5434666419444496913","5725387746060930232","7152836543294211238","16161157449432962116","3578958248322357486","3080783274054128965","6079402681906528860","48551733869751220","10917940788129107031","14637868712160673780"],["16050438851485951385","693977858333200345","15911356175947857352","11575997392479520331","15875570808413140646","7946159089527223296","15616439824110507375","8476267477997188062","13583091253230438454","1586638218497326645","2083504785794674210","16456200433211568179","161140015384126993","12955255218779260775","14056804856769004389","10420651337044256844","10354846231135197401","11736528564855975717","13206114787755849829","2809921643794883247","9612629629986657727","3643230104123124489","2501995063075013055","10277207809472715771","5497533611431605074","16705225360463396774","18052497183586491758","3232040601228061288","14799447306591335299","17840290375063488671","11194933822281722266","12837063456219718814","7376947272468765838","6773441154110975767","2235329878757281119","6455967107882944686","5783719971859872354","8326444226797648165","9612798340904662609","11440791465026938360","15474889831715146538","3204491031703544964","16463969361429004385","7943390106485874917","14844052573925424056","15089164493447462661","11289771228867375939","14975821680212817638"],["12072761804307188352","5137481905241694969","14978404371695104250","7609606858112185232","7109920365862600604","12343916885955176691","9108827762923835913","11884979895463995708","813454635141514931","8356046819363637660","10022046308715446321","10038116914084743041","14655278831696884108","5495859522149219958","2645877524060259322","6167438874929226124","11656832744058965359","1805638235844473383","16308716506027026636","13701686987669493708","7885863301570629829","16466966339690198737","16752671209958651718","17192034989197410926","211461206489420357","7636068742022784994","15532399929829445228","14183246658507642450","572358769683539713","3519267237779382771","6366327350054349626","9517865011376303730","9801603911899316288","2580155857570914295","7067656421150306186","11989796829929796701","3751351605559948342","15248560525230207255","16178113318423462892","12351094532159103576","15783858867272738133","13785853986921133281","15357851985678668854","1402765457279462167","15175771373406425988","2786218513960431454","420125129871186432","12166725433001404099"],["14882034785453053210","6422695344970843829","2638920056626321207","10282862915506309885","8094043933676428405","18390922358300920012","15777048040829169549","7277848678681228377","17154396835944619894","12488613539631544902","17327207809095690482","1314847716396195526","11589548939683570627","337210567607287568","8344585898993099767","11674961701897588398","13511466704583916518","6952179637687163422","4902648149747766473","18379377616154120852","15825693287068217624","2667187536404754091","2478675231242609303","6646643314923406131","10252706300898662327","4534366730810904351","11864990860272867992","14927408800522084108","13199765148695513272","5306244587205471609","2816743574226869998","10833530311899850526","14605481927088196606","12838234158145392346","13942160707682432215","12115294961034328990","13480105290679824193","11457117186412842805","16558132541376410830","12661340651066506569","1214898054610406547","17452429042838471275","8455876350092990737","7513852704914163588","2131063100517409538","13783756228162334268","10460826491155749571","17626792870033462047"],["16534470660312319996","14533306757130254252","17997492974636933824","14096424764095432156","6191389315155730402","13896593717383762587","1144312160853796676","9513298070708198457","6116399062509732821","4478382104701683054","12631666069646437561","1244650542988316847","7084369593085268027","10969336943750595730","15797929601802327387","13843117566134299794","5800184039258537533","11553394982077059482","17135062694419953186","1139832816404297801","729914127169968857","1443440665692934651","16698984900291031106","1171785117593013930","17775900896577756605","2600179227235875489","6933067531897798295","11378471132265450241","5923818729668590276","1027598166333087016","3166214913382270450","8184966168898330287","15579369906134896390","849039583019859683","9293764683476251244","12292272833711941104","2332823222967826201","4788659860443798064","2429879026127278259","7921728883517187820","1903484761138213722","13486791604034041355","1065367872242112580","5585145842665999027","12562372485225461770","18178710854882209368","10363786297667890142","10271058026377124302"],["2257741521639468179","503234591729769486","8002115482074617604","17176233835521130249","9436331279948797804","13928154016789011380","241018710706356135","12673591260993415229","1074482643819462305","17127314769603874608","6078032323223301094","12170527384242616095","10228823870163772037","10237791491718468085","6077828830373722630","1370977747435924391","10234352065662931535","13069878536868350607","4616829917530617193","16930540653278643612","1420944783195881293","13853894286304817459","160626073675825112","6772172060902016700","3312879774628916821","417747791454737567","12408297171116617388","9394165193797124596","4507761513752524091","4560154078506451066","9799044249311956207","4144611949221226576","555667773960652670","3619951640952833895","12587396010840259211","10294054338845392180","9528908790600545461","4805541482665737506","17736626038841840981","1616429479499912838","18235191529096223209","7260828241092654097","4124015133649104421","159890697169297572","14704865318278737992","16717187824033729049","13048332005960027328","14983867434959945915"],["7986769327741581160","9024204222003825544","10609199369216268483","3410879432747270230","65802317889887696","14710453323426134263","6607911672471513048","10301854662195748121","12191881819354243067","2674519571667289348","6974979479288553897","6389343278745597027","10537746852121031530","9926377459707056709","516583151774653710","11243879823319529295","15068644109580405498","12145598937466135417","11104284269663397153","17842314640252461162","9527773717038744352","2603791157804427942","5914210713480236870","461973886597013094","11873374012945148250","1777988674393292060","7672477535589927531","9891286415360261216","6060039600409678844","6795814249466408290","13386617007142874652","3723699129110527973","15752157954785460936","1734798383626346015","9096262463656279989","5563260126857116600","12235964186497106090","6364538304355796770","1816941056805467680","10061342738039380137","17635082009149738768","13740626227344142077","275548009737379851","8068190188483799776","7603210570124655088","268397160016974289","9350905571855975422","17060804423170188759"],["10231168212086961044","7192958957067413406","17415598474711462722","7124995174750561263","17361305295392273115","3992571101853502401","9309121758919952051","2190894825317003601","1801028704974288335","2625628929411482102","15705526370624821600","15168851806113105765","11284442076766082382","15209699401804553283","2406904474927348441","295015532522627360","2405820837524826370","5617134758350333085","15420265095243190155","12859240432675373507","11947347322229068451","17818953373885332460","10397450963889662953","538161218425819618","2700402840020400526","519779159582311853","17468514044930678680","12102621084538846184","17724109551915638828","11073789645366371707","12118567410404574799","15431365264401613059","1592707263930184269","16569085297535752904","8842416731241937238","6258368551724309883","613122149528513858","9254619581608863606","2398426247535862289","1719269745685158331","7499316326836486981","16244084604600805459","13547872819353124195","14525798019576600802","10041483397147291310","9810555356150079833","10427766054896858889","16930510245128198304"],["15506591700328508115","12223469932366830122","2916710703412948184","16755399542673530084","503556631267420635","5187394655880064935","14234743546016980230","1043811302543305295","2785930943495103444","1630313440239290538","9502425145730185794","5366439111191996942","16961385027256687574","8483767622200867425","17771208569634416369","15069746611906775413","3511506465616599545","1698188848723026141","9217667853378055213","1782370299087140079","1915319673165356069","17078855842246303643","10211790186251786123","4018583085848246312","3130064578649722091","259630360109166106","4314313703716886260","4426358018570113300","8333875549647991925","16322179966090646424","9701218323351867700","17809676488014965060","16334062350972275442","11395934332155267271","3577356047375509634","14341466321254429354","11107431331905308719","16303131354065170894","4828108460055691842","15786711468168785103","6174538829166999079","11904269773491019077","5245905328774556779","15403132098077612318","18050922252511643112","16231789498794900564","3481112788376237404","12967069984447483463"],["13709963839328730631","14661451606002210759","4342097057115591899","12826845611796409188","10162350960182474897","11399663199179250679","10527982805504481108","17692109832290847636","17535416822082422286","2000682046713611263","6255801557049631672","10647269740017466603","3256343750433870468","16795832926562513936","6506124894454456964","2819994033663231044","5228085314466696143","9536478501775995026","17764994219862990901","9153958724260877179","17092713942191517181","13856383122283368113","13700501587630318858","11366433227763438922","13012421202339205376","14362012779703435886","7711455961447525079","11480781268383675840","17659628155806723496","13700120153944954747","8277062982631072001","15837622872370360377","12597176389024004194","4372739401641621494","364643315158861443","4917667839322859716","10538606474417133205","12590474194498023721","3336717499985433473","16118307979903959298","1013028672346957444","1922729602337220849","4977524353722447864","17200097109271873888","10025569930416941233","9939933478536539551","1780688403841169606","6864319862214223417"],["618090162192791059","10662322540892817549","7923903570444343780","14071679610155968647","7340295142535613462","163019141972806617","16959416998089611301","13645124684448135717","13957605479545158549","8343570356166336752","17617673944605231681","1262644751145673973","14659159832058267196","6738184180158549638","6950649381336218105","17855616029046441217","15098632657167329143","17408823192680880910","5931719334143106128","11883344704825844386","10361891931449382894","6843767625529948334","13336838772418484625","15781053328183489670","16877433537411993020","10729627062103877986","16705223858393062066","15986392946021312386","6243260204307684447","7157379148203940954","9154257614754922947","8881417669995690509","13350358590171468419","18363566585330295515","17713549163410582150","5401363475136752252","17607328231569995426","6562826207563124857","6447908213197404863","4175282399898991052","10941098206485974956","12559313964865087785","15798455644396975823","8517760458758967044","9254219605305025574","6436942172378216375","10928820175882684728","4722357310361280513"],["2961275249807233892","1710720263343762037","7059916881254773129","5660143312253435077","786839186492004729","4040180237874902305","5718272947473695337","15799951545250478295","7599006788538094154","9568446041563454627","15484683538413711055","3135918623549018681","4427546268282785601","11278871644603984023","658264258998523960","16547383376302238718","1238976553339483007","8770625968985596234","10626657264790319411","7007219132927990284","5444935205469898255","5342349696136844017","14957897336509461555","10459777733346820845","924223742501053601","17453817360167507571","16654232736688772304","15084191596917957388","7411817479089449370","1188372928482426521","2988058245340298606","16124331846715298624","314731039128649958","18010935963336239445","10706160916127397522","9743732546072232765","11744979203727827950","2295406316529606677","17509224960455988625","10853723076223363337","3779032794543728479","11319689356381809865","15406899533506482056","9026138973894784032","10937987290581288037","15626843326480916193","13293001225026516846","11448041685378820973"],["17311683245191956131","6946282118332781348","6622767118510013535","8823941075247184209","1491231275854915067","15951771552958616492","16035162465626968144","16871405549026736810","15745207316977167441","13582137312646487274","8786418122096664545","1015916028128068771","17646786997268580762","13386325723529742186","2684058479254933285","6832755847543251448","4120278629383634856","13144118080324174764","4669011324207754732","5938607267869436010","5616203861793846787","667736220615746328","7732350857929632978","14749716919361881560","5598107449555171119","976552891306082713","12927064027124613764","5178089489101052783","2206254927267776626","10592123937024574266","210522210955842584","886495673236185580","1188393860461592903","11224390628138890331","15747858827648622979","4052023524635109015","15840030831772028082","17543399286325808939","5970484691056173663","14480466866107623574","14155303746154110367","10506501675788415523","10942025411203523749","10328250318368391873","5236897261265381441","12017667291082531795","6721815691005538479","17408487062688272767"],["2706062447098347181","7740122398875063899","12292247073950980006","14952459717597938674","10249566645226080026","2363268653945170809","8781591443517235013","15477871509768446292","5170151216248975351","867000592870958475","1524467458537711924","8012629109586967466","5269792145277552887","5945961895818033997","629155715948439664","8782636985016510966","14418541686808116990","4012478369901057543","16129979597493280549","8700452608330970828","18053642455149160281","3788875565711698129","2839414330416993755","14910712789951124560","6267551513965549126","9366875908597372359","17741562515309529853","13004300193661949351","1666257224993565195","6219699052031726750","13030761601175228031","2420399107355353113","9315547879234647491","4434995794591695693","9869433630973389213","15780415594805197683","8438279781042807178","6419314298624230443","18028836008502736972","1866726775594747605","7112758866315984429","5833745529432773351","255198709560458648","14582431032224607171","8954323593265753720","5801116452181972333","14518010383100653815","533894072444964052"],["12100626746801595738","6104513736404553761","17701067408537084141","262465117874562864","5667958809453414785","3167267394332973213","4797981938458730091","2964361382899279709","1755246096377112883","12132841448055243713","10921862596976400314","8695743725323877498","14186551546461849293","18375054482071936125","5704662560459431504","10203223737376873836","18372807425223699966","15136986733995289555","5478661022776380993","6388247690173633542","9471779366187111500","16723385951064664014","8346837046617735360","14229663098363697046","7575678125427124824","17188086005306681968","414967079899851931","13848863073913707260","11925629056824623464","7653801948298991917","14250736533924466350","5416820548052858523","1647681755605298011","6366498390002753975","7977121345919547720","4197910798928361297","3344840370256645006","2835350806376778910","8225581149932667480","9577717514159097172","3157060712339527585","1330593689073519065","4564622172141004081","12565310644733573631","3753540105367840214","4954524477927676169","18366387843006946322","6185822335600002230"],["8744373767206773573","2350150810321341941","9335861833918170874","3875719153142419194","5998502715317710539","14518073815214458997","8576735384915923071","17624143665429311350","8887482892934318323","15615759684403692589","7090562819192728005","13035461220363533871","11589918456695123597","8894035669310095145","4832640646179952041","16674371840579388466","912295805561546661","18011399695437774192","18249054000591275634","629369170866461514","213982385426262259","17630877847840077305","17720478112665664086","4789791627707208551","11988583488862057098","7228234251351160587","4790082160573082294","9798610601469308804","9831242220002536254","4559317068317294591","17389170287278692846","9951648811451159125","17786259800889605448","6270640525443528399","15692449329828163405","15055513346539071381","11279222054400748587","4551974747811657757","3247148585410946366","12836544760736297546","15542907399684282115","4078543623711334979","14817744252498530874","15547751076972806451","5973872114261743725","16948187001118798421","17703768074042806808","6141875400592934659"],["610393464412622305","9696457396610887595","7849247874818344412","6529292774388006200","8706756030253009883","17951854455175435930","12070495093484752278","3769567743987667386","14960511760338053458","9499854835287452826","2619912178841404534","12430033097400658731","15577390937336415720","12654287011688546129","5468660805573793622","3230592014709030294","14071749738881711768","11300486090604417584","2354652591455234797","10616586456755983625","2363397170896087005","17486029443543015232","5798959309396752864","57799792169652772","11994592528947881373","5988702506001317720","8868544453040576608","14346461839868280902","3510265395261112125","18110850977879195274","14862421933540611003","8599182777884450529","4962743288466239133","11340387969325219882","18442495197171731113","926297914401034674","6072221345263978712","5914812346734934609","8684851352614992783","5539742564650677963","12076369832001046813","10432844835615545963","12526725192982132006","7716542208151880411","13213695866786393922","18324556909898694297","8917223307972616954","18248182862436940328"],["1720488330156827739","17431568149292072409","16041394175203272656","5831994828566932704","7154551021755389422","14271666176876567109","6216825016415473163","15784557025995191338","5311974878368795156","16607445142463826203","5613440077742637305","423144617756255922","12352107478889797860","10721507061226664744","1752680306200202682","10211418225217543907","17165196903604200540","7594786309431137749","10248535020790154457","11329832015308184612","4362783302140003373","12319124959607726153","18237118117544320862","14565855137135513940","870811569447106309","10520631056860453605","8453593656534009953","12390088158003038874","17482348037087464987","15185426941054798126","17883958051754825828","7386005188566256465","14688636901071435133","4233349509364545441","13557849316118675310","12308293424106833442","2425792664289567765","7709324768072710872","6573108077218105190","8887938439621491360","15927716590561525797","15016635919639138607","13925231562839523128","14073065335995472091","17269128369111697329","13967431177249803751","3275858432253457875","16844642388310923082"],["11080689534267291946","4466482040258684393","680096095583711336","8239737670833635786","2435388473240798320","9019501870135452194","12756328457889397166","11564815479914021492","15286030839885097576","18251940324055141079","7709088287736526768","17667464681550845619","13696712670447769610","13437308157968650203","6656636563797815597","3544952484670854376","18435327603103581718","8526212848429294266","6602835710015032473","13188257171473756065","13086420762531687512","6070508871998389259","8810100017311767752","17264186691616141086","15643714239899119102","1437429022547809390","7959092652046703777","13063868140733831643","9671975436713357192","8155880776060201638","10692420146839409455","10793126066176182896","236639525756441292","11078736477869775181","6170640546719033271","4030111980446385735","10428383123233585508","2944943382643233371","12523742400333001153","13369853721425704841","2416223343512641742","10793280758811404768","6119824185839626990","24629229981373393","598070268255848604","3019222649126532205","17548755137330963286","16040433060620210358"],["3606154464722949530","432561410950372298","9133872797008056167","6231289844973980439","2694443661539127381","856603526909728803","16540845012803447115","3284557449693410355","17132001649320418482","1228770943820847481","8412560904855091370","1976355434652187120","451513566199765628","15565259160874810129","18122071252580519328","5601342864879626687","13470153800377986251","2309360844744509439","6701785628771031533","8230389564590723754","3755952435255181807","12687835874644579902","16895320977122616851","10997499644233944262","2660562839556649562","10070760621427279663","12435105158986933574","13436025246315311655","2904792552561191965","2954005505640714355","6821071879298451514","1972108414084105522","17249172068030100844","8472707814649504421","14150725776752210172","17219000242629778630","18115199118109248904","3568973079590182120","10207360732567686058","4873515375159730840","3759771439494391304","13797505312053218746","30195857481070004","5534807965081583103","10606450233201290278","7272817071248970144","4304843909959469343","14270148949124947575"],["6417567189760283028","14058927852365235234","2814346527824872008","10436527648811305604","11729394684557145505","2305110773552254574","11002523409230179061","14527898961038183993","113292044213328471","4065015508260479359","13320957673856241403","10809389776167722761","11917664333169881693","554739846873730896","14065830479917720594","17815490005183989459","1515470903890961286","15495988482255895596","10154668497310309121","45824523875619479","17164643405405566147","1424498660261371447","7375723907939046419","6628938181799976066","645659730424235790","6536886064290540775","7544809603694398271","15478578628196153070","3846101840309758020","7780394686500558534","13140976759139135601","12774335756701544147","5999629054951828300","9219978935332426743","10260169490631224615","3933908592003741943","2032353402374262672","4502838190989956158","907622004467682547","17056940461579413611","4549086988724113838","5858563896604438263","14634610336359764239","16774413807583139627","11247982426871084615","11605785934332330971","10348045497682775504","1396675079556400829"],["1251193187351992572","7489775954190536183","3189013956690908694","2296063413116154094","15665187343439358718","8678125868175320058","414560447625434083","11950309628418051963","17370670053871224853","5461722586724326323","5973504040617588787","4098956144315002596","11858698330741927140","8577653922337019379","971802954483086995","3993885345357229340","11708221623478237287","4807380052773587214","15746222238672908793","12564806664099929208","10550851744632823827","3167811354864292880","16373410092577462416","14854833360713056279","7161191597370886630","10259148204034552688","1753956412351047934","4704321628977302163","8939119732809878607","9993261058775424826","1701900751198808753","423916173348541259","1259475520397841843","16089631644957571428","2599369465728905793","8257150783931378449","16940773263014904494","9455676127086860589","1247040488087078300","15431229533847274575","13629537361210046585","10920633355105652022","11440141832710615835","16278089876622835144","13926799660259563913","5967058190590671826","6165886289142360258","795110833350208073"],["15257573793580600501","4459346502772045633","7090302840140346114","6495588111174289870","11097435529664830850","12129215791501850585","18300142739003073557","9569051773454714909","10769682193661535716","1065071532404973074","6365302804296666742","12314525108161044884","5912997130947754949","15147722948431392592","12815761272109100039","15262047560265008725","6029549438453776092","1159621440757724512","14131317313825852101","5298035308204533872","18008288422809271848","3718915185663483863","3648604494209305457","3484138364492485611","14845972167076281699","11161899769686449849","10482190873573564829","12239293228542059121","8198467831959369448","6435304827258967112","14345601962551260319","6008362740328300206","7220813911337218113","10471630901115299979","15297674272499620998","11445089363254824746","17671869911106821127","3719220153641743631","13680094894342468674","7483643522554414565","14493882807841417359","17384057665576934854","4437438449729145410","10220183188348034147","5314723092170076436","18152987370880040346","10907174513099826924","2685114646301807352"],["3100328647944230483","14345209199168305837","1159526232752856296","8606879303557931131","8296901218652583798","7252263463801837087","17864674052869189357","2222766196957485428","11332287076299669027","9397522625409992946","3571052506332319979","11412977014206384225","10839307942552299829","7000413934813208871","14080618586404425327","7389127916411471162","9045734326734542006","1365081245619117372","15998748536020636900","6125903490154571949","13194396988271813336","10813027755654980198","11748109007578354581","6215274380223735376","15821337373837562314","14821900681403749127","14571693780222272745","9804147027520349411","16055246457050569098","3063042214919563606","15752189913054307319","9964993383163609744","2306415886207272076","4416149119712795126","3087454103161089699","7958244145110871337","17605915693512931240","3688819048238150467","15678795548779427830","12187403241435618289","4855313676393432839","1264702760664128943","8847151332561298892","14121082942105421374","15810855278955097686","16114613077031342966","11445471223548147179","14776116148110919870"],["8884009336972617287","17670549008567848272","671269706067620973","4953976600445662369","15783694192109667008","7744722378207126652","4795908334934236920","3897049066129421432","14131929086301400159","14056040420240147474","1926592372342721062","8509508820791667669","5732877905422063164","8582459839196938968","11077512325935534059","10476253573006590953","5211777923152183041","6774526105030046709","3372802369295182553","8503100883512666913","13168504836738335941","2005194530848179987","10800066385606950313","9642111349546819546","6900388867113120560","17389267209632635311","10968810715427542961","15477600603828094371","9462295127678097473","14393781408449969243","12926658964633754083","11313733436195686929","17332627216021987504","6203646127221317171","3087914289516338030","10270674152706032746","13870909495240362856","7288249327720691926","14454993946811331019","17037625048403096917","9123495281399881477","492728337889351606","13045000980120818834","4368540299149366976","13283166755618972215","9547226945729036195","17578336897412279817","7419402291646569081"],["4575101466076207695","9774132927859411211","2305450105011400777","15696135553976610068","10273919299558017889","14924842099743339007","1641041613686947817","15718399213968767729","4071225965189228760","12708310128456198226","15975424153450072970","521066985895072808","12291706873246533254","14624732752077643479","16881233505871105303","12587560018875401555","12519406982768844460","2204320011495632565","17571679278405974070","18427169103085065230","9230981993067307961","15999421456141923248","13583739471008164547","7258591997320690816","14274297759413290197","6250471489800932768","15696157861311536372","8864435138928855567","9273490824594464831","788779047294435811","9545434263013793661","9810641432642072737","15697465035935948091","3662953188575825091","6095087760274155839","234915350564893825","1748783684211771015","5765163886666947116","10866143369463126505","1127137892485389260","4820079498612980719","13571736140442810308","2634814337541442371","9282631655400974378","2309816081530406951","8423684567911944509","1257880619136740089","8029638910858147332"],["212669858109075939","4086277356726176328","448559677367788920","14811146330264282509","4609577406111522237","12898066928715240597","17217124720248163994","11442339950088684259","15390528024627588419","12629673166954224762","18410919180367344043","13224454500613398382","11805161554323301534","7289417318235671959","16717862622382120977","17423048508563530587","13838524325201564515","10708070979453457514","1171546960197977900","11398139266127933258","1506648742679422583","1066559488095697851","15003009242403881536","6974335242566292595","8340287915701985278","18243401679888556416","14697303109762838038","7529119956842631468","18340926014514136272","14034058064442983694","18029350604978255675","54463006979923915","11504633892269293187","6181425402101724843","14785811634942677995","5635112208783595442","12013892533187141752","11332380289009544744","7776061246688840162","7936634827899025902","17805506684897757280","2202460133747805671","11722413139769918466","4246833596326984536","6446195220920808654","16073000246245404718","5376103102649729199","13332000077449942022"],["18332338592969280524","8312517912766561627","14338569318089875969","3670498622505138893","1864334940375248153","2747101081075547792","12345879829103749454","4089646582737747587","6154261516569755824","1041210695066539366","6719177308839535686","11490929224822649266","6890490645942996587","3497538452079712634","5853585955034249060","13881729457997693052","16617286977100985525","6008018431662403464","7777264081086680592","2243418757492255236","14102774458180519750","6547251821688829668","10091373914536887696","16409984306761835832","15038586989637304279","10097670632646666600","4594235437197745614","3145303423614885674","16867684028210892910","14903711007947589177","493806466895214198","414638274210205148","16159983603036594025","18248662468083710389","16812243140828141180","5946533853709766886","376837634343142595","15535733273298093805","3342495995243000366","1966325676553647861","10271181252597196746","3847139504484439186","7786933209132712595","4992934314583155897","15669201863974363157","13342903443547951766","11574428190543172050","753956439113469116"],["9647856101394148834","7936381585383797272","329647436788420218","7271426093864656064","16508926926348734207","11531653668427011370","11032650381816516993","4651100256859787599","3364457927779876927","3644121251785254525","10056336743885015483","16546740789478460862","10779427595796750954","11146866421514108402","10285338138658591200","120811312746050000","4790605942705171061","3321659123087372762","5688575796898326215","8730812766738495585","4329301413353353598","6506715003403009410","17058988044817464741","16052497059604611650","11012878133031062239","1733268402937501530","12098952583203130978","1242007641898229557","10870983643809342003","9469259424154029986","7611749330760380465","2960494833352651740","17797821153852830948","15172371680440164070","10469971705395901383","9163795157848985361","3662543985533239964","14826684036257467882","1886085763766766316","5824470851165429067","17746997188699418450","10524339123581854143","4239710852138215553","3171732618614851577","13258240252057028933","301397743365773745","2152488023328643588","6081731671251763472"],["12253690437091830208","4646344723033164423","9113776560833732829","12866391173674518866","15283047917720751271","1873033999576464721","16118147722944826715","9684691537045486136","11105453552254895091","17949399451481968523","12743296780128116094","15628581070203531587","4426035656331928709","14335617360949572847","5862912624785660067","223153972163372378","11175100773022933910","346118466895235668","2584622424914016591","15768238578479587685","1018656482302865331","2102758228161409368","1691585111408135934","7803220640829297547","8400761777582839396","15305411183615991510","4418082358689024385","9887831206239993950","6251949697428594086","7376627230936520887","1246577698627072183","3772273013808707963","3244104963474926953","1448893927772785134","10612146710747664889","1513851043169305373","6854005813861905265","11991207078512079630","7878491728672148792","17961425527679131599","5570082146224117330","933562799176986523","12192607265305153196","4605866416585390745","10598506976195919039","12539401015090675899","5640265723189389536","14096717954865857698"],["9901190443492188288","9813650085835356366","12541904303075354734","16025539717126588139","16038615842679748982","15457726712474849039","11002450269871203472","12028080292207202180","1007633822418656368","15904145730037540479","5566000056446677300","5120649337765880401","13882958281329338200","15311633432937385899","6317543616768300959","9838183272465722823","3169415863440320658","11023395733286251791","10852800155623471976","6104467664979585225","2218525712680489485","2564500304751279510","1650863303598163341","8265169694741553476","1939588023039153675","10613530402467924065","5745584395443296835","9860039553181353668","11991371952771657274","8508835462143279925","10609220010424363850","17882300951807739739","9354916712216505237","5164002329563135570","14797251115174355590","796812784555122228","3456919533165106490","17710711260376439059","633794474304218401","9436763005858172301","10481161875084712542","14577302050423596925","8224332669459642069","6348498513068714705","17206101253139583690","701005564292964603","577894286829774224","13905784390501499517"],["2510938804501610441","11449994995127902303","13885997111611866589","14053951981782756625","1066960608961796818","4425553835478381917","8774306326108417907","13697475177208202654","13879578843534116574","17408976881871107528","17728830464973399263","15014978557861723275","15199516256531641579","10518534773426799779","9568614097516600086","16955079040477501371","7914331068262127464","13659182485047883751","1686207049442567950","1293030685475979263","3150685559508102289","16364793993161145595","12923728953864175126","3966003856378093442","4573724724908321999","2916757397484964277","6243866279499353239","17574706820380197467","17068235150591876900","9835664215315732704","1788681635667008667","5948999464858969524","17652207449094127436","8530280137051885989","4539959832230996899","11633401254688235139","8244101348023377333","16145611150919507549","3946236969395732278","2411932112654640485","1015462456910560726","15512013734236647813","14645499010800160655","17741132446140086867","15180877763044463130","14088129961313891103","17772064922296745674","6263852706109215053"],["553044702017838751","13978032312202578115","9436784618814471049","5188419361001118977","11413144140919150120","9943468014584989739","832023686411346521","16333476728595853015","3724801668393111020","16496294307024951840","16695189306296238380","12732265371227899394","4226376911883750527","1437331640609911225","7437807021579425043","6719151574080432238","12770496196287149142","5158157881606440320","16882472271510720693","17683130075610603916","9507272981510859942","17697257214554236152","10043931299602314821","2338613086119264675","6772120294539427022","4820894632106807144","7047739688638108073","14690938139881929821","11461022708741645196","13417990159243745710","8319824332941698212","8280981159713579266","4588380088986042517","5731911555143315547","15037832122448743502","1362705045882847713","4088622588238057956","13834540182408724794","588131593067506399","3262261805180068140","6967897353566244328","12047569474575394135","15736820438918476784","4120054054885474950","12744178576197231151","7505985036109006917","12030231813535938411","16660478482011254843"],["16509432193230830763","8753075059047660960","6135075633567197334","5659831411147679100","13394596097251876001","1611034028498031139","5238192048385782244","13000792380620795557","13262250701032754962","4628985135143970365","10951653643801625608","16629765501970064877","1697081270868096656","5506900862153035685","2281297984995157309","10914123850787442180","11548199293274951042","6424725819196549217","16100390288477370725","7885369379565269431","13030205564647790425","7639432554995663145","16259152465592866832","7887752247317087769","5119419642345280204","14737497101944500860","15740881444387125972","16574298148337791339","10684380458349388441","3841541509892670502","5020353875012023282","10394645922409753478","4614434685673216098","16010088475725577063","6013876688000008247","8328978621330165490","15335270083341630259","18134498326735995556","13598707495107430461","951061912946284679","4442800230039184935","8119255060568862389","13054381409397570526","5856781580117937229","12905753193674680928","5693254151048966001","14769899524582944751","9491087680432215487"],["11626624280191236477","14485293615103455193","7997633176744308508","14648970991478384613","10668133602479535556","9827412001506948973","15819475604444322439","12975176262546723033","7336205500948428402","9876427399141219165","18424929225265470420","506770761762132982","3655381885980269754","10533386512384079348","5729035514642710831","1189181783630073687","8587316137245762181","3938343047283442327","17870523624320622813","7647871498075315923","690395643896545100","9022469800180233779","17479862898423682264","183653079135346181","10718122809665887632","8069305490464175154","5462158161855468739","3414327115730268588","868754582722134460","7008898690034909751","4609200907086862492","15989499464967762709","15518419227755062","15422469991230646864","13807303651174320751","6960936082677452636","1967531350700011463","16777962421685375869","3359595374058199774","13885892228961554672","2049447326543544990","11083165192190676113","8841345332695670698","7392241175151416863","14699099332176044505","6670721541276437900","10621668517031272133","12008250356291943797"],["13376441679932229008","9491597158050721177","4337925557594826379","784259765508294186","16339057073677862423","14902858513257815694","5954586076413006846","17518643966136324820","3839486046921611851","14149086435631637831","4416227433788046952","6047575502992413922","11686723998961548454","12690533968422755261","2361105728193599510","13066175881594853909","16961542638985882889","8190058588760071609","8840572666946483443","3415479091075158147","14683151075729490273","12391120788707758507","12240309214232294989","16062061527983122842","14803010002858928685","11827023132283765129","4590367757441681309","9703939298167206477","8177707608932491999","883913244196211310","14514659218984518171","1920249236373976469","17193585891440525842","16601047809589652260","9793461354465027334","3710663364898077517","17848943244353196492","9112544533511513971","13789119297922149114","7012670699672447990","11744698121525212012","7122570061611621609","12707637173039549008","5319927019528281038","933301506642487165","11886491032997918617","13358953815826316821","11185109710111028726"]],"s1_siblings":[[["12942798773126702784","18069757422652042371","12498720322631597448","4293432526332402365"],["8001711698068119087","5919349757396798219","8124458314414594862","16171927819335904147"],["889912691450596571","17852604282118033745","5259560668340290031","5858994218752536579"],["6825698157713826242","6069238424269560073","13446934035542674103","5568739232288174934"],["3376103735883503094","12480770025328314396","17003828679221813963","17465377911374862800"],["16582622661297253966","13152341177000361608","6913918593140800092","14331188369923086518"],["8545538568524659521","7727351881147565604","4209636974416122427","5254453376866103333"],["4501583856994664728","17078145920597043982","376990818039965840","5264401476111467248"],["6634273720158981520","10534125384737436699","3397091882560859977","3002070196020703714"],["16808123840565422059","5008151996922857857","16439391846751365956","8571065759535448099"],["12275428055296994029","6853919880324695741","7136485167209935263","12683283962370818945"],["12690307574808118019","3054172920637366045","14668166108229480950","3107161774597575792"],["12406872434841281670","14894333701568862293","3256596859336791351","2417850296569083996"],["599634402029575823","8271218186855046105","3993043362162846805","6865371228399928016"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["2034748998723396095","11587464045627752675","9387097829001143164","4679069756744822636"],["2406668413719478444","13480808296765766812","13204868529440312982","5482720255089837667"],["10162371446781267734","14568013366915689695","942204153966431096","13406019548197457476"],["1432076883467687838","9563286161676623235","14535002129069443451","18097472400699922562"],["17756862179232349828","10225831217286283131","10092756657880288770","12687034761753080553"],["5075827224738904370","16425609557869246558","14196149098351916497","12095699680807438244"],["2828114299377284861","14027588891488921629","5761175656499263712","6082313845628439090"],["10741902832799015540","13478149521322246890","8688832539676520242","9390257402628801976"],["5982552132510401355","3847884318210303403","5111096439210755872","9240052097929592430"],["17201502987443507040","10216659686336068709","17915585397239765455","4042640729791041106"],["14202074338452704707","4491645090966719209","13149123030728423024","17297490136968733227"],["1551108231023847114","3722663793467214619","1105046451545387079","972606489759452049"],["17773274437154828409","16512345132095944299","16807190793381711311","4457868800132375505"],["6369305953006691681","8166095295972853042","3678812980072505940","9047639763268512394"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["2855696232014720637","16869955799192684019","6161136476747241705","6092713069045393153"],["4511000563468337290","9688223117186470759","13883760998235514813","8167265488213905209"],["16780697108275915525","15287628390668272398","12570459128571203877","1400526410335527385"],["9852232664459392954","16533808430178518871","15213809330217342016","9885987702162803421"],["17789285262625301711","6065877664124414022","1781982186101048419","778326254016109044"],["11079166894389728545","14436119506495544435","9837570839050100856","12645416221872272634"],["434114514953444025","148394050101440258","13565786908009530326","16154695888253326326"],["5290539009089528412","2863818989178646770","12043457575697514005","17815533228926924783"],["16779259832876181222","15452886427041777616","6560541753867529713","5368174517419860460"],["11760392780654879615","7587279875514959537","9478947457137849125","6366344779326106943"],["9648459740925107154","6696111427125118985","5569559711124959544","8325907167742519936"],["15466295949803823134","6687594232216136209","796606435186917754","14091115158661656685"],["14122839000523597640","7222495676444094018","11807124668064875757","10739851694415345785"],["6369305953006691681","8166095295972853042","3678812980072505940","9047639763268512394"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["13370254593433055493","14975023373185402353","13364365350841885323","8535389948538823729"],["9989851900564292596","12276751411302361831","12939454178216821791","14758958978089039640"],["14604530618173684199","17425088870730767907","8239643803463757393","15542484660367364125"],["13774303618632008074","8245798327209488854","11174573452576806315","1217011612287797158"],["6579332727957302534","10799217552646605666","6584109005719079795","18242878306444600507"],["5565464914192111670","8442649269769696669","14018124004813029942","17178956344764767012"],["482555273230213880","17663047396862682503","12104102266006093768","2749723293434577077"],["1369618157665364","18106426227745103168","7392659935396162224","2599185639320070801"],["1341417862238980837","2955951392689736151","5528579770905238564","8035550935633858981"],["15462006605536689721","878449661375863146","6149604436641527856","1092088971540930062"],["1777925604533066490","17671763384051392070","11814003094592542661","14717640333335791381"],["9307599568366256695","6960610231498893191","5583609788688686906","4958180963349255996"],["14862238000617295373","12195198580848466523","2917950016084268831","12567248072209913613"],["17328980093648558884","2101523816850562577","5231452334966008801","13346474072281534735"],["13378825865819710472","8241247385602923110","4160293409502685585","15797202900815346294"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["7242659237778221603","3559376901292344912","15718378810363518057","10354922829066255785"],["10576763669470271720","2646023442117591296","9606339393906671010","17705287064574286617"],["16008754048902182767","256608055816935618","18211953660487235711","8827290344154611265"],["9936158925931194693","8044117691807726899","15374997227429673263","13681055166511326245"],["13424816837599689884","5904939788689772105","16254312136759481668","16892111908605114983"],["14712212388466093559","10111944023200081312","14760780869790210499","3434998023739873236"],["7824826456191390914","9425949651696539329","9071922938741955934","6664142217734675470"],["7691904716664048610","6359363406669535119","17761657976660475535","5831621273406929296"],["11798321030214090647","3327182999644367166","1804620635693842805","4407281248146715455"],["9684245635280287966","4932667014988613803","17289302386067670654","4628618297849769742"],["1322176004608316678","13678778552848404033","12677284757014946933","6835408039020221043"],["12559171883041236532","17588036151479579489","14215784327304754228","13352298375984669988"],["12406872434841281670","14894333701568862293","3256596859336791351","2417850296569083996"],["599634402029575823","8271218186855046105","3993043362162846805","6865371228399928016"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["13431280410778875781","12723571137481647996","5209562989933414272","9472889067433649792"],["6952938478292490311","7455711225100930697","16465088225651110679","12137355500181222565"],["16909034880832756172","11381725459975895710","11722928323329817546","12778419309627658686"],["16952671332502692180","4823206500350606532","8043041014063282989","2717078124123403603"],["5607501928222781092","8494731830722991835","16372946375858120677","985175240394346442"],["6073495824609011179","7077697053814791056","539786898018222107","14925872628933942142"],["3974201941100880965","16269591281637203992","6100497990251167500","15036478391852155058"],["14545628836911050666","12838157052325273744","8832962438023448631","4176250915347701614"],["6665031352182528448","756413244080396699","1506529565054034761","13134285559841822031"],["11730721854743083788","17853874714801308718","10306252209250296804","11119176668190457727"],["1059303399945936685","14132415392380658780","8122371416070202266","13870037613442944425"],["12097595399150012270","2149853074901853215","13368173075992620547","6237069157153409455"],["7729269495371756951","3258566133197543490","16753274822714227300","6887926876699849574"],["15226948565933582957","10044748055734091715","7381535098602096140","13142320457407846843"],["13378825865819710472","8241247385602923110","4160293409502685585","15797202900815346294"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["8474045208443417942","5899006226293953741","2554456540094513351","3125411961999307911"],["10943214170046509722","4263540399090415139","12074970851421033664","13516811319910978750"],["16980023672041615430","8422639082895688319","623107131894443096","2484299112886546025"],["816030545188186093","8204877131608365441","11175683936415371288","988434852816877254"],["5607501928222781092","8494731830722991835","16372946375858120677","985175240394346442"],["6073495824609011179","7077697053814791056","539786898018222107","14925872628933942142"],["3974201941100880965","16269591281637203992","6100497990251167500","15036478391852155058"],["14545628836911050666","12838157052325273744","8832962438023448631","4176250915347701614"],["6665031352182528448","756413244080396699","1506529565054034761","13134285559841822031"],["11730721854743083788","17853874714801308718","10306252209250296804","11119176668190457727"],["1059303399945936685","14132415392380658780","8122371416070202266","13870037613442944425"],["12097595399150012270","2149853074901853215","13368173075992620547","6237069157153409455"],["7729269495371756951","3258566133197543490","16753274822714227300","6887926876699849574"],["15226948565933582957","10044748055734091715","7381535098602096140","13142320457407846843"],["13378825865819710472","8241247385602923110","4160293409502685585","15797202900815346294"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["16964075362879162829","7743537367657413708","3219225248175679549","9843195077422276659"],["8369998398287973902","5223147525758225029","590884312154595426","17873635446992783260"],["13514162640949870881","15973279421575696452","8774195228323299274","2386155259490044683"],["11250519029492415568","1147078947050255437","17606810391328394750","1861807288269183184"],["16375957904811427569","6977799343797225071","4571520564498675570","3447921479831922450"],["921212689811354822","3153810607088281985","3113754666851812779","10559204664030469925"],["1560807559609141088","18111001229998126832","12645895623406143077","12801909629759656199"],["8955757292959921763","17231036924127978011","7439003646886265430","2203006234932054162"],["14045087549810729800","5885506890383451298","10922172261576901143","5885871470038212363"],["4891994173248911900","1476843794894728870","461194747956424032","13162123244372675061"],["9648459740925107154","6696111427125118985","5569559711124959544","8325907167742519936"],["15466295949803823134","6687594232216136209","796606435186917754","14091115158661656685"],["14122839000523597640","7222495676444094018","11807124668064875757","10739851694415345785"],["6369305953006691681","8166095295972853042","3678812980072505940","9047639763268512394"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["2157877707037933385","12090074550193275736","13394854324868582800","12715467665357646855"],["871238737138469461","16419374706757808656","295990031682530240","18282072206319011295"],["4131452039630340350","10905122856630488824","13707440093435032317","13979894714774205608"],["13168704254307095622","17150340466397592117","14993594662316264369","5466334797579078661"],["5119262421173769721","12037746853495776137","5780604104663537823","11228046522935540928"],["7964798711257166658","16304232905341523849","2854154485665596515","17121583324473937390"],["5078094226447552896","8824825280013357713","6021159745562569807","6328428727914993368"],["13830139030550821195","3198365383443263581","18022171565072152752","17666777299736958834"],["13201800660368655939","16828312766868568304","7705060523269170459","10582675091970354425"],["11016435832895703493","16211779077986542864","16224398646534279280","8976988288504330853"],["1634542774707958650","4482010502713937398","13064057437181818925","6311164036107657697"],["7382701990052006685","1216668316218266670","15613328510179748920","18373820972124946493"],["1448558747208009123","10241718043219307288","14923704777375965263","322381864623165641"],["13154131193660708485","8361276955341727028","16731697530433977170","15521949407967393756"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["8281333574179646202","8671666156442452814","1446066162765749137","663808605598416246"],["13232260027948163591","7582144215032388143","4423620395130977134","6200228437542665219"],["17984260920171067989","15314420577505412858","702305426212520434","7446052418032172131"],["5031266295967691058","13582302773312026811","6576440659211747679","10093957257302468419"],["11497572049972735056","9472122274880095051","15439803506047256812","4407753504896742331"],["17620597424080577278","1354909257748984662","17816645447277490754","5469009189376326253"],["15505732486092263789","3912319660933058536","16002244345608335731","9270383396131229578"],["2558818415601064036","7152206060648806810","7066671646510143951","14364217152741311000"],["5460650980686979035","4083721948328316633","17100823718459651481","12311366287680811106"],["12841199000377108844","10155565697442345342","9232333582188042874","14231688112310787285"],["17196868996093550459","16044148712894219965","9227646016683849234","15016192125062449127"],["17687828250278770196","18320765315035303005","6654080987737841607","1750812764554888060"],["15295236369337818531","13837576024768896961","18231353084704584202","12381236981040942407"],["15113937580155545919","17049418799138674721","13952104390164313031","6369862711116042114"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["12848559116407903971","6104089190719544157","2819783157995945781","11004891570363815957"],["11951856832661929228","2662617410097741453","6176043989222968692","6303472911636362222"],["9225356007402358599","14910504648977987834","1725671209188131468","4280274241184720047"],["13179332624534103881","7288673379871314553","9703540301469672526","9172873910832090525"],["16120959573594411029","11289103302533116932","415914840255032717","4114070560961744192"],["17913142182911185488","15690245787765056304","5638610517083348326","1258256652804723508"],["15693271167108562308","16363462700954706651","10273597661705564212","3509418210691706154"],["6812274856698384669","12093904435969602520","5779317490224477542","13718611169230097576"],["7553521169966823660","5386820067387908115","17008261144055674275","12131671083907323617"],["7754435516193981192","11360349199129213267","6081562360877840619","1469406507263120421"],["11558745344711075659","12400807213365152876","230776150530350019","1838948504393090368"],["2930606842497708782","3483618322327641171","6435739928676866416","4130431949726247535"],["17216936913598035954","12098005222916511177","10489786742189765490","9788167531132875244"],["13154131193660708485","8361276955341727028","16731697530433977170","15521949407967393756"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["5393348417425171330","14309939819611861227","5308002934018449815","14283743818949550077"],["1396054091605026801","6528761635596030971","10995588112097980621","12910942819144974924"],["15374398356646008676","15678906565185004326","8780474428952292969","6528471065891282921"],["5558481240726857438","3701952797686760921","15353456777966220784","5697831106526886133"],["7673987571657246313","16970281206220653021","7712265271104539769","10348139076802249890"],["12995535538524969562","10021358556251625898","10213139066927868139","11367779318766731882"],["17779082486952868287","8963997930385299268","16333200451906115012","8160797902357252605"],["3074251548237300753","4740242927630509265","9958955128578934002","1873472025822499909"],["15940248635972773513","15789740192294329898","8147264516513580540","16698705751828653545"],["5003141574950495275","1307853287866376376","16806269563206983024","13592304713503314485"],["16671363230220841221","8869610154043392612","5127538655106361679","16822706426660417201"],["14950506524545625713","14995389942154479114","14770518361725573809","16106233182240383034"],["14623505923105565119","12877438692151841211","3740409076702666334","13905433168277119058"],["15657929014933936477","16623590472905932476","13343596198390284133","4123487065430121940"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["4054567971103216772","7999164573997535231","12133644824905545705","14180827004971430413"],["11611443731613508220","2256806626579731430","15677418406193008315","13598571022784137390"],["7745117726185207448","5487777061006233852","6092035429003130698","3101878579790676300"],["8321932670934725362","5253596451854202603","12514515689788981844","12695672131375449412"],["3905872823776778006","13062760280582165931","16267250769233559988","4817870339708819156"],["807721993260603890","6627659855885442978","15854638777269642187","11784474691071508830"],["17647357163894041093","9982536656623109734","10179036364440632322","15995328045572682294"],["4489555685735463819","15277408389121232129","15117904834625711021","17934650141158548526"],["11399549625910726556","3910878727137857785","17253492126352694859","8445884479140751304"],["18225688823868681937","16913169596517122231","10802046489335379509","7590474903400442836"],["16115237784574987271","16151378821344436845","4706520904790434305","4017171930601725504"],["12228683507200753346","11236913848550311129","12799706002030720380","1721878259779966904"],["17216936913598035954","12098005222916511177","10489786742189765490","9788167531132875244"],["13154131193660708485","8361276955341727028","16731697530433977170","15521949407967393756"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["8463827713258742746","8827993964589001507","7333564954054364267","1062454064631639586"],["15642638475376760749","5151495230511726998","4088924619373211427","1316955841876848204"],["14498368472509007906","191275605596993797","14885101300553952907","597914564909150712"],["11263601000183250289","12912812009525110448","7312216723310999081","8787746855001363343"],["3496923820503465421","11164937301113349539","5634803070688696812","5429887077917233703"],["2295596937136006742","1575450769458489106","8564900170029312533","5743043339218203069"],["169856117051103222","9121955165131940625","14210978766081681535","11545524733022947423"],["14465238022934846694","17640323019353661423","13920748993322852668","2306110157133144573"],["639329742547996160","4725644927218915893","12583471762465064351","15255152803517188038"],["2939559494894465035","13626950638378000639","10701049614236254659","2168479568179318892"],["3032373287153201939","12755880421974797457","7405139278939581598","5310064496872833547"],["12690307574808118019","3054172920637366045","14668166108229480950","3107161774597575792"],["12406872434841281670","14894333701568862293","3256596859336791351","2417850296569083996"],["599634402029575823","8271218186855046105","3993043362162846805","6865371228399928016"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["8053728513337053409","5297207879339767724","1229125218999639227","17946558660107810096"],["13208944939791101119","5459298554875134841","9710425340582160293","13798671633066089159"],["9647696741926520758","15334717950534695575","15251870157459768301","17272274720357378963"],["8634694369792384852","15858467882631225540","2649893004588929761","18346621393055754865"],["7277632846296486815","6948838644840240460","16133388740646954722","17380699400002706571"],["1980453899550418059","10888487948796141500","15825476607818115284","9815806777144484871"],["8519013499445429595","3365508177896116188","1838082660965563461","14260580535413721516"],["8544597180701307252","12684018553178467483","15679269904594154521","4160583995535910529"],["16516248930651585951","2401969013054295871","13694205690610166489","11774914796916737305"],["3065404008073360044","2078389656139948447","9373076531526835966","4781645023138081653"],["1059303399945936685","14132415392380658780","8122371416070202266","13870037613442944425"],["12097595399150012270","2149853074901853215","13368173075992620547","6237069157153409455"],["7729269495371756951","3258566133197543490","16753274822714227300","6887926876699849574"],["15226948565933582957","10044748055734091715","7381535098602096140","13142320457407846843"],["13378825865819710472","8241247385602923110","4160293409502685585","15797202900815346294"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["17613186032761875723","16815083347726907808","8279548705301483943","6099846088528782251"],["9075766315945351509","3784383712455375433","16591940827028470629","8661514199074174887"],["10669022684023632094","13155449929342632319","4862685864981933279","14708422953418754018"],["11990937164713147833","14457286233401158734","7181288658979052070","9977831437387979434"],["2897403670670342206","12049530183502081692","13595991004579651097","14382622582786283918"],["5144787854698748473","11730568097490990636","563390125135728152","15818146050018213323"],["9723744096079239535","15443705671618457631","8439951161220666660","13286649959295628512"],["14750369615877800886","14074859579110432486","3451851187060400881","4531311327704221604"],["3057176766321702439","531269756090073603","9798542470016169576","8676288475158530996"],["1040352285643773477","13582345067428707175","6007990562973530584","12749200251694713738"],["11883749987231037189","12179791548401602695","5414631065589172227","13144927635428414517"],["17687828250278770196","18320765315035303005","6654080987737841607","1750812764554888060"],["15295236369337818531","13837576024768896961","18231353084704584202","12381236981040942407"],["15113937580155545919","17049418799138674721","13952104390164313031","6369862711116042114"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["11189774995899371390","4418033410183599066","2803321609803081903","13380896527159188772"],["2697051064992319294","8232423583243599032","17471545261518006823","554452659426136939"],["8971503529906481506","17764496671007357155","11203400366579932096","10606656000640670660"],["3298351804871963082","9208123213440157115","11016886566427738860","95674927986336058"],["3962919876340894895","16191407370179317572","5889182523392271462","1921974173864614162"],["9898109573674070474","16465778290311301244","13228816637691704656","7891130720677443002"],["1377904817239600453","3981462952425697078","13561308928699070845","6299168008889671240"],["2679391198452859863","10447423840406704950","4359116060670630466","517074719941735990"],["15770041315948994452","11835453616543979555","6942600266526521395","14519604286248944137"],["6214565216859974303","16279914952316467582","14185837449305014891","18041475409030140833"],["14523792876469719778","1435580935691388101","142766353356100899","2049823222587656300"],["1334695577164616447","5192070162222931935","14697553747312271599","11558134293420246522"],["4971634850868538195","13416844690005680152","5905191697347033624","13104176239647415574"],["17428497602463888061","678023575994386991","8176226655300118958","9806171577319792728"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["5938182376643815193","4094132486598821467","3120231579914272168","3613579707240451808"],["16773535932350671660","5085849427079375828","11038497618450580915","1155847988842919609"],["9927674981606005577","5819399508684468962","2821403169187550274","12061989791919109066"],["1222154684780508258","1036710771325649422","17754075092703224011","1249001024628584339"],["16881253913500848804","5631043184574340753","7866827799266518491","17772699586610588717"],["4696372109021824438","872887086443340700","11143881327590792254","9956331704239851541"],["1325998818519005125","13620676843701476193","12272833725512778258","14502711209651037904"],["14897371100397694707","14066399390826843661","17042168660290900055","6863396260132295470"],["9488684312576150446","5121436652373609239","2119355458270150008","3746552621092934561"],["424981573322522802","18359176795056694962","2717467797073156682","15379746793146545236"],["9907499061033273941","9118065076204293274","2168152773236850178","10860002747558966099"],["17419476283768332232","7645538656057888687","1665807855996720771","6055871969512770706"],["4971634850868538195","13416844690005680152","5905191697347033624","13104176239647415574"],["17428497602463888061","678023575994386991","8176226655300118958","9806171577319792728"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["2126316828358128159","13045104876023522823","28454376918376399","10326385245551281450"],["8961422603009140005","13960941746949594913","5170218469342351751","5477042700134361330"],["10200332376546809990","9434865812358963898","16761822655541021","7517831549301693855"],["12257987711018861452","12864408962123550750","5559522953702483046","3490128842396529359"],["17031617582857362493","12982285398500508095","17857145963771813688","10169879520090406258"],["16013812341357225115","9215074943812983801","5598891437726977946","12568060240180724340"],["803823655594821948","10875913947944011992","7248826535404223949","6612744892861422972"],["4200906387276228024","16031111202832126999","7299031674119546878","2643174016146157319"],["10846440590982653621","851599559444994203","182137348269314916","8767926304831055096"],["3252004287553664541","18422508354400512660","2208484134828531862","4647964958651310613"],["17553591379134373082","7751280852286341850","12922215827484869627","3350498461557602666"],["4815963418691034825","8196816122887574925","1475424914453727004","7061353991391388102"],["14938410570716283943","7798883174759736165","6986559851279886092","6071937309393877692"],["15657929014933936477","16623590472905932476","13343596198390284133","4123487065430121940"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["7254741162180314862","9508950198846715272","15972656389133659845","5681048887111101005"],["10537989453793931342","9767181781679602939","8154490338987737539","7231462744458413852"],["2049428611067640371","1597750428798769609","10911321908509003275","5579067573951952437"],["17423704189915204067","651959917738222537","9015660794231621656","227595055022397656"],["6177179960705175931","1764367637587583848","10396332161663700791","5334853031817486076"],["15955998700943217467","12588684778866260382","8861607803784305820","15863421839661944518"],["10047358066345673888","12642801284036134001","854561118483465195","5298125727814303067"],["16163069376479555684","1883672532850205735","7531388995678725193","12655267839053151955"],["10735692691744682217","10675223238755111034","7776918553677853785","1163478153955232265"],["15319184975796726878","15114065363785940984","3612715631539371913","6858376302146845912"],["288304019408182058","2305447285635487038","14608951866999579079","3999283105388178162"],["5754093176128072855","9007214248069232857","10791065280755237532","11456227027881233571"],["8257936113976611811","17674499497300530967","9197806563522467244","14688373467841427340"],["17428497602463888061","678023575994386991","8176226655300118958","9806171577319792728"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["17760383000758305387","6959557121890072556","11287342780488016481","12230139218011976549"],["6095475607985028761","18362857313965637619","5942093428432756041","1856536732675091610"],["52926409340050693","17267768134495549735","13785378655449453487","7746817033878186095"],["16948063232066168968","7569187370782224619","163761714790351768","2555952638883567452"],["17350650119042650760","35594223748177087","4237964033547864024","2133218739345941884"],["17117681479828692269","11479226382035453102","8244636098285757535","63316246832095581"],["14029725361181499880","3541577778813894332","14080711109761392264","14498661541096789092"],["11541819551461528073","5933782668532482965","8109605747963278975","17006446835568311467"],["4502978320662231884","17691663168017282389","7788861863274997215","18276615569068143705"],["14350420470561028867","1606520651631104599","9449671870561274139","14284683494609095664"],["11768248943155506288","7480824013988590258","10826708550569154623","12806780154051938599"],["10092563329532593375","11611389298544843013","9380783712410945100","10718129445488291125"],["17295525243859663359","9428004384306341866","12903552833360457907","16499846827660625129"],["15226948565933582957","10044748055734091715","7381535098602096140","13142320457407846843"],["13378825865819710472","8241247385602923110","4160293409502685585","15797202900815346294"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["9651216032434443763","11827235275992619274","12192402399928501581","6183065754403058488"],["17899682656934884933","5207594021411143634","13505302068716103875","2923113594863188375"],["15286754444924738654","10060840704900697644","12798569658350551506","10706270691520768450"],["11693394718123315977","18124034427574177190","6646958953577146558","12236369175831638266"],["17811987839618620138","16921963294378814875","6160548185245650893","16535334747560894347"],["17651268572178679979","3892591072804184603","4173901682002931210","14102923677936343859"],["16835992735282734186","4876427025689191242","18182633733567766984","2429279788117013162"],["2966738547596484794","5309869205677123352","10581139893096209654","1988671155422638834"],["828567996251455546","15502908541712690254","4307695084215388590","13770627982989828337"],["7754435516193981192","11360349199129213267","6081562360877840619","1469406507263120421"],["11558745344711075659","12400807213365152876","230776150530350019","1838948504393090368"],["2930606842497708782","3483618322327641171","6435739928676866416","4130431949726247535"],["17216936913598035954","12098005222916511177","10489786742189765490","9788167531132875244"],["13154131193660708485","8361276955341727028","16731697530433977170","15521949407967393756"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["13204956701640052491","9604844306582845784","5975048919185465500","3154551321903804178"],["8748874258060580366","9298434383706120227","12211462930778035613","5373651464895750272"],["13742547672362199910","14573492435051345205","16790808842469798341","6446106563418198401"],["8960896299255414911","13788228827620421630","18299219242344991304","3518004493294173607"],["13187460432793210391","10299272454499895570","5636420640460603923","7990887380385066533"],["13005332308527806771","9449732659862650121","6927129166281011747","7257497961160730384"],["16147447428619577611","15760440646721520598","61887426216221087","10869639299408786955"],["5601216044829285267","17354208884162818537","9306230310211531601","2750547174123443198"],["353037019276990449","6721866486874647463","9257913550831966725","6302285327094172311"],["17014413602820539483","5677987210427894642","8222630403453965473","8721603891682327364"],["12073122446722467720","5547250696110602836","8181350035723890039","12326565601774157987"],["16744575006479157709","9952421329751900555","4843429537840765623","17851628857366784832"],["6330568971943061263","4924761802429993828","15847348928611242228","17476083182602186053"],["15113937580155545919","17049418799138674721","13952104390164313031","6369862711116042114"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["1703708501909942890","2815289384974701028","6674688891506066309","8192643583204244674"],["2053007086890730380","14601325022063183110","16889463648011980339","17554906828046436875"],["6162469683884397392","10106716379272901486","11767926663724243312","5453850142470941898"],["12049617593190794536","16893944932082205837","2239428165648248705","14899302654200948627"],["17532246926147396440","15658688069665048040","954788638195936816","8717674194643230085"],["6335630104546853003","9677550023813164925","7746121986437549303","8270616048987470183"],["4500325514783352959","13223036516082039610","8590108172837584451","17433071172708226363"],["15647407789132907314","898802161823851661","17223049380865700241","8914591325261745497"],["17002259695088088412","10656428447398163796","4079642591630164426","9356796835117415716"],["17154825652696344685","8559097371907310796","6837805081730850143","17421175512765915014"],["13962964994596512681","5887824461241844359","15945411794188304531","8181111251121139665"],["1551108231023847114","3722663793467214619","1105046451545387079","972606489759452049"],["17773274437154828409","16512345132095944299","16807190793381711311","4457868800132375505"],["6369305953006691681","8166095295972853042","3678812980072505940","9047639763268512394"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["2777212508175543821","8291160574618103503","13950861582165844949","16088688736742538825"],["18330917366584946811","638816274521852929","4776902351649036160","16650070212871090061"],["1434465578901288169","18050974103195537524","9606774376862188834","17292110897138623898"],["5763925468643478490","3190158395384661310","12073538337411259552","16480370012323813707"],["16732394142345147742","16665170867011765814","7105775959546248456","18098595678124634056"],["6570268790970536021","10594817982359249233","3516053107283228243","16768807283674990872"],["550961428059347745","6828276090149436833","12157233560951870849","5771788715352256344"],["16546809146114312664","5170040565503912733","1587542988511942302","7536921609798389072"],["3512611792237015862","1050286550824719331","15192430404939045439","10895328604405305163"],["13044965783718794911","17951196250597717120","5085359052994605583","14120717021834568605"],["12351094482328122356","13443912298265449455","4474124251923704186","12346490838697452537"],["12559171883041236532","17588036151479579489","14215784327304754228","13352298375984669988"],["12406872434841281670","14894333701568862293","3256596859336791351","2417850296569083996"],["599634402029575823","8271218186855046105","3993043362162846805","6865371228399928016"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["8401828128062586341","18051516536799031605","1407591152612039686","211363905566746150"],["7291657471058302331","10707303963722886456","17147359089028777268","625468775745024061"],["17181163450293953801","4348400814836232273","7402060270017207939","12709690833248998001"],["4746148816114722794","11122699160983105683","14122573539717671472","9277795872605537124"],["9098327528155073881","8676574175016734741","10473169212433402466","2504501592502971631"],["3528924381810757613","11725140754783238000","10416293132325419268","15814343497667602926"],["15120594862089521538","2728291365422914177","757095812315216266","760298373741878483"],["12292200594911273633","7584002517874041721","3303973610966106152","3753344955219617260"],["15476496609436406092","16540736515845753040","7563114283527194449","5584220253112358253"],["7565174025448005626","12231554455499397653","11703875473227224419","7770945000064820292"],["12073122446722467720","5547250696110602836","8181350035723890039","12326565601774157987"],["16744575006479157709","9952421329751900555","4843429537840765623","17851628857366784832"],["6330568971943061263","4924761802429993828","15847348928611242228","17476083182602186053"],["15113937580155545919","17049418799138674721","13952104390164313031","6369862711116042114"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["13603771447376750653","11965154272649562460","3360857529322613814","752130656865763690"],["17537987282735367450","7720838864914485489","3280690747091948334","1146962631091720870"],["5671781812205958529","13288184991907289331","14394501109062506392","8462251298045718007"],["527228205671806719","840331766602788","9126181040675915522","16939880145031106280"],["14172821414085268304","9317999220775176865","9988195711028725498","5821140263243348981"],["6759290196675048464","9063654570812638635","12361303200267103872","16324249225362251267"],["10635248731898666506","13514113057867775685","16287667108454737294","13757204271477523754"],["16503629089633731711","13513595850378978609","10253121241128886067","3122970638430393490"],["4171820288423222152","17049061060890665171","1250967348497281379","6941719322118720379"],["111800396932421439","5155100877426839724","5486111036391572434","8889515218500279328"],["15840587266782220220","9103156595995164335","6250945853773962891","11187795214076024130"],["12228683507200753346","11236913848550311129","12799706002030720380","1721878259779966904"],["17216936913598035954","12098005222916511177","10489786742189765490","9788167531132875244"],["13154131193660708485","8361276955341727028","16731697530433977170","15521949407967393756"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["16534216726804557251","11189608485396688132","6079710284082536307","487100353116465155"],["15103998875296611586","8633758758130600504","17496489453524571421","13948830277688857770"],["4836329958970127272","1646659557327560593","595284927371732421","12707283053117632122"],["9855531102246263397","10579768627166506195","939622534171748140","6206533379620990470"],["12083621494555487027","12443488583651630837","8440337286788425871","13356310344380518521"],["6198630639169984173","5224328463841635834","16134864430673956668","5880257024714289745"],["18362214487062736766","15858353424299941512","9918495742223679132","1875731048739896158"],["13824915896096743535","2963816251418472950","13809208312526676605","16538193540094399302"],["4577253754490633572","11747893555483937486","16980170561217262592","14477447444637221344"],["14793703391580451145","14488071274802330713","8531250865023737834","15484246083313769350"],["166483077016252765","7921033093486516084","1717275419396032425","3475135381310396610"],["14238447082734152640","15439412703835287057","1154530984528700910","5668665650277687231"],["14862238000617295373","12195198580848466523","2917950016084268831","12567248072209913613"],["17328980093648558884","2101523816850562577","5231452334966008801","13346474072281534735"],["13378825865819710472","8241247385602923110","4160293409502685585","15797202900815346294"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["14173097135039600670","17752421950127594143","3435844311651550138","9884889125293121767"],["3122876024331198420","3154411388451618038","9032644327102987327","3398793336773089849"],["1724429674152510949","2522919910086373752","8313553524591470492","6324874032697988400"],["3139332724331413886","13257224681710517952","14206337467877526207","9986118820608692880"],["17687783376772148038","7419924820383952540","3625980423451427001","13204028478474629228"],["17961316054628195554","6958839155181369645","1028057785846375147","6991076723500876382"],["2592515524000278723","6742490014962315545","7512128476343770385","7058839359435858679"],["17789462566511441737","10426606803710925562","12283410286057577971","14259930621984058013"],["1291859870584720235","11687830102157935890","11471099704062816125","16146801485802379224"],["7295399463135677150","1542692274694059106","9487723140832141348","6377692462334377583"],["865326059960124955","10318110781010917606","12515849052983709340","18038160482517994725"],["2930606842497708782","3483618322327641171","6435739928676866416","4130431949726247535"],["17216936913598035954","12098005222916511177","10489786742189765490","9788167531132875244"],["13154131193660708485","8361276955341727028","16731697530433977170","15521949407967393756"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["14457554438988356222","5578643660189296442","9955680214102742347","18249727392001636573"],["9732618148732762893","1349787038479992928","11601171037095104898","11932388329857229620"],["14533228059092240133","11416325369451201691","9821800756777778540","17694928941384321252"],["7272221001155085933","13861122919756846136","2296004248887859395","14265632365276581054"],["13375474946443831058","17916669259384612306","12839726388387121935","7156006069138721725"],["3842076992035016023","18192148330828957914","9814702813627559344","9150326521540144225"],["10807231226067319721","1561449870505688451","196131440527376706","14996670587021136881"],["11126091339704541432","17364566029634598263","194674225715042304","16221276196719065785"],["18436549023988881996","17373671774760538409","11767077499136653642","364546550017089635"],["15772041696932451873","1215228971819836195","18423620031899931679","9801980076827974200"],["12275428055296994029","6853919880324695741","7136485167209935263","12683283962370818945"],["12690307574808118019","3054172920637366045","14668166108229480950","3107161774597575792"],["12406872434841281670","14894333701568862293","3256596859336791351","2417850296569083996"],["599634402029575823","8271218186855046105","3993043362162846805","6865371228399928016"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["7699189608516387851","6996938325862093676","17847628327229140914","6901327117702883706"],["1197997093261485401","6477260418269877710","5570292425982561193","15129878105816063318"],["1704738611161055878","10455243533305667010","16139292124420157768","663661654001234039"],["6271120226778835516","17686941314681797894","2705248497634423398","267509225068045127"],["2339481680379489913","13873000211879153245","2638604594586400381","6672770850712259997"],["10129525839947419314","15984569963825706972","11744831469452615252","16086675024995272043"],["15952820433585391866","4632000939259551904","12993578304477267450","3064504479670363989"],["14382464946902820410","11700141461227067533","13700019090735203420","14570400244555891469"],["1673305309894519396","15926076728284384196","4761334494553008052","6067633418655796062"],["441288807690811182","14191294589747971713","3136701346406320483","8093506510691209350"],["14550944332659303014","13289586113034826053","17002035484473738971","16331840236886916774"],["15690434520211634478","9497527225571539533","2148097202718674525","5857189415766919011"],["14938410570716283943","7798883174759736165","6986559851279886092","6071937309393877692"],["15657929014933936477","16623590472905932476","13343596198390284133","4123487065430121940"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["4544180140229542779","15805174089310447935","11324122789660869510","9430422411069358628"],["5509717697725774209","6088936672387294395","8971395994009661052","15970662419775245486"],["400278616118225080","15873086730159809266","9762799502328711422","17587708435904084824"],["6164046692247391272","7045669818401175989","4205881867452074750","11927197726793756136"],["10226741532262845865","6936996422363957252","9389899295201754900","7980742833211369295"],["15499526408703334533","4374112413391065154","9941532163831377880","8110468447081455499"],["6777053636906612018","7623344990476066718","4413098282239432451","431387574210864466"],["4683624931193471073","11016268133019081257","5935604853654488478","15816170653438161967"],["12119858519087733550","8062681004788215008","7677751281218475006","13483633557217704508"],["1263553093174971770","15685403532847377850","295285718940868549","14774790199104440989"],["1744369576994178101","9539883449689514227","6144791295765058073","17188295230311168576"],["8837441934263945380","14088466937937050443","11452427445306551412","277184563160727085"],["17773274437154828409","16512345132095944299","16807190793381711311","4457868800132375505"],["6369305953006691681","8166095295972853042","3678812980072505940","9047639763268512394"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["8725048468269220916","11466138753186026782","4181910231279575571","17579967645302504623"],["13524065030947523643","16815438726166764082","4187508042455800338","16564816438264702659"],["12854661492932337872","1221894239812035754","3530135474307392610","10003763628356449207"],["14824910999585175374","14692021787271515276","8776030248781937860","13444988442141440086"],["17532591977465634445","17916888852678855591","9221777990969759797","4996722448890079404"],["8295565433138296870","8208057437958794944","16584813025894554190","587496549657989656"],["18216179913922940380","13016297693247253166","6437960460467159366","14751091898237902426"],["2915191728099375204","4457435320087617915","1060209684783756267","1296254942062258682"],["9213108986462172179","3167937717761995311","18091035579935795266","3816096356236940548"],["12153009733714181015","5809128221496483435","13775273842817368671","13015661070037208826"],["17196868996093550459","16044148712894219965","9227646016683849234","15016192125062449127"],["17687828250278770196","18320765315035303005","6654080987737841607","1750812764554888060"],["15295236369337818531","13837576024768896961","18231353084704584202","12381236981040942407"],["15113937580155545919","17049418799138674721","13952104390164313031","6369862711116042114"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["6752718255697671882","8874479055203561269","3898790274804019133","15691278328406104776"],["17018290176795303061","6702346515479953155","13623150441439877645","6161072693205501664"],["1713950229284945914","4660142716541068258","500043491681628922","16762731333140633175"],["12503576671936327078","11597479949917782029","12953435369999444164","18157022713073871067"],["931095814819791618","7019745607586126339","14302771825506999423","7586646852678535139"],["11573013341226598719","14790715868856049213","9575491712245009536","1841959634245750572"],["15791837659448071137","6505518948470361721","12479974506067694570","486124138808916618"],["7899827252894532114","8237759849334515453","5291218030418169720","7272615208878696717"],["5460650980686979035","4083721948328316633","17100823718459651481","12311366287680811106"],["12841199000377108844","10155565697442345342","9232333582188042874","14231688112310787285"],["17196868996093550459","16044148712894219965","9227646016683849234","15016192125062449127"],["17687828250278770196","18320765315035303005","6654080987737841607","1750812764554888060"],["15295236369337818531","13837576024768896961","18231353084704584202","12381236981040942407"],["15113937580155545919","17049418799138674721","13952104390164313031","6369862711116042114"],["10029062521891732194","14720295372384047251","8115171511850067890","179439015218207568"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["2764502525508347367","2754015961954540877","5446208085415932971","13688256933227465256"],["14986791489105192788","2257791582709015762","9785331303215942753","3084036463459219482"],["12724705967884231215","16361577582618082100","297497793593424991","8748426653704911448"],["11485298641589077294","12402815888413226628","17032400661955005154","2846404650831208732"],["7786228112965906241","75090094942304719","14911616094775254930","9385250211085065296"],["14817660687066813773","15781009376454183722","4376161734275930859","9493541381691783688"],["15961584756322244575","8542004488409943844","12980103982278485339","11866327975468908621"],["3830793242460014095","3392927540730191993","6831303545619080152","3312734633444871280"],["10742514423723183591","11584072980510429832","11616231786473889881","6204225391636420653"],["1328286946914706619","14295425739057445513","9082282554604297114","14343175107175805495"],["505036696947784050","3193846618078069786","13820958269262041934","3141906968519010607"],["464496826785825689","11799515179755844691","15129519465380750365","15566384929085892237"],["7577158255669514841","15887596411803185361","16608906199398066824","9404838238027871974"],["599634402029575823","8271218186855046105","3993043362162846805","6865371228399928016"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["9498046513169808666","8731315095474832937","10222928820211768669","7767656905326529225"],["2905973328111858860","6383114436586946955","6582299560753018578","11507391091655553029"],["2532443753879915955","11014899590885472551","76098249930620732","18384744514791205564"],["12330203372321155631","12524875317027507273","11016205308162095136","18041180776435030018"],["17537085114619040339","13949229660982328793","17101005568801905830","16814880511459129167"],["15368457257642226972","7937636490089814882","826384057821585827","7890878808084862112"],["14491466326532936425","14564811770269310094","11222459397324974666","3056897906603484245"],["794100140627459551","1169572438140280540","11834630812738908189","13416482862320414025"],["7230698919904020884","17652977953709126922","12092496850847761199","11482936772145987485"],["8042880866075938582","9945109016608982954","17105213112317613158","5321940402300147916"],["1777925604533066490","17671763384051392070","11814003094592542661","14717640333335791381"],["9307599568366256695","6960610231498893191","5583609788688686906","4958180963349255996"],["14862238000617295373","12195198580848466523","2917950016084268831","12567248072209913613"],["17328980093648558884","2101523816850562577","5231452334966008801","13346474072281534735"],["13378825865819710472","8241247385602923110","4160293409502685585","15797202900815346294"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["12751766979653624033","2816583422073317044","3296031661713890813","14901565126328061239"],["12906056972156333626","1445714301319518767","14541213682886319533","2841235709558623348"],["8145799894751106465","15457970886418262182","17979068812138736655","8698744940740979617"],["11868000915781948973","10261993506581141122","6046639066254167895","10749129611859713393"],["9749052156195755427","3079162173544615026","8918040305208046519","4726295529019793422"],["9577658789982641081","12230606563079807840","5579816018050808601","330545924194566400"],["4386024269446784576","15657845536808501033","16654676830594901996","13453794864563555614"],["10533782010378613182","13090048923973539227","2599942494521478493","4367819371006406975"],["17351008579576718921","13839567752228944767","16308933634507092167","1573628519806447506"],["4172820954754271126","12036474163455873657","3458749749320043684","15361427735396481835"],["14550944332659303014","13289586113034826053","17002035484473738971","16331840236886916774"],["15690434520211634478","9497527225571539533","2148097202718674525","5857189415766919011"],["14938410570716283943","7798883174759736165","6986559851279886092","6071937309393877692"],["15657929014933936477","16623590472905932476","13343596198390284133","4123487065430121940"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["16645487356230390620","13436956580451483566","4798905373534978815","10301043364887484285"],["12279012127421578365","10399231567296611790","3617923376934052638","1396727453919927545"],["5855825720616284612","18279913314593575912","8583242849775995126","10261183275459443098"],["15642669530993542015","269100398286197445","9777743630021518786","2558965273245777263"],["14981145348467176909","3646685469016956336","8234677881038060655","6367951293537386758"],["5875554524420945931","13915734094743529624","9372455268579404604","3787471784564424542"],["16177222630798443970","3307554651346589746","15244584082231222409","2075668372795554732"],["1493806981258332142","14543151435679822371","8224565986941969891","5289928952603652299"],["1193207967175482074","17946105032080546448","16971107149284547029","8857962166230281646"],["9838395550854320016","16788903076004920373","16799711008764578464","1825109907132757753"],["18418403271283348236","9410965110708759003","17533905666987194105","9267788602833985792"],["1334695577164616447","5192070162222931935","14697553747312271599","11558134293420246522"],["4971634850868538195","13416844690005680152","5905191697347033624","13104176239647415574"],["17428497602463888061","678023575994386991","8176226655300118958","9806171577319792728"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["3725778266072899285","1442919793599886451","6438478539443243539","14145106231704326442"],["7712706662644309720","3287541997506046004","14225961906461290146","3646074645930062643"],["1086221335832703501","6889015808682267371","10160914946767093227","11210911642815921825"],["2058692488914089038","15164758404368244434","10877116295766840751","5939731696862548195"],["6322940029367649368","9026925972435662567","4600032733397126721","15681801544222205176"],["10519303066505595955","13393485989582668184","871982846873322804","4757355872528213183"],["4251568832202746471","12719439626402703423","9515559777301705940","12080103420575715302"],["7146621116404591837","14956301491629121036","267200407056974184","14116985080645827982"],["17105798454609045485","10744438464654797958","4993771150278945737","15465799368366994494"],["1328286946914706619","14295425739057445513","9082282554604297114","14343175107175805495"],["505036696947784050","3193846618078069786","13820958269262041934","3141906968519010607"],["464496826785825689","11799515179755844691","15129519465380750365","15566384929085892237"],["7577158255669514841","15887596411803185361","16608906199398066824","9404838238027871974"],["599634402029575823","8271218186855046105","3993043362162846805","6865371228399928016"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["8759213439210024540","18409884929614498323","1236298764418456405","11643619588367033493"],["9177844871641334466","11409899229288286320","16657865600909614259","8841875488121909391"],["11168350778035806340","5014408985917073928","159218830984173120","4173280120689052715"],["16939604777898400913","8022995932726441579","7545404600138434015","11624926319448574727"],["15239901394567561957","16654559640995624305","8490650289971794926","11980477027431407502"],["25581343005799389","2662538873828489320","13647565592223139349","16559810688995821879"],["14796460232523537175","16458835978440500190","13191128752633633812","4950515260290221906"],["5373387772197284882","5628661192902832252","17016579787058985933","17215790527134828956"],["10742514423723183591","11584072980510429832","11616231786473889881","6204225391636420653"],["1328286946914706619","14295425739057445513","9082282554604297114","14343175107175805495"],["505036696947784050","3193846618078069786","13820958269262041934","3141906968519010607"],["464496826785825689","11799515179755844691","15129519465380750365","15566384929085892237"],["7577158255669514841","15887596411803185361","16608906199398066824","9404838238027871974"],["599634402029575823","8271218186855046105","3993043362162846805","6865371228399928016"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["3736051188120623858","2087873791097001083","5793973962071716955","11514189738467613547"],["17033754908084911607","2217316612259094508","8793427596822510771","7298251754540340282"],["15005518229895672749","5451944988556953329","10690294842189967087","17623126519036712182"],["1437241475114982778","11439665912185496314","12898224755930908109","9471975830415845902"],["8334216857021830965","2195728503283212140","11465371804271061774","10742669753666181740"],["17110504074905268918","6543948198167952074","17335861408043374836","8781430587089413218"],["4087333323388169857","14638079164346805800","2107016485206590960","1505688515122943417"],["8624532993986787486","10780392745397974811","1424939148231979016","9851428543025177607"],["13846986986044455441","3845046227168204526","962356307793896625","5585202362619007620"],["7210044845290749410","3278512255365605978","17762514786915261566","825095074967235417"],["2534276388353956090","12515049310610068606","14569552336586218242","3575955823962560360"],["15466295949803823134","6687594232216136209","796606435186917754","14091115158661656685"],["14122839000523597640","7222495676444094018","11807124668064875757","10739851694415345785"],["6369305953006691681","8166095295972853042","3678812980072505940","9047639763268512394"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]],[["16472099546409142801","1062387601101459090","15806870033399332465","16008096769206964029"],["12855168213889905843","6475721321759432181","17405814386636829110","1463969716840476969"],["4268160152241397361","18033104766419789025","9999322470069600783","14119119601331222751"],["12169195799169716365","14524024043073435678","9724104758606202912","5972572322112692518"],["18178153056680661507","15212926712530820497","1214899539250917991","2885006359398014869"],["211771862290426788","3600693629948242543","13889823921353521857","8399158643762292916"],["14039300403271067398","4063862930803087529","8774022628283490125","16445758981949112216"],["14684951071315011657","9872332452825596995","450550737752669875","16632803272890358642"],["2253146686120357840","11040190105826395857","16434726056790928992","10889868834978352505"],["8543057349714157725","7123034086868623130","15547467741819145162","18146287582650946601"],["3032373287153201939","12755880421974797457","7405139278939581598","5310064496872833547"],["12690307574808118019","3054172920637366045","14668166108229480950","3107161774597575792"],["12406872434841281670","14894333701568862293","3256596859336791351","2417850296569083996"],["599634402029575823","8271218186855046105","3993043362162846805","6865371228399928016"],["16132922387132083983","7628920139504588402","6683624255016452823","6970845059493182438"],["15486845659115514968","4499665853967080156","1374037382448326274","8346187430207149825"]],[["6966272896296039246","8081933798518517880","4772447342113954778","9695549609041267976"],["10706113529216733902","13159184055488635699","15986342240856025043","16850389300596153084"],["16262616898583598192","16096911645096558007","12131804317576345316","12449519859734483724"],["4518032752017692930","7632812130703571170","12642620453304124107","6578867551753516747"],["4601772853070435204","4803534440878499314","9299619548561870146","5490455313192529163"],["13026313056323931821","4287469473911640412","15148658499314614912","17054076963438396470"],["9630561584235648995","4835289789000969490","1101858729392094441","9984901454070159464"],["9974992021863149271","14048559067642656702","6638645044259606994","13719384656301055492"],["2634006419289809490","17409186040305137378","18145497295125710942","15868726375690734267"],["12306548792716188631","11220344027817504550","17550425716265263427","6131944605947335781"],["10487899745951868919","14699107218949020706","2168662504248432875","7851170574226188564"],["11200000629171761399","9560113842778769613","16532512338868748181","374446885129876019"],["14122839000523597640","7222495676444094018","11807124668064875757","10739851694415345785"],["6369305953006691681","8166095295972853042","3678812980072505940","9047639763268512394"],["12741100627894136590","13260820718484389293","12600016480300072236","14136553390544624460"],["13260580342829246475","14632892098150882468","11324796467380722832","16710351059772346072"]]],"s2_root":["7938218089305573665","134480250330127893","13946612141609682787","6412974077106696868"],"s2_vals":[["4066465529700530657","9767701626041846187","13744156559506163483","10672167802752721933","17456089483608296644","12362347665620033805","14375395579796606937","8788616643256660020","17071918677092549732","11604767859017124553","14288971289547968988","18043394910530349642","2637614298294128226","299559833087801744","4987436069900913892","18225615919569086929","2797945214251838763","8545176066867551898","9731417961032268005","184154494640056189","10177503276596146860","1047849241638288893","17297449029594638566","9230754105561107735","2523686143621790899","1827457890890476776","14484492472459449187","16411794399522823177","1033876097945263697","3538245717330743253","17007511408430774730","2466624463197269599","7915327159213695859","9042524689209446996","13857735559878018014","6337552622430172132","8837341364569154235","7459586299021367393","420496276506410021","12228238724597117865","2720598173501450223","18045460754098722566","6790826097801337388","11156490196244836082","3023832286818266802","6049006467226975414","4277428888120061296","15579153243495201762"],["61463660222468320","1851357014518495584","4577094868651948577","11295272357774327026","3473868574021690452","10394455072000209736","12482036480788978414","13148104996434527114","11049149155878130225","3154217994726030757","14940262380054213621","12638747868527580729","3306433455308600544","7313895125306685464","2832824696481260057","2148249797963271068","9523999815457793115","9116298891733194624","583187186647637338","11368635108305898576","18359658874955093797","14311927750804722257","17309717309671383187","11919623317492248128","551410300529163741","10091017073004962804","309302216439427319","4497154489329163304","16404320405112221867","6313726842494802352","6766189811890661170","12074094808502170936","11964927572860621428","6410784257248352828","12300212220980103539","172150076818165446","15220307958103371555","18276965954704062005","15787030073579022287","13075824240617921679","9924596425117403046","16908094846710293301","14118928421357953744","16518693365571350494","5245635921058227523","13688787804512915309","7144654160598638050","12105579157788019186"],["12136194923997954548","12322099217913630706","16124461636955131084","9032205722755230542","1685837493057361298","14541049849124429523","6455097366391532461","6327936746826346309","8010377207523554902","16195402355353458348","4022149779307093204","3948846394086912245","11109838384818968154","9913281518891721595","12534159845914963562","18353672212535188818","11192383409302394382","3162582809440663544","16231837607745094555","702841559342363665","7055019494116135266","267994108680466079","15153835448916312655","6456150332703510028","7495562571761153206","2481486225095559829","7440560850675982169","18079307486435677967","10404929853993356918","4896062794725399031","4765114418647463647","4954316587043579089","4534919037873508267","8836890144409423798","1836715331098267347","18078414824182580337","18034597008346383241","16253707786003267135","787399467702815468","8758501559756598262","4204281077819262744","17433845398178832085","17477072031750389456","14020746992475257947","5891865161699365849","5446849920473918135","2228399742509742857","11094367658711182343"],["10737918298629257470","7483626562261720807","4358845643375036055","5855548278901693231","10463095282064709675","3942136431295463675","1963445503754260286","17887276009517834805","18221383496064431140","13037111518286381792","6921055542519903554","3734039497308577181","16138049226895073620","4841878882441331749","8690413919762286952","8656017037158237281","15871815831838946940","10004107259780226620","3055726267436512123","207592178633225633","4264899978014278371","8321397829992672838","7993495560784451200","8510765660768019384","15568405654279050961","6205706322323002508","5653074806308039270","18329709679979288685","5015725135775860679","359847900625094048","15171273050086913110","11520249387315140593","11853658303301153819","9402549720594984704","16431811141205078431","3069953361226078666","10280674859053502278","8629523517564126099","4669810017172683460","685507869133372864","15690690530316010092","11758527222567428029","11827073901865451491","2457656462995254207","7684119718002647139","5856995504473774048","2062175759612136336","9989303028309191019"],["7512505033601028371","16545094283464410692","5632351207411415816","7045553420959597562","1163676271681848018","11858521842474597223","14586574959269882443","14683431575161612165","1876565590704375478","11683343950631483368","12720172433185959116","3190708197653554660","13724206513911966461","12086434760254141865","13456388648583554536","6875756651285393695","998508689643530294","5014498512928815328","5519141453305142037","16138728137158817545","9342443297660255216","7664072103458610818","3700448358413366056","17500346982505697550","7729128899794772705","8199028947896703645","3032731239406781403","15673091888235685806","728477926784418699","12322818800735623779","13516164825074841373","15243687563823638528","14528190279861071895","17751830419984405550","14873547896993063122","6654563719408691854","17276967454449929965","17368123562490939975","11846197157517848993","15572815490453250313","16523563357453898618","16803061205825680615","13425922816184402606","15563488563071883780","16812632209731217808","6536282709704113818","17582512507597665131","5795433923031120245"],["9999005151941909256","12118974025278553437","385639164384676605","8912018214401568245","2708562028448974304","14446296800583468732","17063059960520124870","1066766595576760567","600074421087366579","826262030403062560","971459172760390316","15056518413202340503","10770731899749568771","2661538349261906847","17259903435759350687","1280802762979123591","13636493202524833355","8052276016330602497","4938076163958902282","11437240262682628872","1092491192521195293","2258036820782367342","927441931746813247","1738836470050327535","17735450798020158227","14171079696078576643","8635967734463735418","11990235436108849439","2875809220289100064","5278455842151804773","2953945428893016379","10972481723267782253","11383457221231424847","12540041426079724341","6977946474467020219","7573934212491125094","15603166027849774303","4749700782875719528","10811190761156238089","6841590654672949106","16589477863486616941","4901033074730548225","17187444930219306303","8123970793466115539","15599963022870125673","3677719867272800063","7430404243419541355","12203886356395407074"],["8618033035813793707","16890879987615289653","3867817191216043741","13294358614730150252","3048053316461394654","12882722894886802330","15692987994868880260","6762573001195404992","1001619729256086978","17249279277961668343","12387418373681071837","5623802249473195130","8740243712276510035","10768185899105480472","1860418953715582719","1616843670862998475","4165517802329607555","4480020612509219352","12389751899353258364","14797221132813143621","14908322096932796808","1479669320000129674","6763417098034257360","5298095342741328612","13459693799578310482","12303684327487016363","17349611506967498855","12634826949250424960","10993691508573261986","17081477248537126867","17602658464537082296","4116867664232712113","3210170210576979106","1689143992321895173","1641325794634025276","6491815275516793911","3176898934651372905","14408536827579075496","1298512277127373059","6345641141235518239","9058569865060221696","7542554911475692034","12723472241611280476","5845150114885034073","3670724364284588229","14409936592731657822","11172598477105452332","14357801120005060100"],["17407179435975677003","4328995329122692267","18292945812328571953","832907035167168989","11697385852889369455","8485365691015663179","10579354220123368766","16330659938485194676","3534354665757404490","3404599548154420194","3716855693567523307","8159896176792273483","12256838048123398220","10278950041224409268","2256517663510675208","15902417160521537696","10314151804443767443","16277103043526488360","11402483115017324787","17808943920800860162","2547625057516694203","15481878562536191646","1213244757364367459","9286100846045083653","4511845659468089746","15574701775134872241","16545390489117288595","16923963792021292928","15607179443237995360","10572812111984885997","9033404684828425628","2316034866454141826","10086636300239433892","1936019786620905624","2912052842749985128","9381136094775101554","8916891532597431076","9584441616927152529","14636624338463065508","8754343476053614462","16592604358691731653","11091160354282046327","17236846903536141161","3657853934901137942","17872562039900777532","14000457429825151681","1996613780309265918","16233754476999117497"],["7181333948037484480","15030655577315351320","13375044810465143003","15063355963618761587","11825350961533533464","15715457869371613154","12853369110222017743","13388889072821298916","13807424799598241258","7017237016935963332","17136416076692125475","18002930901785277048","16857863965779230437","11724640646065290172","17687772702492168943","13287715235224817184","16047154180092611304","5191314318454134056","9838065360214103268","6509561565080265218","1334289488813062640","3956209435296549149","6137158851908465213","100115272597423334","11281594860832626381","6461196389911348430","9998158117574044231","9705235389773659062","7579459111151519822","17576956031051532826","11471019358751047736","12670753551309868460","17209668696806170671","5634280010094886398","410873435665173474","13496320987620783132","13193960115922484665","9339347731971034995","6780617252469426365","7474979612957751093","7656700994824618802","1720398470701826822","6247902539252317205","12862012194360066011","1907892043957751824","14945700116118621259","10564196841003742957","12304807036210531630"],["13294230891767298655","3022851239513362145","6327566709662408006","5412064668265252607","17418487583903603094","13520278415133683793","14157019798382505727","9572991465066854042","1243729783463691946","14206806105431119072","1757282882305241878","10388652062918576296","13468101230707744689","4168250480003738689","14516805483157468258","4810774542591947605","11534229793415172803","10797864940838488634","5373888862380814466","15960430756535017262","17873535941612951430","18159024622421813727","17938727543608706323","7912782516802213216","5698065340208059025","13607318969915280816","8873663569025403275","12848257567994025544","9067256957364626201","9080591872915490070","1816378269252910420","11407125362858028746","9777966206617528466","12739595234582371188","2033170812128110022","4339726507817628079","15666049678472936803","17594822109997034680","7714791404898252194","4339610463705180977","6383414078247544168","9817244554074506403","17924838327172614280","10784204494453164736","15070953505701941480","3372646031185877234","15788454736884976852","11163003687409269483"],["12843391259463243078","11216321559985531738","16977628424877606879","6085421573874234100","9349733266089127323","14241599194068483305","17139031680074545949","10838118264074595752","6795412117511116708","9622938711580463723","7589794684356507885","14622479037534516086","948071661861977389","16039567491134157598","4979716345138643450","7396498190512146267","10754822787263932062","8066976813481089912","9321928049174090957","7552664414424244866","14127416855873762873","1769099786533091516","4657186619750294961","4267068260735592064","16251717444427288302","8116162929822857433","10248768334863885814","7203075493593640768","4445863325457189429","6361328183497706073","3354224512367669628","10049727458838082331","13367540261121043653","13953270320591710652","8289242500879067390","7126479656876711375","1164858155217565304","10506377280030498510","6746049664352872602","16916782679656974416","3902842365645814357","16454432009402961896","2966243412680679355","6758332692518773077","2670948945776173737","5180222193142499445","11148182065893139724","11371788361262951251"],["7632283347250866336","16138068020489662739","8535867729546317274","2232609945465361819","11468035193378706966","4897060128246821243","3029405190255638528","4128801194715463285","9374858332397738567","17868664273694077670","2934003522611057357","15785543098274170987","10416568807068450848","10023919348509505053","8937620259032636582","9921310672310839185","5680354836240258520","8756243472957889822","1029588043415522506","9830487671156059886","18033415048477492146","12738909062559986923","7300060512661618681","3627046983173444864","7514172041149834931","17315279011960741412","9994689775897673415","5468942275468526647","9985194127639225233","8162568060139939363","4698326224744377186","17576557530396964465","9889987825894834380","8438590999668671161","4241263882337400266","3625375771477456183","9201198726935043476","4866309990276230646","1708594246603020164","5599175340669351613","5256607486558849095","10122870847261917678","13357862723562004064","13254712963181456356","13071987169750575654","8049751835746554879","2170677959098305475","4930675086370613740"],["8845591931761034694","4811285510095099871","15267548294536787944","13514264562017732584","2683110545264952684","2112209700953910083","2728086258848901414","1490753075092841345","3382022502947294500","9222379030508542479","6544407704113502133","5336994405661951983","16046582425197963718","4210677626830454216","10031510595900270414","3862004740238328080","4514380502350378025","11458440095883053484","8933641196678805014","2753063446837425010","3412519495013159193","2543176582751303616","528064632666681955","6761977015236049910","18313365904008447608","17517643819135930429","1038254384117550435","1867864327565732727","17664792066753904690","5664198903577884212","12148317360306596990","12669447234665206680","18099675486651018343","2775885166790720022","1586341263832752899","958288886368898655","15744940937692932940","17328097887135282641","5320335242532867167","17083436377703170786","13966477409000546072","15406404183373157876","10170803989643903081","2148584453695937126","14534908791959994864","16983049092704636697","11421295654202209037","10589531817688161594"],["4664359906743167837","13295289879281535148","11937144297305705180","12514978995202189108","3088076259246122130","13323654714679238218","13255986119890972332","14625690113059212259","8089530447329214737","9011793343900511150","8532341031700055320","1618961082681863279","13313889357988035263","1118652008351536230","12533755574370784124","567476487002145033","17070502117576247635","4334062508783091918","15301073502774444034","12402647388134011580","10076329711802829967","4276072247806026561","14878031774680248270","13061575836337638202","3027892484129123284","3865084674975700229","1848699461695604800","18056109640376040938","3195189439507900944","6977429202181068508","16984124729741015577","17675415765782308267","15820613549307687040","11709735217368560395","14414776197145209369","12979027310504333355","4949503836378757601","12171883263173494929","962049698997924505","4026226070033287371","17183981117829270622","1168703777557751527","6048383105320540642","12234406051018406275","8039790005368491061","17291378831354210437","3965598317413728890","6556256170342412655"],["7571601373737676536","12576352925590933946","3044950035598963008","16591098983292775888","15928148892145871865","16897378627686493481","2465614723409675702","12105943814866400432","7163180581745613782","7159053752396540172","7641175899359657400","6106400884508995066","773036312780214373","12180760768098707085","2136040268159752929","10230544609771004121","9369723260785439434","14749815392726005770","4994443377608204716","10901308801874396637","7808846189258614462","7070348339645491809","2566364774655020419","2389080484503353661","7304930331783903061","12192732799504503394","6070587811308245255","10858608452703125581","16190123833370247850","8361209260325990075","18154673372301308318","1536786560036642299","12110012610867345334","2748242138761436529","616315473569773294","5136152380624414068","14558784862982767849","5525678285296216213","11353012312172026752","1235349725305203342","6638968070406568137","8421121063151065278","10858667236220233854","5399223581164863485","11316658238533952714","14204216726165018245","4195631471469769016","15186918657122354805"],["9575739551265355539","4936867682566409729","10885052051450159992","7660745871162773714","7433208407242139447","11396421053394295387","16436104591073006950","11555489697877433432","1586797003576617634","3068006481290947665","6390460387197077048","13243835916693032841","1443825985843257383","3641143343429538001","10283808052973406503","15564637896090002492","5799514459586165872","16189045854882448812","13688944787996377157","10378514441039672010","14798879840871333617","11624449142887603004","6868855387838552637","2326706584210111082","4596368101450031256","8558117302797811668","6646333980132755134","3264318517884621109","3858459525835090953","12115402176762322612","10662544795417608045","1972061845660675519","8631528299621187036","7473740931992879397","92973794217265640","16441519411406815951","212864445660022837","1287413592123610609","14985020021659853043","8725736090165057025","14190660462722446035","10529024574609736230","17437393770618238211","12824806350817860192","3215103573591884052","6429335958776684923","3265500005669473336","17425035138134544242"],["4996533491821975766","8786258662814422674","9953286659765188582","1558924778813071083","11502663220784951588","16144273010934514602","4243483261319741894","606262488572890582","7646261845383536229","2924562299804185739","13845818844187045581","13509846330826309698","3490442645177677804","7905083419716966945","7152434415424429879","1351011946525169034","10920943842281534990","1474282343540550008","11100222664193670453","16346744812559271284","7964773022790706804","16075137442243724185","12513693688852169917","7604720859088584202","12261407797098993341","10882343156183266290","6704567622542026570","10449323050104529910","11670676665450044554","16278971771078172229","7080500623008309536","6122124826619242032","12388841622265480830","2666710404708003090","1616532044853763729","227074796849228512","2771788763420154711","10498085314459657397","504537765194758662","4773401874123529160","15700916056657692852","4665397287024677176","12970574687303732379","10648479531318116712","9882423952052906512","14847010912282515813","7264091262331408473","9014351342239967389"],["8798933684883438523","3340928265156456863","11155593979358934564","7640478714213754379","16780462892236292587","2769735007808907570","6060645310382485622","8466967222241138416","5574025286533956151","14841632967365027855","11894508180629822124","7759664824516869660","7190396003328003659","5776116262575615013","13095922765112696592","6080486656180967839","7902381874996886642","16721719998038233577","10444588968644701022","17941449659401207792","6460832495961356198","10117627372608744376","8381328806217097286","6928422062288779360","3321553708378003890","14365392992931964642","17696367976858993773","15645090695734288321","12250276862820662059","2222836946096358684","9806350814148556804","535783862867377157","4874681981371386857","15807849526786750154","17202298088997056382","8931459636014528181","5501394830955243426","2825321292098105019","11521280582506053501","4064205368030801562","12594945922691066204","3200494541408339572","17507454524818237962","3500323445659185175","2378898862675217502","8823149809169204797","7761323346597362528","14431129282717192085"],["10580831297152998371","17127390127654250200","17887351865780055775","5078536161235302974","8566870540154854986","4154602193919050307","4727587115408249459","14671232323286501558","4585534889561161337","13084106455535150509","2976734851970943336","10671416812834707865","12975467751360125004","5397018696324590252","12925899663127742407","12548494399514366420","4568084774054741395","9612412290989137981","16812744602817689139","17691653850024610513","95923784169370785","3657967735925704868","6373690621907229515","9686030143009097533","6257824677061486380","4141784733201181837","6240164445060539245","12784519989341728627","10376567952485226928","8886148835945086332","11472492845741496261","17468242561064973794","5952673921561042622","10078805220866781452","352499014008645191","4537074742363447545","18204585529700706153","18955213887052359","8097868807957326488","283605235115777472","12507667055330567557","17163407329426088937","7335131790860241971","10914273699756582165","8975815905424944474","14777772151433177744","1367962121005534848","17462404495011945499"],["9949811784872300330","1754981870842812127","3456646275026318602","9405777365389264754","11334417473253262239","2488727092220879027","10215842124157741111","352836457975001015","11802522853428384631","16931651548412007195","11249431807828979251","6959367108337654731","4422229007080772051","4675276795466458186","13996312446846893372","13341495035227166827","17923046200490423892","1100169445866041283","635329505998354378","8580388580786277065","17075146366207108298","15824373292187836426","6987250015707169612","8308012515701249790","503780810348522383","635025330829556367","16114938921678097706","9924891184826986600","18017227342246647229","8154665641031488796","17333953967857229278","13656539501252201825","12392192168647274117","8159518426542602547","3000587559598372859","1985471808182054245","14769538222987104640","14386657186512815058","10156500758344703529","17392055924186370260","16379668717118269825","7520447206679581645","6849942626594321485","14875523482646352416","1196976357305410666","17866067878419121978","2822136782498120600","7167604982396854964"],["10671385200956715735","2746541450145817284","11803560330576229823","4402831743141300684","1796709992627257102","6586764387572241456","5394205783572447635","9298113320132218161","4626194945985275309","10635140961721959585","11990723172756917550","14683846238850919364","15450432763981521598","12142104081186464599","10807629292548655115","2864901953730675668","12927549050786600693","12268052083950810107","9429950488974756248","5884379376981177653","789672004308358697","15648865561160624060","2464682245602971735","15659649743198143606","5375421219816700032","6206402408395442775","2396251195204498483","4626937446025026844","3211329502577724795","5707549660880944260","14019465727166298881","6055015285047177286","9270513801799814415","2256870444564969007","12784372578800113862","9975549699205721034","17666823655658130072","246957078815563757","9176862946810989484","16834896897230746236","11043842077956608666","17476992422148756122","290057452795592986","3565587203316306958","8163270705809845037","12425406302903558529","15517946815822902476","13169865816757867793"],["17727978877992589032","4470549951667481337","7988680494692700070","5905400575360417212","12109930967899001106","9913092412919682310","707113686072816998","14335700527584695833","1087086375890602309","15442382046104828033","13992706960541629942","15019760204909416441","13404152070027911540","6059355036968354120","17053072363671019248","104205561089799843","5014962969202441649","16562588558153234660","15350387714789756832","17594246051077491942","2232288386429236528","12898996994349280294","17712145067569173559","9844178596626845923","6115624547239085143","18422273778738222647","11476317366879532720","7633223661755821643","14704993595414380284","8831215562813773227","342079521918633936","14002574964759823798","13879861473411381511","3034196597052730213","17253517143965185557","14617925010244970636","11942325137501968903","7691577827421161785","6105364784595684461","1525358617087980401","12752590232123642324","299743856332714366","7621272036562597728","6732659170422096537","8826033610671468499","1049401582029432254","17555685623275466585","7649170825359401849"],["16992806684658726644","9483092342845980327","6217531471503652526","10085796987150221900","16058187920947221386","11002400614947567874","12258766544095890667","18274599164132498978","1491198120250031831","13752940466335876765","4754642660640441001","13750400540918995753","7173265225121218154","1909269248021798602","9448718814933824667","1699113263197442118","15329945381191659292","9438613845019692642","11548864276016170029","5626709032889278161","2672398852195413057","5641896623064039042","6948773624663260939","17446878599304117760","12712185873811544514","2631431475949555985","1153576217447813266","3435856120903023420","7205120641676196909","6698082577838525563","13853733318352201347","15792600932972041436","16796406311780820162","18048955771336688524","15880869234452059839","2537790033214720794","6999688392626149942","16324428607106643604","8257564622042202013","17357570900720527615","3757978334289811076","7361936149676926351","7216460353661129210","10020229838444914992","456290430941005623","3011995401594594430","9798125691269849637","3493523888366537762"],["4863081764723908470","6132578466967012655","10179036950173205861","11430339033997784319","9009515526448747132","11384989030159140366","3505535981845956784","9651083688016415697","18266973716681101925","15177595411787151580","5443613622346343353","18273608607911379211","4623537484216194487","6949270107740666839","774298954905613861","3734540491686703204","5532742092987144864","637408669038507043","2377459509399640365","4784750622582082611","7485423269192090550","15993304486149184411","17657356751091202920","18331858777774554664","1739161899819253803","1085692614735637991","10096204165961376761","13347588631556249196","9685541734392454171","12544092750978419962","5602281412019640227","14153686674856025448","12068476151829322290","9487430305772576487","8657827704372995935","10079809098863500182","11166749173316623204","2233085906015302470","5484903796497777406","6798456468478328134","280773558995488921","2019596845368024906","1454904614420510834","17865826012951482522","15554367612685822770","9986723302790593849","12697641049366502136","2698146711181673984"],["17614137837331553184","13668881450279893114","1549290628247453607","17193530852063309398","17786021078995119283","5122924844926759960","8514132957698903162","3284829582151761091","11372693786471380179","1299529923327127718","4648486345653115333","8763468794298646158","5336445499897974862","9738858471693961172","5775133721462503368","16992156379618735095","6088471274999365681","4763142045667843679","9733964233255102287","18111356089233830218","15572807752928606393","12715666215759393205","6287882797523824026","7202333584851659879","469625845950400495","11005400077731022040","7615041346146005135","14259856319976410898","11359896149947947935","14402599013070658757","4804700370596039526","16226183490865457422","17376233833802873816","11436974490919391587","180890169356261726","2538843812273313430","16594691025732795346","6027353027627601913","4836325502910077068","14426206105699510698","7976417496823804185","3013757109783354028","8606770450471319990","2087160116333471430","17931468735408796035","9082200907711814484","2220776016210613566","14178128302389427589"],["11826486365844621201","613660739393393148","13099753555511235055","933530495938973849","14850937792525826423","14532908277144252593","17783368204272136396","1394683608325951138","7696879453881645250","16689895489528525282","6926199089153770775","2038215132301541852","6511935167293246448","12506227657306482448","7157792565676824955","12738144921979074545","6007671810882322772","13417870583755482879","15994645026397245423","9358209244372257643","1861167542516774249","1875264171534534176","18234411175744777529","12367029714936647276","18101176470889645345","2075881552149196216","899094845271805420","10807860486420441623","6322342178011975237","5640182484857078233","9215004685176584626","4589028310556586732","2359091239848002099","17108159397626934877","17038521568005304388","6462011888783210150","4916040690688410316","16380241415014310063","5973805447999746134","9078616177032117396","15465989596713986115","11450223367279668044","9441959746247546707","10690607716848829251","8949728602552381413","2892776837694838431","1146171652193272776","10513531800487067854"],["17363782128311080767","10565106455309991800","2655545436943715136","3124443455050032608","12681189553299172281","9543507715491672604","6828055353725532964","2145133953597374841","6434376874348022753","14750747148521372605","4040970339659070317","6189420373835186887","11973655415462391155","12194072688722508759","1703629483739775974","12853223197435934827","5835445273912047114","3567690688502099312","777224301115954773","4328947665752411975","904000798921176969","16897476598210311252","7499908563553508198","11341407796319443663","12731100726696946475","1716696720369015579","5036377129373226951","13466752401892603414","4709593164569616415","2907630963213883250","10710417021884267945","7984284320578294060","12822050059652149215","8334293558722232938","3704159684110377577","13477271422253391991","1385594857216633572","9734706488162469318","15252268011006918267","3229225076238802811","2321173232483608403","5564370259394638521","12200970286429775135","8475691529403192876","7265530073135066754","16369383051483886127","3731784621131119199","16404492264022385733"],["7842074608843715002","15376502233836203079","4362800035187717330","16118991291026349886","3821979374578381803","15817648443454290869","1868030543706735728","2100121665825715010","4527430448019978067","9723969293376298141","5129732195554600929","11250237360500118920","5355338425051531037","8908758492983958967","3239294442360731648","8243027674508834109","10048039029638758931","3916284444105485653","2703613492231820337","2894850665111221778","15952761164868688791","15761576861398359098","2347557502655995908","15983148902782912200","12513235965548643208","4012882266668127068","12739876144900234796","12094047480114469406","12287848301340982900","7429393401638537768","9105722874235825490","11552160401860559933","774359524906212305","6028714220577820392","10790333524806383243","3370134198074538476","5226597071200471667","9634260481546629106","11420997712058664435","3670531683651420017","12096084657119909203","1790599238446991462","10343157653654759658","10007430935457913885","14905510256356920370","11198184255866879061","10900306216255644241","8679255045043455766"],["2342318416847638044","7375288361043052579","12169835463306038763","11059055984612565281","13601109391130192383","14148574633099549879","5071427020804690361","8409183847160090056","13213285797798438399","14772843848776478215","9699646517234070381","11172562389930568205","15723192872759745460","7408711481547538493","3194415483876010033","10649338197166261860","14732889731539015059","180049636069106257","17893984438146282919","14805760970121074035","15629309974095534218","18082295207620582380","17653008442002081877","3708751287249756696","8712958081389684836","8691978538311112027","13704075406740129153","1360894764742733394","12505316354177684563","15795938228646576289","5498564194002473274","6047186806413497416","14572557923743209509","5857571137669320004","17673965865871718291","12926875952944860417","14289012686417279774","77719961822235186","17754704867908693256","9560738201673229300","15074275599656560667","3683375503320845845","192766397276316355","2783790897104636398","2916635166414491021","4539038268233576750","7633171604086304825","14606901376835616111"],["14712309631069675331","9530884567895142406","12965313226881840424","12653980486424428230","8390843679131726014","12565923282222030442","6404656461182455077","7075313404313584477","2474116084848580662","9902712764105769612","12710658857295171311","4743868822385365457","14867181914914210884","14607660130834525282","2042622736154494154","4544183723174289379","4257160518712750098","8361827900752432427","354919002672963049","5278821930832435044","15963934836915220213","16454140698431090316","15313565472698282189","4315416925340001220","843731087702523189","1413778872270229420","6944483273596196361","2972025055824342716","388454184079808423","10736599220202244465","8382077188989597329","12650310796068851646","8066276735089931254","18088439911336785990","4080494135963742604","16024377245840557893","3044878435863966961","6028652024671846123","3330727217497793350","16572526468847567978","5766214040628716592","14893328380901978603","8139556791477614257","4414296523648293513","4785230195912450657","15556480988431486871","2929144905301411355","7329314041569576251"],["379082430426437367","17808449431617490324","5321360952379753935","12719194093120028212","4884669202244012276","5761535332063176645","8340995830734659636","6323672156302976714","1410026576834834097","7126733092557356361","14671936667867746482","6969607594755082127","1924591747984380302","15111276673577785331","2353997311388191407","6631024289141768486","659220999155620730","15696488915279596295","4383763351090493838","5929824184499742195","9350158900658398526","9021161797410249684","6488971198446396305","3146885368805180687","9380064240446919885","5802012163800081772","11458535323826338989","997967453835393495","3313770419712932800","515911929446410100","1984035942076191932","8475940504390786584","14075102246803340274","1171445221222788142","2324551284231504339","3278279836371407942","3509797086552591426","10213460351464467591","606918569850850933","2351584509318774285","4230959160470000219","518086274184133954","461336369628968619","9819894796424783537","5239617505642048241","6607543172212477348","6429449285511802545","11537558654115276066"],["9040425475238686712","1271290734126555716","16484736014057600806","622221414559880136","4597405583677502521","14126971188319384555","1224415891907223247","7675392356143233335","4546257380261778697","17928859959507615033","1084427578578817615","9686868692070077949","16246780971233046499","2723835292944215201","5964284736004515223","14890585207682202351","5532525422082918517","8796538432976136333","11930296681625316611","6030266481617525748","17950223826454418073","450804453267567070","6664618043666798133","14856695691477143024","1028600527941837891","2666574320476135710","2221195622597992987","12795791973414517738","13851980280823853589","11208071868806091196","5997200857358931642","8125388645178067698","4530969372795390396","1404656353502948395","10369848226390829842","2996501420260348477","10109894829112497906","206862138918786591","8092344069839515567","9465115049797736594","17395426273328820738","873699430579505397","2261639567818907345","9963908923363126165","7168235199697511330","12011329797836788742","13506189815454212472","14339714719063837578"],["10914355365017418040","6272788607583791110","12246324871844023516","17044102975576904149","5498628308644740334","4691661517356120418","1842123682804607931","2000986504931357614","9661715907539906917","6653683335140910841","1260022994107965310","6267251256961244451","4302546142486803670","2620766060610286324","925624997204447781","16850681978563168408","9109717414839566752","16905957310541393052","4801663390318662962","15128833816482444510","15171828255047626589","3877745993491437863","569005489569135935","1669328476223220097","6716176640560076237","5933579087332558805","18117877197609677104","16872404227551284299","15998208983600989706","16199142749996252172","1619456944005399022","10303736981146740090","11976845616612088841","8009236357213639471","13339938572106104590","17653022291697560001","7199308536824834842","4510538767933517543","7882186617229129999","2529488264008743928","2902997344956269359","7958746451680413893","13818376225575135538","11744637834013398375","8851085785153640353","17392670958667078519","6022056727679537870","5994475982241448902"],["2199157446364006324","4493188231184834357","14368738102493723210","12837866534789747319","9250802766437748615","11525496848367380758","2456279874927159938","116631011617972523","5348946760427224023","12102480539478214918","12889056010469876471","9820714392637853383","9149655617041822985","16605382608568081291","2069204775946046332","4861903664523864984","3534750352546583102","9224433669173330468","3322888373806075548","10324997563218001897","16594916039150062754","13749357384804283513","18255908762633278235","14732404579546632183","15070286015322601986","13473189398976865218","5019212975381777959","1445063775793369210","18445125679240008082","4333530245335336877","18364748191780500488","14543587448667019737","5223955723350169650","6806042566571037685","11992113042512042415","26121539400944509","11761704773868203985","10076077694730139603","4033305206694757622","49731668308006546","13912319356906077954","2971802837362868242","13700569077540634292","2508444353574550455","4854267143092492754","18195236826245053550","3744976546255972387","938798428257669707"],["1037799510769638326","9522785513926018123","3878767905834860620","10615973872148740986","10404830146059031165","1238911421317894528","406430403438570857","4509777737316833927","15838177388356925172","15526757855529608480","10600902862648722802","15091255819030663426","8313102335073624524","3678766174805256355","3869066910418158817","17613150640227985425","11321916885602689722","11363855162572373603","15439152859404447606","6734542766782122829","11935360939819325780","4241235947438064361","13210116676913799782","5417098593493290754","12953055330150272467","6790931292842759770","5606667358392836324","17920287141498389655","3497298626730365126","4498774193943314242","13016658933464839985","16937732077476867327","3114524588946266889","14193268886942042128","13041946217732232959","11084789912913202732","16856458807813496659","10972604340259153729","6615056341410110595","5294305544649840275","7419098892660045316","2147680553159493618","7692519708636279084","12305172109117896871","10723108884981923556","13995076323912138174","15229951464553663198","16958678178704620288"],["3961312938554282813","7436041652541494626","16704086562775718184","6417979693569354297","12267430387050342132","13897444574448767493","5878488373356347885","16817572919373966963","1576451400725264111","11582737129717455480","13956491108727892135","6028646345131164452","15965835297320665552","14659658571234839254","13142682634346625419","15802653199956628310","4461549449538385753","11683281199525692154","5865803350551192177","1155586481906709689","3417716638043199914","8322754867437113557","9939514263257565310","4769490633734270541","9677173099577234523","16528638687018934855","7102745625511930323","13911799442625566281","2673020272980029076","13787436541884300787","17013981674635046908","12597060065726335287","14453800903184358141","1350070403123648322","2131995077513900006","18413616084762081451","13730781513587872026","8906028628508855452","7751044286681505695","15123913158370719930","15716794751902107137","17525069472023494435","1958511404890116139","15996452237422916429","14581324389341968690","16801188543070932922","16612774383344299642","7913675989817775151"],["17189692908000286163","17145743891865464500","2505306306670645957","8680343552466539002","2971363213765572044","2659671811732614617","13639270504210206384","264316481438874050","1139121770014170740","3518324692430603815","15143430687630404300","13757899765572560487","14386443411790366496","9723338774854220762","10345906061487719712","2595827503515747891","7581175999794862929","9953381044321206438","9519910024297736308","10962660077965300250","12785615138822971194","8566293573863727007","6642161176386500634","15871140075695170486","98960695424221748","215514723065978690","9170397998902741461","9945178937414883118","4281968748486405457","12816865775428305254","12719367356090656043","3834283460099240463","7777005765721687717","8696167939771327388","2012057373643784451","13155525558451906894","3827716126253020413","7884837112932679197","16262600589521959731","14507192988513896288","1175601470491887570","986492774546219445","4154569610277722178","5359011055403456337","7764166178534206610","11748971196445271717","11394666251486986613","3699247226242324454"],["133741330916012402","4524685243200851976","1096711142160078282","6524658210095328631","3519390638084228549","18187654428859604076","2370972036879137383","13781488450790767576","13044986671152920204","3459505556356775477","9159085188036015559","13645507703598248194","17557201564289524469","17162778334378284926","3714329103910825667","14730285266768899812","12752820411666724471","16506027266751064116","11890679924355550694","6422395695959615764","9533009873676114986","6706095426640345930","10066311484694176500","9050346612803274516","10336614575274645188","10837089830695545409","16946551177584442386","17961940094771577138","5041045912789617529","16269798373617364183","603793467895465159","9422483243692036194","3163519067265042222","4756506376933972076","753442230020853874","7658194010831822960","5314013650639276174","1446663186060602801","8006889748940093716","13994767454031133785","3564156016860311790","5436607590625488680","4060803035234350817","1920713367334907740","9667308037585902213","3961710457813606297","5246179639019268636","16334857998581962545"],["4329062660048165949","12747199379379049254","9753627622679650018","4647020701582343956","10195925666305293717","7947019820606061270","4145828320322686115","4017486645648161260","12998709717063063656","4761695943046535366","17694589896048679000","9557110105398393457","5467551302714183303","8008509972770329107","15862132419585418111","642467654263647659","1039001727244457618","725434163035522049","79398491105013483","8099097291767229131","5694803174666281649","6612965360835326069","12886703288086260135","302979471132053076","1900638101658394382","10245708643311497732","3371372963370894249","17192221059400339882","9772413131569458679","77306537354016125","17781387983218248095","1181673262550637904","5305247509574036804","1565713007928392258","17893404481297237180","2399831003750470805","14780885407847052446","16931271024097653098","11357650732578495001","17501527651010335708","4446747402142511169","684773178423409309","2589926109163408989","14379112125000810045","7112502934970777064","14392538447108803677","8526669498144394927","2686910953352015452"],["16831394624659727108","8759299362076237473","7635731530646712130","8872561922184695175","11347463273854930815","2181875483113368888","16820459678438812225","4144606046216024310","15734361665541388544","2883080736238075360","12962794112342887786","11316134590688389839","18298085116948876572","1113549614804989318","6113627987708003323","764598119272394283","16059878530694772309","8027233332803249623","3429407851282619160","14785501532010910386","3962406385077913339","1977322419586777748","18155284707869460780","3067049302226039151","8662969207615266765","7147543471253146869","6692655669405204635","437262487471755708","7168181960251460950","3740531707060204102","13109878188978777853","14225807420557889612","1606541655954381066","5206935284797630544","16305344132810827635","7338658012427972845","16440764821283979652","3590477075368467973","7879219734496532911","4136883794460918442","5736053625246408282","15211475971402594353","7801153814304242296","15120153758463909556","5838806209881573523","7252339858588488792","8087710700596016657","15331937487594887751"],["9289883456702263245","6769444780906234199","57573246348733917","7523629696617995381","3365624088895295711","5613761112763326696","12832954544265568714","2347104970444667280","9256113004766643435","1447651800929948919","2842015301306234405","9921766663148926665","3420441868349661984","13695241461884420515","9018746145062737668","4250392137505417236","14007388008267057692","3447398047544962461","9739122484491538481","14417808473717097262","14670522959534625903","12749888948387215830","4344801512784229298","15289166582075323625","11733811522067133777","2562006962620028560","12693866640193370680","1640060642356086481","12636565640500687640","12277644691666251545","11444701976647715961","2838120117541594170","9730073749009271532","5559543175725820975","13692817167955838037","7373489557106341218","260593043855872363","3196983268897397450","17121359248634135247","17266333454442635645","2259256228498745471","3921463488438616562","10388832745372585342","6714105713835415911","4314694287701527213","17056386063355510635","2694414967282963496","7859320084124168949"],["11717714549504755938","17733383162140638992","6596975873947639242","1469497512548195884","108409106126807747","2785860235954151898","6395358635055325879","15555667583349969170","14403813918264791620","13318791452630016870","6781216972417176358","12134382649292130655","16243496224702353683","5577938983159471444","5315121354177483368","7602734571068074355","6644009183007695499","3247830858530052836","6958314455587740992","10305763091391389063","363965732919208606","10194068155635302035","16292293556205769217","9440301347383558624","14262548950487807488","12492666774071016094","15282770162511144879","4276789790164059546","826438242891923351","2517753273421459766","5196495635590457824","8656024470434937112","11832241111154927223","16031278909566847340","12344637280566894153","4706253510594638267","6450379512685883652","10956114257809723480","4663836911034217920","4254984865133919650","7310347328895298376","13003000897997478357","18250210306415428557","5689517171449874540","1449422275539649121","7522768980639221295","14789660171400297519","12952952047349410062"],["297980240668518654","9049812221387497357","14372785096725430730","17253257254250965322","9473376996203822051","14755522551582340102","6658331532180752374","1168966180474310981","2601780440270263396","11006204334739893907","7360609354830488584","7631469031579348360","3977180170482798771","17804889090980533758","17907758827942071230","2744963661828479537","8671612417960143460","18070444326348714671","4569592051434988285","6363410551801993530","14170131147876416985","11395876003187121328","15021721347466990306","1048823848722794332","271138215972409829","9808842717343883061","191745796771874718","8944373109369131198","2622147126203753761","1187141518203013935","524343269448862713","7559407675222649477","9819355028065975305","17623886158552750617","6950056308155960404","11580977580127526466","14657426841350487043","1601368223008957885","16880737040616501919","13997359196745657222","10871870904769980788","11410572892725328572","10722497765608843884","7890164183848720183","10232095459334879924","15612651637715249532","16304593605371951881","14731904732361328188"]],"s2_siblings":[[["15134403348940794532","13149519344681299393","8345973536420767485","18329723421813419275"],["9599185639493651336","10780081581154029056","15738407790782424169","4413110219411362342"],["12245950464333969040","17059111519530029721","3412441260556024749","11152485488060465926"],["956537349591097812","3791240000712173303","512491074591696841","12016572276896711117"],["17109842583664812282","18349130506936580127","3232142723225660177","922826180109331627"],["14731599915709957372","18287700714537780025","6723915064863618098","9440914850997864353"],["11036723663585608218","9520921523001152445","9658705106574395525","11862001680497563030"],["3130448795986482657","9941257420819439227","3356305306765772878","7789168014647703594"],["17798730407758286604","14828248845385726479","5716217579576681026","1238839900066186873"],["10295788625837265227","17226852604398647567","14397471594250789245","6693905964552394336"],["17781556025800682","12234519840231884526","9757684925879834720","7459380630897102780"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["2906954939782608969","11678312934564449041","3172096855090273101","14566822012814379855"],["10708142254345618445","7930503899122162072","13620570149716424717","15552774066521201087"],["9440040657058086837","5033819217343833973","6258625007965105956","6312960106423469333"],["9519369332183230759","14852365624067370449","6103800832991476892","1108374994991083456"],["17519260491011476541","5151821895472938076","15059292174971201693","8730511434975711726"],["10587407847399143693","14537635083050473729","2883497309227602763","9078071796924687030"],["12406680568821523878","10935114755963620208","18323098408014816985","17278603352373983067"],["8709330074971338194","16743655936468773507","8174443157185342281","1968758210884581202"],["12557882484457629901","15285919053218566369","898281965097609341","2145791727326999562"],["10295788625837265227","17226852604398647567","14397471594250789245","6693905964552394336"],["17781556025800682","12234519840231884526","9757684925879834720","7459380630897102780"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["4494782417356881634","14779092166735665712","1482888951124724284","6706363927052876547"],["9201654613864774997","12699250811884344004","14374188395752488120","2762726727320544368"],["14648907840361223580","5580880084427364816","15988266663945066597","8687779888116591203"],["10847010052829648288","13388097088733324756","17085326060887009431","9156036204487879488"],["16029730470928873749","10697774205417737768","8935862537826725799","11911385031552769796"],["14272697334012433865","48573578435866613","13211217058872629181","949412063260058709"],["5859925405951508758","6500685126711696029","2384573779572223590","16424871546948375871"],["17289869517831240306","8404449086454033639","9804053082327104228","10187985039410175057"],["17173854519836071592","18257868273880115355","17502261552366817724","16465980948887723124"],["14967125118476501352","6664036884732549469","1141087560527564769","3637059256278764511"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["5771975463883640846","1800630700177879722","3958128422160917345","16234452661796870565"],["16846190786878389775","11090732443532025921","3422882331398098886","11049733139886281066"],["4852696137358747723","13955058352187210025","1488156901647913531","2408390808967782917"],["2422283987146081951","8577395630020579367","17284655811767357775","716458134462840195"],["2885754475051231087","15605592165017101361","12093779528202125557","6306960110261410914"],["7046888609274480867","15082851499092060085","6860845187497634319","4069070947237104347"],["4578413013166954586","6640775300626966451","1777053273543737726","16780860711956850167"],["11903577240590591529","10015800570358496730","16845021912783707326","2242084719970292761"],["16444768520163882182","7145228744771856956","6352383355653165282","1280070341457133653"],["755934898098847330","15298372326245065934","6884606167579002525","12433375681116191194"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["16336657583884488716","9152325498740144043","7808288437401575656","14557821241939009128"],["2248873104036707866","13249048729929511594","17490527909835785881","3209007664802065241"],["9465493299523843515","7804555476180885504","15726806641098431612","6587842349611897867"],["16081207220302705758","11743816085994029101","5427070309340025022","2083859957085185180"],["16779257790861582496","1157923757531020521","11738757415238723793","8413184915535643323"],["15138420989521387613","6168218849305313609","6457481598424371369","9232104497250810111"],["6427553874756432029","3094850070291831984","6943419655451682609","11632205218782427736"],["10367935703503774076","12739161532630915936","11339080232103272937","16757518003076656461"],["8739925133317286763","5490653001604212225","4146902661589332220","4770128241528163208"],["16256552500438785730","15344181805963981571","81918723584557502","11340220771384412447"],["5382973278196389908","7546555799259657407","16930333613617916154","3916791196940373758"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["4687978556415246677","6342236565760139271","4235322460370515095","17331985798478349160"],["14712502220862370303","1753865892432917891","9200286399697146596","17197384269180765745"],["9050503912620127390","12492062565842437461","9556586649035735656","4236416526172648741"],["15598891195888120760","4230802507888264768","12361859817800790551","231410146830726341"],["2769837944092120377","11783837473713921158","6108968350149821042","4522942148048623893"],["17356565480446126347","4576037156606331295","17623858033673349745","12418232662171481311"],["869650400865169710","17598080438767750730","2632498847364268774","10472867430868470888"],["14287067692757616316","2809332852707677775","14262796415959896624","9492970155937796118"],["16444768520163882182","7145228744771856956","6352383355653165282","1280070341457133653"],["755934898098847330","15298372326245065934","6884606167579002525","12433375681116191194"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["5099899367134957854","15487975279902897734","17639214856940885354","5053340846273016784"],["8842609246256220361","12702242019577904447","7636631523903152964","2794756901818309380"],["16948608255081733169","8995322206021160336","10579789429268053340","10263879335793674768"],["6216022928427084764","8783381790666379048","648321548351485946","1080972098832938516"],["2769837944092120377","11783837473713921158","6108968350149821042","4522942148048623893"],["17356565480446126347","4576037156606331295","17623858033673349745","12418232662171481311"],["869650400865169710","17598080438767750730","2632498847364268774","10472867430868470888"],["14287067692757616316","2809332852707677775","14262796415959896624","9492970155937796118"],["16444768520163882182","7145228744771856956","6352383355653165282","1280070341457133653"],["755934898098847330","15298372326245065934","6884606167579002525","12433375681116191194"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["3767161065970565743","8191279479066814634","5437929109897629812","16856249592524730235"],["15261537723293653704","5057103521501185755","4564162621156460742","10071899810621618414"],["3089564174064715209","10165166882456554544","1371071273231489548","1044656943433623263"],["10501991228302016800","17471233525996929859","16848547195151389117","6683244976321385598"],["2009424577703371573","1346748280543228257","535127222436496373","2644877674759439352"],["17070966565439023654","11249207614557229948","165757874883174613","16357863749919731597"],["9391801856926105853","5796726045211933085","15190454472118968522","11021858979078835264"],["3038293290955577255","3034743278206997064","5393810564165432015","656084848173517842"],["11812676411493462014","17039807632068166217","8164869013477536462","2313514595000137502"],["16123744330884047013","12056009038232566922","9430507918353971679","17344422920729952248"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["8350093918833611186","978184720071931268","14794953570382497558","2509164271928209489"],["12152572701616364373","3858234156498917056","9902324078438982423","17776465510522032213"],["7129479920348111769","12256639155076665077","16646934497760397923","11857215460678712725"],["10443347714802777368","8462368662355474196","1683510987225682312","9369896267469594920"],["1037983003540143126","16630535778584464027","13156999888552531437","13653048923960344012"],["227793953462061697","14408367628176493556","4693356053226958432","14431189488489509194"],["13902996335300564791","8916621214091830271","14587996235458131966","6743863136078315015"],["17651936733626004506","2973882965114240210","13207585604017996413","18372173181804733616"],["11164862982711484177","11562421598801066154","11145675852482664808","2563454001240457953"],["16256552500438785730","15344181805963981571","81918723584557502","11340220771384412447"],["5382973278196389908","7546555799259657407","16930333613617916154","3916791196940373758"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["6329092893640356056","9099365527641614850","17171976899643281513","1013381217780919075"],["16553375865992071654","6766800214604233584","5633369309788902242","1562977204289948873"],["15567309992999347027","5614732264121270445","7844630637552698813","6878618923668009466"],["11801289653679285179","13951792677151915361","13413605435096708204","7885378767395134855"],["3324925199228011556","7314343739489393576","16056582297492768467","6673122096265013969"],["4926223566895838044","8014409771170535085","14778725906017612679","5489899511511933020"],["3210325013437359634","7160527081444924134","4529083310077949035","17113643263454284238"],["17552810672923228641","13446604481075037402","12427515289679800407","6249703803824170227"],["12192582270829996244","873622736796772870","8242414616971890435","17650023912570369089"],["13015578245680989198","4075802105375398950","12152582745282528587","4765458224902386491"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["1200719878535795030","13597539565559108887","2385977162158551737","18387634636027661546"],["3071948605948806984","6659401015992439379","6500016902804275238","4015399385217185777"],["8862889835162975498","6298447840678115581","9021683222640372692","7866673797005116095"],["11072745090538782371","18383033576855079004","11839547438365949461","8458660263401474283"],["14368061525399451700","16325308388476168294","7533573509917723884","172645568315761223"],["2936234515081202866","7023433869638737537","4190306825430443676","2302410257836028539"],["10381184877436664223","15253848722136668332","11290139111017803273","9252806116980126249"],["3547130063539627607","13429791317983470700","4221351141401135339","7548770732196113574"],["15575356400337523918","1183158634169649821","2458029177102488687","6695957913164094945"],["2349589125719101486","5917272648359127905","11323746515753976377","14683344344377489915"],["17781556025800682","12234519840231884526","9757684925879834720","7459380630897102780"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["7953599701242506017","17130113895389652753","4363172738065971750","34776121655204946"],["10158446527074063399","2759370510612660945","722787823303968413","1401294328015643711"],["2092470068853609959","994540331925447823","11751612770458088953","16557366641460899158"],["13199287049910662195","7650028999381888830","15020319957785473551","14660911060789953683"],["15897685932163802347","4702013341637417174","10686796893871569751","4725232962067018258"],["5767838510081612142","11479164254633520447","9421414746009424390","8021435097658218321"],["1099513995063607","5531842347264176569","1001634193249387345","15286448900618878951"],["10367935703503774076","12739161532630915936","11339080232103272937","16757518003076656461"],["8739925133317286763","5490653001604212225","4146902661589332220","4770128241528163208"],["16256552500438785730","15344181805963981571","81918723584557502","11340220771384412447"],["5382973278196389908","7546555799259657407","16930333613617916154","3916791196940373758"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["13716609130246262760","10147489723604197259","7749610112435044557","15874023976932735723"],["8694947010224242323","13759524232872757593","11149554431520222701","17612555776987199097"],["13933407392235373239","6251662941836950968","16079596781550428798","8859843464676004276"],["10751602645678379443","5145469629689670461","13593077404515846054","10793641676585818805"],["7715997086116176697","9111126301618745487","9455830952172940097","2185021561114168486"],["1504014713991806654","3737528057579196876","950041577455796953","2429494031819621706"],["6472485746389468499","14294002611933326051","15827728715022957789","11593442203795794496"],["14861239825263656490","17128700385452254828","2934653703204643758","2137712595717826440"],["8665387315276612105","10747686460187313565","13983438970175552607","2613560329283830147"],["13015578245680989198","4075802105375398950","12152582745282528587","4765458224902386491"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["8402275584955833940","4894592879826717859","6985899979144498782","13641806050716239546"],["15387317993891552805","14317826405576701927","2689034949238833548","714669828770896364"],["5565180792574939375","5605490099207848364","16879425444148282049","3443788020635090600"],["13925201585214232866","14635343219076111818","680872247162003852","3182061517572285243"],["16464074788101291996","3226753019417447060","3050360486026551840","3802806139849708868"],["488466918194853302","4242923833011081113","8983513497984374521","15681770760105541583"],["6023926263653078395","4298483004755926898","16822505320997035956","7816088335914734705"],["17289869517831240306","8404449086454033639","9804053082327104228","10187985039410175057"],["17173854519836071592","18257868273880115355","17502261552366817724","16465980948887723124"],["14967125118476501352","6664036884732549469","1141087560527564769","3637059256278764511"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["14990500254557505681","18348444535334689804","2643604864679190880","5474036230672049343"],["4445245592997126507","2252841204346394466","16137092376880396975","7236538054120235600"],["8733123354229263694","15585164726492032846","3335726439262894358","9495687437340104398"],["6083906371835375050","3851551463180195030","7466740384755073861","5911535918888200876"],["14561282123932297674","1581566706223832296","1857192190709868018","13149062387865452511"],["13064417235156525688","2061507553655273684","11475448450571703987","9752485086825317694"],["1993852781548318543","1455855117923100317","9231187821974652914","14284590953853754897"],["10682154748448440902","3930657274521953224","13881077521224360823","17441012262617810385"],["12192582270829996244","873622736796772870","8242414616971890435","17650023912570369089"],["13015578245680989198","4075802105375398950","12152582745282528587","4765458224902386491"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["4678765815328668341","1493495774740560485","6122590722063911949","1536570700765658630"],["3970647554985475737","16804442408229414116","5265978248863292280","1508112841558190223"],["10000981266746287168","17146627625565441683","12888884098396102414","15806759196572628562"],["2637984897817753836","13705882722923842393","17556612126501259277","4172585598481504925"],["15886207284153656155","863643131843074447","11771460027347521701","16498350227947661589"],["9698131166019760371","14031179113742415583","5358422015692778636","5363120481251490823"],["17841112256407368918","15329449569353764757","427907232038773014","13122817113589861049"],["11261083142480833197","14446462770062449679","1987835245139787594","14401951125606663224"],["11164862982711484177","11562421598801066154","11145675852482664808","2563454001240457953"],["16256552500438785730","15344181805963981571","81918723584557502","11340220771384412447"],["5382973278196389908","7546555799259657407","16930333613617916154","3916791196940373758"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["8559773360769895091","1623786360485674180","11076471384373064815","6129263929221821552"],["17364998267080443033","1083299464227597006","6240931269045960061","17764901225020730886"],["4199864260288037339","582243616636647170","5757434669387107706","9185321814332422677"],["6804062265463293970","9475208944998913765","9888228775139366742","13467449192703719488"],["6843246656048823754","14199558176404420557","2629059575261910800","7389178029727605561"],["78898967607055596","4946862436257304768","12059660475191746834","9549862056003966854"],["3978111584508249504","2741152321704021331","15647882532951087255","17742641814895243964"],["16103466794276725546","15235367070130429755","8049724670917511257","13291494793698849724"],["11766741779964776617","14656171999374209416","14087440937350330515","1959854422507996108"],["755934898098847330","15298372326245065934","6884606167579002525","12433375681116191194"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["11661300296065837124","9241868274361804664","6613324191488084662","1314790247062583732"],["17726118839252631634","4442260170365600638","5351283705747114412","9283872926211566943"],["9313433898125085733","3532502993982183962","3010861428726938198","6666924175174756491"],["13891410903123932893","12737120452110774682","9996735253916064156","4757262275706671750"],["14501075777577376851","11456035034436638898","14026109841429460666","3020453130829055643"],["9748839907483040993","43675036600945346","12196102470588115112","12499646129127887931"],["8020639964413101835","6688797515484115257","4451158779641792851","13935571889963448274"],["14711948532248945135","5226271923683238936","13705558435063779317","7998729637535311830"],["17798730407758286604","14828248845385726479","5716217579576681026","1238839900066186873"],["10295788625837265227","17226852604398647567","14397471594250789245","6693905964552394336"],["17781556025800682","12234519840231884526","9757684925879834720","7459380630897102780"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["14250631471400485833","18058843765879384306","13066193662392819795","3860935249880094159"],["2692701069541720512","15906698847941917084","5419049958561724259","1811409396598052793"],["666540969976109045","6122196514051231120","17917838860774551839","4842285390080871171"],["5245333274691959325","10733059388018619660","10854496029414259511","16531761216601458909"],["8140284620721869255","8600349585822897426","6914607669347546308","9080045109982706358"],["9844750953369833472","7053115598608230393","15873868237049084402","9415292125647840370"],["16113849841878339872","17628681083902988667","6981658433319609604","14545505693194301856"],["17552810672923228641","13446604481075037402","12427515289679800407","6249703803824170227"],["12192582270829996244","873622736796772870","8242414616971890435","17650023912570369089"],["13015578245680989198","4075802105375398950","12152582745282528587","4765458224902386491"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["3662582788238813867","10567863271819113931","10092204495770371520","10973258025400632243"],["7718785873828832514","16952765539890726876","14578795348756336837","3349537858330070693"],["17259959562254906453","15147575034809622622","4794327665914919643","17026302946762703764"],["13309848021678189739","10872423537827999507","2290977679580813652","18390383276061313744"],["6838055243849770131","18040299534113621013","18078317862901573676","7291418721881740946"],["10187745342728993079","893969520877308984","3452251804409499613","1970371990279337493"],["5592024460854401338","10770089569009946812","17584271871090812800","10991466090564190723"],["8585120176851859857","12938875946877760683","18226167885241820970","4892840176227166412"],["8665387315276612105","10747686460187313565","13983438970175552607","2613560329283830147"],["13015578245680989198","4075802105375398950","12152582745282528587","4765458224902386491"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["7352235294521937591","12580172971093132573","7833132752376400181","14678759021246584630"],["11282860624968665493","6451977264818937699","14565064700603292117","16902473149517371466"],["17767345365978804059","3648375263971003040","5939806778994835704","17728038418621033701"],["2382563089988343141","13240103135000857103","12216602439957716910","13605153450900455033"],["14916319310710748533","16407607973791657324","2964355751788508964","13019994646085600507"],["488466918194853302","4242923833011081113","8983513497984374521","15681770760105541583"],["6023926263653078395","4298483004755926898","16822505320997035956","7816088335914734705"],["17289869517831240306","8404449086454033639","9804053082327104228","10187985039410175057"],["17173854519836071592","18257868273880115355","17502261552366817724","16465980948887723124"],["14967125118476501352","6664036884732549469","1141087560527564769","3637059256278764511"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["10558014047775833927","6231031022048268871","13497504188982094385","8744148228527178902"],["16425289538585992887","176353835930283619","16379576102179699551","7388650217514600064"],["10438134963552146951","8918452872607639872","13974198635875298552","15328284305672537954"],["637850913980626715","13581048626142723971","13181677326285736905","11379043973099395498"],["18185420166674174430","2185358979660251011","15281385019426111812","10566745461317781067"],["6591671217987235130","75289834685242461","14357793403047824089","3100244787980915091"],["9022361253592675271","10727629084320496908","9545667356274450796","13199395088483978010"],["3368234266306377966","6198298829727441016","15811427899844011222","10105822611039433359"],["2306001940022730142","16492613143708111296","3335366045928693924","6062028098820921449"],["2349589125719101486","5917272648359127905","11323746515753976377","14683344344377489915"],["17781556025800682","12234519840231884526","9757684925879834720","7459380630897102780"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["17016590902855406557","2865202580410474517","12081633212937469934","16257992958147782833"],["14855638647994292872","9407198913817427263","6309467704099416499","5719284757376267377"],["6940783491312293736","2938678325122294673","199442247467469736","7362326363511579598"],["107543308598759293","11400110044690165426","2318376737030952908","1888309626674619559"],["14501075777577376851","11456035034436638898","14026109841429460666","3020453130829055643"],["9748839907483040993","43675036600945346","12196102470588115112","12499646129127887931"],["8020639964413101835","6688797515484115257","4451158779641792851","13935571889963448274"],["14711948532248945135","5226271923683238936","13705558435063779317","7998729637535311830"],["17798730407758286604","14828248845385726479","5716217579576681026","1238839900066186873"],["10295788625837265227","17226852604398647567","14397471594250789245","6693905964552394336"],["17781556025800682","12234519840231884526","9757684925879834720","7459380630897102780"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["11306811822465191624","13409662005867317787","18238115111173454313","6383744446796354369"],["14764103686615981159","7081671252756144113","7405731050006535486","14907016507511970833"],["8970263734226719919","9876787559587493610","3934258688416863680","99130705333884892"],["4505613825127293570","16534739685472227680","15969841804021774528","11314385474956923386"],["5037047075677002158","2915591155834477359","14927790063827900019","16206780257072822340"],["4326611869298408484","5093760373383984555","7914563626023449658","5113196543556205013"],["11480837738627280727","13022906446069062451","5895915476703340086","12249023325095775434"],["17701372397862639813","81665743496910650","1356525130250744451","16467685618591306551"],["3609678717594108428","1951057165889200168","785196142129888129","1665371687289282211"],["16123744330884047013","12056009038232566922","9430507918353971679","17344422920729952248"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["16112949936734286443","8046830479452814502","10753575398909803572","12120048643508745205"],["635130229882107428","5930509184969915951","18424401844608977408","13816609858369397224"],["11963102629630211471","18405280822936577619","646812774314999412","2040003331337297626"],["20291200011247418","13241200440313546546","5548147820495759922","14249052895312805086"],["4299391919273245344","12559517536662344929","2840864877743119880","15620834646180256561"],["4478384311505796083","10536971350131323048","5958454248099334832","10214635720797205097"],["16113849841878339872","17628681083902988667","6981658433319609604","14545505693194301856"],["17552810672923228641","13446604481075037402","12427515289679800407","6249703803824170227"],["12192582270829996244","873622736796772870","8242414616971890435","17650023912570369089"],["13015578245680989198","4075802105375398950","12152582745282528587","4765458224902386491"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["2764692179571783550","17161921191144134907","16594798980265158555","10112644136579352927"],["9265900941471129989","35214873372394872","766721397491306724","7611163509865550212"],["15113020862557347151","6165769111696499186","11339535548959331848","17287769329320951612"],["2418420446423730057","5123038499312467596","14266618733483316621","18225503334780715347"],["6919916713561187621","8064580417917899864","14490730141614342306","10888104332986335337"],["8625716121612036216","11699086391761610447","8114365207943664743","11087606690190822590"],["2354106311611842416","7387418435592553341","15244189287171389655","16786435878967605783"],["6228843946869776316","9039308848477517921","17966543004822689261","6371176685555441039"],["2306001940022730142","16492613143708111296","3335366045928693924","6062028098820921449"],["2349589125719101486","5917272648359127905","11323746515753976377","14683344344377489915"],["17781556025800682","12234519840231884526","9757684925879834720","7459380630897102780"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["10562510326206052994","8488774975051567615","4966640602650115255","15212024287303668909"],["16067022747652553873","1169022286338739922","5184792444372105786","8626646675144602741"],["11495195142304379815","246276891629629549","7065907389079393589","12813759931511765819"],["16498744016304741607","2477978662740720434","6932057906213259700","1558355710710534046"],["2072059553013466714","3669746575275434612","203623223238259712","3849493889389196511"],["10319382022180989568","8779806191769649452","2674948958107869898","12790484470793203186"],["10769882474469744521","7361108937373750199","10837342775773169511","202364461667438298"],["14153205205266295749","14860198560060922427","3755334453430768004","3594151850801696964"],["13179945332658772260","10392988191852727767","7649143899278566094","5884606645797712708"],["17721356696757934924","9103485153463776199","14886503822877956273","2378811202723382535"],["5382973278196389908","7546555799259657407","16930333613617916154","3916791196940373758"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["146273324272790951","10368951222585168337","14022773500251579024","15780711151727796141"],["446211127787950496","8437654553860387901","11883101941030144205","16173534929881297632"],["3321857083404732868","12116914915375523585","15368620997154320006","278902781835216480"],["15482154469153526874","15065191912886709886","3451898862195642564","13419169104151104246"],["5543006247559569167","5880309364401340250","18168824275522067666","12154542140436995989"],["2275189690249411322","12618932854533168164","3959451852729090276","10868590913290905969"],["5859925405951508758","6500685126711696029","2384573779572223590","16424871546948375871"],["17289869517831240306","8404449086454033639","9804053082327104228","10187985039410175057"],["17173854519836071592","18257868273880115355","17502261552366817724","16465980948887723124"],["14967125118476501352","6664036884732549469","1141087560527564769","3637059256278764511"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["4814303672019286018","5959820444016670515","13432904430834404523","2500469807216876790"],["7656520723404109672","11177538639101488800","1966924592261501686","215911070760652500"],["4970758755308208234","15005338238655548732","3364558579102038543","14206281456836736828"],["288893570813972572","5610102327897924122","12623164952225140500","9622526413739598014"],["12391424169581470860","13210921014619076650","3559672593149556298","10928054202600779212"],["17486177645192737854","8475785293447308628","13703154707848037107","16756844887230813596"],["16087769083813590866","14730149829776209661","4861287833147827851","5953878940583463980"],["8848479736723711399","15457461951249852571","8469079521075493707","14338333894500504495"],["11812676411493462014","17039807632068166217","8164869013477536462","2313514595000137502"],["16123744330884047013","12056009038232566922","9430507918353971679","17344422920729952248"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["1728889640116861120","15824559633528121561","6061458739343726354","9633277279346010527"],["8260719319487833460","13240407482279543629","9912507473612645554","1980969086640302189"],["4734522087955558064","10421697973965381863","14490824100709241070","12202243825392240322"],["2594047833997790438","1230784905615085629","5616413872115357617","2812797978047618672"],["14342089269538325319","9852162883402504121","502350727363483626","6979266238484671662"],["13682090089347766493","7496732506085205206","10120222186553531325","4192228293348557783"],["2354106311611842416","7387418435592553341","15244189287171389655","16786435878967605783"],["6228843946869776316","9039308848477517921","17966543004822689261","6371176685555441039"],["2306001940022730142","16492613143708111296","3335366045928693924","6062028098820921449"],["2349589125719101486","5917272648359127905","11323746515753976377","14683344344377489915"],["17781556025800682","12234519840231884526","9757684925879834720","7459380630897102780"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["11095974945848820786","2079961347509082657","5901621043099900811","4665737549652942529"],["3977702084451940219","16641673955471429746","7690605123414435136","5372383354621212921"],["7913904130627350278","12445947036702227145","15758275419596135331","14416994391491138780"],["3360341198417189307","6535637991505276732","9997962195817655733","8639878195380903141"],["16584284889737393040","6366783363961481541","6623470176569086325","12803094935971410832"],["5738399689235597763","1815461811516892618","17111444303007957855","9974632557024109577"],["15465784990566569506","8746948850890640445","16337110068158222528","4709591176100660805"],["12208762564442426448","17559049837125867003","6440807552517678170","3641951728407451379"],["11043820706057595224","5478744579834428461","17373044552218630873","643721334752049795"],["14967125118476501352","6664036884732549469","1141087560527564769","3637059256278764511"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["3562885661234401281","1952534268790589493","7981017807399652198","1807303788359472087"],["15191168898790636997","4376906271102574122","13098577869853249992","12655789459989398177"],["13024095753383297888","5862164727209322172","10515759375775477142","18416344345185974313"],["15062578230208846759","2124575987147688261","16289046498825622891","15721632941804454730"],["5832567344574520554","17133023931346904626","12083508807650506105","11806448448174039048"],["13064417235156525688","2061507553655273684","11475448450571703987","9752485086825317694"],["1993852781548318543","1455855117923100317","9231187821974652914","14284590953853754897"],["10682154748448440902","3930657274521953224","13881077521224360823","17441012262617810385"],["12192582270829996244","873622736796772870","8242414616971890435","17650023912570369089"],["13015578245680989198","4075802105375398950","12152582745282528587","4765458224902386491"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["209496002977625675","14325439818151631963","13571667986896999090","513851562728774414"],["5890637964772508614","842528072204087650","5290794770717388134","14905074505613842924"],["16397369757321826957","2932126270593823124","13162189085066192902","643480618220083031"],["15314707801421955705","17310150885592513047","7563233870618433537","5968339851584171574"],["4257252830682233476","1296523011613520350","16008566411127831717","5158786255282101463"],["832704492403544761","4379559766604459074","47444086435136295","8901916005306836732"],["6172777339911954979","6879781704859799533","7245309516744129609","14363364995575655639"],["11903577240590591529","10015800570358496730","16845021912783707326","2242084719970292761"],["16444768520163882182","7145228744771856956","6352383355653165282","1280070341457133653"],["755934898098847330","15298372326245065934","6884606167579002525","12433375681116191194"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["9504136778555246788","8445311802435250536","4623364958703718506","16717665046996689260"],["5614487403601229569","1519479891325698389","9786206929065585255","18309421271981984411"],["15145425730960510701","16879692586118133041","7024951813017750723","6710785107919743690"],["16833685713509481408","18139920745250542279","16932787506337054126","12268821502593533035"],["14248853999265720349","4570486267854908098","5813051018340740429","4984934290400925271"],["8313395867944280450","18188532786068662817","12108520869383312445","6963342678702801942"],["1993852781548318543","1455855117923100317","9231187821974652914","14284590953853754897"],["10682154748448440902","3930657274521953224","13881077521224360823","17441012262617810385"],["12192582270829996244","873622736796772870","8242414616971890435","17650023912570369089"],["13015578245680989198","4075802105375398950","12152582745282528587","4765458224902386491"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["4265805555270047212","6125041032024840038","4373623448540091382","1371441236635174933"],["8615100368285214417","6329080801667665671","895039058169015507","10993566774840086955"],["9545594074684897403","16850906141113972201","3473657206387388056","15684201886066733437"],["2992380118735380278","1475355886631265314","4939504329128339949","5758132621725989744"],["15399550019749727520","1660206259537358883","8300333981387739707","15399209255825077193"],["5351939276099723389","16226458823967424981","3696730839225190871","1300521717290973213"],["1500120827855709648","9892852264758809442","1338772293959593938","17895489152308566671"],["14287067692757616316","2809332852707677775","14262796415959896624","9492970155937796118"],["16444768520163882182","7145228744771856956","6352383355653165282","1280070341457133653"],["755934898098847330","15298372326245065934","6884606167579002525","12433375681116191194"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["947333160083923374","4829969434556733110","10548163113260478970","15662828630048680194"],["9187112270497928319","2878969958449415150","14825211873923882735","10126988943706334972"],["1443955660517065737","3647471779707257367","9092190424728432966","10561808916004994974"],["12450274807448186898","12661380249740907163","107893417288390598","12705412943928472045"],["7715997086116176697","9111126301618745487","9455830952172940097","2185021561114168486"],["1504014713991806654","3737528057579196876","950041577455796953","2429494031819621706"],["6472485746389468499","14294002611933326051","15827728715022957789","11593442203795794496"],["14861239825263656490","17128700385452254828","2934653703204643758","2137712595717826440"],["8665387315276612105","10747686460187313565","13983438970175552607","2613560329283830147"],["13015578245680989198","4075802105375398950","12152582745282528587","4765458224902386491"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["356799716976392300","6993717628002011014","8385206467598723458","16314859653137436244"],["8813996025152205760","875993161787098903","607828486479945758","4108999554333932536"],["16068227708057005216","6562972235466034117","7571829691746747212","934469761944006731"],["9890454849746594121","11805573819196061371","8440713131920045860","9270519407500222504"],["9062571923819012289","10655686394612204363","9769458207660510973","12652117944950405956"],["14793948254553215026","2489355236240944060","1248822915442893980","1949614998761997465"],["9391801856926105853","5796726045211933085","15190454472118968522","11021858979078835264"],["3038293290955577255","3034743278206997064","5393810564165432015","656084848173517842"],["11812676411493462014","17039807632068166217","8164869013477536462","2313514595000137502"],["16123744330884047013","12056009038232566922","9430507918353971679","17344422920729952248"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["15372312295421598142","8526232274781342520","14057996817934909177","11496559091734985248"],["12166035013489356951","14835472324485043132","10609690399451854407","4427454884040091891"],["10438757079895391776","5786387425549311435","13075873450112914653","15343583549563067382"],["10471643740703217329","14591234817443166503","12747792383943744925","15994996897799290090"],["7370448916514875588","5982628133727376991","13510558848026572815","8644546101764075075"],["10319382022180989568","8779806191769649452","2674948958107869898","12790484470793203186"],["10769882474469744521","7361108937373750199","10837342775773169511","202364461667438298"],["14153205205266295749","14860198560060922427","3755334453430768004","3594151850801696964"],["13179945332658772260","10392988191852727767","7649143899278566094","5884606645797712708"],["17721356696757934924","9103485153463776199","14886503822877956273","2378811202723382535"],["5382973278196389908","7546555799259657407","16930333613617916154","3916791196940373758"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["8765651909727696527","4524709892672404647","16506727573129016920","1873294687747090406"],["9746821486247499002","9271411191762921592","828827509409626723","16743017713646432708"],["7435350857853354341","906354700269599369","4566734925863335047","16564238388609493000"],["6557644352664477680","5111607947531908695","4179535683267545196","199382184221256749"],["11587450700949306345","418446193242603957","967103235232018053","4472315040502392729"],["3153644746917790328","3322008356555221461","13852169724972226521","11903868335864167218"],["16772223281767740222","185397598285615290","13360568238985736463","15046354544088873531"],["16103466794276725546","15235367070130429755","8049724670917511257","13291494793698849724"],["11766741779964776617","14656171999374209416","14087440937350330515","1959854422507996108"],["755934898098847330","15298372326245065934","6884606167579002525","12433375681116191194"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["7326398269101666794","8709403860349674986","4183061790168232492","12600907912579509425"],["16846190786878389775","11090732443532025921","3422882331398098886","11049733139886281066"],["4852696137358747723","13955058352187210025","1488156901647913531","2408390808967782917"],["2422283987146081951","8577395630020579367","17284655811767357775","716458134462840195"],["2885754475051231087","15605592165017101361","12093779528202125557","6306960110261410914"],["7046888609274480867","15082851499092060085","6860845187497634319","4069070947237104347"],["4578413013166954586","6640775300626966451","1777053273543737726","16780860711956850167"],["11903577240590591529","10015800570358496730","16845021912783707326","2242084719970292761"],["16444768520163882182","7145228744771856956","6352383355653165282","1280070341457133653"],["755934898098847330","15298372326245065934","6884606167579002525","12433375681116191194"],["232192838438688282","16500481086699310896","11054830848830547193","11960925981921443633"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]],[["565919707020693113","2108704312233044986","3176583667609312992","5221364642683215321"],["10914240261797038034","10633249192999189547","11372887897546210831","17950913130509267446"],["6457668961992586852","1842074317247133239","329929015832144173","16000026325173288412"],["17637849347286345404","11645504671364043226","6555464365818893780","5559084201852474400"],["9098137421922680098","8520517921387795494","10174895103171909009","13513269060054020333"],["48486662166585269","12755843209975334339","14013544976156011065","15923069165666027486"],["9465397294269924683","15163861921910844142","9908628274321063072","14217767496979917729"],["12693692630829384710","13211270583644982826","1204656623203752830","14468658605477802017"],["15575356400337523918","1183158634169649821","2458029177102488687","6695957913164094945"],["2349589125719101486","5917272648359127905","11323746515753976377","14683344344377489915"],["17781556025800682","12234519840231884526","9757684925879834720","7459380630897102780"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["15488485292766227213","13829222221698955232","8261891212173499749","4237964220625002154"],["18282549616542877502","555005515514688749","529493445249177741","936055838911587393"],["2083916340046951554","18238151064593855061","6759838016033689749","13221963027007914077"],["9772642286212169756","17761931296293640670","9114476820643061178","185047771480284088"],["8827126401744464801","15514630817648046537","7432330614516778787","13925031567304765615"],["18069515718615364287","7919336308999151295","11730412304025475249","15245251047418146013"],["13499526236274331393","6765712463483214488","7637611444701926856","988902652745098208"],["8848479736723711399","15457461951249852571","8469079521075493707","14338333894500504495"],["11812676411493462014","17039807632068166217","8164869013477536462","2313514595000137502"],["16123744330884047013","12056009038232566922","9430507918353971679","17344422920729952248"],["6487610226021749034","16221653072059253359","18446264880324335934","11250512008118007070"],["8506034392306072576","3614901136712266070","10008004247304137643","8190316171027720929"]],[["2739033677568265400","15241979329305055259","14171844473919294657","10211745139507351723"],["16101340424988436135","10522782616059607250","8093554442626008092","10027023388294514500"],["3940365726603923059","14970378633853975263","16881528598291849329","71965250507590842"],["9970012125218607163","6849053407334626098","8456130370721662643","6730315371127420114"],["7383789829828070395","18183655700315072944","17993781526432656750","17426406026643457475"],["8768550155855722488","1954360814626899684","4192570833170625161","14702123756431229755"],["14902207681698054285","5236494373516864466","4955161700230225821","2083280555670950552"],["16025274714003363656","14204034402820035533","11984764418539583178","6465466598825325872"],["13368157347959559442","5711429586482592282","17067306439269782508","17487130895961110198"],["17721356696757934924","9103485153463776199","14886503822877956273","2378811202723382535"],["5382973278196389908","7546555799259657407","16930333613617916154","3916791196940373758"],["1102771619252676903","15510088243154297038","10074060746595159381","8003646492123523118"]]],"s3_root":["2537470019722847596","485639876038530203","13994098067056491175","9819674357549636758"],"s3_vals":[["2874182095822874582","15910689005630076044","6874322862528831278","10217589798292196422","15240327130026242143","2060565259303285870","14569408304463571781","711879020333044372","6527959934666378999","14829290290000455794","5044913965726999704","9894436024326674612","3683695152867477564","300329196013029641","6244664630636599108","389078178787183976","7803736930055022365","18194366704430928991","554089923096366500","971957552026882775","1687212240992359151","15481378186424115577","7806290636191165484","10020293728751132076"],["17683016907568167579","6622462717583030928","465630604808029309","16202482991415558973","12111248450216302690","1192402778979722030","15919605344505161182","7937208143205885716","7991376540817657248","102923544917721774","12328743179136487661","9255726446032968411","4808563770463440054","5358939496772285212","12498718989537994784","16183301820507426168","7895627871022003386","6688512137294715427","9439241527498065871","10754589526685137318","7264971563280435197","12930014412725993176","8445717870342789989","950527059302925935"],["1102312794027423374","10742337244494193744","4733471705512350987","6656996553988528393","4802952873915104571","14018841121344361745","15977685688357276170","14001348032045862747","2522270436350827023","14290835706503363526","15227407747229416138","14860009794015695189","18407963288710711802","13934632411237751838","8513313513636012425","6856051072312193201","14661995202203257777","17402728552325456916","13468732258747737279","8599599443904486347","4842004324494127046","6947476205039473977","5042830071434171661","11935446739806745786"],["16259031497227959816","13182172708076547983","13307985177686929250","7884326656776733898","5484706010674598696","16477428265711558547","11005504035172352231","5854559903562063512","16715717932755505759","13970209569867043856","10187409914702260034","16791578503578367771","17886370037185432405","14380223430139550485","9480001237250285257","17033515208401116507","16143772395983119750","18074830560715701111","10629463605449616083","18238051381288283786","8714702004334359098","6678464843257664424","2844813360096096087","174455210770805627"],["17601500616618216600","10771081353311022514","16229074439506904349","1117896421749819108","18259718698189893861","8631801643764038222","7378650550737540869","11564597620518017182","8069237557312035782","1524022985330470908","18162237872073948284","502707840417726675","5187496712732573798","4903302090010420064","2561731180961121339","10445120966886353112","6239793761490337007","17677779913339614624","5870078132796201497","5119918576083582618","15607554868324530663","1810721604596841237","17674021136985434678","16426821043344107628"],["1804023009681503037","16917956235533761397","3237886695399693779","3340829796879951174","11642671295691914865","5536683647040966299","6897208687559398777","8460541818926901727","9836143621878049471","18438357438251599035","3604210107130871244","7731364200162172304","7019587936353276481","13541244332503303139","3244985280881403212","17085056214538616870","3317850878818873916","3154214241944155134","16246215230103950512","15231139883246298145","9076974959579394176","6458866238533871374","7551425336185223564","189572223897540919"],["18144356155507112668","6255961409964710145","1121598082537621874","13305809054817517351","15071619894272013520","7810070584838859072","17676450292850812256","9980871135965163142","2921651014276311118","5729614167107255499","14230673890905892221","16244176726452480184","16338813184855762456","7809637934642122094","16167278336884810941","10534025896685217696","8533444251760067290","3742733203284327834","7169456846585768679","6503066724125277831","6924230244710033338","13267959566440366880","5904602736441911480","11135873070041959727"],["5573456302309435984","6213850422089068937","7346792252821002938","18323965718622216193","14606087995985235952","192403119921172505","499517872303506727","17432538079804058054","6410040618596288394","4447632164950148536","8196209941946907663","14479866164492392758","4148816214478578334","12003920110644042512","14017899862233519356","1458699108810063506","14477117748335701501","6202618432301326970","3712533486082206348","1124648996992952017","17578317015688260170","8024051027899592024","16488413182707141987","3772823270930121409"],["3523411026264756902","6069684839793965249","15275780840591486763","9961848918610557046","15323554099654938335","9223690642139515284","14718765610043784323","14239025043508830047","5964184698814651086","5104206744627649060","960659775910615343","10720640785953531364","18354779732091439252","158405271324842739","9825909557903624660","1915944596055655820","1311776006469961872","4504623348245386025","12818399226402059923","12061098603878181473","15479170064437110516","3279122594811479277","9056413660445784651","7613243550241724178"],["7863963744166329692","12981964927937870553","3627283895527190739","11336825492993771050","11444053335485157167","17611436039463179910","8727579827024276333","15766206520225838743","5586008298244971575","14254654477481215529","3279882424216189023","166880500331418315","1141621441653717720","8663865931855447258","11033514550027293682","1601845432319435818","17412786842189542205","4287804077352259075","1153832034768961830","17492817614066010532","5256261844991564386","14802702988487180395","13667255953944114405","17404797865710612054"],["11437522673376549421","657409725301166861","15633377526200022837","14393522986146399735","12219200233883560777","13864140298954774643","16947606169750674408","5845113614795016750","8364618750998335052","14642990028483291676","4166228167473955248","11687310305628993037","6032001550012883756","12531900023576152978","16786089606281062833","440934089029228457","6547227232073112739","14502754586404994106","11356693339360041304","8163496609047590528","11512992420029611559","17525170946036609116","1288596537100635154","7798406718367283513"],["16308056778057298894","12529836606748524496","12824692969635394801","8681298167147053182","364771538379558704","15550644053814249639","13628776620427577727","7495157440419420542","10113632094025417128","914821304336624195","13079947039776407403","6566923749215563164","6017864295546814385","9874883630445619605","1972715026377381005","16337964193056870350","1875482458683434695","3301847931313543042","6317275057035505054","5356191118293038076","3517582022014463540","4801007172481142601","10938860891862885097","17280454434076179887"],["17258147201952610185","1682191997373950927","15278780033508049911","13693025610154422353","8743360324845369554","17162887086785923078","17871349755949243658","15033429112630420300","10395972531297196168","10201186764702974793","8954689958460712609","5021893810823901230","15418736000970208465","12282380174237734024","13616461359971646703","5914700252628796399","14969727580600729841","8038467616885878413","8276276180867417572","8106499561093812672","9377022812137074961","16837244605312029848","12767183697884912939","9749082751172170553"],["13479418568412055292","2492669199244211466","15639321345187595617","8163776051429972285","4728959342222899161","7405085150022393197","29124197202628009","12815160607001462408","9249774678512583621","8154961258051148001","5014511663695897872","12726847340568238217","13160060868580046382","14458228711558526188","8832219381408506160","6373032645121705884","4413482670146006009","4199153063181816619","3977390954529188148","8652791043106268736","9586921504661008591","16246776216958593016","6443659014410323803","9387488326510788100"],["2507680358073946722","11830066708417300877","4821714304941214555","12467340943619827285","6020380249593454060","11863732925281692097","18077865600541328969","10274308576091273168","18208266071686830246","4077052583180494098","13841856437119538377","1795175787566572685","12158468055759405018","7633747062933853819","13670940858471200255","830885069091460763","13627612848243656192","7807596622490822189","12102888618241822710","11736890420983618399","12367053679382212336","15086781784461140026","7106015111353833360","4897165677951939221"],["11970067645470702222","15448686154520182842","3070787347743977342","9958464013332276845","117264225791623944","2879694229888720387","8275120708283922025","5512714242743005786","18436522142490760682","13288201962188164504","775803639355321472","14776733723034103424","1722731095209186938","17174790812282551835","2515313104438587274","17476227027687915893","8854105087516040752","9133489681532809834","14710285514749640064","4275968236117970452","14653381263213137256","252404364020247039","15144415696612213395","3875047581138257532"],["12863685822840851528","12147018230662047846","8655097923407251702","12044474633247238002","17927921114259504026","8979376406954246058","7891505415545390313","11079082043103882210","10732523112890953461","10705990296695825021","11230505158663153506","16454177901943892459","8175147173836647598","6241749801565210124","14563905802361354249","11619408067988019520","17840751320583335421","4245149627019689328","15479518615026704440","1683450826982266087","6526259955669235905","16213076057000552625","12967740905149292288","14436410391039391489"],["14375198657826106613","8181676202412355889","11086151696691800917","6252546362875976065","17349352187370425002","6015335068296659915","4903314518163262819","14680913792697202905","8534410444030286840","1274652175128749178","6158177999214304162","4806641814258290575","4482511552555573884","671760813670873173","8200160827596117786","10704267219840758007","17373784530406360834","7283053320498347620","11509673236711776788","16421576199582396080","6492466163842084278","16567077007769904131","14006271401100088327","11786615549808862723"],["7124553542833873044","4159414357470735571","17276909774306149036","9094368421554393446","6569100385247353534","15798906274700268563","15000171994904546652","5741753570418684776","5411247334488656929","16882347596685825411","14167655266456948852","5202277720939743407","8954492160635772900","796211770164320317","9325446044901951293","12878037914349376136","13722309295474058117","11457143166542490377","1044418290171819072","7230993419447610611","10145299556314326068","7624288098059198627","7074475933642787741","18158921724937147454"],["313570970065105578","873088737993437494","9051460517321820657","13760346341437387457","5438353124006102116","8453729962315334977","13086109549318935429","12020961218361443233","8882715206467694626","14744643110101814611","2779114443000761386","7369519784003813952","5530696901296000858","10445560888698416689","14990891082946476767","7644905581434215634","1632109838270490368","2805884527857624356","4710183903545151526","14133512246343859135","16696274042920063779","7121915911357233787","1797181041182860718","10382829684000080439"],["672162584350453786","16808991588945678610","11892925329911186980","3500157407117237308","13029178297477265062","5637153753648567197","3631349669116982504","16769880175772123515","11114815090517735459","17897746596046158889","740145038207603423","2964294529352893973","3294112074650150184","770848905218702753","2888656954307787918","18357085956393439641","8651004652285487321","2778072068203093689","4561690067172290282","4557962631931270707","17987219957501089965","11396338891806439262","1074219417999374859","14795518860696780787"],["8844656999752491297","13264949976389271305","13996585153032003261","5007818974098719337","15341850492829626084","603798037333804330","3811832577656937602","1297806310044903899","5364384629078307520","4218976842615012454","4804427003511487851","6090421782457912985","5430888022922847795","13748677405292653636","9829621616325513764","16810848393507085144","11137898336937159633","11355621808451420955","18387470272089401861","14154209981862982911","3304063296469275930","15319126622001869733","2439090930937620000","13218306301012069677"],["285793445277084199","17826224940565416969","12825401836752166591","18433063994796918222","1735627959474461980","16103025679373655062","16365748101207848443","13232771652021083330","10513904689905700875","11587575254768545901","1287348655149935288","6410570443566877166","11552177126562569996","9262540553578746141","14708519959235984080","7451005717768445763","16934001457837363677","6878614303012745743","6217829634878345997","14451346807124623891","4854961241891226197","4777677623020291836","16509805265469807708","1321648522464261478"],["8384285164914786111","16904762031721349954","2875084134839938714","14371941373350351034","17342529160157824807","13337996963337408913","5073030631852206087","3148817814159886758","7744610813292095269","10850013551227333238","13808335488147035602","11897872784502281728","7098350611305229729","15942610941906315591","5451041361662363653","2765971132548800600","18017401381582243278","16651692365174406807","11781192528076671493","7580392981670030385","8860481407143894977","16551768352858144408","1825185697286710632","12679092084310746988"],["8470741688360468751","8779433633754814104","1985373153883144666","8006431612297339055","5378163302107374898","13490106337473852260","16455290998287873754","9365944803189366504","18323509659716426040","16935060996313700372","16518953163314867444","2526432823190311259","18009565908019592543","6591590724716189124","17057024971307170655","14594798210219250060","5162135417828338107","9456058556235369431","748867177448816118","4911543237920769571","827836040052654561","4210810605708585036","5791613154570013290","9566868134452204358"],["5987269565978210410","13846392148439632193","7275489118364927783","10024331899072932350","13526532744844699782","8150552714679323373","9082210142070123728","16317898544458728554","10236095158816861075","10738054456408975372","11370627269610075275","16611727986276864056","10724147438991039142","9969212264525924187","9107445309848996877","5203828810360496704","8142883027883024871","8546284908117036753","15296150364419730844","2467854834731769039","14722834189551388659","13541942557901327450","4719290848606946664","10675338652333845551"],["15592067315206738813","4235667619776830433","605942128751259120","809986943046127847","12902605586425129491","7294722440596443665","8961608795389508717","11636887799878341401","6971303445941488008","5661002143605549622","4632365248679428653","8366539638195476259","6250996045965156755","15760929937191256983","5493696054223891875","13329342804971832465","1362494612441784928","6287720191885193848","9117498316169848842","7390456923561146360","10966923216206725789","10850780240900710515","8012312612212646925","14346899115181063212"],["7148932844972931810","17628940360900025964","14125552027125923905","8454558977259462095","10219255436763174538","1331596436244988214","2700026398920692831","8081850089269503141","299351850727924367","16698251773561205694","6826536181018568323","966682013300067755","4236610444081553963","11821131714455058331","7295098985069349285","2400058348418589942","14428781358050854417","14723748124783944974","5485571232721813941","4174388823100177448","2787683006128995634","2525122385115090998","7674116373015294448","7310898266070039551"],["6930373828634535448","8597875268315259649","13642170622562700078","5987429424981535980","1632644560781383228","9861926358195707451","14738921318563540020","11250784534336062632","9438588077689558395","10969265318082365217","6377517082442886379","17459073388520689516","1253669994184794068","16206634200819210486","13951751403877413039","14337009302236531962","5084720678066957046","11933049540113045688","13240425906605545443","17309192453785152781","583719752674010728","62642269446144489","10279392972343969595","12142315130301071835"],["11401222976215986914","10189471616484828654","7991715409040531417","3135929228463011322","8457279475976668314","10227943266150907066","16659256522603555795","17763307686947098260","954929546940888438","2762831878747720194","3995711474792683176","9539312433738453826","7707101290263713789","4882574432007391106","15965085550913005621","10076901487932663263","17882480751245747353","5012268042841957642","14333501796877812949","7484937653217411390","3964679064546164550","5586650047618201840","8264950038384745716","1322513472052134111"],["4918818798963047111","16438222397461888485","13555354475798710435","15114130549087536573","7137617675855216669","1319302529270433754","4068689595640009261","1877060954851153980","4998838764222937246","8567405831777141927","8260505468910175707","1122720779928700439","10332432989557937135","14360604779411826921","13498318228939658603","17971086430595444446","10706234775108769146","13374300341498789135","11727892250827087415","18416214160924136588","17065959536574225026","698112719055191938","18012117763836365787","6045519269339801453"],["379678736230930952","8212760684378193826","5291850359752938818","12479772490819189439","13662357257730648144","18125706027975800917","1050475082509490434","7516576460743092053","18011204613298078072","7751790157117143942","4051307280473102712","10739230541190018401","10411864537726123089","15242452631801280153","16956290928616191045","11135884549898109855","4081628712271134247","7405619024819158513","7528225575929760430","11432116343829490541","18306999069687050817","8313146146147166273","5888371802589096231","9263891348554185808"],["15964596492934608150","11374274271922099221","8114811720449055859","6785213053600903606","17185083828544919835","9969372739035923940","2179113902208967612","5072055091741947230","6956151493069820848","1172686943985979844","8936475205816491640","2549969848627530077","13411828037654698687","11676264250268360896","18186688125357081168","7125192078221405594","12106840290011533150","13624706125179482106","4351871172616753488","12733122883976324847","3667461341501378305","16452921903593204895","13363183259197252018","15992708145481145540"],["5217891478866032601","11775985335391749044","4136540274651836671","3644241632548102301","13601899236504930557","3650390290619686190","2827986507434159837","3933846705402557715","6140169377360096780","9341064980030908400","8444347458213056836","13595303674652843896","18039349697253593838","8568436079631724846","7696122440084031633","8443134159866472351","12144450228278201690","3623052673805306586","14419168805497622696","2758676410250134035","11930721631905649220","1012178775014820516","12967253426851688371","17342767160204659983"],["1442321492744884893","2914334500547844259","8647278935515758902","16978332072685549474","11262472989068676257","14723190975785725236","17065720513647863189","8345469316563822887","2608267661226837941","1779081298250621802","18030678054435426259","3595728204457768631","9280189832547984365","9099808161319358850","13359623727032850705","12985727848946864703","7303962914933076416","4908286082952472105","13631741697372355820","14498731113740294434","11505772644322184260","2620316167701726423","13593199334324981638","506871845377478037"],["7987368909768818763","7488105245659892043","12347903382978497674","14705939367998618066","13268013296458581150","11017382411811437813","16362971928069481172","8933003788645474697","14162237077057425090","2120913608148204308","12040479855204069930","17979335419739716393","1918637339852997446","4865399560861017589","2987436116237726471","10491475183207022260","15625803366367471948","2853327169341852883","7009099252568905960","14181531981822641346","2089256329282161725","3810593410092753478","11536776403590794554","3760651022094412351"],["15538819549500605746","9986681802167494456","12727100547213064669","4314223131331324089","13717732346891993622","9574717351947900705","6279839668814756837","10540482320083148957","7764051062425899842","3224399794071792615","11397111325278307858","4936338347329540036","9081115973579603697","10300820749703547717","6877950202926945142","15395863727078744395","8280470926121944348","8165140205923023783","16359558448217759182","3385971495824092792","15946995753964685916","10042374091248489967","1235586707967390756","14711862116560986482"],["275397029556084628","9790485970284962846","15079257716534265015","2312165112489583027","5329165085205764988","18443601428514616875","16016862010893986163","7993121501349358803","13908944836820762515","6936048510028562941","13895182958789952399","17368631196268098786","14258227009710782453","10029339502391946981","3740094067103480727","8044829596416831482","15351982174529168573","10460536780407280970","10302001713535084936","8759857082261309133","12715777031270097002","17096089965208018278","10713926230521489208","1023973796341164719"],["9110104351513116403","7666145856709323942","16012946304363034849","8438168613368101701","3636764861783153516","15062880509196292507","8773404290161307680","5007971696507905400","15352717890808018141","16682783476086180249","14932470875342517859","15614067285204750487","10991037546019087126","6904453603296595755","3364320233550271468","14829614189494803706","12716141597660115992","1363164346162960225","8989772792258330097","4516253266042416100","7603762488008528509","14575955097334516402","7455711611766927704","15066073561213903730"],["13716287615713939727","8680493342047196075","9685346969964484316","8893132575646699172","15144732911902557788","3133972880106046307","2868704400238821271","18435106857926115465","1859697545922485029","13644639803605832122","6516985296421191839","6163496419116737295","17915392238453887060","16338097963977375795","3919541958883064991","5388124901879230841","10218859219402054795","9457202272206018767","6706466607199312344","5367391193191682945","18216567964310459718","13763911576326629649","1923763081054317913","10109666423567509272"],["3644149015432136203","866689974224127322","11466768372473213077","14688007547072982851","17827548727096559154","4376617858595857580","12221347069973049763","8714929842870979169","15716738515445103167","18061708771490787861","15351787576461706113","3912975890207376348","8636472881441144286","9079785822588975704","6618635794293848623","10554594831572058756","11626694309530060568","15133386396572710965","18259139930068829153","5608336531991217963","14609111853390547436","7297840861546382965","8258681732180858526","414676151246525751"],["15090386441150177437","6887277578373630205","9089741426790258450","3805450745828627070","4494934480124288229","4270957177499067753","5090663849330742973","10743233425867614703","11596087012345693061","228520050622579231","10608918641390497904","16049290885464829033","10111438243353506463","10807201165712787569","6284168499349576115","7555448408897569696","11264550569442408883","18337586503452483050","10438311622083611742","2586059177950927516","1780998595789105668","15020845574185048845","2108250238938303306","1717789759760376164"],["11442279405046419695","14471478434960697199","12837859297944718514","16254598147731152072","3946659350798593212","5175883753802544187","6963008774542477256","7366474478320805572","1971447821284382405","15604264132055260529","9508414102803497616","10139211533588481096","16206533006853118982","12336609633525285795","15776723337577162892","5641880604627283815","1563447903054819045","14882653301467311920","12101771196970307708","4300605815110573454","11889558064628300628","11476427187170562715","2492361473529663062","9262258644321601476"]],"s3_siblings":[[["1049345441620636519","4989255594004318528","6269580596663586522","17701136875446948617"],["17395952209211179271","15466609923967024206","1742406871689494385","10466842689367489251"],["17502732799868157912","6976216028029069652","8676590986451372559","15508034570156946985"],["10627627721089397360","1234202383546001215","8424055031188047895","13761762753876300898"],["2620780334046185783","10745884377628218662","15993666020797313924","1622222823912283672"],["10553492194627237303","3097643534658999412","15519213474526101230","10823142671150562551"],["8984429030249861074","16731345238584530425","13390335007384492100","14019708557967429191"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["17801079187931136901","2957964003021428810","595516349369999112","18340489211329108707"],["4731235550526300074","3377620000273313350","6071788344748141893","14721612244239759031"],["17495379155694678282","725005613232854045","5106499845644372118","7322066894961942066"],["9022415201904502159","5341711896360217136","16413150077786448096","17340400271861976210"],["1477470105231653304","8395321194455995432","18130260991105266543","2176544615710400161"],["1226858434437728713","9306196872529870396","3120957780166986789","9521845353279574312"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["12653355942767483161","17980849084099194751","15455811876727683075","2437220151289393848"],["4629090899315780764","1114097027957004875","873173724508855524","3007972165353901172"],["12333889571563594572","1664846551863723925","10416168578487431518","1024203323027339516"],["14030990132397111567","16652635823188863181","14206349584316433945","12684510209158538145"],["6938063776575470321","703540091859698474","4537179298810650877","16051936836959742733"],["55926376386813358","17755355994707645924","10412488231485783985","10691639154523130734"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["13333689874007900401","5260312828545743899","13545023153810992229","1048719993863832139"],["914982702880482757","2265244613803632792","8316257911235051727","11206922791612898454"],["7123912863994268398","1378661001396852765","14522625034514836044","4548613257691302025"],["11712250247570480252","8283177183302806036","15168651678765202906","2513237110498286311"],["2620780334046185783","10745884377628218662","15993666020797313924","1622222823912283672"],["10553492194627237303","3097643534658999412","15519213474526101230","10823142671150562551"],["8984429030249861074","16731345238584530425","13390335007384492100","14019708557967429191"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["523818937694365530","9807629473913608799","17182111471840995122","9210830046445849079"],["4023082651549001416","105533468124074642","1337103828018738738","8950994880640741336"],["17844524381237157401","13514820238108417670","12571305409983558115","2079323673174395650"],["3622373636705114911","2863021731784816561","939288751576459747","5594251732674770862"],["1477470105231653304","8395321194455995432","18130260991105266543","2176544615710400161"],["1226858434437728713","9306196872529870396","3120957780166986789","9521845353279574312"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["3541976492865876979","6572359974932992323","6039207400661209113","4646014410486026048"],["2017872854979986574","10408278782559563612","13749142358702969628","4920924782146472993"],["1743847619508589423","5616247461427954871","412663625302451657","17585855026693596227"],["5924324442146084228","16596656500933944924","5609391366014477194","10451791377000053743"],["1160745514668331803","11993856777672315269","10549243883800328013","2421407300056115906"],["14450326133145246899","4857618368237712084","16845482580667230693","15325428896095229677"],["5779568167051664675","4874601835633059950","5656528451605856047","11749035689886585925"],["16088904398632380334","61466950758405153","12100325506002292008","2476727884730473428"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["3980388832268020648","5114720171491686511","4675342660157070834","9495791349861625469"],["2532053585329114824","9726553738703298062","16003616469320303483","12996303468887713131"],["17795595663136127604","14775892927544019122","4812959122848079774","230217655780407207"],["5280267112520573677","7858243377547922941","57509300994065853","2475640149133851692"],["1160745514668331803","11993856777672315269","10549243883800328013","2421407300056115906"],["14450326133145246899","4857618368237712084","16845482580667230693","15325428896095229677"],["5779568167051664675","4874601835633059950","5656528451605856047","11749035689886585925"],["16088904398632380334","61466950758405153","12100325506002292008","2476727884730473428"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["11023403231838342827","1914585986757363914","17244211434190991455","12385775115441321284"],["4023082651549001416","105533468124074642","1337103828018738738","8950994880640741336"],["17844524381237157401","13514820238108417670","12571305409983558115","2079323673174395650"],["3622373636705114911","2863021731784816561","939288751576459747","5594251732674770862"],["1477470105231653304","8395321194455995432","18130260991105266543","2176544615710400161"],["1226858434437728713","9306196872529870396","3120957780166986789","9521845353279574312"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["4841378926550972664","16996551345677274310","10441818204662448599","17648376015810867552"],["8052102744858722170","8940717840820575025","18276483338974988995","7677014979590864120"],["6860231914143937669","18391528418979308866","10019939735902762047","9742908480221679107"],["9364822843058305198","1655490723366656052","2893722988252810998","3708471586771082463"],["11565640554409701719","2655744944352175796","3516634270935038134","16075481978102220521"],["6133434917048762611","9803623668417132470","7543936724188401489","8973377049536474340"],["17926022620858385032","10236415542604937189","1906353205416910531","5440748676451922489"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["3311236226627182289","5723539851556787428","15753734567914857447","9169033526338414905"],["9218821125499102884","2492283571447867443","3446641552800581712","3561489841425435109"],["6278046148291302989","8000576923681449643","1874687818595646850","6480753758867935801"],["1927503481436784440","1297825012534344281","1942486056769301662","3797118081423265971"],["11160628927176621544","8154891361700914602","15426425763779418757","8046647440224659016"],["9359864703807519418","11964846955880182243","13749227240442994997","12068859076953312512"],["3883517194037620050","5188512669193856649","8424334866755382662","13976410295726924790"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["8846496620824462854","6439270890939324422","13637471733506446285","11763273563936088568"],["2526776064024024745","7959868817887907623","1206990809684820253","8106079868220946541"],["5829945534356022895","17038154384287693227","8729310036265669228","10154241718343633972"],["2431295674663277034","622006865740097331","13953833011280393144","17070062577960203158"],["14593422610171542845","8640316404363903469","15234805962751697949","5002964809039497105"],["6133434917048762611","9803623668417132470","7543936724188401489","8973377049536474340"],["17926022620858385032","10236415542604937189","1906353205416910531","5440748676451922489"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["11705178508798102959","6131392348755586294","14706305930450352549","7134222168307848459"],["13193642901209358828","8539700508430120936","14200689708750521062","12846922065548341873"],["16370068124921502511","16801744935392279586","9386859301366440841","15238263386453261964"],["12588889715675621152","11206434834758894390","18113858282385599399","14100493889734960163"],["7352695900161535412","6882348633597778737","12757626764315055678","18124505660903950931"],["13478024577224580899","9880692040415414413","7876836660320703084","10869771436654155425"],["3883517194037620050","5188512669193856649","8424334866755382662","13976410295726924790"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["17189528600947368300","8673589102895071981","5024524897090045870","14031445671346942578"],["5063785505436544360","11880423911409401379","2468951236662665167","8862057149745457452"],["37424170391238252","1824528822485084858","10977086474166376119","14483192122295975832"],["9364822843058305198","1655490723366656052","2893722988252810998","3708471586771082463"],["11565640554409701719","2655744944352175796","3516634270935038134","16075481978102220521"],["6133434917048762611","9803623668417132470","7543936724188401489","8973377049536474340"],["17926022620858385032","10236415542604937189","1906353205416910531","5440748676451922489"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["16778002441128551271","13709802447531614578","10307391379592589781","4556997421984626754"],["4420655625956192385","3861927745757968630","17182636494624043991","8584441989581733369"],["12300690296100581016","7178884335538779357","4979875644279081843","1325767015028945770"],["7126214074493473009","17644824359220978237","6503938705552813754","8003100427232349976"],["9046873588772825616","883047410375279896","16295305160265708299","11217012429158775450"],["13478024577224580899","9880692040415414413","7876836660320703084","10869771436654155425"],["3883517194037620050","5188512669193856649","8424334866755382662","13976410295726924790"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["10510036708598656465","4836134686764183562","10129503593560833324","11225023125691177099"],["6301377881232683685","3840627052089490837","1595451580333546471","15171214528490966205"],["4158460519183464079","15458255134055308355","3958950312041480332","7333589184103027808"],["12207467721371901683","4440136241074355781","6422009008802046700","5199253536711888041"],["923106387418448623","1598818711975753158","16185036301229211219","10776733567831430411"],["216974546475324322","12678994477426705499","5153183165651660565","5455980308956719423"],["12607583510294633460","14354964581526100265","13047964893835743767","1043198420304673579"],["17230643662632263054","11704759970825601192","3572654472032335139","4299029944155680835"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["2329764739840290843","10977445592932199673","13570303804772882879","12827484209877908907"],["11935809283093946254","12232367335973853316","10056607787028784363","6437474827440759257"],["1327480997290393945","3892881954305815881","17988574148495533485","10931087425121986834"],["6743815179032644617","6384962078968720763","17195203253078907301","5403851692505799701"],["10852549041924851753","11298823141931113980","2654693426391937442","10804911507475510213"],["10790520221204574242","6689699072110316600","5944346363791612707","4056271912760433638"],["9582759039395058698","9000317158535320973","2501569104465581946","12635108326453460216"],["16088904398632380334","61466950758405153","12100325506002292008","2476727884730473428"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["15279890545874756763","6449046037275299230","15405883318588668051","11401176959046774075"],["13058946590612668314","531087781722694715","8987404869988913683","2807735987010162702"],["17844524381237157401","13514820238108417670","12571305409983558115","2079323673174395650"],["3622373636705114911","2863021731784816561","939288751576459747","5594251732674770862"],["1477470105231653304","8395321194455995432","18130260991105266543","2176544615710400161"],["1226858434437728713","9306196872529870396","3120957780166986789","9521845353279574312"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["16295196467296751817","5244202123710685602","11914933412081788050","6354705018485323870"],["2892527901611026933","17988636613004603759","3212407780437807755","16267408191590196942"],["11841103396222673139","17095400169769693","1104890004998403351","1926193546815932457"],["5307483109481450462","1790055032474886212","10826713642464266277","12957751533516900882"],["4309180561819338305","16461786042467709416","12247519216004369987","14395300531764092588"],["2822807706068159469","12737409183365154155","14377952634661129667","3893049700195494383"],["9582759039395058698","9000317158535320973","2501569104465581946","12635108326453460216"],["16088904398632380334","61466950758405153","12100325506002292008","2476727884730473428"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["18100111118030901028","4656100929159555653","6354533187890953217","7892302172983854636"],["13058946590612668314","531087781722694715","8987404869988913683","2807735987010162702"],["17844524381237157401","13514820238108417670","12571305409983558115","2079323673174395650"],["3622373636705114911","2863021731784816561","939288751576459747","5594251732674770862"],["1477470105231653304","8395321194455995432","18130260991105266543","2176544615710400161"],["1226858434437728713","9306196872529870396","3120957780166986789","9521845353279574312"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["11396559419168548328","22654130640615768","2873869014366048522","16614052475714324434"],["3785594755524992879","14299960776755873180","2026927352844863535","12538897685752400666"],["1107863278560479803","3129771867804904144","838351747991629128","1137978101129586277"],["10599755807250883947","14574958557039596478","3692825378426751862","17625540014589707482"],["5049124870205860342","15917005828127123350","4802685074018072896","8167217933040240039"],["14450326133145246899","4857618368237712084","16845482580667230693","15325428896095229677"],["5779568167051664675","4874601835633059950","5656528451605856047","11749035689886585925"],["16088904398632380334","61466950758405153","12100325506002292008","2476727884730473428"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["5752470495830237281","3395807553423126460","17379775247753132805","9319195550845291315"],["9787963684787457663","3962641838908155139","13271513349457798562","1616257863546509914"],["17928714200791361551","11069169366496656277","7343120178902277526","4739985686451899712"],["1078226902516588706","2737800138303631863","10202750170902750049","14859854116650248931"],["7352695900161535412","6882348633597778737","12757626764315055678","18124505660903950931"],["13478024577224580899","9880692040415414413","7876836660320703084","10869771436654155425"],["3883517194037620050","5188512669193856649","8424334866755382662","13976410295726924790"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["17316948304192021527","6155847131368610801","8371335705375725391","16888810115001532214"],["17397802587533867234","15490969613192352175","1729189199238826682","9317196626329993212"],["9526764145867883738","3232456195738605846","4170718416611017738","5174885454008149317"],["4501841226674201336","3210850582465911936","485903445379612405","17173246172442928488"],["15247539212160584962","15728992835586431272","15699045838933260279","17691176013194660004"],["8436776540762236825","10806246151281727497","14521662599138820129","10085716289309104515"],["16296184329300374889","1979540021615953254","17526506100353948155","16262528076868601488"],["17230643662632263054","11704759970825601192","3572654472032335139","4299029944155680835"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["16723580491180915178","6316299949041982388","16056903622426871237","15807435712816897637"],["5763698252661473650","18229492244534595605","9494346560684105518","9880544527688812022"],["11020575247266281329","610131839946084010","13265735813225706357","9084013203284042526"],["6651877350273947007","6714744830890756072","18172151265478901480","5036801893243472637"],["4309180561819338305","16461786042467709416","12247519216004369987","14395300531764092588"],["2822807706068159469","12737409183365154155","14377952634661129667","3893049700195494383"],["9582759039395058698","9000317158535320973","2501569104465581946","12635108326453460216"],["16088904398632380334","61466950758405153","12100325506002292008","2476727884730473428"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["8746284210346402978","8306956778795714525","16688129607353242409","16416450565763519467"],["2526776064024024745","7959868817887907623","1206990809684820253","8106079868220946541"],["5829945534356022895","17038154384287693227","8729310036265669228","10154241718343633972"],["2431295674663277034","622006865740097331","13953833011280393144","17070062577960203158"],["14593422610171542845","8640316404363903469","15234805962751697949","5002964809039497105"],["6133434917048762611","9803623668417132470","7543936724188401489","8973377049536474340"],["17926022620858385032","10236415542604937189","1906353205416910531","5440748676451922489"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["18206551940193022629","11090699740824822278","5482987258897225392","6118466681168228509"],["12565517005707645493","10250965710555887518","1284987073628059275","14490137026737841399"],["3536145864609287159","2654715179095950484","4110764908622117135","4952016099464047575"],["1553358035032842125","15827073913548085202","10035495182107461574","3290942008607332584"],["6346046392321260895","18054384228570240746","9507542922526335500","2023357376937730813"],["55926376386813358","17755355994707645924","10412488231485783985","10691639154523130734"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["1088037139772654855","7242612218896947860","12796732771718521841","12404610740450458942"],["10666424346961589497","14127023174660172992","8189588956210041282","4038667639925124976"],["6278046148291302989","8000576923681449643","1874687818595646850","6480753758867935801"],["1927503481436784440","1297825012534344281","1942486056769301662","3797118081423265971"],["11160628927176621544","8154891361700914602","15426425763779418757","8046647440224659016"],["9359864703807519418","11964846955880182243","13749227240442994997","12068859076953312512"],["3883517194037620050","5188512669193856649","8424334866755382662","13976410295726924790"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["7632870414563800033","15719140263511099714","15580848262862718138","15101424171344777887"],["705273773075805576","17283092272921510085","6884832467300891378","14111206122960434212"],["2835760927514965783","12092744779658992597","5308425292039380248","14637433892600129550"],["11712250247570480252","8283177183302806036","15168651678765202906","2513237110498286311"],["2620780334046185783","10745884377628218662","15993666020797313924","1622222823912283672"],["10553492194627237303","3097643534658999412","15519213474526101230","10823142671150562551"],["8984429030249861074","16731345238584530425","13390335007384492100","14019708557967429191"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["546208187695792681","18359382848139097369","10736927041665536454","10154066559727156569"],["3681458958106307164","5994845582430838418","3360387491070429883","9079491436980220590"],["5738962329390220938","14782324986483751937","17245670218994084381","6542424244791119388"],["12255178928048015050","2849775741428311517","5702786378441212998","7069803770548180688"],["2285718595107608567","14608820937132662768","6738372989340145212","16121229615148307821"],["1226858434437728713","9306196872529870396","3120957780166986789","9521845353279574312"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["6779014129946690370","7071295955761414600","8659824312622760607","3596554174619894964"],["17297378500421341495","14570380195242960672","3674659138350280448","12341601362477192167"],["17932525018294311130","3020400537143857621","5354107146299856831","1619995816383178178"],["12033941543955069614","15797874173201600836","12926773016070815996","16934941744104521058"],["5640840367097283236","2008561768023510848","12002348214223270947","6500297783750059016"],["3136727320684205005","15698443107233581667","5061259165671635288","4128698308278889485"],["12607583510294633460","14354964581526100265","13047964893835743767","1043198420304673579"],["17230643662632263054","11704759970825601192","3572654472032335139","4299029944155680835"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["2871126943237424655","7513345258554588692","18218808156592848904","3247900658629799203"],["324088436436582882","1270881059008005879","8064573635839231227","9907236804181486739"],["16370068124921502511","16801744935392279586","9386859301366440841","15238263386453261964"],["12588889715675621152","11206434834758894390","18113858282385599399","14100493889734960163"],["7352695900161535412","6882348633597778737","12757626764315055678","18124505660903950931"],["13478024577224580899","9880692040415414413","7876836660320703084","10869771436654155425"],["3883517194037620050","5188512669193856649","8424334866755382662","13976410295726924790"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["13611475179727080692","8952593858875841899","6139470206154229600","5770999641272045728"],["9523164047694359095","14368879093523375349","8047838599462704381","12467353515762621289"],["2131596578788065453","13357706140375653889","2963768239881547064","17742291992616468712"],["7000728424497088806","7193079953455555101","4834753939009185026","18440460173249950927"],["6293502743418199217","14860371123968052875","7165689249076063902","16468497901260728816"],["7290299262007869859","11946220211794919240","3880581100478272509","15409400877101967476"],["17926022620858385032","10236415542604937189","1906353205416910531","5440748676451922489"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["16080105860701826065","9080163209421436165","7126127477205303151","4996435108145561365"],["1534616787156869714","3278295364239303569","14055781368569047175","557369808927017122"],["12887851270245256964","822931613731410839","7595580585998194546","10197963520595695619"],["5503488298750015958","5356672121520622048","2364473267471669734","16974096372034450102"],["7537178292020400330","8301426230398190661","8430522996918081659","10656764673689125702"],["216974546475324322","12678994477426705499","5153183165651660565","5455980308956719423"],["12607583510294633460","14354964581526100265","13047964893835743767","1043198420304673579"],["17230643662632263054","11704759970825601192","3572654472032335139","4299029944155680835"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["6633418055771887481","12860482122306186624","125912498383696351","9377608128627200209"],["3024992657975504891","15975723788900783581","7220769507412382490","13030509213166157283"],["5829945534356022895","17038154384287693227","8729310036265669228","10154241718343633972"],["2431295674663277034","622006865740097331","13953833011280393144","17070062577960203158"],["14593422610171542845","8640316404363903469","15234805962751697949","5002964809039497105"],["6133434917048762611","9803623668417132470","7543936724188401489","8973377049536474340"],["17926022620858385032","10236415542604937189","1906353205416910531","5440748676451922489"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["1953646198768420030","9120480561134591921","7524605396089059092","9323297138342279726"],["15816661813078790895","6803370150694203866","4752558228157222133","1382585069187519300"],["17932525018294311130","3020400537143857621","5354107146299856831","1619995816383178178"],["12033941543955069614","15797874173201600836","12926773016070815996","16934941744104521058"],["5640840367097283236","2008561768023510848","12002348214223270947","6500297783750059016"],["3136727320684205005","15698443107233581667","5061259165671635288","4128698308278889485"],["12607583510294633460","14354964581526100265","13047964893835743767","1043198420304673579"],["17230643662632263054","11704759970825601192","3572654472032335139","4299029944155680835"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["10204832133123398687","10131562855913968544","10691507566783613401","16389378937417057817"],["12590460224046824138","16788945072424857460","8492917175735975187","5949410280115959569"],["7397461399849781775","16026945640847591781","13971632824152345053","17917463908362388582"],["8812904451468155712","6945600687361113828","2301604516722033931","3668706332251216041"],["17973742778883034434","3865125273104323860","5197333847551419357","8696156447331928598"],["10790520221204574242","6689699072110316600","5944346363791612707","4056271912760433638"],["9582759039395058698","9000317158535320973","2501569104465581946","12635108326453460216"],["16088904398632380334","61466950758405153","12100325506002292008","2476727884730473428"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["5585548673696299827","15879726875594999058","11264005516687382205","14275332915443861014"],["13490170426472002108","7619753689088540492","13039134676485347102","44974282932526068"],["8158373697700058447","10455372981654535963","6196612121019565072","14362957596632932636"],["16698800380050952544","16743285207886952554","2096372211068507033","4848670993231205804"],["11565640554409701719","2655744944352175796","3516634270935038134","16075481978102220521"],["6133434917048762611","9803623668417132470","7543936724188401489","8973377049536474340"],["17926022620858385032","10236415542604937189","1906353205416910531","5440748676451922489"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["974446814484255024","1519058560697345757","15944598016770357024","17706606102995321083"],["2062306220281143086","18236504826675721233","3888320597427098896","2901703163396408180"],["12333889571563594572","1664846551863723925","10416168578487431518","1024203323027339516"],["14030990132397111567","16652635823188863181","14206349584316433945","12684510209158538145"],["6938063776575470321","703540091859698474","4537179298810650877","16051936836959742733"],["55926376386813358","17755355994707645924","10412488231485783985","10691639154523130734"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["11801466075164912802","12923865078342446678","6355370160903150037","5652140723302132627"],["3342412506785629561","9055143762229912442","2899969771234416268","16942604049367717585"],["14074947445563482683","2886385919504574838","5908053403411747751","13509127733659022726"],["14639927249573035956","8108275202660093102","18278189857465046378","2266231556253570350"],["9652135977289693952","13021912630364086476","10498255495127604625","10036278435886434611"],["10553492194627237303","3097643534658999412","15519213474526101230","10823142671150562551"],["8984429030249861074","16731345238584530425","13390335007384492100","14019708557967429191"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["1323069834399573835","17399944487234296697","7718335581539862345","10985013991194771509"],["9218821125499102884","2492283571447867443","3446641552800581712","3561489841425435109"],["6278046148291302989","8000576923681449643","1874687818595646850","6480753758867935801"],["1927503481436784440","1297825012534344281","1942486056769301662","3797118081423265971"],["11160628927176621544","8154891361700914602","15426425763779418757","8046647440224659016"],["9359864703807519418","11964846955880182243","13749227240442994997","12068859076953312512"],["3883517194037620050","5188512669193856649","8424334866755382662","13976410295726924790"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["18175222830833225387","3061401109063894939","9401896877551932134","16019707667200830377"],["914982702880482757","2265244613803632792","8316257911235051727","11206922791612898454"],["7123912863994268398","1378661001396852765","14522625034514836044","4548613257691302025"],["11712250247570480252","8283177183302806036","15168651678765202906","2513237110498286311"],["2620780334046185783","10745884377628218662","15993666020797313924","1622222823912283672"],["10553492194627237303","3097643534658999412","15519213474526101230","10823142671150562551"],["8984429030249861074","16731345238584530425","13390335007384492100","14019708557967429191"],["15941807518919482672","290656077602367728","478928545321012715","14330646138735418463"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["3225401941420089154","3153925497515985857","4880767657089995170","17942042826160882624"],["1016266192515020093","1179294533042855806","819790721475057370","11169934159558808848"],["3011023645755737776","16956035997363333978","17411168803369229343","17709952530903864881"],["8812904451468155712","6945600687361113828","2301604516722033931","3668706332251216041"],["17973742778883034434","3865125273104323860","5197333847551419357","8696156447331928598"],["10790520221204574242","6689699072110316600","5944346363791612707","4056271912760433638"],["9582759039395058698","9000317158535320973","2501569104465581946","12635108326453460216"],["16088904398632380334","61466950758405153","12100325506002292008","2476727884730473428"],["11087167697535149955","5015050788815138932","14829732633765315133","9267710192024057074"]],[["4116006960805753338","13161194639295566227","791074874710503629","16961019066620732414"],["4230814567649048440","11995028695152736855","12363563326260097377","15780436498440842337"],["1563690465594792109","5801640007766047583","18012917289794567270","7388625450862830822"],["4240302072110947051","1683140635635270287","14489155147080816359","10877909734089729311"],["1151496538847141678","16285713803245841385","858558078314882248","1815912588434887571"],["8500659508104631401","12464517767172578","7257426488916492822","14946836817470401260"],["16296184329300374889","1979540021615953254","17526506100353948155","16262528076868601488"],["17230643662632263054","11704759970825601192","3572654472032335139","4299029944155680835"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]],[["9609428725471274317","11615024217661195972","17877226728122755201","16282224522450659338"],["7706286160146974632","17169908090281806407","16060710100833224403","6267316406710292792"],["9898901919921720533","6156692246054934659","13745121502427417764","13438548473281897068"],["14030990132397111567","16652635823188863181","14206349584316433945","12684510209158538145"],["6938063776575470321","703540091859698474","4537179298810650877","16051936836959742733"],["55926376386813358","17755355994707645924","10412488231485783985","10691639154523130734"],["2640490626368282053","8991507918672030615","2569828229818430345","3638267951710793251"],["13833559100804843293","13212634570762249184","15394495425574400033","2529268616959558089"],["177679659308793303","5872979859485560116","13443124535405636808","8477220870085388162"]]],"s4_root":["6434987032440866545","8659603902460512734","11468936423230229656","1544587153475781896"],"s4_vals":[["3819775915685277655","9914426096510867608","6465882430722927478","11493076028206693748","13880188455907152680","1257502389473587299","2584408902936122667","8023739846017828176","15184225091297865767","434323552694906311","1499622661362680456","9338469997297724699","12962365214674843241","5435274155715710322","12830500407838653868","1775105333618080440","17637899491357955662","14730586874880690630","11676437844796074630","16438767370074473116","16473556534178096211","8359053697237903227","10780306527805068000","7289662697731068464"],["17378536546445028261","10894206551750720598","15529877476202476392","14893736580622926997","17582783987496048368","911606186117482210","889994015826823644","3192683026623486910","16575182156404837618","5788887919000874951","5478309422176993135","14113059144242249142","6591633215321500469","18014726325886539971","7338121989718162566","14561799560362005758","12138926309142281215","1143098726193641708","16099669319391459370","17488944061201256853","16034654443491703532","9396953424480526767","9966884903619735985","10652337215835662765"],["2018805792819329006","3947748765157165393","4580375046056287084","10820173821162643116","3337496799661682388","4248657827018542211","17937602391316577861","17901765701235484616","9284405131692849701","16107171737702592811","4490016016033705884","129283364572270533","12677920606096830258","13794662756890064952","10628726384704243739","5672305357266613108","14744501415237596849","1577523387518726320","9636074279956862607","9210957021770788428","470882936525794294","12793634999164737030","3818679613102050587","2514028569803031604"],["893692879791577591","11014186400800813052","5881719995545204514","12204400803392920008","12330233978226558653","16872420344046998112","9652522096782827529","8549556368902049048","14044918836033601981","12970690397486203151","13228769448690171834","8962942374475854383","8608143198611311594","3341049694649047723","14216258152729222886","2601972427322221417","6646568557984759710","1482306889145615619","7448928621777978615","13758410046777155611","3031065893005892183","3373944250874318034","5314680274681409596","11259095316683856922"],["13360747105153610133","3291335632054317123","2984341888763600586","17085467668004524898","8799416304973535964","1338018068104839659","755553172183825430","18385698315867658435","4403412128375729592","10398194624193081372","3391611479814799438","16995947209367019342","4884016495952629729","16102295616214081234","1062810197252563621","13482705438665308999","14242040596745491561","326036084501981345","3217355807421593798","6929207477583667340","15752163127956581700","13087864794090639065","8593391461865531200","5843476825252573745"],["13117062682728361936","2836178186838014994","18219899974486942477","98709353609383867","9566243308030343776","2374762306589035851","17339204213012366569","6792970594288985194","15449657997187335750","6512439458703050370","9270454866211034529","8896861339851448003","15686454579195511090","2729296502863124671","7981149367661236000","6227317260849294303","15311908868608383158","17022112273591135891","10017191184520744892","15925613633724923062","17061878430963448644","10942774972665649618","2811209151717677743","11338231160810517639"],["7638607709624531798","3649246838310941097","8175441121960898192","15953681486486643898","3971455269809432618","1324608047424367046","355154386371401684","14311279739373285362","8883205709269082490","9840723974394456990","7320549969649973933","12510899409069209488","273139962773459585","14561664426939886180","1199357526541328255","5252546556895039272","17214387939773578535","10657545950962864416","2858078866645356903","13968549207104285253","11088381917139867791","11311588937737783967","10449209952184839937","16975533766353586835"],["9058678843321525250","17759467087206196408","6406508952076721008","9002922876321804369","8972485178768454919","10228344999394517031","8633243340433240803","17322913307754644395","15279201616912171031","17923784994122156206","6616946099555492877","13620090786407924206","5301352723581994301","15758122140451627722","12596450601629379431","8933064419689672324","11432344355892602687","1986921299140995162","17540860886476408042","13066358085266400448","4266393530879059345","1065855450022931415","6348435996824730937","6582653280255316613"],["17499697152281813928","11089016471028898058","1927497657233769332","3963314895268321239","15871642617517216799","12375550846005114373","2446624839890940990","3174286482659799653","3718016164381335234","15567850556051961312","12633709248349857473","742879408095158888","4497719255477524923","6210123351933199041","1842230792045772008","2405426301946491107","1180559901350108727","572741334845204375","12169176726416441611","2382815159881645933","10539211835323771865","17978275806254775041","4960220248871536140","13098997606163009272"],["14396052180728565510","5437869531592967945","12932576505806673649","6722708859186103407","10382795905211493220","17662868219584619013","9997179644276656786","975545410633776004","10332810567359163966","9776823199656921307","2713447947187809210","17721093355266362531","6462134602889429116","16207681033030212762","15474000315538404438","8490101927306544592","14551130466504589891","4543118393363098013","826099895147583633","5415766925973565840","15663500864202615879","6813738298710078790","400431381417365540","9122837235864932868"],["13117062682728361936","2836178186838014994","18219899974486942477","98709353609383867","9566243308030343776","2374762306589035851","17339204213012366569","6792970594288985194","15449657997187335750","6512439458703050370","9270454866211034529","8896861339851448003","15686454579195511090","2729296502863124671","7981149367661236000","6227317260849294303","15311908868608383158","17022112273591135891","10017191184520744892","15925613633724923062","17061878430963448644","10942774972665649618","2811209151717677743","11338231160810517639"],["1061847612845349549","11507124656801071595","11445078790611322050","5625776793619783094","6454782980439131901","8797332197333654038","12247320365501723021","17326571023028715248","9272154922089779733","1515140175876520505","1450983355191302177","17951574310034548698","5345389932690264512","3086553307500658407","5259063276100544307","3296468287323003831","14443349037958046927","12581990474691425181","2495541628671986105","17848402419284658044","5643493603839520554","12269508283529764871","2952744945577269105","10891526445192860110"],["7054794154005350852","9038933383210019418","17887606386192672797","1596846158594088394","3339748793904494230","15867410961055546554","17286250354805751656","14078740498520223188","7329509500347979869","8075542782355418542","15477344687084005169","7738503609014929008","6292016656250741644","16948978072395122559","16200370002617146851","6086692858488602058","4554087832794973243","2896958112162034335","18072578728640249833","13503422755698833367","4073019980923879007","6425356089242057420","4850657520091793360","5840593006417628610"],["14857923318199679343","11666350208635467787","11255449590540595342","281726475268537753","12771198640351253278","15784933381580407072","3040169619512496669","15242331748856397945","2639985018898676336","5971127960213187225","8319134606159289338","7287536216643099297","2950513520939384317","5620625356852774106","7598937629607666976","8282142757147120899","13589609207885450105","4247340906244589456","15811038998589213543","11196511465248736214","17934153287974971173","9662685063639918165","2593157987410668704","7041970755335654574"],["1618050323270428640","13829057805656097233","11580913571822928254","10429200799806310073","12389464683236616177","11327576532631187602","926452566957874831","6384065618895270321","1721662012336924089","17655670913086954248","5951551329405453440","12557502877740953289","15927012816880383923","14890022705941181971","4450406815458541454","5430055989417698696","2146613170035995164","11292603019026696587","18096546882741533356","3566549370287705686","4037410742420703899","16014878247614125993","17239207471843321897","9729765977926471741"],["3263456785935924631","15291175459404063925","14364436615211694187","1465905206274293188","7691380919899460218","16968405219542808332","1914394446508227311","4688578673241881378","5292576002981621261","12798405728044834074","4587455320354076627","13428264722446875959","10404622817161739523","8070490425597381181","17772965579920208344","6921673930957975236","4243460056141136880","18041362258391943449","11787455131098778606","1147844040713440937","3454077510316263951","495506851838018858","2174116609513888047","5804662976752196485"],["3481951230072681684","10793288400244348104","4974884930046970691","11351551503721058000","15199028235900881208","15985286431592213521","6767604741738044588","16997136835518842269","11907696105432460032","12351826299355379784","4362377826128960127","3457588317834542309","2791424057860396597","14514984627221670584","6059260481065451444","15595383944758992235","15196975803409944681","3100068944835282158","12064606557373582848","16019756458124857908","12403959320890153929","3565302231564540671","14136095808267919690","3094001291431500933"],["14116345199860058902","4221741962899828472","17094022426729781711","6294391888542049864","11764095497527017763","11714146840498684144","16324807110396535207","6008319055217161224","12341062769130513476","1511958136670357716","7559943783570801432","18138236734495921206","15406686962034226221","7631880389161918950","9613732580769893648","8204176248774935532","8464846563224919656","10067657403983985232","9750277531885367686","8678578813121130850","534672427679380406","13442201610892231677","9950769431233056456","14900849878767812571"],["14857923318199679343","11666350208635467787","11255449590540595342","281726475268537753","12771198640351253278","15784933381580407072","3040169619512496669","15242331748856397945","2639985018898676336","5971127960213187225","8319134606159289338","7287536216643099297","2950513520939384317","5620625356852774106","7598937629607666976","8282142757147120899","13589609207885450105","4247340906244589456","15811038998589213543","11196511465248736214","17934153287974971173","9662685063639918165","2593157987410668704","7041970755335654574"],["8767867438224045766","96005681728249123","175713140361684592","14011789166318513218","368266612384231362","10629506034335378651","17529617585450944963","1912639514751854091","13296666471867349804","17842108322873697290","13284894794583918066","3785546836412349288","3082279399728915264","11504147647525799534","11951131682257625231","17616236394680231723","10167556942476649961","2761427447448996324","14980890265512159986","8769659863724044401","17323692463864672782","13811420079866968858","11025765081374232159","8940772262758431817"],["893692879791577591","11014186400800813052","5881719995545204514","12204400803392920008","12330233978226558653","16872420344046998112","9652522096782827529","8549556368902049048","14044918836033601981","12970690397486203151","13228769448690171834","8962942374475854383","8608143198611311594","3341049694649047723","14216258152729222886","2601972427322221417","6646568557984759710","1482306889145615619","7448928621777978615","13758410046777155611","3031065893005892183","3373944250874318034","5314680274681409596","11259095316683856922"],["18335122968437642586","14175443584966523747","8611747315143313513","7386241141765805463","10984764777140635456","9511828789389456651","14912950432319172307","4643539586717867969","16594725525563945141","16008751872110288476","3248716994845471568","16224194295428668151","11886058853428648122","249620642357683750","18153918980254696228","2368448338795423309","2004184850291643289","8980596114479761264","7366241048999681400","9146097746030097979","8764965657064460157","1762772871198059982","15365875559898974180","1361957108518664217"],["14648188182881946872","2876946248047509706","4200535671419253172","12664148087762986726","16763001643409140545","1042909464337508006","11983496072486002100","14547245961812793292","7705653408365987934","254766687749635972","5595252031763109847","13459422060352453411","3708799829457097341","7337660101631030793","11975923508422055420","16784956255143649427","12483154810996300347","12905366119693530126","11023486155181041569","14502691105859485104","17526769326624152352","13051038077232221245","18094342690528512179","18098510407599971214"],["9590535897470576205","5673195529528755930","9125090462522766393","11396459853222900059","14149848580875319465","13492459300151299366","9735644562417111832","1944133127440404459","4967710858487805368","12097605774472035048","8300378331401790480","16546040098204815974","10690107953083207278","15932898855749947477","11247243607207462942","14512066584213896608","17027604516029707677","5017842716186233166","3249003606132015769","1261312150544404248","13937868287595251857","2953105224418274486","6655855196624865674","16370734604307363707"],["18335122968437642586","14175443584966523747","8611747315143313513","7386241141765805463","10984764777140635456","9511828789389456651","14912950432319172307","4643539586717867969","16594725525563945141","16008751872110288476","3248716994845471568","16224194295428668151","11886058853428648122","249620642357683750","18153918980254696228","2368448338795423309","2004184850291643289","8980596114479761264","7366241048999681400","9146097746030097979","8764965657064460157","1762772871198059982","15365875559898974180","1361957108518664217"],["15497306791557918142","9333397878540309835","388213178840047592","2117388722949833208","14255399321259758858","5099285559168276358","2561065049248922123","14796458041102234677","11462079971956613198","5970165818855700324","13870394324279354843","5023107895940855320","14203112132869036334","14965721393194553199","15514472219480620220","11461095329094133490","841016089139914363","2377546194583143863","4658471356958471031","5495830849388706502","11747071098085297119","17975099922863756057","13885684608375702219","13950092216849309562"],["16065664154095771102","12732372461633398438","3377546630008505866","4822715537727510401","10800622789151407127","16779609570334381410","14943423670799196913","2257845788481650210","11773171757580591300","8077898300423207645","4097620991389088989","6163765880275520940","15725825868861430775","4017129677959952315","8441600906398818338","1206382169886746948","10007402045210423931","5908199622363031717","14898938206920858398","5620752404375510924","5031206694875408351","40400481117538769","5680475024326737887","7424590276111517213"],["5383305179648879950","6493879247898311508","9162567272829278899","14505678481232458067","18125115731320203568","2746270602286215852","14739813757147389550","13578744215343046277","2428607689673816823","12322929930040194734","6459058248965271388","2803288019870118324","14740136648158763321","12788896081713979259","9947384781465375522","11335886207995455762","8327098059926911079","2369890436249534462","17659617335973895655","4047165769312861622","6177166139350238667","7142437669121946723","16707943459143545007","17162667986273807390"],["15269490417423882356","13060372933237574561","6499057725002356955","8449096889885624265","16776403047619603590","6400848514126815376","15712665483460210789","7802972960111837920","418409505796065775","14045060897178456970","15293122741954535666","4979521391857341987","4548704006327151425","15441354841944093397","10230324048914091964","3970829042362772212","4927280091011168381","5521517466668563981","3417510239633041424","13631702878346914622","2075772057930241986","12889180263257975209","10517182645892476627","18191622752458602439"],["9892365903672421323","16908495212261399108","4183183510470165184","7905002891557724553","2297766542166569974","8170244660707758376","11125532916779920074","9329604372512059436","6452348511616896588","212315122942997538","18222243715781011508","7166909836446055714","10941011039642001323","13537570693371519740","8952976435941227063","17949190241877578331","2799836855232387670","14246676735436728131","18195807003304235209","2356166123881876561","6457406819980792070","12215588397847217933","2776409992090091515","1831384756295448395"],["7489915040378829934","13725476323268852589","17283109583213400775","356470661163923988","11773526880193903861","5736272265051481277","7009339343215617102","6397463761642811187","6530416525787193503","29345192409294985","7458335605787863872","11897638033620965795","4422825878575340508","14833513001809691001","5643809204849668805","11756078673183541605","6193280023508861457","14744405714549742969","12466458791729184050","5487783461855487210","15263217338735066073","12721293353850548244","113314369759505402","6378145946163405756"],["14248612715127011768","13123653551097813517","15397661317679032051","5412239471051573330","18263852194773716110","5519802740366010237","10327476865419567402","10619133743465160181","6554040362984854065","16884228364663219420","9842097602826062943","11219536972770176268","13093670046042053193","14562212022262855854","3203079409804155954","5850988332408857188","11592930391482922940","93984002888689050","6930686750102111656","2519418944683988600","8048325679158451999","9217714818540460425","1675620554041308690","14027721017720845910"],["1140807366389658047","9965586157047255444","5598999133731316024","17420802563346171540","17248831893835889892","17255426926474246713","7493594910420089613","16696875993257809238","16039357486475753816","7609233342988974287","16759737313860239486","12595509726907991724","6704697026148451901","7376621721851748893","3724058242317264500","7766004861594935419","1059114543902944014","5762737211889958953","2866370615902683403","17921768137531500238","13931358379362007735","10231328737249103624","4937449424054021988","12916931346701968388"],["2018805792819329006","3947748765157165393","4580375046056287084","10820173821162643116","3337496799661682388","4248657827018542211","17937602391316577861","17901765701235484616","9284405131692849701","16107171737702592811","4490016016033705884","129283364572270533","12677920606096830258","13794662756890064952","10628726384704243739","5672305357266613108","14744501415237596849","1577523387518726320","9636074279956862607","9210957021770788428","470882936525794294","12793634999164737030","3818679613102050587","2514028569803031604"],["13117062682728361936","2836178186838014994","18219899974486942477","98709353609383867","9566243308030343776","2374762306589035851","17339204213012366569","6792970594288985194","15449657997187335750","6512439458703050370","9270454866211034529","8896861339851448003","15686454579195511090","2729296502863124671","7981149367661236000","6227317260849294303","15311908868608383158","17022112273591135891","10017191184520744892","15925613633724923062","17061878430963448644","10942774972665649618","2811209151717677743","11338231160810517639"],["12639026228590613094","1459153526029429116","8320490866811254555","15856491840254615613","5953648397818799013","17804233474179858561","11152631649494974779","4970181628176547793","16978360444489361169","7779576246458300387","4386723497562383859","7904291587483789670","10476554679950666364","10020491731711113451","13288481428597201551","8669794351420622901","1012180812447880950","6729789810750961047","5442404904681887924","14531342657131607746","17799681314448988531","4257232357082941718","15181385602371177880","8693606080698987664"],["14446299353729329224","1863262660128802296","17964138753848005474","2821668890904444243","5509930148998229246","6343998892422758079","13236220836963996418","16195323495643203470","8030303404120755657","6314967068462475968","8875219981467058611","6795770944369504825","8476540092311598988","2865908853407317939","7009529514230581436","224269109103768390","17792459520982227768","5753325975696370515","16963461753417303615","4666725314174052255","7498061935578010056","17310591320548065242","11414076391670876217","12809038418464540532"],["16645241374160471048","17796352235194041173","17088162650251416168","17938189630241555308","9239185160674508035","6719141321449009313","2136415974249974284","16531200062182726156","754345426683461802","14837084577225383828","11080035856615978860","11522360634161740","3948209124357722382","692147637136833365","12342878524579014579","16169240688211276456","9599714832766263481","17442202454691314795","3475970860891898826","11907189016722850640","7444241945895027664","17652754166990185225","6718163488975694193","10690730818699480947"],["8917605354140844691","18167654846205443930","7579460628159310109","14115459205434557445","17636491263373013434","15534195920952562294","9502174706050533530","3383980145767615515","7244544629229976413","3988632883664112377","9184470105886357464","9506596809996907695","12153285012434018942","5626669653435575895","13495750486799551938","11128796754910502193","8152879878348255051","6035966249952208223","18214542993487664033","7255614777629863721","12534932277445628640","4350603274336459112","2919298299393670567","12135889228786045674"],["8249424239127009085","12039258401028057894","10796457970795869836","8013516017263666812","15916668468614641269","5985239905061095678","5554050786328756792","11757551878976405823","17929441369448385093","15050779971090466557","13247766652835550634","9808829911731495540","2896668725866200173","264257607122920141","13497322844198005217","2341181727752104423","5222912790284163272","5835779444586828783","18050532858215285917","18293574135265098665","11809391311313077683","12794045069982562681","18341064705969383107","12418445687572884857"],["5986982711544497762","13280554318659350101","7387438491791575346","1505051027763352988","6742098706639136021","6286241655061112863","596632078415500682","17598464556685413465","7839046734548423163","10717536836501007530","6900403748405750695","16112049608828734775","15624970913605151040","481854926866543880","2359535464817552774","15888472927098744203","9037212935927958942","1362349533686662198","17661379554405407525","3958546762652741940","4374076632572226837","12757201429244719679","5859701162122469837","808538041678030889"],["16645241374160471048","17796352235194041173","17088162650251416168","17938189630241555308","9239185160674508035","6719141321449009313","2136415974249974284","16531200062182726156","754345426683461802","14837084577225383828","11080035856615978860","11522360634161740","3948209124357722382","692147637136833365","12342878524579014579","16169240688211276456","9599714832766263481","17442202454691314795","3475970860891898826","11907189016722850640","7444241945895027664","17652754166990185225","6718163488975694193","10690730818699480947"],["4944689487210920499","14323057491174595575","3834394069974290000","10247542101130932389","2435362649878490337","1118021313323363872","7130821520412737413","7254223617326221185","1917684434706769155","4882384370645337105","18076013748888530397","11800114232361282118","8591064490839141639","2007949260033586679","7720734564453573693","17202710662923077367","14795443495065090433","3755620735445519579","1546472881476444925","11946091997179655400","9105041976264454347","4990289873364723922","13760572887335226976","4824088703665417794"]],"s4_siblings":[[["11392704431732649261","8950494119436289790","4146877327574345073","11130019808492761621"],["12872389803228902719","7510257165659181486","1183423935750679334","2683540527293982195"],["17130560370648749483","10863891275360580442","2091722527960867287","17703407259172540935"],["8199313763346237348","786926919358624411","14809606204563652619","13088892762869407053"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["1055592972569587470","6496087371197069729","1877626608211450976","16594687574927216999"],["7902196243989638271","6938988263151115032","17779027156398166737","5850170127930709434"],["5211522597272684444","2059889639100762947","1575820845835924287","9953262372530553640"],["1826126885474387915","10786356473019382032","1660109808252373129","1023738961837922335"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["13500948560960866399","155324308548917362","6599911900625266232","2160245892208147480"],["12362568019385011551","5344513877606298086","12787641550951795071","4757612220752450157"],["1489945838392547002","3907054463932448517","1357140255098912872","4135100269379521084"],["11206320304536595607","3800613703365527761","11278541423994716019","11611422313480377380"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["2064092797092222991","11169355485249421809","5530788476847683188","14241158811474330256"],["87843484836132475","8229247562761861032","10585080803507783202","5586024578422615474"],["15101174383763269773","2729761863269768167","16882367426171412731","18217844473504860468"],["1978536004031389828","11754593330880232083","5634056462558022453","1160076726044624778"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["12577299392422290765","10389506719416641127","4458744642080963172","3326274253558254636"],["8077776309553163125","18276769500865520742","14591367602327876658","2864990065905374250"],["1117793358729814238","17991462805598166090","17447648475419608109","16347134481345504917"],["16641439091607323290","13839320317273164089","14066266991913983672","17957963604625042168"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["1824756578115467133","12914103235292718741","8055752577107193791","13335391239117447824"],["8246006882287964377","14137120665691917465","6280880573984910868","6074721487294876732"],["681178777944606809","13428756706575876362","13891605078824380425","11004219350014082885"],["4141390901391965092","10067230802364395182","7517919518788584094","5219486972348031637"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["10367228427899611909","6462258189795428361","8696727760767495178","13632891384044668263"],["8021655510168856548","8226859713300714694","5940317402641383587","15709950612446095445"],["125402268350695253","938306178415412874","2810361667456630008","1013219258558183443"],["10489484984144274016","1406250350758563655","1276272857207640098","7817929131317314356"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["2722791937291630810","8935777887645584101","11794557069461871294","4237355270355547525"],["8077776309553163125","18276769500865520742","14591367602327876658","2864990065905374250"],["1117793358729814238","17991462805598166090","17447648475419608109","16347134481345504917"],["16641439091607323290","13839320317273164089","14066266991913983672","17957963604625042168"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["12220317704455828543","4863609835160924457","3060697882163012640","1999374334939806210"],["16379777826906130785","591516108096072112","4729633627650051074","8686223958240679878"],["7532240641361814892","2048748309161336356","7504099457036588901","8054196758832718348"],["549097935906103061","16156394952001959660","12728366995346575330","8316559598939515375"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["12419785829834496313","17803034180938274376","13266669034132781389","4483539648178685294"],["6452803957689034286","439612464551474126","17287879514334593994","12560365197445003034"],["12397974450878983180","12177427935645860508","393164451164389275","16733886165718477417"],["10489484984144274016","1406250350758563655","1276272857207640098","7817929131317314356"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["1824756578115467133","12914103235292718741","8055752577107193791","13335391239117447824"],["8246006882287964377","14137120665691917465","6280880573984910868","6074721487294876732"],["681178777944606809","13428756706575876362","13891605078824380425","11004219350014082885"],["4141390901391965092","10067230802364395182","7517919518788584094","5219486972348031637"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["18090685025681544071","15789068209617960239","15803287390791909964","9551920151026908069"],["16856378628756292122","5375142929578834931","8138813750815871631","2065709567772540587"],["12862255955455112827","4867774628408571778","7276717865068156391","13508439265349225064"],["8199313763346237348","786926919358624411","14809606204563652619","13088892762869407053"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["15357718042184763154","12599603198226987489","13221407139423094178","12712647899321625063"],["15258378088117633481","1006746269681841150","13555905298818522685","2206549566354576568"],["13003280756944851188","9532767321277515012","10075313940760124537","10411765172197217764"],["549097935906103061","16156394952001959660","12728366995346575330","8316559598939515375"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["4926356122285844587","1215424391635995371","17452659405714858604","7826614919944066011"],["7284875890536263189","151794588795676449","14693835781820960638","13663491495219142753"],["1117793358729814238","17991462805598166090","17447648475419608109","16347134481345504917"],["16641439091607323290","13839320317273164089","14066266991913983672","17957963604625042168"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["1309103545218342549","8245976756333776327","12024201199954690799","851885670185685964"],["7902196243989638271","6938988263151115032","17779027156398166737","5850170127930709434"],["5211522597272684444","2059889639100762947","1575820845835924287","9953262372530553640"],["1826126885474387915","10786356473019382032","1660109808252373129","1023738961837922335"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["2043519675046777989","10515956738355872949","5095108237995254039","8083866555996429592"],["15258378088117633481","1006746269681841150","13555905298818522685","2206549566354576568"],["13003280756944851188","9532767321277515012","10075313940760124537","10411765172197217764"],["549097935906103061","16156394952001959660","12728366995346575330","8316559598939515375"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["9818748440760250574","10827970639009789784","17691116766249843335","16972133979786126879"],["7284875890536263189","151794588795676449","14693835781820960638","13663491495219142753"],["1117793358729814238","17991462805598166090","17447648475419608109","16347134481345504917"],["16641439091607323290","13839320317273164089","14066266991913983672","17957963604625042168"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["497441712393491393","12756827944687799942","9493039228153024813","3739373234642035182"],["6622061911499441053","11163332060292798885","5219223563057633272","7856337554694488777"],["5211522597272684444","2059889639100762947","1575820845835924287","9953262372530553640"],["1826126885474387915","10786356473019382032","1660109808252373129","1023738961837922335"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["4926356122285844587","1215424391635995371","17452659405714858604","7826614919944066011"],["7284875890536263189","151794588795676449","14693835781820960638","13663491495219142753"],["1117793358729814238","17991462805598166090","17447648475419608109","16347134481345504917"],["16641439091607323290","13839320317273164089","14066266991913983672","17957963604625042168"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["1801131872467350699","16613224935042439108","10958919048092085510","6820966226178139270"],["16581505039297285964","4735359240833043416","3280162328378094431","7809922483749696703"],["13003280756944851188","9532767321277515012","10075313940760124537","10411765172197217764"],["549097935906103061","16156394952001959660","12728366995346575330","8316559598939515375"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["2064092797092222991","11169355485249421809","5530788476847683188","14241158811474330256"],["87843484836132475","8229247562761861032","10585080803507783202","5586024578422615474"],["15101174383763269773","2729761863269768167","16882367426171412731","18217844473504860468"],["1978536004031389828","11754593330880232083","5634056462558022453","1160076726044624778"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["4452282663015676218","935032863966817611","5766725676755661206","1852660456881891845"],["7009643628756710547","9682903834435209027","13056063594562464198","6831957802568717819"],["12397974450878983180","12177427935645860508","393164451164389275","16733886165718477417"],["10489484984144274016","1406250350758563655","1276272857207640098","7817929131317314356"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["13801523386456523532","14241281134428891938","9996835112489987978","10709421230759624708"],["15745621276020600332","4959757024571860417","9997093246603841362","9739791144709331713"],["4612091196248532808","8977022561308628533","4841711998204169789","13263478161050850786"],["16641439091607323290","13839320317273164089","14066266991913983672","17957963604625042168"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["3263904837336798005","11000113142331491603","12443427941212972962","1867178869650974670"],["8246006882287964377","14137120665691917465","6280880573984910868","6074721487294876732"],["681178777944606809","13428756706575876362","13891605078824380425","11004219350014082885"],["4141390901391965092","10067230802364395182","7517919518788584094","5219486972348031637"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["4452282663015676218","935032863966817611","5766725676755661206","1852660456881891845"],["7009643628756710547","9682903834435209027","13056063594562464198","6831957802568717819"],["12397974450878983180","12177427935645860508","393164451164389275","16733886165718477417"],["10489484984144274016","1406250350758563655","1276272857207640098","7817929131317314356"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["904762061684319078","18049556657388323051","8672133132319936127","9285955609331887703"],["7009643628756710547","9682903834435209027","13056063594562464198","6831957802568717819"],["12397974450878983180","12177427935645860508","393164451164389275","16733886165718477417"],["10489484984144274016","1406250350758563655","1276272857207640098","7817929131317314356"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["13152892670289626714","2920712227313728828","7594946101466129013","2180245144685131403"],["13203130088613663657","7686320499406862905","61883964061801539","12335207265464725260"],["11847592029142750537","13394068656648039126","9098242881341080035","9614879131995361118"],["1978536004031389828","11754593330880232083","5634056462558022453","1160076726044624778"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["9018170760355863666","9679280174751775153","805245219367702066","14115195122562985815"],["6626840632225919130","5487150169335332146","7902145828479908710","7702319140503266484"],["11847592029142750537","13394068656648039126","9098242881341080035","9614879131995361118"],["1978536004031389828","11754593330880232083","5634056462558022453","1160076726044624778"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["3416753389916800582","7306424648762887206","10350805249865510026","15698949492263686221"],["11491747933571526247","14135300066437693414","9332809537586979402","17135689223929250632"],["1489945838392547002","3907054463932448517","1357140255098912872","4135100269379521084"],["11206320304536595607","3800613703365527761","11278541423994716019","11611422313480377380"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["17527570839691016443","7752769741927010558","757187833223412863","17719379213233662707"],["644166994543953463","3437064515953927548","6373556286855192787","6045796039632228705"],["12862255955455112827","4867774628408571778","7276717865068156391","13508439265349225064"],["8199313763346237348","786926919358624411","14809606204563652619","13088892762869407053"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["11259841283689729157","10346959024611204687","5803210942351685213","13770547847077002123"],["6626840632225919130","5487150169335332146","7902145828479908710","7702319140503266484"],["11847592029142750537","13394068656648039126","9098242881341080035","9614879131995361118"],["1978536004031389828","11754593330880232083","5634056462558022453","1160076726044624778"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["12506164110417619407","10758677015422031132","13079835933101463095","11398503940397823299"],["16856378628756292122","5375142929578834931","8138813750815871631","2065709567772540587"],["12862255955455112827","4867774628408571778","7276717865068156391","13508439265349225064"],["8199313763346237348","786926919358624411","14809606204563652619","13088892762869407053"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["12098275811881407843","15006246458244457643","4625774225992263129","4104969407417091427"],["15838336145508515794","11407732961208839828","13707396432313886343","8284872218904998804"],["681178777944606809","13428756706575876362","13891605078824380425","11004219350014082885"],["4141390901391965092","10067230802364395182","7517919518788584094","5219486972348031637"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["13500948560960866399","155324308548917362","6599911900625266232","2160245892208147480"],["12362568019385011551","5344513877606298086","12787641550951795071","4757612220752450157"],["1489945838392547002","3907054463932448517","1357140255098912872","4135100269379521084"],["11206320304536595607","3800613703365527761","11278541423994716019","11611422313480377380"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["1824756578115467133","12914103235292718741","8055752577107193791","13335391239117447824"],["8246006882287964377","14137120665691917465","6280880573984910868","6074721487294876732"],["681178777944606809","13428756706575876362","13891605078824380425","11004219350014082885"],["4141390901391965092","10067230802364395182","7517919518788584094","5219486972348031637"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["12293947571858634324","1539961441087604788","3667440007264285557","1294952796088349375"],["6188230864589353366","5624582381789030747","7247057974024024971","15957006771543630974"],["10636796983748789765","5411256731022370133","4638666948564431328","10265797666373955095"],["11206320304536595607","3800613703365527761","11278541423994716019","11611422313480377380"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["16428742911636435097","17312363528486897079","3959227655033521370","787179731556222906"],["11491747933571526247","14135300066437693414","9332809537586979402","17135689223929250632"],["1489945838392547002","3907054463932448517","1357140255098912872","4135100269379521084"],["11206320304536595607","3800613703365527761","11278541423994716019","11611422313480377380"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["4936900366347820270","4556749654760453691","11372024279047166024","16378167805901386713"],["3671366740740357438","16876529906164010957","10584912692686894965","11253595044588947885"],["4612091196248532808","8977022561308628533","4841711998204169789","13263478161050850786"],["16641439091607323290","13839320317273164089","14066266991913983672","17957963604625042168"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["10259232114591560363","5094673908143250891","10801281157452083911","1958410050232209033"],["6452803957689034286","439612464551474126","17287879514334593994","12560365197445003034"],["12397974450878983180","12177427935645860508","393164451164389275","16733886165718477417"],["10489484984144274016","1406250350758563655","1276272857207640098","7817929131317314356"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["3002078117966198185","12516302798594679297","17204441179818428884","946660348956122370"],["87843484836132475","8229247562761861032","10585080803507783202","5586024578422615474"],["15101174383763269773","2729761863269768167","16882367426171412731","18217844473504860468"],["1978536004031389828","11754593330880232083","5634056462558022453","1160076726044624778"],["5448046474822222451","14065528766963185427","15046139856861222087","303216174013595954"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["13952746578934579157","5025637707027386005","8662025315824172337","7102578578692279087"],["3505028942294686163","1911172824516727532","14358098471413789962","5812804681195021201"],["11649068260952551330","11415894732154139095","7136405501271892725","4792598609625073313"],["4141390901391965092","10067230802364395182","7517919518788584094","5219486972348031637"],["2225760218868324896","3886392576373440294","17724832410036804272","1503061140662007970"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]],[["4936900366347820270","4556749654760453691","11372024279047166024","16378167805901386713"],["3671366740740357438","16876529906164010957","10584912692686894965","11253595044588947885"],["4612091196248532808","8977022561308628533","4841711998204169789","13263478161050850786"],["16641439091607323290","13839320317273164089","14066266991913983672","17957963604625042168"],["7635242061742295359","16093651175256709805","13071939704084435641","12937755365292200904"],["12380543462545244324","1626358847684890158","17911372835360945313","17193327828966607026"]],[["17765234182226528174","8027034150224654590","16717616978147525422","15729155742228290191"],["6188230864589353366","5624582381789030747","7247057974024024971","15957006771543630974"],["10636796983748789765","5411256731022370133","4638666948564431328","10265797666373955095"],["11206320304536595607","3800613703365527761","11278541423994716019","11611422313480377380"],["12637513966014000553","8071645850830741397","7028399691062784266","3502851947057102136"],["9999946578599475644","16845957898094135773","17197617384338250792","17670218665162291252"]]],"s0_vals1":[["6641562534931443767","4395198544681008276","2004650217731721673","14374684046356252022","1327297296774144620","5594596881688524421","1797291923075401767","15810243194503936555","1199167667749235001","6967109447083876266","15836194765856811240","10851756036686751949","10782751617998623876","5921449800699883648","14171320769836531695","5454274195633690194","8806066856394039636","5235361667577195030"],["1780753649250975517","11719547970194007312","3465167277856747807","7622304498741990331","5001671518117402332","2701575611108093314","13131935669324226091","1899811386806886762","10583924915691762268","12170445242236508333","13670898559481149294","16582215110401460046","7079549485793228838","6716172330121410499","5725906417656837864","16960113092656007223","110892381572690991","6297345846425471444"],["7949285049622619270","3918836458259124931","7377412141706763893","5854221458062558277","14518317841826597108","11032909492167164982","1666383642502036795","17090002438185845777","17913068286473057406","691869337538447211","11234798554976655122","18153563177876236081","1640565360723801348","878952100368640007","3096683032298749887","5016244380706215927","14001856745342393483","258071938160346140"],["6448097259464235182","10276023132900957136","9222304899938866803","15173801292798781491","4327469097696533664","16935119917524023717","2430617727681640807","17333160855393488911","7594415505751615827","13374642596838612113","13445552161188475147","8788367585284909252","15386937744428911143","3817242518054884760","18063093062820453510","3333128138547757093","10247569312244124810","9732308806974659749"],["925609296655859841","9485628518256008008","4980003937140182920","3150496909091935744","18098410454402574524","3221016763068305175","7755385877170322963","10077903790499812225","14964978298161230356","1948734250813817725","16975324573509191212","10703818227141572588","13788332746159378778","8080856954475869301","8018634997681541238","11547704238116116292","13487578921918803931","7305365910887931992"],["9792508671580652004","10134183084516583686","5687960139374257638","12313981595413993333","13649754495352344526","15313735678330629077","9247287324090077856","14815003591292013944","17646968834167648051","2184980013575781605","13728253721401829310","6534058374740670972","17180809806593353026","11798757987584218438","6479273302154111520","12915299475858950215","10907685772811577767","9594012418007610487"],["15960284676197174916","9995962865111162033","7703040868074872149","13942697914293525718","9814151994996691627","4450693677317305993","4430932841031943534","16344957039042944709","17870426244396936362","16312091069256888751","2813903812637793199","16121129756445519491","2693659427277642618","16459016801994929625","18348345592753831558","9491919259545044767","11409753297481317092","17782528503772536178"],["10294671112673810030","9786389232611438958","9778061955691101953","14159264780111314137","11199842051384810980","14846244511930639487","8970561719116050611","1555711936990485074","8608753367043805260","15177468064858137","1127485889006598265","2085550100174471514","18154742476755746505","4241062600487774843","169688907073637912","681349939072731675","1693098158113119912","5963595081310588940"],["3047567773766791280","4213218950529838115","16265820253907606891","287265899970598281","494779364780267302","9474995621298376156","4525669090226322619","10694554606214410395","15481709862829978919","14744576574876927394","14566211301720779589","5097644873748452877","15984121866597290154","6058826458652642126","13509208399195691440","9156964206375867397","10243884396649655683","3571372412538951845"],["18236790638808432843","11217557907053374109","12958329119683031138","8431193547443660706","4296101582016995348","11619873362096541645","5023444067081344786","731104467022948569","3778296640681196259","5429892178980988582","2109845661208667831","16686234998553051877","2685425389039271582","4346512361045668146","9649774927922268519","8295951356440173732","3901844546996736887","10468295639057132913"],["13591108453070089885","12268557153680747445","11757337523866093785","3680662164312023422","1098802202939505827","11618039020197856036","16382636817998417065","13485809338787792233","6121022053144116972","16236781348254085040","3267217261696068400","18061706425603958171","11242248701440438182","11999944821732468907","188743884121831769","17695375908352629429","15242023603090379092","2239023070520865486"],["14300059699641371483","11566718240257507518","10044702492141809486","14454489917729349762","4102916387179380428","15581338861739560024","18439728077461527814","2768020077371469160","11866193090642599864","6743484647781020126","9668875630856282827","3948521915243637259","11888973138683070397","12945449450139958652","3871296290272621110","2720666025487825838","14572799496910127734","5459265584717134771"],["17930640880253161418","1744067206334922550","14657685194411065807","11731827091357774253","16048510978922951586","3271811910287982983","8434142371635032813","6732713108828281663","9136245925073550789","11430034327706207504","17731673863620972288","15013940979987025900","13549021003676020884","10441076786481194239","3313814721660936588","14267440564293528703","4843905799296953346","16304041529122889868"],["2595117298118645558","10880395654023158419","12808763476791369588","15167668367324992211","3072020876933603335","17555695516587912485","3294329720033439487","4966642381030131411","12117388829224785602","11739738239704870806","16737509554891067790","11624130949105012122","17520371862831017516","715622072179135382","17464394918853761799","261932547115512090","3161389612143335950","11327769915416924059"],["3748663732729402170","10756638038916259129","3865644320153105181","11542357721633767811","6384335754287957505","1952708230487696917","2968719064432255737","1097692290447825264","10770523915480157741","16865833842488967818","289053210183394612","17085247974636446285","4720364818907360968","9893605472792282384","11733768065648385439","13083155925188622153","7600913150792460840","1402984580297775921"],["9061657702100981236","6198791963643616946","12937780590926503878","5853587090117264633","7803950252047966550","623734004494957450","16555587676328236234","13963929340844283131","5814136263214827015","17827401331062301190","2700522686702736713","9012442703050092056","7688489140881272941","4435788565894707757","15148691651647579640","6857507794334549946","2390492827071553533","5538159083365583844"],["17622945509737204723","3302344825579637649","1810477605522707770","5144399107280792023","12626361313929934762","11427646886763417510","2530121256063847381","11752687829586034582","14149167444873211955","14681254750754062475","6223396784985569420","25709874710982599","7498311032814873154","17871150376782458117","16796313921064743293","336026991428739359","11450213540348674501","5305039414013873593"],["17389180105255940208","4434875382051742469","15294567396183482373","16665209957799071660","13218432746348205968","10497314575414716490","13250520131637883725","12766320691074223883","5138433344992118146","559707933251579616","2707346549169910163","9656265110818022401","5479144948602890717","13600961472461614164","8702559406883956739","4954885489045100481","10120824012071596043","299000115149398238"],["13430696043094557381","909633016173015844","6586798895399416148","18112196163614495870","693624939996465772","8816653437856535439","9465840225603465168","7974638887385057735","11903796273673991628","4203431934738999879","16313457189076187389","1960945972544854826","14163718456986969463","6850274510207476071","6696083484320486048","12131187971025858182","18424470487144081887","6609611062361524611"],["5201634163446748808","12314293453255561001","8964360403438183134","17261329452252885556","16233666485313368478","10786993216851649787","16653472825900633284","257960943655526573","171699780958469595","3130088911909794824","2037168553494180528","13834626129609228770","12959992640785648565","14125196900212126050","10093522221561060606","9406106710097318263","14577957876165991874","689843556008417951"],["16558380269151369106","4005661987309553282","10167401865319267689","6462044152474213201","12662157929277178539","11793068859999199768","11425788929564656015","5551106112366159001","8947095282493873509","15505384821276204665","17954569893821905676","12678903620370350714","409394974194587615","3713880347021915545","15812042839734782583","6078668488426806232","15313440619477629963","8935123843715770864"],["8631878247322361528","2733795470667819759","14506244790860395701","17793146314142344117","14373347264809576253","11807874981599645052","5513564307239008221","10379030852570827638","10790364879898554775","15069151069454533050","11134058402946586789","10739149967726447133","18277539654412849912","6097838376134363593","10221464012312517558","12138299042277509527","13490040976010921927","11472844021633115645"],["3855651653551666886","4177623979657985433","1535481017780193905","12396497505198435383","7602334107956173378","8014397891208701182","9795320799176672345","10590005106697814749","5036152892304978186","16998228439890554501","8429134844227083208","17592540053397597351","14513824507557922771","6963948432423862799","4708274436727573837","5953131542210256641","5336415191547799771","6796357539156126989"],["6684060178890297335","1721985633553302871","8295669318097111018","18195752252879209028","9702056449467315404","17544198206460440473","15583850640713802464","2195827842849747327","1399502457563183992","16885652722585786539","4397808664227392027","962319950351374722","1300164418695069093","17480701601634133563","6955047763664469118","10348441303780656381","1370990639256208977","7143227872007865044"],["4733759160389923355","2473748887186504723","5955078192274742486","931089136507501349","16440445276347174428","14479815706940117401","17412556574642309885","7638197833995359368","5924399445461445934","7352680276565261777","43391166964344902","4603720155941302638","12278265587211195571","11935783501036665356","1404187919740350845","11017325120982281923","14204831152778943523","9143721678177156451"],["6149265869435472771","7848271653432698639","9982357530431347317","6413089985444805024","9999192940675666148","9564991232056154484","14629519972922088625","16358243530412996863","3502647542063282132","16186736004457007786","17334293196139980050","9569004763633531032","6146899450379782987","15714697934668186049","5998406138961999436","8662183894589931831","15335416584023497079","17213715052348485355"],["17395372440307843823","1953995543131328902","7283003791807646027","13703534145197037328","18099517461259117300","12470655699068904753","17527679282815531592","18403338688477967145","17668619992807629383","14082611829779255411","6350412757289216133","11567785406780140680","1790812753594187278","2890047196583586431","16942955672123709634","8431981542436540588","5241871898844278743","9369724725869237532"],["12730950217432468503","9733795194034452448","15026584715311332774","9110726373858990711","2804294898493567482","7387550076599731249","2469037673978181970","9135188228785943770","7332115186912289263","494170777485446138","2168343638468411593","15552834944358575823","10906825469901744916","6027581840417124993","9306064936779058237","7017033410567272329","4748562407060302688","8546524874122871302"],["4806483067974093097","8342245164940286191","15139678858018194399","2488579295436416723","8039134737063873587","6447669660851993594","9197276914838962184","9750570877095543766","2409795533748819372","4131310695552322753","13420954744202745466","6540587269744362930","5429806324502781661","343072363294817776","9266503355618483753","8298393455124054294","15938357378300308736","2509722642780159589"],["6549636707182411862","13062854288527132025","14745516591459939615","2822023871975027911","766829294966040583","3735174037394825971","17310872088447694704","5410012311500769817","3303209340084644690","9777536229988007051","12887096764594122556","7982708851386530461","3008220972703034252","12209114543636741342","14184978141143408566","16010916811307430132","4764048176615359325","14194870654774595748"],["15304685719720805275","18153267487102881020","5384081096256072628","5103211046446397246","7419981089847341452","17310937802826774709","5664010569450705073","11210138045926185973","8448531271401398701","11886053187056990573","15635507680764529237","2947320714194555442","2903605547497865327","15604479658334767253","13433556683942704298","145763327067428534","6401171236784399744","4620326047675320521"],["4701354285495044661","8840430647827213134","7470239453381798059","13671420920220239951","5695520811347244892","12975987417206895003","13023929988825857712","13659275669260675650","2192728613945615389","14065456637827883107","5227209941856891100","10252545770830638583","5748933979109714669","17938585978734709450","3253270300583510748","10801743097350032062","7154145856042514852","11582172369468339430"],["8312720898495699853","3409173073524124908","17755827965476547951","10478387110526648610","15981728037806048919","9117747860773555819","14943588195839846036","17619304624259759352","14187230895865009328","6608599962982140421","17805314389126960330","12498567393061093166","17472462483594291900","13394482138229117203","17113624390243112975","9938591087682073588","11191519304863018433","9489370773883133160"],["6813947844158258735","1858275072081656616","1370379254887829058","7284955585630791344","14322122029813996396","11150280820190749453","7041244195611537723","7034768218008044000","12269108306831055038","1853715810156886359","3641573281316202051","16554009506049568764","16253159251768486967","15658026869297218314","824200360417569503","16187052834220765486","3054744655575205607","4759825496526188838"],["9907801280215500037","17768287924080116309","8132771628667505843","12240456805659825021","8479388771692761073","9541807150840721298","6483002444378145711","9983186969310915328","6405718519205151321","3463807349762662269","16164222168029323585","303013706675823963","6908162773202568480","11213579407834147759","7777510585066617951","14898609530176528462","6040623682003696378","1923715415239240440"],["4515756935309983387","17621492948573218673","610661016153026969","18401940544448585883","15141703781217040696","7608257891791535811","11640867257502984800","1388982895715379078","8351817204067553277","497460869293569002","3298585986766638496","2189718655716387961","14330102554440567480","3412275964213278883","3875767129960390169","4194831864691389172","9931270224718485030","11206002721654925052"],["15905222520352674139","2302256090178103260","678110818083665994","15782928520996490046","18044391672264867171","4020655771758362109","16579768073732977002","10208476462889391076","11053848671736248452","18248591389921969748","16701922772459161574","2634820096513968362","3880436256113389863","8943329020111333086","18100267129772550411","13520781973950405662","11064264204128839550","4424866533015124223"],["12586895389955084152","6065278783174497185","6667382334439162127","2488906983391782966","9089092802175928948","18319548744639225224","12359462960372060961","2792535814346900645","2881497379377567906","1863090218852511474","7166508259139547800","18193988731993929213","4481255812732715632","2077723420014371394","325224700627452565","9265144952945143355","17378337744778739510","13115254252625489350"],["15252321662122587584","7438237037646262891","17752491156202359002","9555032657024721017","3498247887652761740","14505801274488374936","938721839154631364","676531251505096123","8425131825074653740","16673494126958924967","15769489757538431513","6910493011249707233","1347744952391347301","12290890930846936818","15645160219790269540","6206372958984996629","13646599108011577072","16785810852238349189"],["17160783174025283594","16231439107161056630","10209509068475356585","14237395914498032842","16055641599475490333","8169023561851519299","11734732361361518961","7991047719277731417","13947975212752320543","11995485111876831178","7158809933091519558","10650323947802942112","17572642709219787296","1242895811601742581","8765646194653250972","7152212289889528921","13223597225427239249","12909501236418206068"],["7547916066483506752","9316748179876744861","5059884257974761026","12817450007415546904","10503566992410792176","5918154361026144993","2605948329290037079","8976385204138792474","11374286963155988839","17657281857908121264","1939492271912015570","14477720615088779198","1202459904831494535","15791448338197436157","3914498010519042559","10891082581441764746","11616185745529451230","2905437333307618809"],["12813825583509924884","15224373872571337571","3816707481166475611","10411798472886709993","6842331412129428861","15716453892555905672","4132490064605903615","8495094123794197004","7802042112257704439","12499105849540307920","8725445317527976437","2023815371318602283","15128017681166919601","13855845835321392245","327302947144779573","10380754333820101822","5476214466929534535","4611668996880783171"],["12943561071907138848","10927827293311538876","8958607019446741980","5031616861819547035","5522003200481692104","13209724367278800147","3029072060100837271","6323057680966405915","14422208884467616827","8925033386075892928","4642297590771732327","13443679032894040104","7964642574698495360","10385366670702794775","15448379027887344742","8003136219577927591","12597618085890222290","16304545518819514169"]],"s0_vals3":[["7515855948654961494","14156434323168882186","9036354897228288220","17838422159815656991","8134707208788375001","533656639861899510","14242748025622476206","1049894971391167207","5855452940884029275","1279097783495715141","12693443501949771419","142355361413445253","14390031827702050802","5288166514102316915","10649261359596963439","10740703886185001493","17991351473951662330","3747854178729290614","8576999257597092035","4087037815483652875","8946219698167600678","3818336675567869094","2883701076354127847","8435917087090792447","2082354831985096617","14893820567607379868","5858620461876207328","11201839444197127881","10589359853288166536","10665368669229100888","9103862966355731429","2717053985576256474","1675372711869524075","10439650892219833843","6235313959141586214","360424928624947778","14292272458422861367","3179560889743321594","17226784814650077117"],["17000706946174940957","13635891456930240184","10802163329189816468","1857923606193755794","5800211686942420053","18302844516292213230","11743097143372749275","12311419731947184239","6746467121927134396","15963860023036806441","17238128160021060589","8024322195173206490","7715864002535262282","7676751336729047956","11293776188294828929","14810665121053561827","18011237858398866001","9803955258289006619","11167091870135199632","631442006274573539","11484738893193149256","6781654633724786133","12345154347363550224","11253012003979899419","14728738194898121765","2940972470389178377","15687027927405475762","14209853020073316729","12986650335590364487","6443639332948100652","12961419953935035454","4790148302331002124","6246164221103537529","15762620538865410156","14119020788953989540","4810316545997499123","5412254308385576816","8456933484992523643","4683622793724858284"],["14804744874289116925","10947948201558158500","6104600391509166872","5159792790109980067","2170855433867029255","12691157346174492714","16105810951749705636","9463762121575685273","7030861482555138403","560114539961259864","13370432989183792341","7336173466107105596","6990896410830822371","11846885362217735039","4602112620123962201","2634059789649806071","17889098608420129466","11881300610590840671","5629603044720234542","17790347546456822629","7832823821376327100","10728541505409048687","17872834093690975810","10534900262176680431","16274158433396643834","16016072874087077174","6083788822708493589","46660818895107948","8507655100158588943","6007910021719721135","12073382099154160211","9937431434650383522","9808978303484862907","8266482610696911736","12191177250900645136","15785692140986504905","7603011448219677486","515963672016205795","3569523827695965389"],["11411846323808011973","2740318005624452167","230806795314058341","7510915088755677724","15498129774666546821","12743244975053594077","7878850781681087706","2939301050480952518","145231990569790451","9456775940759365609","1595148298910999798","17497485714992781068","8808462975412311315","419138484687136352","2389831500373535891","8100832183024556771","6719272383316907871","8296108117582323159","15475525145955894543","10675896518054046633","16247633004887098008","493041208240801564","6217860127644806131","13078943423583594300","8879769373728520722","15127283386842252395","6057695037572424262","16299343919791995559","2229983912737544063","7066481135576737103","11328171782042169655","1911019088230185295","14308416349968364404","3549036300620912699","12414542933239027374","13732823063400624622","15805673951735694825","11243491394269224985","9283157204770033162"],["17350554747922708857","507374084384719820","486363899585729018","13106718372222856375","15767261439472035675","13250583625775271297","12407398458500633226","5918863826703986609","9061964783377495749","4574678123296570178","7873531761310058191","1821533783497442864","1963813630641271455","286128623533977325","4636862712728681784","971222385767803196","4860421658077135747","4101356836055364486","179544074206581916","10039651222835158004","15726611232749281355","214959917796574186","10604269430237071483","6036677406501221127","10642831835642909411","12362131458739804712","16420286982090522631","16771334137613844346","5160540615649213263","8611695593256008189","16576276096213154577","14631241645589339494","10886519593687471391","4341632350257916204","5464574954109845076","7192650526082694034","7860766831311280690","274499246262478658","16286684551042484395"],["17167497609669853700","5574722698665985853","12555053828940720952","16225278631472621254","5419585753683440939","16880618378332644594","5075047295529909689","11392560127543203302","5968036605420546131","12301019444219964324","9461505262288761038","13243211183138136101","5793438514500854420","16548628776159286631","5952780601930563280","4986381472522385566","14365840094623377065","16272113758942968870","16439656729681161531","17416859604750693839","400512354734974695","15868930042556009570","13018760232703518514","5757852388063194629","3015746029552185308","13342599019134579340","15273689014387938808","11409110106214850597","9066178045131508484","11497747314796187566","1276443720896828562","6307047849225571068","12008139360118625035","4024973010924984449","15665418560564843122","17494612391467342095","12069151598231029116","18125008122642200627","12097628157034112367"],["9446472119158675930","7989807850199896713","56980176698134189","18136591490316060368","981365613157544824","16757193124288785942","5207326248334879550","4737391056563267175","1168067173788974242","17435378110587387913","1922731642293786325","3372415825649522476","9127044943106881468","8673995747303278339","5068124550932517502","9110644869250353721","13447315101832307653","11990790427651560151","12346799244612980136","7725910308466337012","218637197890477387","13773033473480404353","7791380817728320009","18282358258023221439","16908521141331557100","1080843055126271542","5852621707923083367","10666127207059304678","6167615392245379894","14453537695636498812","16146666131050446994","9598843610043654588","1045120533177158708","1306581826184950689","17303135860429665599","4661435980266099175","5955066580073882142","13553890946758490742","11501265123677838278"],["10661623965736825677","18261585281896596334","16339547241908212833","6693165138134917261","1900756476743954564","6874438134259917864","5278293772018246353","5519146542161204512","4426799613436545511","17464266288716171910","8402050648471936070","15830844430346604730","8712149891352810209","6384744003703258703","4203580299768705514","17768089701621717521","4895333902937329455","2060287120387731467","5402562465268198848","5270826557543700407","616584192543432835","11597996819075390814","14276884249868425200","6189963801817448569","6764999819543612009","6292710977188032050","8109367327310639373","11637353252640930640","10902718582347541421","1852522884731884417","8424462114152120688","5568734187882329341","16846580344358922115","3830238232324757235","10047989757860821357","11463455644089157488","2402944235185965582","14547984526046020243","8457998539429388353"],["9456361093283272839","16752740205405474743","12632477848793691326","2697101619839704846","6259985633757357180","3254128966160272256","15343679721183737425","14348497371278606672","12217474515680595828","17896104976153340276","12212873246310145428","13390156773832084075","10223133841477912865","2220643130916105740","520976286425519320","10495618927705720809","5516273443510639928","339063869861985135","6031905655269092860","2475258333781994213","646594472050575501","13004890025328066703","9470563162167969684","9782706404210940197","3200759828825093103","14858429016592394979","14248034165614947857","16451020361823589160","9329083641463646351","3229218206849503717","6964044625844360416","14944559743797629220","12370693510843535387","6625299517666540347","2550937436160143426","6218849434415262822","3374038276570259850","4061075576897890166","7572832482621858465"],["14104882393046617185","4192499842301775877","15823944813032305538","7476325227629003626","7417935723360888228","10048219342705471087","9725057510494580120","1555223245906551341","18354762640758083743","6156537882388769570","12275291220258857338","2065755535619266596","1254640837015210175","4351257206478296993","1754664853493899088","4074416104581091894","7421902766200675739","1315951840779443684","15993119268123028299","14184232290362335165","1680635147111236019","12263539594100545158","5072340316642414845","3887688204797314597","6629479568061768617","7856358535641775750","10914518399837817313","12922511948146335352","3118960703227664470","17489158280846035076","9718861242588183130","12270322169526614551","1892436767990784532","14203617387283133794","4906174908052856839","10521208700801336606","16148148621497048441","310731223814427601","18424414708145636530"],["11656254540874855679","17238460618075574616","4047009286401977495","13862021393395986353","12226263996378949887","16409316171344399215","3173140257457051157","15405231791511673012","8235889146993527607","6727083726274453025","15299983624784170389","15954192104407767348","14920830154113311775","15018116368400479387","12659528851347934871","13107691542162329309","1177664337523668289","2168555606544944182","11283266497313454720","8872514542175955774","4269190011387847707","7233759470433664035","9778637234873225778","14372640220126524360","16291116874905566820","13032448038727590123","7640050473329780306","17868782860769567516","11512656899508583365","675085282835123075","7496467651168687104","1684529210957638761","8427289819300109295","4054762798116636220","449839777549390768","13025739119038027502","9460764891349269856","14518604809165148754","2577127332148865377"],["7886018263342443435","18317396587044269146","13952176422229323390","14753814390533007527","14898994863768044569","5931551684822536578","10376010823524465065","4238590107215364787","4642592226005441721","10548439773729786506","751937816918559600","4596439709808868431","9866260396398760733","18150173752381153157","650920554614953020","1569685636146049205","18174980112473771677","10415464953104229979","4814021777655526566","14364584456821653918","3003580282437436728","13102159230001120319","483839772912670597","14096966248894685404","14399989312095222016","17604648630008308183","10780573029511745092","4088211942170642016","13812580795860431227","2401141601147843689","3895118855057251003","11904832286016550959","3077084645359296492","9512943548421429805","10500245862181204592","16184633205754575157","2289434579200303389","14246761348966800342","9873959017877413892"],["11646430397359315282","7665645702997505709","8393705805235241297","8433594420756686677","17401579194328765703","6684894086529542739","442718005629715696","9890352544458743896","13256760778643211026","1894348481564956305","17503033139678696054","10530288693773918185","16138764456177528026","4809994257269779531","8820833387326202213","10818462727641636847","5481993632808603041","16902544655459947379","14810524074226040418","15127702178325758451","14435618753788443709","2528550866703190864","6172257342159225559","11050068100904983548","5355271709782512045","2331579846083463952","7536826559102673279","9470795354805108329","2906773132611817208","3119233958627153895","15027367582577050567","8396918802506385035","9730743705368479592","4551807369158647355","3158272072544915507","6767006418625283296","15954532593857103568","17212447527175464550","3944958818043681007"],["5739204297365467929","2486751854764677046","17853280488902258627","5533657227637566998","18317502179614853022","578867553556044370","4617280414509371335","12958808007865010036","16772777511112342045","3451106895045485200","11035998922285838410","14957080975467193543","10304380636064539133","4313934062106343181","14659486409146920332","7978653140033213293","14032437928088873895","14553859378937369507","18391647076995480668","276090079194557638","4462364974973764599","1760252349236086770","14427847618591611177","17871526261311756877","874851818148219212","13334070068472040190","6913198483563597044","17738940671162832485","2348726734433354233","638379447830687122","16463734003831298497","10224941734570393052","14216643939377179477","15878303114727418602","899710216990032268","4119200831138980013","17073472575857587155","3644865760759135364","1735527672898616160"],["906639753842162789","11952864316586738528","10538668959753082575","484376913362407213","2161987976242266407","7939246297809518405","16034530814430445109","13865543195012419726","7330105204856511075","8525151950188259757","15026116739463869451","16151787964445718798","9399938924610916070","6825158830286393425","15050966634279287972","14361386190969398046","5984955270899355012","14118135383348273585","17277420380267654794","4199915727490637681","6998032690120633002","10620398234299495091","9107334959032115149","14835798183529874259","2560202341737185889","331462131484260514","15512433074176180392","11557211175548871712","14873841077757796996","10471584369427518712","1466322029964547088","15220156145640393483","15713601926394695414","12978967307641764767","13918322052380911265","7455214428439231966","9876576025280479966","3856781110922439257","6860549483701676884"],["2875266412543493541","15250816228031163444","6230615810064995441","7206375251142324855","18356487334924598973","858319216992243862","5162375634710664558","4976462828866038843","5443636343533867056","16278019467664741918","1398278931519986331","11418326012827964099","7203990684880520110","18087069737499241566","14495325660581696062","3303203014225297335","17454793114114266547","4530545244038871259","295410998580522759","5837122916099796398","12495899965350373908","9798725287979759446","1106422054658938028","3803192278288852482","10351341583120429277","13333615435989129945","16404517716142711256","17800609221722226351","8279719785716058732","14905632828468995661","313677572616532140","13800414820090662092","348397885528718751","16083111212369617820","2809831462986592003","17440020792582665181","1131932104548149904","13798357746522218583","1372584935450179755"],["3365838054715015247","6552389369128031682","17038225347168560243","9254814235054433051","10831958289952661048","13415477769915303990","1856328962694565613","16433488351996661782","7413551075072634974","297230243237357150","3137762033827279275","8652297968351320778","8357453569017651231","3568135200631781378","6126247270992627440","17012030627978540838","9924459652909586042","12534877891869232438","17517536347361524432","3511068444912617472","15446241932093305845","4044881501661995765","16473531342692515183","161154138909969028","11972845641779572632","13045304593712106981","7173636055954790019","11856584181453227550","7504471460955538940","2665533232936209933","15947985277719378865","15635651912228661642","17487236207894748407","9993707087354027787","5960779487417900987","14290498754624823433","13466187905503665804","5589899345724238663","15856156410064587993"],["5000668353958847781","2922964807521346281","9161349697616414804","14911880785934620999","10190413362067273448","13634256682389758326","3248500336442892763","15695486350263721791","4679547860291920729","16164190672009584928","8263847134261843324","15137842356829420635","6667236120166720256","13964339626736399067","1956386476038781300","11617794769644473496","925838214434874941","4380331202466210832","2930950483273116635","12077300492097462376","16523476492050114642","18224263560698381429","876126571747874754","960699107414402649","7933999577059449150","4615140487574355611","9084320345529224853","6369320995166901982","11702169527444285277","3577835048892146009","14583175113284385542","1492180924521458446","15826691574303659287","10179963380266229022","4995769628596902041","14572716965255884709","6144036638145009955","11412376231100437645","15394654916271961177"],["18143243367449264379","13795604334360058473","12129286507814139000","15454324471840204173","572646849458489273","11977910886652514250","1066953306224555781","753096222773027608","14588863607474465229","10309033097870558894","17930370475918830710","10050519063547096448","17063889642000801632","301478545084194277","4705830587560883433","16751696268151854762","17126897777055525689","8916081708934642564","7666606331242071478","1378900705550265001","1829334815713332458","14240811303385529157","6786370732874472119","7269912144137242457","18143582930748659729","16042791578310714180","6756543672832138902","16337885295971278466","9028119524374116576","12082335257096454164","7915093439208146009","16216784529617494984","263948319149475759","13582607571730504316","13817144137767465973","15092602189676420262","11370924566632785319","10573259748269659085","14091342392819464498"],["13957149002853548560","12388315935173756876","8307190679434451918","17465729136834647257","17038664483813592649","5937039157429388479","543010518240981765","7143643443967165599","9287926659458311495","6316634024690433202","8817707284471175438","11111635387830458501","6641204861811762202","17801261870694144492","18289135112479801657","2601465051155839660","9048081524333804858","11722823019586525337","6885226527822135316","13107372243741510204","9267920035422380016","1608169202686592237","5794561446247994434","11973673931033214557","9153737353356948216","12728189834038030574","13855815621758986427","11140388876017358804","1802116986435803405","7473157980242222636","14981308386151486813","18338227058227989194","13382263063737566889","12959865434110126342","10908672528130700250","16954623039074413532","3181915160520730039","11289199552066370023","8481810454206764278"],["3124941047355830579","14616764158350310930","8140678710280229573","2625019185225531266","249466760007808743","1755538321748537224","8975648048734459320","9319611361660730077","7260795295747679022","1484497024699081792","12272611561496662394","3004664729956420922","13828930857713199774","8513322293056674449","3690969071166565430","5864895808202414262","8058502485990816907","17846798589008776845","10246689108415042938","11321782248642247874","966870040830945318","15846055699191632370","10390285770446131572","133290610609868840","18014313951068022468","8951303707468626740","16421708985265130154","13698008384132024354","14551103720899155411","17395567250088360958","16575208844012158516","1901755280408014022","6925293472869748346","15804095997478450979","4175392536051853461","10336278701858802152","16426795147325574025","14616003478509438203","13521369571561438588"],["17615083866870066199","11999060619780234777","10391963774316768062","15438133641620797021","13691884004145596755","10573299686104322466","5626694719762343443","8004412139238470222","17551175454150068691","9610849000284314797","15595320669139763029","7885760718197096914","1039862507361016483","12739488472483420193","1373426777942843457","5182846319567038536","17625637477761121592","17126855278488143367","8698060126066832350","5145710380645046663","9757826425866394600","18398263389630677068","78385592185227086","15646471594104342758","15132471689144243835","7631326463391471665","13125358287736182166","17568321633708805277","17242931493487004054","7463913381854599949","10224379723042800762","14775389451467170243","14821111433341495559","17564099852977036616","493885672077991234","10219410897900583230","9150317507854194738","5574721417067465181","6372182068471703146"],["18180285990797969528","6371540614366892808","17454988514014380964","16184579157939775663","12100479247976410163","12195381658238580503","8382122165417487903","15183020332065766355","8271889704771202246","9640327412906267833","17549078159478397992","11426540706719529703","6807748802955982013","8687999879978290819","12218162089581375600","17578285665144765545","15570518149148503304","895023905497861915","13932983343421579168","12909967810768246264","17847568378252609541","13763613632023846028","7448904114688534095","15618090648265201721","18319726202519481888","16371054544377600878","12594118164753240958","4273043743706162695","4795773814061048474","8306018635897065011","11486945868053232992","1317985843579093564","17996294592591156195","8343292003993731350","2709841784003758643","10457887196814002909","13614418713119239666","15977214854043306500","5547438428406172499"],["17722478003726723238","11866332838458281805","15357158672050027213","14902775661857671215","13107406410659669717","12630362739276864071","13748394633433413303","17563924948613724019","18259817473242602678","18277023233704908218","5845831595444797200","2048232381662946123","14002848762591679171","18135022888656251074","6876136652118961810","1671262935904750135","3774781128480999493","14133570087361643153","13957929538904416809","16200473681271352221","16520443858559882066","11713869892882201147","9998144157811582071","16461619534025265925","6996907013915223624","2715594638908318408","16229587284964065303","10481944556218680073","3386761143505872372","12043644693836943010","15048089528686179852","5336352856669364469","9621039259654252774","2237684158727760934","274400014207879183","10488219377235141635","2633677410336969891","17240330853014867693","2467094864073064088"],["16728822553254771698","10890664096665312776","1774883661466378703","11584736215041715686","3951067773635769532","14771733114878611258","11526193956089045323","3505211893211084487","6764367534369822288","2543082432169884148","14334417459742710710","18108937083726557757","6195865791704967973","13929305603484042864","11436356216969872125","652699926195820641","13536369976344989726","13702798350081339434","10791197656921432278","6811700610504993050","17512661107907765570","1060174671555076032","16542972500754010075","7801708698223359849","997586163543889549","4377071423830585969","3247606475390868653","9151762752490220089","5976887499323701476","4184003394493564723","16542056341286842261","3080762875699016662","6022380382834060600","17554917592247791352","5335861562600571666","10122791965565960693","13659674203262519745","12559040488667909753","4349077475912197579"],["11674586554403202258","17432917808390930776","5662989271640710876","9518452626658641189","2863002357727401226","1743661566058550705","1999920936507794820","14123818546109037468","5913313985519843201","5000298382998355136","10991699169889784565","5774234245622290288","8557601676184813619","7870419618447540181","5357612789018580601","3985919522809699979","4637976251845078090","4621668996567372201","17811097126150784299","7048336723693360373","6358686563302965727","14777733388289493952","3529083385143400321","1457610330493121275","3358626348590473957","5242816257278302554","4156203133691492700","16523831000461180906","17566435932342594400","13581044276069288516","9920875209018402931","2035228051412782163","17966358089762152601","10350266524258197548","11113768216375364810","14479683879328955298","6806787131010586641","1474154815672404998","3087579059003044460"],["6905522205117672672","7731135158275415742","13980153390497223119","7865540460813127305","16818216400216459200","14390930312606848911","3403928050634432474","7623839569427131991","15043565054898302976","11051639301552275857","16606726492140934018","6668102542059154251","15781425883289999305","1472512220686831714","12677920670549067460","12843762989596307079","8609932980578047053","11746433616776130444","4165089168453813932","6140656764015649167","6181190821739560091","15644137649592227216","4606073651686493483","7309898722535052581","13736503353300698532","2635534970867302935","12378409750593577020","734032398742987990","8530951653886953299","7284800530517483332","17852008332048545783","3731735897154074967","6682825722639822430","2477756324937219626","7021285797466345789","15819677757990227607","14842288262105093753","975550473359122032","10934424690709073142"],["14293711064177519164","4522766655261602273","7444548149317643411","3766102218709893945","2740433376041347696","5247907572974768531","8075528752645956339","5721799390133192066","8497592334690754442","11865082304317634093","1137466481035933649","4880275078803204676","6738101193284101441","8116391196669186399","16361421320236097964","4840437720338302069","14128270074790383452","7139191227926550269","15649771343089422583","442721508186826091","15960970737290503712","4957044677402913129","5845622368902846398","707895292494579245","5813220586144566489","3766576474294804573","9511141037415343902","2880334507661970497","2710331625123369589","17581349922134991241","2703549215466911165","11683463567760269622","4651191749402652408","11453256415572896140","12261768974698502962","15563391481949855687","10762616282909066695","14392619095537856773","10134295413988304297"],["11667192955361226719","13307222300860289119","3647085194713278","15585366699932243452","2723132322528219290","15202801056001211909","7455432935590345443","6364873659450555770","15882532273295473904","8890342921021606574","17811609179578683893","5755808128518790759","7634184519227065286","1313098255076303843","5172095193817139293","18386267967783644171","18371809205245110033","17001091505847942545","10059720132365799644","13448207467385001658","1134624177935190457","17610467728265231108","3792697053570048141","17238159347155033227","12459185481721086146","7029066463030572291","16773093125098633498","839213737186426511","14005473616596950842","4323671984056966482","5351025920730188519","11967870934170840422","16404296750313516929","11031858574533976787","7345685879561036134","12758387628576657139","18330446201594379956","13138150289410379296","17791238165700155606"],["2667170870951537781","3108535433741858792","18375981536362932269","17934508244339088905","6998975239290250623","1696624137199791869","10186480458754308340","18413204468714742892","3244460177464933815","7838759702645185971","9095129587038395237","1260426614625761748","10820997018217953794","10401661871484840201","10259045960554489179","8210326596556319579","4325109311569399531","17934781643620847372","7347494101024226754","7645835264105577279","18151263183641522801","16223078589591629274","11606375742349339940","8694340430291506532","4614598917754862829","15381543966296136277","6154774100072666676","313636295866560954","11893099402132421407","6428884666381083262","16608543835978935956","41739987428657378","15597577059539080442","17894745900106468709","12748270224286258290","10517311498474976482","8405442795597517205","5669643569647130825","6005440950458189291"],["13196961179798049228","13885759785693887547","12066890275671709390","15335154322648873160","2812616603211128645","3890737614688687533","5952865830055646343","7113062666121242954","17647477873884141989","17232080940150631850","7622647247299157817","1249181590133287637","9877546096882529784","15914713024824393228","7189441491959642658","5190592478172272605","8164935271548745887","5624587694840401189","195483938157706397","5647363882247302801","15991574265135541834","12759580221009807991","8887601647470196622","17709213461943238466","8541640285373548299","9038247828635750511","976013631409549707","983453741863375941","2952016517184231772","16121897696623854645","13595505708633345059","17111351172605640440","9547927457948453671","4790421361979411974","15672818265115630385","9499999036718874962","15644942908653113409","10417125658292757816","14200745367345867582"],["16299936639536966021","12782685679752801331","10278075954990109055","10048174272597622133","10115858236189482864","2871189690791318325","6249686445065492414","15473393792546064429","6770909826761359362","15052119788825388629","16262041992740092298","4622810454129375174","10610450115226159324","4889764414657327166","16175958987906838857","18085080547807146216","8378339307706522777","6213770661828757648","15446554333336456874","1765613469278195427","12086313575287585917","1681370803801072168","14733863912187381886","7381782782091761070","9026049273870571731","9187511817752069514","396169551678475803","12438564300563069924","3892847452086242342","2846692983826160642","1802230211434597813","7820907863259330423","6915356575224116502","3115207795254596781","10128228067703443437","13619609911324952400","1043047646562357577","4882034938550480878","9757288418471932491"],["11525718797609553010","4319419887046523605","17872689407198251319","12310594243549502656","2649177280268396462","5493599034952930360","7169336152598197086","1443242613259363583","7637212777670695476","7843656365419172464","16306481188958871397","9071600873404603641","18157612110875267383","8864309196608072132","11116130821658645991","12288847331599639794","11940147718448526577","10775195424975554194","6336555714701172452","6502374046623183610","12244068250261723420","5512858499151185238","7557522115509968223","7243014153148394263","2057668212922884540","7852979360371657476","5352773690547290854","4178187486757076054","3022530865014325088","12790651650900139103","15807529850156812053","2753299811031218448","15462162604316875780","16131288397654278807","17855975060512699385","3055706076650684082","16468565005398580137","8353928378508524647","15271328363327693125"],["11244226516695044402","18094825490897887785","7330440757577684959","5785295378283233522","10362117124105798792","4075448543036826303","17589497701971344084","16360712850552768114","14078373733810883410","1941608341779611631","9535011884527527953","16297080156734637713","13073752933363565704","16049146072454725875","1424849493702132483","4510146062165185859","425704599956113910","18143999854262580860","4646584541265300915","3451163845104249566","15593374433124546576","11115621022653849304","16671625992858962522","6430928471236213250","12432345942043345807","5535642289093919339","3586512321812686322","15496364088917210904","14772208288154655424","15188212936290797470","8752264689284935775","13262684969652601412","13325699264619925557","15282051646446510893","8490911331649206619","6050362902820285350","11538054346804434312","3831904458726855883","9255226644479992072"],["13474030590348897398","12353349028790280705","16858371939198491464","8348923736517282106","73004024236290530","11876392360197941746","8570531580528151745","8767554053625788052","14093963698311686185","17096008227486250671","3514627215725261871","3788550868645552798","16279524482695868097","1323606965155671757","7863586166783051720","14876342991935274470","10342238177753244829","8330153243055233856","1999497776715628683","14994039402315164179","18230033538173263130","5381180532199883311","17060913926015862524","918484625852493382","9147341235247478995","8557357638015999744","9456235974992894390","12230522667951907825","8504589688178792930","17914468623897143644","7891950278295512221","8500313308917581599","15203798388428832248","17191473398403762838","7458479041298878849","7269208866632560054","12164273285468610367","14061815727243003918","8909053703297595876"],["16780233105651768421","5078361461631494314","9858389077506776329","6543576281187830559","10361848862982302380","457976843355710937","5658608431248409038","8565531678999409622","5574906231277797128","13683291807783767882","3282133677429631085","9681890600474785046","1133182423371966630","1301984486713519526","12315148710138358658","15236740624427814512","11533478919863893077","14335918516590553195","5660614606712804871","18416367356591832832","914103245865425463","7867853190655732291","3232123899151454987","9099268382769330860","70574515339773578","13798725919978706787","642827327852390854","15521669998585828482","4149351841919755897","14894945536518231300","13842770806984063622","10026302953574273514","4059029763943561179","13809512184101458331","4000157438117479691","13598890330890672931","2289579719236450038","8231867108007078564","16645881841716428234"],["8851651508039631975","3501955700729610671","17275266850723546155","1363430356919460217","14438463151282755721","10338474122294892021","477006184411374329","8839011476708000476","4819377425412532092","806547588043344712","12282982306996050460","6554260439788158692","13305307770244568650","9388212018191389160","8426435111695558169","4352996580366202141","6785578669600861005","17271961530230906080","16298074283257029042","12078844870493530056","7538698522851988439","1271879216546341091","15496603351633720690","1667474645169367708","13923962886934321066","8066221767265586423","8332993050026756018","9056026780802075067","5838235815600922474","17219525895734631021","9982036528756250094","2149784718442458471","8320330001777387517","12405592576579956598","12849355432063760237","10496123064010575567","9179974725991236369","9507846143400231043","11757806382783307913"],["4354899874410669835","17549878139216849831","10230737029375373018","13995768154876403350","14224868262368217575","1657826344880827165","8774745174364155770","11327358353321931429","17509655504011797988","18259249427252626536","13509151933643306522","13060462788707855393","13219077640713401084","4483497638658146026","11660331092988702917","6465912602679080736","12990168840334176776","9493017417271404332","7940701706844657100","764321621579903803","15106149586877445221","295493216277977464","6021243322012301514","9462974992927154169","10454471064862858478","2856177666873681048","14643912488002914785","9013643482781454009","13001653642136242086","9271280824224777937","4843040256117405022","16282285807558430795","8821155182576406787","5377171210918102792","17749158655765216097","9191551174201206539","5638840275912688174","9403265338189338861","561259178821760993"],["1984791877563928556","6028156620868269401","1132201713075136458","15094478915374111361","16553986314248869350","3574618698183665121","2858555944461144910","3564602449562755585","2986649133050581803","14264854517492473023","12361716704884288220","13812531934688317637","14278345839309590785","18141458656849857382","2975663073492100591","7461175924954272304","16516022430117527910","280978223199860995","9734050682401447648","640853004254498639","6453308866029219290","8418575149126727702","6219457111411732358","10169388891918130194","6966562086071995434","7277362935375340047","12442290533939228280","7928272596673597986","7199124647699021103","987486533690913415","15944336313708213717","12977882519172240748","13924718524067302119","13130086008835588843","3210812205679287170","1786017162873914082","12408718419106387841","1114590078769933738","8474881666837198626"],["7686099635628698631","11467259977965858132","14336373862721113322","15047316507416634611","3893764675725868346","9970547538809015791","3471559902348390188","181621523032676596","546671132345717916","5270127687687580513","17430239227258002947","6820500626980619837","4439273682118062920","15907495699193508253","17189035075176022200","13491264440665193523","9099314890900834472","16458802746058347780","7628409812968164503","2611636989835208698","15168573905798804670","13661681504051341185","12166857818362798227","1179011596879212254","14383457263134425105","16291989165975196920","13419627257495238349","4424809127037546546","15340713060838519085","13234821415122320380","6458388520491324908","14230773327070743732","1539084164110907728","11609850982309557150","973235442090230778","10118844137204515706","10625713362032061001","2511847435361561328","8485732320547345751"],["12536751474546370629","420756144088766172","7659821810627053516","13794091650882918030","2740047698554833989","4884247421329737926","16826577122615996919","1336144091340194490","615154653786857365","1429322227889484859","7414714515324391877","10355944356162867052","3951015933889130834","3188474630092771042","15344892973965703286","12249125767235794355","12116127499069370624","8382279082704164530","13342502540496625539","9729599096280023479","13622611495466446338","12036074842204313213","7589557887040142421","12944816359156456088","14587829927468139760","11092638102981506875","4174734391893076381","13838577728348488653","2387331945730916896","5578551807560031794","16436682499832912610","18008414442083089600","18246725337934141998","6119501515930445486","17594877278486880270","9828604513615981635","1029616543710883805","3087760951986815367","18353052900345885819"],["4639612788095983883","5300874848227424658","52378978114577850","6015341838949394950","5462147350651745018","4649129788836813831","4422448654131931694","13684250536733621157","9131505263830905935","1440186335589249396","5673875143535296472","7479676720632748060","7300923156529038699","17209951761963250732","496397774639302098","10098521670925245276","2906463375518271922","7114661879508071600","5802036474391262928","3632680212553703171","7997277026705531384","2613061870301308673","6192600860940195021","16976105263691799787","7014396451972790932","3273863614536951212","11693008712879797181","8569016234927193249","741562219285501312","14591750486596513148","13855422848516368146","17937711591264487576","5146805892807932226","11466991621879763845","13329546104398482339","15721245372618303283","17539872151710329580","6647621834391853686","4057899756527862162"],["940913592915813860","18221264569069571304","4325995904922246123","17784758469661784300","9340848210738569621","17639452472130217521","1814244505416441289","16740270869158347233","1096703114402806337","1801157668951138113","4457976763047497629","4892960793886570623","16834213572972445598","6135166922408466428","16325612177055892292","13699315374639321488","10123593567746340038","13643512366801395630","254698698066164247","8989043707504452457","16407179175667017805","3862146977822531409","2377788465128175101","17203012852357519101","14369085803868915475","443934681567670668","12342552165427141653","16898006247351219305","6908784323935866379","4808905880265969763","4720899784277872017","18381015543335348917","10994201109581833388","12406935350572815510","7039161745072495884","15782127888697002734","1227720383752575922","6287157767554158656","5310165058586546958"]],"s0_vals4":[["1822738327401146527","2648734837707869014","3060002098310348016","18239192699157864786","16103706349405297659","17448870681853106587","3007149545016672512","16543446113155635473","9668204244898573943","17793782212718114178","15822528960775180479","579887777654507830","3697002200854125946","6332398938946292989","2001536880880638687","5461522065994406837","17486443320671687748","1350143420434291176","10914269708188516633","12910226689303220144","15085506178967986452"],["5179179435716816792","13033759118717748625","14793513527542847997","1736921392816345871","16916002320353296317","2273818389922605735","7999362570476653681","3122839570418947167","6823146347530319042","5172010233158206756","3101390358094918678","9036945601604086498","2133809223014510709","5933489424433358768","12620611804927341818","9181792465156707099","12825341898003441090","8374119225868253990","16373796189318478052","14551532403734564566","13467377115285627095"],["15065188314650315965","16739398382067008346","8820466798724588592","14472088448730447227","17169343679193007652","10280290139495353161","12186260999008982049","10454545650195439209","11083712206188570385","15254327480012464817","10319527959230952784","9869389699020245280","16074654307067343752","2151053956210297687","12444826261738605675","16172901446087393981","96559064868356733","7340514468947142314","7224449553084542482","5970853701128493626","10047178572817985793"],["2206093706915937931","16260511341126040379","16447889327704639844","5093724760643991207","16297958579176360517","7828866552741865212","17246585235185092754","3264716797333661238","7632041584220300757","11263345272919048060","10699749815877335388","17100615681064562903","8325191635776615910","3944665767804113057","11932152710910933906","12859741518535323558","12026700233023535424","7050815788637471556","16081153383810901059","13071739807957446564","2138674489686324131"],["15792641505804397729","13439749396056333430","14501299696019865810","15667153866966346322","17226392859377400597","1794234929234318675","10138237741899356503","1672185122787767614","2281441621651694347","10372151168939957289","10088030843128370199","15524149131608324880","17072752984518666199","12499982636407737692","13705454210462834248","9349410024311592292","2372080041872264976","17239117370819401734","11310525438559945342","15688075826494469330","12837471060207980126"],["14446955758295948700","1881389775348283843","9621646380013341881","5171069801511564941","11305719360344512140","2105713098741819436","2296497659477328702","15352773782162717348","13936242220531968485","8662688477635024043","15575214292968145291","17812572899658280306","12973640714250657482","17505168154840602805","1124863008406140236","945670795660893458","1664462174571775235","402872923452842349","4130783001255939536","5670342651389472342","18176446778911394821"],["11165374486864412580","14002199141338597096","6299179539947071700","14239419290657997358","18411478021476077626","824979369737425875","3961984413307154062","4017425377446737726","2723447123470677312","4653467064117818053","13197030213763977343","2500783957837842274","14399382459137883540","9353094200936765225","14710071097634063342","2940311295080166736","8795118361605818950","5825533750896368217","11731606208474255658","13666942278770820777","15689898671348919656"],["11990832455069150706","16904287809860054724","2537703457014245012","6420534813228839301","10562376681358397887","490240579397740533","17494253348935894863","7414779616828149597","9420206673988214985","14061403070090790462","3433963283972295062","5376749048250862790","5585191462731077612","17502548250339651538","1850313901415426288","302839816467008001","13731511350979243345","7148769241996842769","12087008137513313719","386604162700777970","9061762926386228527"],["163137690079970117","16695780070437299787","9758743363657848636","1850768202619527648","902487868218477967","11905410535213943108","3496483208962903883","2849294896936898931","5400851374704486932","3227183280881323524","5800153375164649509","5111602294660080816","12394031025762035761","4505358028494340934","2893924115721866288","11389696131593955098","13433145262232583224","642861926009682935","8463637540071115103","10823058284662053062","17503993016769061381"],["383380176332892526","5244197052595625854","1751936300390027050","7248863103000870325","8487437905026701158","17552424254049669456","4132386817774668675","14964677491031609229","16311832402223158072","4308117230349084","15623503720983477064","13462552231597052888","15770260974344829678","5273400350910110509","7528396721528208532","15794723453878865669","5108336700593237996","2202733077741895178","2388541229515129461","12045466056303522842","704819296900898459"],["8574857926470406249","9764862032639821201","15370447579677484956","4287001478855048191","15832621971035486609","16935501808461164200","3943723471056429977","14025731085304726791","896449625089327439","11035129314243125190","11074467903131629968","17366493143232162743","4018819378093660954","11693476721831241884","5343748192318643543","9625091879058564633","362808666969820557","315705417437761185","6817446580911309906","1514320045261688814","15264455061926488548"],["15174875247050774531","5103907109360184127","5728236728942234983","12810889854292759381","6931694259162707744","6423257360826040084","100954191388315222","15875276840374391142","3956429881343487342","17746537129900919672","549669758885066240","12851748893586342058","11155284748210905996","16290937745665358914","9480998817467057718","258380193575508834","10724456063780489448","1949380281077456613","6204359020021075782","16248689203256156316","13587875445509879937"],["3030630525499314470","16283848952354131013","3635616198517666001","3269788176654612710","15949304497456551563","4176191790022307734","16215550920073876775","5316785130824652859","3135262366637178864","3797371306655684265","15411634594051583565","3486211003221716507","2676532641524092870","1703154569076457317","7357437689981314558","12813529434081623902","13648455394893289100","13906773631394268435","3802997657736184637","13947882635658244909","17101509567469695942"],["8331050331678470854","1719607545734046684","637322901289052788","9280406412151007277","14082419005202189268","11145944038441624879","13320261766371276584","2023500431247865553","3020435066611333030","10718855443699015999","5577003914915310515","8312344487106548713","2816481645395408236","14216975874148985453","10672507235052386356","11921018610970657805","1743600467528748978","562466370652684131","13716601658311616062","10648520223472712320","9113711850174936521"],["17931139489031408080","10333508911250966038","3631199055272506534","118089070945492231","4032127296416394725","103937156220319028","7504852514313558776","10967233170200130403","674522168046744037","10493971437839284150","14480015793613684156","8820905413153934845","16345563702945659149","9682899285793675408","15575169613879853193","13776768629505770711","8538703183205139360","8671051574570559016","7554384171175644120","13208923264159168258","1752692551687297377"],["6590847899195107472","9198984540724216125","9472593764024348438","17590061161010528785","995522600207550793","5531967441333980399","946189280964190256","5753558453317762125","8582705569707231792","770638223928443724","5662064733984328992","5493552404449640319","1827102166081973203","9534985617465495827","15660735051266323853","13925005190887317310","6847156863204144878","10808524226528692802","16474971551665835535","12297200097747279390","16432239196391068898"],["349309173697558926","14339207394159916615","7776542918393644231","4295938347006975507","4006419042955207450","1391131378094178835","8759220520723528274","16091623866709457226","10502492415881564238","13537095964713424618","11943330438336730387","2165858703057401554","10461230135084660952","11068293573553713565","6409404753870814307","420884913574931409","13779413429834646598","1213988361600050608","135841363312278096","14289110426150581521","7870093780790757679"],["10120075810808501095","2727541870245282473","15842996383791830740","2222652165309255851","3980636268462173501","11939963430711299055","18016982225041669835","15393508940875637717","13956825821762666619","6259933294888365257","16076550454387363436","17158267885642359935","475696581592697740","7926263975250816492","10755652394914676117","7947729588260045556","14528440484654235407","5159223963507921116","12446460956723649708","14573978435170581336","4748540229794675619"],["3009741177523174094","5389083547004354824","15236199640602811568","9632658314193474519","15342214881543770101","13298708057327434326","11022759307270344819","10070264837272900878","2368153186242999851","7863547348900632939","15031242137904181334","12867066201965160400","8215039788500081778","2120274968656639819","6510249364795610632","3532031209695881425","9484289397561131704","7945705750678717250","13509010906783204696","642411120898849723","15908401989694151523"],["10984364832048860139","13683115829094501087","2317287648246228547","13174107292102249507","4666957232498545962","5901584546423667987","5477100236209424463","10808863363858552129","17390686051446500845","10080171160061926405","6778791989154110933","1526471444541786324","6446702491174758650","15989529114630437212","1885205511859051606","15614196118017452166","1308667759711230658","12414604960264569835","7194197114837478164","2817120459261497997","2971503058685764806"],["3669513599050979206","15556126788247847234","15480580891598414666","16125596592371126072","2581233977570997605","17662665333335518817","15175366678223630186","13728515949371676965","785908166539058976","16073771385845257078","16311806098255228442","10639574747454223128","2589802346819751262","4010125270289083409","9483871629296441831","10780424530408365835","10562037110671737286","2169864199427704712","11485133698260587451","3862854861277199560","16405191030892911265"],["16105190147340702805","17621752184331923261","17942691472609476178","1256400606680096403","4265399827477595212","8851953757089241365","6282132917251715515","4890328788655427859","15082129811500885899","1093084783853785478","7541473156100639646","13585376989141421652","14802035577253326328","10111486005181586287","564049150064129837","12042600683638227730","126855686727906144","13499049841794868177","17357254696638621725","3143843142854114097","12576549774810231234"],["16772322873989365679","11524477732318486818","3432950864406403005","3145292120767145635","17744791797769090625","10666128807850519169","6472150949567688231","14213322233976368740","8776215780233914531","14204618371551370052","3289793894168183075","12624881895200917552","11407519427097909056","13057047342055077290","15684112430819046450","3667070037667634216","18058073088507822385","2504088814956933971","10344664176986419931","3951162991057899481","12362840565328566488"],["6944971149932062192","16315881769443692243","13794671470089913048","7658842782620599732","1803239986612053532","15366351526875279300","9590433648708229502","10702095559464662578","4295675681785985596","724464565492092008","14511128279613132076","10286036562643150201","5009676248074363043","7989886974481022949","16832138120897852772","10945349197950059456","5223576355037585379","16210215134394616744","9460123535473284254","14144452610728117226","2625356770978277264"],["17331147258463559440","12052262878052569737","15416008037397009367","13844894249065220784","15081627287286790985","4551797618152559919","205804474963274778","13520468618953216516","10144161561555918884","4905583006889933956","2209089567669287292","16515277513111265753","15961863971457993516","10676871877076388658","6271131850313538852","7514317027077814373","2208292675751770245","6613203419684289843","9544563701719737988","1210945972930012868","11437820046792921229"],["3164451552359593379","7081874651442369093","2025781123402509311","2357480043920720527","12253625713807842272","15616997010958509021","17772083169300233062","11758571551863225853","3638932318548142999","15851996795626235243","11792585666704461033","3232982861539277953","14968351033004703296","6434123543057151686","3065642202280669845","17151144503995562494","6150636178002983959","2475202827874736722","4772887963531124436","11404788958130921446","3427687506516558818"],["1818917725043783474","1345939945566981138","6836284437379613265","16381074618500963847","2939139913081336227","1013649870329966711","10633323949670820720","11061951474724449326","15959953156878626436","17653954124193987250","2794170681898436909","2822071158427116175","16268859286579780180","12666306807941492734","9908656248171339773","4794992643097781762","13994651987448138872","12842099191850533859","674793599902551184","16418727488598241815","12097635086117121653"],["12671326512514125288","6442191772618112762","3468159339120939807","8804774527635463697","14593453226451707481","13956251708411563740","7822379312670877503","8519304423343191902","11509199900644657857","1097161589621662928","5651920448493275385","13332719054011678541","12837567150175788903","1167138916953058505","9590692603246224325","7355176422619841584","17106214340163311602","2791002012281935337","18229904859848556767","5292222120288688116","10223521095407193989"],["16157115726914521935","8307597215269273347","3430047107022759924","14269768121744948643","15033118633925346885","7711171023899672829","15942126783341587266","3936492274690424669","7120558742625032418","14130937038269188925","4749358947955665856","14399630053382141495","16491785917266550335","15495768128431768504","10928056326280586198","2376465495277340658","4928630519927532180","9817051096192572795","1353935613127629676","15923440375455515535","3540009526148795983"],["10931228023129726274","16063684087486533147","12165054160094248071","14290443342690495133","544246192771792413","2690338218765502562","4640408344269060030","12819535620591464756","7291940342730429447","7909687524655799803","421187425655575502","6837510459567708741","15657947665823598108","9072356942528637657","4807288259528762173","6194219057123296027","12115878057146572251","17535096008865487217","8086841304584117636","9754268583188210350","17960658004278299396"],["13072509401315755263","14330983436607885683","16144516856797956223","14306638703234704967","5239258797373206376","16793085867797373715","1688618610933009286","6398333067332346179","15851866704826271067","7277312979089605275","3632806364277236574","2916008237505293997","15480351201577947941","11162052378833374792","3088701354271328080","9853211692864601213","3464042514487063673","4966999999549620302","8248644197834795660","1815321618080206395","10975453569386939678"],["4898687467532248344","8139816647869189799","6336086698508347897","13135386032923054199","15263371778758002769","3520076269800281891","160845450073629071","15256684436808649263","4709933862421073682","14143666034868722908","9468210898927266593","16654388588377127577","229285652842461076","12144743633399452729","5381666787247812560","15661114937879646875","15044229291262195894","16742774884611442407","7546236285227044280","9987395852703605076","6164628933353436595"],["13377477400788284363","2220280086177089940","3178523035482217315","14068292134844037587","13692150782286030272","2907024038212617527","1781242374423253392","4444918918940255194","8353598416845822269","6566157391277055331","14847403639132577433","17673229383213241367","16519129119813804654","8920741170705264759","3185750813745403595","17438226346329028695","12693237997023925671","4186599877891824351","14567832412575243632","12101390444967956305","18021402343933132667"],["4699710051051580933","11360620287602161125","6034953847831088972","1047644576475427688","6565053286141453018","3465728027212425240","17402627387361822700","10188449654412117656","12724876684917377005","1006596990255607012","11055804992787287613","14801904377780135218","10214129624455997879","11021467363015125032","13349368258246716502","3159936327479900919","10907254156079226328","18142502522965492519","1795286698641388678","10479026169713125360","9795995616879674028"],["4847903325861403182","1831352414007935189","1935029601580698214","11612694255421235477","723237971276437132","73374887369877205","4244944865243178901","15726663141510440473","11735449189321106825","8426041090513425629","15613605219026908123","3651383665202304371","2421068843107567831","11812956095827681583","3953027387968428363","15733398484467870293","1047043369958380494","1102079952974588088","12971941611416524474","14932207335698023690","13227109840519344652"],["17835427544489771885","1545969270333085953","6722713737208875004","2145600813137914452","11752742944256808430","13592059808217882697","384178253060761105","15488814663151093181","13147502492090421797","14387094130777760601","9776458122291724354","1661316197865841612","1152329173246221972","11331383023646798550","13979589889233870128","2453998033350353568","6906522031655168896","14873781613035719355","17708324851380308168","12360752609291504643","7297033629729958391"],["18392127624283530348","1355294298094315798","9711107170328703042","9575075763172954624","12708732859846617837","16194664107099599598","12952841099713498086","12179574609275757031","6915291750804669296","9543604816744676598","5650394972391281055","18232754098387376296","2808496781946309345","14343887431836675364","14347199788631081020","11012231824942992815","16190024770457281141","9199839622593291930","18185543264167877182","9567967419587763649","11334564174988465960"],["2796461772537080180","10325679090952810319","3910737540074800509","16867755960922462723","12749337934178260673","7074095913235109573","8646685347518731824","4616684720023188398","4718696685752590215","3708270777610480826","6930045422431669399","11376868579702667826","7204911857386234941","402583263632865562","12354679355911090808","3550131385875315039","16450660218640167488","13825554291622551730","18301637145894391207","11043945058911115183","1345395535267978491"],["7079287967844016091","3751506438739575743","18179304615154550812","13664921439396619927","2683088439459881685","1875902296326637358","9179896978939950844","16855692144915823489","2148894771812380060","10100641738900630755","16196710307544404793","13717802899957873283","16307473990046856530","11348783045592225240","9087033686705402267","12982633199194244034","817324023078198544","9560216307447763978","15989738135010841769","5937310456480982004","6834147078543372169"],["884822159456259864","3766358240682192215","4926619086258024712","11491057597631257652","9858869858956356474","13010054059982914769","8845156325014389601","6136545074755350322","11686484576424021294","9556132522789967307","228626770588769361","3927420282683581443","10925685325619527850","14205299455811827354","16624475959167371901","3130804703035762189","16549621577155912255","2998846003161114952","13290285321168007933","15135280051406916872","6205450279785715242"],["9570985640261691950","9298956448774387470","15188209324309519339","8128399744758083271","302361809150922839","4578059180972685444","13545326894421549200","8970313619174543833","13102430343607749381","5879367030782309328","7402961419379357537","10563571135816960561","2494953081235639258","15539695865874282753","16114473473421415002","5694529452329830419","12028705860468556214","1483149499149418716","464135927154871589","10107674802776458279","2091376788466781482"],["7748638718486931601","7608136400165480809","4844036505476230685","4254501671939610769","15091927060352112621","18317950427896022608","224141165188248823","11408576614538140912","6793442905550869662","14769956246812900680","17879680896886462821","13034475325556510256","1402343775055720513","10326998746118649000","15642551595933978390","13241918859711032081","8765170287485282869","5697215028572979072","16649118354488419766","6206293896652236221","10053951302032745127"],["1027153549517975370","13715630721856627718","11619664028288245687","17559284414601128283","7429204781196406807","5697049676008663204","16293926007313811458","15061169776344673948","16418405873363564619","5678585521179220391","1195102591207648621","9683865440587319160","16333350345185671830","4791763306829268641","16754332748159568026","12380249041216916280","6158863471315478130","13542822754779140739","13529648820456432997","15848935142867452105","14111428126426519822"]],"s0_valsC":[["3047662168851693983","18025260631159066139","4420219621092126873","6386037770678916651","3882704084957470936","9972062427202623262","8135308172633070982","1048627771261253345","8749316283713153419","9219936575421833613","2316479622544369154","12871470126343499372","9956790867692938056","18316345318588299073","907870366131335579","5927910763848236141","2594041124256408150","14881809506870600180","17476407700830635666","2741394524365688492","6004924373922367068","2999834117012247775","16473838320046190013","13896658468646924844","3170391137035186115","6849672466962310896","4019028442393206700","10370287591783181656","17672787748985136934","1238008813629899603","7801619735708034676","2678983601254050353","7411052542862440183","18386541342426193667","17658343735730649215","16081906910161400267","5714280326768890770","4679039240542082029","13658564250685362638","0","16977408752199846482","2388917916858494335","17294923247666793722","14835280395374395961","2221763825314614563","14207092220079827669","2071701535373959534","4403253456976869574","4012145775483527811","9415777508273147131","9649241768669438381","8490414063434232700"],["8015541207854083194","6282211258239641130","16901619423120924521","63430489841398050","13267930004329213243","14888145171799497396","14501196777600829994","3888639498154484432","12262691096066205741","10899772339516051104","6378087951361353529","12390946569036091378","10587795350498147796","10564322517847312562","16547565412775227776","16049639658816915044","11772585810422839290","13554446627315405666","15396994742089512163","7620746463416743861","499006680397667903","4678789306563961631","4385854281992935455","10975775383034438156","945730081503560490","2206817278273898495","11613540674024678509","17204425419550638339","7468825366764927677","11124562784876853919","18347579587091843925","15243439657940717612","18413639269861857842","8069461217432371748","6188696679670696267","10340458524245272553","2588401519770038993","457168667970763049","10146073888758080976","0","8791494854497444696","10320844948880405785","6655070430066800979","3810416652286571767","13176653649435985600","12011137361094856670","7613515553414109576","4950634729176988971","10124083220570608031","17162617225756572859","3490287609053752283","4465786946402761923"],["1765875456472769407","4480253662370687237","13156207134725282613","15906917406743478462","9025043683542246043","3102105494930140988","7823258767102794307","14083400501696247915","6460804366670878129","365235331588173271","14588687312813480065","8137883325339044669","15207811539753887113","4804787752151695378","17191614989580552632","11994978824827833670","279237154356332702","1244099284382219815","7663620043538871690","13272060640452118543","11954222961019059959","14659394429811232985","2266313852922756367","10157449085370220981","3219432981463777547","14916338406263653387","8849254103251390401","11219409482054327875","10252197153293825290","4638247614908735855","50044616615959721","7473305291390917040","10659360535164773840","2470991702768606517","13383774820602310960","82967116478463245","17341169400051702196","10351626271975919118","12475254473791493283","0","234672170741345520","5548578597497364816","7496547055796991541","15252624736436365147","7420604122066208527","13311841221305177304","221628809382840211","2751404520540435051","12996355278977484141","16571913102805308110","11063336389667290547","13275050513929268672"],["1785523594987496653","7914871320256928895","6965098361417804956","5222338704188277690","8692508665265355795","8313223153270022009","6932992695463848","13287027054359464732","936256367444947382","1575077885420244814","16697036364528957012","16146402129346112688","18163795322387492573","4208253295911602985","10731721261830646949","10536241296163293650","18066382463485452684","4224048194265930769","6873093646075917076","17593861641049498414","6650032724367136064","2956334421535043124","13420682703696371338","3219420331467967543","12166881754651439670","201933886167200857","17090967393226607262","3438740454201955548","1978705532025280339","7115973437031605293","7028763769664182741","272770288797797274","2718798899637018183","13937717512038249819","15793054583934038542","13137999714158393796","15649826024723605633","9302510750844188875","11759461508790434505","0","1876134246241147612","136471486689917751","5627667094273845896","8941312297065921738","1823452909658962252","8210136895624730243","16563360213682670390","11165977604194324080","490791540196559095","759782726666576212","8861966823812217082","9148684417967305742"],["6988157659431920521","17662022818168019603","16072182993814939796","9140381463899645816","12061342393626880015","3028280290374759324","2056021554324637142","16228554689066980263","13481574459291935725","13469657993859392656","5321887755151594785","11149012338293024245","5822904060597334321","876556872229998049","11089376426465992499","5837463292401339811","14864331255410557026","9658704322754603547","2352970724121480900","6612593760050120895","6243234338456615616","7679557384799054904","9297945764423522719","12554195117682017438","14610587528969280886","15305311338551764147","16075724244719784832","10875852072828395940","18395464833031212055","1007819093009578982","5797883675972540171","3910415580162505792","5175592808963408188","14201665817557646036","4674407832944475631","7627656978193446247","11525891938659160347","8247579642139878071","10219514095949824860","0","1320175184303156214","4403539508486855975","16048462995902710750","14280073685299649024","17845454487588488868","92495263183403360","485889589162274614","2015481451264077965","8251862992361038682","8292812803197544149","3799968490087327255","2341729994296845804"],["8054967858968447206","11253425821196141496","8648103056265491132","14698986226828670127","4184153318055211832","5271144584905238803","9280871665805505787","13289698532766111329","814609081402087589","8145710470144293147","6354098225677460426","6934290304603368468","4829442329248412057","1692758607991018150","5091874404734311174","13692817720668681178","10153031077969254489","9871284561008934556","15439518289800946960","1271853726342393954","12641274681036217145","10563169053130419990","13794353687016175484","15977263502884892943","15506378376349685374","4682228767097480951","15334589116528554941","11968725134273279991","1100466924974409259","2880396085493423116","12303524756225915736","9518033581003049435","17409212619176087014","8556017103152715527","2425488317566331439","5659610995240290585","5253018230834031289","9331352465145475303","1950052388303408976","0","13815447791995390827","18370946474045817412","18412872476440248708","1298465075956413457","5933514105799339137","5291750735861881670","10653851144297997648","10114869317443912324","14678531503971820912","11194919652005577036","5999929573360153457","13183411447511392687"],["3816854377344651640","17200444521077102494","3962083616553336966","17863418304761441424","11843467649859446556","18214840076082196558","8496006961075630574","12798496119343672515","11877241211041773620","12176371780710298803","1144490078261063321","11903458085383622206","8694027022704219215","3249467727750908909","8067709801027065167","5444015734414266204","8124029483602056419","11226458472823906506","6000133453070770464","11630622438641376925","16760649005268422298","9614059333713576537","9258671228359869357","9874689767720795188","15335023242005247028","1579070895710578075","3539792166799768984","2087307561852584293","7121848162729909681","17005498979862820846","17002660974026871262","3426821558913826115","16933379279002443957","15064419167569451750","18254021138108119424","6503764156640765555","5875180455468544686","3183426788202062367","7432190373923647494","0","2181313359515270495","2947019807633271319","14777494592185555446","7187087578521986092","12639333237529178639","3777677578845650162","8029928282360368204","10712413941729702555","9037410360971339041","7483127995930929755","7918780122865493735","4754430263301860541"],["6452350552974719722","13877939970513679321","6951338026548431258","1195265269447434485","10274291821943076187","14667123499949419648","3386007269249681269","5236243927642724979","7523043830655770303","15923290428518250723","1201251471434188760","12299370028724843117","10579701414324163830","5383825276958708576","15090778695969870568","2299374856591057498","9693494437266550563","14494909918956380502","14301981978747777759","13250516648238404956","9499723554143116292","253193314259936978","10156001823060006555","13512998743434992114","460544407948851049","11313082386290127683","6506267031889196873","3037551836986782004","3178117340448584105","10994610489608848908","16350434934369902788","8390552484028320753","14513233101119743545","18130895551710409337","17810143825261191139","14241999790747108612","11087966440987728154","14532157683177208078","10386658915785348180","0","16646430717843233049","5768280635256505074","16182072447443401499","1632051390166040463","6879138180995701508","8112415779832817107","15268973477787541419","336647719677086430","10601796986447559211","13583928681558456674","16396491596710045995","4437992475683585969"],["2158343658842873931","15996199825582378948","16208594483859244485","3828250939858969843","14124210773128827568","16892600768439826082","11110161118809184292","11386559280914785445","937818915515385187","17076664729060922872","12534053644459252677","369327418234368268","14694321118580604012","14033269150851520641","1492700354719464414","3854069321241370819","16567206110367415997","2410099598561925877","18373996272997101489","16365402594922432483","6662246249419185013","8513952988666605087","15868104888627534012","5191298701134530558","14983224886698428088","1510972368182201145","17028787350124607355","3829296841827671289","5039453869983862913","4957623565762861396","4285374449116323504","9055790905095747924","481978249338825550","15265743159112204189","11543274485208738471","398844469764052458","13648172654803535953","13266126104899519691","18272970006984518276","0","17816507053534284884","12799073794022628508","11920928792119419850","9901873097950243738","17457431534518286144","734775767302474572","643329650845855374","15713882259347584231","17624689759132785604","4833007220197014751","6995692686040886063","17151555638666645259"],["17537354169607160879","15000235578404905196","1072048073573910544","16972909713473196640","6569726373472149513","14527914358971606748","9859473624834266874","13020657322918112771","11038857692260452828","6841254368891610147","16889168713264702601","10678990376765384712","11880786329735681697","13638103811651804919","10046097861037752973","291420767036978373","7640596278079895019","3582320334387255258","3366753317412411582","352399304345998409","15311647942403885780","467698632104927268","11398171410901493951","9117454858385319885","653971121538180925","10003489015931500426","13150849425022429321","6671743253293351304","6685792237791042667","17090471606329526409","8980885558270416423","11126250928157270293","6629279705392355481","14430653495633332926","5105435705301677055","1338216505032628222","9386831042349947471","3181216314691905558","5466860336093117319","0","2484693865170538343","7284725360079903228","17965083390367739482","11715421615076954942","2223763246708535456","1667377406172712547","3591582936110011139","8748788320280795289","16796027049487898295","8258448895345865259","13818385923266148934","13378226067704168963"],["18146869956422705376","15917317337591084","7098485182108918352","13313939060179965955","16575511973176674035","6682521791325619102","2445915676599533485","2075398073764250763","404247549240157217","3553373893212605466","5641769305923555392","17975328245991417382","13028635003884397225","5385590515741826726","10656207886076250606","18105614201365297165","15362548665204039966","4117983251775625130","8315827935306942094","4163740761729560762","6775047899266826198","10942642884656807941","3346596689757048215","14581996630583174740","16329865394053160950","10609710455521352256","9537875975104678574","10195582164127018019","11331602859471635695","5006258662511532313","15125823159791421283","14369748688290597964","10206643708338678336","16230679420069538183","10451116515745252162","18177636234406758793","9044706489374282056","8661493079273100491","16508756088923539710","0","951084524747073953","2928639851554552373","16822874312271716784","2090920415064909410","15233504032143476065","13571378211478373766","11858167356397354810","17575484589031874848","11506684239236343761","12395957365318257952","12012132563447076618","6039878604070073355"],["4781289395122020570","10423102384143459009","8000935180407113036","12586082896235616657","16729536879063071494","7407312414161332913","3511821942824285163","11690375516819977816","6146728406799330234","10683896546766264015","3749492897836336829","7540318848577567857","9233363849211496130","2438976216411312402","14036159120327524300","2426501812827959988","10692546556877050802","11722981557796835865","10680744700704866573","6671084542752148542","16972340260627718721","3244713712751338546","3107915125891762885","6174316483287803958","14145591342747796196","13797517645060644988","16896870453998623053","1543983161217018193","8944039349034631979","2128993944770913574","9673200377782319552","16546433591333335707","11582057773690878690","11640550273143054370","5870691060330106366","5877630509085234261","9269047807769370690","8786239482090529635","16109835994042943986","0","14453147724021175914","14749737407793295176","1317850574766185715","3394446653136414164","5119958190114724265","8189777364895848094","12013996616697507229","8287078880741219028","6318315852021058148","10828354374940002921","230595929577572839","2553422542049879272"],["6020013306330126022","13569552924024452988","4108800331887240549","16363235050460116229","3013756912878158225","17655398481722687890","3413680877849747414","17458156877001957251","1366391432922658394","1269664756878493471","16378813734315910119","11661184959055289548","16848507195966504722","29950628667981152","5192133320303853619","11577571623556152887","7719952513082242772","3902441952291890353","7976347166570126796","10666817672925777942","7988881936334186292","12220207391577785023","9533500094649913316","15311286173888551394","13967931296589688578","9319969633644595223","3767314282689987520","11457325350392419670","16243627432523309407","17691011862469871473","11134525472634383551","10290412601756145317","7543100575171800951","8395786376076124956","1105026577738547141","13166868826961581398","7061769446890931944","16690090514731809559","2980625458189190140","0","16418230054816823750","7913710501193611638","11865177102636640803","10465207272210167719","10308928409252943116","6269350089002083100","5638066539339098925","12197357261979136500","5241231095311719539","7398891105784850157","6567662564136765179","6604202353612746433"],["8453702952385538121","3978005082621900356","1815307108093601239","13179685298579093756","5504260513461386854","295682848584522015","11573308365535610133","15729814455469701359","10490740689853983532","14408191883812257301","9905663284820649956","5285404418790188433","981905928173686001","2221908579674224074","15510220969454859737","7711595769811048220","9267699643545136731","16655320668531730440","7668068335061303078","3342859450928500397","10137216511163591773","5153668428096333945","713933069790721958","17654268036471430380","15925216331721356172","13182748266173035845","9607619127420525918","2578757092991335731","7544285217741591880","4323694664932742652","1869294161046846590","9297865015375018511","18416995448231244317","1327313276040786190","12120860254390692960","4730463811797679559","15141654203480906801","5121745796464076347","2247805414223124769","0","7677262027350542154","10124452588316251056","917431366623111918","8911940651056906239","17609810327406213437","17223034423027635757","9318414744640483271","8406410688005697753","10879563810624167739","9239198789350765883","10591692330399266655","3342145447414180643"],["9867236548958062671","635825193475688610","6956652373273130570","7689367440387273593","10352132711328039968","17542960389572128881","1937465048609518815","7697742530294437851","11215546954980668548","11636209910131018658","9331008826050737294","6375523964055671892","13914933797840317667","15972721533178456783","12284896650932904061","5691395198008139610","2478166239872179325","4611291691073751486","4076431733929592690","5172248096440250326","6171701944023652711","6083325655010275134","3647519967301008674","13499340164912383209","6215864036627423088","12551432602516121002","1107247760611291210","7235973150206265981","11913127699939362098","7202204398897759651","7586687949212463167","15968084704459906468","12560672365543514480","17526209444894644347","7928030413057121370","16140920659863425482","1018837441161530169","13168124896022603080","14800970059403064612","0","6139396522628309556","5411864187038168946","9010704842429832436","12816504177524951744","9610227079665413107","12920814434756585537","4500124319243103277","2767710968518005648","13399118860959969106","12954050878277799352","9535920488332854419","6523929740644213656"],["642923345817846783","6628619637247025757","5855003729628897305","1791890948688775197","7012526261405555082","11400767873001168606","5488374554733916435","14464237039592028327","2787419969872057322","14168069149769273789","958980507081332944","12404212712792349338","5113039706152059894","337977860205462715","9636344371213249555","9881541826674276862","13256938152682591386","3248232700001889012","5880818564738993224","7508381196320242673","16921288259341414348","7642326617887487025","294757335636735056","3199764953596426244","17051061774645119278","13287166820332719562","8975353733485898412","7154901899754487936","72244846173901591","8069046326512321259","5489405195652317316","8140554680648573743","2149146363765582990","16216178202952019311","888726875888772636","705956267623794572","9730999482699260494","13048683520396813543","18195760943145899813","0","18426672245048403523","17471257963799306541","4396037257628498628","15251111666514667632","10014948816963794821","6826218187908554733","13920388047310643436","15458805870697007158","1824109908724757498","12176093929752882803","1889516576770346545","303097514318173342"],["14710416522767077513","7972938230349106618","12237929462498758473","17645887640501561579","18159051138062694627","13405712138608059328","5252558573743413135","5925948228566763308","17839022683992987282","6465388029086837316","8216237405855827530","11143170007800810082","10982234696670959119","7357879545455097192","5749940218752466729","9931306068852554370","11772869582440333032","16491051844642993118","3386299530149415548","8064019336014446935","15772988188799261664","6864987222858028313","4161451023232066075","10360190090198894876","17766307245399224664","8451402347167031582","7043700847059665707","12915710366076629800","4023005913118668061","13584185021226179237","2592303285738470558","17699700349742420147","3839959454626826711","10112176735458522648","4311245874780849649","4634831297556437448","13872543664117951964","6401006278009419134","1491899804685908495","0","2262715221204329604","14399968690208806011","7784469882319346956","4192890237702113346","4314366965010098233","1469249644421882802","17201876341845082915","4121104619459344674","1406128278591829117","13413063819531597974","12063457805511549794","17298684075053926159"],["9015167306846663283","10376650616565460236","7197498337008003487","2540846554546927776","5525273405584330531","11269306950612601103","4738974076907995794","4874172742144132211","3300236685064817943","15960979824891206522","17971623335320763446","13667197642367565099","15626698702610341789","6823406160974510445","16877436396737409392","15618648224117040082","1483416159689757639","11919698268151327459","10824075337765953117","5888513742487313406","11937675167461674041","6011813050882646317","16774158414781742848","14692823386439092258","209966065872514741","16282465631194016421","6881514660845058424","5627079426249616029","2409016410336686838","10083670959395084563","8716936471473147188","6646010317323239689","15314692478253590531","15804637236609896132","17057747356119995029","9015988204489959000","17229747274022010239","8830689889148787683","15058462627803091314","0","10739874699740072072","16463259779164512056","5397659978004996844","13573638141456847569","12935654589383511972","1596881040069878664","2424982027729806137","15382532199328553374","3352378737594649536","15445154870778708425","17804325853154361916","3881816300491828171"],["13928897070658746338","12456000594764222894","16133036454751727548","7185718620212947898","8080029386138991153","14722550137312077124","7839607633072824157","14089110987339485979","12095098904986642915","15852975178250872008","17964055009393608969","13757528459922977918","10401016573354058824","7876658132730284002","7644709759531912881","1023426831620926154","8048897817350661532","1519116293552536365","5171412574122099358","12298025455033005230","5560194810724727373","4733513252994339202","5548160587807840783","14424449099002031471","258858009042796695","2413266035940804441","14430438299332268236","149417448764449616","6661053560122656754","1892839067528140432","7449540317274487465","3297472126381683638","17624023104074153483","15064067705581731496","4240133575259634141","2969210140147119543","4034660529702845753","8553777586855113948","781119160665723189","0","253940288256391944","5202176668298863012","13603529551541092313","15611790402649344790","766112930881873810","9075292004237665556","8216529296598180668","14222638744367840628","14654225530656797425","3385844211049416571","10513140015914991125","8011337402799010162"],["329754759123841491","5504976905682242183","1449540826143095232","663889369312216219","17729373346312981589","9597637222025956540","1848427732945309462","11221074356675228834","5715934695630055342","113341935305686605","4191172956230554613","7398745776949261455","4525470291352800113","1659174949342791777","1736470597477370937","13420981266107944365","878458051366953358","10706227913434464251","11356389645862318975","13985207226771391670","1721210750836610176","621655603776999592","15455733049624197948","2776418531227069073","14426922838051382928","4137324088433555882","437295053370798026","11264049987274030636","10953103189338899507","5934760702550320588","7593502216463719200","7036275126124188367","16306569200907974620","7296751869648117844","6339783338108785901","11972083429493587519","17267304593730570781","15515899069897564995","17565911619311978339","0","8676237367616685168","1760626765708391877","5155601628598864349","16183000243771132907","9902462190868041819","15893370451645236798","3175851865071546169","16725200555812718290","15647846025855750897","4367094100345901744","16553476894031757171","18213705265912164860"],["17529229533211451603","13560891409668538695","11560361026588566935","1501311052229894267","16943037584945697197","15968477685455781217","14295599284495831667","9482671767962899268","13795625128889007157","270044405737886593","12105859747098970976","17977328406979999324","1964781758399220377","15955464806871324723","17808994710245993378","10511129209732720906","10453105556545585783","350301743494309996","6795255690354405688","16746508547340699638","5606075415624948461","6347988301085424780","11544424615226955724","10732043766028352195","16075399508961088622","8238539311479848300","14561932037706586488","8494034243304805505","1941661544404238801","7242643859558995059","3440614935623854692","13388023689068765781","6818153275495533852","15704515138044995534","15070957490899963567","12870201598158760731","3799069844528591839","6544415965028899981","9591291838270192747","0","13628635214879229414","6374854318363078438","1026350422116669898","1861598244687731178","5976556034581156917","11734762000902662897","1761252493340530546","8446440934395132599","2343393937022210886","15050264356924498514","15942381005735338091","16892949068506331326"],["6689025541915394746","6213783203898862351","5447337200656423857","17181297015352960786","10869550707882166098","11160941880147956767","10825263760159450689","5292961324045832781","14966301912751158313","1220521746928888454","5837142636742250677","9118336215899847182","14453874581077197895","13523678642301741312","12841522322437880584","13751198206386121267","1594430909970795733","11869971738831423334","6506119802375647333","16608570896448766946","14335079378915243912","17291364022850886965","13023917530308789956","12171644078083226769","11000224537277675081","1083127459338297415","733491284211249659","6675975367253711513","13945013088819702969","3404873596147742345","11359810142722394965","2628026299129565943","16724062732296217605","11969215743992147774","15202825527464516130","5567961705202863065","17224581461609885875","14056916685343021948","15271647700465943496","0","11569641720341807137","9979729663106191483","7166899126072872584","11862643107546213483","15920294985518298661","17633313818589952742","9289465238753657497","5593213750303109738","9425791938612290704","5410312932815803101","16675856868302064382","1007619008816633570"],["2154732167972234276","850170160958315246","9121740996981774607","5926465458372687600","85712702676005084","16607441487093203865","16899962633258973290","5161065309474497504","3919060424162951443","8080569187762874777","637412914857730675","12754547003788348875","7920222059488564244","7452998204016244086","16200497320910118191","4586396264190809105","6174192595699946719","5456655394133732558","13716212639861202050","2282871556910785109","3817937640910459887","9344610154222332337","16678435779112629769","10073448762814404493","8384139533945953356","14893217425197891532","2112122150367231791","13334243661167991119","2718860310696140088","12430168503449786047","6770196260734813158","12578508202058850708","670481736049968052","2096480722822364347","6353681805268106298","16503407645439906817","14173939264064690158","6964976823908768181","2119692727991255684","0","5416970994272772850","174994920574430398","13193567016238776076","12858646973931761400","11052823148137705802","2524819978107238784","12272882595783894708","6393601298124695085","16486628105668816265","2220390631050168908","4634751381830288019","1037743769430405644"],["2510636006348912116","804823604462430297","5134295983058890850","781613484167471206","16406512643502707479","15335750765452359263","8188652695336410932","1934148607951588212","15619243303193129477","2758194270077728438","14488921430549510274","11336795193268439088","5103685286610679583","17606832149012166004","6277069478186747150","16878300379272473646","12324331522164622281","13639008193025368642","17654017505441432587","17284940580444082544","5791753362829947035","11896090695885313034","1682786652619683880","17219395855802703315","2559523652877000898","5206636109825272654","13303983245281153457","7434817565098935651","17494254895478251027","11215822283010871161","16308844865977022483","14734936181360515613","5529518210519952533","6672927409184485240","15935302972644803226","10050488339153173372","15233815423262316098","14216586627789963782","12219020046348278623","0","3607702458343390590","17956954449967283938","3866357878146240767","3287873950686759488","2321602787835003807","9857447415689845461","10784004507403065409","7176801997062931409","13745226103651465498","10000687053021061708","1518309034455766691","16166748214283971724"],["8145100034089088966","13617281124097176564","15343827615041394704","6454529724145444319","128384332090133638","7406478723310668917","4271550729493437835","6821023671587502102","18337993823615111054","16844814061244377870","12059915140949141891","8861959436103989245","15933743750629665790","7016249194309654977","15862042537241314271","13138077653602812189","7177080470536670770","486999836621682076","5546188461022129273","16043555979021572703","18235360957722708416","5584959204437758375","18376026265133739624","14682548434974199512","3432572107527405399","15342533178881354559","2280374258016953497","9875716523687427253","13879022466658285470","13970599263007919398","15186545869170867031","2169527418725423476","740549593710620887","11758104984151633959","13290870053452431518","10143405047615996474","1333296852543103278","2510271122067842136","15472529270205470459","0","16475377565409140827","132580584121287147","15549538473201543366","12848709118927948821","6579473589241496220","3049580976129497573","5293360752800902033","6585400350033916583","17489329338206933459","1550755579778514320","5389500654975419098","1511683363754706836"],["10483390234063855096","10857078420397403402","18279837226041790396","7445018119651479858","9746426125059294556","1653663147387341575","4091164355999527476","8637308996750458208","7241659355661017050","3340030235313108316","6062043523694386651","78488952645195383","16985419028704155951","870014825510467223","12976805591959989983","17363529962769819922","17440865471625984188","16119330959169417233","3926935350713611863","15793140666404518828","15816650974343879030","16735171551425619982","4936649043415388040","3083631043832748318","6650201760670475317","7487161089552155069","13775634832997955603","5671565051964762300","13343716226379629312","15578355378317322610","9192637118232983912","930772483078004895","13063644035723488375","12285557583983013812","2616268666197042617","6132544720348890787","12910993306611465155","6906931231825287734","5544033803026803234","0","932616407052913040","4887532699197706964","6160250677346357192","9686202527227648344","4378031858636541624","4605943696147309759","10360059178849147530","6994340976626882217","13959450230000079439","885539761036020751","14088009281141141570","2026209830601121642"],["6728048371633242530","8053876363007510698","17383701475233137733","8091476845886390698","7048511041635623702","7935197096233261343","15544989502334630285","12682741588827134645","15034795880418990727","12295676546892813796","2459408881746261785","6410301385679744704","4321810054150842209","17853591843436847492","792358811395848426","1836645257896905055","6099565494192871645","17737392186624892169","10788129482514198632","5044926569793737841","9370497216861382274","4698925057627212022","4071141053116287299","14016055844660082328","11213030793635590550","17966872400705381129","12938475147098591048","5464806294574482220","15583860091102441226","13325292142330258309","6690952158873940991","1591588074586318955","18272383476833320909","6123796090486842405","12942122071875233802","14745997304639613961","10548594619159324955","2269425447692311169","228437315871126619","0","2806936118713472028","7562927203859470230","17988193412861983062","10814130309372807828","13476373311776317778","16799521723556604245","18121130097201445345","17392233746794478316","4705713193470021210","8006288057105280775","4628848355241794223","11564920266387604104"],["12667696567808647530","1317773942242459771","9869146744927840135","13231698899441269112","17185290621458693263","8898133244481471840","18264792422003746129","8089527354712776388","9829256485433555721","10929697688925523640","11415265939514703477","5917074963503868461","3193644780226405012","9286081257576791774","766964407204685977","9242090179379809840","10875206873542566071","13032293337735807894","9186351460218501594","5981931270501871226","13322724357604377598","11814487818166067189","9451059803156858277","15282777704212253510","13058502310548230059","14782075769472672354","17849281157993451904","17070284531575328425","5032365367700907187","7603829908165254235","5962709696151211324","13929017844130444383","13301808585674159540","13504011745847582172","8221821429478505993","3196865397428218374","7854154579711202878","2906028038334008403","5536886615426993957","0","5434784997914145033","17862381082410695540","3079367820319590622","10391893931502646940","16962392413860418946","1214382485872074887","12979179659285359764","9762849597203202444","5051433126536540858","10496016256299211150","3491189333999214233","16540364423626435427"],["17244070642034467120","15592216142318258633","9312099236529065193","1627224004483291941","15619005294541831700","18022784832767489717","4732148490708029900","8200821605409892192","5966276513226063987","18292296905078871779","9185761445613731542","5424318022029791181","15444977148358169306","14395845091419226021","15820738604924575915","15154338763431023798","15048385872175146315","6943942161612461965","9409560262346883969","6934518794573221494","7334581004725936818","14556182432498794699","8450755645247551647","15670833125383834965","12388224862550566790","1530907514856820288","6216997420567213477","563347779151522817","13851211609657529036","2572152425727765687","6017246831412144994","10467192307418389535","10556327281868994840","14311443707996939445","7937647155350612734","511891114577580014","1600244200738372612","16566132545374934595","13646668914034471437","0","17146692861513711674","16844018707315147517","5758171800893252611","2304499439232597369","10380665164801193409","5109915721925841988","12238485850373809293","2568679392711216677","9794717196028072274","9623575449239786355","5359701653503307106","10289035876918471937"],["16612318852641745579","4885529150529973976","3789799269090378986","3809522876694800260","4887182222215376808","5593930234110214358","15945654273225077982","12919905647886798255","15227568884264562623","14684204416089175373","13912310451546239107","7031975526691419950","15393911790287606585","10548502812033058738","17146406086366929495","18200336952481964760","9953529649966636102","5151758552652687276","13159596134469312972","1912451449846282488","1587722933806638664","15770115891430692663","160367387872249475","2342328724692278338","17597927918855131132","16692107829039419629","13744263373127899232","15243975907807058461","6870559299375803982","5117348670737737482","7390457777194770368","3871981842277661339","15144062759767380261","9298231478806901396","2607387631751800939","11383964391750753983","1766912193049481257","14801774653352640112","16058243625487946591","0","1559357922407332885","15117655723625253329","9049486522267490964","15084136979409007855","3573484850603232396","14851959759393187340","6994779298940622401","10619330707841033548","16779447834206678246","12509293663995153789","10137604812732178639","15912400013588936464"],["6305797134807463822","2456725048501623370","15355719154720336128","7059805930645137257","12819349960850773542","5055969403999417280","2033495244684502396","2538640725822806871","16504431176918198512","1070027006411928835","10523466769583998403","8892780165231012947","13019870226519153496","5672005834182190553","4610567151997921669","2388277924085483401","10971858264944837634","4267545319913582399","4481574629200358052","17374033517341247117","8767002211215875532","13671103578342806578","12849752365431355669","13188028814544078305","9221008431195720870","59724136853343575","8282880025025036850","12510999165919894147","8402533141602900985","15941052631699698422","8134405784520837744","15938329882354188584","17243088460915678399","3922589242595879348","11785606357055896501","11691487263005139251","3819829884641782222","6403062125575149929","14222570657719683975","0","1270349774281922473","17414191746611645472","7115002304804667895","12132151157497134698","15433296774705609378","1565144707747492094","12165769456897191191","13585559631065852340","9445228011991924586","5220106361144461304","1123079479259057575","4086217955719717342"],["11588574128423138094","3348919421908478370","7620449721937951310","16277202305748178606","16100921250411216938","3440398400497812691","16669948049112058623","8308991328320512567","555463255757963920","16670358417896981348","14031487234733323824","15935174947448418190","13101691928996741781","17932305465981631646","381580300240173855","16429601296990760809","1622089966698458060","14482008532018998455","3635188942247626993","5325043071067850521","4389957663429079237","12480033174582098321","11347147001309827848","5527067537025682164","11683478498394571332","8875904021668080147","4415185909730055326","18036772060138896940","7278508236452568654","8294506342694349521","14516885615588090598","3947011792896287309","1476560417363295621","13622616974892796461","3161359436542687450","15598513405601984323","10553167311763965188","15485806021969998018","16396670882177559691","0","17907745500226246203","17474119988055043056","6459008876768598535","15593842390709191898","7669061163463468659","602622773515291113","11790207780951889739","8572904154792616770","4517961127263549744","3810711360508285367","1339369169814668923","7564539382500621416"],["6041952864154745018","1860170936548435453","17226423881707743750","7223930956073786318","1611415420908262442","8200286689714366551","5474729306367682802","13016832393248967105","7724184603001155029","18441811996598745410","9525711121534435427","7940071573254008426","3449842720795381185","11853251998052873038","8780538299110204514","9304701397159585614","2356675305193899596","385687802055867918","1591085551920800595","9252380233504500004","12177378078306956329","17994093231659154992","15503739664196208934","2644748365003501336","17459336338079688502","8709195820029284096","1573269215475976438","424858596581632683","3823052570817221858","7491472264266894611","15636534469260368558","16145690172323661970","17246959090570206735","16308222348953560937","11423489032102604741","1014580307359262850","3474431590435548845","11760724742756683078","3633593033996205651","0","12091139459664438295","12641582276521063696","8818817651007238093","16676501026229361252","13164906726911277966","9096117647588588521","9931266216646706253","10810329158205320634","307796774557051094","11063531321111966748","5815878215238648243","10111796029161623647"],["6762380307664400920","6015784440998901925","1113893576582055563","16758959765671461941","12485069561304571855","17358664141085542198","5977051536882365883","12337851351454773196","3356284317147279640","10392812210795240891","15447003228483777578","2543525620848016288","10060010752898986453","18273218868379184376","11802201454184454021","3791460853503823341","1362475157698091062","5147703377126748198","13334517674218637487","1817721894954982935","11148285751721030109","13825604580991835364","6875512099135348165","13001081413271606631","3893432314453703891","5479755059792586879","14340252334613327327","11807103612896224980","17233826909260483558","2546919070178376424","11216497733210043173","10112536039428363538","9833816808527020567","10692760070964882073","3114325808999543893","13646690201518191739","2484846131267522505","13634312759679842188","10761801539447029744","0","6674106930878704811","15250918176599862650","14973703843413399956","12793475726458178221","14131702353789830258","17275767342870386722","15681651690617057115","4480177012769865871","17261075260529834780","7791975734609005647","1900214050145886912","11581623672852744969"],["10084201978874127648","9568848314221888481","14950983380404179518","17990668209823955253","16647551269436216799","8016508361661846412","2421070001663039855","2096737678956937413","7760728518422520088","17629176305363405066","18294007008124802436","12400363656254126708","11221481998846149446","17581166294697903191","16302259090304703872","6285965331787589287","8411450880947735610","4163562904053854611","5695622408103293358","11348633669228011738","925605212199796992","8374447822324850094","16894202349107782022","14384115385370979958","59136537887611740","15866637222319988030","2180759072393949158","16970738860632278253","16692952662321318306","2467993228090943876","2562809262774749359","5542611035151038144","15044103411892321425","9999016809548558909","10984828250584890303","14293513732324022321","15070073659554729955","16924269217916294888","16996023071833215624","0","17465795368804204141","11712789648145713760","8273748845595097026","2850981723283000153","15402798683133387967","9774872800314233863","6113809879387613515","12209775867935068985","4172726549032302224","8401508688644298021","15432552422939387053","15839520019683554011"],["5833471735368322298","16995698496645672922","16898121064752237649","6448623848094956230","4372076899061064964","14618668995747725616","16843974368383313721","4870542236988212649","17045804613654984923","879159435814719503","2863226166266850533","477333557143060489","5779593552883675551","3099476814542082116","7324805627377722939","15512952269847194203","4223147666069150433","10724196891288544033","18079102336189334515","13938039294810372453","12454944598723397616","17558526055672493303","12372565844120308545","4176861429533921595","2125113747489519036","16688927438411663734","16246536777805183342","13686825282557470912","10127850250553372120","7630383458504251491","13453855135389036321","17694419660435637297","12401363353401838600","3484049019224561245","3799426686929296126","3891859459859756136","9190268976197369626","13333358521776524886","1312591079045558651","0","15053213265512429218","2337950555305865962","4886196326117090899","7993544685454683819","2658827255546859184","10999007142744106100","157994580517191326","11317958391307103090","67320261948639827","12486032757958997610","18018822802590178245","17810140486828869586"],["134660873424857076","18442694901227712901","15350225701480454847","13088847720606899205","17509323991614822772","13918551240540714593","8867635631050158115","15970769282551346668","5442101971443649275","1016408184905590425","4482572445803973774","8620042466144848495","8150689011763850649","76526735785607609","10455135830804667472","17528776724410380230","10291164518971911904","8179429544433242235","13148637447419715077","6614789035686274531","5367065629783031949","16972109784004345240","10593250718334056985","8469489275347892509","6991046042838962029","10926022820716023746","11248454653112944239","11914424953922417728","3738156762775779735","5901964826490369711","3530935152614748196","4613762120091691021","5231987981223172400","11034942827139281585","10990470139879607276","10413672641641566308","6101975289164967236","791777953333057135","12532373905816631561","0","5990801738358559897","16718539446679288081","17923266628489729336","108933979458795792","792406080504543965","2862627289135948522","10567233747355749974","5198570027021404031","5369753407035062914","6635297024998187806","5486574351701961285","5044291168957368595"],["576017086459482810","9315881719018758973","3045186933609622643","14058412732263978203","10460756721560554772","10700560904262532754","3501659129774918310","7849353407805658265","14501084486799853517","11852023144330312021","10976966260460315638","4267596668477443849","13136458816531661897","17632931451395220","5553740560922689059","5348840694996881275","2366948566128454086","9661276080978415345","3956720399597215009","17874158549542154225","12686964066342146534","7585589136077795885","5564249306158442143","14036177282611402251","2180881819135573598","7881162238298737779","530583979323490401","6960270526603007045","885569283557586221","12407401750426558866","8057242227921092492","3498942474801380828","1357275004648822246","2355281267621508450","4692496830020873790","966533061080930682","18436914752484655240","11198814991797095459","11713111058914124764","0","15291725871616238936","2341647023103339370","15953530060571126330","1998410809410524795","10447383981113550446","17259316793685885868","5263215279358803256","11876027645734757192","15891353677935499047","14919049069506709604","15040514683308332985","5701323495393921824"],["418510912437125898","10675264924154115692","11766425247026248265","3740439550059461385","14848431942998462513","8148974455276187616","14421062397610821140","5378049020485121195","10023402546085365655","9769977348491088842","529053065061391432","6157543860415502892","7095234604527581029","13866032310581906267","12292780978591456404","7861818762853886570","444272925119489956","13451040274566275008","13794528135478751466","1494483369445479426","7396673747758095166","9120351199416053291","16784266789502622716","17232744331021681213","6741720129689716655","810794948776091608","3351665841107941304","5598823600726313339","16027079592984624156","2228499693211625599","15064417070022872668","10651357780876249757","8193550909284322132","4978734516809896382","10739026548549094201","1973432910186987570","9915026590099249769","4931019071096166298","9372949771540767089","0","7748202175020608923","1271395674131293419","7307771055513270497","13438837247116880124","12550885820616742773","15977077653568029925","2245056489016184391","7888775044700938606","18019648201344924275","8109264589226970763","3392314207383712095","1318175910443674240"],["8285643450180553072","4749265165850793200","11782735527743981248","2117994327431192715","15858651788799356049","5848040426388887622","6848825596077488426","14976429833596713058","5741542288583808869","903303355593027388","2986111156900664503","5596424639403386212","3357293484825264602","3638355514378647080","5061927499667148632","12069312020899661786","9751876350099515318","3562067458037939014","6377353868489336907","5441250308256368448","14918836395765420827","16736050606387536697","16103371268672959027","16327137015760594971","259299785194855946","1877544148085649212","326739057010693458","13689643763640280000","5925790648736092259","6206241066149328223","4467814435355796768","7254584356244663867","11126182324699030211","4347812232221202033","10554210513364113357","1617536086889190990","12463764287806934806","10256723534604025625","6833937400952642070","0","15239355550884404193","7150169785455946961","15736306491299572630","1731564876771206096","5066773964492196912","12286838379080649193","1145036392304585533","8873661179509158141","3945086366180079456","10566499697296737699","131811842314684200","14742808148122487121"],["10026777836253496781","14152674143509270787","11162969667533362610","11962191727280749060","5850766245207969875","16560093937350277881","10254455646620924584","17208642519804078963","9783858601478789526","11834574438327766062","880255617373765793","13144594717401631278","1603311205003246992","369590085605782153","6542280940788886725","10088928706765737344","204551436333429207","15061529658632938190","5385232591372933997","11888810513761706795","11982144973157234885","3098753754775890768","14893335938461957113","3591934902978738517","5778120456313164814","11609417783500152464","2422259091975418641","6983555839848483906","247359176107875588","17453090490475107830","15967008362415336836","9411338341683796690","3929684168612779132","15224291255942875808","6557154470730497872","4649074076291888979","8229847851856276223","1563046352071966067","2700981036453425891","0","669858262800782528","14107540610767065295","8354960968375204808","11779830570455242437","329169574177591677","7782735043642577972","8877717330765541916","5346262849985491068","1306272618726036086","14607343856838870712","7976298388646767059","17783814079658894057"],["3172331858992853456","2848068100001366317","7512679131638632889","987848669668650392","9451255383042149852","15012789819040754958","10835874115599436972","5469144336366564042","9372417754740102060","3145241657763945011","15243935254316273112","11331445255303454847","11260739272878723641","14142390985242113667","7703729226637365647","14019079522512763844","8098856257100477726","15675165112408932852","3403011879507884530","4637589373895425673","4578176750906217125","2766954309898972024","14958451356790950853","14491163522759624765","14002432809732226968","4598487617495982956","4860327376798204925","1924436573350303149","1365168690440329712","7154833280175709615","2436159884697205420","7648038866368312384","17799658877199142958","5205588159725191476","8402225159568892242","10623757638892030341","13574957725291667149","2512100613307306667","3205616394245163729","0","1104886464273345890","4360028179229048371","1986610838376371682","15232369345154709181","17814385309903890972","10769394506660666961","9677751663798445444","15728069614787652833","1649940850242791198","17042395539139915343","2421208249071860080","2661774130749593698"],["11657195904799487331","13617249022969175189","4521223087280167123","11202137053337624322","14689003551951907927","12264013848452627857","5777140351903846071","10990192466986783854","14101739335057981688","14884632184956867069","1973004561787796412","6012615306870375817","17224782964663316590","9766358262201998544","12714397179196434444","3303105901231564470","3766529605319402157","1442445173904122830","14183620449386683284","12472684596507725173","17823949273271606083","1322690289726621120","786658005327177142","1461429476556559631","12350321294266947205","5080373270203798166","9901367886565579465","8624687227692482513","15173255495932577915","15400086066677932147","796190230034123181","10272626876609078960","3535249287731766255","4233969421742708092","11894518693791917399","7058492399429197068","8208351971472306263","6298461119926268283","13107715503589094276","0","10391533883590055968","8724198288678364576","1153416765005232978","13548891193772392115","14927203468795795267","11963389428025590237","2955158275712895877","16876008619384029476","6278839658013205008","17686355220260702854","8706635677695143767","9369806799452560575"]],"s0_siblings1":[[["15286342281745264017","14680101477326344934","8945733750316195153","9499521357485933767"],["3643046234080985854","15743894355076835785","6616922755526717275","3500945091318465743"],["3130668133637051047","16126713365244170889","3531558541056241188","10954334559275829726"],["13747984608845894959","582064036043906413","14506941326529183155","12931294061407154761"],["816281525271259780","8359462681522867390","13118353001655461803","14038960305290559386"],["4123669797929098670","15408609312082123433","3188227153975633718","14081480955157781246"],["12004737461531145273","1636133940324501736","1661708994620103197","2481034234668060115"],["10183156152578168770","13429332045567688703","3600119847353282441","6161588976497756601"],["10202385019334841073","8279392904677147867","14262632613387563215","1114803507702665546"],["9088820224794546666","8425401709353067489","8416242660517913424","11654154723926665107"],["5775821278470156954","10311158401605209275","1298766574742893856","16368186418144140935"],["5142686889362347794","8482645064899677293","11050374414356767102","14691782629668767043"],["17068904171782902567","12993711684908007569","11170456876663678814","10487960119726409587"],["13440783890297257853","10004382715822244685","6059148827386658861","13563398420567109447"],["2453536208906076428","1938988370328007417","16393149214377072047","1618834932935106284"],["15273116072279911599","14740317299642310036","9824709882967945424","1904328918094752188"],["17805573863342124347","5474351597655484963","6250520511865061762","17195965640478887617"],["2797111060665164272","7796804177268079168","3833584419110147503","13250507110897935479"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["14501550251543758972","13058221259333946655","4397473782353560365","6220504735417119714"],["3633525564744454673","6500364622220051224","16569943534332959048","6435493900671714908"],["14644802054479231096","5506543683616801510","10440472395025146508","10536294360942567951"],["7681352196146345606","7814779937501470355","16930591197318733313","17350037564468688978"],["12922104895466561652","5124281441464654072","6226432204815513173","17088390966632579102"],["2429730517350633031","17232716212862098753","1846754576486837277","15762197274870929535"],["18002228531905835210","776931343497985108","11663511015196085587","8639626296515555138"],["15835034400738242898","13177191114041270564","9958901734630279441","7234015803305106169"],["16473574484651370768","5919878825323967477","15481296216910964240","7770300485223206020"],["14203395194840686023","14131690299215354065","5258198517467004599","6278307434736593402"],["18392689147083742290","17040824180605436133","17918813557548828622","17347180485269365142"],["11407114900907022460","15542414981950612449","13718589392308417212","12103733945779074714"],["12399279411432997712","6130798154379757022","9474307486977128996","9663694391013147158"],["18024490298718053496","17897812385004139859","13650666903738409715","4290973651245519783"],["13121967759760290250","12441353011777206789","1970494330729369649","3811716510609979497"],["4618327165506906867","1824624160740515733","6992785665300994085","711005764713151227"],["18043498570230115241","9225805007991832068","5676058076955006587","6749979581782245856"],["8054807170389643074","11305480336699210083","4016383411294209710","11566096393568482533"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["15790022669625595983","6898228491110802797","2572718658667344866","142008908522800230"],["10612085890047578164","1658207401886093247","16672127862107339782","16951284000161304619"],["13294602388849534439","3344364522189961166","10571429460982520254","7796702152293308316"],["10817206197065322413","11829636686549241873","11325746921995733181","14757450840609344329"],["18028343123577072488","2197385737932301875","14661478133263140197","2474342645746344389"],["10878096378659270104","7801310807338708988","17335464959058710070","2840017120007590030"],["1517006323217092728","13785184769921873530","10535409192957069727","12499927164140722827"],["2423181564536300811","1302480002840206589","1273851959709143239","12646356736693612251"],["18128084621514289568","13926947401789442767","13696189206157369080","14025100722478440011"],["10456781930667959048","13172677724943887057","6153873388093304613","15758769634057256013"],["10716128331869705452","15910024532748269554","18417831332844767877","6108063058195145369"],["15312783845976452722","3739939992162113110","5938715065854283779","2766363807689534937"],["2791899838602912470","12672751443545910907","5738135519236157976","7892222558550058424"],["1319757728674193602","245865335865152855","8174189171097796666","1387761965556598060"],["14966827940010030809","12949498689253422508","15699705283660362891","3520196067448382621"],["17453069384574716098","10679734898416147668","7182257882719307881","14585116675969129766"],["15861046265615667811","13519517518917598671","16032550723199925650","9790449695214886587"],["6506731528528215992","962290723562876970","15601017686781944023","14214083688096289753"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["8146834673475507875","9641450126320489850","4711075113832502380","17835123442565183974"],["12198009854621004573","4296918098070643330","14117640781292837451","14069896900217242445"],["14016049491456907546","9238327972526738111","4840057317149028411","1780237202842528127"],["16673250613259786400","8511951193072664545","1768451951421934028","129714158672156635"],["15629036939491854385","9275647777167830569","15500046061507464342","5711308212694701749"],["17372931967383633646","16828495035888413907","14521733499407567912","13606030693581930842"],["17547579324763266361","18294259926497432556","12379433246313182232","3941916574058217838"],["7190002604197132578","5778161323717700267","6236926184169091377","7586702372489633169"],["11960471459844429281","8517367630954985975","18330143907407505007","16301522631548553206"],["8883104405260382790","7014268167919031258","7132706074417859479","769927486218041293"],["1328163134459898168","2909303868735142362","14822065490164703368","7951330210141723294"],["15349620821196610289","6986730977569949326","16070130055294367472","680334683395907269"],["10856443565942065688","12104165232605519196","10218327271909147369","1539606937624950036"],["11152853196005546547","4266994156631081934","17884172344813958103","16031513019894155342"],["15374805775200477053","5673794450960757251","12728053270840809635","12273281609463143164"],["16328580508772098714","5855831199540580803","3442184559326565618","10923636249904326941"],["7504994331308894526","4167931711546254201","12317222204170525615","11948500470437550995"],["7574770412072831770","15922384549188611090","12445509319464950544","11415478143100053640"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["11369775208887391182","7629126128940011105","8395728880001392162","15617238127155460665"],["8235769191185732376","15819033075670051803","9999448110308230475","17446660294081398327"],["3764910046525544271","8917814514583184556","1362595714380148788","8549728065644340361"],["7548653923614293587","5325210920677312687","5527850778950957880","12012399163567234561"],["10116256040868158558","4069258670101986871","13370376899212537318","16621077863724761398"],["10182377648973095533","8865970374267054532","4953385620302152616","3050201802425490344"],["7114708021812193131","11556868491574890279","14008977489936092610","14646348230709207582"],["17812773430674637248","3919771322081226252","10945875603097286928","1291704875393977987"],["14139971579374887902","2136999859838551555","193889574271504602","8459670982916655238"],["2413448909604757276","10587472641200181354","7582573184378790520","4780293324135131108"],["10514908601488838130","12296765243746023205","4375789397424170137","7689766165538153672"],["8501009199553235024","5610920426876008448","12365795050636291134","10243851388215541462"],["17068904171782902567","12993711684908007569","11170456876663678814","10487960119726409587"],["13440783890297257853","10004382715822244685","6059148827386658861","13563398420567109447"],["2453536208906076428","1938988370328007417","16393149214377072047","1618834932935106284"],["15273116072279911599","14740317299642310036","9824709882967945424","1904328918094752188"],["17805573863342124347","5474351597655484963","6250520511865061762","17195965640478887617"],["2797111060665164272","7796804177268079168","3833584419110147503","13250507110897935479"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["6248559926711548343","4409945515494449277","11410778510377310385","12947243045030971825"],["15331579079252245435","8382310371329216288","15236703388443282041","18383172942868700804"],["9603119503731524566","14233578754008398463","17579747450904715317","10607242638345439999"],["8280247896812352795","15110530857216991737","3717757527724354070","18266084506724769519"],["1675829448366508810","8837684077707964977","10291910137092288772","5979319524959691652"],["753830643036074536","4155683132519707945","17031711898672202023","5247319643272978777"],["7638440153778962478","1462606460873490055","10185849944189652339","1653763796813166736"],["8724554984450798388","15204887173643944708","15999916255525597182","14049792546618697531"],["357179246077852418","2442188486844872032","7608567993445861903","12344488688072022838"],["13458720567527187563","12651508615264030731","3301320652364234257","10729679669127009404"],["1869586508186154476","13754185217313561473","11759785058890093178","6766739230901605400"],["18208512162482454434","7160183019021574339","16989269658600187641","17972632963692462144"],["4640411047962616560","2619451681065702627","12281533162386411019","11786211588976930987"],["9630601326411990205","6919998535271066624","1528223043408365410","14598981782301774973"],["16184900679763646613","16806001681216250733","15842506371359183027","1181657406611311419"],["7292824881616151338","12820349606739928297","13500597320395583666","11301915164060708127"],["1233397679696888286","200903685148312182","15577187182862110121","4536864383239004998"],["11685212525270116744","3433126496135538778","10650452936122069856","11042047365036120878"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["11098419219822611460","737053638444188149","17661403539251552533","13821904743708969489"],["13600195462450330535","9756818870363799780","18204931343756335143","14933030864357398725"],["12347107841130471178","5697955047498597246","5554761817976773080","6202073634926689781"],["3909555018213817695","2240033791047026617","5759149687590284842","17300800261305046230"],["11212109832191788787","11203173554568704625","8228830457978434642","1519211688359407466"],["1933163678275874650","10023886701836075978","18322179282933275517","15215539699825120795"],["16529112857683045320","17967790453894867656","14183433396061329743","8114070135677217014"],["7476657200427975344","18070232678025878055","16441849074026930161","1140466943615706077"],["7308818288260050948","4796105749537951412","881256712354046629","13067615914930207815"],["12519946701772112957","4010360782571260200","16380378428032783337","11511912902788621264"],["15954154127949412143","14123363622107934579","3509578138082748298","9176344355898819643"],["7689839685172903481","17683219160332851763","14901509802337981397","17906263510600069104"],["14458080461619974683","15836207690453771336","3670253314341719704","14783404587614802804"],["13617383137270237813","16963008815188011732","12414166641035952345","6705144612034466088"],["13110235637042923278","606399053828851502","1835454691769091198","14971504557938128198"],["15624237037029229521","4491053949790408819","12115381623666516722","5215533654302934276"],["15861046265615667811","13519517518917598671","16032550723199925650","9790449695214886587"],["6506731528528215992","962290723562876970","15601017686781944023","14214083688096289753"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["15934140417476831298","17395756545246187130","13661477732046099074","10413446486553945554"],["14571874581766729163","5851341499442078003","16398540463272739272","4998582314706134526"],["1942587993334972917","12807049186739118272","15127486336857079682","3562854724110488393"],["15962372915960289401","12224215892089914302","18445694548457915654","11547461011627125872"],["17797718017901257295","3048298539100129866","10830495810844710488","5619377375141542087"],["16694385865505332393","15613935717180027809","8253003582447515693","9119127610001025309"],["4392985572114913638","12395829897227941507","9660389422312833276","11879045212411484271"],["3514492806024260458","14130115853745892795","8285396509990066173","11802928398529618116"],["3218155841094403746","4111253703969742044","7269592697105659094","13073656635326463199"],["10500532799762723608","12015746936841339801","5950025135787937300","12709574477649856215"],["18129664939088546917","4840313006602462793","13404750836111441209","4443519021351298894"],["17727349214297086839","1173373955178216147","13413527320022962270","14989182653432503538"],["9471541052321428924","9999599271262414025","16334186496659820454","14379106410426842214"],["4590572557688854724","9074251074194667408","3974136630730332433","2483236698456273380"],["1139284303283265706","873526328670685877","5537165325565973090","10490619584888902641"],["10287995625725596421","11447031038755040584","9339302236740425685","14788867885392144070"],["13440936272454544496","16696255596496220745","4068840962850511780","10823668318058344136"],["901928490074764917","10410969691349766682","4505716918021539238","16854336650734621431"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["11675725311616903048","4327278073974052586","10494745308585633931","15335894187777361483"],["15394551547668000196","6344741861095292287","4709533555477712496","4219445177318757467"],["3949007389342987442","17380387797619957297","13224368630495384183","3103464975551870459"],["7312099413505682681","5710024745104021337","12267875792876004786","14185890491031696515"],["9300063167684477360","8828532306939948546","2273790696036363338","8793362848552613291"],["17767107087883212880","5603032278520989661","5898142661075310727","13336487369051416742"],["16271553602012480493","1851032904704267537","5579748155648369885","14844236094169361503"],["10302043776871287402","5243193984192449754","2897983863301706436","10018626937380710561"],["11178166997451836161","6966306776079847737","4119310990258300409","11430115037053702758"],["6294111859033148069","6786989876510294353","14754098528789836502","11840573168316267114"],["18062029322549987650","2758477551909445249","8411131499580479679","14558796515046169026"],["1256388073644107549","2416285232858616173","10979099818966960046","10837821255756595908"],["7488309176817224823","13836002450549952702","10627061951145690316","1571672520281310747"],["10657534784715503204","5886506077077673482","3107592231028135453","4348350770188320940"],["6036264304505706710","8447254003489332167","13441729771499254205","318699506500796340"],["8260671535648028062","1974890186695476769","6560710741979000080","10644811212949849273"],["1233397679696888286","200903685148312182","15577187182862110121","4536864383239004998"],["11685212525270116744","3433126496135538778","10650452936122069856","11042047365036120878"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["8781449358687508870","17669029635228064461","178522452613068198","7255319931398892919"],["9471842918811557598","7522439994071898156","13875331892191519283","16916582716559874059"],["2395732594284871230","4407630171674683502","7401842842525290778","14377976068067538624"],["9409697765292036515","1416742425639714067","10631857579838102539","11457938689164207755"],["6850393211544694616","6269483123503764003","4480608920563010534","11816553944805315241"],["14664838050902935375","17794009269813775716","8371794187758654138","4170549333109259319"],["16830233525094212568","10153988640304453825","5777047110096237420","9237304207794568446"],["8554812593042455617","7604966546900922262","14952008382507817387","15791081956508370886"],["2302270888352431700","12146221638410881828","6470416776492891084","5813300645506671640"],["9268941158925042275","14902305289554269872","3895927674653077192","12052150107386939871"],["10284760606069360613","7327842790785182642","9817539517841486811","3668097688833995797"],["6958120473273967390","4674647576159906697","11205523915164228904","13665964544181715465"],["303771931913099916","3307212939427996179","9122754568706584536","909813470162387711"],["9560619990055192116","17590351727584254368","16829250980411747949","18081102992486912840"],["17440775594379511877","17191377239701079486","6161638748325731614","17908582510740939333"],["3475852996624717192","5028175883375768675","10364319682188453939","9183621513849018027"],["5510655664560260199","17658157291495794862","10689929099658682199","14389365158981329914"],["2924055083717066436","5180862646835915737","6898483271968924409","12171025833306152899"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["10292784998643933397","8102361936838203999","17117360346453988870","16479133071359948000"],["6913714982909988988","11045049283825704124","11844300140938161371","8576066528546637732"],["16150502692266387241","9997903466076418129","17395650299410963797","13955971680987626814"],["15481854288257274015","16940899266521334959","16648276995203869255","14010410382886312329"],["13673489983669275971","17114235376173293889","5171936479119484851","6062305129958115288"],["11898960076578286253","13612228664179208272","16632736579256015032","10626887470947704332"],["14060336051263484898","11909588483372944314","7486288667233164846","17167274333480273775"],["17428155018032423779","14488169180892410501","5570269598422321871","14209146901043197625"],["10822993558044585598","8189512539006658131","10268048443930116529","14655983780237835943"],["16069918527845556306","10442662620109478000","8488588485780101702","10464705040637132550"],["13494485657652436852","12077691070768475435","4096043723330131186","16429623814927290382"],["7861332578936225343","9054656308630165277","10873317393177993153","9302986731499065390"],["13710788842131122557","12459339757358332600","16197145861849809740","18009180649538125666"],["17339182194938087091","17631307544005808713","7220469250071141123","18089542731760289970"],["11521212907897839705","3370917686912697058","1679353613928291141","2487675942723474516"],["6076466625761187965","8438408940063233446","7710626794610691053","10512405841153439423"],["17316004939261983561","16072641777611332890","15216816176513351370","8818856876869196182"],["2924055083717066436","5180862646835915737","6898483271968924409","12171025833306152899"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["697330525112911842","11144272523919389346","6958507826169823089","15513958056432272622"],["2182035144742996014","12493919850789119924","6428877719717935996","8829928529116876124"],["16464300537748954529","5582814589777139352","9634024174195369993","2643021066667698032"],["4064800908092032610","8589090316437214525","8039341820500365783","1948453122663796999"],["14913479638828706184","17376071908847992531","16445740661455924681","11789535924249283170"],["10600320924930614597","18114609234757147846","6251132043987252970","13167403237201883694"],["13605060778956749628","16441632344623947654","18292360025898643709","2000339013617167770"],["7795057235613738746","6275953536344317914","13257432233139640463","17932014331778441135"],["5700605097737947574","16909425886193295235","3590644509612015809","13480879755442063838"],["13976550629554759650","16288500613234133565","6706179807457379702","9738705005291948153"],["15423998807496480933","6092555379940272402","2591391871603461381","5692912864060122210"],["10348276716437223190","8766335389800755415","16606266047063050678","498531950207689403"],["8081254676481112414","13544562365572618274","16828137680947387961","13423354316238358648"],["8559540444400275966","13672507981453923178","17935683492378621845","8407318372459589595"],["16147944381884931952","14868394249797589751","1823403042992201650","10262250505060259481"],["10028924871439249380","12742426570468595279","14802305974205234548","8931385579276074865"],["4605165587527630261","16795557377620169686","11917120160158749461","8066456098989567103"],["2797111060665164272","7796804177268079168","3833584419110147503","13250507110897935479"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["2743800077277409828","12813365325387696512","440447057350697499","5713073591010846205"],["2979534005012930330","17725851307762021563","3912777850143550857","9488051231437265249"],["637703151137003967","7410135625141877176","1133408821003566936","4790254577943775185"],["2304244631239753808","9877961973598006941","4582882860021923306","7252976084730184418"],["10814998910309641343","5105956597360768727","13114923890206032668","8877016377528730221"],["10403540470179876140","12581167634675687015","1209397200785546834","7482574560308614857"],["8743318965638983411","15867744511620563093","942931312433224049","14693280731183868726"],["18191756124453758669","1186932671012858431","6592293913351435620","5295960415874940334"],["7166999436466313662","9993978752505590938","2113155569555047901","3388704985608606903"],["3391841103556364909","528881617552213615","903525484666523692","8382544196570308301"],["14691773620655453028","539532834404542173","5894858823419565971","9205182203164588472"],["14054480721779625900","1327240799021571959","546550377774548345","14528006886055182610"],["13710788842131122557","12459339757358332600","16197145861849809740","18009180649538125666"],["17339182194938087091","17631307544005808713","7220469250071141123","18089542731760289970"],["11521212907897839705","3370917686912697058","1679353613928291141","2487675942723474516"],["6076466625761187965","8438408940063233446","7710626794610691053","10512405841153439423"],["17316004939261983561","16072641777611332890","15216816176513351370","8818856876869196182"],["2924055083717066436","5180862646835915737","6898483271968924409","12171025833306152899"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["14852411890939510414","5258269534468306338","5416711392155831344","15479562701345157078"],["14267354565470109340","18047262586467567309","8167022167575562970","11669242345035761479"],["14780294239053712985","16668196234585689956","431536435669958259","4817262562129713897"],["16435065522078123434","15804592868135850889","12297204548902664166","14828961424925905074"],["16336978834938647814","16807804106761360236","5978377287676206009","2336932698638671129"],["17967785162377780849","17443254904721501167","1962084550300625660","14109087530204693163"],["15125019621187161463","16288848686989306388","6428574176283478681","10305327522796368714"],["4957475146738605151","7218784212902419613","13234833046771963217","4571166739425649580"],["2760845528257242017","4185010989819220006","13647687119439923445","4019611146730702368"],["9320213731082185460","12434879041138168428","8672389116295793812","7197505232763233185"],["864746638935989626","1182221730452896029","4204323329032854036","5622249545276887389"],["4672216797222408697","960862401496621941","12891234137245061519","9656571514391025256"],["16540277282386913633","15766463978145587772","2799040547275991397","2317508403187065152"],["2768248552553422562","3630913354676544518","10239591090974092414","68706407258086320"],["4098176907419313986","14193560057114423878","13380824252368549953","7387360226658219212"],["7292824881616151338","12820349606739928297","13500597320395583666","11301915164060708127"],["1233397679696888286","200903685148312182","15577187182862110121","4536864383239004998"],["11685212525270116744","3433126496135538778","10650452936122069856","11042047365036120878"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["4775862578567961178","5266200128199962700","17234875645811001820","10734713725958582470"],["1054298948414370489","4589649412704251019","514079357045815441","18396816173167444423"],["7761802239741553725","16890203981713263741","6652288372035966660","2246882523800261221"],["12255360818152657558","9382015961684651440","16744106135492460726","14010247720245022279"],["6753641292467381513","13996116237992454866","12541373461428203406","8274053628847184298"],["5911804197386587730","15909470309958573506","9589837043930385163","554959928195631630"],["1899300530947301417","15919798892791394129","13667296958921449099","3884359065477049517"],["7298945771167325294","3499434221268164665","5011585003278647041","3426860404286876167"],["14712130656225272818","16185194098680237048","7619618010769112546","17626467707414900906"],["9972018179238343028","14904104857533708137","16475706333964207479","6508717981537212470"],["10912829346136808288","12876721160136978964","4636910444814299695","17790052900159073976"],["12129864854637444351","10683439370951980545","10125850444384411890","11123067890262444302"],["13670711877600924684","3610277139106229251","14276656723240902127","15170911725177953688"],["265251861011919891","5200177155824858032","8942803124950778311","7972273529318976371"],["13735528475993651979","1167683882997099260","12478575860723522618","8545583616869827095"],["12570690355650447738","18404157207278118325","17011092821982794895","8206144467820470983"],["15111479929136705978","8436886384539425076","13609901062049133966","13426005879161823794"],["4140989263178758953","11276117054686081667","16343005069629594341","3899771849479105037"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["5067572556882425405","4874115467804033513","5479774706566417174","15733308394153156289"],["13892898820916690621","3715748399037546375","18045673259846494832","16541497941510470063"],["12723910511338517522","12489727935215151346","5294576633935016875","3239919399756212693"],["1521734222511720695","11005050975459756031","3699767152999057086","13120480603110893805"],["10647845388771611865","10410638955314485896","11361268861670666713","4011857203524730814"],["6026367212214381454","4777753999185636799","10339038291561100834","4721452708522080746"],["693306729256280804","1298017237295570468","5653288984488461086","11911786535199040869"],["13989677775455299579","9468484913367566697","12776244633713850975","7180631477083596011"],["10683039117766637980","14764149305218757528","4367895008158018892","13076261146458509193"],["17572831375845526787","14899315427050821244","6353371481052661703","14566894646798146897"],["10284139867433862397","2864505650594019596","9481126826199977199","16025147827016267143"],["10300872269919233808","1159471863557949320","5740109649520452970","12446166667539551561"],["15148052492584117439","3341256180906977103","4480692387519498260","2298223110534610690"],["6118371025405156479","16458828829257359080","15789818207254185155","12744456318356496626"],["2104783142532301573","10239047892125728758","3254208504187189066","15060874382655695945"],["2235306610396740353","13029057410032658914","16657064946459016475","920678107835296917"],["4605165587527630261","16795557377620169686","11917120160158749461","8066456098989567103"],["2797111060665164272","7796804177268079168","3833584419110147503","13250507110897935479"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["3999962642763502440","9980577628018073018","2780972622176843929","718634674516444167"],["17121704374741081688","17080135396628459170","4480291859791921630","11650679484673078913"],["16484572668107160992","450394665024412314","1414280318311450045","1697897025576380018"],["2987362575564429090","5310494381231303625","14435126073759976784","7992774181639992989"],["14836752172613711762","15955260629793308848","9985996800238950702","5707817615362567757"],["16470640735727796774","10385780297941288027","14370011903246709300","4039847950487833442"],["3966861357049712405","3480917568816232014","17644489833817352742","15930575504403023251"],["17909096527915887306","12727019073246496704","18275345467073569576","15197954101749096361"],["13905995272655989324","5301053304005093344","17902581028960057857","16147184351428751077"],["12418348315421886009","15306971822692696490","6712779945607374727","7025372360483330960"],["16844813841416993647","17244153855079657588","16911984560602005069","13880081945876197135"],["5641725702270553620","2430658618328320411","13341695997997551189","18055522457417553085"],["17071225922385786196","11926729200132402748","12013267789272704124","5421338051919505770"],["1296201342419505189","16713674766867503758","17884770556293724276","3657636297294884092"],["3474576774286756097","11099802291398056570","3582154604261554438","9002817581871730245"],["4733656126816234138","8037269067336235372","3961377583995350207","17253774850325233256"],["9995179147819510961","14785399417232287765","9680814532751540832","14141701455843661381"],["4140989263178758953","11276117054686081667","16343005069629594341","3899771849479105037"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["15237821560778500685","9290598440979946707","14111194885244238829","14487048698634638417"],["1349504251843923244","18279234829676885104","12614672483442140802","4857416930580265099"],["17340589859778311781","2063063851029880546","12124269898661617208","14775803975141204954"],["9602014732222297306","12506033882517696606","9274181270340696719","14055119450218388853"],["17533341496460972907","12936120249439925735","8717649982907228096","14266844796489942849"],["7981968582986309745","3094197074792624630","13771765444490750642","10875915155557605320"],["16415916089549880566","2948170093602180275","2881837091382163705","2683308449906253218"],["5427658577137422923","1003456256861409240","11547435090197407102","12219105768901953282"],["4012916075267413988","3075222920003253425","11082318128314197488","7145181084007200054"],["7329675479835017360","7439227909676845124","8182606392914109116","6138244795529946233"],["11404780143170214807","13220230005862411575","7145573534498979833","18034884065389562700"],["2424180815550874635","7361791656834681092","18424802608548841720","16485062402254707968"],["662163455375585836","15465822991891702632","10625551447421073838","10197125633522459379"],["2736147853976709655","2332335000715979100","13084677815897563259","12654962757842989972"],["12019755312355891107","6489855202163160867","13018115266393414406","11888851594734809904"],["513140113989480097","15159959584934619251","5421510054424198403","764080905849423952"],["13377613469967641371","3284092373901995719","6359876050826457701","5080988180649117385"],["6506731528528215992","962290723562876970","15601017686781944023","14214083688096289753"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["9676691156755414570","8396018204459633606","9416524567895778493","3126947834368627577"],["13879907513174568768","5976384010538787189","1236753061723938722","8379748511997259234"],["14771276532406952931","9778575524105331807","9761251673107859433","7023041860417850292"],["11508490330778670055","6282159685974479853","1695210272954045634","16854996857409358599"],["2454610600332347185","5445336600281224746","11871573084593187645","1205588172070490053"],["9389312822714833390","980227985744087993","12893884566158428735","17822737375382387943"],["805019274800814714","9200162841717130347","15497753298145452530","11346159378674333743"],["10606386435396484264","6079969785456026131","9382876706138696885","6764769037830711379"],["8072032317820768229","17668821009523200845","6216102136831315142","4207143217452388181"],["10859320635858369472","742131218242376019","572018242547612643","16627938516928445413"],["3060656585452781775","4307792243068975957","10191014512106841702","13351837505777692456"],["15781218028311470128","16402778545458347287","7810659601207182014","517910752917664715"],["10291917795525868122","10006962665201037311","16729044301649257553","557240355239179183"],["6639021257577017397","4335608713281271927","8768412355129239098","8154472594841676428"],["1216668694125202501","9083368553001779882","4732729445582509600","5511888057836907720"],["6012459474413334799","7945317702989774791","76464626477763381","10809352907491399622"],["14564264557012606398","9901670145476131275","16118664042779521521","6270490036717324771"],["901928490074764917","10410969691349766682","4505716918021539238","16854336650734621431"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["12638366179056630317","12125584252842385225","3520506794159391090","14294125106444077025"],["46072822670277399","14583706620473977501","8268369434675403776","7668235177968484684"],["9144892213038817492","4708337385194299443","6397343817772367385","11012952555752515669"],["6693563860489705822","7807611643362540357","1561064595442096348","14289042576416262765"],["16397743218250680756","2071122098090743601","8949649422593540977","4934804947183141734"],["11858171504092125298","6530865059876189538","15775871817795259310","17293751481479090108"],["16085712133186484531","15148272185587363214","13271177194913816435","12574854249126139602"],["4392388107390655680","11702242227105857637","10014350075262324927","489871315864943545"],["16052906796847940901","6128790547991085035","14938271576384975596","18087511925656776860"],["13776834571532012906","12547447433908135281","17381466703742350649","6113892662358448289"],["1470087190131779141","977017120539586079","12748760913138000874","17940624761761545708"],["6647636294078467012","14365217760582776007","414705402466198384","11769095668258748701"],["2357000094507394686","7899953290657642768","2746416943004855828","13032503158294441413"],["15226491971037730115","18019765591843953866","14897168491815468633","17049673455515115277"],["11666325170852629664","10614203689109407539","11580169440970907695","18304947758333551391"],["5714407557514254534","14514174815427865584","3234982692824668466","3412678305257434072"],["12929496895879828864","9708824799583025961","4391690623566638596","12762144575794421573"],["7574770412072831770","15922384549188611090","12445509319464950544","11415478143100053640"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["11619223241628143602","9833670213352049245","422870551043717999","17247660997237430233"],["13548490162084735783","9201476194627289116","17833048061411515499","3806810502712568057"],["16313043510363657967","17799493125373462424","16537971735234590297","6848302060245351969"],["15770199927629215237","16577662102655445895","17306311021188336778","10432339270771209819"],["70337988141631895","17484266475337025671","13903543230246526947","15616769998805336302"],["5435161801009202903","7975122793908361857","14327549490638743943","15433267931225528141"],["8152632203456630834","17853710221238958140","12974981637834112530","12547610485441180843"],["4418805618138552389","13639770651842076347","157301873630584830","11924546476839620283"],["6766956639156620774","9391602212993182481","16581512843842942866","11686055505427762278"],["18152765910400547811","4533789435322945280","8719193698409855768","13373383234089342992"],["4959469743460439160","5387356640667843598","18049065063231488114","16332974110914076777"],["4804399377335604640","463983893792940182","6778794977688252221","7208011979814744627"],["13311236008171006708","5137250306218145137","12869252004758372200","15685636640384109230"],["265251861011919891","5200177155824858032","8942803124950778311","7972273529318976371"],["13735528475993651979","1167683882997099260","12478575860723522618","8545583616869827095"],["12570690355650447738","18404157207278118325","17011092821982794895","8206144467820470983"],["15111479929136705978","8436886384539425076","13609901062049133966","13426005879161823794"],["4140989263178758953","11276117054686081667","16343005069629594341","3899771849479105037"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["2866384618173168718","10291548471270770221","14287093802278942425","16209036972480070709"],["7885089076217381176","8889365438509977652","5016278704901639783","5992684245404416553"],["9514825089410428554","12490298848895386789","2452749522047479920","4469757098945429539"],["6677476719377315139","13198379645356134082","11777694252680312561","10530912564169647452"],["17705119062443282018","11343774954878694309","18277706905288066234","4738760285430641756"],["11182693132514648335","10947012556646968936","7668750270910741407","56803047565838737"],["4379493439533275175","11931307083948100096","5030530807198060476","4541067791937516585"],["8771050180816453371","1185270868500072300","6483577674875087790","18189675915073071997"],["12446719313050157256","17501618922963448648","9125330596098962587","6569312413077699494"],["8693275746150944036","17237551927444034336","13552178504058850556","13658343351570592702"],["16205703028685895812","18376067580190593600","5213077535468281066","1671390130312674979"],["3695796472677490298","14977481882005648245","4839959339158734966","3523073997241695099"],["10994266191154780133","16971185819009425695","5719530416531196770","16728388432195331303"],["3907582899375690153","9853570614780862772","4731234628430100742","14753553005526771624"],["14817523731992017968","18349128516958034144","2245356797923682710","16057379667526396758"],["14303749142301577802","1153521405180116067","11321130184182712836","7200682899529817495"],["14564264557012606398","9901670145476131275","16118664042779521521","6270490036717324771"],["901928490074764917","10410969691349766682","4505716918021539238","16854336650734621431"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["6652555966828393766","13475725820001142464","7105452635497241649","17309892946586317862"],["11087400766653072180","4193581193097992987","15277735596897731870","10726280873496307341"],["17228902536124268557","10285506180528964417","6512872710611471920","577374808316195643"],["15243196736429602373","7175838926064871505","16817336659762265704","16407368910248790711"],["1590950462939515408","9542937178433370615","3766101406649083305","494091653068868536"],["12172455962120443208","8753061650676296789","17634038034335087736","6037252126120446206"],["14752092178218054780","11061561911594808979","16497293177960512750","7164552675366223470"],["5154435219197749686","14296558446762304935","18286215317427131309","369327088935130028"],["6287546066164407063","16789993033897064954","11830177005398944082","1083382939540589894"],["5161741985758617466","6991345039180731999","3456848943495006472","7886814956917351298"],["16301671411541949962","15296580832187731547","15812622953142729380","12085036129287735684"],["7893024391665934750","4578646065966906736","6664623299130269615","11551073200149829038"],["11680857713632317221","16022132857310811933","2140331258040904001","10960849568496991775"],["13678001676372237048","5986532935118090308","7056180623562955952","2281842840148857052"],["14817523731992017968","18349128516958034144","2245356797923682710","16057379667526396758"],["14303749142301577802","1153521405180116067","11321130184182712836","7200682899529817495"],["14564264557012606398","9901670145476131275","16118664042779521521","6270490036717324771"],["901928490074764917","10410969691349766682","4505716918021539238","16854336650734621431"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["9409382004981088331","12100864245517035632","17635953496811149671","17118176170691578995"],["12694817625979151739","14426557474508450859","5648071071368001801","8569509786079434827"],["6363802487945218267","11910283679660668403","2604467748237167728","4925979269804556829"],["4637214586580144027","2026444728451975845","13878625815846154516","3696065512149496364"],["11176722909581159405","3975295328443835981","16219392216926430077","12260299434673249544"],["699382998849547819","16268290625363803428","7878541239780244224","9738165148850364127"],["17384488870275661740","10490035869810494274","13697370301723324861","10462016547697516482"],["424699008602656126","4936559218762723628","13735430283219729005","6613316207873493006"],["17828544509239359781","4337280595827698132","17472140350089518651","5919134071413812024"],["3114333410517522448","6450576251958989351","6411409442388175458","12390645635905275815"],["17328794280753402717","1511945551305777601","13994869196799099914","40292095460255088"],["5776591656619058792","16069060110516146723","5975717748490143468","16624158801333983679"],["2393973053673744361","6279864568571369914","8425560500403939005","2393843456962182708"],["8541772618753769195","1044907829795151321","2036002799334641104","8500060334882544777"],["12019755312355891107","6489855202163160867","13018115266393414406","11888851594734809904"],["513140113989480097","15159959584934619251","5421510054424198403","764080905849423952"],["13377613469967641371","3284092373901995719","6359876050826457701","5080988180649117385"],["6506731528528215992","962290723562876970","15601017686781944023","14214083688096289753"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["9139733061791400373","532000559497966940","14454080194239897729","9320631952062876745"],["739300310329950536","16838246498613908730","14390406847614077601","5349455618014329208"],["8354549443915602410","6700080565263539726","4901688982614744355","14280596062513183172"],["6091938785308663138","12409920249608244303","16702452702283014799","14978033740719711857"],["10014264511091973267","11147732456427218292","10173366339364640702","17607096597997041806"],["8429964647128319692","580577041819643909","11883705684624129273","10574227227122562875"],["12466813005043567773","4767358541265463295","11359253630868589212","10287049896376250276"],["8087056735054068139","3084362001823520487","11790745113131461400","11717393278737550275"],["13395576237767147597","5404801622299373975","13662443548367396168","4617604927619941239"],["14814420860848215924","15110854963731816848","2484826029646364134","17520509221963648975"],["900818307819601330","3337862930481811555","3256654296601320150","14540046781828718998"],["11562910787556749032","12469773676919137599","3139702374065600784","1135785800564777092"],["7560246397717701590","16816154722579976380","15666820586602956437","11258826108107428999"],["8916002716292902181","3503018457328587384","6568103960411459443","15987067191268028389"],["16002229556627489135","7404021887109588747","17703280727778936020","7114258293020517328"],["12570690355650447738","18404157207278118325","17011092821982794895","8206144467820470983"],["15111479929136705978","8436886384539425076","13609901062049133966","13426005879161823794"],["4140989263178758953","11276117054686081667","16343005069629594341","3899771849479105037"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["2570699995060135169","2232998729433259890","5757914052477972542","9295735416702857945"],["10596264763983406250","15580288181956908873","10530001677528540625","8003028611349296324"],["3247665888309632058","17381390314333731007","2769572392465549119","6608303419633408779"],["14630736777985743858","1837633678697534930","15871855773789027481","3512705875837744921"],["8818544269686419284","11829529854492445450","7663367781400137919","4733967449401180378"],["15066730917327816811","12727007269193399589","18243044083071515675","10526543879299805275"],["12604496720057381817","5533765377078152996","14280495057339022146","12841148814290065733"],["13416952780759738553","11724211795581902599","1873073870776051375","1201210319749731063"],["10680116380344896836","13936803430105312321","7555208343089088174","3738096937291900361"],["9691202952433359346","13517334187436519497","10837869494222123299","14760972530949871942"],["10544944360658769096","1738749709845096222","2437052955276676334","10947341534362613101"],["4121591809083043321","7751627266538297653","7077331446535002539","7738147545394164736"],["4059773164318420669","5888784385767266695","11437520012741913157","8124994245116946877"],["8375037981124222274","1961932299680604711","6332589013073671447","7505492210659035149"],["5378919528868495275","12224217846214572929","12838711332712052664","10591229990217227426"],["4733656126816234138","8037269067336235372","3961377583995350207","17253774850325233256"],["9995179147819510961","14785399417232287765","9680814532751540832","14141701455843661381"],["4140989263178758953","11276117054686081667","16343005069629594341","3899771849479105037"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["2280169869791049955","2422973965497255195","16960481515011692669","3688620822025682999"],["2926181608047114069","6457247488067412808","18233879920416834543","8756880048416853530"],["17892103806065007440","16193538653482577242","13281098895419112064","3640215327020400397"],["1980299022250943852","13378610529057051514","6809690665481647968","2725366278923837003"],["15927611251115138746","11198353748045428844","4838927285376436597","633372291107975259"],["4658301479430122661","5662471188507904230","10964714195631713149","17683626211665330111"],["4733357292845088632","5652622757963464351","4811602585711855658","18150793999160005650"],["16615208856293393653","4505912808675853148","10643671191530402352","4236566200778562152"],["1916850175731413709","9026049978235328932","1584046115660214366","8390642615147834603"],["8819158496430824404","14036040499614711511","5918294025768314437","5782377355131817386"],["5021696477661592770","2131435426763256147","9551647478846255261","16217800826619254881"],["12802470614394272005","7066407993764185241","7232582539015530038","4505529489108699424"],["15483842969960899834","5777795106887443122","7684426689139946835","5449659227991960168"],["10657534784715503204","5886506077077673482","3107592231028135453","4348350770188320940"],["6036264304505706710","8447254003489332167","13441729771499254205","318699506500796340"],["8260671535648028062","1974890186695476769","6560710741979000080","10644811212949849273"],["1233397679696888286","200903685148312182","15577187182862110121","4536864383239004998"],["11685212525270116744","3433126496135538778","10650452936122069856","11042047365036120878"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["14376608601174986395","10961111336660741303","3321274367011230858","14614471911481623393"],["3298563034797697403","2952684028774174535","2977373109350522176","4786149948283813175"],["10570985587558564261","13737674651083530151","18110967579320926855","17295990010924180170"],["12278903796119636388","5377701633195208760","10769396912440668471","15664800520790841437"],["13628611007187705162","12305061579050014947","632211719057765890","14968105334248503671"],["2741983204069591688","18095793158449470074","18276914056676642437","6783809981672109869"],["6527739831452888327","252434870072869044","10696532784158985532","5093583359255444531"],["252401000325374959","15982971055623489873","6765168750415316894","7289226182849357112"],["10322202338911550920","9967128288061511139","15111463960467309652","4375751422687839397"],["2037571694721518300","12127778910289175280","853037432975187122","12308217802840057207"],["14320336237979867267","1484015418151566858","16801728114018369372","9461298231417469400"],["5941893667302040611","6358369259575953248","10963785194179853040","12399400753487403708"],["10856443565942065688","12104165232605519196","10218327271909147369","1539606937624950036"],["11152853196005546547","4266994156631081934","17884172344813958103","16031513019894155342"],["15374805775200477053","5673794450960757251","12728053270840809635","12273281609463143164"],["16328580508772098714","5855831199540580803","3442184559326565618","10923636249904326941"],["7504994331308894526","4167931711546254201","12317222204170525615","11948500470437550995"],["7574770412072831770","15922384549188611090","12445509319464950544","11415478143100053640"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["5556250302885735939","9024993027262385988","4124809613169827448","13285814904071258212"],["9727281622743845915","17097457443558394996","3347722545323229031","1409671536759778056"],["6265885348729709689","8569104036499791281","158167746599024497","5387218295640562129"],["3300524991602722940","12793261171991010457","13082758144677112486","18363048629441816024"],["8827377688711664034","7213606255341756008","11000974711157819698","57641999534473879"],["10175407018556085093","13221207417649403811","10794457665803103604","16468818968056047717"],["9380410392776645812","7874309730240618873","6335960285978019213","13695013695863387208"],["18281918604295918457","10282353574522645379","5005711386463297661","11129078920179703289"],["2843694026066003654","2366757429775625256","133832100871883476","9547562363796136358"],["1148793050141935041","17317252214603884832","8673373055035026108","10508877685114097106"],["14120423581654449350","9916813096315061696","15445830947110296032","1860031518543366105"],["4386631027234799976","8732123438861984248","7381389318966551708","5308812458668447727"],["16276771489630569916","4510775135560053060","15289966375811574897","16303934059782538650"],["9996785613048228114","17677338419964864344","4837348583918127476","13075066912041417974"],["2497069741669130421","12839239106968380693","5700174662446713842","6400817998652742161"],["16153544594670582458","3455104906283328398","3359261650277342865","18144705427030965238"],["15111479929136705978","8436886384539425076","13609901062049133966","13426005879161823794"],["4140989263178758953","11276117054686081667","16343005069629594341","3899771849479105037"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["17199283582996109673","11738504096825049778","2685500058396897525","13553364238447522493"],["10650332734306098080","13526634484032979866","11639277778728538769","12294932995481157862"],["2666301747882622080","14091446025389502193","7668057510844034465","14864233841154305406"],["7711491068323311849","13113337342129337513","10975241939566986742","24612573297326336"],["2893366655939207191","4262986535934953010","16876030677342761597","9891671412156882218"],["9795783546590303669","11769383228025119238","7919490106556375339","8400258888183583616"],["3122233317158789798","5210013498069482590","9798689262108470274","8339039778532830467"],["5741790332136974177","14799107358395827276","16437431119623497623","17833679708666470546"],["9339915343912895846","14616241830231987874","1613012853976727524","10673488399105182023"],["2945350011814284260","16661432477346509728","6532108373688965495","9043294462879658336"],["4072407400882075653","18278748075293105544","3088290373383672970","10275805665819523640"],["15641666978307024236","2078819563923236078","1461216189052257787","4484027472763322776"],["16730907734495602601","16090004652915903482","16121276531785354056","4049026454875721445"],["1863291402178685298","8444842355903576065","1452202521059990228","3041861765035640089"],["6219175820392742597","880347673938568547","9870156535586970673","4045492586990837137"],["16371957230280572703","13715093986430457608","442238306312582738","14058692271229733264"],["13377613469967641371","3284092373901995719","6359876050826457701","5080988180649117385"],["6506731528528215992","962290723562876970","15601017686781944023","14214083688096289753"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["6064986383631797976","11421909973690007029","15304841168734021126","13687936778094722630"],["5486818468521361941","9684971831676399722","6138070725731739652","3128693144971605320"],["10369848774407968124","13216285884802997621","17257506632465286240","17805304868219663217"],["7201684259012241820","17549677269424930796","13899853362330373046","14254454156491777269"],["11022258663584344824","6286704319414924468","6211705082579828583","8862330233659591721"],["17167757929640663958","14035669158539207720","7561912466034070984","9487813390681892699"],["15346782299209328030","9922300061898690430","10254520042544978330","5152803850839785688"],["2078401270592730930","8243562524339910927","13111953374157868342","16758326898306869073"],["16970530342582542849","6098613617777011132","17994740545776536271","3436233776860290995"],["12093677782311538415","1662414156081843935","7025480397038061084","13547889952395764186"],["2068880996915962000","9963668859716999911","12987627564623922023","4737599821920469707"],["18304554696472835068","8670412071213273022","9493073337339959231","16431529793324680203"],["17128935832995278005","7554336688447682339","4560413849215801608","5254441074996885939"],["4286168529142307542","2219366899762592934","11130140737597514173","15147058980863976432"],["12211519789022788473","10518373250923977040","8861039225743375062","14327281194788899074"],["12528966874752892777","9494612148746678377","15113979977843000503","18367856021636260865"],["17968528491227389577","10065662177081843857","4379825034924019357","3398967460734181467"],["11685212525270116744","3433126496135538778","10650452936122069856","11042047365036120878"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["8325109400156485815","14546808424533614970","3778045031694194974","7244544735040910510"],["6450878452749715920","6249539079626085037","4146430031533662490","6400696216867195573"],["17384123386844203549","7316806559503734244","13329668662171796347","14122468147389314768"],["3156460775553538400","4396442720768759300","16615608784386818283","4261030028148962822"],["13945515445966509763","13842295346852386156","15506830234055958616","5077845423988818210"],["12785432287856427344","4253313438372800255","6275342366172546881","157134183832847903"],["12047786256592935083","5431831282896365042","8222213851560054633","7456164542200364780"],["890249628715188774","5997314726447610561","9371190784443199676","9728371001667713206"],["3252861462227185767","12150509804700545469","6830445152390088992","8151051068876351371"],["6497938018748064222","5340644635824486370","4865941908818246","6692199377216826627"],["17636743029254297583","9554848336323392357","16037549443204978546","3001902774954938599"],["10561187256072825877","5493027855153994105","10283906158508569144","6654899956259656850"],["12351421128851234840","4186264755010463035","5902698933224405519","9079723579982862792"],["5972600426124875938","14183345889621226461","16252792144526846140","13322070099246906487"],["10124725404330514438","11812876605905424654","11367837099176375885","7424919376905639763"],["8260671535648028062","1974890186695476769","6560710741979000080","10644811212949849273"],["1233397679696888286","200903685148312182","15577187182862110121","4536864383239004998"],["11685212525270116744","3433126496135538778","10650452936122069856","11042047365036120878"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["8535619152473794696","12337264429779632352","268743394997193354","11561332987728330502"],["12853662312121053824","17116645152807422794","1674200361080044249","7466282098210973266"],["15311169082853402715","5293196824857540167","7351143696390950452","16933377648598507407"],["6295270134800645043","9529838190948426488","186598222031009721","13394620404624997025"],["2178662410610183961","18331915200864113249","6558768394085480470","1640583039386896231"],["8653127800709273970","14371201352391495586","11992177448689664839","10874275025017455402"],["14468378500873473012","12567554056149060445","18419449826568030701","564631373382440003"],["17998730530608549067","4308251488779004207","16380400038894209030","6083685584984385644"],["16065055099842345408","14645068502364827245","7921266037156185984","9919843501386728861"],["2127363567469550739","9957483249604719516","9861927242129043341","6628060118264051930"],["5310352135761274486","5874295871948686084","13732591074897580636","3627295343668270720"],["17506558453209899349","13082414019368014951","13156756784945140192","11628872214224160332"],["17914510000949601007","15871570678154135918","12142560953657264237","13053664132191827619"],["8069522908419538624","14228418685634880397","14298060234519567096","16712127143536807751"],["14115627707389989117","3016425341610928365","1913842779813211604","6711476656644034694"],["4618327165506906867","1824624160740515733","6992785665300994085","711005764713151227"],["18043498570230115241","9225805007991832068","5676058076955006587","6749979581782245856"],["8054807170389643074","11305480336699210083","4016383411294209710","11566096393568482533"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["17418490228263151019","16126629144382949361","12871941385007318667","17723334764101492258"],["9989637262538714117","2104075701947819427","4368762210914571101","16055603216121793761"],["9424383921095245265","12918219678188350347","13368222205076996690","7939212999141120321"],["9039258054402607435","6524586195411452957","2418444591284486117","10673145440157436858"],["7755652676657831083","18143191491060297814","11157366364815021531","477590099927791654"],["18404695743623381582","689390941247030196","16145259811106132352","1146836128684911576"],["6915719853304991000","4709228766459130917","14918584403003665235","11147062138449116350"],["7303045625314857381","4366102121311266305","3338835540446605032","1291747153551483146"],["1164772466486431749","2386139782305769872","10402745258986484201","16142246499564359102"],["10445315141526239502","9690214048038044835","14799708961479245805","16412001488252418283"],["4876249820088551827","3272047120447561171","17018327491938481415","12314725131044943164"],["6961119270259773329","4052101711928193086","2138477092863647854","11915248620514643228"],["18354497294141286686","15506353982617303891","6674670524042919015","10573696390324215636"],["5828539902802275797","2137830800085269905","5390211901234683839","10928630677241560476"],["6036264304505706710","8447254003489332167","13441729771499254205","318699506500796340"],["8260671535648028062","1974890186695476769","6560710741979000080","10644811212949849273"],["1233397679696888286","200903685148312182","15577187182862110121","4536864383239004998"],["11685212525270116744","3433126496135538778","10650452936122069856","11042047365036120878"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["8733215647591692149","5032494757643136262","16947705021268404510","15847316642224881292"],["17096455168235240475","647081246435977739","12738724705761356216","8858936625413919216"],["16624202647483914581","11495192399110290177","6878491633743166110","12354221340406490172"],["16648691381720076223","4105972562308461317","2696464177161901883","8385198090605170480"],["3215499380064826460","924530960938597194","4389242995548052259","17448842204179516474"],["6999127968064154183","6928698557764734611","2260703258938449721","1207320965053345138"],["2469270189118291751","9662292117827500231","4696899272272433302","2601936146312786752"],["10506284090853408649","8142493278678421014","8111806678867733366","15657872049544802303"],["17985662977575996472","5469512784230116571","14904266731898249434","4177074158356776008"],["16742185769588800509","2864576336081272994","9912157861656780191","2819630091837293723"],["10802355167078891638","1271989063381363340","11590403310486128780","15931926504567552220"],["13932387231433469374","15395105157812305494","13012338437649178090","8160722254371104419"],["10505419984173738808","634071874852173030","12376085899488266775","3277985296848094868"],["5428407683845168309","13328137036072292608","14976191070675681204","14556854223758390114"],["12322931226425171170","1611141674044178915","16440546761231591522","10439054639741917122"],["2929937363229529865","14981196819238639559","3419751828025765595","5771550660605819401"],["9995179147819510961","14785399417232287765","9680814532751540832","14141701455843661381"],["4140989263178758953","11276117054686081667","16343005069629594341","3899771849479105037"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["13711919359396460656","13615914132924479392","8241321344434205856","2874699149564069065"],["9538263788301333962","156683575220504941","10141136490062009042","10463998402605787154"],["1290790339482926455","13354263791562808238","5853665502652992143","7919117883552509824"],["8524878094276515794","10335490284255466365","923559432753268219","12177202718757092426"],["6984309389887767963","3015031604038756756","16736269923466690937","13915623600215998"],["4401047804352216504","735358621125217214","7639475722267548889","1280957286923304129"],["8739644170225401328","7250977497073371971","13675230260487243146","11823614316097229683"],["6685257060088735823","2871431712455134301","4519430487309009013","13043336929441732655"],["5030479018627213058","10700305644164490296","9377681646591005582","11939822839865360248"],["16674968145734289293","7442321693484459859","1033937323076385924","15276714548104942392"],["1328163134459898168","2909303868735142362","14822065490164703368","7951330210141723294"],["15349620821196610289","6986730977569949326","16070130055294367472","680334683395907269"],["10856443565942065688","12104165232605519196","10218327271909147369","1539606937624950036"],["11152853196005546547","4266994156631081934","17884172344813958103","16031513019894155342"],["15374805775200477053","5673794450960757251","12728053270840809635","12273281609463143164"],["16328580508772098714","5855831199540580803","3442184559326565618","10923636249904326941"],["7504994331308894526","4167931711546254201","12317222204170525615","11948500470437550995"],["7574770412072831770","15922384549188611090","12445509319464950544","11415478143100053640"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["7429208573880892128","16578391004033660424","525556903427984070","4138735848634462578"],["1564468792731437888","1612552383424847203","14787483992558910229","10838065345659465624"],["12470387174498928965","7025685616235185497","5968158974783989048","14815191258771888680"],["7871017668935892514","5151473498912576035","12025719312651676678","11020676966243321909"],["9453768851017645884","5860439595562793333","11043113540944932518","5550117441618661721"],["7310452516938647305","6794739411905713519","17510536823483177227","17114917010882889168"],["3129634709529556106","3411124191676776101","2965580858907614861","5158268076829802950"],["13079817717883872130","5142094574288788504","11553793315133287738","7282382317264218476"],["15716839983904265294","10581049349639715994","2340103253949037175","12388574229331664211"],["3225849957527921676","7923681725856038811","16992790566698621888","17755045685070174793"],["15976021105441272822","15087574780931583892","2003840226674770705","10757300009769538802"],["13683118409445776287","3638300777604613939","4740444941818909898","5769573287519975880"],["3474424836330012544","5686819775713451061","9420054018137560012","13590555096921855437"],["12998159176428483742","9838607485663171107","7319040382904946274","870690586018015650"],["11203172410523727939","1674325257195364931","15001912048945582159","13213709527421452255"],["14368971786923503341","5625059834726229227","18098732855177550447","16640789116867174877"],["13440936272454544496","16696255596496220745","4068840962850511780","10823668318058344136"],["901928490074764917","10410969691349766682","4505716918021539238","16854336650734621431"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["1122992921784894940","14218062242027273977","2193712343271970737","6338749212050377951"],["2716385295780445210","11223276115056372690","15054160752570045479","2948760133145348669"],["11379695648377238444","4565308393980336132","17720766724726771754","16157973535688931838"],["13515646026132729480","11790657140634685824","11947938347318254250","18384701720018038213"],["15112867083017936104","2333280875820415773","5104210488011613353","2183550772190031732"],["6608386375131404909","7990114559645523556","18156897990278335129","7912838216900472490"],["14145826344886756960","9655586001677208149","15853312863130242023","3109789847254657037"],["763343978251374658","11420645097899134170","16867104020658024390","16523753884004884064"],["10066615902771137549","2471567110689701570","13445903176846244656","10017943133329766072"],["16471586111062813984","1536269660955971402","13589739504744153538","13497946678447898064"],["15059809804301069036","16222388303524573147","12740018245795982247","8323810041957731396"],["13310031677055683057","1494802042097566008","13490887806244967399","83865487306082360"],["17988525210125948785","9268345466678678317","12802979644503363257","11105578968153856707"],["9592859854491526633","16857853323307887154","14590981588779873791","13525530564067431941"],["9644982153629489081","16422117645163690675","10246395739706451847","8732558452027761111"],["5405549685389720009","6824434410909741160","14396787595908348354","851359708623989510"],["7504994331308894526","4167931711546254201","12317222204170525615","11948500470437550995"],["7574770412072831770","15922384549188611090","12445509319464950544","11415478143100053640"],["3323050794293488483","4448013829146778308","15184558905863255613","7740745149131084616"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["3484266429499601497","1818688173269873860","5854021806483862540","13660062152232977576"],["1654511333490013845","7628279114817553953","4708630225885773203","15574861621268739368"],["1593284709320233291","16222069613105468814","16805425583041294769","9045831396906617529"],["15713254827671749453","17890313095904516532","13543981133833809507","13167112697930095810"],["14288501118112689598","3496130308907389048","6780666896221996641","1537692410924296727"],["3221627025394325322","13831903883551267109","3993679398511839311","3315368823936809387"],["11160512249514508822","13447007012119445358","13162637348587445570","13903727271243122189"],["1073152044285197653","5582395911234152461","2383955111875679619","15337240367877374495"],["12262946632559614611","15218040311889591448","5161091494995660119","5061712119228358109"],["9925997724433035021","7705638106196345225","12327688682407738227","17189814025861056251"],["10118044933626884975","6607432773323027859","1583276577353371990","12137988005653224560"],["5782255415903412678","10374841325801669916","4262685204622639543","148865500639999840"],["15637663341443861274","2148868402577080658","5401746202014216181","6038620018245773850"],["11871022651501135590","10321493151322779176","8496848709993998934","11187953519673956168"],["4085011153626535936","13771818894558888092","8366349839167383451","11633670485009591445"],["1905389575131304087","5827039911732128688","3987052657796773422","39580491389135788"],["5510655664560260199","17658157291495794862","10689929099658682199","14389365158981329914"],["2924055083717066436","5180862646835915737","6898483271968924409","12171025833306152899"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["15223555711450399811","3650134953826003897","10264981315251931814","9437754720133247356"],["3780748722073277661","7577019964106557187","12055472363384276187","5864905665765131079"],["4011183811388680985","3921607083416431123","4440295238504127327","13977310102717928833"],["16163590094165403376","6606231667452301293","6325522849149688896","1279840154511337561"],["13221461578380807171","5326143663423455743","502094866641030872","5662800004066812392"],["14044337286431742527","3399748124340234677","3668630078165162196","9429772127687971061"],["10241656283185554551","15574397765388098570","14454771130240765562","12907226710268228671"],["3555966439791327635","15725811167166479251","2217083338019573465","14719838945998040403"],["11880994240429058083","6449417616386868509","15347077001773566099","2284817660150596152"],["1452897527955415803","4670537871331682654","17382867019322083447","9476158982362478598"],["3607539646589301870","10961739531386584533","1083501451395251249","13759321893352368073"],["9686216144652002383","2195987979154502741","14201144932915427464","9326272030980620374"],["948793439492404925","18096198275112715542","14812535839982000607","6082324161998832375"],["7452708950392717677","14156124087769569114","18116261916305346745","12615350334718728650"],["11203172410523727939","1674325257195364931","15001912048945582159","13213709527421452255"],["14368971786923503341","5625059834726229227","18098732855177550447","16640789116867174877"],["13440936272454544496","16696255596496220745","4068840962850511780","10823668318058344136"],["901928490074764917","10410969691349766682","4505716918021539238","16854336650734621431"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["10263011127657410776","17507669770816373021","7646228373421632225","17311554792120736382"],["9247363180327622877","17579671082403410468","3826319643834511484","1385420304555870355"],["4976104831468051298","527700274862807638","10817698452135733370","16225942376357603231"],["6220106929594268757","4982578876521075456","16755124424743150889","1622939855987651710"],["8875278070945662838","18097270764720888559","14072561898057503291","2207551618999426411"],["1725392116259352966","6375310278178399654","13034117578459711609","4872639882289545585"],["9702031020968009049","1240193508942724725","1379090361335956194","16420490376400747279"],["10202932427552843948","998408781234002668","13067172227645311960","7856876675966141622"],["11821009705958825284","6670401462849949690","9099861041634888594","1983256876699984904"],["6135357415278676629","12071753813897819211","15265945705108795235","5179574335518164839"],["2164162294977110096","2644501038996176982","1070762456946535108","1274068680542629352"],["6720046890582397615","17542422350374517219","5466637797430542423","2761115973861380999"],["2768631471704949070","2032221502413268635","7705560845692710423","8354013815451191774"],["8568727509821164730","6081260603903502073","11284629532576667641","15308640177031391716"],["16980212452700401824","9120562130053475595","16312712636921430399","278813470745751865"],["16588097367250952224","14875974908787368732","1806692659887340793","12182198822195873166"],["12825992604998053294","11963821166677830625","15369538940849421589","9667907533782567309"],["8054807170389643074","11305480336699210083","4016383411294209710","11566096393568482533"],["1593297041800132358","18235136755353529874","8213910017663047959","234094739028787688"],["16715528551913054047","14472186544092066918","15672915426871454066","17662697637029347626"]],[["10853497593416009344","13198970461489521561","10292262196120314529","10136093254415398948"],["1373111380443448344","4075222714326671218","17979775456375860156","7217681885367732098"],["11756572148619801033","15797695545713670014","2505938490636975900","6598240648386635505"],["6445058597527285885","8231390008130920402","12503380246271060716","1350331162708057191"],["4691220372958737034","17364012594377263439","3027729719405733625","6746418916613029542"],["5795378641044451999","9366573321844805378","6958866856077480015","1647441039516145461"],["18346308526435744938","3920158296348700898","9986657091801414768","1262840108514531888"],["8538884487840958727","9749850958469883342","15890447484441223734","10999598681138995063"],["13832037507298711210","13801281746197313846","17534373298997638822","15417991020694113044"],["1324845138800342095","2973657725889582444","57236535626619982","8845850605463632674"],["9386799433792979438","10830183638743563971","3962691987224599420","13182639999150736365"],["15641666978307024236","2078819563923236078","1461216189052257787","4484027472763322776"],["16730907734495602601","16090004652915903482","16121276531785354056","4049026454875721445"],["1863291402178685298","8444842355903576065","1452202521059990228","3041861765035640089"],["6219175820392742597","880347673938568547","9870156535586970673","4045492586990837137"],["16371957230280572703","13715093986430457608","442238306312582738","14058692271229733264"],["13377613469967641371","3284092373901995719","6359876050826457701","5080988180649117385"],["6506731528528215992","962290723562876970","15601017686781944023","14214083688096289753"],["3029443522372476536","1121714999307531822","9615354739953460438","3771474973782481792"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]],[["15334172352850759669","4787203174739714194","4167408170217391688","6128323455415503425"],["14547058555992435720","7357152923873232615","4394843746248338293","18348406013756373844"],["10987723149354125897","7352800763498142628","3468208001195143392","6187213986649384503"],["15092651384609344420","4583696733115759933","13076727873707204217","7859807602639758120"],["3319895425363685331","4366738531112700704","3136989459978416278","11357483435087178201"],["8884425027224605804","5002991586108879619","14938391620782042743","16081706136790523320"],["13040500433106799792","4013506797984102521","8288704796595793673","7341381864658695300"],["10716294064162791625","12322869344449456259","16282298231681884654","3834783416503504616"],["5816315527676405972","2922825401080768151","520004503999877404","11167072642883783492"],["6680675768620549751","4469392614849606628","12888664224139649411","4465093866211069792"],["16634172352008334965","13995049315622534454","16518529477411576177","12411989803480856578"],["13598825180491897418","3605473618271065951","9104140848475081869","6159465226370355149"],["6280383238994839008","13375200743755592775","81037291173460663","13240347994684078144"],["12000428070575798824","1858319618332362483","5459045334178371714","3888115235633086431"],["11277919911372802647","8375479240414671672","11380282203401564247","2131644995485067503"],["14303749142301577802","1153521405180116067","11321130184182712836","7200682899529817495"],["14564264557012606398","9901670145476131275","16118664042779521521","6270490036717324771"],["901928490074764917","10410969691349766682","4505716918021539238","16854336650734621431"],["90627430658139101","12807027688843122879","14918313899864011244","4594290998514992701"],["14836571113404582084","14224056328742318588","6098613505030341396","13458470374784641807"]]],"s0_siblings3":[[["11079247531229056762","4374583035221176696","1192291108510858660","14736960381804058548"],["10896342356675904819","14371516282719702897","8001980931802463623","2364714972557079312"],["12241383522651413982","11405955879839132501","15561970486145037574","16010136950478594707"],["2389994698564361866","14883950848864503266","8460260231476439276","16008113736122752117"],["9448093347937756518","3455006090938045062","10596770016504570787","14448099346100735312"],["14754138937092212307","7804285771880405643","9234697454795107938","6462875744195218600"],["9009098505463886597","7543171654407250621","17814158480598888081","3773596191660896766"],["15402291492300302373","8574544123820486049","17532535803239812566","775881979339437602"],["10590374916152750863","14001904046109103999","7030682805585105533","5109888359969576048"],["11271741096073881997","14787841931385335866","13089405228053774373","14839896374578485299"],["10399303120109151314","15359133929144360067","10778118095593271219","6360198453524694792"],["6306450456906549868","5287772579155982434","7218691876640610412","14604446360491792099"],["5518256042253408288","9780684593127749089","10025974135338834297","9924239874921417714"],["15077610283233180489","9490155420138323959","10730148654434880395","11382864479396949314"],["3439713332847775571","16494500057256693274","5544575885543109405","5598664251649920009"],["4352171186079603762","14503603060637339163","16505406778058572050","328245748307621434"],["565497987884224855","2932058404024105640","13063800817492321081","3249558394578720518"],["10425734023567609088","13182575251090511761","1203323889946777308","18376812037972157074"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["13995298449261974125","3031148440354602756","5150293610015676779","15950761088801509631"],["16369174088708444833","14551374565307005398","18137373895643773302","5764530335957378000"],["3902481278835648516","9535822452812500565","16769203877741650785","14228184326838473490"],["10876602406740728298","12421550497825850723","11478836573705653663","2439324223637694598"],["133009018922485434","2234379322778887195","212394229169537100","4235645221566961740"],["9134883984209589806","16696856594940127683","2390938145227972517","17549333262937859101"],["2082197487298630463","1661844554447532020","14742515418547613886","11601139055329014007"],["144009335652332917","6909476211844470429","289891446341190391","16401165260080089887"],["9584329773290028608","6231779035032100810","5197514166719931254","16329692905190418537"],["15401465298951450473","14540078086471351349","5287022686286725913","1346623202894433218"],["10378814742033988013","231501588059937495","16507019372599226975","17756921077576740977"],["14655127584819337969","17355630523779586484","18274023735351552891","10061663540288142264"],["5371750972967153142","8881810319060613617","14190208865854992331","17233209516209254155"],["11882454589202009982","16276101486548082228","5632035381719025218","5213542039535353532"],["14804319338363796657","1320784279893833467","17183075009254265674","6355447710651835204"],["9131591016826003899","349763151817846238","8343494335208348245","5551484670427133649"],["12561372225080704294","8735756396172395159","13292316812902215799","9619741175966860599"],["13381712490930221090","11984606464726486391","12134671520287929660","9714490596503882576"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["1387127435796471936","12066745409959405971","10704239149773007800","13519683461187795209"],["5858235024139554854","1343406861798914887","7376083603800502372","11509196665642990105"],["5281758607188090347","1293426844104981657","11447881427431999172","16601264130351794335"],["6081447786441641254","11726132837551331718","2738672229149409589","4322266026674964246"],["17334138584606077604","13966805244458170804","13819529145386717527","11342012110006817000"],["16474371269521529291","13773343996119015108","9475020906996397866","6545287840582096387"],["411788873597106815","720217038471128617","4140626561627294294","16386594731346663733"],["1576030743335001126","14421543719153231086","8999970443833202021","8222237958336981545"],["6945261369374368970","6532077129747144463","8996392947663446033","10037397768716017306"],["690238755349385814","7843577570217784971","1425614386855328229","14407038261272806870"],["2903091318605245312","17240542406649843919","18132605684696808766","4887869736197802408"],["6182180593630542816","18047555409356585375","2353037463341181546","5802019514630516810"],["7788494126506129762","12082204445098082352","14053259268980485651","8510160784352455022"],["8896631058092416003","7048821579982947174","18388744945321172321","9748128611670299462"],["10289728369179842874","8946045397364415144","17936015154258713798","13199910729797676315"],["16358588400018504295","16624970157816377348","3513663355336010688","16248031313127235267"],["3972782454046038118","7672606289274822972","9171836233201516908","8715597114264232440"],["2201869996884437918","7876072937799342777","11475630889304100497","9291841385121994293"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["1897444745948675117","17787970407462137094","1677134330685513013","6200251567326817089"],["2966809899848223702","12527784008876391857","18196282049792616853","18095980446214152055"],["2479171152471142433","15685784547618160161","704238200961227483","12555433261658393401"],["10154079515810523183","2405358456073888201","13035330642191499657","16731857871722755832"],["1525004233967315416","10366030432035165848","4395168735883624969","15308214245995979829"],["12079671091146057302","6797815753383597082","14860697315180224762","723860180100594144"],["7471319750099886198","9050202570567149293","10089154923635378355","4458293762444952168"],["435181613824673337","10772923463166046061","16714544942817250259","5928957718183719729"],["4307044370317791513","13314889417601621085","13707831450054957187","4307500724354058088"],["8417223666041530374","15466031939603672312","14922461067022032029","8715089938268441285"],["17600099234333197457","11157588382157526574","10115742815916104524","12718177661289137830"],["8454925739009720018","7480545688787030863","8278327996003441730","10356600427622788027"],["14700629758064107041","9797268043205342031","5834121448572862375","10536841458383493727"],["12854453710032567958","13549582099196421996","17346598882013555004","12872586462020266114"],["2767184523673712433","6135227269486444939","8459435302232948826","17326873924693577178"],["2982861747585973815","15049739963291950270","3885559795898153110","2352428498876151937"],["16150737037940004201","1388253482996793466","5174197750958497629","3724527904393074952"],["15325219967096932889","305698626739224753","4095037705148246030","6437680128718100638"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["9546247160452248679","12875520509954469465","2634667602964032002","13530092187455935983"],["2005155486826793844","16443368294929529417","12329947336377475675","12512047061140015825"],["11502672539193064651","17569552587205521706","1842070940168126781","518296872726022912"],["1419347770459569169","9928247853356474258","3681979398815274419","13304965421276426363"],["388657887997515416","6479488174185638987","1747327317203801823","16270668615215894496"],["2948506573162861545","16407687937224015300","10170803235646950044","17443312800178518525"],["16526002960744585012","16415509699209264000","16770473875897443780","6364377502096247415"],["421047502448677960","1087465497233415879","9338025233296451364","12778030058245001517"],["7611798890583786412","12689381710495646125","6621408388719084728","11416604879886994836"],["4577787945066034954","11778606373620062842","8496582548183483783","13731101005584198955"],["3025374720632824191","14894579209551041769","12589955201387345793","9814510330677415478"],["4784046366898513027","1288107835314522463","7525973833790240375","7585268881757935071"],["5518256042253408288","9780684593127749089","10025974135338834297","9924239874921417714"],["15077610283233180489","9490155420138323959","10730148654434880395","11382864479396949314"],["3439713332847775571","16494500057256693274","5544575885543109405","5598664251649920009"],["4352171186079603762","14503603060637339163","16505406778058572050","328245748307621434"],["565497987884224855","2932058404024105640","13063800817492321081","3249558394578720518"],["10425734023567609088","13182575251090511761","1203323889946777308","18376812037972157074"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["9824909478830573011","15821948562739629207","8196263854202611000","3431676528028308677"],["13096660394703319891","15776423587764643099","1118358877994853401","1568102683830529379"],["14319401069748503766","1579907642255288392","8986755555832761804","844346856465821426"],["4940217580489031232","10656326238600026172","17021058901862242102","15610617567274873405"],["16005493396516773151","7766279277690588126","1996459641628437672","17989592803511288439"],["6546429269761821720","10766016085288749364","1105795909654351286","1988829788806262983"],["10252071947358061400","14062213205822255431","10770257077922222739","15876915490011978223"],["10364308788879186929","17668078733820571193","17542889217117815647","17046201355628615001"],["12895478714621148047","455183891236887591","15149869801718876921","12518477076086522090"],["10152270549654903324","2105959826001858370","2467745544873699940","439859211196346768"],["13760959482970949803","3304485988652195005","8644935281995204352","8765672799861588354"],["17889929225592951698","4067204781947282663","16158525916422674747","13266413989057920941"],["11239999365580013820","13379823129588318866","8933529940876976413","10313401784339432237"],["5746001430855441473","1545176621734672049","14394052732345776929","2307500856146136075"],["659869409662293395","126134378862869248","15250366003667487462","3446099289212152895"],["5666864876697127998","1325365732253919185","13247655126615539072","3278994218265531442"],["13000959424168222532","7797546230940959845","791877230290724141","4471565909623370561"],["3574112497756922372","4578941699631793528","16370997103752444044","1221502569885358044"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["3274719209396318943","1702764267306552232","16945205744233805523","12980089150651743399"],["14776427568815277687","83065658409775547","13795397431194043709","17379676632844288462"],["13224266960232731805","16361258618272981143","12952551234409149392","4429051609260809737"],["9593414045843744669","4169120553460010304","5782323581543739876","2783189787047077200"],["11855849528060312107","4459300234089737851","15658316388324057679","269807774398301561"],["165603047287271716","715778675921184658","17996144827777781861","15457439459762972613"],["3224495804245118220","7122967525899246273","4930635674848102210","12582962440634799486"],["798984857746628176","3002692271472671087","2978062764651382830","6167974672650800883"],["6367011690482830990","5437643756970793608","8649026535391948854","16002850414675331096"],["13620877662207999865","11817942716036871220","10717629832900293232","16236233382251257270"],["15976416369102115125","2084520233447535551","12531534162886507309","13986884236292518106"],["11971439544441464943","16724691920373550815","10002850087336005516","9498687053646303756"],["15206475827433794370","13210288610769938597","13675215331372490746","7316837315868763241"],["9718995952394543820","8492381314393609370","112848086955042005","4579757675000500003"],["3052188152608865157","1110588391268987330","11344764425693684472","16045082599220792414"],["15211008963484706853","14132563481139123579","14672855895815716009","13565980303822357042"],["3972782454046038118","7672606289274822972","9171836233201516908","8715597114264232440"],["2201869996884437918","7876072937799342777","11475630889304100497","9291841385121994293"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["16146516800758098332","15666563042507169782","2703914559106346551","9562881079569559002"],["6404743994714620035","17738812827642055948","11263550874317312262","10188979301489237431"],["14313760669199628028","16966706128411658986","16403683223753339918","3259869560512685465"],["4775590427280651383","11590866993529198285","12857112625011934209","11150619155092653319"],["8720686571433699156","13789553629695553974","9190536766844060944","3134225875218942884"],["728632101738906099","18070025231595362618","12016767234541605779","1007323330545686312"],["9232036035927907755","426722812983134892","4355387840804677306","2586708344746407481"],["8570005916519159152","14688944956707422076","8462427504629586692","2920233401650513673"],["5845881617706020057","17211249484197724345","7378206251924462221","1649466874307027620"],["11310847518227485366","14798742183337831356","2269827588225678306","5655779806856155404"],["3949588989129712690","2541409355273992695","8798332852918747258","3807372097231543377"],["14619163173511771122","12514529683558073666","7203047223637923022","866231023801486849"],["8005086103734580538","1353806685508651199","1340407037081309208","8346298277508411523"],["4360927404023661388","14494739507926988318","11118562729204372719","7503843876789793148"],["11024709531265970447","16105560133867056452","11598121673966143986","48681507204902298"],["352655222212249536","14072521928596669215","8685833356674787303","16262362417624880993"],["828000319335976900","1485271271041377187","5592187281034425955","362188975790041189"],["4762508533548698234","8745817339319195160","10365721138609525054","1037049949719795713"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["11089796742915888371","13500372820157114353","6972567815260346146","6896653140839045984"],["8081377266311738897","2486962079517433226","4601206683702849315","12700441485646922101"],["14953108330510973908","8972813569819957668","11310340420818757355","15500247533881553802"],["12586209058764123781","12688586717434862841","15262481075884308159","10975178370690808931"],["3116288892045278504","13215216396912993132","17596565320222452533","12893607315615036862"],["15952590477262808924","18266241258855247377","3798148112398769258","9821844384188459101"],["11253020097112178929","12840877968828148752","4722161292842063049","10008389042770661112"],["4862173242203357425","2384515316084053655","17814766249857076275","12243352516785318895"],["11687241512020903576","2056880695134249239","12901136799219575640","5630229053474317179"],["17640087221642813782","14183824370930464411","9644844586067635262","7658588900748231801"],["16075781948762665621","11202517884505991350","6000236222000853543","881058872106844945"],["3825946510610917680","6500848939131197713","15778488406696872070","1666128448990717168"],["7188571968663362998","12730411455203597304","10637317948341368637","5028670510955409375"],["10789620905160208669","112568636756721686","6127787023020212858","2753913479798884017"],["8071242028773508730","16658111395924904743","8574367632168911535","13300598578770618623"],["18117222981561193477","6717285013973879291","9637138527404690975","11088537477897945448"],["13000959424168222532","7797546230940959845","791877230290724141","4471565909623370561"],["3574112497756922372","4578941699631793528","16370997103752444044","1221502569885358044"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["12157509980005126452","4550990964305280469","16847224647648728570","4884045681917676721"],["950761928801112496","14179630371110162314","10238197426972747083","11689011726363721283"],["4042256203762763023","16052055395181942165","5870569183118828724","9036644524731698823"],["4504255092873205426","2981439913729494782","14617547038544534622","17282772151042785997"],["2452629658191683582","10463726774049326953","8169148534733298008","506308249647671163"],["13379753885858079300","2162013426981172829","12578750469080923544","45879586482765841"],["16789289264517459860","17674627518450132657","10799902154756948140","14628758734341206520"],["1478233966231602966","263106881242494106","15319140464885025520","908180868594127145"],["7214194662733786348","5185938349779249246","2723290546556348513","5739646411060171066"],["3595992855440512990","18049511371584312983","4587125345539550554","5624801413424422540"],["13775479290410693733","15657523055025661953","4402010682840296988","3883883180129021762"],["7282242708417097370","14433154735979832475","12167966726933437041","5878280831702449332"],["7880535943712210576","5514792559292799485","7156119878713088082","15711601548984894299"],["7617502849976157211","12410590569152520278","13760613624750047168","9193735429849198789"],["1272620449134415821","3926329678398633707","15097511294221895007","1156605007879112014"],["4574924081106957390","12248459952429930845","6503356264554529542","15939412699704436848"],["10537437837708513293","4678172998940552977","8834898263773353524","14817306368047121041"],["9625703307621045373","13071048446193653991","6188659378031898531","8727439722761669784"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["9035793363035095584","5360211387978485591","12713594439735678605","14412508185608198811"],["1873847179047908646","5641686053875043178","1862967230224153630","8867394803121469131"],["17102991077845892956","4303649297865169030","10714643652968691252","2860128199828141546"],["4446014983870579749","16085881628354429652","14672640503787364541","9860602131869671889"],["13346948921528767900","6970956640952339327","8892648720402742009","1424679362127456551"],["15265731933987510512","3306629329610641786","18032767951874302448","4965965483491962229"],["7040119565166703048","4377301290161186296","1518402584074495610","10413504437926037463"],["14745629419420576087","18418115116119997260","3972478452700360511","14969072786169670104"],["10043615686766117608","6383473254091130765","2005463309887651659","18051434357203168552"],["42432242133141798","5774033327131042761","11955514359191563797","3934460481174733434"],["291678026212960209","10790588066048546548","11200259009872199523","4969144542154792709"],["8806845877047891004","13547725101049420172","2180117044868310562","17292575529107061740"],["12660570542470098968","8157697494816880804","8878321043000220675","17583709386634305064"],["18405667950562330111","14509927976460087053","12331334148689976142","11732743009382444666"],["2712542455486674626","6272212599644896532","17838990311509224402","7719792306788259553"],["1916096192123133607","5423241671435270553","818303105871918117","16860972601009303518"],["13841243208911860319","9931604539662224316","13397373057440061559","3044645229217926713"],["9625703307621045373","13071048446193653991","6188659378031898531","8727439722761669784"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["15712730081605616753","16833993243374563284","8016138343274176215","17455194443480022875"],["12431083102042309719","14256382388914084261","13432376085420240254","2586866878559516830"],["662807100677768688","16606078097610542169","10822294510593567158","16162286849847580080"],["17195971160874176560","9806888046827168712","8703036161175661379","6271917413719485539"],["18306875654951778896","9700707567426206487","2460552258283409076","15997324229956741369"],["18350160490077903965","9729223761412966559","12134395354510522983","7236916710073563979"],["16068400012600935947","18197549329088584942","14893109229994591483","11438398884436080436"],["12445507270888121213","8809382769869983069","13426015443596077043","6301513005281931153"],["9718965311051195825","14113758434439788586","12833969535612176577","5729101058577256622"],["3255551861018248142","5632072233591938294","11780879626323232400","6653863830022899111"],["4012062635846098133","5798306877930864729","8450127525339082993","15635653857371138587"],["8614394148004940212","13182634992775574940","17108787835904590283","15396782521905808480"],["10786913796522268629","166477260255147645","5521945952800991179","9849877905473428397"],["17051734194186347797","3117243314362177125","2659080100246720842","8200893276347875909"],["106387891278054071","5040562394414571201","13896804183673147829","12398609144311960882"],["8679710210286832463","8910555679261662631","4121912787947224797","11859853735852576127"],["13098537087240004083","11597558417005574250","9160575567014208372","16323238814542298829"],["10425734023567609088","13182575251090511761","1203323889946777308","18376812037972157074"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["17854123400397187864","9891301498307746464","3619719859308388217","9811972771599153285"],["5033087240691370827","7060031186291079181","15255048766794688766","977495776020325792"],["5713286213863302082","1668892232086237305","11386730102074154147","761286677618136277"],["9153258889280539098","14996583582007319598","17027825050567424392","11143729181150298474"],["13627680184344453429","10724038599557603433","128904009989189171","15761297651697278825"],["8700435857969773534","9598092851731499078","1532918517710845258","8886848336277388250"],["10303902716419456416","10770608672771208660","16361848847375605850","2543029752206151910"],["13650084452197566375","4845994172892676168","9344759956960523858","16469353287973509621"],["4504095262579028638","13484897222380651792","4711317413868234763","6546328203115184148"],["15065868618347388756","16803453597060196736","299796084074315396","16311497616936104127"],["777628464030590702","9439197752776735358","9235450953172245361","5366119650927292418"],["8169702828058104342","12304229835878507745","10611832406771411594","13707707661899273462"],["12660570542470098968","8157697494816880804","8878321043000220675","17583709386634305064"],["18405667950562330111","14509927976460087053","12331334148689976142","11732743009382444666"],["2712542455486674626","6272212599644896532","17838990311509224402","7719792306788259553"],["1916096192123133607","5423241671435270553","818303105871918117","16860972601009303518"],["13841243208911860319","9931604539662224316","13397373057440061559","3044645229217926713"],["9625703307621045373","13071048446193653991","6188659378031898531","8727439722761669784"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["13908072260387504395","17646015216734352736","16504530675990725653","3834716257336248127"],["16529938724606265876","6493449567212381412","2508757394751286230","14060834948820363820"],["3574251502242180570","4676264847130558271","18208062466323047128","16851366294266108333"],["3018059567130616462","13285875228681291668","15682776149414550186","8347523550993263027"],["10947468883635314503","17168129659863760813","11491269640403950528","14443739523378272057"],["18299491836280604650","570382415080252656","5444590680850352843","3496518937657544248"],["17977445004579641320","1372528107125234498","4435059341981580380","9907680492427781261"],["2510540497011739393","13615122244867975001","4155434921878502554","12032750667395908422"],["11319733777891449738","5320428781309607685","10797141735178917475","9725862741506347062"],["12625491779869428405","10029507514624191328","14036975717628940272","9387219177682744450"],["2586695782411086029","7036087136886951773","14901712959631985934","15795031177429818215"],["3977288453777462960","10930489575421163309","9998585782488790862","12978560448239610136"],["18307852563306337739","11026388756815441095","17486472691872545608","10204187001103221979"],["9590644928883373825","5137486960724060774","14906409425754284486","432492625908190146"],["17976974110685003754","4072089171226298282","16691351836068432892","2658642712499038613"],["5666864876697127998","1325365732253919185","13247655126615539072","3278994218265531442"],["13000959424168222532","7797546230940959845","791877230290724141","4471565909623370561"],["3574112497756922372","4578941699631793528","16370997103752444044","1221502569885358044"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["15585924463393824802","18303871904732777126","3596476308089176094","4397366626561439264"],["6783838278672739941","7871850318444901377","17014074265783324419","724188462721993702"],["6320730318110410966","6907181492716582944","14796899203527947799","12048413179076166722"],["5383150141890370540","10830011584169110549","11610495443205165014","2652720267495963724"],["18296221495272215477","7012273985717332499","16801211065435443761","5890795118511662053"],["17153933400913128097","9234900325972790421","5185409086201689983","11084818245932470140"],["6586402635530468479","9644332874447145456","15038346997304569300","15303250100730373146"],["548671512744684190","16246044788724178999","15426642120353925736","12832214881398281153"],["17809247149350917699","6939150447594526208","5620600676673226933","1032818097740658433"],["17518020297532083934","16400196952067880524","6415950263479512019","14275379346132745917"],["1387320441382348261","6442152727056668547","15120022368356331835","13841129867359281587"],["11035643220147100293","3396060322439138580","12808046757221098435","16890413827724729239"],["7777277480636512512","17392514763506811527","14049796745634375579","12411837115552488133"],["10025759618235188125","7691161982645029915","1746016441760530977","16355599366974071826"],["3325404997461747347","4734856094927913167","13037933582881687096","3507603273974893954"],["10144358876066791855","16775315033288475910","12000186956835687833","5403393521902404500"],["7710950176357815606","5291588649799421165","17865197631497123096","5756818892386487170"],["16109895364749679718","9159368984505129020","8021910459051006381","14431642667583561052"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["15733170842906881477","15583103686756414039","15065454998752048083","11286233949640859288"],["4113296874994743275","15868766045994227517","11572014582506869820","1403628049099305689"],["16779036727469247165","2976892126064634588","14434490528055827083","17090727721537723736"],["7588900985583294775","8861814627948283375","1313115913987832374","17010350353757152112"],["11422966673968791790","8662912951053159157","17050865843490901548","6123414045415488200"],["16887473840597696266","8641281289917370853","11616212369815479585","8812200857176257729"],["7215040746383189335","2522783252187923859","17215122058706678241","4645623677636630127"],["10480622944370367731","5886229975436054501","17716363778105798298","5730948773921511957"],["6188153645263136304","17716214253249440577","17916334330394330994","10906740252239333461"],["9344646188062493524","5942074377932125198","16116285691873721479","10406750816941961376"],["16517034660468945041","6412938650849816471","1871098067465141715","4971364807348926638"],["2692224457852509174","2443735746900013758","9433833551015892152","17604137723387543285"],["2129193312808408936","12983629801873816717","17036140934596036784","13852057888540914108"],["17311240443336424022","3060211689227487357","15617325798307049041","4677491798083925747"],["16896412250182556558","11505374379815744407","14036157179924558784","15899259097538733507"],["17281213360659456151","7897172105099908376","3170804595420705865","1378236498276298429"],["13098537087240004083","11597558417005574250","9160575567014208372","16323238814542298829"],["10425734023567609088","13182575251090511761","1203323889946777308","18376812037972157074"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["6226592176768554483","5539826243437379233","1931406346464998800","5273522943802793013"],["16865892185360280999","9178936075745383876","8762308670207978708","15362356060794339741"],["8364698827460884469","11111714106985127203","11972052268125362667","12866820368344257964"],["173289838152961570","12866982667103077265","8233524403219929545","4800228036126157896"],["9615702008640171101","8104865536432995582","7901643623417682636","8133650596212249581"],["10697953673844676680","10409903821388474311","5747263187217895139","3511679788586180124"],["8057867083798232023","4086485676812571609","10632060400866733853","6767310094255816608"],["15308336246463389098","17166596092987709442","14690230231184849377","12155843334613212357"],["2995783664539652297","10046881669939689682","6614925353219478226","11658762803556488465"],["16930651941346516019","4946438813677438699","13851848981862359397","11078287443355534479"],["9780763239315025174","17884710180530204772","12086307138263560965","3949832101057434807"],["18286132144178937725","15491645294466182063","2311125423724653218","2279232436004460936"],["9032174006829704100","6370482611985304996","3042405084267377998","1450045512238899816"],["3033078428098983833","11703700019814653785","207013807392739110","13187435555499482955"],["1485891204131124529","16806264070503386021","9182967525859076276","10375169172505897367"],["13009987768848236546","8233288217942340070","531649013347164290","10061892110116081738"],["14437697568359528853","2503646367061020443","14852118576118807257","15288311356012979567"],["16109895364749679718","9159368984505129020","8021910459051006381","14431642667583561052"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["7960427051615696560","5971325702157940716","10583567345413271754","18442277916919407314"],["11869149964425726066","4276326951877564206","2342274008779657358","1519659540161194089"],["16594829305313026603","1382699284077726523","7838423997484365386","13714271565379439361"],["3528750669516979900","10329081564197094362","9834204178970281827","17684521724925853877"],["891205833442363125","18262485795881923058","7852381611259534992","13647118067761714939"],["11006588422794986481","6778112711164470104","6756141519187737424","316385228803456524"],["18179013769090780067","18042068324550035857","5100333980206388591","1304061140978020062"],["9619093721284760001","3775513613481804410","17855338081563850113","4473596381516708398"],["6185791361902776346","13970034001394650512","8975696409138164022","15953584001056828051"],["4170321902844737808","18400673623177440517","10616728187272201775","5165741774519092043"],["6454502385217116800","4010693485928527250","8436216598810909485","13852791496382329489"],["12022584084977558044","14547583637900527735","18068587437544805470","10955162734576680048"],["1637578510531689060","14248997979795571930","12902777883248455181","14099767975966797152"],["7476199195041588843","12026486518824185135","17100507562089798254","6008181032625637932"],["1673258846077152454","3788601482600755351","6644844728178083881","2775258771475117323"],["8644208589176849591","12971331952294104244","11709641910407471742","15289247540195803140"],["12880991699643473458","15855904032661167529","12384106004975185748","5345063681849646486"],["2201869996884437918","7876072937799342777","11475630889304100497","9291841385121994293"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["16704158703175632468","12281152964568636449","12325060280431416251","8596173134645474889"],["3292731430962445483","4950800295424067326","4311534256361630519","6778238345440520405"],["17405848655244890929","8747524564933713201","1605092651904623930","7850426791852850090"],["17215116167795238054","16149234849343707675","14069940809346066987","14775746361678271281"],["5703857041686445669","7065414967260008353","16860889161266411780","11668995945222719848"],["10389710901824657936","16949140392402643597","13600270019211335721","6120874691042486090"],["12821525696141439857","872458188067440593","9223035602143292273","17956127856951394664"],["519824786404380041","9749148342934413595","12124199467711528981","10734481042468678590"],["8343299624295603875","963607854254906958","5429823514254842443","1035856125820761885"],["7010180305189265065","5911438675324495187","11725430617647093326","15346572657578477183"],["8984219658979607406","11813402803655370635","15694404195638945587","13739559613984577237"],["159611554570525487","5719660266840463210","11995616040528528998","7858271420965235288"],["4575600058290273020","6625586007611332778","16144289222182969400","12874935536711569753"],["9884480326857097107","12104819252730403170","17757634722837629689","1167817503376924506"],["1802930409583978153","593358704038631066","555862832157453018","4562595319385695032"],["5706264490837656703","4394646907112322691","9107545786623524074","665958668923666914"],["2930578458891022445","12593318128682143249","9289058074632766261","8000065091408665791"],["4762508533548698234","8745817339319195160","10365721138609525054","1037049949719795713"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["14612130033858334167","15866279327982157810","18405071807215149833","4421296476977164672"],["1988399324880683226","4993496701965708700","5622850048620117307","18389407164220982795"],["11542002770628268617","599923304658094458","586294193422290475","14789634436424803271"],["14703956135877717624","10242298762470184948","12425746061973004220","3247793627492671559"],["13395567581930782344","4812468638965617111","2492886309332419271","13230439746464260364"],["11515977629883757426","16230348397646736902","7443320798427646921","288880658205882266"],["14869422006783433055","15941343870375979906","1837838341520340592","9034737738455075418"],["11929178056448316933","3998154879871819753","2800505390981496472","10023180963939157826"],["14931936926641433450","14662911173201563020","7606859003554461610","10652643178497591205"],["1591449149697468448","15745439120829750947","2445970493481262100","6004148411852684484"],["9223978355464258886","5440324378714230088","13016869600026546731","2629960481185276754"],["3713894568105674170","11237322177089227858","14528795116575997376","1212769592631721521"],["15179252492983618698","13552919894974424740","2825422178749392771","8030054412791490962"],["12604113964743186838","15991675227918375734","566739234013961571","3586135489009084522"],["10137877712362711098","8549590035849425829","16037917708530253066","8462409888436988119"],["18236522643449929144","3225697636020409939","16578562003093815365","9644853038171325832"],["7145349244955534976","6306608136854967294","15601069196318721954","14501966492133820769"],["15325219967096932889","305698626739224753","4095037705148246030","6437680128718100638"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["299022965606965653","16207180797645164046","18207661207888003085","12319233413641904046"],["6577245743876011702","10139203722748647462","16071139595169802838","18074561915978998126"],["14544527562196687482","14328207498836465974","516895493092896832","5257652618116267100"],["9073114842693348252","16465464321147361783","15496575363604910156","51799045418939834"],["3804327412151605055","5184922682390495625","13951027916591143107","2963762176554303275"],["15527671758261859839","7181620176443613565","4022496147249978907","3148343842239162403"],["524402431456554642","12207060877938332982","7474233387056294164","14621568549194199724"],["3673672764335962017","5560100872865692497","10957857771779376410","5524386653556594259"],["7923404047351621880","10778304380403382309","15710100449699557120","17398592480521755902"],["16478660541003813692","13164852300372488393","3060917686476921624","13273567591680217505"],["12312838304124847720","14669552698325247110","6466157813930753382","1873894840600983548"],["6428844254569093131","1526460106390715535","4269673148663221215","17734981990488463371"],["16844957497256699302","15703226396323638470","17375786456714743375","3423815774413847865"],["10025759618235188125","7691161982645029915","1746016441760530977","16355599366974071826"],["3325404997461747347","4734856094927913167","13037933582881687096","3507603273974893954"],["10144358876066791855","16775315033288475910","12000186956835687833","5403393521902404500"],["7710950176357815606","5291588649799421165","17865197631497123096","5756818892386487170"],["16109895364749679718","9159368984505129020","8021910459051006381","14431642667583561052"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["15346853376520072811","1903540456878515817","18327859350009937446","17038279595681557240"],["2997826040860875041","12784439975085889740","11149128553806597121","4544290031988628872"],["2027513690622575827","9639477735703945105","8347915613946023698","6542074124561505635"],["2437535564780422384","12553660743086066084","9625287731438919233","5485723569948071266"],["13645260722716620506","16642148263907031589","3995830973190848854","2379351898592692351"],["5607079216301065067","18316753152823629003","9728901654228414354","15168679775177711762"],["6818805503590079776","1679931230045983953","638377603730700196","11827554942953842108"],["8908213455756247893","11318987544838157398","12145236315672832670","5041093974734687294"],["11106420214425113803","17894131961847131496","8977507763219716278","14400523663394174481"],["14155172659104074226","16803037833906841143","4058045356127007058","12437393142157427499"],["2620833351692694857","2009180194275672565","966420626080214624","16908345298720732540"],["4979200121990828744","4741437903284077635","9500544488698304939","7028458847403473943"],["3892390092643888419","3609318622176609726","5860894959882224650","15771200898024472767"],["12986119844154136946","1545691986909492034","11996369046349543064","17591706665952802790"],["12930254028042835106","515844889698169808","16778771985349631563","8613382415496878169"],["6453328293775433284","9164687645226352327","6822773422958697016","13042670213767465484"],["2930578458891022445","12593318128682143249","9289058074632766261","8000065091408665791"],["4762508533548698234","8745817339319195160","10365721138609525054","1037049949719795713"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["14551811669613124159","12269538493554682913","8050590019690021467","2290260155299449379"],["225859316555067540","4526691207220273498","1990729816620725337","203139202898724651"],["5439165302973268156","15732346846838455306","1590835590366506278","15746482050765632113"],["7504329016746853917","5063428964072071516","10495702938558373884","10399814555202027450"],["3976287165446863910","12885486141329920194","17447346467425114066","11911090967157942758"],["13106610656552081631","12338707113516182456","8254621025400955108","1238260827477668017"],["11338243761259858319","2057528954781176131","16456320332896595946","17270185883272016896"],["13996398597267045684","5896178410826293965","17214972864694368183","2606843540098042897"],["8936311674584547805","14937944092980203872","1062680420775836536","10605945401788353609"],["7180369458175784978","4420252256983966854","14832909472113869862","587831041572222137"],["8808316092895483592","13234206599098625176","6380438172862322601","9980391306780689064"],["4141336049157320149","682632253645395234","7420662879783704281","13617028484684463863"],["8051220771485669859","10713659365576426250","17408664193816624998","11538627877895748850"],["12957990793359909557","14962174385924081684","10136458776918766421","3406510752977658009"],["12930254028042835106","515844889698169808","16778771985349631563","8613382415496878169"],["6453328293775433284","9164687645226352327","6822773422958697016","13042670213767465484"],["2930578458891022445","12593318128682143249","9289058074632766261","8000065091408665791"],["4762508533548698234","8745817339319195160","10365721138609525054","1037049949719795713"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["11544434129631229375","7663046591792682858","4749627295628316554","15945963695747210793"],["1683223746583442005","4899550724424733223","6764366398075118513","6073672335995527547"],["14323863113464467330","9696381638044161649","2047396285805346950","7064787288495218775"],["6273827092793254632","68537113065143003","14580307620589808019","14170368585885299702"],["9652573139619777436","9508261088036840409","12501510204422427889","14635317609489064504"],["17598283134925354986","13036145951991518593","75921966145295994","5392472897748820290"],["2570479639076201533","631863975041289839","6342708922877915313","9086975329934832249"],["6560786573267024756","14566928196202750420","1811833036099061527","15851106669760351958"],["4431089234619545800","17509651564163474680","7022118875496768197","12817959906379067036"],["10981412526861507092","383821111404449062","2338218000369070177","5836053957591727249"],["10572337804833036411","17549693578236677900","432901562307965597","10054404564823877975"],["5211665109268986806","1521894355703195048","7333044376698448005","7124197952026648539"],["15951759939240161070","3166816324500167784","16066125116708048350","9305566444873125305"],["2485980235813377229","11881361544234627019","31474955674912311","2515078701109436117"],["1673258846077152454","3788601482600755351","6644844728178083881","2775258771475117323"],["8644208589176849591","12971331952294104244","11709641910407471742","15289247540195803140"],["12880991699643473458","15855904032661167529","12384106004975185748","5345063681849646486"],["2201869996884437918","7876072937799342777","11475630889304100497","9291841385121994293"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["15862551582884936379","16679614584321400831","5933210465345933365","625891177491925157"],["6719523844627014906","15640997618489769285","5707545818684927392","12441349957624840909"],["2074269825429231234","6946051512015739337","8051149653496172490","1588258388960134464"],["3120912674978847352","15954437858246700144","12584173451217888429","12715589087953019771"],["14073344112699468077","18293133216774621378","16691631190627765639","9447825122904215633"],["2053103101619698658","16827339147473047802","15762249244916736775","8787604147885820636"],["667648719407659263","6919568225138876254","16082519398581635402","10514355962101568240"],["739084069037401381","14951490595789047514","7895627646274912730","379864127528526660"],["232919020441143599","2186612055789934097","16648216252653731641","15612641346128926320"],["6275095670088352511","13898289149181667038","7178840486022710253","3080505427400509465"],["9162652827036770891","10291418986908778500","1625088641077511095","729923359619634936"],["1532348290339403007","9443329404073702110","12800424264249908258","13368967440014715453"],["10533495747826515587","5251510984217031695","2335631680356103853","18358205069253808257"],["14818812484240552331","12347169322271607513","5019772821137355941","10899080257039442368"],["5111760914533258626","14859738809059592177","6390736825729862972","3876345288215647132"],["10144358876066791855","16775315033288475910","12000186956835687833","5403393521902404500"],["7710950176357815606","5291588649799421165","17865197631497123096","5756818892386487170"],["16109895364749679718","9159368984505129020","8021910459051006381","14431642667583561052"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["11824450131779318727","2031715540367062396","5041684335330033803","11174960042285313212"],["14974150105239213269","17257650086729064224","9684990441685851627","3134183000938205488"],["16352207398897758975","4682297529627302406","17191726017378801812","4761360337592095306"],["17013640956638772028","14263073632336128821","14655960380866838940","465020347737362310"],["8847588316393505649","14472850041226437906","3855965368988358509","1115079239380646267"],["5870589489792339835","14274481333457786832","595786194962971552","84078472083912023"],["13954307505376712723","17950824584882825141","9884207545527086403","4799455801883777278"],["2116697509872128855","1923458338097601400","10182966256123576920","17577520408213574975"],["2834589592387814364","2224454716188705885","8146073671202550144","12588718828235688611"],["6600685478039153216","9657456595372209038","17961671714073380142","13406671138385288300"],["8069342393026237584","1123560337900582244","3417011673001718909","3347638770490151579"],["4053352055144870143","2392307254180680391","12035252539710487672","5963866136090205185"],["5523129112623759256","2910737355543684809","2821148909135227391","9906295265474588277"],["17201067840203434288","7084781151346908370","12821797992725930260","547213553543902806"],["1771041903680292186","2141247851505729011","895928054596325721","14863871486745251319"],["13009987768848236546","8233288217942340070","531649013347164290","10061892110116081738"],["14437697568359528853","2503646367061020443","14852118576118807257","15288311356012979567"],["16109895364749679718","9159368984505129020","8021910459051006381","14431642667583561052"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["5261798790163474420","10954516525469401040","12065569751109443861","10495590438379802298"],["17760849436171484766","15098137357064213879","7368524617926289462","17010262465615711298"],["15760265587355601403","16808182433144172183","9395138886842558195","18042789145411522255"],["16474338836797704893","5016943522810850239","16559791675177611652","16284789803310244289"],["6484134673059573933","8881527990767753927","2838737967789293294","9415555559948987729"],["11434661577161878302","10677265250135851698","16631085224653902175","9822762235899072460"],["5286190466259799240","6416757275050489242","17347009347311596316","401635188082489288"],["7451173143789073844","5354336833610592495","15122565769768163647","17327954954690864943"],["14652011360922310185","8157822466840831791","7298283327126221112","4724495483265482426"],["5507018369945403137","11173888164232610873","11596192088167491012","14885692022999138224"],["2182071582936996958","12945410369768082981","11363935870951016197","15156490225606226486"],["383306830252183307","9421534276793222087","8923741469198397291","16585378268640235829"],["9474879980166760894","8105381985446480171","1746112473241496359","3441194782309970561"],["10789620905160208669","112568636756721686","6127787023020212858","2753913479798884017"],["8071242028773508730","16658111395924904743","8574367632168911535","13300598578770618623"],["18117222981561193477","6717285013973879291","9637138527404690975","11088537477897945448"],["13000959424168222532","7797546230940959845","791877230290724141","4471565909623370561"],["3574112497756922372","4578941699631793528","16370997103752444044","1221502569885358044"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["2868539640778294478","2235725623249766451","10999879770770840808","15022733485431755887"],["15216417908402761461","1608934635475489823","17680329694364334880","9201825103128980958"],["9012416948714053369","14506371736195387596","13069262300325948928","6990789558826132076"],["9782757068900192558","7754128312102483988","16969201912417230215","2974213375471581318"],["14922415018110690959","5917726527557521488","11264047150015201261","7526344483448057574"],["317202970227016190","7411065746963041535","10852546461346365226","6060114994526211418"],["16905537870759967169","13054299391311199428","16329526887665516679","13697907635427615221"],["5414499078114249502","13715723664562422230","6465774221051596136","7026776114540394267"],["15450437466165883739","15921019947669415293","7507982565857943076","18442265866984841761"],["15296575199983436712","1291746773591757","13928427338280464073","7430390274672715658"],["5587997332735051842","11008946759716482114","18116087569127694865","11321517027073961308"],["9498310033995558246","4010024946155970386","12629189116038357883","14901918953185280783"],["14700629758064107041","9797268043205342031","5834121448572862375","10536841458383493727"],["12854453710032567958","13549582099196421996","17346598882013555004","12872586462020266114"],["2767184523673712433","6135227269486444939","8459435302232948826","17326873924693577178"],["2982861747585973815","15049739963291950270","3885559795898153110","2352428498876151937"],["16150737037940004201","1388253482996793466","5174197750958497629","3724527904393074952"],["15325219967096932889","305698626739224753","4095037705148246030","6437680128718100638"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["12554015923686860152","14424535327980203050","15916067747451858362","161960917339207212"],["18010438886467732328","9751002823306045136","2427739436767166617","12382931816052480813"],["18042729047337567171","2596370888941723308","6558513860573967846","3931178196603396342"],["3769440154869393709","6140210749711077188","8541177561731742255","683976745456442054"],["17512047774037223724","13882943950509217382","13280994708274300758","9207735586205201627"],["15623589292300280474","10900823049335778825","14573322515661310546","2510735010956968652"],["17850398903133830069","11985766831302490007","2848883529716895523","640172789930938756"],["16463896273177656808","7701716971476973093","13229953683009883320","16400571926817482767"],["16783044440387797938","18278294283077901782","2590200516219252705","18362328323216603447"],["2804014971182332046","11616654191118688132","14918127811780691581","10716055170814368602"],["17636153511414883256","5179699225922271560","2421890179967867360","11727241397007304201"],["11314157688561021017","11102807592530550857","10592833890375372709","2843713100495564248"],["4468004458590986623","11557503810269815353","15745138713483080631","13903195847626547107"],["11404378728888638885","13195065171718221326","7619855030542899996","5155201102175953612"],["8365396809321797466","6662152528077014722","18321857251019862839","9114753058671797635"],["12611857345867239450","16460000956403600140","359682667990305579","14325735482514871491"],["7710950176357815606","5291588649799421165","17865197631497123096","5756818892386487170"],["16109895364749679718","9159368984505129020","8021910459051006381","14431642667583561052"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["18155453549003968188","14107656382001517458","18054518355954026261","3278166109460077376"],["568653891259305107","1467494257365084279","10360974115857228697","8584514358831796262"],["6730472057802511241","2098310636006768030","498183114289243325","16001483499150405481"],["1771211961661966773","10307368506279920953","3745266689889739215","2671798020458420962"],["13112723830767586954","15471300658508686559","10793429131605276888","2382138222870849820"],["1531892283578065840","6131302311472052728","2439426498779832283","5215158121583819710"],["9210953891275401093","13979570487113924838","13447420723244681618","5953355968688444465"],["6646079012636805066","15626770179222160607","9308764244600581740","16021446928655311459"],["7891694380429525762","1529717932057081992","14267923565382569202","7462037245638757697"],["10006775650430448171","7495751790501933673","8463795861802478640","8061498649216062578"],["10538773225605787329","13003705203413460934","37770584804188445","12385421561413934480"],["18029625295108919575","13547286274434955637","11189483378845771221","13592335456456212692"],["16370288470523930028","12758685686272766746","2641785983757442500","3607856293597260551"],["15993046958895380071","14502355641029785373","9197923461910177804","1233966428460963421"],["4175182510381680837","6078437968192691884","1339328780875194936","3471301499885773693"],["5551451994849044421","10788804842958633272","13881172279098503498","6213109735634395448"],["12880991699643473458","15855904032661167529","12384106004975185748","5345063681849646486"],["2201869996884437918","7876072937799342777","11475630889304100497","9291841385121994293"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["1814849171712143821","18092816840480312496","13185678132166950703","2793394254420922093"],["2694019482873569113","13449630114370616187","6182668661258239785","14874037330354191753"],["7607564637667835074","12389799655233552953","11386946830070432090","3878940420307749581"],["3772193435852131526","9076215621667522455","6211607584088085292","14044999308207325177"],["15494782446293475571","1858067290539853791","10637948421576980340","7178123866199080177"],["4617572260632379081","9466500252266857488","8698246547085162254","11958047927672288932"],["14087766779013882658","2875810631514598019","1761159958348637667","12241141735325396306"],["12690895521757394242","16045556114707765481","4968300979575781176","18181697622738985672"],["12546093464987852607","2172364305251723565","10365301640067143065","4734362828329745131"],["7877535806128083361","1817145762945874684","11019914964846895633","12620206545200455006"],["7519165360312174403","860840130639276877","9199339707572050601","22185048393563017"],["15745887102917795289","11176201028825330026","17408831471795688652","17512423737723457617"],["3661614686296263735","6417239725040764753","18145910601419546547","7258305283386034019"],["1650494932525128222","7718544094639777628","3556418381104053728","3890098149003483816"],["9308579988460047223","824941092796485129","2660641994100790297","7179103191106673510"],["13605293146581543091","15982978562112312389","5745469133715209005","7323445726909472123"],["16518188284302739044","12484490696955962298","16493239816816458637","8517912567435274389"],["3574112497756922372","4578941699631793528","16370997103752444044","1221502569885358044"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["11059452440916189264","2615148758316303216","16950509934211869329","17649231328668704089"],["470556669859433338","9569507504485699781","18090153244337139576","5692327536267436439"],["4402437958567859417","11157362473951406710","9982345390003439566","7015783142791857169"],["13922586952539264769","660484109202422378","15409280201423146786","6416507064097039552"],["6392894272701914857","2982739368885145417","7290424548991468767","5227369880317642096"],["8287235226565763117","6416177377043997778","4350487600499477115","9905752428257969252"],["13998481478234354812","2469481459642383393","12511533287635835364","16730956618804464329"],["9985070463171785608","14913572393229289400","11766826270620482009","13116311389090749764"],["16505259257542082605","17973703981152084921","822763239341277659","13258909876699225631"],["11764700136023605555","7313871216423033685","12722786168471500526","8832869607987736390"],["8077314017110103348","9888342903584012705","16659583589029294220","1603659690899989290"],["10300625093933211488","2330454386691993225","2269064990341369009","16224376623022350300"],["16129268758348584441","12842669584481925528","8479864709070227937","15590092898008110079"],["15870163392669487847","8891196569583296753","362517742745113208","6996852505984550169"],["17332934620992827555","7896068377050136904","1947398528243069967","15743875208426504356"],["18117222981561193477","6717285013973879291","9637138527404690975","11088537477897945448"],["13000959424168222532","7797546230940959845","791877230290724141","4471565909623370561"],["3574112497756922372","4578941699631793528","16370997103752444044","1221502569885358044"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["15878829787576472070","7908956940171850118","795530299123962966","15815042145812096921"],["10121228154117410001","7514505863225317870","13388967460105318881","3947943057738431472"],["17061596101150887842","6754345578972808113","71506807913754390","14213222838614371195"],["11838625513693901892","7807797287920692082","6198400719620205659","15776799120285787171"],["2602558670786499112","3998996798179558242","16636751247255077491","9183487214795050277"],["12046876496093956075","16582211018193599990","15578828330979006249","7719638838271276803"],["8272210726716465370","14258027646182257020","17203593782343657870","648513123894653879"],["344276969023062947","17723719932226575551","13351145253263552211","14370164060512493308"],["6011598349071078081","3477210190567561405","17249593457797251845","11760937604811028807"],["2041554846750748831","4520148158053284121","13306988534628537802","7221988343331515991"],["14895960142284655333","14712107132884942065","15149180084503161554","3517402345255411233"],["7066393688705314620","5575360060166996682","9237586547630044894","9364535415598619495"],["3385393494368731941","8984672971707363000","9638204617504355716","13847892090371711026"],["10382716029531139010","17123051031488785829","3827957192599598913","7849379808096531019"],["3465579529112304781","4909133580599616760","11335552822339234791","3129169835908829896"],["9131591016826003899","349763151817846238","8343494335208348245","5551484670427133649"],["12561372225080704294","8735756396172395159","13292316812902215799","9619741175966860599"],["13381712490930221090","11984606464726486391","12134671520287929660","9714490596503882576"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["4721078685510839029","18366718346725680654","12642868058864690528","11722326556814796586"],["12405725955366539669","4525888944317565095","884881337013604491","9914957468917748521"],["9721607467832314179","4487892689131036376","10159669459460163886","1018084396324899354"],["5919260496448988249","13210825911462063317","2571536728108375877","7580608809517420626"],["16223737892888321882","12887825806672026105","15493300430011450518","15430558624392561095"],["2471944926732984669","12567748755544560268","7895722132867028782","9854835351300565194"],["1134186585675314745","18297894804385509973","13578171502365362048","4474512366983184768"],["6491298936838361395","6403234969912317766","16637177254231671626","6367334964766863190"],["15920934171963015078","3557602298613924909","13097341063057460881","11952615126377902821"],["8801020864771300144","12677850085135042454","7270185355247420931","6984849579838298063"],["1596795300482528193","126577580194644833","4390694212205362924","3961310760816162327"],["13872865123213761440","4263712386769589299","1219687009965183485","1521522794980029492"],["3007990583261533485","11520736262391147497","3933623863100965627","15974834842867595915"],["7603187697485689872","11708488023146640664","116959059443197626","3765799962710398431"],["8071242028773508730","16658111395924904743","8574367632168911535","13300598578770618623"],["18117222981561193477","6717285013973879291","9637138527404690975","11088537477897945448"],["13000959424168222532","7797546230940959845","791877230290724141","4471565909623370561"],["3574112497756922372","4578941699631793528","16370997103752444044","1221502569885358044"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["15359714183349936667","16993198297684834501","18007120477117292272","11111788137580526928"],["6912354535996634796","12380113409848079628","14321954053988842120","3847371586958511353"],["7079018589189670484","5742534608818984055","14596741158668475567","9740220309965906550"],["13450933918941590781","2174031076245083063","13985929462483215788","895263143303957194"],["4671400868135308254","14334559155199318708","3569056583065800622","13211227045712659204"],["15937843016498454271","3303950593795626306","561107302014005696","17208393134394347320"],["13065450798032092664","16075939727054568123","11086941140065101208","17159621834677045926"],["5701593453304224185","14925853426355511358","13867408396392368980","16874498165148323778"],["12674116946876841441","9031198561786944138","907547721179045279","16992654031411652369"],["14974322926623658343","3408410636295231043","10558681545156980277","14518481157610264043"],["7176384989417962577","15497176702949702228","3625105714546360527","8512460835637323439"],["9474362142192834204","14981834269093356393","13192390841466559921","1319515366279943405"],["15636335141434647223","8444105432327349220","2093604423047713405","16343668626939406472"],["12389548572650886657","1703882541670860376","17375402555391531554","689966904715492864"],["7469612185288158659","16477992591799857255","2013605115760263243","16785519433110696388"],["8931729570781053405","14233564084760765980","4022109301313577132","17956299083182663198"],["14437697568359528853","2503646367061020443","14852118576118807257","15288311356012979567"],["16109895364749679718","9159368984505129020","8021910459051006381","14431642667583561052"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["1757491720979931787","1294884145853181134","2466276533730953600","7032731313158088814"],["2523297847475163774","18390714012168520506","18065596181818608115","14621333408944154968"],["3893359092529978850","10028840692509160937","5011785545739329741","17934043266943753088"],["10877040462739915947","15105343679082017262","6303268204884691090","10743560377953495327"],["16996151236442340314","13700684428704251169","18365985773839168993","16633519014642518694"],["9688179486400034179","10835776066760103743","1796289617064999452","3669093167708383617"],["9509621387703919130","10395716556040140112","9748054362784203613","10116518950917560657"],["2059822168605917942","14937186097663600989","1638622583401164078","13539462528413906468"],["8574509686222117999","761000660178072522","3048952139788100463","5168087105197733215"],["18289071156311499415","13806628046536035630","15311302799422752779","308132260182710230"],["17600099234333197457","11157588382157526574","10115742815916104524","12718177661289137830"],["8454925739009720018","7480545688787030863","8278327996003441730","10356600427622788027"],["14700629758064107041","9797268043205342031","5834121448572862375","10536841458383493727"],["12854453710032567958","13549582099196421996","17346598882013555004","12872586462020266114"],["2767184523673712433","6135227269486444939","8459435302232948826","17326873924693577178"],["2982861747585973815","15049739963291950270","3885559795898153110","2352428498876151937"],["16150737037940004201","1388253482996793466","5174197750958497629","3724527904393074952"],["15325219967096932889","305698626739224753","4095037705148246030","6437680128718100638"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["9110041892478839034","16359192664669883735","6090255719745874501","8853495928803229132"],["10926713090836878639","14925913638460891265","3412344558728554396","5653359056692819543"],["13322938614681084839","7326369852064998246","7436834681850986241","18402623857175751902"],["10689789320235017182","16729135436958652144","14656914440734537013","13666350947168072244"],["9654949621409464528","11983789403801348350","5943101154913219508","10079845275576086613"],["15137817849748059363","5621933177483566202","10717974063928958173","7742089650788465707"],["8023317628445260248","4821814612999223270","7248903972952906891","7852630689975042882"],["2279770674916565026","6058285862030710326","17289088295342982303","12149848004111207023"],["18346582244970504328","12100701185244300794","8442678685942511397","15723283062219948598"],["456793741571219812","12238032300763731345","13479296309476868220","7112985037084209272"],["16980983033180294979","10780048855021747652","15245117507856878975","13797902750190660560"],["7339130806587858661","12448208552525491478","3950479001923126645","17215573852580395378"],["12526921239449035021","8041063724440687259","17746682760199098602","16912731772317555079"],["2275310113332482632","3053196691317024866","1905696492064913630","2310739471184181291"],["17105714884113688782","3429245974493252566","15497384126964414837","1415419424396309587"],["16067466948099530521","17418373940673275309","16612669615094214305","17083312859914819997"],["828000319335976900","1485271271041377187","5592187281034425955","362188975790041189"],["4762508533548698234","8745817339319195160","10365721138609525054","1037049949719795713"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["2469616228254803453","6909494991212682611","6838368239520438756","8283638542752949011"],["12180984768419309317","9507050076411395195","13762778222846609","13908766913087701129"],["11968972009145346552","13830553567040932520","17345943727325968243","7941759330879943680"],["5835019958075673421","10267546365719415721","3494589854216465160","4043245497023581250"],["2753450314879939143","6985421475778434944","507291697761663043","7320487118239710528"],["10105972245234316329","4345085167446318852","8615608224077065816","17377310588858062022"],["3746215627664976341","6064266687180021654","18189602023591680769","7223451412973296546"],["2590763001639562029","10378166823812867349","12439784430707249850","5950833350924705341"],["6522577818799028372","17371415867348845255","11636721948117199705","6553706829034973699"],["9813872323344659764","6523476491906191626","14383485302521701499","15388918693039197417"],["11348788704312418720","14775564782149798661","16146962769898391512","13271264015597057030"],["15112978694009424686","10210591315892314494","6686417914615023123","6392724608491692488"],["6959688372318217778","12511004199889019319","6175999041069215083","4363944622318269484"],["2168788294648387520","16922498611387382572","16872485827041597939","17474522517500697078"],["6159001026416727452","16396055530713759021","3650480596538348305","7052945010736200365"],["14400520398452994611","8376553747408604731","2969228348467503597","967724945698895900"],["16150737037940004201","1388253482996793466","5174197750958497629","3724527904393074952"],["15325219967096932889","305698626739224753","4095037705148246030","6437680128718100638"],["6613009466176406317","1380901290451733562","8848768108251813382","8287240040653975587"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["16468891890160645536","18419735953975792381","4795906208509704204","8036557523107731736"],["9865882848262071994","1389202873179336170","5840791615879797910","14899563821620912751"],["13990609199489872055","14529029089626745157","16373023355894533875","9792432030855425242"],["13011813791012129646","7898071728006500154","13179301402044640603","6954547525150612180"],["14697366527298525862","9173463427641610084","13150618160928980852","4901448493035791053"],["8958064847040130453","703586745892737547","17877930605668816591","15307521706291456098"],["5451799222010146086","18160289308149479912","13498114275447968187","6576887924904329529"],["8454832027806513356","16578950986212044701","18265693438501903925","10858794223191404249"],["5393114931982776428","2668546954176598808","5255100285966683546","13782316310772078023"],["12821629649458850446","14700863312856180838","17056301073382770126","4905276562807663095"],["6994663002756259806","12500407088094364222","3545801162639060340","2043349403551807280"],["11398977190926730293","3555995739310319015","10452567300999069064","12632677030864602255"],["8190409137091526623","16089881734393117696","18074380611903563291","3135200108049039834"],["15975625091594954313","7346049009987585146","18403509988611538064","9838275111278179910"],["9085303336247865140","3909581540395306201","12039371743696251720","2718944278320011558"],["17577283986005608654","16773844683695572348","11163570098798640972","12586840714517956330"],["10537437837708513293","4678172998940552977","8834898263773353524","14817306368047121041"],["9625703307621045373","13071048446193653991","6188659378031898531","8727439722761669784"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["658160779514674193","10745157951405413734","18085846600848263367","15217566672168425761"],["1271863880498476060","17045515606201873207","152186767683839943","14877194725084897487"],["17151441881902121626","14285283121264702581","8455503172408686838","1738940022606383355"],["1005474056851673459","15880977440238325918","10843159528418707860","6808850931987560655"],["1659044965730579192","15563318105126857004","16407018516476577360","11850918560709827130"],["1679437610652735445","6074325919066604210","8347987544334853540","3302493036945141669"],["14690057884775448028","4504919862612610074","3800568347614766782","16104738448934172704"],["6776842960090305989","2594650551298087946","1746593883426770751","1291428506177518201"],["2498772481739924969","15008769541293688911","15745967879720054295","900483592706629192"],["15124771498265619144","9655424796745858868","12109539324888314433","5927159407675870745"],["5672022863053326377","16834980234029582995","1695565286281855904","17173167983375268038"],["15491642529722621211","7535316281381197327","6821973815129021355","3910109229093503914"],["1491954518707018246","13777548133613588707","1555028343180091523","1263163315422291672"],["5325421144461114188","12418869371868299112","1344936255068938558","10700541620535350024"],["17105714884113688782","3429245974493252566","15497384126964414837","1415419424396309587"],["16067466948099530521","17418373940673275309","16612669615094214305","17083312859914819997"],["828000319335976900","1485271271041377187","5592187281034425955","362188975790041189"],["4762508533548698234","8745817339319195160","10365721138609525054","1037049949719795713"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["11182804710342280582","17660314170633565699","3507817784817594233","7495724717536381046"],["1033902143331888150","3118961592255585703","9859082992923909953","1828482017417472984"],["8424960495677739070","10283572574665403910","17033292422707203242","13892831946967399335"],["11748561278168709017","42297939565717455","2600922787848029620","13110127790050420207"],["10430937155281346842","12121044921298204131","15557420555177916563","16785879200919808866"],["250181163285096288","12145956793008086760","5927956649016892104","4972068154240441200"],["10442077576564973912","5575903874127822518","5379507696356211263","416617288404922402"],["10036275157069004100","15889648685093972106","11817065401184464827","15211217763174387372"],["13392427210499271121","2656387717408264326","14638580192781810149","15698972282138923816"],["4124944926517184892","17254740751731750215","4422475447552764543","11530315532630858056"],["16402344916097363644","15036676726683667139","9667201164377940610","5055649687988405217"],["14249162117538402016","4696313863951688175","12615203381959808090","1273414985324397574"],["10069379669134970695","8365548831404328559","11985851601988102425","7510868170240530881"],["7992368698493960727","4943360832904038555","15848797548410166903","12008313461198826930"],["14553282108132516447","18176824382004151550","6585539373870141779","7004720328646120317"],["4248300023614262415","12318196449502442136","5943931840919890366","1184360421678306152"],["5463152799481153286","4498756996598108650","4411205794695275536","6098818995717858505"],["13381712490930221090","11984606464726486391","12134671520287929660","9714490596503882576"],["5902685174207663071","15721594166393511315","6165583884152074559","10992926579782552872"],["12124093875705555432","9933382187446522635","9233225325484395476","14068007055659677797"]],[["13651574627734329960","1153713467834918153","12838648723992656248","16868483365342533852"],["6346427987628982275","888600597528149984","16473027651510825966","14493588558823423940"],["18332841220907154662","5191915885589677359","13091195379765206725","4525328302099361029"],["9641706359109692545","3013053909211127286","3267465252802381617","1771474637206408095"],["17975816062300314705","11853502718432555034","13441378395586717547","13679269737794025611"],["8609201710910228512","16958590751473080870","5511813180410314189","12420609905503392725"],["9156643213172652639","18052018903785909930","1746842263886218282","1092632369305955028"],["2371691376345316807","44348104990979798","7197823825810352193","8607712501208224277"],["12308760895745046137","17558418030646187609","11729707635036336608","1296559747382603656"],["8646553881427455987","8481055011892206548","4882192575439737161","2610885744913466868"],["2283283662653431250","2641115904849131809","2604879247059667025","1730901131777902780"],["18029625295108919575","13547286274434955637","11189483378845771221","13592335456456212692"],["16370288470523930028","12758685686272766746","2641785983757442500","3607856293597260551"],["15993046958895380071","14502355641029785373","9197923461910177804","1233966428460963421"],["4175182510381680837","6078437968192691884","1339328780875194936","3471301499885773693"],["5551451994849044421","10788804842958633272","13881172279098503498","6213109735634395448"],["12880991699643473458","15855904032661167529","12384106004975185748","5345063681849646486"],["2201869996884437918","7876072937799342777","11475630889304100497","9291841385121994293"],["2973029294784998406","10503601010850331119","906783909412483260","3388526825217719202"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]],[["11874834322002860736","4097639389069282299","2351192120965624922","17792681824018619395"],["9568272696441920181","4474638812195031304","714801532436510201","9321568205498170689"],["10015596743493125053","13396375443732055707","1609085730828835611","2531470770648967822"],["14147208779273138474","9874828139728082451","10431300876711682332","15046076228531427800"],["5811679617009657754","5231700405446053219","17810278959912733542","7249827187175516042"],["8240469378104015295","4738896546859140183","13681780768592365336","5255550496291937269"],["5828434552179464256","1602801106874566018","16692477797972531395","290611578729884193"],["17930016361248663079","3954758270607456318","7683744998372119400","7659360399276699178"],["13125526562801860717","2216446444728354761","3086706759418656109","15913604940429803898"],["14956889660781171900","5530212834697865633","5636539043323861921","3885180626385894314"],["988038414150356096","14155108419267630485","7248195672166790598","11062885185901406734"],["5525900871572913313","17622903472950297345","10534293193300431884","5084964359856755454"],["8972280035945621819","7440088452269995885","15164025022097097889","345638062512668594"],["10119891776818792100","1534556738882000364","10859774314470853837","16641342337965558390"],["5038721718084029191","2609892761663689350","839129927924553279","8289561096979686443"],["6453328293775433284","9164687645226352327","6822773422958697016","13042670213767465484"],["2930578458891022445","12593318128682143249","9289058074632766261","8000065091408665791"],["4762508533548698234","8745817339319195160","10365721138609525054","1037049949719795713"],["1329949567959496083","11293413713356100239","5971203789503856214","15388996681218326475"],["6163952682877869660","11517922551681393266","14311563924477176576","16920819956931832974"]]],"s0_siblings4":[[["806044471324182995","8857676544538949372","672279834900053458","12299303563807265287"],["2134830455871419768","1453865194946023559","9394827104004461483","8247469206300160496"],["13044413233691687119","13565647447623545146","854276040545574898","4601512719264995392"],["4409898996265496380","10216212696381356351","16711345568288016428","4481465348022168494"],["5899111377324211990","5189186440861719323","10625329325419585241","18084447723662233389"],["18098799176627364476","8608726823473700726","1857015105997744451","16949490588780646033"],["10567328450468617473","11622594628724756584","15863285411419911245","10867309079571395206"],["12151294426454414134","2287583275413376042","10555357383850044179","15922101983199322930"],["3035298335580480046","16086239890096364152","6858732205075342900","14744153866152278041"],["10042659421823913439","14161966114036145819","3995723829168525298","11255801967553372984"],["9469687370667294208","13692948509593152884","3336958994363559613","10865175698649891745"],["4518911495314269139","10522074799319743095","15577513005793977770","5256017680033202128"],["13131233686430501803","1552867940838248015","7619287828450264749","5473919200225639758"],["18062546410795780442","5140797786141373203","9216614485941266816","10827151766038071145"],["5118236393582729861","12912425291101101225","3527644650930576553","18074886622363454107"],["565521274329348408","3319817834082994925","2703632856154934294","7327621021207487261"],["42214633821325876","7642465584390604271","13792442575400304071","16478080977641227647"],["6415164811331329716","4219874234857648235","17322587463023287021","9918601287017672074"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["1916311468260860796","6673913671487549900","15590370195012180834","8771993681002788094"],["4557074141727690905","14341684057153594500","2630128335571417328","13808343830905295627"],["14013986308710700565","8023363294949012901","15644043600693763923","17356664075104804588"],["48866508874540272","5875190774158586083","17291695659210763571","11464395756486654534"],["3434719535428263010","515422476504935483","11453886351286340372","12716252542206288902"],["6183892541736863178","11849518016086007894","422512601527909587","14441665283082498494"],["15388086161925795585","11180642645470130038","938526263418846875","11280843654030514185"],["225008295276252517","8755463775118212706","11286442578594075119","4439430779194654711"],["8306074652593634372","8807513842510822549","3958877326388929474","11196727003784572772"],["5189701355956545903","15603561313060482581","11368035736034300422","6162837061311780169"],["9925201430771743461","16032151450077265485","9160578551335883665","11879332587773244298"],["3612597142858251351","9792741555125166801","7814426911442566875","4394033879421739554"],["13236599508428462011","1927234122899239377","1602814325531090545","8484374618222225832"],["11190039526676425783","3670235649643463161","2630749738509278211","6243802664801780285"],["1303184893217938284","10976645556641522451","16890101656487474847","1057644714668813365"],["9563725106878857869","10496914311340201760","4516078512037322949","13027463716801590901"],["2191496644226995556","8573617880549744109","15184710432675738471","3972261698943381464"],["15417553647994598851","1440069973766571519","1697510896034343829","6112516677092234154"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["18119036031281576781","11242953235407735860","9312040843699167904","2423405544385581636"],["3723635328789475980","15916073609369295677","6613184462178945622","4235664457135324788"],["11373510937755834358","4880898848304039948","12938454965294048993","16622633767770293667"],["2701960071528845702","6878454969149487894","12419205054936465239","9579197214907650571"],["11249603359494664742","2625223123225443461","6116391078032322592","691455265446873205"],["13402447844162810255","11337736770863857608","6098473522609097617","5127511201345884322"],["16428646100434775431","4117800341000585359","15367026998985373469","1792189693620125645"],["17522637111278559269","5707705896494873881","11493947270564138374","14434511897204358905"],["2459236206317949132","15997151569262165956","12931939197373498940","16126365564348545221"],["7752229917236617142","11751799439449319746","1833246850329799388","11311854327014220072"],["8522036962634639225","5641192953263081867","7525860161263321144","4318933356192369039"],["11181237552383180404","18072147566331090144","12860372272496828574","1065705973674006748"],["14059228033561864001","15905045125123046849","4398235551730124447","790999912873585008"],["14326713283396633513","4379956257255335212","15656808221397937265","10599595596102041913"],["12112604026286980856","11740610693895172502","18253278145373959296","9030567464637792320"],["2300656791050566211","17156849853650792432","13178999887173126991","16976664264624241044"],["8664927529604295866","685182624641549224","12451705049063512418","13953818865251546028"],["13957382340661517271","4505568149355508590","7453429055986168508","4197834403701483285"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["11204525601634508604","16275101834129427097","18209878994280977055","9529766290549756386"],["5574006304970682204","15151215905058375162","2056440981311775346","5332351346247817969"],["14560361916463477905","12154748441293950811","7103736952191088803","5385311733407958096"],["18035075549406625442","16243600152811109026","3269311603406147698","3499671188555958592"],["17577943931139662459","8274523996636898922","6250345487320702512","8247601807646644801"],["12782359838827805310","17168201324641368592","1851370207489420671","15700299030987602643"],["12112006423633970711","6700908719587182953","11157260771829112375","2146467827095732139"],["8388858808100243224","948632439616845082","7676623625185267831","10920130972467721449"],["1758094246202606897","6333933203881902581","4900437965550612327","7783371816820841907"],["2603358833114514667","9826851598199445334","8120489914222299649","7080462921162197946"],["6784485899412219607","16239647970052276184","5253188778518397229","12439634486994714409"],["14210765021792518549","925657247767988113","9228684801787917793","7949852620497035935"],["9815021276407300488","18343686196975706492","15391546033070119164","5656839627261465674"],["6418265605074204966","14410901919451724887","1592287661058803195","11935145081283112192"],["10890162406508600388","17545295964332445011","5208359167943184076","15902054246923930181"],["15730892647098388815","4095983472363929063","10212428483911857380","6556145803651606353"],["18302278232993455585","5866746129502790575","5367452877656478836","16111898413787169853"],["3935714712936506891","1558899467906171832","11158536964047132658","6937018615398657481"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["5863797412168999372","5909684987128331662","7888051789199111300","196717974860542139"],["10320336833209189584","5798469141704399700","11129307180230165685","17925636863974172475"],["18198343327543477918","11983839138417866638","2992060688216096328","12521677673966268157"],["16490449583324593123","13292698008997710829","672897117798095321","13066264846958530076"],["9366198980809006804","13118145762782240928","5938216967374357028","11569282761172329446"],["11035264777037467899","9447030428071275231","9932178647355992004","1633971810621466868"],["15581425021960149750","16914243582109582599","5648088037317841105","2774134180106738439"],["12884980276361410456","6004167776753592075","8135885233130160427","18153538305334866202"],["16470400402804222711","8151692305877286197","10443514629579701780","2626263874696699397"],["12316936394755459975","15734345411946161389","8159298847633052888","3354986939368640204"],["3258494868016308834","12814272212397389588","6569299714426225444","16058720483177174787"],["12736982803520660292","10792381273045893388","11787818300076036237","6664333409324311399"],["13131233686430501803","1552867940838248015","7619287828450264749","5473919200225639758"],["18062546410795780442","5140797786141373203","9216614485941266816","10827151766038071145"],["5118236393582729861","12912425291101101225","3527644650930576553","18074886622363454107"],["565521274329348408","3319817834082994925","2703632856154934294","7327621021207487261"],["42214633821325876","7642465584390604271","13792442575400304071","16478080977641227647"],["6415164811331329716","4219874234857648235","17322587463023287021","9918601287017672074"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["6923107320006950486","7354536018647677759","1740882440385381599","10812550403539717105"],["11067997598582189749","12331212876795839821","17036182231912877936","9490837737306736193"],["10857384029072851289","15944823619207675375","5449154655192913477","10259301867349730583"],["3993423108092323984","446005957694934935","8305728747179895914","16426199290662560229"],["8376197793982879446","719623028897827833","8696456274946805308","7694937677897470758"],["13620613568752753577","12161881759992671453","9326927559975056231","745448883034337331"],["9489174305604621897","15808272770359027798","3655074970874295721","4768123221905436849"],["14392467748244672282","11604770571119568086","8370571916978575613","4665305759470918891"],["12429860475976741233","315309757878927778","14717599161175370779","9917478237353694304"],["9214249501541747307","4661259411243715960","15898130085548855744","5747811311413287430"],["10968336420076400675","10318000758820693461","13106254447482077314","16699733540820616627"],["18192816363985299912","3851626775920145709","662544311041152077","9085831402949344069"],["13168476558318933065","17482730417474113405","15457254834005795594","5296612474718571549"],["6155684158421216192","6750981815803163595","15460112759373432901","10298745473944126651"],["7563373845153408547","3407147541601378660","6958471755316944958","12285714124211609429"],["15741879083580008813","18115187177137573123","4441786014675483005","18253019013728361510"],["1304703532628949763","17669458781694179742","10103562555367067920","16472918911221179964"],["3246152414482800100","4585589338748210554","15656795189505436554","11442441119372142194"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["5915432584836613023","8138192344159752320","13653514890249124856","6052770757651887845"],["1171631105912681833","17945858685084631823","18109539947113076657","17899753968996134689"],["1761227563881282031","12960811936782358497","773514043096166547","12241271822631375248"],["15212437896298548443","14612968109080925129","17243597209055209516","47360690425935660"],["16031105214233483620","13249807643856722090","1050397530379916698","15441850246250048866"],["1052946465661460995","11484451765529247418","8492922086348576031","10769905090888739746"],["1516929231327185028","1886950353269589359","7809084442879756040","14300730568221909037"],["7575118618717878788","108294713710111989","15509361527968528453","10431219046492969772"],["4189427271114247738","15891859148366443621","6992074919952900207","1595514556347202059"],["8958357551531284525","5714933826004977586","6569736868814493867","3196786434422313655"],["13042786241743660309","816488978054097485","2124694827730005528","2853775646512962210"],["905611340550244709","2510063893316150196","8786304168384150363","7172496013100343273"],["18431989215034121967","10746114754842155006","10944621370444767095","10924945194736001329"],["1006883741067355130","12436027818732019748","2883684304803185242","12315757149269885039"],["1160262729005076504","12787004421905233047","8321851418101236494","3326621899985995074"],["2948027714291750315","13477915619463422348","8878381479485409255","9207112076869747916"],["8664927529604295866","685182624641549224","12451705049063512418","13953818865251546028"],["13957382340661517271","4505568149355508590","7453429055986168508","4197834403701483285"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["16712897149251734534","3293400938774390410","2758184333156663227","4812489787843690018"],["8802814185421144822","1543978346819202358","5518380169370790358","8998159346767923302"],["4553122602894989993","4429333120681469594","3739550631764984060","6366692075416087444"],["6680369334488580783","3183708875924876563","15965295179086041257","16388586901321209450"],["8095304671387600538","869441197310960687","12374295520426073177","10431712573561995398"],["14295762450615667479","8102711470820506867","3982528494737682149","10503398955234870820"],["11537683126238059305","8225606291756210056","2985270777845271229","9144407368239098486"],["5131379467375771557","10505656445127494120","6714477402096191509","14265970543940757182"],["16060063367702589661","17048799654925541270","5977687954806524913","4050117275435145350"],["504218928431043294","14337717202106947098","3734443466793866200","5803719740891509982"],["7545490305317146136","9219425139385809925","4284423048568571790","2474361231644908962"],["6575031779722557841","17191234607389406315","10023372547624441981","14627492488772741714"],["9898691580358922128","2339630585052535588","16680114130251158654","3648132161750294140"],["10440570573172787285","7115022768526972987","17359674480813825641","7213610141328931906"],["14885187402283475381","3530338180499240795","17615810813010832840","2593011395216288521"],["10256478807282430557","2419589726080268236","5745686184303528177","8595692655475107526"],["6083709881564767747","11385987748414916594","17712036542725284919","14257444122340862923"],["15177785680426165898","17161321117894612900","12046680953755353567","8722726864902268137"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["18390485595031764330","6927907399054263113","1721093254305680718","10405229148587737856"],["12895340022534170807","4650654921384457545","3658782676381745035","13678300707872051778"],["13330524025041739393","14067625435267109678","9365828083022160195","10146544496354711487"],["6794398573544469665","4587034247112551456","1867354314448041430","6778968529411305922"],["7500210349169333391","11361037446562673983","15866385079278482357","329692899935819049"],["11475305246138786103","13677248450814372156","16614435913221172556","17120097870801479987"],["16149143017676449001","15896073579429728438","8797796709204313828","1166351614260951814"],["9647798706493670852","17691682781632043301","11644270263116020275","11766749270127724417"],["16842101766181328468","15538899830505097758","18144041516490040338","13271718549656662324"],["3897080414955082793","15294636712259900683","13612737798374627287","16122092249737603868"],["1551864370829258185","230537998450234583","10801062388690282287","9906261271399767723"],["7938567047855336518","10914455906931290000","16235692915339651807","14307082089708072310"],["16132269934003690825","5961495851726582746","18247820676473628871","1778726239565693730"],["16193948448389308784","10251209361096733381","15956263189610144770","16780575551273910791"],["13718717903302344149","199195803650498335","5572960241351876881","14866680157968988185"],["17999297092856444433","7069093784479064982","2386376515242916760","7689812800244117401"],["1304703532628949763","17669458781694179742","10103562555367067920","16472918911221179964"],["3246152414482800100","4585589338748210554","15656795189505436554","11442441119372142194"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["945002330525449774","17627851030827859780","1247884799007788217","234773023835702440"],["9363157669252895689","14281474134863198931","13459877779687138604","4348676980042368145"],["2992524895531731761","3404834306210576552","11926296034186805275","11439636245891397783"],["6107560830383041513","14979657349731169538","3229936861724349970","10674664899271798130"],["15534472805748810290","11521750093027438664","8103367767558731875","8587486686000446993"],["10430502302164866110","17030583490784995410","13239266955376893691","11490679013779478317"],["10315256995167855314","570442372409300552","9925607084916968872","13077799668406670057"],["8322539226431504582","12455629898833853418","1124837750251805812","12086969728311947096"],["15283313689106739442","5408911936641232233","14555577585098614290","6287197603163989326"],["9097557293784669780","14643214070229620366","10108684510230718322","4510864038918564093"],["7019184868927947405","2474329960484266824","6802179027641977945","6218449798318596981"],["9399617149243990489","16211281791031221200","13653654227620430259","582641858321389389"],["13976160302930693336","2673762974102682807","13064823702767232934","17238173469932073933"],["1301539717041453009","6087537892551100634","13278744663621813814","7513000116571541023"],["12686844342169686209","11009903743958348847","12785792583267381205","13534971838275715864"],["11560113270944911517","1255191870053003772","7596734350465666193","18251877960025099801"],["15571694798674843709","14450168892936246059","16930426575830225364","15861970122588656593"],["1009749261045559430","6843870857975310600","15817284531017899292","12221742300252101245"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["10446712684499760302","11780566086898489443","5297989894305095306","11351781493741909378"],["9251353665313321083","3799895369573735564","2836805998732789361","12787557645522961462"],["5209758364343149386","9121982956735945980","1988784769727729639","12339739345814613844"],["4683417557125644534","2103655743848890280","7930895358975443410","10954171183866603190"],["1753136539594811090","10146561104303619169","13050044271333502735","16243870032551865202"],["9299566039142272146","5672178907881884598","10125003854021020673","16664478547922674888"],["2306609280802261408","9810930475507777236","6872371769173503610","7102428325821991474"],["10033205407301393346","4150033975081837610","4089376135976510085","7581462358823817279"],["7954773040959476044","5746001643584828561","16256532281122584006","1141426983863005233"],["2272244497847315718","11247954186680117073","6554530611463359083","8178717593794392116"],["10697576149400900118","6005544380989635708","5175232687346160477","8872705828625363100"],["14742383602677195513","17987095956015148694","3664880234062012905","16095948957010786374"],["11291910312573859803","3871664959583061048","8183417561186107974","9238945430641893736"],["177300763338917532","4217965429208930464","6966099165504772903","2473874534511146136"],["229312754132139016","11656801181907948972","287887298740751275","10009469220208895254"],["3063188952779781571","4689153948529868916","757896854652309444","4116300098319481477"],["2910783793230671711","18426501896359519819","3251183640951023312","6142882185532959944"],["1009749261045559430","6843870857975310600","15817284531017899292","12221742300252101245"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["14366887580563072904","14999167066543577687","15759806387645608657","10104096314029268970"],["10048110487696434188","6859629729248861967","9235487713515379654","7409997996974263308"],["1996250327326440571","4720601455912544280","3167259798087458148","11246355004558577115"],["35087628257902076","17532667941698989508","11575066290996407772","15592609160011802890"],["15747388105923363773","4073647721502806601","8358219713660915838","2667701489042123667"],["944135834167084424","8938091854823309328","1763557325990962631","18381174348691748915"],["6746877730511488055","4138998755486020172","15873526145914321799","18026085925264103385"],["6964351250546770961","1252724193375966246","15172105675741621190","1376149910152651253"],["4931996058127719483","1804859621212828581","9026893230363935617","3508109599503355541"],["2730028261573062149","3176995485026779179","7809890388139638590","9104977224246774564"],["10104688413720660392","9620595643678388863","9080198432769833161","2560067461199162918"],["6955581041204481803","16045329428514319333","15163308301873644633","6453754832587773890"],["7955695176572837994","2674169504901282563","3095000534285973907","14555051043710918917"],["5109498295416911441","11000876652970612348","10626008839681452331","9228682672047747443"],["8159579119316236627","12256258676735404749","7116090073808879186","12158964256373454248"],["10394398715926192887","751098723124198181","14848903296544930055","12102074016626511158"],["9547098797910466553","5489076642452678130","2705285132016134627","2677114404556157514"],["6415164811331329716","4219874234857648235","17322587463023287021","9918601287017672074"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["4177917968179607226","12807165941245247977","5278773696696243322","7365542306019738297"],["5262674614927674648","1089151782401821296","13264630448486895600","15134045704132527918"],["9298721427127948982","4064182565266710940","10192210630417377673","8228613285338832733"],["7141594410297931360","2187403500867534692","7321223010978368954","5629567535779288833"],["265145338580252450","743866603558137751","3569195953295567870","12039017339242791826"],["3538607351441207972","12495562409560886516","8854599687609636796","214866685520710721"],["16270315266231319913","12020991775965511121","4085240871906869680","12785837571824697060"],["5911779218961368924","10254594078599695807","1446272529870036472","5831022681222161686"],["15949057447430569180","17274776620647605684","8314813947754441745","7970785187697465886"],["6792307174979457593","12998256028889412270","7320516114070803216","3815952409970062056"],["4358014740656953281","17191703951391071706","16054975938894608051","13199401402525838369"],["7234078498356437508","4780006626222646544","9226988973844523459","11774368108656387019"],["11291910312573859803","3871664959583061048","8183417561186107974","9238945430641893736"],["177300763338917532","4217965429208930464","6966099165504772903","2473874534511146136"],["229312754132139016","11656801181907948972","287887298740751275","10009469220208895254"],["3063188952779781571","4689153948529868916","757896854652309444","4116300098319481477"],["2910783793230671711","18426501896359519819","3251183640951023312","6142882185532959944"],["1009749261045559430","6843870857975310600","15817284531017899292","12221742300252101245"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["5401164325457392989","9337264451472259457","7533442255065782287","7762155920357690821"],["1980952025477511641","13034933837623217683","16439877577000509541","6443684853357095463"],["924521499523830138","6596307124953784776","11903583745186766187","9551610097930081800"],["16345990106812720785","8857147752787287343","2206239462804072346","15891792482736498317"],["14277795136312707716","16125911134699639690","18311331553548858401","4458406038889417516"],["9708263545824991259","1914822051930755307","11725103739213813098","1830039657287509706"],["8266007973821295981","4727967888997021936","17836178032545762375","18263059740983887135"],["7245159372710168635","2281800992824279327","15969356162546089477","12555037144539046855"],["13704168106728038581","7256885199216890418","10846723702208883757","2610194678254692388"],["1251725668258006449","15901774484602302802","10413557491728821207","15723314085892991349"],["17764916366939559913","14230571096075579072","8367628141149701593","7293872574257569855"],["1496762994197062251","10714766583606713398","16857974584293249704","2615785121233711516"],["1526240269213566719","4879672609960927514","17208252762947702443","15460099195494946709"],["11226664403013364330","1304931744160453561","13847822432448970321","11573585693769003622"],["14445809869875519601","9871908011709614685","6066790333829838790","7197744070257148913"],["15741879083580008813","18115187177137573123","4441786014675483005","18253019013728361510"],["1304703532628949763","17669458781694179742","10103562555367067920","16472918911221179964"],["3246152414482800100","4585589338748210554","15656795189505436554","11442441119372142194"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["11005345860858511584","12742747783843360484","177454221111558357","10378462315222342974"],["4990666674610128524","7417859633383032232","4376335035863818292","9706297373705617857"],["3794244281208511833","9619036595257452562","16387144251067009","13646633659304888084"],["3395307769748051032","7803026822424217235","17724391597413913160","18402915303465235395"],["18372535690697476262","3341812479024159277","15066351832300648796","15869121648379389575"],["11587606391248168863","4429195818663005964","6365392571885946414","8232122397359775222"],["370795895422985315","568963862493810963","1760892191133570702","2591065366383296910"],["4568433682444326808","8072984447016783582","5044753781275313115","4033325890298253312"],["10250700900200588035","18000878881740967559","16168229197581615996","4677850217900114945"],["543367089496308863","12189842305358369450","12018722800796121649","15605971454352656594"],["15710862593135667637","17776902354807961067","6413219568031406606","6651809248860082761"],["12226076977630585410","4672241956951576086","2196981283009370212","12420344690985856154"],["1069277318413828230","328704960298791177","5249645311563137664","15086632092758810365"],["4462331958312604318","16650078620177977412","16775121747219182530","980003801256391968"],["14545668540496819887","7821916517086822587","7092161764914506148","6976980496372085105"],["9433811517003876243","7559172634675429567","12306784915720374309","15194536115313573868"],["3067850224170722684","2418430893820050863","245707489068050885","12530614978608305930"],["3406474592895846397","11652239052288972463","5126991411199125066","13111533335706729923"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["4713638915825387080","2000821463561010643","682619924041799519","634522983038466797"],["13193455655303602089","16574334705874106973","211655946734561908","15162401131050544354"],["1050366227041137489","11205257637954309982","15762624108222006091","12058426775934588556"],["3550992361958271701","2334520053424569432","8054046836154100675","13292555422326112284"],["7204074418767508229","1244364686675461786","3909560736267922194","409912551577439578"],["5869632269072939668","3797858290869816656","5854915604748705134","15607921328632571312"],["6040012481277490704","13803381737617835945","16737455493717119994","3527878014149838829"],["11297692493321385436","11202723362599761923","771626675796357530","12659575112633169592"],["14663172937134181896","9524692249342197450","4842285997767473907","18014166174490495924"],["11843379329023470627","3718459614567579319","11288691070354782954","129157936791404531"],["18358680998842363913","1816473870618105113","1781176806276370199","114131376959757725"],["13256393572748266002","3474991111821469956","14400708772038816844","17494359171463872184"],["8776411078729222680","10084926635492840578","2640807042260854338","4676632870301733061"],["11920110412941851912","105098843899263291","14382902344765316005","18097168311014518837"],["4418306794322773770","1147573879164347211","13230899947333305011","14884672280569392984"],["17939275354105905784","6176019651730684071","17134397952579611956","1767451666075677446"],["9547098797910466553","5489076642452678130","2705285132016134627","2677114404556157514"],["6415164811331329716","4219874234857648235","17322587463023287021","9918601287017672074"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["5945526138927632649","5598351639074627022","1196350805559263284","12171707682398253843"],["17174093812294006180","9815550470404801315","8843304870028719283","3018346068982664787"],["6802942827792274870","7897832942056108052","7872140993412101335","11462526728659537330"],["6756027686724627095","9968350724721921081","5147760785717613203","9358325351817325487"],["10215127350603112951","1937854461546407813","6482494283710278839","997494254657807232"],["7068151958628804957","11602267218269006197","13637166837120236380","13326926493894847860"],["17777425382053021818","3904870381443756369","1571624622437087964","4121100485901528044"],["17226168180633121502","12130214293852309372","6866358477621119112","15657999222415058699"],["10969908774526782501","10870246744063932346","10006168851410110437","8238688528968131458"],["1257492362303629491","1540997210892455099","16259836054565765140","4357768784558512145"],["4713424979368741976","15818448731534366849","9635986254451935332","13328460316539700485"],["5073338611437636815","6235220799076818645","16427446241096989553","14431012687519436185"],["12587078712976578667","10369073325662380003","9903221412582123158","533739295270429378"],["8912397279099582774","13456091493388185187","16744371232756050069","3620631867080440924"],["12518364807963617911","3958963961371062252","9229677174163475090","17810133440533350014"],["16678036705680207078","6940188679809787731","8315503956381144280","1632928253981145565"],["13401871839900213901","8569569462739358696","691897392387540678","17440826828888366337"],["3406474592895846397","11652239052288972463","5126991411199125066","13111533335706729923"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["2179201666286081845","4557634648237384966","17792925369755016434","10941833533688758280"],["15784752702338715568","4853247680031308255","11303264497108902372","9793394215204435112"],["17843149445683889600","15073224317060851300","1665637467186953512","9783399927694142791"],["11892895911639090120","2154575775945915533","9546061582351870607","5709461862633785528"],["17769217681276475116","1779423127527144405","17061505150945354160","16499445944780104231"],["18069374828727298524","12019351138587763829","1223430424822672688","5991234699369509283"],["14575468557286029870","844401336666873421","10533120278285198055","5578465695199978366"],["14619832570044605031","11187397268772117795","17581482814102477679","7987298092708797179"],["4740192821473575315","15712790404972494753","1781914398109703113","14422651114271995215"],["16684172432857582256","8482561216372319062","11599128951607831390","18291596872826904124"],["6210558107516468941","13042524219446151546","7226579121036876920","18385280311278798481"],["11065154148311692376","8726813160648950456","17578524634430844426","2404280348160831338"],["11204283961490489890","792133218942859103","10588739997713743848","11980880057266534447"],["8948423108364767091","386526201629930062","2771023804773692286","16856466878710260081"],["11522321747367567939","4953778051201895284","12528071027768886699","13701707618982875971"],["13778902167424825901","8497971302630663363","17872247883514911749","16014019482138690601"],["9842645133718659075","7411199794106987225","9702592945825476791","10491493789843712806"],["13957382340661517271","4505568149355508590","7453429055986168508","4197834403701483285"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["762688689011073227","18238984421603212595","10174106574698460632","17603701447734379744"],["11747420869222069339","2893341635916452451","12956588183127468090","11528200730243229027"],["10457484210685325699","1447267038368864867","5261748223979118187","12608094622220712428"],["15302610192387881376","12928106993954447455","688606520777805744","4761891953746001067"],["7442255833886218723","17526109300161556640","12893622727095301824","18201593991117690619"],["18375099950594086351","12372731247410611570","15092863326264880843","12627033346697448951"],["14859033699000725622","5195198163661542266","5534145416422263463","8110908470293671659"],["3544811001463064105","16655263783186764114","8450460458239922582","4296609331003390632"],["9712332120063720323","17503425851108890269","10464164267277217798","7621655262793105528"],["14664759705815001236","3471798417523293664","4304955073876348566","5385900848908985513"],["17405055682024415601","6215763358460863200","17300764901546291625","3379025829003915154"],["12841327974194106847","14940130726218714490","11003544881333949135","18436535964467998436"],["7537376419597337062","3615559138437557877","14125947415471990753","7620039683509380892"],["17434497926064428630","893064745537587373","516576073120074264","12706985702503960302"],["9025070696982671680","1497484348224854987","8313997392316798573","2971425263697361410"],["5167415037959473197","15311589721890344651","699513578808721286","16303601929587585408"],["1765509791638323905","8396028619490428980","10365766781411666093","16853273006907252903"],["15177785680426165898","17161321117894612900","12046680953755353567","8722726864902268137"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["5966330933863481497","9569925153025393015","9304066412873899364","5647937799947051218"],["15052143141597586962","17746956250554239541","12806221805117328334","18159733681583665390"],["4157331724306481763","11624700224750636426","15274345733156852918","13065719066685864428"],["16610154901605765308","15326572536301249032","7666576078241901428","12822792404978929428"],["11942645566866370690","11599630916160508011","16514444929489488092","10992670499646978644"],["6792180132523829621","11923038462991279489","6943250991387748293","12203132459486560812"],["14661546930629110127","15293083519327499681","16786841671596498588","16299248555951470410"],["11729247069603646068","14925963151780602533","8826179421639322785","2149277738686467049"],["12239337403287233311","16231057354745080112","16848448396949126321","97315859386325800"],["12775799951937643953","9063128055257409942","7855766974126227838","15925680995616966613"],["9546396644195155233","7398314287751975058","17467285845647558048","8762359623404149501"],["1906513453168362194","8768955244341391344","16143187209416615265","1917645284793936362"],["2591572784603637860","7742571962565292253","16676162313698980851","3590929280388886846"],["14782975489445966295","10792771739268556609","9414145292920073953","4876467054457394493"],["2800844707307805991","10879524353582992175","12795041834747283666","7495616762326360159"],["18424937875860320752","2342144678369812857","905180804205444017","5939318627869171359"],["11447514024341485103","12146861042738531383","7900244620530622864","16108668432009448339"],["3935714712936506891","1558899467906171832","11158536964047132658","6937018615398657481"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["14846865517844259077","781324326458116696","9503605086377834101","16257730100112151651"],["2989163371821108270","12740101863510336225","16859289389467603212","17385526361088098863"],["5338537409782652871","6172592734070037334","693925912524682580","16741341834904370292"],["6848868362356665039","16909210013874375809","6082870231390083571","16810785304679670036"],["8739904232434066112","14269672708348115468","7951098294805724645","17067376570883675845"],["16146531341775521758","16544815245964683884","10857584942849270594","15590889999267181749"],["12220027417841894185","12045527247844199201","911875951799772793","4508237965287065774"],["2809866170745189379","3380132894764735236","15237514189880345656","14440883676327768571"],["15936977502205198654","8533020973034557557","3203540068236490683","4313065249787500564"],["881563774017831827","2078597313819328628","14006012361887470379","11483305045891863109"],["17819961076340739338","6170321736788698733","8883544055229826584","5207823719720907078"],["12842054970732313308","14724547485316664086","1438926876226182328","13413614177595167896"],["3272036264830859598","9487767085948702066","5697439744112645656","8995671432345312728"],["4462331958312604318","16650078620177977412","16775121747219182530","980003801256391968"],["14545668540496819887","7821916517086822587","7092161764914506148","6976980496372085105"],["9433811517003876243","7559172634675429567","12306784915720374309","15194536115313573868"],["3067850224170722684","2418430893820050863","245707489068050885","12530614978608305930"],["3406474592895846397","11652239052288972463","5126991411199125066","13111533335706729923"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["16656694631000552181","12763287239520792698","2486929393066651663","14703345425166270423"],["12268664553211627138","5848655860030156174","6030686371098175807","11821893016453237778"],["8066721316404019296","1284748522409916108","5896119882760937000","18213309323921820362"],["17721164132865831626","7714563932551793212","15548813240858168687","15567794421610608941"],["11794791531842369580","556493600155764843","18433087156041297053","11590248237494811466"],["2904297497820569156","14173878807788169349","1695677249871304202","10999930924670498599"],["7133920775250395495","13511505707403619294","5670787526970309498","542496596542590019"],["12061648954648216346","17715319368272848774","15367462876596553732","16294431757362077649"],["2325613432909988098","13596268553735552023","12170811799512351579","5042558025485767952"],["1091951518047835609","2268796001872140033","7249823105812884364","12712014541675924218"],["5874365821719156723","16359796497256132258","13911075562093961646","8282515698486530704"],["4442358646309375639","2260013146796892835","7588711326147598198","15579199376762050198"],["7355691006257821457","6140324212731266501","10535403821496184065","18304303914772055098"],["2655234331605817251","4532042996024008654","10311751109543103675","14458754912814060580"],["2866616321834175241","10584709747464312661","17882603964730734333","14519739760572469268"],["4319222167579394593","4084006398482127123","8645808981779095543","6833618676974263156"],["1765509791638323905","8396028619490428980","10365766781411666093","16853273006907252903"],["15177785680426165898","17161321117894612900","12046680953755353567","8722726864902268137"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["4946899183001499246","2578149818189336177","5588721470693459849","5529541928968030368"],["14049318370533069085","4404680254066887728","13418333462967231803","2350768385672157395"],["2617896632944561497","17607959206611718876","5775937535759215387","9656592617708046414"],["5203630178927145007","15701292967466607207","15401702183907674482","11207817643290752939"],["6999705060737128832","14795493825043043413","4768641459202696719","4489551220126468554"],["12940980962817395234","13828933309834903601","3949969253760561367","8783940855423247751"],["8757326447027036950","4956665433427970874","2877780780081984608","207015008410602902"],["9213146666622846293","9443021128667046668","17844743588725370646","8397168351078033152"],["12546189371032957131","6141466663819138143","16146995307776096859","4797969141999314722"],["16271204805750995462","16235608081312417560","1971649869991805611","3591153493275345984"],["16057588566230001847","18442633249692472412","6639864992510596888","6807916065007340965"],["13295392323537088846","16892658901618722731","18086606740141382447","3092473480127135684"],["12815803425663799639","9385755527934003561","7684294876368195868","16134361184274343972"],["16066481861709542065","15109945952765615207","1700131088232037128","4481413385823098855"],["2866616321834175241","10584709747464312661","17882603964730734333","14519739760572469268"],["4319222167579394593","4084006398482127123","8645808981779095543","6833618676974263156"],["1765509791638323905","8396028619490428980","10365766781411666093","16853273006907252903"],["15177785680426165898","17161321117894612900","12046680953755353567","8722726864902268137"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["95724666299299919","13169975737336424064","15687927380220637325","6158485623631505356"],["187954352644410430","10562511107497749330","16014077602316038224","9250033738992623876"],["17686420318832706582","10810710565872866029","241227450247808438","17737160033072931067"],["16085270044226968743","10550961702026293213","10273495003592509985","2124569405877537875"],["13327045176728385805","14234910167644228565","15199965287217182850","15929495894565830985"],["8001077463576901128","6812761018772181606","10246909782603962686","17126128832263788165"],["1943707563337572617","12186222291274581697","1922375797067942674","9350760812247559628"],["17238177759527966111","15434172215303732263","7692127014107772655","1614000407903919160"],["10937886090653659130","5032884805530227054","2505169738951543873","9647667388955594873"],["12571673156243548655","10817923154680911478","8987736667392612520","8174639769740304756"],["26962442345913821","7704293719877054608","18334626185011953471","15123084846388253970"],["12681638507041808876","985150958321248755","14648585824814824927","6403135315252079231"],["8106538741212578245","5145331257369122473","6913264061103036805","3739846587709411712"],["8693885337211291996","17595095845788595312","6938078477024276772","3971472463383988098"],["11522321747367567939","4953778051201895284","12528071027768886699","13701707618982875971"],["13778902167424825901","8497971302630663363","17872247883514911749","16014019482138690601"],["9842645133718659075","7411199794106987225","9702592945825476791","10491493789843712806"],["13957382340661517271","4505568149355508590","7453429055986168508","4197834403701483285"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["22759696131741105","2328663864644721752","15374910801191323054","11835240513547018725"],["5484596606771393600","5616798832701014876","5617348547258087859","3205275632549422957"],["5601898885250908013","5886862602428560214","3466879131880441513","16859171814269033481"],["12346699498340310579","10706700327969436122","18033140159384828899","5466751222826819816"],["9902062106197969834","14189847014083848727","14277279679808389062","376417946183159098"],["2894745177873942697","18340022597213313022","16277354890982027191","16388912901154787220"],["11668358173590882373","5269133286348947012","1737102581358023761","3909487315761150409"],["4564170796306079514","3248366786562256296","14110914467049589460","12255094622080097901"],["10269109049263265245","7565777302761420238","2286946384318904335","11580583448423328435"],["13976606309616660993","12699689921320591112","15012876870359483347","3530581702471601440"],["13670571295407991040","18170812214225278726","689368768205680388","9720620837075684350"],["557052533249833148","12530789390802463084","6927972081758336394","18354797041503940082"],["10046897635196721211","5224511250501309037","2783555708733845998","12850334506420166595"],["12696362634841237731","18381679188989673579","3462482627947611446","18091612259046453178"],["12405477740794628121","7728267073555354705","12080619706068899913","10255372162978461255"],["9433811517003876243","7559172634675429567","12306784915720374309","15194536115313573868"],["3067850224170722684","2418430893820050863","245707489068050885","12530614978608305930"],["3406474592895846397","11652239052288972463","5126991411199125066","13111533335706729923"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["17113719718702858135","15266070456049895831","1076264444999593967","1310512904485945643"],["1915677331806903860","4511551668864283099","15523985855457868919","9749358482538500438"],["10950136045730673965","4391279514402287050","5316916209861553993","816944013044485184"],["18409286848342437026","13878546508861652024","9255416809703404072","6947820143462750292"],["4025038533102670095","17131014205637982052","16807890876991886504","6905035516109476388"],["4626117316121589458","2735793480540970381","16738026172824552571","11398726660222869823"],["6472326476342850781","9720440460052645880","15116842725283597790","13586201538786316830"],["12527339133192033630","13073449325391316304","15017194771879064721","6818650651461625758"],["13889573824135095163","11348604374898640818","15801918737141663712","11431653835857771218"],["3926740451181972160","6979105428092528676","8342045587750620665","6894502565477160572"],["11787357180858189162","14801139370515693314","4439021105796881546","10673723457759973575"],["14694303312985672230","15151164188197501618","3462374740329679501","7725115065954798575"],["1011054707638711793","11567576365784712353","9915341958002069300","3738693011485199556"],["2514070654482104242","14336566961745765791","14800941964162370874","8552724119813585323"],["7638267231786509774","10609510578699332613","5112755734341472188","17746966850517328166"],["16678036705680207078","6940188679809787731","8315503956381144280","1632928253981145565"],["13401871839900213901","8569569462739358696","691897392387540678","17440826828888366337"],["3406474592895846397","11652239052288972463","5126991411199125066","13111533335706729923"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["1791144642449306787","12520594245120584908","13399207975669553869","4590097441220262702"],["566836445637821000","3292092959209334973","6148262878020545725","5590544489876071406"],["15507705401572165216","10151737177586551176","18063772218947832299","17784347061152201828"],["5445317107147983092","7690505354878949611","6775551538482206771","17371250460886563545"],["8332900506255013175","4073911107162327412","697384496974503551","12352192028225173455"],["1254998621226148558","4579430344481978368","18255759559999576277","8921364605763199307"],["2570327129540540091","1425800438184483493","441129486507543652","817599652787824288"],["7059192119179948707","12803554849648892243","1933523829157100073","15777040443794716364"],["6974033701802478372","2394025768021068691","11501314535923255027","15500984019091712338"],["104486473210499592","17966044594118701237","7033698843375356637","14870309116646970230"],["2570589686715351329","178918966384750710","17884439835258358088","12635518807591067680"],["8779046279378536542","14278608399070713948","1242533637156790574","11926497439515965333"],["15106337463195151467","6969037277043674848","10004661025187092578","6653489816187774084"],["16193948448389308784","10251209361096733381","15956263189610144770","16780575551273910791"],["13718717903302344149","199195803650498335","5572960241351876881","14866680157968988185"],["17999297092856444433","7069093784479064982","2386376515242916760","7689812800244117401"],["1304703532628949763","17669458781694179742","10103562555367067920","16472918911221179964"],["3246152414482800100","4585589338748210554","15656795189505436554","11442441119372142194"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["6483640249007846847","8227531277136284277","4122278839285351951","7344158849998142796"],["2759453092792419776","15179301112861535084","7091961857113461488","9802175093022652436"],["2337820349849810014","11801305236592883651","3509784021414758276","9175546609588497144"],["7121081381830947991","6575988130846274963","3196422984450704690","9568028467504295191"],["1814661179900163535","10686924774138067424","10591270399992884449","8100408333641505116"],["5890176774010856466","4853431535864241338","7714263377882994445","15301548160285746300"],["2178700625649762197","11342098348853252807","8781707457604268160","5127450430282826923"],["13053620739324789992","12332834207626850568","1300716535245989262","6343375955545025506"],["7350593385650586405","15534182687580783970","12521652830342405343","4802796790047842820"],["16149787028876901768","13383525661630813028","7464923054230295572","14788743579958337948"],["4811255288701289943","2610505922362499934","13100244408468467850","17165438897307509458"],["10485746673907430893","7584356059735043433","6019938333958024064","11558792985166283682"],["9815021276407300488","18343686196975706492","15391546033070119164","5656839627261465674"],["6418265605074204966","14410901919451724887","1592287661058803195","11935145081283112192"],["10890162406508600388","17545295964332445011","5208359167943184076","15902054246923930181"],["15730892647098388815","4095983472363929063","10212428483911857380","6556145803651606353"],["18302278232993455585","5866746129502790575","5367452877656478836","16111898413787169853"],["3935714712936506891","1558899467906171832","11158536964047132658","6937018615398657481"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["8575764438025335896","4771093450273035249","2439439363775923860","3505671302809893520"],["6039209001851825968","8558363680304529316","681226197219767375","11065244122150238092"],["528593558447376212","11710383078844526061","17462976971345792974","12337446017496741579"],["1494388681395900510","12377553650312337262","3879921713072156429","3578704018094250484"],["14229930090248692217","5761306194287557702","15794440353094154816","100436181007850840"],["256962256127429039","10773363811297333814","6506754400009847057","14585191857077465749"],["14903728780344483101","5126719085869587048","12190288935951692619","10929163953659026921"],["9719049335936629446","10961030637226103471","10713193709536638254","1069315850090268568"],["9712978098086898310","3661948618038818792","2689873457088949799","590055566843220704"],["16601289090121257375","3948142040406201974","11031439870141068302","15105290832843418084"],["18220435044466121201","1524081598493145068","9182687485490671621","17947946217697809333"],["3797683847374834440","7217846425466692372","6013244844457308234","10376245655136558095"],["3835206812216095463","12026832811162701429","5483864145173838833","10752560929088512758"],["8706155524435099587","749900559800801747","4212855365484832077","18424988917288273444"],["18400580176548193051","10557440877391828242","9422613456965922777","14484300719641920408"],["8715198501375926768","11961004026746800333","6309882595942924551","8254523027497297205"],["3067850224170722684","2418430893820050863","245707489068050885","12530614978608305930"],["3406474592895846397","11652239052288972463","5126991411199125066","13111533335706729923"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["679773700049138428","14351390489467983383","12138622012191548433","4040784648779211352"],["13554208850798805411","17324467873104932246","4637794736374788140","6956297350913272334"],["16314908808870406172","5903394853877084976","16341757259061216082","9087225827287801304"],["9244728632674867832","4961585129908145036","10816298616487736765","17428132829536585125"],["3519153732103576723","44888705510500721","14765706320092091724","868725378765688208"],["3522896820411859983","11064571832546631981","3076079481160154342","10760830820073340864"],["12085477181104355462","10315609187917528290","18153510521864142355","12500726925041521696"],["2668389827666461834","6722249108146898197","609503596440141802","2887212046058034583"],["1929447755319649543","14172397216138978192","5251585411066963137","2822751385928281937"],["15961411866492831082","6443520610344238039","1766473611499308705","1158571448343991238"],["15464127229270440211","14628879173505093471","14388783198341214781","7432736829471703151"],["13508085792120162740","8937389715523116176","16722744661009281929","15094922166616617983"],["6843082762423242108","15617262950523462777","3958741007412949278","7278946843327935426"],["8303737745003310414","14062488983155321250","17661914782579050162","15414934447854115328"],["7748985436659001381","5634776491279121402","4683114198470824058","12088765901176318688"],["7806912822550441719","6240172054017990659","4863094063362374923","13565154835759483601"],["9842645133718659075","7411199794106987225","9702592945825476791","10491493789843712806"],["13957382340661517271","4505568149355508590","7453429055986168508","4197834403701483285"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["7996092201150835152","4545636890307596305","3733298350900298421","18332452522586581392"],["2381904265211551119","13140652126109098915","3199380254734711756","1267855334545801694"],["9708217311541387099","13233310397802517322","10650506611870373894","16435803323668763460"],["8163158155145601291","5803953733245330187","17721337506464919753","9953033272240174627"],["7851017415902070324","1815798740113757823","8622992631390025890","9393972004703364835"],["17099187761846758589","14373976186909671701","10188539789388848927","10305799999151509292"],["15415361257249519902","17702139968733166265","8907347084341621504","12984944818829239459"],["11126892236245769283","14520020167085821672","2935677454311701823","8070582784469222035"],["1987738968127576674","11453024971290533100","11585654636000792977","15141216223376645069"],["2812532807858081598","4735250990488193455","18135366179902007355","6535486861753171609"],["15897712902445247205","16978387831878580065","12492036875408829574","16343664058724877112"],["12216990824580782192","5457733228928693283","3621997669554900900","14047188106029571363"],["5098577762971298179","5760220998787169398","8440773557746166863","7067817064140930403"],["7916822228420385688","3296387702254304166","17926504488759234974","13746090357200760511"],["9066738512045576734","11195184888889426163","14196577493480003192","14577037362955414255"],["8247483126188736368","9862121874846593894","17314393711785386068","13715177250389771372"],["9134838221162129526","17070869539696141747","13267639202990966467","1261983984837617148"],["3246152414482800100","4585589338748210554","15656795189505436554","11442441119372142194"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["1400911445328821301","1844547864572374528","7947672524104963303","18378859834073376418"],["5151163116762909127","14150082319817887427","5228783911650483128","11238260392735418678"],["2627314869750888974","1671755177910248120","13450570279245841070","10279807718478352382"],["6261113882462215234","2437129760753709760","9058715911203576931","8576837867238870243"],["11054667339241335875","2041053340057954272","11140135639403456205","5645232603508326740"],["4227432066240974210","5205484503357067334","37777789207835126","6801937067216177306"],["9646349900248283034","18076326484469373481","11857509771223361309","13681553263465989920"],["15581462822993633141","17370135140737148189","3679727610939404254","16549983096902828220"],["12651561213355301607","15106885258026461669","12716767485607605665","2002797305125374373"],["59159521262705806","13823538267061085710","16744350795042044041","8593132185522953915"],["1496539259198077617","3088976229030564640","13691132445158556943","2345041929764719345"],["14657025302686037131","13692918092680183526","565286626079003625","2669973214606321596"],["9900404120123757667","2584307321016404727","14183021817849868125","1443672454274054258"],["2995572408474358860","10522284690770954127","8842160681147940239","16065125371031521334"],["15529821502213029019","10583433569655918753","13637000774233893885","14137059739501705256"],["17999297092856444433","7069093784479064982","2386376515242916760","7689812800244117401"],["1304703532628949763","17669458781694179742","10103562555367067920","16472918911221179964"],["3246152414482800100","4585589338748210554","15656795189505436554","11442441119372142194"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["16915902832527932403","15335798336061473689","3395203092714688678","7887439232633176150"],["3100860657433925736","7942646442206878476","2954912843384817841","14298588257583835285"],["13213796229686666689","9792881825685010559","17339965072993505345","11172947594961728403"],["11145365559216397057","16312869097558819085","945567785005429491","13992646893717422178"],["16900336431551545061","4118076896567395011","9051779204961278348","10689765975593316610"],["16518536564010040056","14881680857048787222","2249955054674792201","15932656311390355691"],["5095888125470110838","1455609094920627065","17885457466851185412","7690151671398223270"],["9650206523740634589","10708379131943941005","13400784275444333015","6750200903593686825"],["15780694700344601127","7345065857909096858","15972662426103972777","17007326816148267715"],["7775397905262688927","8374308150337225200","16492922565209636723","15998814211059828199"],["1384524787271408750","2444199283555322354","3483891161095890303","16878251066420611775"],["2169504084106937066","2378753335152676907","18111482687042949143","6846015164960936092"],["1925310316276468179","14397968092441457599","15616810157128736906","4608022834856087851"],["18313887303844145072","13864540877669635168","5723464483877523564","1807896114134593042"],["9794490014739808961","5515638212584869971","2653092357956632038","9988927258513515853"],["9563725106878857869","10496914311340201760","4516078512037322949","13027463716801590901"],["2191496644226995556","8573617880549744109","15184710432675738471","3972261698943381464"],["15417553647994598851","1440069973766571519","1697510896034343829","6112516677092234154"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["601588651480305922","17891641894827600320","3662176279388789949","16560313470074461992"],["16927209285049458627","11286979396296854652","14425314709484223887","1522496343493901833"],["9157832619089844058","13125654026090022412","4745227972822555292","1077263596545350920"],["15835490533634584552","11206891690602726536","17106882136837503550","4065096640344676357"],["14017787455364835111","17586242202252533990","8104232124161662322","13420546465822659371"],["3106583920976137406","14064163112549526301","18123648285501346265","4864533750189082962"],["17439503099998480707","18184903502232809775","6035691792458293855","14326863421046897562"],["6289338878584194432","461946875497036205","4685356453202621995","7682602850765589096"],["10864082388014462620","11496084827504971430","17749460819109517524","1436869312381555249"],["10917603873394983461","443586601610054596","17480638105418943969","13042755409247287813"],["14438462451619589712","7445420079190931767","7731196688631288573","17350543468245072643"],["13830645112409862724","11323763528621275504","7387635060003188137","1806421877940566143"],["9442265230832189203","5534461066903768708","419283975188305905","3804894100707837567"],["1202421338551207544","13283919468896858356","5497269674103548594","522769988401540918"],["13718717903302344149","199195803650498335","5572960241351876881","14866680157968988185"],["17999297092856444433","7069093784479064982","2386376515242916760","7689812800244117401"],["1304703532628949763","17669458781694179742","10103562555367067920","16472918911221179964"],["3246152414482800100","4585589338748210554","15656795189505436554","11442441119372142194"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["17717308517492669801","11324661831230536274","14015915622008336456","17993249378903149915"],["7437419253965070572","676623115980676503","8353024560809205125","3918509370460326434"],["18183238434346038687","17388770142245629905","8122311661567464681","10290397636964719417"],["4881914129182878033","2776971876821877470","6077913396922870079","9962367977202840965"],["1345458593958440229","14053120333886594586","9974631662599406861","9311372247659515660"],["11283235352454710780","9789608883427274055","10772688554702154389","10192494721641582899"],["4533856601697320166","10811206990246247557","5337199227783475656","5796311984501123533"],["1076665844367079064","15752156743757742496","10414475074835607177","14549331771720469028"],["5710122157993617243","7805390009808349053","1686450068472261725","4259374963367303326"],["14350436615548754499","1112741163366282668","12965897472329020154","2403050431285212889"],["7631442531479712388","13510769017220862440","18282697388901317946","10239329139205455418"],["12940140588804815756","7685484801392091228","10939732507921699045","13889770159395248708"],["4745222969592145119","8875566834112281965","9791268626992869827","4297666533893547739"],["6806283812339335754","5393433033402951494","11995221354268506634","10270578590570403978"],["15249342473009888638","4132508302206891894","16870086581772971761","16730470383232729875"],["755999261928186864","8511692652218085145","11367527715701994615","18092451561180551866"],["13401871839900213901","8569569462739358696","691897392387540678","17440826828888366337"],["3406474592895846397","11652239052288972463","5126991411199125066","13111533335706729923"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["3525248749992580930","13926924310635302927","18062687682159396507","1560795324584371795"],["9725270272179836241","7442254667069880518","9915132134935242897","523355946909789119"],["6204562831749228634","4406324191412597313","14486265232914400887","5671509849809611793"],["17598356232106713187","7096380061366054538","17615671322267835191","5035067250069070520"],["4178080066526976665","7281439796095663454","6013613046900958752","6732099621879359677"],["260397758730657938","2026844854289859520","872309007067927809","10099077397383580065"],["11794270600428265172","13954882731005155796","15932215721779980969","12971277522059117727"],["8936241644454432719","9749200385264983740","7682388681678223588","16839439472318826977"],["16364763884272630275","3350874932045792174","15008936616614669344","10468740015954005472"],["9782328395477338930","3892974460307643265","10564761744349677813","17651200843572530714"],["6784485899412219607","16239647970052276184","5253188778518397229","12439634486994714409"],["14210765021792518549","925657247767988113","9228684801787917793","7949852620497035935"],["9815021276407300488","18343686196975706492","15391546033070119164","5656839627261465674"],["6418265605074204966","14410901919451724887","1592287661058803195","11935145081283112192"],["10890162406508600388","17545295964332445011","5208359167943184076","15902054246923930181"],["15730892647098388815","4095983472363929063","10212428483911857380","6556145803651606353"],["18302278232993455585","5866746129502790575","5367452877656478836","16111898413787169853"],["3935714712936506891","1558899467906171832","11158536964047132658","6937018615398657481"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["4254868621471782970","12553461632638143797","16433794319215791961","12540895540895807584"],["15845051695321257771","2987274888790553216","1392812589361351626","1278936427470260440"],["2787523596890588573","10111298402782611808","16529194803415162629","3668405819964853127"],["1872980885842583927","4249655111497075284","224599178051069060","14988931444806566263"],["9204947966903996338","8799155701602688685","312411049445976323","11664662654338842398"],["14116198979047937565","8131961749772542154","14253773205182024447","3380163235800092799"],["17040854621059704145","8596702703208046281","5588046492454875126","3026625036905333469"],["13227874344988294050","4494166508182597156","11914927945949181203","9710616086534842344"],["2901536303903399337","2435280820774554484","6603381918195574543","16049399029940864822"],["1489069816856018763","1533431718329296209","2478116787590938926","7232514123674730797"],["5958459182521748649","13129220608012566106","17193262789565716401","3539444188291681033"],["16448582730291183257","8248817618125488660","2851693387140218257","5029746079007452308"],["17189608641265929030","8512143598479789791","9784690827057783359","17358669697922843203"],["16838147375344070270","14788831381277378351","2927499537292946797","512647729383629936"],["15940973914250869970","17088619006580187061","2168059392882561005","16868385417320541720"],["7885474474911228058","14244935272093058390","15420319013727693208","5786001674936195055"],["6083709881564767747","11385987748414916594","17712036542725284919","14257444122340862923"],["15177785680426165898","17161321117894612900","12046680953755353567","8722726864902268137"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["18436002864846447800","7390499376376940313","6530078783523725479","9474377995900747913"],["3120163859290100028","4587472864233225308","5918208937188153195","17438875166530792254"],["11426653987440805244","5966216105838377281","7720779569926136741","11008394278337818941"],["6238751066345697420","17737087340641912249","6130094708068155249","14872696465005311800"],["18093061655622451307","3518812494143031613","9185258431997826602","9321136199513093803"],["13444378395648978173","12840410596137699573","12454675592385466383","9337006305344553604"],["9794953421520596995","12010006416324971990","12210929639002072094","5276914164033842229"],["16606320783266106219","12160201134392439757","2597457641386026672","434450847312275102"],["11563867456508667016","10705736773056027169","6330450338359079960","9711993359019369010"],["1085803749744508755","8213307143894123741","1526477050073203728","6750293093017566844"],["13317205188617979732","10434281096141483677","16792094121344060262","10709263338189090057"],["2044654372043440162","12109833911785565429","3292415818251876535","7209967455604030443"],["2488884200486617205","8791813099593876597","5684377088090988475","13068405292264073896"],["378158308094772947","6212536706325359519","2679336603372574407","6448771574711569145"],["2360607870343970857","5166730644324167571","11480031435623949352","15833039632920497647"],["15053720544783132260","8834946155066381376","8056298957800258643","11644593553119953504"],["18302278232993455585","5866746129502790575","5367452877656478836","16111898413787169853"],["3935714712936506891","1558899467906171832","11158536964047132658","6937018615398657481"],["7503222451393002885","11550855456231219226","7339176636319448907","17893792059898556068"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["354903486671655150","11158885019869453901","4824441844680073046","1947376431801566889"],["7790346786116924625","9551769411682193503","7262355138717883650","1370217551453627235"],["16835824497570620299","7248573011156360742","13009329294651496983","7857813253017710689"],["12113258079377002773","1484719841323605846","6546522644968720659","17401256814413578408"],["12500771982342247081","18266014217463869997","5918449873257133967","17570924277107475048"],["9944910365053274406","17519315718701023396","8265845085570753464","14519030888690001087"],["4550263039185939823","5079108486910793955","5626603476109347229","11295842377329348421"],["6556804194181908036","9864924314918890857","7782963631059421413","6292054639739181887"],["97375371559957502","2437336324067855413","16178721488927048248","15376693433341479281"],["11691178048384606442","8672796457370750048","14078096462632652696","5767499145373019591"],["14817984511593210896","9520556793586069304","11798093778550009518","17387442731405044025"],["11428647639686101846","8086299315458081718","4449172160926381510","2276719472177833771"],["8160730595599190534","1479759823409040754","11257969179012876061","4894644079129496668"],["6288385865105498231","6511906669733846041","3873007541721810376","10260026932565742244"],["4492093528268559253","17642533211453398632","9679643498318545266","10786787634030906794"],["17714635839430065911","6659692787754066382","3757725112295766264","7274952712936445073"],["15571694798674843709","14450168892936246059","16930426575830225364","15861970122588656593"],["1009749261045559430","6843870857975310600","15817284531017899292","12221742300252101245"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["12669977528307755702","10882940343183571566","12880136593077260020","17509872204027701179"],["7085432912775647570","372806592699190940","6944242727790419373","13695201953163641039"],["16984318782775424557","1173208708074179643","466535155098402066","4265392930592295143"],["11268050512035151672","12038518208806418185","1000708417701942315","10390427855895603499"],["13685243644029725206","4489074441706382601","12547440375217757262","6016342887838769660"],["14488941259131819400","4457023271681996284","11554154505730212796","963661878259780654"],["15011765946437804265","15747709981595283653","3296934580134085932","12317909192004732822"],["11079248523760881949","12672781555707704222","13999290808566542392","891297416220885533"],["5341145855008493092","9984333092792094424","12966615332466422234","5259567463330265206"],["15986366801301898572","5125902646964052658","930965485336735248","18117097024532792291"],["13513896255175228864","5637871160065909586","17450974913972877171","11169690208466028063"],["433055845050456446","4021732438323791400","14155110186887033554","14387092706148526640"],["17775408955990519203","4253002853156399232","3558610982896789916","13933721218875180632"],["13567626336513965838","8733802766489019391","15464189788819196334","17132592205912251694"],["15940973914250869970","17088619006580187061","2168059392882561005","16868385417320541720"],["7885474474911228058","14244935272093058390","15420319013727693208","5786001674936195055"],["6083709881564767747","11385987748414916594","17712036542725284919","14257444122340862923"],["15177785680426165898","17161321117894612900","12046680953755353567","8722726864902268137"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["11149294796120970909","2506620766025411555","8484309871622950081","2344303949892911064"],["1382292527993486384","12172816284955474383","2203077270893637290","2963398622963889578"],["669608150052361355","1847434535603398793","14687377996468922809","6750616834859348626"],["10314124221283271108","2756566223511861907","11990090292208922197","1173158046342234241"],["1018596061928263839","7356629248576549184","15157169644275793485","13176752923078965284"],["674263260594626088","6120131485221812442","880152871303292796","4700088987026040339"],["2973374667113309365","16508073763218436846","12813610659221747207","8779510271360976296"],["3199253442582908934","16549264239132101093","1935009401801384001","8562891880092080204"],["11957294634491708342","11401889427352880786","12895792140820231284","11800883250285500973"],["11270152612817236416","12824928833605271173","15387322707507399758","18078999554838964384"],["740324028587241414","14238342996087264051","773709722816094055","16812837371919913065"],["5925720380707837919","4116773251237649447","17973507284332722214","15450947491464496506"],["9029016831974288880","9415032248761673240","13599305813744616117","14207374717745726440"],["180200040623754057","12924622348289895937","8040703275348930458","6457149507643921368"],["4246390482869930736","14041822325645823732","4993231499405173060","6665025593826788074"],["16965249912179455730","3891135621870858248","7818888710033917521","16946890846927612846"],["3278216015061666774","7902752697433887443","6595744901923648953","6956565580149381259"],["15417553647994598851","1440069973766571519","1697510896034343829","6112516677092234154"],["14161634449367474549","1897608023436316629","2201001981668585419","8332672461667610632"],["8820023466673369309","11289655960491042461","12122136895183912272","170106561684348952"]],[["16553747006075787621","5448813057298897545","17278935149961056501","11766048936870037141"],["15936819896461629780","6715939915935954525","15161144887261202565","8370177097302244292"],["7923798409948937484","2627058206439832686","10245466181511805730","18153691080912636439"],["9273169822155785866","11561098108333509989","3934708374402795046","13792240273738583959"],["15532193998850560340","4191275503485761659","14633263788648430316","11666532649650021537"],["16610191226402789208","15969924038451545831","6053859690393309957","8020089805444772004"],["5231272091292661394","6673309237035081318","17526089341611129432","4003306130079236501"],["17357087689790062528","8500946168193795533","7057439220182722530","1152350623515298575"],["14358885486114476289","12960884614097111467","16496436304157760116","7806203676470730619"],["16636293260981152783","1463325969463211074","5822910717354531239","14891870745665070623"],["17186459216702917795","10963063437297552178","5092747329593267556","12423653350799489278"],["13508085792120162740","8937389715523116176","16722744661009281929","15094922166616617983"],["6843082762423242108","15617262950523462777","3958741007412949278","7278946843327935426"],["8303737745003310414","14062488983155321250","17661914782579050162","15414934447854115328"],["7748985436659001381","5634776491279121402","4683114198470824058","12088765901176318688"],["7806912822550441719","6240172054017990659","4863094063362374923","13565154835759483601"],["9842645133718659075","7411199794106987225","9702592945825476791","10491493789843712806"],["13957382340661517271","4505568149355508590","7453429055986168508","4197834403701483285"],["11244015751796225464","7873954455177817128","12005138964176864900","14301274353677799069"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]],[["4532979864194541892","10699951862712933067","18148569419808283716","17405273176949164004"],["6296276840134790679","2804489111099823219","5594705031041200383","13531543335157504020"],["3310880244826626433","1376704075062758170","1132776657953053100","14953206169520656076"],["13856288478599740080","10590688572346012630","1776127563812931489","8187923904950184728"],["12656328726416672989","16441215323792960530","3876303304924929942","3828788660306143879"],["17332881916825035973","3383120530143010337","4937279638169408971","11656347713642882445"],["13069373928037252157","3387740880867470279","4018629713226869799","18174805669506689259"],["7923103381541614159","17576633449055798887","7533505984087865587","6795781773113331824"],["1413621910826292399","8090721318816681598","4945252924774652995","2464275813701079412"],["4794704289429266096","6896905324933035706","6212172211082676012","7586872844294339711"],["10002263769599116094","11139004505780534959","11401314274889109832","7189511230959855947"],["13053621255702605457","13639118441216044539","9216758540204305270","15246667884112227906"],["6002917950811516179","10466130225278382843","4579473781677050666","1506476290343702464"],["17922050926547924445","9234549438858865918","2707619400975755240","10309831916294921998"],["5253180909021276037","16084633814524538450","4806544855863176963","3110239682633283820"],["4319222167579394593","4084006398482127123","8645808981779095543","6833618676974263156"],["1765509791638323905","8396028619490428980","10365766781411666093","16853273006907252903"],["15177785680426165898","17161321117894612900","12046680953755353567","8722726864902268137"],["17624312837314705806","17162242785065035271","4009163918162910694","13207497976229494938"],["10979872961853898061","6417402875863440124","11036875996765797645","9722830768017676409"]]],"s0_siblingsC":[[["13746485841072179547","16062530172327295163","3472268051155283424","9731388725220292627"],["2916777754325978119","5644416348585984402","14711426465067700731","3215765575808257027"],["15270799541833752699","3203440009229881999","2474923018296191981","2305001933113974701"],["4549200980449888970","12754823408969360103","8678324466522568042","13559698169199555864"],["8123717496863275903","7254867161859494027","2658752131054113612","6300692853760025008"],["13227189077108935191","15740759033630827158","8354943114117238005","9601982314970760503"],["10948938046819906056","11472956763047080041","17739722506327638563","4525218345552783543"],["70607473561982146","6642964649787899246","10472854602149540195","6377250629871495404"],["6282328750419393008","10015413966466605352","16975215626523004218","10021854623760854592"],["7849996514195951907","14440674240353677369","1609225133679155507","11903704106242978164"],["14490213215045576453","8920390603567099588","9720141091303577439","12432069374364385226"],["10724474479454144429","1008307688879561551","5674178993313730619","52051117811681384"],["10482608172129006633","624824261301738761","5241602751511845848","17599039895604971802"],["1710049395677813678","1583434333759426784","17326034749407425683","12713811506961755870"],["5675817374869387355","9505369945203610894","582615405410151361","5041710785154183282"],["17719176309367561434","17716647259827084141","430204323040556277","3287298893748439492"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["3185312778233161069","13263971496049055741","3028119351938336817","18298036230514086688"],["11155890837177119170","7900132093243037526","11658602942092243829","10113022711900668176"],["2268231882676877065","13731389923004215571","4697948223606465965","11002353538750630951"],["14561847644841368384","10776703942282659825","17312503936459288796","5524154143460077917"],["8925006251044726749","16240556748361709553","7918776654516242031","5303717900327106241"],["5818502173197760366","16496272436414518052","11556875668098134767","2462569582880329263"],["17813363843603536269","14497004615941306506","8110708094289613155","4948049504655353445"],["9450038374538578200","16138814795591207536","4945637163017906959","11815634710345528337"],["4500772379952669989","1507478603146634970","5432567665724202271","18338848745183032096"],["10296617542687604299","4787066915410999046","10586334005004619711","2096349063758196489"],["14988933577372377670","8036653282200006890","896031122098745922","11573011124696565938"],["5971024657977263367","10179565919458981251","4681443736897384459","13725590997718565681"],["5957372500811724146","15491018026768769020","1859925419648581574","2167827620861879295"],["11836778262823334623","3486520833702784010","13903693546449080290","12347821730461228913"],["976408255402963871","10391154938601194912","8089522551291878089","15147080784074376526"],["8280812836316470731","525459528857064349","1224234600473223565","11407072143640540358"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["6636989880408813484","2225797100331042338","8240263093000509347","12241299781142577144"],["11939906921776241552","12148377611333428637","18363282889234809037","8345241233010161588"],["2979437876765654242","6886686061633809530","12933936808823316177","6927964290965241474"],["10728957062130302868","1366639749067590185","3959690770400327956","7414146504723972705"],["12227196835156984746","16173820658764128494","2079406201688309263","16019210833219271399"],["2872727590095223384","8421419115466298124","1718443407937338012","18046547633105737786"],["8844049733580673242","13034371456536210074","14352581170115647997","15754735963571922815"],["1625272438525054526","15832281607730353882","2605788319970458136","12750212463213816450"],["1779476236037624205","16418764513413216389","9811685236368584325","9136835131431656657"],["16558153528744734453","1380152514360187834","4594218041800671742","16481394012668393401"],["12273999951807594616","2019536201009362923","9802832127245570589","8702833325191067359"],["296496145237459458","13285353341293037331","2641070210397509378","10350194514340990331"],["15080715703183698807","13280413956105798123","7836268719463181658","5601821654618983928"],["7137085448421361228","10761989018024548135","11381546161405512498","6677988979477345708"],["9948440898891712476","9087250942125863141","171961924272540121","6670816061416208105"],["7244760491117602573","1937002853230329580","12409734825103355521","13785445564269065019"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["2913995807184504934","6462907195283055808","7336093925511617980","13617512196360747561"],["1606623716953210375","3529047099115766304","4017838829162438212","10461818452202188071"],["7936757758818832236","14290641252265618823","10176442005884957094","14988455458431435092"],["7923900207671311722","641840777907223387","1520210995510048557","16042350023731340015"],["12683315494193450821","1702788769790963101","16154546416221599361","8591276052009371565"],["15002570612288429326","15574092829007572764","5844881122742995879","16367964503503577832"],["15852358572709868057","12809252354228879780","16244361041755754138","6198304303781901978"],["10459992635685303695","12631350336215445021","971743364948550089","6152511307559340682"],["17863277735324656225","13400373860958570124","6348085229226344761","12828326755325109835"],["1460309012865137134","15626163292442278576","9404971309306517350","134506012732986178"],["13223833200477589475","10595285869960250438","961124842586112782","731208942303051140"],["13017591956564495068","5196283899556046657","17325500987414436037","10843892906067676946"],["13806404333824939308","12670354177427910037","17686067077431154929","15798542788510216238"],["14507921013732777449","17341571213690584428","7129485917971425459","4404361755492023678"],["6857333481849779111","16454729710574526104","3989451403707511992","13220592893677479238"],["7635239324268522224","3644193782740922068","3770420575850254882","8967097228445315688"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["4275068928180124687","16625686996919133675","12960517405782646570","9489266229114458756"],["5046019167412541672","2094145402905955580","10680183960826197291","1862525115172617702"],["1911211355704162562","11489112544581853346","4817140145776597327","16273847527690014387"],["9704061879478775607","12332097277587868552","5084197223875798677","2346535476878849075"],["6568689285294916479","15490389868280240319","14107849971928580047","3152456651344969799"],["13874921758908740100","8983810593531724651","3050048628578338374","14838033400906531634"],["10508076555787547945","15975983636095462311","15173541338747997696","12466193861099553672"],["8761318742821885691","14306896051750763790","5179108636878715688","5174897755943112519"],["345119127955297405","18373136572945825581","8083336140085008213","1309145305566314028"],["18199335967190628269","9939971638916377377","3656356523128047148","1118756839359833836"],["10974113773028953306","11806732068715699689","2874475840257435159","12219736854301143568"],["16058613269698842210","17733424856908454732","17339890471502347261","3677124712306353637"],["10482608172129006633","624824261301738761","5241602751511845848","17599039895604971802"],["1710049395677813678","1583434333759426784","17326034749407425683","12713811506961755870"],["5675817374869387355","9505369945203610894","582615405410151361","5041710785154183282"],["17719176309367561434","17716647259827084141","430204323040556277","3287298893748439492"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["4636740442174568736","559180201087294990","7586183501266077361","1250536166585857189"],["13537066974821408261","2537831802912174932","15523199776758519614","11272907468086499941"],["12243930428083042822","14845456413430735369","12950049449989680127","4724274037501115525"],["11126183175531088835","12782033134553636392","5509537403587341077","5795269757505488945"],["5646451826358022345","5347606017084385884","2606406139244328038","9102071022724225356"],["11337140261383726052","6028113751414127656","1424301355856706044","7589597875781479022"],["15481438219249595577","10284831676896585120","9500814232075662217","12900094716173546916"],["17098206969388012925","2520668051666941214","914961611369967160","1620106641049675072"],["5507077866495713161","5716256169215934490","4999634903757067318","11246277536144015218"],["11527129920765645974","619808512462143595","9216356816846568578","7802706661407782475"],["1162345378898571460","2118905775661320806","13545176738027797906","5196999092714862506"],["9457541836186719577","11565573423359911392","7598555079205106821","15405995514973372247"],["15426823730652420151","2423351529468196609","15573525980088525007","16500469094732212882"],["8275847122328723869","465310823335299775","1198266859440291806","18062549307117148721"],["7794448169163567745","4915952800689168680","4841011479410791223","4010371936168655297"],["11866708173456013239","2780833642891994544","713924719285448435","17842510456506299779"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["375008337327406644","17825262622323588458","3852495654986420850","17487444040827318210"],["6947890401460476258","4254819119156249644","4374968300525720555","12484014371489330138"],["13228074340077904716","7262277432826963050","10854303159247100559","15424279052084675397"],["1226626601113549969","2663823245274479741","13029480810161171240","12973657499059914247"],["13726542799065593971","364161000133407401","16787544200068706464","10242769626969550170"],["13833381656330477058","6881639417434928765","10058888364066854823","7671706446127872311"],["16325309321148461918","9817316068495455506","4025735633045966110","2571253170974996541"],["11742813700150338059","10381800627720133062","1314765156031201816","17209581129216150290"],["88594143312433085","5815084199638949453","2522134069538176514","16817926963687974492"],["3718612169734403528","16437150089618364946","738305746083533278","219066985167142180"],["17452067670409990821","13393547462811884479","16512202311564495588","5516619800819229073"],["15781341408561322616","3363990141212076443","1602826353783997314","1303089897645105917"],["3567750304155598751","11478675256497016966","16325706902245943681","12992554897074586111"],["8220363656022489196","646481585764585355","16404847132639860894","615716049575058259"],["17023476384112939739","6107927151800715753","12947464166475007782","15535328581370466572"],["1455852678660655299","13994024557906383740","7609078167324927474","12007540167498037278"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["10233902999958472392","3920426450478301356","9833703312758598864","14910562736203030861"],["17619874359861741894","13167388558060856390","16976244576467293119","16354545536404667394"],["5157370523285508798","796692889918172362","6858239343591948627","4461069538415335584"],["5624991786460700071","14258288378069866075","8835041058536507990","941335169889985868"],["4257158328278655475","3306527657733116368","1279420641518792563","3307220000017448715"],["17978776559928688514","5737001099843009115","7828199812899423781","5283116133721675302"],["14545935999324705382","16223791621726728047","14731902987024231952","10701241343214778834"],["16246979635533830142","6266425267965789951","614344650000280468","9232227181054885024"],["5859086257267184769","13734664766981416450","10595816467559714701","8406933255302693242"],["1270951256054257604","13087861646992874832","14562055720512177736","16457058214354816764"],["9573905948171038303","12298867535384767381","8849014390409087334","8033183886229221148"],["11167593255149522161","39569440381843712","1362043397948802537","11009188845085208999"],["5839257437079854080","8123105674088484438","3124237801695930648","14923768427908799246"],["13300364744000111854","10077841917041013644","12912639979234144816","17552612679448460832"],["6273897594145983808","3048017189743975810","3447251849551019225","8151067508856838492"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["17301899539993043253","4115358434752944119","7280134947551440696","765918152061518929"],["7460957702140129729","13486317140079234443","12409040274078570789","14111636368651858067"],["11940873415702626067","12428724936860017749","13710266420354633983","13317580405881681599"],["11105063362694315439","6514699906850285481","15138176848459777318","5485832073246065420"],["7914703550562513582","12611488467079092828","16185718320407013143","635712751564962215"],["4725051561374002964","13022657594347449675","17749989341173888449","17952476203511527155"],["15520262963994105984","8957341370593469767","6778438573240341292","3197998555697309439"],["10401380353133200030","679846996813204183","6292132609318808390","13061417591578188344"],["7407315179297596479","11628548617564495065","12635945940056593172","9603602043595170542"],["16866205065825688051","9634087801997788983","15240340225769745247","11553580355286765379"],["1096054893045793917","3578746407341036734","8063593578641991820","2296406433142078749"],["8522165528956379906","10728735037197586992","12036935752385112788","289368021401518465"],["5305072072754772338","1330265132656870926","17422636956605505519","4693617563143225630"],["12094330459166458859","16723933241232289433","4724036411567447201","13471587683652389097"],["931311743981461908","17675264942269715202","3039141823971697722","12711775096583092594"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["6103551687689070186","5818613467381852967","9586274645038521109","130328467209599544"],["18281109035510981530","11437653740615146756","4475308053423210635","15470273175873759737"],["11995094402312009079","1401665608855370051","2271607124059138196","6372743385533665074"],["3569817606159905924","18158588729437700687","4145453086354698524","2791789001057724737"],["8492112375886851052","16369600683684547958","17019808133390429032","4426611047867608109"],["15831077317023241666","2617752074994639980","5661312144769351538","10077004288076267044"],["8596996917824312680","4466870963960087778","16734820622531132767","8978603750745210980"],["4648886779222746838","7869512386858140384","1288033366617698209","7283073216376958704"],["12945688457367471154","17801530050330716431","4811313220231616272","5324117836076411247"],["9231514579350822292","6538059618548301570","17231767435173312813","5028722923994069711"],["17304261089910229575","2622657104631681762","8811185133470626184","17736127475440950627"],["12544130486931604747","444075370534925097","2421297867617944112","6294238670599167155"],["9626223350158876600","11513014559542655325","12069591704459032764","13972338736211469930"],["2873049711665875866","6630911227292821362","11469788645814698960","7065643484272636974"],["14279287621884984917","7251464831647525676","1575487492063749912","6276845344428371156"],["869108967374166059","9944089751214829993","8737861381474453395","9573125049396863405"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["536802866996402564","4360580735744825266","2220376870572075620","14593370828002428132"],["13696194592241024225","3308078733706600426","13678428613600752610","3011412274244285953"],["4981883926772048828","7043747602268967502","13609726890124226155","16572684221827055341"],["12871940983981314724","9563936053695673111","10016953813307596301","15546548103409054297"],["6032097474214356745","13279805889068086514","3344697232499840085","3350975187271958388"],["18139366010828725248","14882333882191282865","253420078293153333","1067746679455687858"],["2819879593794466964","7104245206876313498","13834900347990551469","13543044282399189999"],["17390469060205663784","237130375583034479","9514701395963065807","2328176667806928749"],["2271468726093122320","10808103701692072537","7378174089660548025","4436989215879298507"],["6822854003341753380","16037500960792681109","6854139420707561438","17225215605921473887"],["10222736597491713706","8015451951238458414","4777797747519868254","8640159371022972116"],["5728832506286458174","16627785445880007596","10463613755370039346","7305411336325227372"],["9071520607011518968","17639531854513162945","5885508653051986847","16795213169527515269"],["5379624921142009188","4118201108933018942","2911365268419707597","6154550372664049759"],["8012788336744037940","10473019609825172224","15283840956305007116","1731319719417331402"],["11477233345027020212","14832645080858559662","2867355695204893483","166496565302566572"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["3621563449989267892","15831632303119500237","3477772586375209629","16492439589459817229"],["17144852396708326338","2756607211471751204","6209822387034161752","9436197757638697869"],["2818993045379187957","13848052957978417172","9902689035156011982","6733769816711501647"],["17940510355548274482","15448813551456970546","3315236611500956765","12415008995102867743"],["430893903943760797","17873299813232702442","7605441712493323300","10917758178437183921"],["5394864491855925808","5667785125846636404","5589263041274364153","7791665949287097021"],["5189393699669100090","921257955903084660","9291858888806496464","390778978482879261"],["6820208724149682845","13418456722094926244","3828357565394943822","542251616658740620"],["92444335589429256","5897762187871541829","10750627959738918481","13050292959229399289"],["4440384532852365661","16770238603339104246","12300732006473767407","14382497327489854485"],["15065315930567632495","8940340505714529095","12092907149915110180","10434197126337627798"],["10056698318127570832","650680950390969732","368116666272061572","13096038364150469340"],["16976554517393854346","2409060943846818100","15898244497118641892","5228156166282028339"],["17481668050874702262","3671811724453040414","3957471856094706580","10202991870349804077"],["15341451037994247477","14318485947275727412","11528373332288582141","17694555396561992896"],["8671292656581937219","606088484593897193","9580416314639011041","2510868533830991207"],["2192928023062863610","16866694036386262182","17293519033221418220","3712372753953897681"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["4152662398036687323","2236774401014868875","10388222582426854314","16329576081295081760"],["14840409106626579195","16252672697579282308","13469769625239624711","9139419896084460487"],["8896736501560340735","7628678416986611662","17718818659705873619","1653991625624274312"],["9965772088678824843","8097916077382111877","99169785613354956","16218323141097813406"],["13317826355134554475","12788913472415187799","4961626483714900338","15074246030764568389"],["12335743928837729385","1209515665867918860","1972439453121805731","3171055918470790275"],["4128287666520068239","16033755478106899317","9361991967527357653","7508882767305250816"],["12194175266732264412","9441491047164816104","15744639973974386673","10684688250808464343"],["13178118479689465960","7223147447929436243","15389863959553030383","12620976534132678351"],["8331840778985128686","13377053119504276222","7326018873478589187","10039054549993379089"],["9756909034649946642","6477206575032900854","17041279049792489022","3518815991412632820"],["18058954448094336759","4545428758070247982","6543344989533542702","9958048587442431354"],["9071520607011518968","17639531854513162945","5885508653051986847","16795213169527515269"],["5379624921142009188","4118201108933018942","2911365268419707597","6154550372664049759"],["8012788336744037940","10473019609825172224","15283840956305007116","1731319719417331402"],["11477233345027020212","14832645080858559662","2867355695204893483","166496565302566572"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["2206540638093781639","15317048271833436354","6427480196770700882","17601978068955324891"],["6909660601013788869","12199508947416811276","8996888285390750507","17821258616472827396"],["13889046942683737869","14602262323691041646","11719197956316352428","6283432156443917568"],["14792485015114291733","2381958354898666908","9567554186289367660","11669698402885030373"],["5563149135041386867","10224087266531315481","14785099861496109644","2451758348021187483"],["11567272956703498862","3305784044368130476","10650536946053643843","2705734156285531932"],["10244402059983732116","6230847438959836386","10746830928287517209","8469361845754791566"],["13797251731000073267","18145792631719730222","15799887460660153986","4928597566245134047"],["315992159424765244","17861857620842236343","302675073165237697","10315925764733746944"],["11775240103511221744","17256976166945700794","7495542075532771229","985559289341637259"],["12588103961100911576","5035870370737762761","11071072216940857326","10225725544456116297"],["4330599862375332803","8716101446352813916","3777583251356190383","13928469944549892146"],["2129975237004209180","18009758440620788179","13615558307995017766","7655249634142801074"],["8606550299219805281","6462323994800164502","17279706290695098961","10393295945897032771"],["12713677693401806695","10379167785296499075","15254166850524763678","13970932605692209977"],["11866708173456013239","2780833642891994544","713924719285448435","17842510456506299779"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["2591410018768596694","13893407097167809140","2309824427612330531","7743017481185747160"],["758138230016608909","6424912928821252951","11483683894749578849","10851731041185752219"],["7598254913527260367","2219874546308312985","11351082416060728759","15081094217711658196"],["12801329796669366759","8205512497963402489","17494863090662954716","7274163962156999162"],["6004381130656293448","4291179234932580634","9063522713060458755","8264582261387873850"],["6196213082973389081","493993065047692142","11333204211034128825","7694487520082424773"],["12809487583093427140","12176967813458740518","2206602428584893630","5072657873695369322"],["13882890250217062345","13885854693839892561","7855468068952343026","390700305874727866"],["10599923911921051648","12012966852926439988","1462340220697375935","1123162190411111690"],["13916448594946790344","13261034567446432746","16545359687737387606","13801519179495612213"],["5010081511627837685","7291757674220953670","14484430153092370582","13016952587006772642"],["3755278864944216294","17677062454605748297","13847266706238425090","8017671258781928339"],["7528693505725164579","14957973685713898835","2213046096571931334","9683357191910441065"],["6074155707612531450","126496646116183980","6171645151630295240","7176630270491283664"],["15981184865185928653","15709557614209586054","17062412241909355419","18015769014549371155"],["17924116705995692306","13937694832258603484","11001603289363490194","10240339462418253035"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["6230840113547800628","4858437203879429596","2515040088638952889","3934981751479328082"],["11177268213387240468","12516199364996558344","2761762046784123458","17647884671410630650"],["37068499587681307","15793161492492999019","12069150904672248782","7554108462143768108"],["234425498864497986","9401867889441968863","6900097649483791000","2423033365504480857"],["11436399779484063294","5052603606490758961","13847537684696827881","598442504223333802"],["7108340924338348040","8348827625714475660","4681358303240846997","16523767837092477196"],["2359025745216095325","15400466707631043638","14205681385886505814","13698075967960523395"],["16315951593793321936","7311420876302358162","4517106859998976348","4092267226526130446"],["14797705278032870728","3838351236969026449","3145323093389552009","2410701851549220462"],["11852987230147996154","1890972417150238287","17178542756909641560","17658490362175506463"],["7418686619738266847","17323729953043357558","4859317207217413654","6507032848819568113"],["8722420133042394939","13407383010239364298","9445635008298419609","11441217074263716364"],["17853003555015447683","3023399874245667509","7558945029854128304","3069091386202072947"],["18161838377043013552","1489026509950573359","2936074499666541490","4363687841645322815"],["8790651809719863585","12665664382608069520","16450868780220168120","9790792431970747567"],["13165348161613917386","14267220877698647908","6367680899510308139","6588464893904805809"],["2192928023062863610","16866694036386262182","17293519033221418220","3712372753953897681"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["12977837797870720243","369146871745743496","16418464327610650172","15613076343013169536"],["17177163743756801910","14344794245219434329","1768632783802685779","17134357683843298448"],["1166340755814186332","2026153035398643400","12524764389607616447","675419930886908351"],["4205732312110326642","17970613331273901622","12178178146516569806","9755412581494016939"],["1067753356056620789","18282099120759614402","5473965418154736625","10701332699441907453"],["8054586643534633351","4514553383014620705","3333307629620058202","3844869280985047068"],["2133842857129801347","11082102627827547445","5667603402132748186","17750689485876107693"],["5432021168217610619","3866522847654320558","9677972537579885573","9835297242624454529"],["7522295282209089387","17957694754665226649","5764973691013567791","10164011564520499453"],["1583550999074435832","5687400354603182781","11167974601666441843","10527066522792788959"],["13262960666344479831","10573206567431410160","13271961192333621482","13638581574914830671"],["17585481331585064745","5381961513425931212","1838177894673588513","18306757505899300222"],["12613078227795242408","14402885194763388724","7642894279246934860","5412840891270528814"],["5815165770425607944","11657862528816656211","13470586765628277552","11085955552673522951"],["12738407627128784525","14415966097692821700","383092442929893039","9656137787659711906"],["1752821537224067282","12863968065974140385","14431030335751594862","12001583380482328221"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["7506202254911123393","8322319443928114571","1372510872400284639","3923370819618654030"],["9635950410942384945","16649975801226905442","18355209129920713731","12883625340800996045"],["490960370797845075","10553630144118589025","2060787764199102161","2681570964930217168"],["4610378000535452070","9422467533808990648","2827099006181593696","9478357137472361457"],["7304184988229297510","3802482145282555068","14079788803341005152","5757017215357634699"],["17688851395975891731","7169411907575881835","14990955483766253556","15281897509606247884"],["17622245896853180618","6206313264773158997","13520510592389346556","8998955168031969242"],["14575905601396033634","11900127269760038430","5096161984806952362","11460834481217448676"],["8398654477373588164","18113527925492149235","1265696250951715614","16762139134977288934"],["2097556563999363609","11604108684162320766","4511779808650346385","6129171911813222590"],["14942018572032041417","1571711771071720540","10005380048485048042","17594967353967440751"],["8020931931475046964","6359994394187930506","5045061840160769886","3006352958707659010"],["12522038139191272768","9974496990655866031","12391427417910662386","11853166257522056966"],["2437624690343502159","11309835629431718403","5520688360056434567","14041760041122251978"],["1326685953664694256","3109332314831955520","11392699433477899227","9725295333074540145"],["277638638648574701","9583542301685115269","12371050104027221794","11061520894606344142"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["7259069475502856549","3062631158863512791","17165910798386133072","2410033260673987467"],["15629673132811964904","15268234198743230445","9706179410695925458","450763890507649727"],["1597204566921831935","11053045718828347868","16410345158249428943","10940878962097978803"],["9007012040942138114","9808608517401385288","5274830595996231555","366905631078202281"],["1334111745093123397","5218606444836919239","15881819510256430521","7829730591288256577"],["6890201150705447051","18067317068719882478","3216116604408534814","8925733136141161799"],["5069903002884791934","16587111134415528519","4609298026408775052","9398054884568035627"],["11334018899821168581","753634808990247421","17537067405574070340","13212939445686960600"],["13213832812420469334","4440292416298619004","8972538957819719639","6827391809226304210"],["11925552645358109263","15451660309822082951","1779276867278420885","2111420690539369873"],["6421093109651822834","9169962586424000370","4829582243005157007","16035587873216304376"],["1809228899486087932","801307318421858483","517491580220864025","9235265305260065293"],["1131030283534461078","18099243833451922155","9053239802415248779","13914446117107072782"],["3548940322824343406","4758059464806003740","15656427706262731682","16490396767891246696"],["8682519169052780224","12056697286830859920","17926222374132884471","7979100100259600039"],["3240705440698160524","16339929511207409510","5051540480786876646","8059988927684758093"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["4028668443562919489","7173753462276625165","12084876375901445257","10760252350031024420"],["3476156911341873920","5929942875436015349","6831609184603024124","17459560273415293331"],["1695634740205899728","5804441874424860937","9971996910193907652","5482760219272129175"],["1920887534354064216","7065677402298296739","2625070661075749143","11139108740257209874"],["16009306183534530539","5471272010858167892","2050552704180802701","6693719984302355634"],["2147393500502111648","1489623390032533006","15642171671940802625","5256844275263612916"],["1939973089523342704","7726303548201374806","12680549507338180324","10604977774162563928"],["2825871699840787878","2026460341053006261","8782008324145661963","14035535843164357328"],["11264040996904128966","6686803473165020350","8488344466652456474","17735023717794567295"],["14065837143167773284","15676855608678412590","7119662167386914364","3952152772630341760"],["14363945525778469493","9597908949534713479","11528971535431727553","4345045114078593975"],["5103821654517523636","13611392625113896246","192246773992950258","6562118561215591104"],["13102466164291675211","5138767873672545010","7199431549818800179","10132955071734637016"],["7789636084622083285","8574832038157876849","10844693058793200454","12824185995250924440"],["10711371731927521202","9664183635952067958","10208998599696435940","5952422119534306131"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["8808331798501866934","10291076983134140051","10460190329966691577","15879626981364657703"],["6190946416156319038","17678204822943782340","13612554186416879173","5460900657898205606"],["12975069842277228239","7249665304093752263","13994712171246795404","13212769639071598345"],["11017522957307413944","2385308587958645014","14428168205868645031","13861063158659110200"],["15169277073029656756","1572530494120944698","16544514162704643930","12301258123044569063"],["9360027478934391815","11843859718448310965","7932692756888908859","7945961171784140654"],["6777389230390680859","12536750053466980103","1173570397027612024","2156177928322521703"],["8924619297800746733","9061156954299774718","8472419970724591313","6904094332231903091"],["5641241398389006543","13612756350251325426","15541192171835159265","3422970639472420462"],["7733264077381258215","13191853543163173845","3397325675909023204","15288236679655115029"],["7825472027308075013","2945860372136898564","10861448231977345555","17726460439765389161"],["14322713444485175157","11057047678084584642","520746912377600654","6519032840196122118"],["7211488257195963918","5985385039402257116","672890161808067324","6021595433113584640"],["6074155707612531450","126496646116183980","6171645151630295240","7176630270491283664"],["15981184865185928653","15709557614209586054","17062412241909355419","18015769014549371155"],["17924116705995692306","13937694832258603484","11001603289363490194","10240339462418253035"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["6705677691330280582","4751122674109430380","8488519472869000911","2795799183762798222"],["7197376815934519627","17852303080438257694","13733328807119206052","18199933556998273489"],["2693996285104727526","624450302498831647","11494712503679594707","11821438055337342148"],["6697898261392518683","190432062655309027","9865290569046015229","10108599150939833650"],["3908317056659091509","12345619544923587876","332294380332290826","15878720554834193253"],["15495102421818387084","15388511686948074080","10663891475724759302","15881484544050036676"],["9112361873585016797","826607582787608445","6466100096496420875","14760613787336625401"],["1486278254896356255","16548121519528000439","5684782120356971890","126553930342098853"],["15706686173862372576","10072010515178784702","9892803799109973954","8114608842385308754"],["7822767787679491867","13447416345058133775","11764837303225782957","12652832084220565786"],["5324167696044281926","2327641578111426942","14144622372099140506","7922504290754557797"],["7732556432062994216","501495816107551894","8105834924904007940","17273686799131210116"],["6170102248994332370","940408970242300203","14635360541876679361","7480268783531457982"],["16089723366443409121","966846039094628736","8511667195782205298","13994952768040390615"],["9203603097314931212","10679441803873230658","15314457486439199866","5018207089951443370"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["11692745301012757347","18158594222577944860","7185694074125349626","3077693817725711984"],["5833867017660803235","10366203960850618466","519733006425019619","3756611499566319512"],["11093960469899026015","6630368753094228077","9889666810155507758","17181430825559843383"],["17969574354947843603","10121766032890400321","4959566616028075139","2611939904154814215"],["4035472147006800389","7255977712936278548","11716427498142295636","12744658505584449117"],["8169969441634050076","17900867142706314681","1842707095294547453","10180503335684432272"],["6722098772686612211","15049372290942954560","3482267977664908698","17281357643946987072"],["4093573082240393811","16100215970394552008","321638911356572454","4285044842829334907"],["7409897055869393639","8186712156781689963","6570380141699475284","17568682639831580196"],["10069601931543589610","16042771639029857765","15250234086337449257","12278040617869620700"],["9006460117799257733","12525782987596128011","2256739060973954268","8045510089945350972"],["8493555742910630386","18285081793636848803","14409068838177521639","16653914666613148389"],["9061266199095058165","9980840609044611340","12481070419403269353","5004959698140916306"],["9651371438071263977","2789405715047902481","804885954452782327","8509402352146854931"],["9203603097314931212","10679441803873230658","15314457486439199866","5018207089951443370"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["14008454943564593278","8250028577247878866","5208890466594226895","11068202977110429305"],["7803707483493105790","1795612310136430523","6882422292854103414","16444232372703207094"],["6316075532969520860","13470938026070162166","4592508086605473568","16482101395707346890"],["152353254102874977","6424303884535240283","7819302108853358563","787161855692383529"],["14369448067213511770","4572644878279828466","16013106542556387095","17036203204690411444"],["12695327425859499228","1800008696537774969","13300416056877864270","368796095790786068"],["14501527388220122232","13215147864646098302","12201797981471843542","8238549143305267805"],["15813259617992825761","13860152815955719921","2322310321920010315","16816486084525796651"],["13821457832594701626","14923481288699215806","10296777066512613940","11792332478746313679"],["16041940935994190575","15256522732828427166","1598243775206614194","11488263994283615879"],["9797121751422046087","10609740213883146400","3161904747157442307","10554846597741678183"],["16872151649678938389","5124644502010302986","4468999581871425856","2714258991381281560"],["7366327769341190973","5440506153919016644","13491363161360031926","2104537132279890485"],["4033660004034283757","209019884650520705","1344876558863557245","944450827842856380"],["1326685953664694256","3109332314831955520","11392699433477899227","9725295333074540145"],["277638638648574701","9583542301685115269","12371050104027221794","11061520894606344142"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["10883031913147650648","16274481596960067847","15897279912380238788","15381528577326347660"],["15029072294432720094","716600882802817719","8527646585147666264","16939478515347961064"],["2470805044464017120","627092656415325233","9885295412765932518","8749130592226823903"],["4942391929380604298","9361387641233528569","7872182869314632615","9973275496021563662"],["17655285362812781121","10043637861838272243","18253025364544380482","17916582719376254290"],["6048998225067659383","3912140630199098662","15374923390056132909","16519759539091189593"],["1063167840906345277","11157606955688624847","7664227202336854221","15273405497632583774"],["10116154456959561332","10473583356936167336","14392335952466411911","2341171144755152624"],["1646571197553654014","659137595850546706","1698054803512696481","10350089712767674765"],["2948636803153660614","680658100709332679","3725609060275000929","9713991267284042525"],["17395624826361106975","17320169184108169809","16480282780334206177","6277232633184359542"],["1689829739383906750","16877850557778160948","14670648327588756320","858963297884066201"],["5497106850637435536","9605423991095104095","5811456791145871542","8495959508791584693"],["2285015090487789324","16235348959957476039","10639436525640301905","704553602550791190"],["17740529841465646276","15784861764509695198","1041819893859184343","1643675341094512976"],["17924116705995692306","13937694832258603484","11001603289363490194","10240339462418253035"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["8907838116350887025","1335105249953427279","9331866358656988896","9900901287752169824"],["17675724765473557753","13981123601243521750","13233576517985103142","178265387350614783"],["15615307241277141749","15534472093838060834","9048724290044228572","2237096735129835829"],["13800538488314824895","9794136600919148571","5154502353139141543","6627650611626699168"],["15747021255344922243","10424087665935940913","17664243498130579736","14524498689127183438"],["14467628906911941730","15289516882954603205","1252852495037213085","17225530325102052487"],["15990124862175325880","16985120899904911786","6964742188999281357","16317895127624697832"],["16886445082091988707","8778921732700427212","15076483061283838349","9952975727616836421"],["12383851657470748135","12689508944624817013","4613621427033055333","830947849426848347"],["10874330974806903704","9507292308676116290","3208805578797631023","6830779970509302050"],["1358461480952495503","16609559764131156464","8681525752674613211","5143773497623267620"],["3182266199340527276","9346541361684165807","2299702865291926464","16366907097394037490"],["3295441063138482224","18248406140210522021","17172994827361409042","7304952569240638302"],["11657978706748518121","15430609229578755096","9993933673503858163","10042499075286301027"],["4017457918523130055","8386664708080628570","4762382856846087138","16067088302796290927"],["1752821537224067282","12863968065974140385","14431030335751594862","12001583380482328221"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["14268472327888349352","4876561323575357452","2927291060153281135","6247421297080820654"],["9489498125818594276","11180116472946466376","4743431817440997564","9969959231315728056"],["5842490848178803063","15577044656168315999","17229005108246433990","13511649171696126125"],["9108434441299249128","10763207880068931283","6593437615275011962","12504273972014814321"],["14130315743329012093","10493141970070075002","16926996795049685203","11661447337737005123"],["11375978027601515496","18373441712416803129","18430314839513427224","6827221953441169852"],["3065851762009330307","3336978235869219637","6702652130713472363","11964715721384475865"],["9953748034884578360","14956772160820432328","10854407423119632538","10809414846071409847"],["8419909853311023580","4578367863489939786","11201840972740118856","5740847650009697651"],["4359489180096553711","10723246659802651344","1760540283197950804","4590869146649242823"],["2071628921256541801","14302552965480835775","16107882740508797245","17787086223745050058"],["14821487844428546697","6843335024376524196","15033984247433545943","14665221078431133274"],["18105250858673806044","976521792088033773","17113176533113982796","17065371225606616443"],["12094330459166458859","16723933241232289433","4724036411567447201","13471587683652389097"],["931311743981461908","17675264942269715202","3039141823971697722","12711775096583092594"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["10312682104132060010","17365335482423230786","8555851728929179835","15646588211410381756"],["4701102097686547770","4684174684466155855","11633122424279433424","7151099836291635397"],["2672539714296447071","2794083981822940889","12280084476871662366","6571732166468167996"],["4012188316242240081","4287241283320039400","5045966410376408087","4898007266023326584"],["10096719201786700179","13926444955928083331","2039557967711199186","16672586594268910370"],["16004379199866336612","6233779475093696259","9310779860228969335","9633756436323717024"],["6935850988955553134","11634105398462335352","16764287486125771450","7958342006629630698"],["6474654237721966869","4076723276886124572","14306592065061107820","12732921754701424468"],["859539107058842293","17240087899102817069","5645846030858675717","9213441100562141755"],["5037069704090848871","4722434123024434947","13443752085431742621","1015554951913130038"],["868522515338005429","10096472203516077329","6462715107050843078","10295807285301055026"],["14791649299265239739","6404551899136600689","18182039453276034691","17659391244885751732"],["13806404333824939308","12670354177427910037","17686067077431154929","15798542788510216238"],["14507921013732777449","17341571213690584428","7129485917971425459","4404361755492023678"],["6857333481849779111","16454729710574526104","3989451403707511992","13220592893677479238"],["7635239324268522224","3644193782740922068","3770420575850254882","8967097228445315688"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["5422463829384656277","3743513039442078034","3655846237581768830","2240141214566396946"],["13665091573712293527","1514840447162149497","1737376904802838569","17235212919067588351"],["5652997699088573092","16321299914990712488","17193414635049425076","7657091105978627437"],["3819304953971702312","10376752121974199360","8133579077251140377","13111710468295464875"],["12705033159621800308","8575069062021647321","10938261964181897457","17056575478430468380"],["14944217386510290737","7107748534829764275","3869250655526822258","1509139192008105787"],["12614620518364748597","17186155403449827450","18211812632390855276","7412932932387269186"],["10413893780905051027","983140272356875220","5210908820030852210","15527532620062334601"],["11238242680593510829","12975322518301255797","14714023654952048769","5075129616702921626"],["13845886312170165501","17908847428403165103","18358307925020492523","4394942814996292545"],["18224977664795616217","11636401758921556792","15537261582112113293","15130123860590919552"],["8632930740294122534","1083412506467617025","11368141123735615401","3568593500494929282"],["13876899063176707811","1830339712787786534","8236887326470485670","8254538799480726136"],["6725788998800925038","15245475285825864864","13220173483521043186","7799072038566956613"],["10690422282318651577","149345473868599645","3800852117902814100","16999480973903374730"],["3038917912068403135","13310620530998927504","2673730055619194553","13721321182010067542"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["4725362666444202952","1685901083186306885","8602184361979778974","4390885417275944397"],["3861622556752043761","13844626186702910484","10505425100766717523","8325086997573836657"],["13264822520284977109","2950517387939694155","2136391400931910180","13207917715414316844"],["5505717138030519232","4085320398848705937","1240599359457818396","12082947206960958863"],["15825722609014458976","1504091695449073411","13520824030836600315","8648765993847430454"],["9496903517189324184","7988532555277697387","243030247436370551","14215220999197508300"],["7763850041607196039","9141025445907612934","17068463971183299354","1488125469103961509"],["17302529824593634185","3594109549552025781","3692493895878687309","4064257571581066877"],["5860269415307632234","16741874901921202701","1886774963082970420","9258445772129460276"],["10315789591019743705","6657156225235771689","12907669092157094267","10852957857334149191"],["11369492196263264489","16839919115446242127","12049136869948923600","875453719273160374"],["12999809234655399311","3470396725076900816","13576558914005750077","12109457695033794630"],["2612925963205988186","14567027711210210395","6183415504606301846","9802605964336490211"],["17670741666062774311","16643700802079469384","6307835152049706815","11076070428862772810"],["18442753413997091329","11078396506290018863","14754878739457053505","14311492571136666020"],["6775248609466444160","12442777071342522240","13361447808815528497","18247472270039453264"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["6910868442148372515","5499471091188586105","3255168780443427323","6919762980919814877"],["17850189625503778613","152402030135576396","2491161240283536578","1858892389162690021"],["14675858829015424229","7097270858429840328","1047951122823671275","15405549590957598798"],["999423706305971209","4487467689373265208","8079894791035356393","12188583503098542015"],["10937228506885115329","18067918233491365654","8229772591760128655","17056705642894231028"],["15648474497434954672","147907897493346672","2328849310428833110","4762560721927873609"],["2029754276816700812","14839928844667490095","13225418401475620570","12968726267040839427"],["859365851206543128","6742822653586629072","7681624777258817869","14937133591467554385"],["8000422360376995707","7151849527756303936","11820313089513802292","15921274338817480011"],["3184991120775450541","15390961287525591134","6564261796291572766","578603397678897500"],["10158821230722404648","16359261188690860376","14442593947013147576","10310591711074083258"],["2803765773205108957","17203304496522246608","4708277003537057006","12829165145902575938"],["10112138467251911838","14094513278162272875","5837296898455374833","15675557464934925546"],["10719275283115461398","4073191044469932759","18299475321000893676","17835133530053496144"],["17244552608730262293","3147964563199372565","144566775667219345","2768859083255649648"],["10694538855342918323","7232999051568857037","17107091126648886142","6628092254097025151"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["7284749024193743043","9890988501906741314","16934515567699310309","8435870413150954379"],["2445853420982586181","12091555955142881602","2041473638939126867","3654960802873434769"],["12944196203243138245","152628345234874546","12627721537029326415","16152894258831740208"],["8021831160907345225","1374011377138482992","8149016173659897920","7975702257360188231"],["6916878728921489772","9970714198948287939","5713749024858043054","2149777781709257382"],["831531563235739209","16523579225503141537","6449489533914383821","14514372861007738773"],["16306827936354298719","1978051648107901537","7512730006452995878","11039803628715402693"],["18157039561805838941","9952844786439587955","10621540319691723066","12172257215651149398"],["12305684934566914066","16334662584145857815","13260837562738412405","8445647669855204586"],["11069723292473456586","15182230584103999548","6325811454557550930","18092715140735861034"],["9164186183240460687","16413858950752626347","15378227776666005790","5598021959997949149"],["11468765912962747074","17042533009008875088","4459103296199745226","1864388230149650823"],["1139385666069652796","9128990805822558062","9132192068291861372","8338131741287810282"],["13293623399021478647","10139075909300141405","9347589487572685809","2521245772313997543"],["13909570486439425283","16721948597343436598","10389351594605360728","11587248071745754468"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["10189328327002223882","17703301048219722155","7369847192969153029","5807554446735039355"],["14820488053644036806","9964305274145767401","5265479284466208094","3159728200916949524"],["13475684183522817799","8062408360749254649","5872821860839734418","13233758504503298006"],["3091244916218777109","4312604118529955071","11418891347657212983","528540308414929427"],["7452068280107480380","4018863370529065657","1772857216764248649","7232263328975804421"],["10702715187918315002","7083454047500799153","9891195227067390771","954101953575837433"],["17054720944505154070","1687594865757980785","4470873280118187126","9585904476798913232"],["2202729954793718122","10388994291137756523","9207825917150251467","5502931087916054521"],["7710917979920735401","11636853951522140032","3501496477818742367","4039559940448802508"],["10609632602222715393","11830129001866021349","7396888435233308454","4360911836267330841"],["12817190805596326311","14735347446565949715","5689693271764561326","9029945295129917095"],["4413906227019024371","5286201671518370983","14953385347200984788","14601763991406518387"],["1761180367491755719","10790753875721264197","1517442477615917880","11664012654275744053"],["5037865957699569856","9249779193849347198","4991432228457653332","2775954233172420657"],["1570861705861335033","7250155633413299880","2751012162859181260","12465010399940768622"],["8280812836316470731","525459528857064349","1224234600473223565","11407072143640540358"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["3521651703295200677","14732157683479098401","17766407344426278120","645070515971753384"],["7194566574145000069","15464748726898818309","6341135370283336124","86535979959360078"],["14271911817971362281","6212990324082272689","9784895168178660382","2731401987300413810"],["16197753597215652419","9736015005139425820","10641264185618668743","7765507634797057137"],["13705671688975303440","475114948720568111","14156072127767351795","16496923243017682685"],["15242388741046162197","2651146005683741743","13560746730257717067","5065400412684372902"],["16952404697674538060","4507539832812095825","1503050847079427789","9340783605431333108"],["16579922509164771175","14413028621360047125","10171922902761008163","608281920408404263"],["9754454595091758841","4580945321503626320","5934414151572250664","5965844593062293353"],["11031142587714761951","10481234412098844486","2156939831773596539","10629646664257728143"],["7188958176162358515","5498261689629194483","14892434066836922155","12370818648445840319"],["10817015763914322652","7062696581685727238","11206015846162907485","592384460529618532"],["10248341806500627981","8621420554600015283","4889946383995993171","13746349266461343810"],["1940642006623103612","15060965330190574573","587279249449110145","15542814158767802594"],["931311743981461908","17675264942269715202","3039141823971697722","12711775096583092594"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["14026198576133364995","2572442622942344181","4268557713020519239","9383279172620836861"],["6818190499043067227","1814156950849789450","14785973702755925070","598234971555424815"],["5390035817576179517","8186317538279628243","3961783691855895575","208039252577988319"],["3135007011433173205","10480702963276518785","17265834909138793700","15252595220585685018"],["5266825389564538345","1323349355784434287","2160836117390853986","8099004368689662761"],["11369420830107680633","1081119926354295374","18378243235199957507","10814370862925139933"],["16262679286839162959","4093049138074625801","9616860591201414176","138808537630331495"],["7170263618917209115","2036267564171246676","384712784112527167","15602281213121152846"],["14652374935818285684","2181949262995365007","11277406846875098277","7655029980256825961"],["15411206493366556737","14887202107808174568","17595323105773343473","12287498219509924298"],["14603915998301678947","1476174245984872718","10592984034823014915","7008837666209418421"],["286742097115502845","17832173575215871718","16277982793877457745","7327230719374742408"],["4351019855439979078","7931521859634899576","17677426926406844311","4998975780614436858"],["9362011415870486521","13176870661347857417","2224443676677514488","16004766443504425588"],["10298092242833800046","3618355271443967055","2885151639013239879","6916777966157639616"],["1835391189247437086","14546475408653048693","7945598013241966860","12707689623850437143"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["8875990068530893669","13887545529707066020","2047820926812571972","55394950342138636"],["17233974932706168506","14010454247639949020","17142450525340880140","3408175668625873706"],["16132991418297925192","3562741651165176814","11720034266043745950","5266645441955817333"],["7168140253298011444","17802071007090390494","3354799238478978205","12906606965572077895"],["18434744150426361812","5410208856826254481","9200190297713886001","4063245861149655295"],["8379201338750808216","10202536938829297160","14940049349869290406","2529120683890719713"],["12965618864045593591","9216716480878452158","12945739765195589663","15464800980984213695"],["1985157449462145441","2679744634930725097","6014923836179454881","1189682281965340799"],["17010765115361389776","4536972999919566744","14807144402625810001","2800674874253236851"],["1398691843822577249","11638457425896851321","1042586230345243197","7362158262916951540"],["13223833200477589475","10595285869960250438","961124842586112782","731208942303051140"],["13017591956564495068","5196283899556046657","17325500987414436037","10843892906067676946"],["13806404333824939308","12670354177427910037","17686067077431154929","15798542788510216238"],["14507921013732777449","17341571213690584428","7129485917971425459","4404361755492023678"],["6857333481849779111","16454729710574526104","3989451403707511992","13220592893677479238"],["7635239324268522224","3644193782740922068","3770420575850254882","8967097228445315688"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["7362993650357654239","3422303533761377901","4920156213318072046","2562872481706212558"],["13069698055105832959","17843721142191126455","7101427145389459643","7219075324814742518"],["11925621798275287882","14166385167146200764","11791368507345370589","11452664048737784405"],["15302559018306790024","6464615553643204184","15345075836660754324","12116872061524472232"],["6474772902969229054","2923955142169361158","11993771348879619652","15735619772779390010"],["13932257900414879518","18157669757850322981","4953233751434263684","18416620678206065712"],["4625653039334403261","4095285928913827839","374357129180310608","4295202593778919694"],["3963030130514911823","4775736317215259188","2024839969441618972","13270658120698951407"],["15770854904631862214","16317464641235307827","14840825495454982105","574966864949572263"],["16947575036680743360","204427002376701921","10941042357705118973","4658220753731056667"],["247335423172071919","8829910557682131853","15237280778290380487","16756212790473821694"],["660597714599715814","7212848623943431634","2385452579708678675","16475126700906314547"],["489696336480252788","10103079772586498293","1322758140378775297","7740933768625416512"],["1407337365760144843","2286768676374289713","4440889715311480630","16593383170953035220"],["9395844085047905814","1897404399097945971","3412362229994687986","12307778403955881364"],["4121356699988936961","9856259977427066074","15334706139409237421","4096871072301176216"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["10437993368433632991","3523213626333140152","5287159590766046759","343890551405509047"],["5543526157231908376","9824314126179909146","1859351149043613418","17884765355927408440"],["4701962908972037318","8503678725440543392","710198794482745372","4491566048523946801"],["13800375857328973064","4170429277679444421","2586531890037962580","3520963741205831471"],["4351840432259756607","16401035254849046725","7273365418779719579","4828045671203572193"],["10091234706969792784","7909398740869742027","720986876207371217","15567795051594547047"],["11189983400353293515","11809383039844026811","11566449388956544201","1042524831411555896"],["4797442158997269806","16700848644388540884","1914512292321875701","6358095248985712537"],["4131322975775015727","17650777836051742132","6291938718869765643","14154512061751385173"],["633926303022006516","13033425744894549324","4291183923502108022","7478330168882926718"],["17516225096706647997","17085737708102345194","6761537359952098280","4537678226923493766"],["7773035530914123376","5924868418725816835","5467838950386263133","4706095498121410600"],["5592745627303002940","1632189291847485949","10761087487437527000","8110040262657876009"],["15848832367796542619","2862690262038340837","8677367111271386800","1347707884457248499"],["6595841642477281636","12299002353628461706","3999284933147074647","842762483325550889"],["2295625485825794318","8607687931973758502","9866631591926537178","5962316801069057777"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["7047417608103176987","2245071078143962177","9302113396198152609","5784557947791460890"],["9164124589773912660","1360601943777979385","2315156572839160040","13988671131539741077"],["8779920275910662102","13384862793244025092","9561677848220382432","2352598754391166127"],["7550254288167535785","13374435199200606951","14575131581479424168","7043319086298619121"],["11844296528770854335","17062401757048811689","475494746981473472","8745503100577179233"],["17070547618480678411","14923512862119940302","16855976628655781864","16058043569559064541"],["3155775997004133245","11042709155334612765","16359334572326958960","937193590694845748"],["2130516659689117584","17882544163031915583","10337826255573493784","15197311119129689743"],["14630558510367131035","7133474215512049374","4418074055224157793","3516419246843403219"],["4662842630746995985","13925795506150980013","3994925459164107234","16254552789825609729"],["10324455850913752043","17312420927929149230","12219359274439602789","5082815091821488586"],["16223024750022838865","2314136688546571783","9300242512320978585","7199141614441373329"],["10386825032696905437","1830156796162441050","15897938987618497625","114513838574457849"],["14742592295314667531","6589510203222286038","8819353698679507883","18087951138962844136"],["9938238972068617592","6112878722822109711","4468555458028589451","12374528062718402100"],["4200266276446124860","7590776884214412270","17989643570963819261","10701083148865526682"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["7940894988224584242","3363381766253228340","18024087101410876461","10075486532754092041"],["2928189215733257063","8954259737358610741","15395887773666646425","7989097488394901623"],["2394523125402994350","9184752104701120158","5369650176038745076","15257718027064403487"],["15594630857900198307","8319873517955388444","7305545108612059620","147022188556041645"],["10230969399141054354","11895208740006607670","15076340628762658409","12395271530648605934"],["13458646819749422301","12047754988003215705","10945250553461528831","306342047673916310"],["2307155305218394818","264558092737655162","1124520728379767400","15159830464847210343"],["13694312574940036246","10756231371271133681","6731097987046323751","11298793989351211346"],["10251950995264695836","5862013522760648370","12289707665091188875","10367769830823915855"],["8519561864754931015","14394981578501248418","7560656113812499851","15777649288280342470"],["16261208634527572190","3246328882388643079","13562264632172498476","16313452068575412851"],["5976887993743859083","14046741707090372937","2216947389360292091","3758042726067881948"],["14733276355553601467","14514891720186706155","2160693451965400318","11797870864029255701"],["11969642740587484155","3784834350341182837","12294157551388582155","3328257535383710249"],["9395844085047905814","1897404399097945971","3412362229994687986","12307778403955881364"],["4121356699988936961","9856259977427066074","15334706139409237421","4096871072301176216"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["11797706366817157829","3595297497455257170","15816291287371304399","3239916437050852909"],["2637556437505146054","16667837867291380374","90699725043019411","2945130343070741439"],["16750403476301794871","2115949818712277103","110549302570924396","16521616118015617222"],["7032907215842534586","11494282505645911466","14067947208976983678","2819545465525620241"],["5282692426910499518","4701870537443502205","5717110324495506256","6624073498209081597"],["8739849263345359782","9748178771726753213","5450329391411772292","9690783248283321912"],["3853061361730875920","7189686013774073326","16736111416101988625","17696304500641734057"],["5921693194936931018","6470830139670223921","3244781249808660643","3176287763059677850"],["16928610641703880499","10693274670638515356","12422353604566670359","10339877389923678716"],["6978714682920830669","14557612815189967777","5077186294299565765","9954086897401269940"],["10062972017366537903","15322029321360720697","720079285258340279","16105299260139664580"],["5169336984605081422","3233195954242563560","16868572506598011893","17602135275157513804"],["11807717151977190840","3143218498039404258","4411688657907083875","5695680419301600078"],["10638379641452141949","14948583011377418085","6281385582535071742","12785933007743361269"],["3978823544199906787","16301888691623004092","2500636796429483123","13118662680404425297"],["10509066551531909793","18051754802660513565","4613257967670994689","14727975837904249345"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["14035241906954009365","6312601886513041610","17268576663063639533","14721561251552454005"],["15910834416737142388","13715250767132628835","6955135096715890064","1056342786053798824"],["11490936844161304623","5990311748026444266","15478460883174585088","4621156894061275179"],["8266348877088185549","5098508608318707664","2355693555879180328","10612643084472998495"],["11678758854564192671","17080874649061077734","17939746641247311882","9916212912273580796"],["4390314590037779206","15776227312743170158","14773039431057062234","5159633177888715521"],["13726035118469811864","15900943792273402412","50462024645659540","18038372343771398265"],["16873026797329555399","2934740759927680486","6567753468245480336","5316472471422698564"],["364414804014693467","13106921455044854810","1108623538869697524","9313523928634172096"],["15318122354096643925","885694172399118776","13357788452530165232","16117214031111189139"],["3300041215261147596","13941912004730701257","4823646165067437546","6575429417243432859"],["12999809234655399311","3470396725076900816","13576558914005750077","12109457695033794630"],["2612925963205988186","14567027711210210395","6183415504606301846","9802605964336490211"],["17670741666062774311","16643700802079469384","6307835152049706815","11076070428862772810"],["18442753413997091329","11078396506290018863","14754878739457053505","14311492571136666020"],["6775248609466444160","12442777071342522240","13361447808815528497","18247472270039453264"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["11072693055140368946","4213365593382008573","15258485628590990901","14160515721162184450"],["13837162345910612068","14395791008557837778","16345382026601335269","3374162080397830812"],["8935438763204427415","1673145204510439589","13071157094062710444","14455130135170739300"],["1741598287468604593","10406413082768314697","1268340707742966029","10464680153152044334"],["240499167157179794","8340527141475085238","3947737185753408351","6816085557374830848"],["18294819955310342457","17528351927267974273","5709701123925507289","10208525713566461007"],["677225860880694204","13006920810059227241","11550419988347743721","17190164218083293783"],["9624700789132543475","6652908509525849696","11676225025926808266","4400217888340395481"],["12085685988049788186","6243476230127806221","14613308002434513334","5589498725630394401"],["17809253954643382942","13035878953026486094","3001764524816121723","16833826451929548256"],["14408225307790360572","15910695660407985293","12580438484956876888","11149618905601054872"],["4330034866660513750","16453994947255206393","6934034237145940889","2977812240795728435"],["13424950206271183572","4512384207812932516","14805699372263475413","17623313967443847908"],["18357219158907511956","14056652433716505309","2308884527086784324","16954001945687914790"],["15061623612188989427","12303888631045213480","12020358322015490093","4591718479463015269"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]]],"finalPol":[["15317488435269559868","8827548877062688813","2392355917407824429"],["13060660647701947591","18112265182063588894","10772629311480694063"],["12821580821232926802","17069782915583437512","17600429115440039740"],["6723843699028331949","10830887526619006152","10543642579085354343"],["17375132281247115906","15089646568536408534","2283843517492258804"],["14802318442012186039","2452803920747338553","11328519871260386361"],["1285943913301766780","4383886508347314386","2460151193713240459"],["5103446824944774608","66493266370017592","17921268692091622885"],["6188077683054937263","12182003225331821855","12464936512328261591"],["8025723328166422812","3851765920625598823","14601670058785081302"],["15995924823052265937","2593143258303266953","2523682977592529727"],["10184927216969116333","4978148165418109190","1733942079494686618"],["18411855337488798833","4979456176532557299","6553334802093887374"],["11363728096203368015","4600087955188295651","13419752915880003190"],["12310373641993148015","11651699374406570837","11767826888008382571"],["2179997558272015539","10308400120664640651","5170382215399169885"],["13064874890953157559","16622040289720500525","9403233012979708369"],["9629404126832803236","14730643436639591532","6502681995813972898"],["8931420526795463973","16070120886850799221","13380295350115691732"],["5835020528050185850","10012305073081808005","11234203523956240704"],["17730392970859132865","17330899432700528344","651659073242317734"],["11304475491023318122","14683778565428445047","18198223686504454883"],["9797112778910122129","12567327534329444247","5058491299132542465"],["11984114476070659193","12139130029892202305","3344408028867660903"],["17638621370267544547","7303467584210524754","7442641659640522563"],["11461596074769251578","4755731047929264912","3359844772805041337"],["2437324327764893979","12188242316790475578","7951785365100737646"],["3297702054634240954","5629291930683131862","2093350801162183831"],["6711313078496317217","8642399347089673284","2849341760706128790"],["11548161474942788902","6367096015534400155","3232247151673777097"],["10000688076987806590","6767248190653315530","7260414679975699134"],["3610745989394277555","4460722845445008175","3007341393967748297"],["7412378620761490258","1410675436264401883","1759746395715068855"],["1601065280022613010","10200716365821024643","11533038820644129805"],["10753323977164270922","3830035910690041325","13472562640506529026"],["479581392195336276","17815314359260712213","125308032007025685"],["9108551940325537982","12935555326027346859","12432881274751296967"],["2088217368935723818","11310575374521156634","17216924185757751966"],["5171436593183431534","9052439769546363357","5816133028850743337"],["8137887146625729162","10674490366340040513","8913038093095288621"],["14751248108067394956","16266731303405037578","17288772083953096357"],["1578077616642767185","13175002123227306393","3176842793662137232"],["17514960334075312478","13940261752146025464","6512795604658559932"],["7630623317282528090","6385050013920774667","2264911870913469557"],["8059831233674416408","4962882719060674256","448118842458051391"],["1082422241587213945","14423640581854759512","8037785576382418960"],["9885190360166288063","4738131940904515466","5757102752094561777"],["6337049516170640725","16572567343513919578","7217104328596717565"],["3233848280702990495","1613993192156922564","16042672534775946239"],["17257808826105290838","13600977340827527601","12511508631890939283"],["2214017270772576738","2574959837596495396","11139785141085763381"],["17015524088584295956","2791059270526965185","2146918054159472936"],["1650142811716201371","13082183841842966052","9548913181516660191"],["9935994590748038042","16218530085617392886","6998529571320689863"],["1244335310704906526","16247173844103388524","11143386476687381962"],["5856499254500465836","15557787409820051984","14200498092113452393"],["12026489601361919898","9330638082032348574","5725338190939537376"],["8571947020783314273","13576740642464928069","10061479922657969859"],["517730840166699694","5290551112223705097","18385104182654698916"],["1572316554865790794","15115041650673739272","5483931228132363463"],["10585807336631474262","14980818647808676239","858115716650195886"],["9060965215571773640","3500585491292458108","12534457418375067780"],["3044458176362356565","8149190827893334199","4809445919862829753"],["9529798085631263584","3777506608138365748","12745655463608305230"]],"publics":["482912177","3783436737","4025592058","759365245","4266243746","2747126796","3138302676","3064646014","4253668154","19875964","178909961","602889427","1360315524","143900307","2046621735","1055473965","1872","345","9","2212458527","1476847879","4253982365","3398176595","2356091737","2790636499","2729257256","1871232647","138119332","3181085576","1112727098","2719221653","580935041","2417456864","1066270799","302031188","926997818","2291304450","3097553221","2761796246","2573282801","2985864328","1403923277","3237549865","1873"]} \ No newline at end of file diff --git a/test/vectors/proofs/1874.json b/test/vectors/proofs/1874.json new file mode 100644 index 00000000..b64572ac --- /dev/null +++ b/test/vectors/proofs/1874.json @@ -0,0 +1 @@ +{"root1":["11597177384274261951","10986056125211413957","106437117159811459","16035659133203195158"],"root2":["4869072528223352863","6275850450145071959","8159689720148436485","8979985763136073723"],"root3":["5818211642038493590","16397507336392494487","2152419056483844075","17998902290733962010"],"root4":["15854081870190766929","5665718977335115463","4933362813177084868","1099670526546845494"],"evals":[["5093817681070162299","11287492707120730877","688713948426977444"],["11061517795755029096","12831612376995314547","4833532782422451562"],["5273314377103371716","10445962614721835051","15440224657553812075"],["3290817997129988183","10655444176498441588","15798500676824038184"],["17963374867797586415","5297257588843765791","16265575930997868193"],["4511036395661560606","6429439182403319719","10688912363793787954"],["576832794368286491","17756275464617949390","16207841554566491203"],["5827044175925074635","1470978264693219026","13001568331283175608"],["1130440087453333215","10027648967621315098","8914179642003436121"],["17738340946143449646","2843656998490413597","11522331427457312213"],["935673265162701735","13834345656587283345","5459312945267893368"],["15407214585291440723","3317189728201067996","16091643224556504246"],["17217145406063410629","1750854875766466916","1970056168912984077"],["6301717491273580972","8724364153654419316","17809711832949756639"],["18295855037019161894","11951340997587819106","12186069462599632753"],["738448668004691407","6351529137529049284","6506655578341268395"],["18032673663730842392","1306837206915282311","17783412856512022998"],["13414894840932690546","2482608531197348039","2332249702188593146"],["16252913963673491841","8944797315122787977","1416451529578229322"],["16227690285224721310","11864196747163410402","9386149407455329964"],["10565273772618920576","9456159567855269355","1195744661049742569"],["8657211082780172056","9337470330982711492","4139319096840714255"],["17094152974286900637","3052732847003477234","582444894375395920"],["10587916539699003850","5030000175571227803","2553437853695287872"],["16912152779083482630","11105130943128077115","15488797780664162555"],["17425059645785363673","1126385261375446016","1552892049113074212"],["1014726815186210728","3389830624689038526","8093580722636268675"],["15574507214083576797","6255575137774050767","7177660023722673589"],["397003069999466782","11173112758477431617","13156968796763543792"],["2378789300224418549","1203077435119471498","3685656273764900527"],["2572338831845625659","3048175782594221851","14395588284457367306"],["9747312876039304576","15566817874060906781","6254999328758366432"],["16147011169507827507","16495198973725125619","18086282371233940862"],["6755408541767935464","4930923848741362684","3924445187988344218"],["3637232281619392555","18018068565671903456","1446018951797521699"],["11557435773866440557","13973521442185586726","808474820446336187"],["6943216944808650851","5220811167684217354","14217220190346968986"],["8157323814937168638","3000966506100414471","17726154040497059127"],["5091762587947378899","6757646011694821707","7567818787006050133"],["16252939909191670993","11915330573830556612","2614474953216686877"],["13127819681572413652","15734858761400286383","16676503100745711500"],["10858912703000236033","12832274432959312848","17469047935979256962"],["8416316746659095691","8329594217434009353","1005155594026757445"],["13095022569994304843","1601262049086465263","6229924459040972593"],["5099097719792831480","9312307831697916389","2973812546184007289"],["12781674078643352459","13444805760469293260","9815885133351075633"],["9353286216740502930","15721606583366969169","3427427566498355795"],["17317867808575903364","6991319833882837759","2827489898495581916"],["14770273959217988659","8652433214652845236","4916092351046306159"],["10295834662161656671","5705039955845655260","3285196600545874869"],["5581309773113593872","16212736262188095752","2299722425432980029"],["8202789147183420305","12068897171166428494","15185441335129217857"],["12358218957580612293","11429093039817112408","9391535281785611283"],["4871046809099597034","15501134929502827795","12702599659887006530"],["13819539015558834569","17557961416246512388","10758968098427744608"],["17883884479999503029","17285495288722509741","5590511816971651579"],["16656652379974252492","13895165270658547787","15055770884629984441"],["13134101637712868357","15989535639653379537","6205393933276376071"],["12844073403911767660","1252899224529400595","14410049369586822483"],["4504408815471452852","3434793133609960661","250329386401263373"],["3402542182086589882","9709092583145901627","12690668966708434848"],["14335429961750743434","400535926326291497","902786962225504103"],["5147452245799075562","9883571301880089480","13800901895521770547"],["798722944413440737","11340222858565702749","7741028578344165189"],["15936956108826191406","16035829350137738256","15382880565162142160"],["2905257958634001015","7595539972046989798","7844563067867644393"],["3503239381570137691","406571137962304870","4182959986860337931"],["746722311887295831","12114602090311351252","17349884849239487587"],["632767293153256275","6699351595632573816","328022774571494253"],["14557122378436303682","9201680168021287111","7879031906711892534"],["8599251954974927344","3275034459699645326","4619316482105775114"],["4237180526701602047","13438413339818982879","8216558688367062735"],["1552693869957363236","13778117242927259742","8891695636021171397"],["12315378213880396171","4032055473649777235","14674815150072797892"],["15117992998729578443","15988969261502911124","7658486263111106285"],["12783200041067056189","13984636585087445630","132261329691001746"],["2184319332959111178","4849646436713246582","3064269875428288080"],["4251037396768778095","5066117316470408337","48192941521965322"],["6758673720425152393","6292222146293983302","16430250807926495092"],["12840115763092520611","12832053352964802817","3605319036590803175"],["836649144467238307","5231383356732182748","6141924712881026659"],["9416255047544533111","10468745511883479015","14212540576662542364"],["4887109819482888776","11906150327884532111","4835628094929332516"],["14996008152012178733","2236992734326442011","10340874591077609969"],["9243905569040532426","13823297919028612732","15999817906263250509"],["6150445089491470618","13750759752555646767","12816552390598999843"],["2854105077496520100","7296223493237369216","3325966913171639015"],["4756648540729806561","5431527605128027995","6391947316149581603"],["14534350481635868877","1867842409639064087","7746013234090925417"],["9165522953932957763","14188267302289670539","915081894984432407"],["15099874903522381102","8583678606542570034","10757457831486610948"],["3714775315892489155","14462910015599034548","12226765774858023438"],["14355320862897942777","16238833589192542179","7269936607588976983"],["7112446811575860931","7927583852731385426","2733190553098128862"],["1150052659952902692","3636612457681915317","16523973068495249045"],["366693685738985543","1121833607910476536","16255614004048474110"],["1944711565404303989","10527533927172202075","2458375800711833080"],["13085901466140583622","15884870665321562488","4069782195916136642"],["10407022596994937774","680923202203005987","11163329613062484756"],["17358227488386426628","15002321061912326797","9844952305073490836"],["15509354419263703184","4501574857015364736","8927232828240116814"],["16451032432999272459","8761956536139891129","12988999153574271969"],["53280507252095962","7495974514676989033","9755879490586224363"],["8423120491312744375","15639121401930412959","2756537053214076683"],["12826611296083430683","15820023231306221463","1477576799954397471"],["849375487386142601","11482769196782535822","8409504909806186281"],["15174445423327312859","8300501149595595635","17735555441499954531"],["3913142661888050902","12296340251324706788","16936605360646035073"],["10438747878460582464","14695217630206492072","3801594739837171790"],["5755573061825569770","9298423453839985478","14014910532771052597"],["15316114234503354250","17770448441026335043","2972487004430044519"],["14065997017849722730","6838932065742033672","18307565747278357007"],["2280279077079867974","13943030558427681101","6771052095016584585"],["5278349203617084657","2398889499208013448","7523328869943771609"],["8101464638704698420","9804459702348664290","15768925762011835241"],["3983894269713281100","8753153777433930680","10092194405251342700"],["7371773965500709793","11914515828519962521","10927326894659297355"],["11739466857777587449","10176891576845482931","7404592342448531199"]],"s1_root":["10945787295660572117","2203376192116178694","3429250244545867601","9930016675883947414"],"s1_vals":[["1400574674649864708","10326805714408146711","6320919681415015493","8167794937121721170","16609926636615942192","4225103370664389439","14670437255836875265","12514275537913029708","11519058337202925357","12964547147944203001","13165495524527018966","14234971205146581404","16371322863893096554","9736968485600566350","11876094479610930427","9757205069127717844","13320502193222011399","18178268222771982573","6185552074366518559","33972367649989388","2317563808776277270","801513127769663075","2146114888990247765","10319892783618263705","15913879785152573926","4388133356094859553","11280361379118506732","2268975519381608107","11087674872980759619","7686528716973699175","177116029769959837","12175673388039455168","17861439174115635356","519353744973671647","445215112910083964","15910275379965351909","15325559172221876430","79358276847930778","3750036786638687479","16730531444117964427","4930734602216460846","9570124384057191257","2439147922449688746","5883524537453885227","379981338705472867","9615957389698804842","5586351773266356154","6660599143190229561"],["6250494507792014592","2981643771660238404","9508943070545398492","7924887943551440293","10320120159217155222","2568631520961959559","15436731596067527255","4513154276856988472","1989252752079428276","3352430449646074963","15888078523693346859","14259941104383843720","17850809998482644914","5573982386788358366","2033138068767694466","9485595846561802047","14777251272526591363","127574099705615866","16234810975719945144","7692818531304766736","3977691874038369579","814193904116413312","17072381315321374204","9900375701152780619","12660969474321123437","13170616133227156030","3507023500481207231","6605132846821473141","1305667461008079331","2362032370482755134","12977619727878254372","10430425212023308105","9468479441931055097","7212806236709609668","17465088345202901044","4394609495357354070","5544967971920292368","17190828202820999284","7311086441001117426","4583643061228269153","6530593760279564231","6829878466538296936","14689653403800477363","661322663411971785","15889402975024059839","4423832922882314159","4794219412639315828","2384378823887829248"],["13807306454054902481","16588033419201927677","15815022384005904983","13371341440529686616","8703246138871977902","13175909732785776515","17975922070760577105","14513531326883083739","4800104645738787924","5423493156294495590","1297847969456684376","9784974861048862216","1235802160982431093","11188531277780959020","1492095713080274537","12177434512531608680","17534326976693775834","6773909187416293264","1133519994698740155","5471848233722853191","16780981297106189273","2702832830548006074","7241105281082517754","3214397734851580417","1427262690725450818","13356976684297704811","7249313902835403742","16827329805767096481","7227859914299424950","17578433893612185789","9054371436571126954","7225523541014259716","11124475974642843928","1335943575381427702","769857625467520154","18193101731129799936","11598997830310136163","331747322354486877","15513013397186303208","10831591676899063766","3485083190228528643","15024004228165758877","448303644238579183","10771815839941893635","15730918217273849887","10401496980782778429","7373049465547844744","16347078085187256665"],["11099232485965836999","4915024148612169489","12889614064888125035","13206562602971936509","16418603854257956401","10443915803044728698","8724689322408224733","14505127931768646777","15757916174491824045","8250412028555069895","3540285449402358043","12776495588296788559","12543908594850275938","944673870600002038","7283754449457608616","14114370902585526842","10625878521150593813","4267961706912277064","6659342269479692625","18060987366012016749","11985848903294124898","3712902121373525503","1823766010974826397","10758151585470131709","1953713971848396337","893296494473952607","6140567438866216549","12908853566613854351","14937337352979842401","12623413061336607664","17758950799903889177","16552682588860602412","5265873556431856762","1116338590694800648","13258024101799459495","7209086958329728316","14513599011954257714","7943197224553998097","16877191160892522475","4012903167460847863","13625398983675413815","8212336040331412034","4475553172418728625","5713726840630174531","12224698403330011540","15110268512936973348","9948705459417638416","15403627039307842982"],["4416047798422438323","15654977058354543238","9125677545602428442","5418376427664367149","6371987977838235927","11827459336991468600","7017588661533776593","18290252627612586490","17065659964870425793","1316760455822832679","13553292188402152276","4135178551784847929","16389158492565453339","14419228196710800615","8548787108675570266","12441548274812976441","15972309900710919068","1232242121350953075","15611680435828218394","17302500165120734776","18160141948455935974","1975046704447102288","9119596101441974897","10178694843338840553","15572957476055239815","12303867809549135310","12272322758761046056","8487922169808131174","18108286326532049220","16419696122643198739","420395197281892469","14273393640958571422","13795790949546198479","51655689054556374","15363166150532563895","12434158499669474545","560430823179556961","17719211100017114888","17262366080531533264","17853543363773248492","17461295272545588569","3391600505104856056","11971122978926293284","5389670887067692866","7794736317927528200","12891126578409446995","16135855531559629705","16197509325620003793"],["3457885339025068484","17159208925424505467","8460428877588869818","17500372712696778479","4886572421443441877","11169129302896300546","9995195063502783495","5442491048217633287","11392672244933122145","5373023457289175636","12453391100188073183","15986565300342278600","17093371468675427021","710399931429757443","17045453038460000545","2391035682228102603","5620504185559043726","11845276261130255375","4188911330744949423","11143834980087564823","11489893579224631744","274831473171947745","9057816010983881247","17094976394047494835","4525036062891192263","6173845612384553385","14962487125307963941","9925714392913420190","13095041257496295791","8114246240971011651","15840452021743120112","10995948019738607837","16880198262830657548","12761114236277906247","8225447744768475167","9798849887246649896","7213867130117150583","11717953119187227393","5124346157243736257","16840208942232878916","13735623942419231439","6214526240506105216","903215141944041176","581543854835402288","5708448952460315588","4048484680384601305","15498143333028544698","14249843972190680392"],["6998685047138536944","4974029989745054910","2029562677507964712","10075983459479338705","17589835683859278574","1678833826634338677","17016485289387053205","6313029749750161016","17466163587842216973","1716629831920246174","17384283066108769476","8925060682812234091","691170286279607653","6219704595077486965","1791703157767524275","17578482848523574387","17635725297506524571","2877485754820884755","4046106856748916848","17695023327227078718","15520900176600504974","18132953366696746181","17225036880814760079","12399672786403010112","4469549345196274114","13980014681194758999","7187081475216937640","2677295333354085427","8183124966752625632","3413734560509649386","83922383309669214","1295273049086287405","16104911907160717558","15710874237575652895","2550237673051261727","8307182707653565096","11610107864570000248","7351172549667603395","11447898013301193365","10459066842603532861","17707061583885209915","7024298004086276117","2549981949320945898","7400288080483334043","2012244062920918772","8039437724379796220","1528188931693398923","14965496327977689336"],["13583146459167968405","13262587893895914055","7738864329878751782","8564368844386607854","6937126275779124599","16279356969307199845","10595692700444891103","12956142111817581526","10255050525415882858","427328170983516900","11657857503745285464","13162059007960723464","14135194585285290936","17872228557477629956","1698937287813681195","4649479929975365006","17056828214910916584","15343873774666163075","11895957164858296521","16926987744200996055","4022184048915641511","11513346926049683414","3803386596172140661","10534102860873739374","7157897633427824738","17308871853611616881","9814310317671167968","11252848966509628396","17309881846377021205","17152839652330407656","10821182275140504418","17369445476309751364","1788866447494336806","12556237479525596527","1384665764819430907","2406175131784369835","9909096286697734279","16989684948097061114","11321806533529221244","17495814483312754810","862219517784753435","5580219310612777695","14866998438564236862","1617400162619531699","12374989516554302375","10391084369680502644","3589126717081933486","16117581574903971202"],["13865148166901273913","1621811725047632985","4777454053178879812","12169835733298771606","5385932264313323270","2648149188423135297","16976159314854870638","17459662077860956952","2394029190786710451","18296379653878945826","1123460117712597731","15939840149432132128","2261223220487038718","7727570329217785389","2573567627798914540","6941775844689163852","14271776805359387357","16339839427058614497","2967440575798277139","758978753830128999","4792748679237537876","14336281014387708478","14313450938179451467","17771938183577106036","4563128727997777174","1454188239383150600","2398966005708861570","11478960693550937583","10949812339381432577","10977029265337352377","11426791746831181098","3550295181175627673","3884071498171900645","8497191676176127991","6056599963553777822","17488476572182697694","11314442398221706589","18226466473635606044","10531052916221573863","8839618260988340449","4410613402929015916","8311017127867047291","14279965810699380716","6911954688025992868","5415540821828602909","17856782997542629736","8049569112994922187","124904799693481485"],["14145807317353024934","7595825943773557277","17340586170152828250","9935438605260546434","680427186230447742","6980936378621521731","8883620887717915641","8890205259564417752","10650947226545842662","1299101538235940490","17870713662021658864","16695357960876406075","12658314644770628214","7473507053866750971","1266601427148070069","3346895570177692747","8064580745690161894","13665502621181922024","18099110293558000595","2992969054788424930","18376246050158144049","16510439837879350733","4554196996949746948","16054768269135612376","16024987550500777295","2416537204430656147","16803138813033618686","14070304470471341793","18249736878944925402","15336946415659447602","1779903916173217883","1046227518688863462","257780034022611771","8635667968460630271","6828768273178184905","6738736072666264475","13015048900853512674","3592637956614024215","5058617161178941593","2095394739817275787","9336013044394602186","9050549208248548673","2862089772825211111","17358852194744977606","10307590013476527519","17182506147402868567","13140823684858678709","15598784113198259341"],["11994992003377234276","6584531824203504803","8844435598228094303","11315514532543889860","1124207965572509586","1849534224420092878","2337709148735053400","16930449217037749116","16526290400013176811","18011053314778228739","15786664089576400267","8235142920267301185","10717265524919972455","10639577427273660337","10459520546190443538","18093402951297083307","13354107578201436129","3675357029338716470","11371099656517915174","15909389032579655417","17470210743549388163","13068935807662382570","10801841473534355387","15974221770283417196","15366290288563803064","4889322366466617491","5076160499563886719","1125268456093236912","4629801220264996589","16956170656459270657","11174440864550444760","13721132979753378135","832429242466792233","1144731809288439525","10645588403853578624","1214421038415286096","11169367955059773339","17551295634298910206","17820479603579224652","1552714887795315881","16243797492799876735","3201678458805147149","12200847073725496699","14328462442657921156","11029386032513762339","1396232265121151529","1616436899589646264","10844317630548734393"],["5831611590632320187","9117323651376738283","8026617490802328962","12824954597323150627","700493884375626978","14485331275936217074","11034232034960633966","9245810394327705271","14593652242742293676","7776587567143216414","10216538420881252012","14037336332333947955","8148076591861636979","9318763255574329604","4064932793119130374","8517804158951194372","13308375505725837916","5267105671752322348","18356392349238260935","15272411337694161174","8704683092804523726","12570351920988626236","3596464958259125810","10748452690266838308","1221054086640823815","4150647982784652778","12380100113002493845","6991386613657661588","4987334551628641559","14600652764018950872","3705980177640379670","17713949030923532209","9110261036076259181","6403920543332310962","3307365626577937243","4077828950528817610","3146073741353510401","2763634700512921411","6182044968502781670","7246098939355786865","15340776619369975070","2408352740475464319","12123047899443207336","14296909652140176403","6359636914414850783","5177099124870082658","16364831458650615186","10167877091447134590"],["2920577835142580605","15617500627146604557","10911533172978497061","3559111389147734481","17074855840775168465","11197485900062426141","9092293779809268839","12116388719880126785","734065020798799952","12923631900599844479","11956058069250469626","146983704394625321","10482801161576348879","2799226239959568311","8495432596285757884","14655709337635528177","15480698115975228544","5701557757016532460","16126260373738360100","672860734853137302","8121695599987888756","14909865455233650734","10442652395734806140","8557185389630111354","48444468590289233","12155014009889677856","1841587123622028891","11431942042806892563","7019963053447318832","14750866686753578207","7085718077284285151","12907194096033413281","11655771260986851303","13353408698831041882","9558786899668267600","15939358807281577840","15646733310378816457","14765634624172672067","10817058041942732438","400711662709993268","2399321034494571577","11563518654022435271","5597853025503553510","16975345337276408873","712610747005974667","10880530658381210632","15376812331423978714","6565556239558121249"],["6265241941487561383","1716724862586002077","1995839952659826531","1907686923218462859","9219346801402872909","14194689976306642213","9158297716424007928","548382082151911007","3903158383159289578","91370643053965071","13244914007990019937","9309142357262161179","17106752845833075759","6515919773514963833","2282652821160138189","15732219088111635427","5729832761402724174","9564769198157257809","11260584671403048733","10328976923684036589","5353745980191950599","13692593368987569895","1416451055127948909","15229903765051461558","14936136465928126034","13334929936421761080","599317537523879430","4990853370731313002","765157206953338079","6773695967483589351","5268461037677457606","14723425869303327692","18255831908657558824","7938344261899614360","16859135469792331585","423608178694166833","15023116056027934423","514523401844759058","4974770335385774711","11695850236542216776","9965167049728922265","8746507684394927512","8416740222325647426","7964217090748449888","1981316534903823296","519387006626506045","6510841246964540466","832849457509116576"],["14993951047463392684","9049946031055682615","7003698562200321712","803472049425099467","13658610948137503704","3330628199782100201","7507519366211117283","17243895719924911253","7892768599373723157","10615103690419255038","14025438908647238836","13877483606705145741","8488053304318361538","11834702202017829774","13984170469434073975","14414376458534268210","1484688549616784914","3974364155888603603","13803481379933100622","17513750035661323144","7528232988097999056","11488217540787411429","17068845744996180879","16596566381574596507","9379025308235102453","9751278941564756250","2147025083151170245","14678812709874409363","16255452474389393101","8914033832279482610","2709387999238882661","17692666536328662675","14523790661646088707","9001211577481264929","17196178482049155400","5410149377401022235","16177193009300451593","10082308977231324539","18290346728898016743","16757786453349515468","8247031838437957025","9836282054949029109","7816813482063869229","5676823015656419090","15825364621511681982","363197563479390656","12207949273331126121","4690443114811899788"],["10318027912894522656","12894644792935798202","9203074154140176702","9858309297847067106","7068359142203961385","4328156379917343106","4334266360890037800","861799110619358578","4288771868741422227","9000698507227426844","874070927470452801","372689578873139757","7094654443601486373","4753197995088536329","10946810460164708630","9665302506942025415","16860051164762599985","4679409041481672964","18437813360370638054","12235081339554542823","15551336802130133859","11195932076419460598","17558410977060796293","16814531436409982380","7321757838870526005","17778034406435427915","3050464234397941689","6022660443303055957","17041552667313541221","3474968973673538985","16263605013384575353","4915271458655347971","1410109501881808754","18097591627746683675","18171270944973545661","4494653791194750892","16850931180002328891","15453925827559360215","16920625620410746066","16117877545942538361","8573853098518379197","13457661252371540329","3845488322267817223","17197332722067836771","18362286476437160762","11741268526267534630","17227731902131794849","18401980173402721776"],["2780597633571012541","11423898425857909901","4378103250671330100","14749687410616672032","12804256568538845949","13419749922340913829","7837154963192242565","3847849823351695790","6428503778583653091","15389222840025007133","401378432611149688","16571831622201019898","549360144974320126","17350464029220534640","1729646318559401354","8809036327684466874","13157887484359686340","2454504154081617402","1525792664051259045","1503368967705185543","12297620477760347088","18315677782302053762","15523269884154312188","15935846768336490820","4158731901853977509","8318321829469669732","5741218674915493155","928452057116997723","7203693022793943989","10894845508201054860","15215516347574713515","14174882538457640459","7754721447208735984","5068927540203104626","9421327520252733710","6040783604725368723","2132449729544747814","4670889321552622095","17521921745866067765","3329281428183385445","13170608700548055308","16785016801375181391","15729353649579415278","14183562218067323601","18308741961312708026","738557625090105076","12740017994819727748","9072747135818036116"],["14879638532694240304","7688598815593098326","5258561143534192945","15813001589378651214","4052007779960133100","16483617736496138210","16794508084615799149","3158774724391922865","16426402042120965005","12453649289148399522","8759900511303765201","7074249814027906774","10954098813200564510","8130027085705625334","16103786162600625229","12730171038400227952","658835126560695468","1019926138089946261","15223925458471898608","6738918630343117522","1041162346982500389","2097640740982408229","286466278275992139","9134895692344802233","12317024678686830400","4737919786548312679","8833558562842634586","9599185985925309555","16318224325576807094","995711501740649116","15198444318607799725","10749628615650494397","6866169537983228986","13840251029598270011","7080286682507004414","8658120021290724937","9978628979279972712","2234343266496946398","3998236465558639418","17999125304825187263","11594172098115406446","6768469105896902073","9886820915436816926","8835048621491829269","16778391077484646102","8812006542469115568","18046089239438818030","2446947914791997176"],["5695060250842236588","7445269744669559014","11513978407490437109","3331099256737916467","13916319222739127236","15966205067258800922","14069435905125804039","6832846776523467481","9945412677333961888","6334557375216711658","14862534087931957346","11468453650962570590","14243107041320126587","5817242538211556289","7871799931836751116","12795165298624805921","18244250812429474437","4060098074884611036","3547680425669589053","11510872099958070184","18408291980142649069","13010554439184490373","1469002948888598391","12493806599794940485","10139785856742246385","2591787068655719375","8036500831218069263","6709147193320377796","1862714614108189109","9864815134832808234","17511711885625378909","16981824526186480796","4091738774289033888","3715904731139526994","3865853562529021619","11294061231160707240","7842651655540043964","2605817645445992060","8101582229828542064","13053796525341638896","2987872229916290351","9386892540307438000","17327383180848384930","2281255858729161051","462704564517138093","16467132497178894075","16833643244026016134","11124325848117734621"],["11000690750818706230","832787883338604982","3714419282394176002","6193177872021643941","13553205000514128335","16563745343045663933","8731572204055986364","18275613232042325056","5413348465072565199","11544892266628693311","12814186433428192440","14400913135027105792","5500611740055639246","627293452044710038","5046188034316750456","16295243577158897338","8495299543814779707","16163810815196993522","7797012226347557080","18325318925242019026","14920127233100339111","13003570027782868792","4941471469721046395","15543351327558121346","17469775466191733431","5766621936402963248","8235827544667969428","8281559496899576525","2595800471135379918","12116369485379819914","5618071284029937291","3994540666866882035","17975360578971976646","14655287962164166717","10080968764257621688","16491676634524503613","17174159810356223534","14092766781123913668","17934807183157547934","7210824613541422040","5480047906658742485","14135232851000412539","7772300096846528773","10068070112279832128","10783943513898603813","4834802776757192296","6752286920170783874","15901554132264741644"],["11763566638262538324","14959156556086595702","8994830062640378188","16183238659202205094","17455576662623386148","17810281743012150889","3047120251797025211","6198100656131817925","11936916872442880801","14469933292817140758","6573450400375725622","16950758469205922362","12270847120637839730","8418086914824588904","12144314872091916992","3270079223115327316","7842274229663782664","3814367578547399084","10082109909018111652","1832632408003123354","13889456334338933444","2871704885641110771","13519448966170547116","10521029649233349973","16531964806257348379","807301083485772752","1365917338540910863","2166310769029524282","4923350824963681956","13003056136135829499","4940446094785987945","1670986819286544619","2411376938478982697","12861887729460839527","4524718527490133730","670381130285485654","12476508780529846753","15359384366473770956","14108184575583024742","2263222079481581693","9192797753595735374","9460355026516468841","3673624852265331806","18236328447957874880","12927403914979028279","8656335807765749787","16048817276569673525","2771221134806624253"],["8923984108199943324","7358772201289637278","12109006935286980031","13305922933864320657","17642606447175332109","6247565459106108306","5368108765476739497","258822127587241412","6414063084586152543","14381033172849372953","1339422272463277159","2938772049095130083","13681269856169689736","15792568680792815805","17717158630470541370","7177969902453898520","13492009951119938564","4837238814729072340","10971824969545941863","10499350425238357688","18420945011035001629","14981737497898281228","17938786716383152179","7754494117670180395","1931310230620833633","3832874409007824672","9930836309232122201","10388144053314040208","5011803136767073175","15935209762273858406","7424034534915788533","5633805630840247617","10433127859553206445","494498640933822308","9642398996308350974","8719403159052471275","5338911034300152904","4670941066270765269","16693872886132902560","12710645339927591674","7232710465483799452","18118069640361551336","4971859234649305943","6413246054042692095","1325576265493360241","16626042108467546566","6058129312574104323","17376589475066766232"],["13867309592984304198","15469921082373548563","16096138884281053222","1048860325355447760","521786188132483882","3496843794471002938","3769627784039502966","8456903928050884063","1800620413068945566","5451887765318330055","16961001890128233741","6347496160522716546","14230888347926454992","375228758203229730","13913369826617928956","16795495667028006614","18331410321107302743","3553546734426213726","1408921072334379875","2427769147987198769","236797244031577577","2082929482020636373","14273938652932592443","4338193666036757759","15600854735536052942","4466084464088333405","565487927318759600","3292138530460374450","18428373195972048912","4785496800907961553","11011872260658248535","5727040870539738104","16298663259286414946","10664174404512545822","8764447041614142168","15820581930466030470","1609257310422902192","14279828220476746793","1485586501145286956","11854026534721661420","16187041627437123243","7257672348748303611","12632717962910935646","11724981570846445437","5641253862863394078","7244268459064958460","14643193661753180403","16671971565401581898"],["12047014970846060057","7519574735827668829","10350801851617019467","3041606017338172251","7188571536042386619","17635793569686042206","16600791693464448718","10897132959365950210","12412636253481431717","11568387594627286036","14169633932722841811","15025703829829535754","9872508081331193388","14557553472912209384","18177524129509643525","11302072700913685418","14568219995494169701","11385390726593907387","9110652775532989212","8025386486020954655","11415173909952032830","3935112595258815938","462313517757554220","8465429056437857696","7599360462117821140","17881325006693586079","17196425119059001633","17683732766920449901","9732257635850654664","4855455091503302175","18208108748312684198","4378661672337853970","18357366886222278863","12907706926596577282","1981539430486242957","15164432753458773432","17113271370910362145","3410175924382299920","17069282987216363275","2230546990104406463","1550414960619513632","2885344332364423473","7047498799688134430","9326666038518119261","7935533670128565314","15805692480602859508","7330589706663933130","61954572955623179"],["14164916899633906591","7529489658657297154","8155377793092435782","11914356468040585118","15815688878517908475","7518564390146885521","2964614223560552156","6139957832946629553","16037438798639362368","16622792671049144050","14564795206265128602","12547587056927476229","2869129082756126484","16132842135843866680","5131223859414915351","4111030886041828518","8581249221814990865","1273718577500634990","4541561914606796445","14647556045074112564","4873753268143168067","13328383192469533295","5326720381655708022","3973370438261852975","13897322102359270275","4681663770813136877","5962791647045564426","8552673222172112598","983116264516023467","15751021803123604001","2321981696497163595","15104526860784812269","5341545679723529353","10088957061137200097","13628651114738046577","17962663341144481703","10919028653085189122","9171939825688137842","16790669097351461283","17194514514739451157","13849092381103556809","3555718768138529061","18258352675676954301","1990149988920993840","3611935907123048359","2648764536591685275","6044340173313030450","5156709996656594826"],["13465427355712193146","18245970274984752922","6017533370621745294","6905567153836573801","867364020441986219","1570395560641945011","12264015759645105144","12338335969736496947","16754163712723494589","7242811595056396178","3703405545334285737","10403302312715416072","10259507545827986032","17174110497789829070","16367927808505238594","12398258543487926237","700855341010872127","5155740110681743980","821201163766362932","15082653337819730565","2560623814928275708","2021587101758082479","5387262876844765700","8819889724504562529","7916187583204629045","13409512497402501822","4309787449466863523","16448912216675225473","254933527422474061","11396902722164509482","8354856459864706475","17325517113548006263","14388539760428924571","17007021877369584256","8519619658462693712","11889920712139843581","2685087216569211224","5393974585108695806","13859884690360577671","11962744748673998293","6784819390069256051","18054803153234295335","1015256296643733658","5489593853323824729","8683207862727377782","6218871542519233122","11895973387213432764","11514327157630552584"],["328214392956853323","16708140003412418538","3774747712677742114","8893867640062961679","14094836045417813268","17047670701622426091","15312103022892841682","8706821373761427337","10157996584731196449","11537185505021049978","13666241131760567665","7919336953714410061","17246669840489823964","864579692109968205","10949332239145426348","1665738336410212304","13698251240354260225","11154757390812966187","8381886358759399404","5720397541852892857","1468203806639264987","12173389046486077304","1613408809094044175","782860701991907434","1867475313068835671","2907469614642011112","8410424951412906294","14376761600831670444","4154026437239158198","3356783620332979063","13635346460975831142","10932526244605926197","5891246651128256308","18065094014104184887","7357878367522870657","5979662049066490547","5332482533723844827","4488275304988023772","10495481083041829717","2071077105507288553","6187535675301447857","827704397411714052","13509024786002513404","11465943017146255093","4699511941839611656","5375352360567161852","13089545141947243486","12555052789877215345"],["15430909585603004978","9423290246623426929","8009079434619366121","3666315912927869628","338880665062764909","13061159620039284797","7957442319070527168","2995603895333693667","16405023522759236936","10564994151259108395","11636541495300677407","10593827765302484694","6054185328080744389","5332563107125524264","17352833555154966102","15108921557607251243","89380588255266645","3300717837295528154","17232213608566485853","11001704624333135513","4514795176414565000","17354725277598800487","6520466508481016614","15830634398682497933","5256884426597696130","9220250004896881781","11061295394954234552","11784610322852597572","7424110431836073440","13014124402913734280","17642189280911555153","16241693201609123395","1453345123496721471","4614504854407663566","14106093402072345284","3967636318788506177","634579057861306356","9386552826840563666","14873107823923773134","3058902399753584633","5984999164305479081","8439293328798242256","1798862951850282263","5046139092957786209","14102454921392052269","12291846995676952565","9487036337818906927","17510352806681636548"],["15223753647183699715","14872793163698178919","3232510469350956062","7632455159367660727","16543151481604542112","3551204790372243681","2918775577700627689","5670365056220565132","101064211006346206","10301554121912311418","1907711805421875220","7226746058477031760","15638959314673153858","16936333712913043224","15132210649227595403","17120484778002559341","10883132979036092965","5028680472395652415","11250036995502920563","8596685217412558394","5494000649152127305","6593252001692849520","12214022348103864514","994290159073111060","4619598363807248523","7407268094178666968","17803579541625778541","16168645708296363085","1800370384867213134","18150512978660644203","15364063731082656647","16583260858844305226","3534929792334569126","7303395398363181883","2179290176318809686","16898493760568370550","13722197072649607098","15085953727732391374","2277587883815779563","1727665926045850783","13959396925947918206","12614379853757826231","2796478748486197259","16416564664575231371","12123401921579700735","17549455286888325850","14915094906705022809","8050768995022677142"],["7765695576872541957","10273394548511555183","8427093609508716063","12043043328413348182","7199317881816669261","7950142505878660886","12716992082610455495","2412017547299543109","9252637915922498881","9307654549691539811","13200252789333015983","9781207603810929612","11250902100021540460","6732847397575590145","9402193292747182449","12624410025639879450","1919000305113226922","11754966216232615570","15389927875915155772","620720504838761152","7625766560000403761","13261743877650557824","4736857684715516721","16566813302390603239","2128897124003335675","18006402571451948603","15030529439850940108","12055437150623742189","361711475693954798","10630136727349130375","10887272435348522377","1328373858386369504","1666524374580580919","5227727632512179006","13079953425830580701","1280336687002501231","6729143015491252874","17975433438580527823","18261843844453992600","14742793619321497450","4690912570615372961","4182491989789407553","11896967948572758532","17681889035597637083","15043148848846987813","14236394809575897778","6241194858121365973","10323365503231378572"],["9414289306574844356","10626812742460249071","16151689479229501716","6701536573347919866","10122525550240466147","11489319970270392791","4053309287911098687","13206970445797946105","15731463321104148696","16844599996997383870","15713931355803560232","9283509509176467805","3449100224909684556","1876726057380224503","7520158686794498448","2360693946211508265","17346042412867120048","14927949300857569703","4874795863069395964","14406902597748710542","16364127680689657700","8968128907496257391","17902214046573194361","5602635789985817032","5159806555328101651","9575278583781902658","1859895681594366175","6870594025828004151","11077113719818410998","17054183371275414431","12856657123127999547","8599635618201606567","12983873682782325319","16808702759965072040","5623982244052062669","7402900064566250793","8415501899073588874","10103695736963428385","3118019796853985201","4891204847187567051","11871869283365887778","11970813224523610561","11443973258883759660","10485298771470560243","6693063116285696638","701217533415606405","7975119922595062220","2328509813829164405"],["14559271243178400254","14649672844784281212","15712911022034967287","9418413607462425206","16872757754159849938","16379084862737249949","7139138029058042855","13070105582938674423","52766752547172483","12068349171479539230","10130616000045758362","14885018921239504787","9873920503379881212","13003283999420075035","1032348184141783492","2330209153085639798","16596207510035984623","11693544224814278607","6358106940169512915","2572880111929537574","9301274789909421435","3929153311427222165","4339971778909062180","10205389649504114223","6495638331231966151","10220974012546837244","546037835466179805","13505671954812701402","889537777326054079","11404059247252471711","3934682303551364024","11531161814440311989","13903791825143853658","5236614491522902462","17085284754920612241","17600326798520169104","10077649336654707638","1706082809614732153","11706761994069083208","449168250944617297","13635287602151200017","889777993922893634","101720212334229252","11320503533229585677","694716268954835804","12240062160346110412","6659210821363010310","4436741186941222403"],["10200474919950021899","14589079721953718324","15609137402784274820","11895128832955197724","14612654397752406766","463006554770619199","4765067809133869125","2630900240051979705","11524814574911609857","1991134873363234197","1720145646783643000","5392664969840248779","4025968005468992474","7837481463269807607","1583152388878491952","1306841172927894921","8849774561336143145","23584911018509157","14153599354610584784","12412007234802361114","11669521954294372927","6225213025487370866","4162292168974171748","11882951511183046544","16724192570285649170","5630387528328978569","12947849988526314013","12198434391705359374","4135211556922835646","10791789069495978890","12677141741414519214","12724431456772988424","13634521167410367109","2485595009623419995","17666475045611878622","11433566482371809064","13780355966825470166","8977970928767161915","17060216930126575254","10551409812140647121","6813303712526344591","2072818383738743581","1047608206953273897","15493143212528783915","18169200470140462595","15382688615907091160","3389594545389637323","5645267014928480481"],["14022455012848645099","603132542970743674","7568784139875366294","12585330985393465608","6150425108179915222","18381442803733693793","8044418589613820568","13427829884902555331","15467844256753863141","12681541715079454287","1341787683171472879","8914802458738332681","17050629600673012349","16365352305239906497","7927062039471872599","15235571926659421988","17092260874352440943","14707813770098703680","10136959022779412779","6227850308785845530","17348731089545113834","15715002457794611861","12382994929937059075","15826031888401555607","4821743160161474138","758112310061318377","11626747963775592476","5868289661649313523","4104276081529707586","3615892512594357117","10074431688885155099","17572804713126344581","6031602001447737772","4522398827343053977","8222639013534865531","14700594480600314314","15524620381861165547","17475391897938152664","9922311451927573221","3355776356985838203","5152265692820172759","10197355232467193382","4842360190744368296","13762618035929489865","2091110068809301124","16517009778649390427","12156663211386234169","10250252829662358222"],["2281340841437632799","12187073033328806680","4673822729011143252","14113248165851850810","11490554165837298578","718569291303451794","12858943997432174942","16877777301061542657","5626957692961603078","14146585803087588941","2529634267965066921","2477711576643154002","16935409197488177729","14570600432934949718","3065873960802164392","310229710802397427","5159260379401045794","16941427742228878332","15000976719470206402","2412568658321721469","15777111813123234440","18362864994498717075","4974244820818349156","1036544583337513484","16081343327678090576","13987846057112009082","17261391389086930353","2892451848127189682","17960417430395320091","6013996409509261627","5183697272108952168","16698805554498145495","12849087029536008689","2974096434177593960","330898692864927275","8438191785253619835","10366657948579623454","5510583511472240219","14067925869116508432","4650783500409045482","7889841633587001758","15740431345452005570","14790089105388011360","9021605365209058186","10842523617068512272","11796796346675224896","1038758086480088845","16000013293934139705"],["1403045258627176659","2365993445550586837","3044316707811606620","6523993052460266940","16590885940702816007","455853600991926105","6963060348169482206","5624552181745688680","3891307656785604303","3645890604911854977","15832125342872287904","17668928634271920777","13835465412423076555","9294703130135087954","11859381452585463041","12985723264099898341","12935845422991418050","10088023342896991695","12501008519213499420","12642345961349388554","3900756083437447961","5980147225057883364","15863696678567402610","6650663241174819743","10360181081794325631","5477842119498654640","6819805614307181934","5469742020226261787","1227773906044208286","9807274619974874148","8176492382527934561","14985621095492855163","3257408345845175605","16527624063205850752","5930442395086277847","5279804033980268229","8645699457647663690","4113602678561723068","14428378754358872412","17129824187700606291","11297812063201141324","16758216996683744164","6642462281426386652","1052503696842199280","7171723422306501637","14132807086486543080","6146567445288527360","7605863893352752250"],["16464020602522738273","14655305983305608138","17413625398754561732","18232306472452650091","16499221955749312875","18002371946590039002","2363884629348584883","18009041024146444010","2687188934605548972","16875408368162314987","11615218373625475458","3284541267993612544","7950744840780329735","4099557226509436153","15824011423475014731","5120372042272180755","2135671049133316251","2597740903855769844","4333654542262701767","1915498715615116237","9308422109360769714","8572468227429312926","3961544794714126386","12676502616259641362","7488324439820276645","4438601962267872771","4412227510653302832","7687438417399033356","11366541800667516359","18104073780125362465","3770040887413281431","3634953958804708024","13773164374564895105","4748843235587366488","15968601732052424965","2805698141898189579","3482536135217381284","8966548634089589854","16777965010528421449","2915706314006375265","3064184445593771055","6604790467397799469","10611625547005884345","1529990133052978149","14156331645197837038","11451922541103255619","5009308786407157937","14939928115376913263"],["10509027219580093661","12747614184337810794","15490487421875613599","5093401710807910664","680119472353947827","11697418888763273178","14207482877751475268","11805805006532161215","15615854990172978993","410686108410746492","7597502471060998696","16995395134631546266","9490182773494737048","12884583667793527671","10899582769537155990","2872895924350407287","1909879458403686288","2449868072356702274","6805335080086018639","708293923476855900","12883142606705687322","13735992482470787377","15506231390871413026","6743630882143030653","7280355254302991539","10374118857421419784","8529207642778432192","5069249185465198302","2245399047164740742","15202914435702435260","5305239807962569587","814301524916025674","3830570225010249377","10461659087145733854","16987331648522525568","12300774588018559588","18437054350161977922","6720372664021849603","11415881119018782277","7305334563471794243","11298463641274216449","1177894582738030110","17542150831155855591","1039815918802694035","12704480960383295129","16185173138898388437","1275494584401702656","16314374346739628001"],["3087132077927794298","5992322572442754559","7715165338504352705","4662022274976627924","15340060111535033797","6535092507070653832","99356402711797423","17699283136991531971","1906269608197309315","7212520993794392421","3920664706410059409","8576441590058255012","10957965562474600405","2633297282466173289","5839895414609533454","17997084459318805390","3411288037932965678","1843594505850014515","3624567081865503520","13096148576870187443","11889797538130211808","594956289240421375","17258741849447460636","2353009097757527642","8161937489104918673","4783553566990218198","10473667314140725649","5590091292419985177","17372946651419270826","11445005278511720482","6069986555067121742","5423020840550888549","3929387174890207358","13290735154311055921","13312759416218254545","652521366610019622","12916737146373761948","13990438572890467264","12698853789180566264","3764013736726462612","3049989893296693639","12969245916319932511","15991430440070911915","9281914885412274225","3103038719130586118","7994730526920169390","8414672048988233847","15011329351882904390"],["2076532699155594155","11916182307805312924","12556131250390310645","9499882106381595434","4087415061888594835","7659398925092561846","18009828600560496320","8934382354065249819","219119122156784888","17231306202927869076","5728380433717403735","9630894144140489134","13140230431767132530","10034417570951405939","17689209803066243996","15706045485490676654","4719589668278052560","5998062029146403550","2684278565894554545","8826675957395867856","7165755469820953371","12992212521715540101","9604159024870255334","3221236026472413194","9012143821424400384","14479783731372346874","2925459861640163509","9252741253587505570","3252354865296168492","16754975740197785709","3501644281100535429","3455126327703924729","1354373975484748234","10298446986791120911","12180027086849540128","78109761195861893","12644289119388948783","12809415472147629959","6184749012383323683","1525689618550294292","17981858889944434733","13826289400544955040","3484518255478969761","14678451317503126471","7797527505989412086","14708904871470320701","4784822822421580898","12006408980665825074"],["11230115957990601985","11347881269224110239","1236978942404089854","3914443166586697548","4568192485912733970","17116215848913305711","16122436322118032401","13442884069126661898","1671577106906555534","6378384619501476180","13641710955989284553","9736354641853570101","14145707181729650668","11446917532679797621","13688328980582031789","14839214670450587141","14676542231923777287","10611685743111883704","3973414494423229357","15303054379461287530","17068210477647617410","9514137749017206101","17508533641215476734","15904583728612515652","9784344651480635255","13155083773563052231","4815469609843046583","497486792250554006","12709432230225195813","15343089976051985920","7724309171177741146","12322109198122902411","1910360684140067194","5662968794662626327","13479026805359298301","10669828002979670728","15788647075395215982","388724443121136471","4575901577950837824","13345261673641122628","17939139818031778792","3286555248902697742","9487999077318420603","16608034683988425632","9846176446830696785","12967105067637129112","15767980140443957115","14740782789442066422"],["1217697073342090183","7221365395871816271","8842138975030164854","2584240447364581547","16607025511856095740","3945756651000544700","14168705310911818130","6593178458671557847","163013545660700424","13311228024606415270","13418068975514900570","15055017703067660852","1898240903231046939","6202066208448221351","4580929511416704732","12113216572496762293","18436466738670063690","2495293212919667280","15086016303579180442","9434609253281688376","9789123510212450041","13225137839583069714","15221639033668294621","3201971328299429748","8804195727331108667","8381685457250836786","15516578307957122331","1730829241647561032","17916515138455118985","9426196488951528965","3472732090632056054","12722819267421102683","5537878464746149193","18021334072724847202","11477041292735777165","12030981587570153755","623957707713507629","2162401922489467405","16096452398931500506","1625209196622237171","247408735387513909","3182244763144196979","9560469172531499828","4616760320029915059","1620275531972227519","14257440783758526265","3426006012698751952","16888973218348785467"],["4129220026547378426","16636106128395332967","10625230646034685178","11073367289503091794","10631044027869581528","14741626671552550489","18005302603533794964","1063167595000861709","10521107196810308984","1671733325253270648","4685454246780174014","4478556197370455764","3877176544965301707","13596347620021514439","15587427929943623132","15273835619941477186","1208737549244448065","17105777298487610153","8100443632214481947","7963242275424396208","6639476847748812121","9353111063036019103","18322486145783271127","14124507813461085627","2972065072953189398","632108795282232420","3239338905105454777","16859191161296776633","10027746574784334778","17469425897672452483","17773478267519811308","2573815595608173839","16061896230475808248","6061542483362701389","3369636703413895651","16960582204169197531","2671790472756096737","7443991558230360682","14756967333894984416","8496317758927373158","18412639118553209044","7560495142307947267","13104350134076799725","6264647950885588738","1723051565881840556","6941197503121809009","9073092790573018886","12988304935860588931"]],"s1_siblings":[[["13309313468716619231","3998088738852135159","9139807396721163728","14424079396677122825"],["4983259166379115842","9962908923546331190","4645532554479369240","6726579835748464339"],["14650803949674958526","9262356782841078875","16339602260662058431","11944867751545372212"],["5332667304219195938","13281838205187535942","1263419996954888778","10811946939307002656"],["14698536165772689255","2607447211503805545","7010203995132626303","5694703594525032663"],["2786326997440809089","18316335464596530761","4905987670172914645","11229351442631934262"],["9971037738263684359","3658728003316518651","1151550365430247370","5737247568682939926"],["15614405678487485954","16642998136579488244","5427049429520442005","3233614394217758332"],["10287136482405254764","8684162073702927031","13701889954632522240","2719752043236972851"],["13767416067767362374","6299740026374659012","11934185543873765802","2286038262203211292"],["1141265825920041093","9396758094750478979","7298136000867921067","1069165694332167439"],["14135099409572001461","486608627855639378","11498029683961111830","4765521250035617740"],["5194673940752706765","14965682136481760488","1804837703560138013","1532404927011186191"],["1163688034264860541","16164601397773944252","2291592309981311225","64712113513030715"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["7371942361223871190","8570578276352678822","18409622502080986785","16401567879542088143"],["14991848897515431385","4159508842069677463","4572399007043735388","7193353904011777728"],["7275138034534331837","1848487946760039229","3106038032220923313","13100846092693439809"],["13349456560205726127","5010553378092265404","14665727111447013264","3001022741745546546"],["9906322951935413828","5623933059632597025","15708390600337662394","4625607061807120692"],["405505867018849183","4058270943492691376","17103396476495007728","10014132073736180680"],["12302232255958169403","3539609874428659093","1579769143206372168","7158841718584215063"],["6127891051611105052","4664811750969048868","4057800524650890645","2081605540667066002"],["113501021953552749","18070023994702677053","17619400544087455139","12921856449939709626"],["9935745636306899204","9928463511110335697","1974695560834783938","9419562106715670402"],["18149592512220194880","13515191973350918308","16530774970622666747","4479096018294248054"],["13556239775371754687","20086228678143635","17035665974445846029","15720701329406486111"],["13404392187057798779","10743229760180329365","12988627715252182063","15764064515123826612"],["11569544836122864942","1531817603586778298","14773893647553107831","7129506260538390965"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["11259299512955701684","17681694153614651740","271363584326983191","7978464346719478400"],["5717164310331090324","13135434101482947838","7848716886537578062","7007440301012168399"],["5205201237146498870","654496299941302495","10837792212852069672","9986470742508375884"],["9636504235211319861","9078183132246417022","1357681293441136901","3366533143027771130"],["10965261583702265500","5635955768233247037","11719490768072836748","17220204891682983193"],["8705251792693819099","9073279918514455407","12936990016230558787","5909636757407768326"],["9417702492589540348","12695999714268015097","8592170640354417704","9127550929672443095"],["9311645917859517082","15724156273648053061","15467283228043683730","10929630392798659479"],["9663946990644526014","15703658869232819966","1861521196085856416","4070375020097360147"],["14627078196066037592","13543743452229653159","12754651404905496215","11479754517818972017"],["1696838210021298803","5736398801510294588","10706508568662752891","15613725497537132117"],["7792629418843260958","1214341167160019305","4481458861678152870","10916664719325087737"],["17517494761754370258","5960864465515852217","9015987152138403662","11799604607817812358"],["1123940488237765245","6166598706874910680","16257887429065614667","1134771532837781467"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["225492128847492685","8511494298670105656","14702873223370370261","14139783601596691379"],["2122313776215212226","17761281289634697869","6599423991396408241","7040345007970419966"],["4103807040381290025","15127147571400303652","4208300332877425440","256318923164577629"],["1689362188548427078","2171647966146631275","14845969943145778972","9738233112527072642"],["14483875276961172606","17694577328315864591","7604278753731936573","18189092658759587774"],["1525167013144947579","15417254122754563817","16362046155980862541","14156470632569234570"],["16256272087686951310","5416614247932922562","13271153952958559915","14208094099001821808"],["16517752730565926822","18353130103350214116","14083297555368871073","15985831283765465088"],["57471649012103531","17758860120454937544","4471260124632621927","2039746999636114992"],["15303217027460797075","4206879554307384208","13762841706877949479","6950912069668423779"],["16610544062401503118","16392346072897183811","12980028349551454787","16319066303891514331"],["14994556043050664824","14119709343143322991","16682367092441955481","12494626172210544770"],["2449151040631886345","361660806309789835","9443335240920004624","3707077126336297248"],["1123940488237765245","6166598706874910680","16257887429065614667","1134771532837781467"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["2507351732704866380","9489304903928623301","18413473280232438901","3939319309242454006"],["833003578051466421","12662956922423319127","12472832326519379750","3872005173156427589"],["478998801374902617","2635146216203675888","8370698838649542537","7956984135102603032"],["13159534787314165499","16833218480376833204","3746553051681222028","4368335920984555594"],["3315673295035261996","267417532651217086","13161633795486005746","2477751468950294001"],["5370808690402716079","10271731213765039595","15203126601726190015","17649081236796899465"],["17467900167078169561","3928460381077902588","10506190972014327338","14957653370991942914"],["12711778679717463494","3101765899953144692","13091151156666773608","16500363445605248508"],["4411065412038622974","11737990170366875459","13971592848809938053","17906777885854483750"],["16675934839451869550","15925309399745615524","14361395555260237135","2794824318287289306"],["3625669641365978965","1008083129060239604","5947676064549007286","7834713056694388257"],["7347548257149216780","1284777286463359224","4582589145603699490","16999063713900479645"],["12199193714198974623","11271755684676419260","8442697196787998174","7485849643010739859"],["1163688034264860541","16164601397773944252","2291592309981311225","64712113513030715"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["8027378674621185608","13803818885838033278","3014150561876093192","5005388675414492946"],["4164070454311249631","12097464172757542639","7598040836948926013","476805315248074439"],["3997732730405535854","2379785187258511961","1184578449750303362","279976861638914811"],["8294414514854329748","14842232917274971782","10201854514126564366","13115274493087796638"],["6205003185079575947","16456941701470965021","596231794072786009","2591543250389811785"],["4634461935196277678","1335712565868221005","13189476904863212670","2486404755574360807"],["7908231610972452786","17628824475146845034","11911382103574005972","2066625378549335969"],["17529116032780136073","13403596090396174838","604328452092835501","10845914212205745971"],["7843800931862462414","5914998395388418458","10881863945006135099","2413188413038930238"],["5919385803705716707","14314479827765312148","11128626912039070866","4377764500090614561"],["17581526898343125536","3546045061352196463","15311065835436380898","242700137056543076"],["1806678016413850781","13622069744204686051","10323870843276163219","3827401359244592024"],["14950560601445479603","12318887945300884041","3888801033084165745","104177820691766458"],["6287100379696376255","3851827983693971634","4295482949541375249","2429214690197407228"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["14816819144957993297","5179222135618477609","4849091343074121918","10393340907658698260"],["12755049090244986565","852281961633186299","16255916433830673885","1645957668388645213"],["9288322170325968765","15074642857932526781","12499022194385475944","147333968411762437"],["15869835969264660062","13573353439159958717","4770180296005019415","16030055466444471020"],["120737560937750090","18257563676550127962","18384337222804501871","12284851374756614215"],["17720586975410010492","14937141895632738739","6605053089103087630","11762076347926003322"],["5641629529909228141","15867111861353227490","1963088299168123649","2225264783557180457"],["5575966635529895199","11671869242888325615","11432669689246879539","10661804336117873733"],["5423193080098183637","14287833475341996177","10103245222874648964","11473192161441504307"],["9291275521730476061","12643670434521702990","14775276563813828247","10728587962953882595"],["16334298186260080433","8868868061947667249","18302314364554203572","15863435144340969341"],["3350202938712975183","8435158039620442911","6889825442028110433","16171839764565807208"],["13404392187057798779","10743229760180329365","12988627715252182063","15764064515123826612"],["11569544836122864942","1531817603586778298","14773893647553107831","7129506260538390965"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["3626221084574680858","14903348631743323543","1702529296931992970","336131178977954634"],["15271893949718771070","1476321365798349073","5962585596369041753","14323046157017195098"],["9055160860333895636","5976582940720228303","2776677188220699355","8739491879882242803"],["5701365138695921809","10624221957474407513","5778883348315577442","13718397541797974262"],["10011076549258672091","207764031035254510","9212302990575392302","14001394156998838752"],["17985660819565631492","965948500275967598","13695117672416700640","5714990198307773812"],["18262628533153920252","11394163663404675752","3601213588355049276","12309505456791259190"],["9438226671897201972","1609905851016332498","16670502772494170039","5950558499398153643"],["4624541641481302842","13526912332141124241","12527103020511481663","2719898195000246385"],["13503529837084072532","12813235745524790028","2221943318801066052","5932458026725077188"],["10721389223438889725","18130329728014875900","13321714421264778511","901950409109540569"],["360271736873131940","5387304778516514806","17452571491207218759","13534930174190422494"],["7156234165162245069","18294687147126705168","8009966355592798713","12966358794196961907"],["13945067573911248991","10555574143738113655","15950660835465898023","2872975747105834415"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["9599033091362983276","4229529599616909073","2227018673845496422","17899905923858344697"],["2898064100063408967","11115230526780897638","18133069406588441339","18209830622656589897"],["2642709990945640820","6370285630049123372","5829508625803385033","5954400733358333318"],["7556675730437301106","7445783184724120822","6874526713985434534","8596316311390528247"],["244810542459833651","1991348625545429684","584772769253815970","17161251790636201418"],["16258479314669683097","17632086241618121402","15525252008678223058","5584565043588011436"],["14541881267916685930","1031528991946540721","8974782815294243826","3944325205262790041"],["8911824548043286220","11285288880641158229","7795589403501862255","5220827469061433458"],["2109321318846898561","17974356090213499413","1151012120743526717","1975258695654861183"],["16096468752544432774","8153021859709095492","920125930529212363","7408360408841717367"],["5608354552050388406","12329542772131519053","13044907936513083179","13250308708794252111"],["11845863709802377272","583397145307170041","2039001355803612246","13078210556874651172"],["16640004526363438404","13115822934869377333","8147544589978071108","14310433807652514189"],["3353119710792878733","11665500483731430934","12883400387792600827","16855053075917801854"],["10588284739860007807","5201294628116463078","9829599940481835133","15646060690279592342"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["9367428983666266834","7221667096983568589","14407086892608443721","13325453560388488835"],["2179790106375844981","18067985851430139339","4665999623735024820","13560779464832534160"],["10934207451969689919","6925682658275098796","8078370896007830092","1933975827194377448"],["1847181820411600402","14116175801520401158","5263742702975820797","17109569769260716183"],["12541876407227477377","4417370844210992797","3174670979766540562","15034796323065623600"],["3949554641282221980","11032277993198438027","1496128555013309654","954977508379852023"],["13549865589467751590","10406490739886824810","5193438929954064871","6312196002288959564"],["10656378201825850983","10066563178984981121","11154407108173725544","4672176639847296326"],["16200728423540752460","5060418491225115301","18334429494643042331","12126559688847720026"],["13925448611413012404","9647396102396572651","2763404732167127102","10841888469801114126"],["9727896594554390311","2280928433767640395","5429343646416442067","1646536289419503985"],["6965204429971466026","17855795343815153933","1162565583596724609","9672966975574279588"],["3921000476050173487","15188550402264763420","17704935912938537221","7932737821895331232"],["3353119710792878733","11665500483731430934","12883400387792600827","16855053075917801854"],["10588284739860007807","5201294628116463078","9829599940481835133","15646060690279592342"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["9864275632781888621","13449743548822586479","5468244117658584018","8019592589390782452"],["4331173169811143578","9408001481241101865","9459012928635965948","12698430184379368842"],["6112979153505866228","10029770316587373466","16029906730084883610","14225230820340679245"],["10273702174427442983","506874235983305710","3502469792717798566","530599789928182876"],["2902481287842021353","5740230734663420518","7710779389399436738","1408350827452853082"],["15817442966235224851","10870460536327920172","6413001913745535345","5000495758365881371"],["9127999807947866121","13805643356019325105","7615297878711849530","11097534443063903142"],["11263090003661668862","16285065807557481935","13178511857569559219","8551606010225374580"],["4675843108638532865","1271057378572773202","578897045880210928","3519803192812505087"],["15445123993234411067","11015726576108361918","15389454152956971843","13810956650011223016"],["12249635729948884999","14059896882503566050","5856902941584523567","8908316317411099643"],["7903156571333002607","3734539300156567113","16083502043820112769","9788939596824796241"],["16056474048480764569","12314614797464253701","11426867635532275133","6991650091203592172"],["6287100379696376255","3851827983693971634","4295482949541375249","2429214690197407228"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["12819313347695203710","4799534976165806066","8978431650143445377","12519763862321254748"],["3228262996381805513","11194453581816349506","2954511692510837810","2630961668127168069"],["2299136607369191812","6039761113044143125","14345539460047789436","14316364257049511257"],["17085049632960305370","1705567234763164960","4380726702416543390","759707765273681505"],["10253601200665407590","2892402277030538679","17902752554801134795","2125147464855748718"],["11331168753283600478","13710523798490631627","15903883030908007275","10999867128758925764"],["7412391314337125612","14404668733444128095","2900161023422568396","3885629694016574974"],["6988244653801215665","2033949818546333795","15634362192563759664","11082786524584090226"],["14520187824183717511","15093319307302844288","10368787359641597179","11278515665340914324"],["686312951342995742","2603775728539117169","13195055811632614597","12080770869697162000"],["7607907759499987511","7470222098527151726","13258288135870041681","16610541806652105820"],["7903156571333002607","3734539300156567113","16083502043820112769","9788939596824796241"],["16056474048480764569","12314614797464253701","11426867635532275133","6991650091203592172"],["6287100379696376255","3851827983693971634","4295482949541375249","2429214690197407228"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["4142394414013066131","13157294918846394325","4605972936883177208","10821275973546546511"],["7410735270112976452","17871300092418833161","15751236282429431049","12334651884199767665"],["9894104692686066782","4635945069857422554","8974194170027841724","2418031795255235427"],["10406468877573569437","10345261217938360367","1945730416136629890","6626045690809539729"],["13830367641859748527","16947951563707252675","3693563420293321479","11662640617701861375"],["1012512420519423234","17611333531451086470","4106065925848889087","6109496246082744202"],["13737918563215642730","12776648304313535091","12104815450019971748","12884180204649487354"],["17319229026210271255","9123459358507752005","2171661591872115953","1557477363634077376"],["6861609657072939057","2031189288627969492","14412339905336795402","8548654684800167151"],["13206867535186266646","7321362279753001341","8357390042904103452","7320198115219377472"],["9658231520586923777","1165603301130319423","16057263665080286806","15323931551888387482"],["4001484487045604815","5254477918866973911","6861459797515517450","6192534220582743967"],["5883150201584350175","15735338336314373247","14468080075271922187","6587631251728666260"],["2440764322910242456","18235583517423812818","11526009719558605663","17604044275188138095"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["8697482870602353432","8212178398476580939","1838364629631248857","17736170096119391753"],["3143338496196517319","1018386591167340304","18275265657950327628","12851284683085669160"],["14380053842269312258","4564040638270596354","15864313804626113764","822208555054118142"],["16954309434213589981","1797939986629416424","12415749775123156334","13080359396313720740"],["8709450222826465830","14076376655288683495","981932722215658906","6034627199807557938"],["14863265334268491870","16547141961388325071","17980285213994592223","2040359071817616528"],["11350935110592726958","9125893235356303568","14271378438220660757","3910119565279028008"],["18045907931450225817","17068197615836815471","8900310088888446192","14736758787203408486"],["17320088683254510983","15327213343932641738","9749254615543910233","12198913618107724675"],["4226339189354507025","2232079650782561971","10912819458296977199","13212031213866100688"],["17089405118892286372","3198140648789885466","7740732848277605294","15166233703720075423"],["7792629418843260958","1214341167160019305","4481458861678152870","10916664719325087737"],["17517494761754370258","5960864465515852217","9015987152138403662","11799604607817812358"],["1123940488237765245","6166598706874910680","16257887429065614667","1134771532837781467"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["17723751835653588312","8214886054238969715","5186989373403860206","14932626111200415916"],["5414836084816278393","8647323720650287452","2489521012422880232","11954981642419549640"],["16362006547907358461","8435225449153567484","14663860440795091735","5837140674477775480"],["18434014329447660550","16164207597028195761","4501605983890264040","10573058003407909163"],["8721579617495210870","3288194575654320734","5676493394605216397","9475685591537602043"],["11255572790158137773","6764377986345614515","17753843975153684545","4859307781904236963"],["4434286057324269178","2821096160352718163","7976630305822502424","13163163763621622062"],["10631244546202273800","875197499543256806","1203028244247269871","6583035821031561588"],["6440630692270491307","15621693029068657824","3716702117519888876","17394855306274538615"],["17170457921488957860","16789778667171466138","4937594261972327558","11292936184512500805"],["4524854233313519560","11252078044032721361","7358598977377486883","12461194122198549554"],["4001484487045604815","5254477918866973911","6861459797515517450","6192534220582743967"],["5883150201584350175","15735338336314373247","14468080075271922187","6587631251728666260"],["2440764322910242456","18235583517423812818","11526009719558605663","17604044275188138095"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["14162153807444629513","6489752822767461546","12640489442827025831","1607866738919766100"],["6343835575626958473","2367591894954543826","8726590800597906280","15393067429222222925"],["9735996494427124244","942808337087347935","15885964361350947312","7125309978879247837"],["378475159930176989","16681007185996894730","8302732013495051747","15178673008524568230"],["452516669201237150","9888274461830733341","3700339687552553568","16200748223142983351"],["5857709395031661191","1786128479887576293","8863494282633386530","10850472336112914427"],["4941028541884318012","6479676595204676025","11278780988443470632","2151182574421582468"],["7073974039878297663","4287009583522223125","15948126428492953471","17760661162566939843"],["4157547107788269765","10697911190075862028","5893995950192444724","17455273900234790138"],["9935745636306899204","9928463511110335697","1974695560834783938","9419562106715670402"],["18149592512220194880","13515191973350918308","16530774970622666747","4479096018294248054"],["13556239775371754687","20086228678143635","17035665974445846029","15720701329406486111"],["13404392187057798779","10743229760180329365","12988627715252182063","15764064515123826612"],["11569544836122864942","1531817603586778298","14773893647553107831","7129506260538390965"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["3177982497863522828","2173729082461029160","17863926187544401368","12095998299417042470"],["17544252795325873778","14885149336549873196","1011856825633077885","12646687405092732003"],["11684773651918549560","10522153417019757900","2295631328627500338","6275949439308648053"],["1428466508742602389","10637818027105827734","2189888148478538616","12532930808038274405"],["1310076787409525196","6936201489845098157","13776712598843319528","7019273617560202703"],["12018878921819941964","6180059061073876559","8203522422014288996","14073793315189285428"],["9294535011699045478","9418434142061212389","9612838673354968308","6435002859013630776"],["8684688153909792680","17164990022612439977","14884399219871545721","4338682859797184407"],["5858423268995066521","13494840762499374601","57636529166752567","14849933755954421078"],["1155015106710513057","9499593730394102392","3725069802762546228","18285231982935712638"],["9537538018505452766","6808933150499950421","17782053235103064880","9828386606644766427"],["14371396851041476133","14449228217768725606","341231284043396758","13004791845707282132"],["2449151040631886345","361660806309789835","9443335240920004624","3707077126336297248"],["1123940488237765245","6166598706874910680","16257887429065614667","1134771532837781467"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["6331321795176564380","6579894591414020148","16033294836652866499","3466635660840867399"],["12871102343385368013","8950328311276750908","16810025061953159333","2418647830390611849"],["8784294464016590691","10729276932777862130","14649368117788420003","4301061857695916778"],["1786211471135748694","14082458606931330832","3848243706094092924","16393654017664778327"],["10417970143286670081","18210189175040209640","5583926909043073633","64243614977027692"],["13317983175577927476","15952426615635982456","13752199766936027086","17387775336587958901"],["13888535034185648007","4551744876336925561","14014175585036176827","18237941295626624197"],["17367673596158779933","14910343934545216211","6512771565424487628","10927423169205813695"],["12612185000625986380","12589467654323677568","6273163644345065352","8719814370455263240"],["7493544398972207523","14820403155618079050","8313064771893242351","14672814179434330912"],["17476924769422552429","10721807264792153135","8830259779082699417","358619917143335121"],["1806678016413850781","13622069744204686051","10323870843276163219","3827401359244592024"],["14950560601445479603","12318887945300884041","3888801033084165745","104177820691766458"],["6287100379696376255","3851827983693971634","4295482949541375249","2429214690197407228"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["3279611890005040180","6518094657765296023","14415610241530112416","16499081563587325316"],["1654076305427157082","4165154916873504298","17179633227756600141","13901877611422364719"],["1351017566086291847","9696986280231429997","14174777641824452474","8398243385167520411"],["9245353231274975222","17341750003205017564","9624311388159877197","11176660100184599146"],["13694008834653736946","10044025729555589383","3822280844312383970","7744999609421516971"],["9672678730638267921","17815630130455448249","14833511759570829195","6505800321713384066"],["912265916148280534","16633556343893787200","14462304993684151093","4738614734738211708"],["15379615635465214150","13357293544918884499","1001346651845379689","13468077169309250728"],["7382942599175549993","6341338894329565487","4781843611563623056","6947979238485130625"],["8314429276815735970","2350078517061041159","10042831938640726895","11113185240819678400"],["10217273602610078849","13583050738863419282","18229903959432968954","270021854619226578"],["6693083823441456939","14648256860247235743","16411038040578221483","822992739364713171"],["13437345331867174444","6371871590621629950","5892725115109373814","17241796815678152834"],["17225357437962100737","10561595813463530194","8674552204696076147","9502382050856505062"],["10588284739860007807","5201294628116463078","9829599940481835133","15646060690279592342"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["15309028550305707851","1863255026524789382","16797094296931910662","6447823952688361825"],["11035772424104794236","14168116296746570703","7933022193724587329","16176870537820515229"],["9128901645435467799","18419217199386943856","2708284493050261601","11324675208070919555"],["7773024071871548304","14703534949131760217","3984648726791310766","16212024857507164215"],["13362098435874284143","16511611630857664969","8640373530785331215","523733093442980123"],["18201001658547038966","11875737810866913570","8615927531358545120","4798310318362116783"],["15792556119755084195","7986192900998357340","14809699243677301767","1230513865476610699"],["8936323447585931852","15478424899603975266","151437652814528701","8008898161650847228"],["3341128185866258236","4413487081922544902","1078350476837322083","15009607390178218268"],["13679909649150952670","13613928885326488602","10727541001695135525","18412992705958321141"],["5875388794982743075","17339362734859766975","8718997236789287342","11042458791482284478"],["3350202938712975183","8435158039620442911","6889825442028110433","16171839764565807208"],["13404392187057798779","10743229760180329365","12988627715252182063","15764064515123826612"],["11569544836122864942","1531817603586778298","14773893647553107831","7129506260538390965"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["6077940274997026305","18049732347454103861","61045140016583968","9109942389231981310"],["560548988922834455","6099357521380565724","3890762190230266547","13610357353228688520"],["11981677748739678135","13958463481800498895","2164304529069195929","6501637481828179782"],["8434589908864262130","14342543808888231009","10027803196888511917","13873744992458877361"],["1994421345410536132","14972808013127665174","5127779907581348229","3436377219055155283"],["14412066506370316330","16067064443876473996","13005173678665405662","3460963248210490319"],["9193517478067930829","17756265452753200218","14194388433013817644","18102691011527211460"],["14018984065476440425","15263533138571834792","4697236742076775737","3212315904716769143"],["6687536414924261666","12070529219594229691","6071177004131537480","3869327412840282335"],["1310084616540547339","233398449255731857","9587563050784649494","17203336230128939752"],["5875388794982743075","17339362734859766975","8718997236789287342","11042458791482284478"],["3350202938712975183","8435158039620442911","6889825442028110433","16171839764565807208"],["13404392187057798779","10743229760180329365","12988627715252182063","15764064515123826612"],["11569544836122864942","1531817603586778298","14773893647553107831","7129506260538390965"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["17445820814230532305","8853750195187695685","10829221164282313068","12156014593476360520"],["14601210773334607926","11059780298236567707","883544479214255888","16637382520988185096"],["9858848975132474188","11461053005687492428","8643127816795031313","5140816593530823927"],["10490062280763119749","18339231130015333833","11571360443043881074","3409770097753540644"],["14074898855354800451","17564240500910423776","181887277699273295","4168292028945836488"],["3039318915492067976","6983755261765513112","14212679502679802860","9848383303942866376"],["6686588101579799500","10096737524481778938","17782215212709365591","3971049521036224847"],["11923934678927605024","17011288323613993109","791982538562538629","10564806103282144616"],["8873629930433844491","15889979510629860875","18380588399535728463","2872490833048431798"],["9488776785882839059","10687178341877010139","17554873547490487837","5051211985727682768"],["8356197567794943828","8153883949461511366","10003155231564071714","7972895804767953800"],["4553429287065736921","14462130633930516055","13695444005753466296","2448180712521065834"],["5883150201584350175","15735338336314373247","14468080075271922187","6587631251728666260"],["2440764322910242456","18235583517423812818","11526009719558605663","17604044275188138095"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["7968787795899549540","363675125374196599","12978409390180746128","11903946975268469246"],["17842432038460530196","7781995293899073","18244475261506404282","13799197201092320666"],["15217346409344793263","11733123355492876698","8253205939305024169","15179751522491297373"],["13903769251356333311","15876188690669757615","7783472899772816478","8812742250244290428"],["15046925541861992977","9785391285875410551","9966807378108184621","14872076001747438578"],["11202616454547118100","13499022623441395819","11770052997706931443","6356828841246820555"],["7537079356437164983","5401323942621844454","11907898900490373464","4634994304834257716"],["15072861477058456915","339246208310207663","3350698947828717949","11837013842079851530"],["2861379286010479934","879544547473547338","16754578837791377661","11374856201958313864"],["16091989817484260288","13241343411744735675","18257058791218050538","6756798535020208855"],["16610544062401503118","16392346072897183811","12980028349551454787","16319066303891514331"],["14994556043050664824","14119709343143322991","16682367092441955481","12494626172210544770"],["2449151040631886345","361660806309789835","9443335240920004624","3707077126336297248"],["1123940488237765245","6166598706874910680","16257887429065614667","1134771532837781467"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["11623746032733411069","9757498126412212226","11734513616618973195","3473851796720399483"],["3105670730369226266","7521457967194008854","13042021378271197426","4302879825045541088"],["18218226555080787242","9802163799620386781","15853451728450065437","15318357080600749296"],["8693020749739435282","4193037681272571976","15409816681790223918","5073621417924636587"],["4365959855982931491","15080876840996481816","8400891786774369242","11645715890192413002"],["1042883954999740016","10240757081369010182","17294777503339982818","5093648333132194468"],["16179540016183026888","2666205780159450578","9126246444359289220","14139986708743039886"],["5008738194414839542","17834617872396276087","17342887406276936030","2212685021716495595"],["9280996558768640564","5222506864075152160","5635333046384957061","16526402605578289589"],["15722228454653194326","6032148191857238825","15776011190496620721","14468097741099206034"],["16210883127615737412","2410876054350327267","4988089683807998267","16893589905772327132"],["360271736873131940","5387304778516514806","17452571491207218759","13534930174190422494"],["7156234165162245069","18294687147126705168","8009966355592798713","12966358794196961907"],["13945067573911248991","10555574143738113655","15950660835465898023","2872975747105834415"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["15639907185354320542","2638957483471671572","5237579649513262588","13718126997710041444"],["5036575819730722346","18107109697000102127","8913523469759582166","604245483895318147"],["5309509277638294910","259678536616004781","14876205427535666438","17229742228474788254"],["11749270069992122009","7949089542269697843","15985449181453016242","2261345462962070909"],["5844556917582435254","14597237456487035009","16043832619840879885","2585107812481398433"],["7901499553395500714","17507374580030474120","6147694061064865268","17032801290680494854"],["15692323721691267608","15418072893217285418","18362877835687176035","14623422092996591570"],["15203680796599712832","16137180892368306246","10547684984024672700","15292615039194149441"],["5237516252962265530","8136164202328895453","18217881635047117135","3828467570158559471"],["15210649746810367988","5309695728807146971","15573505137384412025","6431112128967644866"],["14489766083521852560","13738447968242903168","11473048687160844536","1376731117908801088"],["16655921065995619048","7413140332106257429","9787019002545464317","11337851687626044025"],["17589502471587876783","782578357702151834","4972841907241221967","17750362242319660936"],["13945067573911248991","10555574143738113655","15950660835465898023","2872975747105834415"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["7257872651313717505","11440791449155116937","1214220071674420238","8393816219002265449"],["1889273339328808962","7513236437173674611","15171830831897172105","12363540476714800693"],["5700494147862702549","5323686120334939140","15069297612709259432","137650976323644240"],["5923814481173805114","16931964295712807523","10093078324175035761","13212718118225908538"],["1670383000128241122","7037870276380581699","14141769444250004568","977410582369139951"],["16575649157489920983","5393134685839701813","8295294266508626419","11219753258801669105"],["17999819713361570458","13055579444073376189","1887738189479355089","6675607933833068625"],["15873766358169594183","8644735087997406925","6296782795213967240","2030018586410902719"],["17517152951450580160","3566287415989452380","14650011896197107008","9722507604332419420"],["12213852662921113365","17101574832101832868","3848824490657043599","11300434717576902750"],["14573413310955801882","8720279438130550586","14426958616395589235","4378568563870855831"],["10405979826029054326","12195569269032184596","33210506538955229","10336902946670440472"],["3921000476050173487","15188550402264763420","17704935912938537221","7932737821895331232"],["3353119710792878733","11665500483731430934","12883400387792600827","16855053075917801854"],["10588284739860007807","5201294628116463078","9829599940481835133","15646060690279592342"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["8488086061990586522","16358322928085282999","11528162539096651465","5420797528296418940"],["10079669643766737191","18392982981178766140","10846913767855426020","14003259611471470297"],["16948325505025089182","7199468294424565567","9817916131332028871","1113644147907572141"],["16719775486944586544","7980896008914991691","12014020727731866683","4627324674421718772"],["2356356368817177041","1202908079210040236","2552320890362614462","2659989765866466193"],["15825766144938932209","13573847029811513511","18372828985928504663","13355584533192184245"],["9261366411174998108","3986926075174860833","6577721275636807836","5344098666776598532"],["321624958679662042","15643083976752742838","7617066032811211107","17391268935405461050"],["207960267596984707","7984299180446546030","11154991625759551220","11047459469254418987"],["11766511761342086486","4612082055868606082","2711570713762934002","1739610144020700282"],["6643961800869196344","16853735962104537306","3278311269487074383","11771236880873660616"],["12112514857197002193","1517898462423165357","1294773066818463016","12848171258137137045"],["14950560601445479603","12318887945300884041","3888801033084165745","104177820691766458"],["6287100379696376255","3851827983693971634","4295482949541375249","2429214690197407228"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["3811173181437082838","15118839774394297944","13027663981229875887","10309657829413397036"],["5668355550551885655","1027730268193559107","2143397960820454425","2842228823678395483"],["13651673009308876892","2610754480810816240","4051421491267224704","15973797841140076093"],["6462049505995907240","9423253217084526067","6830478271125409193","6624012648203028253"],["3534192900905890291","272551377246441362","9962666816899968190","17349205658635091923"],["6549723458862042739","8584108795975912955","17758568836101473027","4921396405736280695"],["15980505972999392587","15328266270322376868","17186497254944822171","8280138803911898214"],["15761129082106579624","11534681238363414558","7475867384410930213","12426565859979387413"],["6116144930563259431","2946935365612865331","824982831189703182","6306824668780252625"],["9193498888477750302","12283866812138623204","11017449534152983604","13944314529695767527"],["17656769839937169437","6961685608694265811","10986244059797739291","15347085350166301703"],["14135099409572001461","486608627855639378","11498029683961111830","4765521250035617740"],["5194673940752706765","14965682136481760488","1804837703560138013","1532404927011186191"],["1163688034264860541","16164601397773944252","2291592309981311225","64712113513030715"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["6820682781831930140","14327904553444290776","9895943009139084908","14561056621322257287"],["5044696185493371239","3591834292609773810","5030894703922434826","13773322045654467627"],["14274072479190271574","14089640915665511742","14095202533817400422","247778423602284363"],["1623105973290795175","56192801392735628","15164777977599564041","5217467449902509236"],["16847526506926603246","9678024978752374285","7922744160480443637","15412082926271505323"],["7167207830882220538","17406094310019390136","14786790244792074462","7185188081934091047"],["9957198534528548639","6639748485345269878","379842967449675374","3933253256975516789"],["3681255379585291591","17228803074022739710","700057902944894124","16400664278719811322"],["12546759752844599264","9870727437970743630","16699717085326696929","2011024497689621620"],["520903246059879833","3017599333499938575","6797525197804437082","2850047723022676146"],["3127937944716451708","9300028788786427999","8206536499666646242","6646180091702414588"],["14371396851041476133","14449228217768725606","341231284043396758","13004791845707282132"],["2449151040631886345","361660806309789835","9443335240920004624","3707077126336297248"],["1123940488237765245","6166598706874910680","16257887429065614667","1134771532837781467"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["4428584938947208662","13385961847683304566","3038719532419868032","5650955351923274642"],["12127424137018546846","10027772798350224297","15949306138916792840","7474310074470885007"],["13084722150658059369","4937507678662855923","1938573363237098941","18277231226032284948"],["14555458584945985142","2443580669711553160","15815809464869670356","9029078224140096457"],["16581729359665622060","5363066825407663754","7855468337546521310","673773051762288131"],["10243912451084266492","9916327545437273649","13841293842560714961","3189919414486760220"],["13080684651587341952","5988761910108304691","3827563774799525513","13001711745228271321"],["3513341690923826464","4227266556341312271","15829896033683247393","11607732083392162329"],["2472869191580013320","12082429276320330000","597026026692881223","17623783507968592458"],["4249657402593010037","15775858778454285911","15096508416163637866","6690142667248665748"],["8482697522087804642","10541045731153663543","684576822432159766","13854159449579802805"],["6832988040166105279","3369056785398346882","4416418695361914914","9455312945700321117"],["7156234165162245069","18294687147126705168","8009966355592798713","12966358794196961907"],["13945067573911248991","10555574143738113655","15950660835465898023","2872975747105834415"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["6700959602639430649","2769769531465091159","8691650519183890394","208442914080282391"],["14317740002248755809","17863851928976668038","6031309252480953824","2379134876111362602"],["10751432275379435416","122065772425208067","16937385216097234934","14991557755538637877"],["2508028014921851523","15122464160985451693","9752007784871409751","289805855226779744"],["4828573749436271622","14054499005407496023","7699482809085954677","17103236846628120770"],["7859893295359422161","11750258976386822906","14611435358405702951","3070382753405130471"],["14134190871793666129","10672833571095434772","11088190715171613765","18417895673921641991"],["16444582869451009876","14169588144855241825","5370295812795680469","16591849530968238398"],["9083768745152914263","708621048704142521","17468549721075621810","14138052848729848096"],["4984476577651087925","13732428184365313679","14878920320426897576","17595129537199480175"],["11936047507716420537","6019539997459522852","11897032504368981754","12791408557071752100"],["14548590113576802144","1505588216155261940","15645307438019286347","15864076371803645865"],["17589502471587876783","782578357702151834","4972841907241221967","17750362242319660936"],["13945067573911248991","10555574143738113655","15950660835465898023","2872975747105834415"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["2383730382684865355","13718115450627555013","2724354241079435941","18306385175446388847"],["5038853493357084472","7423219384670208425","5627828810730187793","15574916008475313483"],["12318546383080259172","16150864820449599541","2280941984915457552","1376346102561638884"],["8841963623861748933","4702338002801429059","14922423385493633975","13687728203660098482"],["11950428219979375841","10554347928461363024","9721982385986560611","1047939230463107834"],["3208897867090819270","11892280056072084935","169243084609255292","7814496443194588558"],["1682681158639972227","3423244546869260469","303876545406541537","8832266233081594822"],["4791751950618840670","8222717240203938634","8298281422902140483","3205898932768337900"],["18018615529386293987","16451039466165548839","2957679596613746751","13149805338243445518"],["7738955106028249902","5154699064664164054","5581880515789745730","4499841891743515585"],["8977654205859840741","12353694402662579954","1215204371570961124","17675868013751805531"],["18037954945584736727","13058535389300687194","1643607832891966800","8466942367534066932"],["12199193714198974623","11271755684676419260","8442697196787998174","7485849643010739859"],["1163688034264860541","16164601397773944252","2291592309981311225","64712113513030715"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["11243896046054843973","2069687126136948523","1292437376221307813","4515005908521162437"],["10194386578231485968","9451465725396333268","11657574744909001732","6455695562539549119"],["18130463322988464667","14695248339587062048","6369600109040369569","371015421227917025"],["12545511894985116602","18216959560132302773","5510921370340141445","599400500538013801"],["16655735055843391119","13896256452099195650","2289311865159171780","12269648707317402210"],["1038863770979251466","1513475199983985390","8540588711554814831","11120382855774799459"],["16919274668434869081","16426739827685690642","5903673767678107317","6657141928839065820"],["15919505181959725840","6882707850393663302","15261396010748352702","4551399981877569982"],["3264424174222872521","12479029372638396816","14873695541596099584","9454098413410065308"],["12199259959758729692","10819024455622770522","16677979519181032625","902866458053353535"],["17089405118892286372","3198140648789885466","7740732848277605294","15166233703720075423"],["7792629418843260958","1214341167160019305","4481458861678152870","10916664719325087737"],["17517494761754370258","5960864465515852217","9015987152138403662","11799604607817812358"],["1123940488237765245","6166598706874910680","16257887429065614667","1134771532837781467"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["9227375773756856727","12128359710726166026","16429626749793276895","6196564900489719557"],["16086120109113034532","2791594409154038848","1898194696320546198","15150955147545997197"],["16725759422179606255","312278431140776570","4260608456782481960","15248392241030200490"],["12665973834259176914","6206001413287011408","8978231409515081133","18070426434175251637"],["9891403827900677051","4430079701061091054","12772847380285831924","13512536425157458172"],["16629816893871213220","13158476454792606746","16723949954620909571","16375426856593028377"],["16427175586301565961","1768730314206413118","11332978716885686304","8364006294293298942"],["5031327255115059493","855559730576032868","16890920329272226464","8460744360570822772"],["505189259101168968","15239670692427101867","3672439911962789626","4160494723271897413"],["7296744401222679891","15519079299775677640","1874074984693294145","9497715757194264725"],["8482697522087804642","10541045731153663543","684576822432159766","13854159449579802805"],["6832988040166105279","3369056785398346882","4416418695361914914","9455312945700321117"],["7156234165162245069","18294687147126705168","8009966355592798713","12966358794196961907"],["13945067573911248991","10555574143738113655","15950660835465898023","2872975747105834415"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["17648768170680314174","15681558950538535138","13893946233143290115","18075708826800399168"],["11235068506357237140","10733600376559931145","5977259774417920044","16835407891961793816"],["1371597701943367105","496056314188951448","7502790716417683223","11351668108726075106"],["7101858343010396101","11479333316600562681","6539334499943249397","7875341097638218588"],["4548172173495203912","9753754380296708959","8129918558297474493","18007967042503553435"],["16310682607907166835","16567542908782884913","14113636413820149660","10396288182311353754"],["6894050119451574106","10674867901727129092","806492452334990687","11259409457285194700"],["16968118470955231708","9093005062680250151","8044661675927273131","1236912894920564002"],["7900025606924524440","1956183476266406985","1553367223144138004","10936930623112840875"],["6539061203245081329","4944160142643660294","6237907968101923596","4613650760405286966"],["3471213101529564568","5646271713926625479","8031630292078455908","3354501476559246546"],["13556239775371754687","20086228678143635","17035665974445846029","15720701329406486111"],["13404392187057798779","10743229760180329365","12988627715252182063","15764064515123826612"],["11569544836122864942","1531817603586778298","14773893647553107831","7129506260538390965"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["16397391669497616315","731955031903598203","7982221003574084891","6542257306933604954"],["16731686015016404317","7662912054756040931","12714775045682539541","3812721698211625422"],["3816709609239194434","11940406268670332852","5756967268145889748","10615484246907083168"],["16926291869402054632","5036986363919675033","2140519967939637979","18359419657244473262"],["12069477487857238571","5659661985361262286","3977916180805573382","9175055807547958171"],["7438789767398323800","16109584337553280729","7469585795862334249","11909881895382226323"],["16600339518301080204","12990064385265143945","17060476498885577043","16348717379092328543"],["16092292911974415454","3494722219135448355","10696101367939202453","6680940524058549482"],["6808700477292867820","3334469136355259256","17888332911391819258","13192563795960629052"],["11336620126162750964","16731558336295969979","1566364012604729318","10669262609760498814"],["567014322814402553","4684553140158559017","10655005228094654058","5013308370221966241"],["18037954945584736727","13058535389300687194","1643607832891966800","8466942367534066932"],["12199193714198974623","11271755684676419260","8442697196787998174","7485849643010739859"],["1163688034264860541","16164601397773944252","2291592309981311225","64712113513030715"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["4446723775238357421","17418347241032470755","2211026025964533858","4631758318252834470"],["10966041494594201693","12038811811364069368","1083388327975185934","15537429658040643676"],["16492966348586332112","2480509571956344574","9897277555783246414","2910451641091228452"],["8217561042194767286","7736011692371189103","3765165795433159849","13599115489555352403"],["16274569510297400527","10773353318576100633","15894781139035062541","15580809770401586540"],["38626085754310868","1911625315885561825","6116209224411379829","7254391573230304756"],["2584694016930739722","618769161909676661","9982266844071309321","12168194624493167144"],["10894821779285247498","17015342584455506827","1725053157376099812","13957178671991008993"],["1016233178080889971","12480754995368621864","11911042231541481463","16076055059778923583"],["13270048813586021050","2834644077649165231","7203889832823426675","5149905645411504554"],["17476924769422552429","10721807264792153135","8830259779082699417","358619917143335121"],["1806678016413850781","13622069744204686051","10323870843276163219","3827401359244592024"],["14950560601445479603","12318887945300884041","3888801033084165745","104177820691766458"],["6287100379696376255","3851827983693971634","4295482949541375249","2429214690197407228"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["14225074281373204125","13551703351002223588","3736230403602057721","196261108668330037"],["7126265001768172209","13886176575247811183","14922355162930551017","16067559528269139882"],["3315321849411458896","11587253819395313367","7437182010455331618","14449303232294850390"],["2741828516503018144","1211460705218308888","17601541428232618090","12655889540167203951"],["3800079508963626981","1991945539642343699","16465528111063421871","16366497964652626969"],["13944127696063263754","7913934773827098014","15256313514574588570","6399376963574577335"],["803629624667134144","6332856187823322698","12138890270678055359","18118310730059347262"],["4651700465664417561","17732695833670062238","10312066231325811460","17077443673262906762"],["5779502275383790243","9539827125356437402","8287877355471479406","5551504215311650658"],["10055658810649294903","2562682405485847104","12563357814433777597","17217004145689873472"],["18149592512220194880","13515191973350918308","16530774970622666747","4479096018294248054"],["13556239775371754687","20086228678143635","17035665974445846029","15720701329406486111"],["13404392187057798779","10743229760180329365","12988627715252182063","15764064515123826612"],["11569544836122864942","1531817603586778298","14773893647553107831","7129506260538390965"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["14595586340202927460","18345352214960941471","2297772110845605573","4464564390716538178"],["16479803666422054097","10182607826609228422","5133779339646489267","18217542698083264971"],["2974612928837797788","10870150442168678980","16369169325103375247","14252699362097941367"],["1564502860596888923","7313120965654777142","12375826591624249479","9678137166328375510"],["9294532395359847913","13962891514827626975","2500952097921043122","12183439824285025332"],["11630057266153849468","1322443079731278178","7055870123661779828","13559919122892049960"],["1900439338927955401","7504776704694915283","15068172094141857919","628582995124696550"],["3629231681491977653","11328803834635040097","13253380938210788287","5577188805285129764"],["2111044941607835584","11075977735521365491","5307822155842840326","6573578549559977911"],["13777195857511630405","810579312294208273","8852490104647780022","16963914252028711699"],["1527364752913099058","12025654039776567801","760942159540865451","12800800362276949048"],["7966577150483943569","16156541895562619975","6061200689440781754","8937008933778153354"],["16056474048480764569","12314614797464253701","11426867635532275133","6991650091203592172"],["6287100379696376255","3851827983693971634","4295482949541375249","2429214690197407228"],["13956433588470628582","16060183662801258111","5034842974289043829","13496218742854737967"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["9853840408080983202","13919246832285084269","18250985892680430545","14300282541504367477"],["6395558165915971767","2142613829747630038","3640706433233105647","11823585013041175037"],["3175974812359033201","5673980917735532168","4430716147896069469","15421972595970793670"],["9388595569893394065","6317343647705968677","17030272286942254826","17137890831192152948"],["4789645682343540642","2002215770610944699","15820585125607030887","18107392522454400407"],["6382832569761324589","11128320376047138914","17952820853204645577","12689128170726496107"],["17784885812730132002","10297016416189599742","13213903753989237766","8581347611956744334"],["12065800702975249555","18349642173444399101","13622456597225018703","9585594854627994914"],["18018615529386293987","16451039466165548839","2957679596613746751","13149805338243445518"],["7738955106028249902","5154699064664164054","5581880515789745730","4499841891743515585"],["8977654205859840741","12353694402662579954","1215204371570961124","17675868013751805531"],["18037954945584736727","13058535389300687194","1643607832891966800","8466942367534066932"],["12199193714198974623","11271755684676419260","8442697196787998174","7485849643010739859"],["1163688034264860541","16164601397773944252","2291592309981311225","64712113513030715"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["4888421534211493729","4892350711737234805","14531628675395079059","9794025171369070796"],["7453910414741555165","9868607176484361289","1119713357892036965","169225902690128981"],["1980822074918116290","10915569991431255702","11158678009633082301","6877481489519057951"],["14068383476300631095","17622895477441944372","2352452978660427103","5988798261749878688"],["1277999572013273084","12123975116381550769","18423442169190628547","8943213612244588078"],["8613022716071641702","15150511598782013435","6665917738275175776","16788141394967375767"],["10142263680902264476","5056455523784292243","5324123932187717001","5770840237045356070"],["14386217578976469380","14238696302018266868","11079221872832448661","15920821841745570323"],["9498933376197075373","12999474369912628805","17051557433258247559","10995981964000496062"],["11336620126162750964","16731558336295969979","1566364012604729318","10669262609760498814"],["567014322814402553","4684553140158559017","10655005228094654058","5013308370221966241"],["18037954945584736727","13058535389300687194","1643607832891966800","8466942367534066932"],["12199193714198974623","11271755684676419260","8442697196787998174","7485849643010739859"],["1163688034264860541","16164601397773944252","2291592309981311225","64712113513030715"],["17064441256576505143","12040748599070257482","7911489802445451726","1148589774936013363"],["14791863940166908879","7990185549132359738","12590888669365862968","13126639062689225664"]],[["3829406690085411269","15697005352667564003","88419414876886235","8483946438597005530"],["3211755504881093078","17465025811143396674","7787867590911344205","18195024718666735661"],["3995933402052038227","5657003105299352563","9546689260281226222","15673392776501842781"],["17224014276238338353","2346271318486955146","4430990061336296756","10456291139875900799"],["2828175707361123494","16432960973567348957","10883573742029041264","9232931358027962100"],["13058607801369709182","12934817427761202995","8787762472307040853","15391370000459177201"],["2156595926067527361","14683902697430481217","18370054495906705469","17401331075056735823"],["10060762390408931155","17595160560468709649","8289146928281944551","12515348450270359316"],["12566725903386403016","8575644069154627633","7669365567898217146","14837956251737072537"],["15722228454653194326","6032148191857238825","15776011190496620721","14468097741099206034"],["16210883127615737412","2410876054350327267","4988089683807998267","16893589905772327132"],["360271736873131940","5387304778516514806","17452571491207218759","13534930174190422494"],["7156234165162245069","18294687147126705168","8009966355592798713","12966358794196961907"],["13945067573911248991","10555574143738113655","15950660835465898023","2872975747105834415"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]],[["4259654433110421600","13091049395493442499","4752056968101790851","9138561110420225451"],["11942233355900210117","3126072435157399067","17569435215234710659","7548693068900898519"],["16425068588117887517","16071058792425768178","6064907951750366195","6594029493519856166"],["7351229327378466818","12503592363150444869","7775482392260002095","12221726266633261498"],["4086541996588639840","3452180016076551474","15928242084723289554","11956970682336143456"],["37086564747263491","11026019449110769554","2826436446155771179","15665100482145261677"],["1166465826321036961","5483932601160074270","10997712031871629621","1888278476584358633"],["14533041372071485147","5053511219787152346","11859212007355874667","4567496928395178245"],["8296557064260034322","15172511696200329785","17182993879377615879","9294640551866870389"],["2549835126877201127","9307364683377880508","11286853278676501383","15200175078181929860"],["3996873701200171075","16140214661775150158","13805470400685550960","10921749193186097854"],["14994556043050664824","14119709343143322991","16682367092441955481","12494626172210544770"],["2449151040631886345","361660806309789835","9443335240920004624","3707077126336297248"],["1123940488237765245","6166598706874910680","16257887429065614667","1134771532837781467"],["12233162147806114737","2022691670414150443","18366118951369945575","4593487937287376591"],["5854583497010350663","8520723193637535633","7933781981105182811","625681060961576670"]]],"s2_root":["14456802621146104040","15277636300000965453","2113436022344192886","13772375489271156001"],"s2_vals":[["12973547629270589987","12506266612922216772","3502071176296005238","18014628752083405281","4510270714688429882","11475606233643763397","853952549451641365","5283578930836923703","13218702607596756933","15419748530470588854","2708180329345036015","801943406675900514","16487359402938223225","16792311894182508490","16804872262637649064","13073588900146234763","16389024139076912215","12074512419918433618","11499804588412822025","4905609930430997610","9391307406566704832","10332368209876923528","15863114558349760772","14660001307359062739","16133633146988315490","18120550064780848657","2202236661580162669","5389754326519178445","868857824856597618","13975935444432451138","11155794413677695167","3109871534268773402","17934339656079874822","3283278188404967838","11850176366375315899","9379274156443747632","5912245527897206554","12126326390712869257","14847528592303606994","4256918154887652606","5344324905020259313","1852269613159664266","409319354930823738","3426399102194082630","17168624641176333765","8671863490181765829","4271406984170458981","6207247411441281129"],["27477854179759111","4118095693328006169","16613116112332106458","6446189386402612036","1500872825402842984","4171691841859378461","13010663928500400919","6056833389217904590","112679507567990658","2530326151547963039","4999077498386800748","2074351008783214222","6904230331604961234","10289754815580503485","14596453910829911088","744837824592150509","12975413594100071865","14695405832343315890","2150868796197262558","9583564604199103803","6991341407141943806","4168969821813683296","548055044988989077","18285141909127790961","18187405244039123261","3659204213639043928","1952628288332995825","17742133086670551767","927381403116425475","7507092066655154748","17359333183548124316","9669974328365412294","16086568514582809258","4562544504433135542","12659704807628764601","8637939219648449631","4344668277301758992","4963980942657875191","1562872059890591936","6385312001971396164","7270942579242679735","18221326717935754448","15004649326098793499","5890255391180248521","11498230224468583061","5574619677302058045","12685337312652374275","4527519575961172225"],["3344758774147083497","12533124175071630686","3129699294872471053","1194668205024646221","11116523394605683398","13427949070991290996","1180464014388018503","15195194138622881011","5741360241898048828","4734167454326236879","12263584226103444970","9373460733128217450","8041313527808295860","13674387595247783234","6088421732896063976","16770470897828193064","11492198427544822862","9439020170739372175","3299744712463492372","11042822683526292534","11211315061360026694","1718738051306761508","10355752730726321614","3214094673143419892","10064948297696472037","5715321462345585835","9759917060368555033","12885680762435902322","313792909012685034","9767947509632985252","18267683348084856767","5018058242145683594","14350210339936017014","13289199512567323489","3767452844567761667","15733981968355668939","18079788350431359795","16974058497832816982","12156634053401619051","18007069615234358230","9954372652666812670","17476695566563274811","16382229245462017870","3318524350899859930","10924377578414469636","14113201451907239073","17170061679623847833","6852013925566605696"],["11032372103609119877","4714646773370770014","10411583411686269094","1886193836517799243","15640123722084628734","11702877813092153083","12518239364843681233","16485030781759598578","2707425111774940778","6548910475505864329","2216198143819571295","8758946554112554525","6555822945025753337","4707546019308141544","15497896677893658075","2070683733213293768","3911453595513447598","18000981182031777104","6392614827818620264","16704412140956670907","1454883174902477354","12238833608629110124","17196106661091020028","3373982150709168191","15972978366965730963","592022493600516507","16723429505880022382","8572310078024827950","13414572798230296442","5264153094180826521","17186220875553364446","17490376116987001546","4799580422861445651","323274999599839418","17204573935448321802","256979918857878978","2770360628676877434","13411524790447959652","429737390789879771","4192997159923690289","4840854565697967741","14654879470611441586","16008244761514079122","12050262458755282080","6572788936027979678","3309684141028835646","11108536060250523350","1283508210684554015"],["14616493602546393390","5417251347128986691","14500657968278633369","4058171996305360276","8227972752461749914","803179505009859823","3946687953964312495","15057115359612553571","11696593571572771196","13083333317305567779","14354140125673166599","4018384614279262497","4004909444060032051","8372085377719111948","10085071255991474607","14921378720393559473","16348770363131407361","8728044627062223936","2529965542732045548","15603083211992311790","2258892222488722599","8828279702535952270","3298142166736592579","15733883126112817702","16277036468598315446","12126461454566241943","16117242126285867250","16706614062069384400","10585893614115355875","7339226536900626349","6946460665302912634","2017452655534086148","1004663275761744498","9843973993006206247","7705868770179224600","17771722080224423968","1041254013591656172","972233442754776597","14821998424952649083","18086667559848381482","11151447415156941081","11525247483664310649","18330529486299194982","16728416171620443060","3566575344420199869","8924142612590229624","908530710756383205","3134738007830947318"],["14836035554971599972","11229945867970222657","8405756333496505371","15409137831364969282","7771509658646979426","7832091299823203648","12786518038161498008","12375656224341580918","11904523470241886105","3848323676804063062","14147031676373763102","2529118565852810322","11432515815705490626","11734050809521236816","18400752131920234258","4707383121953625090","12595513616261487809","1236469321089103677","4192170474042868983","11687873780119590111","1699385221875609895","774207715909375259","10331600024877597991","4892741367894840419","8187344341671415006","7682008204253600599","143702884594580170","5510111290741710932","12532931969227458191","5103716952184581569","8535287236616299979","6555079884775947053","14304667946682632812","2971318296301773927","17077575659218216103","3976855776737814287","7755430277566655272","8592506302779962890","8023918527066542705","13352861857986632774","4497585294052659525","8266845659308259724","5945301555841873145","7713676252758710737","1533499654945411248","8215038556283180845","14282328090193700914","13666296647208880541"],["15754019976953126143","17144824048284244167","16883080868663300659","1894430431537073626","18138927229700497019","4032872283957637320","1499641406124273615","13778718221728438326","5523961437575577178","8660076929426438451","2058804545609830214","5203492613244428592","9646054352541391743","12591790705293571066","12949665484455503958","13824728140172158739","18090985405009624026","4777825358321681562","2270993351124198348","13350397857013745799","9356799417550193763","17972312874251154061","5602053974750506079","13048216228173482737","393973804631620840","2329520359883835318","206393677613016679","5434479945068433895","3803686260132870456","6701963521722188711","13340330596653195358","15441980243792284656","14281400090621874649","17825770092020159716","9757762826977176381","9843910613708987756","9827787874600848594","15583881668765930054","12334407327638943531","13051048810042302132","9889646959008551829","16499088482990985940","5792894434616491264","16928085543991103469","5257394124002680615","6981029485897704051","12085987695622292996","636215676423093024"],["17503525878639280770","17678271688543934614","12931468150610880543","16275031106903757607","13767534404528331052","12512105516918176218","11721609619033164723","11544163252248730709","14194400796009573799","1029008923260889213","10939161033342062927","1384394311963953598","7810838652414882159","4416291850027428600","13889646216305757466","10719226453124800223","17886484441287374669","18235723544029452450","11448141504075691101","6447309146118186034","2618021264111212465","1343877976709782073","16754587211577975651","1527411971388302932","16521579446537412740","5144687108429763220","18406244324090162426","5621084754065422281","13758385951497184815","4623777264789424051","11796660768656645499","10330227069663630619","9918331893320367768","247215058548127254","2004024947528499535","13459665570650599510","12877366072844709449","12391223976590279383","6662788054409985537","1597431782781494450","1301271815939399665","17383668160219492040","12107626003877590812","1867535268968399558","1304787799590135248","8797514925578154184","15525681600331345007","6548890662569745299"],["13812161287675865883","17597721312101685893","12964452424812972931","16901911839318466464","9964240722514233046","8715817064714796181","13248126695724321824","4061604937727376793","240419001837677160","16057228143931764208","6212218870245788673","16081193071927303110","3218360661904889070","3486544602880322580","8935706744039251032","17264054822628444202","363394731135162111","16214917690253047284","11291384608687932598","1910498130231524250","4657429043691904797","14995199093728439966","12809172226939548568","12308806372314267014","15679105598060546608","8475097284853434194","102237707003871779","2985243285381535510","624872586905134066","4684273627632038774","16328930741334870024","17433104476450659581","11896544299300001728","7893153459542942489","5545976944386137782","12790669391586550028","3408655432737256535","3537927028905157209","12756832308918072460","5597939198326728477","14376910664869981683","7150657708051426282","11423350950614100671","1697982313494784510","8717200431855359886","16815784077570823057","6714434645827260557","1831343502693315646"],["11066930140328771019","2569824411870545264","9136484737850997932","16454674638988989506","12921875100371086946","13879377165727585997","7547526666648997232","13656982641299005832","5255885028835372474","3695531169782570045","16916502833654378020","17910055881081835514","5939002528041304704","18374976557694859419","43635347676216173","5145954104165030230","11923455946635650502","278032554082981164","14539613870386274629","804998437772819257","7193572654416527672","1944258120937580580","386377180763304235","17595378528484499","18066763670839760934","16777125049253273807","5753913084717811711","3523739875260855758","3739377662037383389","6161439969546811265","17188241012466597083","6446556357689832455","2150270523485011312","10406092378255167821","18030768482758647067","6648946254254113964","16536024858299156853","14306578526685853081","4311875694094849598","9788083052655865486","1388124917940362585","14948773934612724628","18409781831074876224","3463990416383830915","4797074827283424215","1445548856690708160","17125266680468064874","8892650113621914995"],["1362956771818041407","1882337307030502174","7502870794373533744","5503837244685034119","58771730510642742","17147794796800862985","15029188910531218953","5763409136710352550","3737993201324278898","16177383927120053854","2282602812905441264","12400185350014796907","10013073620822404333","16244468021703205637","8060142814305609680","14354271882173764308","332871342289716072","14859052977261999449","7605057152491975566","13577025502464193221","5240627891888027148","9923071892094274069","8138465517510807570","11122049463224340859","16400154926593418328","7726599618231926323","5563050462399238266","540011415624168704","12576169790982119689","9499112992512781875","8588550159056117234","167599511895934030","11907522681408059808","13359928327122705330","16465525789821183732","6102352724507743095","8210104764631024647","3569228199809503468","4679464427638196778","17471043811873148236","11507197283518915377","5535913166568622088","16712620756515390640","2595622237811653940","124847496003794055","14822910570312664124","14842729738663119239","1619257752920057709"],["17732062609421067330","7042652128546246262","6769529419413674303","2859959507159195771","1383044751882855292","8161328941132700221","12790421503075101926","6356104780503301535","14024528013333295405","11151473164222577770","15605575200309064395","4087616797227280960","10799820314525380790","432515673856681353","18203929272296592971","7454435507881619606","8440338225018674876","12579638887785023987","15306465756049341529","16735408664856315681","11068679287563183001","14322459026170004157","4628090818762963037","316553131737007149","5456826453482683510","1395519400409306414","2259993851190160178","859923742652645047","4382058240708280513","18018279302322257301","15252839320570061292","2408243632472602238","12705119052355370614","12542141244324182651","732480832571053920","16384179663404166541","10614887361282330718","13671062649621458048","557360275570457625","1945054022177049960","2907500366404253932","5269729863237564166","6047570139939215750","17125579336911773864","13934865263658025707","615859122995372327","2450451404280340594","11881167079191143749"],["16890437598637651392","4253348331079229192","4377300617203048707","565039540318814600","11520706687073416304","11676846588692063698","1201664291219180341","6268920857484896767","15793263862391300283","4984550917078917872","1761891660729208898","2589488548461438830","14568043402051835270","5917082473330426877","6891081814950668906","6769056930353327717","12376824777428348972","8130298695528402066","6881697391726336174","16699271507442922452","15614360630080072820","17954068149244452552","11885585563313221854","14203765554691551232","15382014340071236824","3960666074488972125","3901566210381803087","4964931398710630574","16162557167302885835","10159098438589502054","7856534742240587464","1310782447299749791","3433415002834132370","11864419280414477842","2584639675119356600","17911672958653410191","16451094045333875923","18381218614303947168","9627650417635033398","10419694810252268295","3709270831512129081","592617910106374626","11163991897769436086","9279929243317749496","5528661415229185978","18330850870860438838","3252806629359147479","11117091234506119819"],["4059095161245972078","2916187784830319994","17710260796773525645","15760970889114818177","16403289940965151166","9177668743854295400","11189549352223241105","15714389959743771447","9268101155268192686","10348908499905821437","15320347448619345968","3483309140527616130","17698531642570595078","7827585371068994422","10933843224187207287","3873903372967424927","5647606885874757869","8127269857368623558","3358130082142524033","17270960114408238657","17603477674854639871","17811530421358089996","14785856914549024567","10217316587835298011","8925614425227304099","7018139680169342334","18043672062753160827","13560705818388329912","12819269713783079954","1388343870889855129","18099258446770606172","435878231716002211","1849617230680738538","3939532103074269431","10375636392050933337","4875234787354079349","10205798284458159188","17393228727995126288","14864833273733736439","7433146890075444127","7168695131515668225","3387968160088050833","10803920782370589516","3489693645465986977","17858484875308314251","11570497984348222434","4257612229020704046","10133572113734479035"],["1169923573027628116","14754813494063898201","11724152046528226724","12075698954790900004","4593996340134386118","6436558811085925695","11301409443987762708","5665244054189891819","15168421150584489791","646073818819284338","11896262156010460084","14118765728679121931","2613669438251240135","6922391810889999236","14445559953866878296","14408313762781681961","2579926536457139451","14006747161558486191","12191833601828858150","14299660280257654808","13410485028206204262","17391554418269712451","10163509950675895042","7531524935744078835","10682442816375810707","3579019955349986760","10415149735051600738","5182138461771411865","7042508539830318044","2387406281613544607","10411526318702026132","2178268039939225922","2301115068981167880","17357445568458803350","16798283904130324494","18282926784193421378","2224243898722972948","17089257721004327194","8540321106597624894","600218709087452604","18128816071480783350","14982033772659770186","17707462124107508319","15607584830987012553","17302231428984959311","16497749325818374032","5550806610352959611","650977093035510149"],["10322422701283596170","2108051177419050070","2237818726162089726","1314008261475341207","6159980246262236566","2724509738100805632","1409816123835144048","13408736629613141256","17613819716802861941","16618888855266188754","12914917531190950478","10412415442733285984","16752363613678303146","572016057972213696","9421021882967049543","1369840637723542938","4689167837438440593","8633643745028449208","2167112894412502945","6882430356179688157","17502524653872570277","14573836277056672745","13971035155240017447","597543533790891358","11626165850798676555","375132924448068106","14371113462704542679","13351557997715091688","18112568551204289259","15728060751656067177","10123999735976729916","4122523313903333140","2820235433585112012","17639006745848062633","8176705864558992935","2081095709134769439","3607963057417881719","16085650109723541658","10805534179066941703","15507232885581900913","18149841653159008141","11625216176430199167","12726348129264070189","7119614743164380063","1043680256854389568","1068927522886904910","11173541938953080375","14051823251242922646"],["13405579252032089381","883940601833407985","3630103552779597481","17575414469451863860","714357272279700348","17873315454189925649","6230065321676977475","5473160185000730743","8521900389527467955","6529958573550250184","4937456217308077116","10943749247236569751","14093338395837024495","12481085647575677118","5692576608278824874","867915611154304689","2819025276148188681","11458693832588709783","4078922422797690561","10953592198142219017","4704258426057371841","465089994743931392","13712405952784704134","10790293233494167201","8148645469575184923","16878575915713211196","590870823910620458","4955698466880578965","6612740185350604999","4655021010844352147","11179689159260075503","10902675140907449561","6111792757395525775","17232103173500755437","440646869775907521","8102572475457109883","4863944888851720136","9925351717176487973","643373342349248658","10194703985042584910","10844177865028108330","14906657172679906146","16479277792404136760","13773816976193184404","9766492039231859357","1506410956901559890","7664321251053329218","4189252561240229039"],["12982448808239825158","10188545358015211193","7026381453983952479","1369913068605943364","1397983346102059037","8234517334255941694","8380118394042757840","14716296758668453248","4666263928853100379","10588277122346059375","8456284411277362877","5652616953797834946","9267397450596716765","13736193758593791266","11669368066250926755","10597886696710996837","1975237800953232461","13020348755498241743","480823880718743159","1029818307043700952","18393746616497503113","7086285202243897463","11064287174716212897","9408286266786341135","4386823847300969047","13443518644856347612","12598148165180084342","13919087795295773254","47749869935018358","3592912223510901255","8296269093612079334","3553061791561009933","2507208771224722293","13791684952682125723","10568080969539211675","2413940683995570631","2513063521507822183","6936645392006503247","825930162631284870","9381400562470148541","8776817595415256101","5827513276106421645","13261670903532205558","17491902363265128114","17450628725820315426","13500641198975481123","5250706601552293170","9829027712938530232"],["3418731190393760964","11180813310117483700","11101616525912200590","10460716950087404382","2398436155568155941","8331214262702158022","11247369886384987101","2834870414837417610","6368908006400101215","14160338348252024581","10187656548880912005","1378065820903109802","10008542344651041134","5211693694814577443","15050902589750104807","4364414133422244722","17543724345764307293","1193745265682592965","10144825219533321481","5259820581002603007","12359794793311406611","16409739024329787596","15723957701594963651","8304156963153425290","4064928766251033526","10825288259360515009","18308820413868560911","4416128333528533245","11293897557430097312","13174359632779938377","3281267040754865585","9387971987367841873","13914520031494882581","11277745807355454317","24092971640456882","17084554138896301921","1748750963724220475","10829254088809184848","10403834176362332261","9933161223704577778","16971311820916626102","5229304477944177818","695299631560195260","13144622237327181037","12733199073011546820","15679556723205289031","8342517292489135983","15543843968948793337"],["15884694678334276525","15551101489467770640","11708627925626256817","3054817720107019817","14903871818937083098","17594941254690561729","8112984263688280442","12331471748265639508","9790182312366680522","4512480146285581763","5918834899091601961","1724740929709544870","2316217654931043137","1380159361461844563","13955373004282753679","581654777383180401","3161363079183166510","12180282607433177041","12870313069281640284","13810991846075247275","18430744206632535356","3730285683384058850","1597853198607030153","7834263974237639413","3039381052635490374","2212036439574073562","4488347001128228536","6562257906541882432","15068429698269941830","18067104965502322504","12116244228424916275","15428223472825108611","10160180534352785998","6916052654751596291","10489543787333744275","14085670077389967460","9504843536337246604","2650067934702449170","2476306528208875382","3698328701048293865","14816826546674034384","3524690654281421056","9025565771801820271","11893834170493251106","16678292469254307374","13601792383453441707","5657614027324067171","9584482925804930119"],["16899666589229736075","9751103115835591496","8260414583546673060","7373552188556051369","2055509471524690663","11750021793020953817","15033838219207353689","4979628218085743252","1590682996639979908","3653531572067342709","1455789145635468357","12975483015043413726","17677455254621155869","4127172001984981343","4558411101333935583","7879136495113791111","16865544066195985664","6241789104542305949","14137225261107843937","14499158961063871417","11493063254936274765","14977739836017161101","7907316534190349642","14590316512608956457","1176855618866250237","6185997555711886602","15986135257377748581","17021455005710255479","1146385224963297355","14257330902955975488","10522682413603539758","2807925995585743630","4541946487226722255","9532670713157381416","16593396142966239775","9001253528779806866","11421114399336908374","13357198346052062990","16597363693687356340","5829776491299551562","1777382623680166928","2651361246853293068","5612005043195783248","16465343845286440616","1675293458859431219","12739165977323347894","16798078184958014736","13410112722537636190"],["1976156938301457958","9046806606706374940","7276900222575185177","10647681757451924620","1669923448913725303","14006708207151385370","153776678928647492","11098371536352879007","9792260902625963003","3011736509639677374","5566599213801485087","5144727130087456669","5825442619290775263","10101477786112668180","14140866998969657401","3850876580569988974","16408949877865879521","8512486098924693962","14810588016838834915","17680808785881619783","15280861415188422231","16456605559891579849","13458240571631209647","13808614491068006119","7152545892882627997","18130960230875993514","17668175508842246000","6790610772226389315","4892407871038537068","15977621645862788504","251525852126732461","7492986327251585387","8493865487502758543","2269741010341853186","1880531170233264418","3137315384588539087","9361145633452418090","5494598258475305052","11788332484728045398","12445334006431890038","2689950286635703369","6376867072064592800","13819580657396990924","4876601929095745341","4229167692725874578","12181583782907723862","7524651921270100891","10650482682078772936"],["8206208174052074134","12881267932935292641","11555688249029196462","5722995224486224427","18188567936655859042","289798920365561040","16539538660429993140","12944835621849521021","7248595523515408649","7064281316222792051","1693949846821008328","11377645883983579075","17834309075416509347","17165269603986772386","9895891695503892130","420189140241985683","15222256869024407095","1212935401453773719","6959812360587704467","7617569691790952879","2060563502098667995","18291356500965586807","9810487010303544748","15067837530281999461","12057418329419467405","13922215001639435837","7650917226357387575","17535793078863687230","15877220955244001587","994169573907798236","14359044950702890686","2416861589013623768","2576932118236637068","3062225587207647360","14683720482599733791","7373040662606967244","8142243803103694625","8689900338940398971","677441527964320613","15290828147253836017","16333741342979855365","11372472997621516047","10914198607195699478","7539678670419371638","13196947754402426174","11570120815319700856","11953335844768144139","16047087568700366278"],["4047094338321649126","13221211658575628238","16429586291816479265","3759456056176319927","6072326178278223001","5766417185951236858","3602399770672176625","15127671096866119275","3649424474237282216","8488494822246274020","17373722901603375229","7942192435511294777","3291532732169765519","10262096175999195986","8838078560368273288","5223281604611113763","13943986830520847404","6097618957650507763","15047765587615272776","18211209663344468853","9717993422989166652","6196628320269950472","7075804014068426139","14460598305417849072","9179412811509900016","2976537233117282774","10293131718340805388","2316121728455406610","10053748266874404787","1360954930339453876","17087879493758159292","2034081432030838607","2984896388153850885","10246950696172152969","1867972994118196538","12098313266181291140","14045359655905078201","16722666080273042211","3181479531985496260","12200284158413787604","6722840253001278738","7879808865355758488","1803014087325775131","1980744061599971312","11268776366121475609","11649484810887878038","6284874211276201553","15031261462662363189"],["4916278624428548251","18292702482437677784","16875501632910334324","8949631866355539644","3993253627745879399","3927490243415314619","4197831417103315647","17783481211052760626","5425487846858036713","9928992796612766639","1602141292111264286","15151670584455340783","15425301829732239770","14512336458256925238","3459275973556984023","14338321515161482007","9659408145353757410","7667864110185510280","5578902527774790301","11503374414743026701","2571438839229054190","9507349100565781385","2762641415314979910","8901150156251076734","8655941439545025747","15121577207490629830","14976486569219101785","12838453576398229163","3022210524445348170","8235105222194278758","10393490840780410068","8506316070934773057","10387858687721354458","3772624273192432301","9928927351402420377","15681696791273927280","16676023965155895791","14198327479831462344","11645393561155518148","15004451984306839320","8109696207646566899","12677105659460026593","10274682470115315755","153009459563858021","9564253104514396726","13481551079704711836","9307990627305589869","10777336460362067760"],["4780084061686576699","13163874491446130390","1754918213948973872","9424799820543461713","7734387944132192380","7534829285613785938","16727172499275864392","2157343787186042229","6143003210179992774","9544118282990910834","8138940323901754415","10529078901289359510","16131798728717939189","9967397660411575767","864541820392457530","11324355961028506482","11565212581409245846","14615755102165306890","859762848757996727","10604365250519609756","13877594371333132566","6025906534044704068","17408824954632755572","8899003620289706891","8153714540504943998","570430974529840412","847697562698308811","7113988915706737313","13518083965664590515","6478092717777057228","4575016327951654436","1416073801973847130","2401622754381950603","9838208422963739873","7235092913867353122","5592651246804579130","16452006714679839809","6707291112580442503","9044092691099033761","11792480206793642433","16614156265211267040","11191258314967230794","10666295506880593247","17233563143725791013","10585369843633279503","12054974678812533144","12677423611227260008","2346552096357093416"],["5730487766829490406","653512353256236491","3056002372535367443","12372852651375430529","3211184333830344347","17378033449697104960","2120815048816570933","18410305441845131914","16127381883092615481","5054160505332028347","8715261517672929717","2018137815932196197","15642806030087557772","4252977508527414160","8058349990384883630","16253641393963202683","13779928786245379789","4337054251955640615","5224305925137053909","18412903245591384961","17803503956712938588","16599520287985818780","14717324596603059352","4146329994424817786","12551807055392335500","1595992360868975828","17975516586885362094","430579745773016739","4866068440676615956","16827722478991082644","4769890693282385680","4240030795032639467","10460479611934916359","7477899060151491685","9615564813757443845","10527080461753396645","16392901083715652743","11379294653039036992","13403298706857816678","6888685576461218103","17431565690254247223","631137979736184407","7953054924862438138","13380655192544307418","811651073685654005","14870725232368326081","7199598622388386521","14314225876561417430"],["10443403993304041491","8499917645043829980","8764787547272730841","2840471720649523812","2619904847162520733","9939059088447936394","15769584823715619700","3106999703490818525","923441496822547902","14107612571395437112","1907033386224671999","16301348790204603526","10497893246660244810","10833833626862006647","6368749069807338773","12771353915306733121","5113863736249714954","2018144506543241538","8002698775713594961","10751951617728610667","4613320419018441417","13009168895455004595","4248211600303238179","17262216478774922728","2603506292650850553","17352798172585625641","11943753059736921836","5697609207965262277","13922459258569374698","15110840890106491796","14518699739581020352","4166418387385542097","4193709776989967760","6228322982237519177","14937510639830102030","14717837346065742540","18303537376292916309","15868988240507779129","9889956092872931031","4718386058006870091","1676575940575097478","4465610527850867965","11325916693882259574","14616313471289033346","17791890106601918690","16584143897189836253","1567913435206570051","3243280770973296026"],["8605735970301508162","14165100255062098659","221847727747876592","9722530539136291658","12357552803425737886","7517343506549373377","15097853904774319184","7033371294752080219","4422514292110317723","408065631251083641","14092571874733970510","9761651894585891918","17352129658973647096","5641350513159743586","3123980985749085067","16358857716622673055","10153693113564944289","14178216418419792909","17771847303818231154","7679580703006682956","2665299371301205814","7931325523471743869","13941063974100164157","18398291296757461144","801691813005581285","3543925919439922651","7096784297280342041","16087357791721121701","9612511550442931922","14865380871831654885","14827916320400115157","2269639888580883191","12376957793307646634","14280540063420382471","16785086170346188407","1564958637255872226","3284072232652899719","5866996140419937182","17401877808851140537","7536111953513741576","7181577699922246348","6371276792191875250","6260458286961195381","13703496676654651618","9224097434777994665","18434795694400309299","17630734186151985204","6827896514542652988"],["6062338318951988124","16364851612095055433","1378351810052473547","10548715942661093021","18232595257244014981","14215820847156570273","219609828657254672","2807010809410316368","8731187605743946975","6156321107783774601","465541020110050459","10349256655404198912","12517913851615265907","1196213762597045602","12737355625889795750","8208063447385122037","15954734889596792795","13896318807357428164","8451476964781522468","17186233073103027352","4791623549298664330","11478978428702955486","14779818033035792083","12853557201739810746","18093387005206804113","5189216179246126482","13561427795231048687","16923300317792335941","756204225955888576","6179230729727079826","18433332726585338430","18441463239203056578","16898162581361398297","8565662502888180449","5248235973615429315","14184592072936897488","6203702539971365567","140551890389568543","1030420658466488813","10099038243555813469","17596131482738139098","11491806282818902700","304397869566509912","15634814414510886249","16982835216677283578","15130187847711637270","4899113654072740893","15254308278034840066"],["7747563097602202163","12182187024720201671","7577273650342934696","5936334309771209584","3996858486899198669","1137856370687204674","7822042833382880855","13709213247806598897","14488537587885724999","16971603448135376071","16603627214327011258","2302965151513082159","9581619461097519328","1952445613168253380","16080360940504135638","5824376260262595154","6903558419080866285","11801956701084176256","5646892700347163036","13121632153318626314","2924563282249694784","12265294189455545848","6461869339514610215","2711381661771752985","7528393069422240818","2691132069932434550","4146481830782411546","6596560142326470169","14258756922725534371","1565558482052785334","9438334884385913017","13343897475597454291","15089174033019690607","17715492576630566388","17457440522675782914","18082153638802449910","13604443107829831529","5520704060774645827","16744894729771732579","16786298964250507698","8453368242199170790","17973000556765595442","11525786261487264035","16193240959500835937","15462354516067976455","10947089579429382425","4243609175249475047","14989583086049706253"],["7543731255327589086","6528977770993882330","10246741916302406683","5326801820757978153","12773969558848795127","6174137615437225156","12148265464211703634","5859623523855145339","7649686556050149128","17631771803815422499","6198558087043921006","300044802948007665","3277906035466036657","18153235477547405690","14619237576037780632","1024070478632655439","1246478301251510393","8307305928480823275","11580841277962404311","15023174974293961902","798137040478339274","17310758119138136696","10794052565846451090","16512087795853846525","9773143860048551580","18296377588828615993","5038731488255338475","11049579110026712976","13573407758492698029","16565269099884351199","10137670792238623434","6076410066584193907","8826393522887097865","3749790153685390989","6872293813331522571","14539129337566025130","12862971879981281940","4206828023473808352","14776077096475241253","8040370189888451940","1548805818277249818","11621727124523514400","6062893860918508706","3272979347301651440","8028515876213210834","4665264252384276062","3972005650870706548","4780237325409855237"],["11055303422149548623","5353180156290871994","11093284966766589115","4745372100303914681","2474331552226051923","4149265039680306806","12938963782922435928","9714389747800403125","13080991323909991833","8416172187978509408","7400691398410160362","8034723944902770320","2929815287138892149","17518898841900462535","11297444498633415348","9673257577322372147","11948461466113221800","7723583558835200339","6869779369051569226","3492229821955709081","10018233787172479992","6751853652806219079","17028490214966753079","7949326195006684299","15898739339198627817","15435554196421619643","3782387855168686791","15866714710620383494","6247784514605493263","15589342524061971202","898226382349090609","13980255098872154583","11495456858713942646","3259762721299054049","5578335337753480716","17876602447732310549","5430218737018511970","5997667901661871733","7760140840514183615","12347543061781078582","1523331364244786074","14905102576561223593","11915716246671895548","12146317013854906481","2375177713757616748","18284085054141188769","1718845102804674988","4959807156958289033"],["18283399260154945968","3738302081942536648","6281515041716186342","13055473107326118933","9205043250707047047","13355872477542264757","15622384603615340601","9664189292529153605","1251064113697048585","17176828684321736749","5148185677613486723","10062418633541831282","2394173095933189790","14908005829373876548","17889145977763590091","17107926541515841027","6203020065347474595","10550916910400737615","13308748610780066294","15854164944008043174","15235455090684879531","1885848642652990911","8126860714538043776","7818048669534946388","3833548538974141884","4674316306548654977","10940564007856593591","18292344296073944958","9367753844571109362","6565106482924265826","3868233828137021507","7422966002068653400","6554302463473424132","15629941392737405889","17182597855971067528","6868502530055120620","9912305962125120367","4484945896250242701","2639060535158874390","5284168614975330752","8402731152401874706","9129769046763753622","628696594246822760","17590388506030436806","16987914554568966720","17394823601200601352","3938946415844249686","4747345059677445457"],["1824441562891960348","4433927754942336009","12521399276671040654","12091006361263335373","15485360632532423274","9096353451584826250","16556243754131558533","14562268904776012708","12959499079744814804","6440681901947219795","287757107359357319","6588315373594145143","3411112926421653687","18037582963273871404","10857175137334025718","17426188240014417927","14098853242851904065","16787858106706618143","4724397586567961331","3630740886691765116","7930334447803970407","14876400098076807477","12884513698569417112","16625069993409592125","2136188076251909056","11203056126446255400","10421970064841456586","2397540290519144415","5636764806917002736","8018499038121594059","2827800520843053119","1751398629503772425","8599257675726893357","11173003292843195149","11890424939240217639","3453604783866928967","4389180870861016830","7529861246112474552","11715672221471416409","6272816932719994704","4652889414948386242","15402099724637341669","11933373913629784870","15065909629259400704","3650886087252212845","6982636915772369555","5932691561829041644","4521051993750364758"],["14881536492618476508","7494169116282844418","125055630374541186","13336166164416633239","14860210053308389383","14260953644776404794","853118771331952323","4704250996889052879","4735567042850754089","16317980915141449829","13135661894380994782","2744266938902979784","16773203904529914479","7109350501535830115","6938906895041500175","14523556959047684967","2483668417023388528","14061891670317883165","3942832499028552719","4768974402634083594","9936982382060005521","14566223640069684715","9049588731731072400","3664452411078003943","1066509111168222009","5245936185518502896","3359113808650166386","13745348200093773241","4325488945916484648","8997057886522156369","11174155395921495399","14690988307670686720","3612416423336124007","370879465631411696","16567628480388609362","10572614979569430334","16740439486356234108","5157618055539748974","6744924487720237024","8856488522848389742","18297883557833749345","11237168727446527171","6202159992867279857","15489379630027381366","10153246606189423046","2492972181864869273","15179523788888418201","17510035905706243364"],["14484292157629598253","13586982373275730612","13425531464831697443","8981299780527520609","11453522098052674632","4001290769532698839","11834188979445344158","12678156278232410594","11387253173946209385","2986229538584218779","664431693832134174","7047514936886174259","10390949843099322736","5481195544360114930","16590271567916062543","12252399263820752829","14534750623509639220","4642723116434868312","18169594545694096738","3663231673911732367","12184221562550045200","12151814306892161399","6920954507920963011","1169904649145603612","11812570854903998139","5258866866974513698","3450903631434379758","12462828920742881510","1513758908510772853","15867699704552238441","4771157653179685101","10111141904053149002","3974290718495336058","5777469935533140938","7609507400743275834","4591845450932564709","2891999543512453335","10113227185527960313","4451762298527830361","17033971531799600103","644987396259094360","17853432168284059583","8530517551812888040","7752742075418263191","15056725250430611374","297303851146337139","13519690815859446720","18113538208750289600"],["2698543044073483914","6228142881867122572","18103728874273625506","17831114048282061212","12264678092261500311","9612727945378010001","7481986627691212562","10784779006734412139","15445939702357520202","7999343895733101712","4957822716360597642","11153478075332985157","11465196976724473332","16242775183613310570","13028908078276712563","1700173905939313266","7181058970602323543","13099091597924752546","17970369263506153234","16857955822355147450","1606144578343551948","6515748817714059725","11649028308990540756","16487256951341969198","4912182757160723384","8898999453221384046","8491938861538192919","960607652380315457","6279397989235323198","12300263911553059640","11236256500079421094","15706491222413152800","2023171909604735127","3303309638081758006","12177691933268731509","2366180069901579816","8189261356751691510","16127467281414564663","6409703947646236616","9771490785916447488","2035256942442651933","17937590899218093626","15249843590015363415","2296490419064714976","4656547019493655767","7292833116298236427","10329665038059420240","6595742209641300028"],["16170745600815796435","6420023499887354714","14105039063974580980","12733391155904072624","9464412109469524279","3459707412956091546","18321515532325461860","3256697598106952966","555107355955400856","8911343697982832423","15988987145334362087","12512604048849326243","8786501087702037088","3665963869347342028","5065567078967080440","16130039046771661419","11976268721498285015","14998675869338500034","914747877404130839","1358493396725052772","1364282379048867984","11860108282312880189","1224780086702006990","4540815899722828526","17258773341275583649","12662118127293911586","8886781830700771586","9639007737062450438","2969057247791687882","4258299052572442089","6790988012364691812","1291051866566043149","7859072191299298326","13687742411309879129","4183560389019812545","7703249842558855237","764642744737124731","14746316501318080905","12517449198418769337","10371205519309418518","7746057060915470965","17490761726991531730","5803139190504418455","17965853115202759605","9180402481024125739","15888021210458010975","1588742372091954199","1105215588380755411"],["11807061726811184767","10403440401604147215","9781926919341972809","8386519562810192011","2219429396755981715","3814917828887263272","6588736183085250566","16225253567701086625","10090750122300782231","15585703465368068074","16201199602162318036","18102182676031118630","3526988774695278296","6867621693974591579","8076072211194210502","4543067045134573671","17687994252516145625","2361854012905213356","4571548457718745619","13860359923773721758","5578426991332389518","14248510906072132492","8527760014573965871","3706311107399687291","2234149065747279458","17826160202245206221","16999799314429422266","2807838086589583614","10718093562380796859","748623578061089016","2704134511622107770","9569933418469970373","7271232604590899889","11125250632179408942","6169771760068298798","6018665293320788068","7209341059660150389","3622171284089814602","14805829047522113715","5788086372703878022","2019625980736494393","17871986684483827627","8226107788652443808","4257758204264379296","17143897134374301687","367854610924483366","13823707135050034770","8002214207231352909"],["526188989405989742","15531496420582067068","14081533571931018164","48933301456000493","7993443798967808155","9143666541302616303","10773010213095682027","7226614797904755631","16302660845743011679","2783585582475529310","7116700457703953259","5221368548435739647","14631588415386497575","16895845184964332098","5472450715700236607","7806458849405074067","1434605751037590760","13819203063428023245","11392999068354680036","7842203658468623537","10557714812688602632","9141517963306529469","16375329476864935831","16142535358904691116","3880595227856349466","10595284510098261489","16278836302772474133","2022818531483020193","14947809215033383813","1476159208165299473","8847220690999216282","15944048944257814049","481186830688628213","5878771380541596748","7468100145107278250","7493111346231718792","3090430424139816811","18363238109185065277","17709334465945209895","7730562812988917685","16957970437907020279","405420344263237160","1333469282619072680","17590126581818059497","11381871900979889424","14312711479445942451","6738883357296421408","8754896037880482030"],["4527719983504282439","8548679982411325551","14213791583942059354","10478273911194755915","13515013055936456617","17672458171531033449","4917429824241068938","2821784919080347068","11109747521306848487","17787810372454087432","13577591754349806073","7790001606717152584","6623489798364283743","3066883556335086967","15587007943254887106","4583670476772106583","9722746221878679883","16089468964205555111","2015798929778799207","6951311632267493882","4292663632789258994","11175704744941491836","7447594585238815533","14954765837620752392","14511199401599214289","8690289487920192404","71346737788751784","3772004117196307818","15388741338421214617","16216028855392064886","18218929669333261417","14180899991715479182","6036924448056219255","2784343017867286450","5814941944466264943","6294982936803078227","7176170103886376756","16111470799317151447","18325778803544521818","14630292199786285705","8505962544500642167","5976415408798908379","3859845320375504376","16134534033741033895","2652641838634815551","3626910289672713512","7481287870992880236","7526178566122782412"],["3848814900936663301","12921134844963605051","5164415023911968617","8766239476666558693","17823527722670731987","11800547690738393669","11741294187984835771","15407497351728087057","10894969649612629783","6659305514567923256","3004101727856257082","4153187987298574972","5075765946864412383","13778542156181201284","9839756514227310105","582750339312539289","12781190001511547168","3752773452352377471","2362275669899259321","4576290986721016069","403257097536258434","12820251866347672232","4726975094181034717","15536011525674374481","2552004862681776937","4813925702016179040","15374770446007266634","7232961705934319543","9540582420735276363","2403845207287650988","1957873419391839193","7079932334190107179","7375075808678462524","7911553154306748828","16554775983637052823","15943055940608989333","8809411066792092959","14126128184458728930","12239610607911332743","16304140044273602107","16620888607439271657","18403630219252840544","5651379325396128917","3538776852765944190","1236348144379034535","14897540673942789341","14863804776824518544","13453549507855362894"]],"s2_siblings":[[["12910700170889633192","8341250901273262678","16962731416412521558","168789268044726697"],["8888831216989542294","13610343173258544526","17800395499546735632","13737700416543423873"],["1960017162273099965","6189602496131278674","3015266576526530790","9684480893596421546"],["17458004641329069215","16309368952172270961","12533478354652717286","6796809465629348616"],["9315689509390027673","13958337186989760655","6899151120118764996","9009041202460732933"],["16691261862479307810","2205890572530340151","2190145352103080301","1233469739593378062"],["6771320448350153525","309481858727653533","15067573047273937601","9240447112071882043"],["14793582929361524713","3052806719209760587","17730083032547971192","3898018103174361780"],["4399717810399125902","13351282028702115476","18373187900818639508","12112865328164949282"],["7635182160068133921","1734605990718392418","13797445605246562080","13558735903559231372"],["14812979136679360654","16043678717501741362","8285207809974837376","14051710148866729802"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["2563120376099360041","7920353404852745900","12130430058641853991","13707303739851061431"],["12584943424499105856","5286721966962371124","5081847573269322645","6347779105146018065"],["1250504346003605041","10272906469079712761","7561655897621339200","10512219738291728770"],["15464728162987070129","7461510267620442112","12312759252324134278","15946556142404510581"],["12870209865916427305","12577439572409056527","12705978551460621747","13980920175460272025"],["9873616109959326224","14495523102776796886","10224393761679872071","8086310029481735203"],["15725641563280347946","17505205338208102329","7439209280769978620","15926389998031375403"],["14157420383421689351","624721715462277418","14264909371667786322","562471709535713953"],["12279498004868200928","11264449809652980256","1050558361735300940","2864510600345998631"],["8459726271011674055","2698742952034729302","12743821095287144915","2076999551453197247"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["58882406104557824","15968553876311331821","15222175348216306290","17479567993023786217"],["1392152699647841820","17745321619981684629","1828034275904554116","8066400299133670848"],["9238610934035255675","3799761798807453065","16496666624734706682","16979918622822693577"],["10274256960323449384","13327416392519908327","18389139424967113365","12056688852721015773"],["6699325410401364395","16048243229044531478","1294011634969996052","7496911659754221077"],["2060718369054707591","15938787275857371284","13758689194885634341","7187695943451341566"],["12147128469279039586","3923160342796967121","15831899056505564165","4930982714388688289"],["4385957727804555193","9111750361476257526","6238649660366432122","12231690893521525321"],["15650700351391100939","8257806801830104376","8630747921995173389","6131389907544455516"],["12757119648874267395","13262606963116007990","18040637744405218204","5026195076659660839"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["16201599496227316594","14080773721903810779","11226593953986231057","12878412170745923835"],["9213477655681203846","13396428510057576712","4297100369845119422","14262154864487275275"],["13190521116608662277","9767689209395921959","5448162694156935486","11523829837652773929"],["12682685481896521533","16568734633435348492","7142565917896110754","14856205646211507397"],["7581188046845905466","2780704214246890006","10022276918648605873","7241151771377461071"],["7270802324674513761","10466633967988731955","3185406434337770106","14812282600591409276"],["15456487845190843910","13928011312468661657","9538783643442683807","2385020360407800995"],["6087219725889018423","962152984402578951","16021236896585451178","8952612687786973881"],["12279498004868200928","11264449809652980256","1050558361735300940","2864510600345998631"],["8459726271011674055","2698742952034729302","12743821095287144915","2076999551453197247"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["11579239044718108925","13591714197212721961","4257030391859981656","17157114012957982588"],["12309384041604561688","17383597003107213372","13683029252707832897","15833441665511248770"],["2009188074903885966","10916850855335962860","10714788432004826038","1216364122890496717"],["14913593059666200360","8152793229625689184","5991947396631562166","3928028531270601057"],["11151439697694202919","5335920671059318898","294749673398307501","12352796950689295785"],["15310376588747309329","5316201953549368263","6562642897224631519","15635865855321585358"],["12206360093653266790","10419807072501619249","2884535146199596059","514816363560603913"],["1933917427275778758","3643639659794508862","5381891342304121093","13904523913927406357"],["5626041568074657024","18296529460611538982","7406894127534612331","1892684585253171603"],["7635182160068133921","1734605990718392418","13797445605246562080","13558735903559231372"],["14812979136679360654","16043678717501741362","8285207809974837376","14051710148866729802"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["8256172773383880972","2092513726132814599","6942121166838791348","14186955033530681653"],["4168743906549284985","3439668424504831770","8375417268460396730","4041954237300840510"],["13466739198204886821","15839182532710078492","16934373434091416812","10642143030293630522"],["12518183571177684092","14344263232981541983","11916555783427910067","10198643879135229101"],["10045437520321206071","5431868151457048028","11042428178553409635","14612338419251243199"],["3375540447866005529","13794636104407505540","4442259447382526703","9500591695894829695"],["3419239791354939284","3089790907143099669","11847151928712619295","16709633197906907143"],["9064985713212418457","15542151627422501148","7798184680670956207","5467498666823511590"],["1915667968429759256","11343966630536913116","18442972726150972010","11149395242087457864"],["14797488865317378352","4751883191177614402","11506107798425473265","13554042410928476404"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["13989032413468632640","10396787429925308073","4291102912965106547","7036897421179251777"],["5445248871858482899","8156589696382569727","6665809725075079457","4240581868155315398"],["3279923933331583955","9311365518477796950","5912648323885113554","10676929273494410291"],["8965312585684935969","16996649379519582577","7499284254816031558","15499239815362127469"],["10456991497025392586","18289777833522179351","8513455145056812070","13822521972416801561"],["4301779933228382110","9917560170563957908","9388385703079638580","17723297344764566746"],["16387797813406326035","9738782057666469862","1439641596021623020","8435987892946887233"],["7823680502436849253","18116935815647771114","15577985031326484254","18312573661102316924"],["11804161225614006684","15819550584060779272","3029128549265497322","12078686429077700310"],["12757119648874267395","13262606963116007990","18040637744405218204","5026195076659660839"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["12132476889999911390","9864588675759888424","14530629684441539347","1987370727370055923"],["17509182258318945414","5557850225467610203","14169028492506570679","1098777504128206848"],["9438567955629906299","8731059899626443849","6978173625640338331","15130976024315943452"],["2891227095733787153","2857512218780173545","1681121969232963033","17670405246211024102"],["10450073828189092063","13075598308729599876","16839465618745552668","7044813880672365882"],["16691261862479307810","2205890572530340151","2190145352103080301","1233469739593378062"],["6771320448350153525","309481858727653533","15067573047273937601","9240447112071882043"],["14793582929361524713","3052806719209760587","17730083032547971192","3898018103174361780"],["4399717810399125902","13351282028702115476","18373187900818639508","12112865328164949282"],["7635182160068133921","1734605990718392418","13797445605246562080","13558735903559231372"],["14812979136679360654","16043678717501741362","8285207809974837376","14051710148866729802"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["10798427912073505918","3524764325032321318","14577011625469365532","8876346009966653886"],["6871859608890268935","10401641975395556338","12068501175304648931","2290784595187012123"],["8375624077134083282","17887251094414530798","3493982203388223702","13169651072472238808"],["16233726497606755650","13113285309698553196","13314895346880638231","7803358641133529211"],["832797357186407001","12532851695746766952","16123834833508378237","6998447966712073375"],["7470427207455107220","11133788303750274615","7562518839193341660","17145111340405476440"],["16256977017527355129","9065599213215115049","1976377292497571287","17284900326067603711"],["16926675042795584679","8310297195642709505","15909512416461800264","16106174098251882512"],["6344500488735479540","17883867983484279515","6505523674361210260","3268362553975346944"],["768972721341025602","7027124115053296293","2907669192493184644","5276455257401918086"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["17407897935712303056","8075976136817923468","10884198779211743058","15824078099814890573"],["13306715696291145090","13304742084706521157","7689811109036295131","1541185707523582435"],["10111082559786097886","8112976853022203571","7889884490227341999","8505904481885319335"],["2162064925865227262","158566696564954440","12377811281223996561","4649372627310316399"],["17161970511272643687","10575874599922932508","9901090242467198262","18188855773382730529"],["13504581496866950646","14792256490460151274","5685983860528819381","334601327094747953"],["7076058489987633200","31796606788685333","5473356297642265258","3367584479355200339"],["13982540612220715286","713813593476776927","6922783284326503924","8970397017018782252"],["12551671956837827740","7118748470339884852","6326801576214773362","15288427438389132200"],["5053882356949401072","18443442476874873160","6026116854652007889","6655507741308179436"],["14812979136679360654","16043678717501741362","8285207809974837376","14051710148866729802"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["10922820112139157558","11764243048307342662","1591253647915426612","241668291396360113"],["13985205571743873565","52957066404844860","16440291002528875247","14519016950850114532"],["15688935056976554998","6836732084964638061","9726044601371289095","6019779034947323391"],["8207580477739783983","12226726317574638736","10797737105801901365","18389721867490478318"],["2990547700273884383","16530850942319180129","17961517164781766755","16020405907112208102"],["10131714612896528598","16128115781778912788","10441750846161235347","13784418971343763337"],["6174797475140249010","17190650720404816456","8291438179931725759","4750321402758067210"],["10913994778506533008","8539411978756905952","10017252551981963185","15520698555323343534"],["15650700351391100939","8257806801830104376","8630747921995173389","6131389907544455516"],["12757119648874267395","13262606963116007990","18040637744405218204","5026195076659660839"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["6013213167725328161","17519504867280975431","18050900775649031898","17244940981630730906"],["10115444319897841567","988631438743696402","14533795714170096538","3115801674295163164"],["7678821738136240460","6072003629981909768","12233525165132807746","7792084962180882174"],["2722144550535274363","2915809829775435278","2104150359704673568","3944200097650688663"],["13640754699486926610","16558421060644141005","6322085131620330014","545403642356979575"],["11074825360315157629","2441412131507383962","13717264456749384895","17897409738632105795"],["4699772070704097157","5850066365570501845","16996002751160032719","11730485098608039699"],["2261776155002555820","2532103992969583382","6382518766353671284","348438186601503758"],["6178450455434850066","12300840896951259158","17476274814116032337","2001494559404075220"],["768972721341025602","7027124115053296293","2907669192493184644","5276455257401918086"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["15644695199375654195","8420608297515661447","14507601688721404005","8118023114867866318"],["11188222854018427679","4303566531178963204","12130257434176966425","11530021257798263048"],["1538067652031162572","1199478750686923549","1483902653419012226","15876715143257237836"],["6306358970781545465","1457072167573885413","14036751855993938575","3338011628529539760"],["2149845388128214814","11961456566884328857","7039291917727912638","2527788555643384048"],["6938633640930702773","4491483656704070199","12820640010056025962","9838221161939907150"],["143625685258726088","9522812134142753794","15742652940384977757","12676230414194725977"],["263619266780384403","5141300295445159310","10837407253712671729","9622706957275687891"],["6444041138936869607","3103986976769365589","12686289413028268267","3498123826339591996"],["5053882356949401072","18443442476874873160","6026116854652007889","6655507741308179436"],["14812979136679360654","16043678717501741362","8285207809974837376","14051710148866729802"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["4983453471737172906","7109759064453400360","9941963357329147125","9505763121498351014"],["9953049400616387960","7691139606666196240","18188129696605270783","4779087305584747375"],["11693547170629275487","15052193337729483778","6572897317747133587","17275943766199158823"],["13821179742663160050","9081111051737891400","10800924510188981297","4774032820813341266"],["5424244872811311623","4135051950013285611","13579606275351373838","2926082902392650491"],["5301461950415316169","2729278772613405991","9353419005423135649","10141500684711944081"],["2396725779700317488","15839515953695570885","16261834329357208076","1266551722245158009"],["15272394986725638899","9061672489250272399","10132570650903694404","558010791068365307"],["1915667968429759256","11343966630536913116","18442972726150972010","11149395242087457864"],["14797488865317378352","4751883191177614402","11506107798425473265","13554042410928476404"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["782038982131984525","7686687908271829962","3861431631128194246","17974515035017990486"],["2076928890046037654","12875383515942646657","9365611281139398506","11963282838734916377"],["15232386283284338094","14093231673908547879","276288960248633254","2009548978071142731"],["2270669897560291530","16370297134033462294","14830309518197834882","14571822024399148568"],["17966076568805310471","7176156003086487212","8633547260264858265","14063239700699929897"],["1281873893465239958","11262034486699875667","14222189498323942448","13212075991435563216"],["16290080548337248021","10512250162884405236","6993401676312807892","17272341271699439476"],["8159272691445880896","939548075124162854","1722290760282231323","18441355589280450149"],["11254090868685122433","6372328870663738188","10001047597563573493","8489808101790008040"],["8126097208475866239","12503586831009319448","2649170408184634495","7888247925876847884"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["8370946698449565120","6203579232841270514","5897230879536160878","16643225824699731551"],["5340931158007542255","4222021929355050517","756313077397930373","7295057648596023012"],["2151744520899576932","7018292337717713851","15162224843518777066","13214530682735842440"],["16837850823936374141","2417588315287459218","3686741328205661456","15321152118850032402"],["14757685876280329993","11824380341233903811","8156312688184205854","12257091115868872232"],["5700738390481633857","1935193832723236472","5218660106674076553","6110182108773353110"],["8576960439749001840","6318086539118767092","4395948012967301314","6113397821175750453"],["7612084234042534826","5948697202564902625","2800900239210409302","4736654475038779968"],["7514370853860122068","16426565921400498274","8745760926344118111","11548336553379872644"],["8459726271011674055","2698742952034729302","12743821095287144915","2076999551453197247"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["5327551742727541545","6437356810953506406","3622172788125681267","13571302889896187827"],["5928100169486203091","14463165928706617977","8237834235847696720","13670104943631225895"],["7435611828689627025","7923962655912542823","6853349993860261799","13581071314864584456"],["8694111780600792355","17934019596992367082","13788490277918996263","14382110885325024765"],["1812832566319646292","2012451497569312689","2954405078893038264","1552871409146086187"],["2482050826626524496","8742087178316040961","3119897607939420729","1737065097034364225"],["8613406086000922695","311206008570196308","13768001533744750802","4983487052664207462"],["17364857276367055","7276163615153166857","16631381798645556174","9118010507797169086"],["18425562782739507180","9784117601514985838","1225371099965402578","12492440102465123652"],["7837071881971312859","13293637901194201072","2682010460718277560","4846242103230062676"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["12442964191574505044","13685984527353141281","12288341383397985115","5456712111167203978"],["5511870434855030218","1197663214831518077","11170780790000305729","18145332173643932105"],["6654601657831754576","15141956789246306299","8540559463630431553","7526015783383675907"],["11779741850895813420","2444942107781259462","12993969104712999791","16295392172027792135"],["10652024741193244602","9594277692733245461","12629338289914408013","13628750987587273773"],["7386413002308916498","1398002393242314931","8436668821524246972","1702261028216858621"],["10119516689303080279","4193396742356057334","6418989879861076149","916875807407557730"],["15704966695459597153","12357135490738984535","9927462541496256784","6938040678833462984"],["11804161225614006684","15819550584060779272","3029128549265497322","12078686429077700310"],["12757119648874267395","13262606963116007990","18040637744405218204","5026195076659660839"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["8706224662703005601","1821937942019753475","9365239365479484911","16071181791649187419"],["9906874904709119464","5013420514045765530","10670766344356635677","5999221994115566403"],["6903383105065575597","15414746856337162162","1205478782783778855","4487811072983299348"],["6308815261269738761","8674311466590380548","3232393970548028268","16789239424658428488"],["8454094125736636875","15877417133571407592","396120792760572750","3317178905123947536"],["16134589323151337956","11161113227557218330","14058877116120070551","7558874037882405935"],["2396725779700317488","15839515953695570885","16261834329357208076","1266551722245158009"],["15272394986725638899","9061672489250272399","10132570650903694404","558010791068365307"],["1915667968429759256","11343966630536913116","18442972726150972010","11149395242087457864"],["14797488865317378352","4751883191177614402","11506107798425473265","13554042410928476404"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["1251008761886048038","11366752476252801202","17729702447953121439","4714482368267668908"],["4199897976193921487","8048456193117022138","7706105206177237199","1307602402689713995"],["1110440287157432313","5736989787963813885","2402327278524140859","9797706645639573835"],["1295823309266309172","677895980652091667","2256620194737718022","4909674061320317413"],["16217967628938332542","18401948131453132237","383455201970540701","1640530931967375124"],["5763474889656867799","9049837566113464315","3747881764202388940","17524674539851153991"],["11769960969661167274","16207206762167256357","5137576744982980716","748188379956418668"],["3418909888370822137","7433947113548911158","3223296050140074559","10347378275026654563"],["5963110488142632669","2462578356850262199","1514386247133827699","216075932574636292"],["14797488865317378352","4751883191177614402","11506107798425473265","13554042410928476404"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["17907385008437145323","14400089161472497905","5363180956701904570","9352562456507826265"],["2244620845981405144","10604679739666591165","1340874429058096890","9423138376074701008"],["4038126740520052562","14719686932149876324","17446350573612606709","10599346186086895939"],["509089257144349217","10154103477819340292","2464390328606263364","2629872355083270511"],["9794277920420924482","1357033817044249579","13275023886518366953","3222447856310242465"],["11074825360315157629","2441412131507383962","13717264456749384895","17897409738632105795"],["4699772070704097157","5850066365570501845","16996002751160032719","11730485098608039699"],["2261776155002555820","2532103992969583382","6382518766353671284","348438186601503758"],["6178450455434850066","12300840896951259158","17476274814116032337","2001494559404075220"],["768972721341025602","7027124115053296293","2907669192493184644","5276455257401918086"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["2888057891627359085","8872523800649364572","3566976343443130872","15430357205917732527"],["372222258147587672","8178696069767123068","2018135663603824816","11443619984260429439"],["813896324738735602","7277356659973970461","17114763550355159442","1725853449260715077"],["7006037205304200575","3684909692812061802","1638294211290292313","9031717367334327718"],["278810367418509762","3548819564484846157","13538886733696402314","2204584693514092186"],["9580463195170800234","8374403925281207301","4947433701800263131","5188300240972951767"],["8170141105052994362","10939523769129739036","10101117391200341513","8476183849310036870"],["6822205454626746000","1012924690317392258","3814227699407966102","9550386805894302557"],["18425562782739507180","9784117601514985838","1225371099965402578","12492440102465123652"],["7837071881971312859","13293637901194201072","2682010460718277560","4846242103230062676"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["9321754443195762093","17914217091514745444","5524687632122394794","2087490475026487211"],["4384976098976295795","6701657786743910999","3939301731206438525","17307417232566377974"],["405650766738032782","4010440111363515626","16552418255128894306","9439710126883476761"],["7627671106215136360","1627947748485202186","7171086605920907775","10014198761644847808"],["13338951032088824283","7890135104373470304","10965498064892184099","9546809560029884767"],["11343251886852519288","8465861360513205968","8939540660334649942","10533997228029733326"],["4425142931246843840","10237997316159627105","16536598044714076031","16013510348439345116"],["657406763266391684","4163269437979646710","16995213705332647659","2858314030273158256"],["17231505340037638254","2399488624275146134","654804282190270685","7339970733281472042"],["8126097208475866239","12503586831009319448","2649170408184634495","7888247925876847884"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["2401916325134806884","1264944454659050322","13419446606860970776","4619310455124796103"],["8651156190732188276","14503191693087204515","1936162181755743929","14588338798861559490"],["13452201226139768631","15956187152403685780","4418487663716331365","8399038973560281325"],["7660409511467186606","9180324482764124764","8808831760087102498","7018691213937128483"],["36677977191715036","1355256323509194344","9174994024865835075","9460727086034258379"],["17887169624529754419","6401377670683211881","8045563211222049581","11443761603293519853"],["15759623538154269361","8415918294089523524","12989608786743548325","18188612778989135464"],["18420393435160837350","3781922695580206046","14142521588545863623","2182496227615431432"],["17231505340037638254","2399488624275146134","654804282190270685","7339970733281472042"],["8126097208475866239","12503586831009319448","2649170408184634495","7888247925876847884"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["586401616617382878","4948292425245321790","15770022321740890439","6779401648184691881"],["5565109159701856259","4369938425670177798","15929285842951204544","6381789023899002482"],["17275842811041560288","12431892646514903299","15971781770705626513","12412656677421944697"],["13199992104758872872","3421120089715781467","10249380194743541077","4522351665692808455"],["975294240035502847","3684077947774958348","6367635720863812297","13808003936465105745"],["2970283208291325041","6263619090625919801","13667350375730328597","17260051691559472208"],["16247121910530405659","15418385108407520141","11662204961947426431","2176650411328773"],["12127243532355988877","10065010541160016619","11527277024023927073","3890590689967213938"],["6178450455434850066","12300840896951259158","17476274814116032337","2001494559404075220"],["768972721341025602","7027124115053296293","2907669192493184644","5276455257401918086"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["6227099717268004412","2959422875140352184","2072008497231562791","11132973609439254986"],["5143491448856684572","7577086560627841898","3595258283285220628","1774308771351065902"],["15409181898920748393","3285597269015503623","9381264587542298399","4842828755606692845"],["2224212690697216339","10422707665191440103","11080885950438788582","4452359449037619482"],["3635378558543545326","5458191432326859075","15422150732339507347","15391277100354057916"],["4488516803984985855","10280428731528116302","5212114659224578734","5626117000415119144"],["18076633528834864788","17782406676708932488","13904970016063607607","15494280401991218870"],["11885767226085811623","9528302381337029563","9714781033140809812","5755938205079401973"],["6344500488735479540","17883867983484279515","6505523674361210260","3268362553975346944"],["768972721341025602","7027124115053296293","2907669192493184644","5276455257401918086"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["12455948020411475829","8026261782754378064","13322044533762046865","2759512556280479323"],["2610479507109247061","10792386262189463986","3886615242309865863","8299873423441485011"],["10184554073969451825","8912378656863216585","15660652745292515182","7597086533353875503"],["10657557153782264842","17001558593503988260","7458311178395364531","488315275574979511"],["5791136549418910803","9059519645779075971","15430235187235115260","3949607648158787033"],["17676290878623230311","12741036914387936916","7299881761355157936","5916829565887096832"],["5257022172093513903","12049132111539995012","9288046738206273040","14972125345078042588"],["18420393435160837350","3781922695580206046","14142521588545863623","2182496227615431432"],["17231505340037638254","2399488624275146134","654804282190270685","7339970733281472042"],["8126097208475866239","12503586831009319448","2649170408184634495","7888247925876847884"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["2320477194487789124","14827057783806243552","9046629061326282395","16833591636914198215"],["16014767399769614216","5687506844996014908","16465194132399229376","3391381900805072729"],["4449556818382607801","2259397863289255545","6435709907590403685","17703340787630304714"],["5266611895581794108","10606470796042607385","13549913000865633075","1871528705500594171"],["15220101004145176760","11732915505669133835","7019806469722121338","12258126906087640311"],["13793321751188692873","14650028899337829560","16531220464791664565","16915921342268844274"],["15759623538154269361","8415918294089523524","12989608786743548325","18188612778989135464"],["18420393435160837350","3781922695580206046","14142521588545863623","2182496227615431432"],["17231505340037638254","2399488624275146134","654804282190270685","7339970733281472042"],["8126097208475866239","12503586831009319448","2649170408184634495","7888247925876847884"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["7205424551955849122","13264049557970071340","541376377160245498","17710341087527084216"],["11377184535743212300","17677698401079672042","6955094738983363469","10887353625278214815"],["4748885026259783415","13221129846643497575","11269314156084161511","16476264106775273177"],["9823206687513980546","16812799405779250342","4899329392319344168","13072343594004340411"],["7428324122774250580","11389357149093316994","2405140171011002673","12445451485316182565"],["10995845612582022302","7221315016456238078","8482357910692152896","292894105594144257"],["7918250796127595053","10506400476322670957","8300397423598528102","16872362388406402088"],["2261776155002555820","2532103992969583382","6382518766353671284","348438186601503758"],["6178450455434850066","12300840896951259158","17476274814116032337","2001494559404075220"],["768972721341025602","7027124115053296293","2907669192493184644","5276455257401918086"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["1310641496712259285","16118438859780238963","11894721621241327716","8829448679702073847"],["15419378326303861327","10604922787654179365","5903312038202349577","2921757902996167783"],["6256234034729458090","17288955875846337337","9857180987886078519","6331596800521720631"],["2116687789556506416","14457772785655675662","14456993584265553612","10209465297764251886"],["10785311886446147288","6544013143949111986","1792961469139532322","6453327231479833851"],["18095491272001073455","17708013080208408090","8158467922638047868","7643250173221393809"],["16387797813406326035","9738782057666469862","1439641596021623020","8435987892946887233"],["7823680502436849253","18116935815647771114","15577985031326484254","18312573661102316924"],["11804161225614006684","15819550584060779272","3029128549265497322","12078686429077700310"],["12757119648874267395","13262606963116007990","18040637744405218204","5026195076659660839"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["5182489325858583262","11084882319404897473","11562062514945097246","2988036999716523539"],["130601425712112526","18124861407135718228","13067505995628913402","5093858533427723844"],["7994980169127863712","10408953930821867724","1422728388118384353","15645397393556103732"],["14808996663159308957","8483998519885484187","11748671253347266704","7274052532979509899"],["12870209865916427305","12577439572409056527","12705978551460621747","13980920175460272025"],["9873616109959326224","14495523102776796886","10224393761679872071","8086310029481735203"],["15725641563280347946","17505205338208102329","7439209280769978620","15926389998031375403"],["14157420383421689351","624721715462277418","14264909371667786322","562471709535713953"],["12279498004868200928","11264449809652980256","1050558361735300940","2864510600345998631"],["8459726271011674055","2698742952034729302","12743821095287144915","2076999551453197247"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["9806279190628850641","3778619797240290396","10840178004888600930","1884110624825040988"],["2880495950283463343","4537779449631197084","5426838951327852661","17121499542658335175"],["15956924594704353415","7291389628432971055","13598402289189698902","16219853283543149398"],["14476747592625603728","7041604904772146016","12734407180519083336","2118568035835460804"],["14430241037758816899","4122410762974844058","14816823524764071156","18267825261536990047"],["14971177994192625708","16225455520571617783","15229277469583802384","2573941112748797569"],["8613406086000922695","311206008570196308","13768001533744750802","4983487052664207462"],["17364857276367055","7276163615153166857","16631381798645556174","9118010507797169086"],["18425562782739507180","9784117601514985838","1225371099965402578","12492440102465123652"],["7837071881971312859","13293637901194201072","2682010460718277560","4846242103230062676"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["14300569451379863258","3458103508594432908","17344175009333850119","17731235964139739262"],["11955933846006143929","5534552543416769389","17561740307856782838","8253470483048645011"],["9637890814006195760","504186385826648787","12537461986651991627","47374988123248924"],["14241253355140663123","7226914890110009528","16536016239279599144","4741118227860891166"],["17916297775783663620","12135460134749327334","13583784018908721481","12808369409954172088"],["5135900769570147605","289542259263172673","3324389219514310503","11627402318123903730"],["7918250796127595053","10506400476322670957","8300397423598528102","16872362388406402088"],["2261776155002555820","2532103992969583382","6382518766353671284","348438186601503758"],["6178450455434850066","12300840896951259158","17476274814116032337","2001494559404075220"],["768972721341025602","7027124115053296293","2907669192493184644","5276455257401918086"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["5643171222390091254","9481484415021222764","6726585086120142685","1275689457030622722"],["8685784821774213920","6208979984825802089","5754301480973898228","9803299480483651682"],["3919124806206796017","15942271383856773985","18157759827837319719","986363126206112314"],["1386194392806679227","8405120592050761067","14902076800111223560","16836771621632017691"],["9081027668789800613","7994552295603238792","11207039853991331869","529108941883951681"],["2482050826626524496","8742087178316040961","3119897607939420729","1737065097034364225"],["8613406086000922695","311206008570196308","13768001533744750802","4983487052664207462"],["17364857276367055","7276163615153166857","16631381798645556174","9118010507797169086"],["18425562782739507180","9784117601514985838","1225371099965402578","12492440102465123652"],["7837071881971312859","13293637901194201072","2682010460718277560","4846242103230062676"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["4057258890129542345","16561082033067762439","6600761916479685850","13851350171409213957"],["7693228436474152143","915108389640428864","12362877778099677751","7069958240963841415"],["5691498164402814448","16794568902557181953","93078408122081006","5388299369445463711"],["14571410381050222650","1294867821488229316","15284786829743766170","16074133537109079110"],["5060801846208318589","9321884291169825857","5300636263292517228","12291096715492352310"],["17482283681003393940","13231807010130038395","8438931307699854795","8741840598264666117"],["7076058489987633200","31796606788685333","5473356297642265258","3367584479355200339"],["13982540612220715286","713813593476776927","6922783284326503924","8970397017018782252"],["12551671956837827740","7118748470339884852","6326801576214773362","15288427438389132200"],["5053882356949401072","18443442476874873160","6026116854652007889","6655507741308179436"],["14812979136679360654","16043678717501741362","8285207809974837376","14051710148866729802"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["5995126140097878620","10611139274489818106","16397272919644314629","3457341412529967908"],["9915184897041287971","7522364944451149421","18097095885325402010","12982080339809081858"],["9292284912243693963","853864106558026251","10838022217408532693","127901298912213756"],["13923113430130287692","14864542885236403908","14515501128822726866","2807538187607246268"],["16115397061793808410","14147498081304329075","14990728905326346977","6127531230510765916"],["18162627647624621483","17712891942761942583","4171562712969280550","891759093536723770"],["16256977017527355129","9065599213215115049","1976377292497571287","17284900326067603711"],["16926675042795584679","8310297195642709505","15909512416461800264","16106174098251882512"],["6344500488735479540","17883867983484279515","6505523674361210260","3268362553975346944"],["768972721341025602","7027124115053296293","2907669192493184644","5276455257401918086"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["8436651322078549913","7844290172793745121","3086875108708180233","6749246785229967694"],["13935122843618603472","9825369741644990676","16785060918917358561","1852762975106516832"],["4728878713547705188","7515289858876362889","16263612727167550046","6700418176818381127"],["3154984576550930531","5232496149886396314","13055324377054987408","8799177319106812007"],["16519758214122542275","1334901805062973480","8063202940935187802","8604658912014603660"],["9028966259531229789","15144607472695906933","16248162586729748294","4679555336619276684"],["13771491674790809384","2438778221393082947","2817368431013385512","1188360322584637134"],["17364857276367055","7276163615153166857","16631381798645556174","9118010507797169086"],["18425562782739507180","9784117601514985838","1225371099965402578","12492440102465123652"],["7837071881971312859","13293637901194201072","2682010460718277560","4846242103230062676"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["11549320493840684657","10633217544959905769","8811190103697428623","8125826347469462507"],["8900293564758978035","8767028768129310535","17893886812244514336","2605644721277341271"],["4679389513684742461","7500266180373434639","3987178397718351827","9204080272009008915"],["3404146267629252087","2092537036389628205","14051743362714748327","17051639361710651567"],["2771616131068381186","7489379063509580569","7861971141296285973","2938944965283789788"],["14188978185639124101","479643036698096578","14225148279048392219","6746832583595085026"],["8217357833441694063","4305780299100362320","16670798883602964267","9447090123664133694"],["657406763266391684","4163269437979646710","16995213705332647659","2858314030273158256"],["17231505340037638254","2399488624275146134","654804282190270685","7339970733281472042"],["8126097208475866239","12503586831009319448","2649170408184634495","7888247925876847884"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["3786092693728707347","17231722049124605351","17520346434861828100","15066200289751774288"],["68335213715739886","696652101807264612","141437719728219655","1398723959453704654"],["4458435457791704254","5906555991134522018","13593569056581314635","3938241737744826548"],["4485398881612180859","18142576875303033296","5235412179492916927","9919100428998997912"],["13748641298757404890","4317144240328139908","7412909684153112981","11545078232288578384"],["16451866606663373136","15823772310972963742","3813380184294796180","683346968414151981"],["15713122508400896605","8759291551237176939","253880862803308562","8402401517438361812"],["4680569295910225006","442470934662575253","17953903201137499799","13410146116148814675"],["7514370853860122068","16426565921400498274","8745760926344118111","11548336553379872644"],["8459726271011674055","2698742952034729302","12743821095287144915","2076999551453197247"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["107909686176277241","11174559566479104920","12913935984215605990","18215759830391308034"],["7343608859595457650","10030341336320770024","6709916056855884052","486811327778669353"],["813896324738735602","7277356659973970461","17114763550355159442","1725853449260715077"],["7006037205304200575","3684909692812061802","1638294211290292313","9031717367334327718"],["278810367418509762","3548819564484846157","13538886733696402314","2204584693514092186"],["9580463195170800234","8374403925281207301","4947433701800263131","5188300240972951767"],["8170141105052994362","10939523769129739036","10101117391200341513","8476183849310036870"],["6822205454626746000","1012924690317392258","3814227699407966102","9550386805894302557"],["18425562782739507180","9784117601514985838","1225371099965402578","12492440102465123652"],["7837071881971312859","13293637901194201072","2682010460718277560","4846242103230062676"],["4847783285695856518","17656508258335839757","11683349333556303315","14384117262422389228"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["2359330566983733331","4658022698960617265","7285570468534027936","14612561515220422028"],["3036680757188057006","1341575612664010725","18345353645102310574","6894158939488777397"],["13218969572721750700","5474447971621567902","13965538966878348723","17374914337271817966"],["15083040662325243272","18055317821029385780","14931089989562808842","3471637519796951854"],["13272176776889572387","16262550779873943414","1454002348858594010","14993605757658187842"],["14639839276841671507","4709942644899722145","17791781404646724662","11558066025205995521"],["16247121910530405659","15418385108407520141","11662204961947426431","2176650411328773"],["12127243532355988877","10065010541160016619","11527277024023927073","3890590689967213938"],["6178450455434850066","12300840896951259158","17476274814116032337","2001494559404075220"],["768972721341025602","7027124115053296293","2907669192493184644","5276455257401918086"],["14062657012758084673","2246458765212044098","484293894605527623","13225989257032582806"],["6640379426348466459","704057393001651436","17505614700719447512","4623221130106439489"]],[["2829656271616663139","6469925744522190136","12813212393714135433","1785806168046975119"],["6668398781913676474","5553977430731737548","1112595267950209815","12076947898241222548"],["7947507601497207629","5648465392498506900","5426944611179949181","7684771945234355000"],["17286442762566031002","15585092031605307135","241938445923032623","7890795540331099712"],["15395203453477751328","13017940244636643111","9505598382560790087","14109549840068466369"],["13763707384835011038","10700397227551156482","941785217917735270","17685364365133737121"],["12043131666789620152","6542728853246274611","10407142163228182780","5384588784017737512"],["12193051951824305122","574623854783438693","9791641970482909930","2611974731245512782"],["11254090868685122433","6372328870663738188","10001047597563573493","8489808101790008040"],["8126097208475866239","12503586831009319448","2649170408184634495","7888247925876847884"],["14530195011478101475","4570553954619258587","6945472970723131258","4227703748200330969"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]],[["4635078061144584609","8799513970189337331","10810344079056748772","5920718639299038101"],["8895859493468893792","9074592888470518696","10562171654991482743","3413668536545131968"],["12478945531932940555","8635051166671467795","4027217868430086958","1635010911158303967"],["16487190583429620404","5555829412745633972","2637264005515367648","9414855531296631881"],["15461679897502451064","6733838801824013268","13039083782829639445","13334541725791371382"],["17371205429272090604","12422304589526153824","4783078233595195855","15409077463067218642"],["13535332763500497533","9589253564006628743","15184492983993981248","9890565767985746910"],["15879504785339752804","15265108605415312593","11166262459235192949","8698500214814051182"],["4399717810399125902","13351282028702115476","18373187900818639508","12112865328164949282"],["7635182160068133921","1734605990718392418","13797445605246562080","13558735903559231372"],["14812979136679360654","16043678717501741362","8285207809974837376","14051710148866729802"],["2861117285556679336","16916586552803435885","14221621852726353855","6735748169131667875"]]],"s3_root":["11649765916760146131","6395166390457118026","11290101138922807208","12803908080942250481"],"s3_vals":[["5012096181818672309","10582361338976622855","1491478118312898807","14161474674162130042","120318551887800718","9866100734753911195","4205785209719835325","2974085284379691346","6040276192505740137","616965369235318673","668962274612285876","4339994262636561640","12890290806952257977","10714838213056422496","7084125611781408641","5594399020096614044","9893418640472655363","3614007255475038532","1727644847986261225","3769703185275274576","6484069139201448182","3257897852716015872","15563198457549982119","6473862148306185612"],["8827333132579985495","14472707366066425844","4660322492258650019","5554894141289283237","5787453237747546956","6107314118537289401","94354058661764748","17391368230054295069","16168439466617291309","10291646859650588140","3813443878833006426","2691263872714820882","5991338574701289594","10237105922356296281","3565734607568361508","13241007379489136386","13456025041138782529","3190949816452078647","15092145077649421194","9261765978177242371","10324906339038797088","17492052210826401303","12545712340943263609","14021228674570920319"],["14589571501463620158","8853248979168479542","1289701330890655729","9867600415009444821","15888535104849201432","12985877086497620877","6747115417372770271","5340153211930523739","9947035722041680065","10150906051577841413","3538184124008118406","9952997500648091225","12754543227360254357","82888833655340266","9063508985215529580","16075193174924455014","430761229433517408","18031917495226422384","1008221283125957236","11753230617643358231","2781256825102004403","1715250279287177646","15883284813115240654","13760995919739764764"],["13055515287847890260","18147429082190012176","15329406224209840111","1819942992879092380","7386230232695755704","8507310554231541850","7585012222963203207","13836896285214975126","10411386368689367804","6303928853039774994","1284446753137817485","4550899175625630244","7992624548097754658","11484796539060621250","856564569381614321","10797469844595925742","16945190566734771035","16692911877183231011","175536097016219703","12867629753039336963","12858966609511913983","15206785026098933018","8985475210808290587","15364762604454703335"],["16529154451880390758","7599665298682684777","15959957245557186717","5099917689841925294","11875626572050442788","8209931546590099164","10661413710924053649","6000519499524796011","8214321947404316817","9356961593702667764","11587321875903073383","15210004235932551466","8186775855536837179","4944175645360651546","15387725401674767975","865625164316492801","14825547648470131993","1421850638331411473","16932314167420289903","9612183218493422431","3310933633391956585","16634343387751944200","5650352957932291554","16600008471758480769"],["13261959107544173027","11069764657928502266","18026992775126697709","260842042862016919","17162340715499473989","6261972224074733234","5077730035007918967","8611115439459688490","4102318313753616401","4416233118042631084","4561467400123946928","15434949626271940475","14242070051364398528","5437285588908252140","9247584684066305194","11618944538350035696","8587554907175411925","11230776222949558231","5959889655681608223","1581200661999789511","8181665497023921843","11404234225660612881","4410777000541354297","10097774204361855096"],["2244287473643748409","2802009292632294069","4749220724863634139","14709090709813671719","3106616156784808229","11608564796526365728","1955135504990970771","4518747741620353480","5370009260462383612","389065980651139096","41710495917900941","14503687229449289770","673042997757731063","1465271854955910499","12159340524344596004","7226979191105442016","6652549614936704578","9610120155610728847","1772910760537724542","1887879952884574899","8274705821320341008","10846527534974393749","7961463855626301049","3025569491838473021"],["7873704822458736413","1890815009643795154","1226453162427485993","4343952283449993634","353420113247754415","3278078167774157272","1342514494186215596","8711616201472693753","12215386268091986542","17977501145185169133","2512860660734427733","11626396750990638606","15027859558237469707","12423991353949607331","15005891177463362517","7154184861256403993","9202025660940339000","13954370051602564078","10266041909177287148","8462240834500661578","8112764638067746922","3519483098418841329","13925389705243921797","9977417573623451450"],["1317141688923652223","2626463833001322613","6640687916330445949","6380160026764883311","15371862008854769609","6383299473577525486","10764183377712260555","11185005596581434386","9702444838837695985","15665320178713551602","4557890550794819713","1250021454684495036","14150759205127363299","1244087386943847008","13115215610352895855","12710100921621371748","8830216106431982558","8676499501781401975","12134647531566732610","229101891900062124","12243898990954157387","7967150519945329882","3287807107664117595","2717271887628191965"],["7875912861056570882","13705452200602246493","7337726651206292793","16509708940550517949","8649448857876220395","4829772725718640384","299887490630357129","4751720856081629474","6879979462310937327","7454471366783828038","2299268252074254025","7265327494295924537","3856151443808839782","924921846986614286","3079217967818089259","14181259316989548397","12292823211777455536","13113382012098129556","2285732496021630254","8497094065660346495","11752681217043281363","3822422526220628713","3910510499697221347","7456943853958795292"],["10722727544067777567","4089559379726955434","887092735468165126","12692514492665624651","4681617001691649466","11722736983283108906","10418751332224733265","8210192631003867800","8088876032726575505","7546031289438385762","15319040419762531412","5095560736780577188","14932139832890989346","3085252018282530579","8534458067264399919","5321475887843611044","11819288301217107889","16841246142069085902","10820837160608270169","16159050235782423002","10293810672299134625","5908181128449477877","4355627352678933089","17312201491988915726"],["7166244797032014269","8373321596822091903","6516396802311354977","18109873093738668712","8975554028113289484","1059420762817683222","589727270782289721","16316618030992262481","4160525413197188149","13197289880179154606","4342348953673591502","8680617036818191353","13051617455512561389","4854263349849781372","17297015915711029839","15191626567235868316","12945054820329604380","15411217680388938414","11693883786577230255","2407696870723084934","1307239167380923882","17087288739124522336","14027142540548954182","8812257707795036555"],["18346003837055938432","8114379607016526400","13657254114360549994","4428234485531338708","2543773942544385224","13496412564191438511","9441900300746190741","17278118813203396253","3420213868320819260","7579830438872019821","18291317316708877180","16098065003606062804","1559783953383340961","5960093090543652827","16903445419442902146","4115029278261342508","4893499647806353624","15491214488670263742","16114285891941697601","7127029283568906784","9335565642367530471","3776030357336333548","6338108654444937183","8127507796118936973"],["10801199907392935395","18399049096625932433","8627501856743882416","18430604004197028884","3928192009187755576","1370381590527608715","9979818350514177128","7091433618469400391","10801663473920631335","17283199816835104895","7232743878265370485","17494481311259125437","2818668447858901177","5219084513487364604","10197662238468624932","4373492166988215249","3751106073059168211","15035439108524445703","10522003302426343820","1212517773814263518","14931338747500551986","14968603038503924855","15217961898808341198","8181608491871341442"],["5070375825091921763","18105040141716531246","2699847125450680925","17447923066818197264","2081296298127933809","1718379100962975116","4720669056971638545","12007523458087471086","4687952689310148145","11291145015552374127","6336788621759180155","17608784567373537900","17174749192837330427","12897140726169968583","10213493105451919974","10705953238575361494","13696518668886116789","15474556415640227178","18335205840190599049","1714683879962921211","13519816389258374178","10523915311567689504","15284579263213165348","8134260474122646440"],["11249505221008635274","17193689638473280738","11168693849874651146","13541694404120920898","15032158050163445244","12199930267055909700","18355617062919121397","5153902768314915277","7869270735886585263","774126473166948418","9631845927041833358","13222737672945115813","6313646714970015561","16375291596625080982","8455743979729080037","7931058102691254172","9370427074181434994","11143307035562956041","17375575091998124066","10969430617759661350","11062020656827115076","14180741237031293467","2375523165387033737","12248048194835115334"],["12938348810843558621","10495214513441598438","18405063931194994525","5807037917706243037","632288786010530276","5037818811102573879","8170018849725798889","5362240912644397338","17002311494548144589","14644617673674806532","3531968689030616532","8452725920199888154","5151661281611821797","18212051004795917277","2596786403426969128","1549579391362442628","3222718374991094589","4416805881664823177","14350075749868287935","8244386901081711313","1896809346813593595","7512738839071869071","11989004255919667248","2776956682130191641"],["5450011540012978901","8547876316482452988","16608990661768826986","13495516265364022018","1554586535546125315","14775463364661513675","12742889490637232660","10866719023676971172","4779065713449974136","2390301039729183722","14862546307430999301","10709560911501790490","14522206601677100293","966776628736457556","14393617282178109042","4625600241329393596","14623237736078024580","13780817299361059923","2081279830600758088","14441819822858930456","4055679333049623764","2408735626908525824","3961685278459178892","3679072167903388236"],["6051626667102927780","17159698073259399929","17678529766402576676","13935597655126741740","7043562007476201577","13487956971409279607","1793669553363149941","2231507227940467150","9200873898954058435","8840460193764739214","8327240150451613355","13879807033874503916","4369231540351406580","14238684258195485324","13137757103632479584","5325438555774542940","7131677479961746090","12085255364162237105","13664452271675634478","436410332014917401","7482943522740988019","5963172593333457893","2431680793920996344","443511817104036091"],["15333448502419462327","16254263614516309566","7736700755867461153","8395830092578038751","3634168576328963540","7693093971051342949","13468367103914799655","7183992224571008964","9873478121781528885","8919076143211319036","4627845402133397794","5886536997691513657","4737998002005424383","335293332391821609","7579071154870770222","5925229746410654321","5297938126335546226","14639531421640200861","5666436505078920682","8589389888575180671","4836979952967353413","388100147730437953","11149195077708696000","14169950009798528765"],["14051299157596729475","12253224057149765287","4109385172529658207","10510079436723158115","1370415882491497958","15067283035068026563","14316917512563486798","10064611673189308589","14768311510794437380","13183870596566675451","14932626102830025995","17196155774103242949","7361164317353966012","16235913098514928625","1331108019614717709","15144127952576238142","4598406866383118793","1243445135760369858","12911194189808991332","17275596702805577769","12351159097621481335","15006186846437347742","12882114802032262449","16776217040998378275"],["14530373266200459163","5041156009540193105","4827272639135733707","7310149175780127898","11465497203011656475","5185405908681096148","12706817281316473799","17153675853232059896","5598561199713718755","9991003448556674647","805877445051869268","10292359774327383122","14251636771515889259","10676315780657454720","5519089048141637829","10470212028781777850","1899474982107230706","6201890653326840643","1603611989447815377","12990510651632229973","9430244846124375764","16830100850040834442","4630014069763072986","11179794375771836018"],["7640963093588797319","232820918781877828","13063832906373468993","5874530374844964446","4235904762357046747","1310323903756453028","13138645268566998223","1822239748606002862","13494592792680882785","8996277179583544718","16219878685596574850","5639052085129943444","5451437821817980799","8915002998964024296","13111321365365717182","12716718037659950329","17537007963119119427","15332043485409135253","14280164957526216194","6662894938646020718","9483986450053404631","3317741127007964216","9620645217185764027","12713771561652053399"],["9687056794503774852","16433609089671530308","15404984750779979809","5397456787718268041","7450127773161201076","5352303153300036923","4330269078989981170","5876757370732946455","839439707076081233","13443670301044483220","17091937031572463951","6385269166440392681","4994324967344345465","15073318644595606882","2858805416279143316","12333129133711820002","13529343350236326351","7008790403351670269","18378184849631160139","11992952046098473131","12720247889992849864","8818394826540156190","14955961575098766260","531345682509438634"],["6234063483782049685","1157728087871003288","4812708055157046318","17808157810508909811","5123159241758083229","4128016743038485764","5573015972872060430","83648038378377638","11463357148584006876","13600497272437942544","2849973889294399382","1563169053529848481","8991184149835305428","13325430733486361853","4265239478822244378","6310597233520486112","1752727970242249876","8101858244277694956","13037114782891584097","11050092573088690774","4483333151073012680","16684741737715287882","2491917676841426963","7593641408347801847"],["8825720430810661522","850936952486515255","8757837959587594850","12775015484986851361","3256326037987879001","12098416151315660444","11519065267322817860","14249174878340059956","3534714186612105692","9141418535863755911","9874420741739597106","7353231260134791690","8868209264990791781","16082418489551424096","15593374145179260582","501564330006659435","12912875150057248857","2017354019170548211","17520618062864325671","8406709254836495285","14100119515368213925","2422175511018613083","9464552009187091349","543078984867936857"],["17467328952562431012","10227268331820774915","1268615526312462279","17845991883830188150","6396751410031191483","18387435253680779393","1522970979030712375","9099249940545086585","11819386048563137505","17638140702824802730","15130775663484183699","17449830872749888199","16824544466322681589","18352974651160934692","9232783308022872706","13253667813878877354","9672787883409662453","9072838214348001377","17350964302931348936","15030286929321738120","2840733887067452434","18078741434281950918","16266600332262307215","11115149785593532164"],["10763420894657016520","9636487479878150247","7585336297957647954","10827991519448315136","7549712684892536371","4728248991072539197","7607299574287303217","9342378315641442252","15422378392986428451","4125465432185592713","13646252110296370164","15057172463023249704","11054050530637979006","9822491383636392765","15477198860689630990","18233126250625480127","14705304467333307116","13396613197516773411","7400322722426302557","13041451995093900702","7784961781266389130","11583415175092057654","12862341628013314857","2637792936412377416"],["16591234292887661219","1881399840790480256","9532461681078541995","16863357014670411114","5844295225792273745","5310701134910522247","11941199920714895590","17170804401607767817","517308952079979368","2936749124473812663","8068744509501917309","10908191250613513228","14637944741430926379","147880434695739230","1614587672010451103","8712124713067300687","12394940479043620651","12088224171413249812","193268241427135167","17906008676895388751","17267171928266632217","8112519172734353843","16885615856647268519","13819389352537181685"],["3268108042528789456","8003725140223157404","17698201541502106105","9882466753343748774","9459862469432911809","2357697575024888900","4313528559940536873","9914593465141570127","10389839771280147108","6329292479995407065","14875960974610494728","3899702575992647516","4450719621347413473","16687828795377090921","1826714986318149938","8093071290974398104","393648701567835817","13751814021658011939","7702407296124735471","14957957031046149191","7092041703730475806","7038622087493290646","2516987975365560820","1450794126296342033"],["6234063483782049685","1157728087871003288","4812708055157046318","17808157810508909811","5123159241758083229","4128016743038485764","5573015972872060430","83648038378377638","11463357148584006876","13600497272437942544","2849973889294399382","1563169053529848481","8991184149835305428","13325430733486361853","4265239478822244378","6310597233520486112","1752727970242249876","8101858244277694956","13037114782891584097","11050092573088690774","4483333151073012680","16684741737715287882","2491917676841426963","7593641408347801847"],["8165010079443550499","3110787674530538883","15056782403470378712","8397926364007224653","17278221992148401944","8081318465970237126","17960893692781823109","1120702014633292481","15822990535990511078","11936664749808316540","964222777849003468","14803301270341212160","14640240190959390115","1077145068248201930","18190163318171507609","1177129597329663418","4955900639110628308","67987983888607807","16346844874775945899","14599994405596270555","5198817581353365068","2165466256694016084","16805685107768066347","6676102876125124806"],["17102004290368529607","87192905998038279","10102170572423899310","242293032569257737","10156960378172184215","6810352228456826173","14700002824126115030","14517654971743401579","17591759765067643072","13188521211088236527","7002135129359115543","6407387609128061188","12181793932286904991","1547570538700725","3491990082980542873","9913989292285213402","10823393054352534967","6367844518915423904","5491334602969741814","9554263392988755331","17572291140832905812","8458392474551801152","7703196352535861938","9612983082727922236"],["16559259451231986551","7621170888757028036","18393879336825145270","12926712269099642889","16714305845386382516","18317306070047519757","2492280330042821951","18365573562959662768","14821676344573180998","17665348300991219937","14850552049938774694","7276664873605586907","1871834588194313874","16245455726714152437","1829043234137422846","12145675243159426731","4971131652138986204","10345020223928431800","11381499287724993460","2973187111842207835","1330699998940184810","3716163554500754267","8447225162867191213","15452761048401846927"],["17102004290368529607","87192905998038279","10102170572423899310","242293032569257737","10156960378172184215","6810352228456826173","14700002824126115030","14517654971743401579","17591759765067643072","13188521211088236527","7002135129359115543","6407387609128061188","12181793932286904991","1547570538700725","3491990082980542873","9913989292285213402","10823393054352534967","6367844518915423904","5491334602969741814","9554263392988755331","17572291140832905812","8458392474551801152","7703196352535861938","9612983082727922236"],["1890525405961296289","13889052734221708311","10699435569416919625","1477339114401399454","13956869304819990811","15495711144714063963","8353597138312337239","14929603196340631509","13464613285221260828","11329687120480119437","17994165340834841145","6910533458529467163","17594330975630709965","7163756592085462376","10731330188479888961","7907081336606079899","3568022569800743535","18167964803744868306","3383791812869793566","11664484898534371885","14735608895085105906","17325428534249425254","1749646889779827237","3497416415190138890"],["8740783981063921199","5474680953192125999","12689442256316456916","6348352119670319823","1096592910411362246","17527824990689348572","17749907130457286816","10963406218401273478","11352579494139389391","11985150847396519796","13420822397092042433","14012154183620547240","13776093361585581291","1115381578477170111","14243892922035128686","9212804530634532762","7366636064980167467","3877366357958114926","7642887155072640207","10610629677919368612","17475978114900127109","15149043570921763047","12117365027254395461","15369816605213304876"],["11927007551061828270","12187921468783212791","4918293561664441678","6438743296078655912","12104493780035008364","4105614695671272492","8473693694741411807","6875790003550385922","6453241286926188072","97170157428342285","5157920411743860867","6182836240301309403","9015206077003559945","10779373942372023896","1370529755967450801","11817708210902182925","13460596173476649941","15796065033027131349","4590705924984367382","13613527089109315611","6960005803159323930","121106345046020935","8412048868667777579","2373768052709900770"],["5159672384824941173","3667228651695353118","11527423968415568386","4339625833396310445","2527354534307067803","7588839733414363076","8192494929025500376","8375641979194908183","11471283154139227347","5487278685803653827","2459801927753640398","15482074149729151283","10948894141716893996","1554060043755856158","7538227083058683774","11746885954245278838","7318049213278785199","11450784428228284861","10336838386422664823","9296728299891242177","6313633207964878359","15910136352414112053","4590356868994820364","15023262052698862996"],["13219337093778189123","2350159855873458200","2538287309030995991","2771110687861432117","16658328769350679872","5933743826773829937","11791942659252386528","8797009669449620538","11907570180571247740","18366679310944956267","4488430265043070916","13194406252132059481","9185684556566536190","4565543755900825066","12371407309400128476","10915155377115075289","4963751118134863449","16500782638090673052","15702522406058961799","8583438361578375217","8730128105004350369","5116107527007218839","17377752053611871783","17907807447098478907"],["14231007967101473638","11124346307257282716","14568839485943864479","4529611664147514361","10581989426094100514","18398789203015918470","10357274529464165729","17272449590221997527","12561092983273310078","7183413412390693085","6667711613844447898","5254156929617810797","6211975161893250524","14822312143624794290","10560678678762136778","10328682293767626450","15348625840202672590","4081576413672491938","4037425439091044415","8498693729451307823","12710732181264563263","17014568338690973692","6015430843902150052","14645409348455933878"],["14603905713659888347","8475520424015077805","8383484757958997926","13769234471547931643","9441108685753789616","14819083746197511982","7366777817988834267","7027679540057892198","4801036932129103220","10325096895170951420","3419269123260259255","6813938405220129505","14372343591360032889","16339438553901662970","10019210808082076973","17704404857048104180","6742128710373270051","17526023297489371742","7184120302343669518","14264153211784029692","6836988894031098631","15463819981796941378","11857635663558912464","5223952538558577957"],["10740387311115001212","9636440455542415585","6295680128114553287","2982084685193674715","6887664602431955192","2488347533528887312","7242523028511925054","15988093427984370646","16840939645807412264","17466306796812049228","3819458424968134553","9382994015394930675","12899003923176941501","282991419171325043","14444422497666899773","7974390360290648274","10662618294369100267","2809364847461684900","1567222375564021892","16767003038033944454","14322982899761271248","16244297529203239733","14835253761351248284","7560426045891332065"]],"s3_siblings":[[["18124491375350635560","7300501732506482255","13735952874647408643","908637841368420394"],["17799015343604637904","12382298854638976519","8178301433146503205","15011541023179110878"],["6414853420177794188","13031547914356309181","11695311684292293346","5268108152937328876"],["9389878279423272464","5441633556225635657","12829650960751244992","13292575610445375010"],["1258458960192155104","6192790092694864088","13879856893324471449","2930601895710479284"],["7773186267898467965","373422366190974208","2463541234068645568","3339053967917597897"],["230506768822575285","17215915370869149750","1748155644132868349","17870651455862076573"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["1324360392790353415","4268248615117779834","11483259701893893756","16857756409630862927"],["11193121094691327256","6204182269448453364","8338667242234097860","17490076754716859829"],["9354246907880073220","851963035053873509","15903888516142413880","11030405607322971374"],["12453407928869622047","14239126719797088473","6751338756051889704","13698276134980998792"],["1258458960192155104","6192790092694864088","13879856893324471449","2930601895710479284"],["7773186267898467965","373422366190974208","2463541234068645568","3339053967917597897"],["230506768822575285","17215915370869149750","1748155644132868349","17870651455862076573"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["12526968661577343767","3585053034372726255","7663500446119819300","3547984050732839663"],["15803523153980062378","7797377902603399433","8667155682365491281","9825787111634515195"],["6177798984571018590","8033115033295300278","17033334645837095138","3642415077592238957"],["14346660675872739942","2100018198343184098","15110881866044729100","2386498818152804846"],["12500914466948312464","13152008316939006254","16675853266870224970","12295255178868269093"],["1393825858254842737","14939436774176861982","381540148769733319","1163148716152999363"],["13850053115219708438","13015752482905301170","15391101921465497540","15935597887496921989"],["711348966744739657","5918810761862836454","8574884053342972756","13060902214903747712"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["18410589896452045576","17767035105494545219","3784156230809652969","15593435167783244755"],["6514428663037187726","18092239893846771696","13328130988916759697","18169891644882720038"],["6943092117670863254","17449112498833586859","9636977994139486082","18346030930790835561"],["14712824679096081774","4163666095647459586","3286331188181620035","5179549209737226997"],["3025318085574500344","12901427301704566038","16919495633580067082","16662372649504994840"],["9015000087030061961","10744689811678733059","13106412666917868720","9886046038553752803"],["5711277287538900773","727342285480942016","7737014239540907548","16243127584674173375"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["15149936493687568876","17453784038387175286","15598331625884556778","6264854502220895848"],["8039913160218133355","4936766330555494898","2062462372229417604","16768943490330178259"],["5217460994324872490","46417571243332439","9379360353059487335","14090516677191226021"],["3064814495967205542","17217132010187804467","16048999469016378278","17244778648772548093"],["15674145878618315942","10973785493011425214","14840470597173851768","7928759146443070683"],["13667767536022126002","10196075214420685980","5227846050453573737","3457916431807127996"],["1359867713008588584","17006759314685973866","6926664701693169960","133232223217174018"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["9779951488349125242","5779899433971083823","13465120459821524381","15951355181042830126"],["14777085019303789957","13372692808120342578","9138335209504971411","17740052705563228925"],["10308680499692263116","6667447237755211153","2459582131211661037","15306940343299009844"],["1050054212945956075","11459108060003676585","5147169526389246172","17853526883485511305"],["5539223125067407396","848967461762660215","2821144422832094786","1256085740934728807"],["11596448265442611402","15499772492088197307","2765135079045647495","12138964367149096270"],["3948274970648263231","9174479020767225222","881073007750692251","9360365243237250255"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["130230316400426376","14673499195299276494","5215018679113099071","13195086158974451142"],["10384429726677388425","15315206436446191326","10660528933140013260","18317777096595980699"],["18241193936459996253","8168412663385405440","7084139727348128117","4497110981569323120"],["8890604199221619813","16772062829642365158","8506512433505914505","3651448548408978885"],["7240840283879214456","1078845458375839647","16599286836287264297","473997953457580641"],["7903798307448966672","13599018482732667197","1576206447339144783","6533881143897588458"],["9976046160245409387","10253283400276041827","16405211747732623470","15224887293066312419"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["5437112503936252519","904317982706361172","3367391827314090273","18018381394886360190"],["10886986464098324567","13433389369920753772","11260564516359179811","14500611223700186033"],["13185961720024497551","5579624845530743522","11763697627482971572","2162780529010910367"],["7783869076753274948","8474357727486725283","5266323429113056349","14623941409732492732"],["12775356159595491824","6132707352680998810","5943215198687957930","15546377812477550092"],["7773186267898467965","373422366190974208","2463541234068645568","3339053967917597897"],["230506768822575285","17215915370869149750","1748155644132868349","17870651455862076573"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["3283555693300680117","13989156245191602557","5370055469267141916","17603411822492627460"],["11927958461001642374","5295526525730049541","3641035016305992984","284216430654914571"],["5217460994324872490","46417571243332439","9379360353059487335","14090516677191226021"],["3064814495967205542","17217132010187804467","16048999469016378278","17244778648772548093"],["15674145878618315942","10973785493011425214","14840470597173851768","7928759146443070683"],["13667767536022126002","10196075214420685980","5227846050453573737","3457916431807127996"],["1359867713008588584","17006759314685973866","6926664701693169960","133232223217174018"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["4383334750597032092","7102238191465766833","6541459026671025124","9228711377844123368"],["14324179694392190879","13722315862199500014","9972140982061749846","12392372709771184817"],["16317880199270624755","1529351799665867331","17332276741204907424","7550376869748312848"],["4212323990405924308","17120708676029762102","16544203084957006519","3064793925666215502"],["2536570175888005102","8743512959723415491","11513785989792784515","10732033092078527556"],["7903798307448966672","13599018482732667197","1576206447339144783","6533881143897588458"],["9976046160245409387","10253283400276041827","16405211747732623470","15224887293066312419"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["7402823751704007311","15751171382734004715","3401135839821827610","13223898840534171950"],["14190620675085035681","162731764789207817","6767494636092919612","17215274204075243203"],["13152606023361537282","18058994306388706377","7120963326702198069","10401401808041918811"],["12942800642217550776","9269762081544201392","9311812038202750685","1293016398720553495"],["6997825780095648709","15686840135901633046","11018304176910000628","9647826297694606574"],["12979145662574144726","2014092474488362197","481108290001282487","2023290495036220304"],["1359867713008588584","17006759314685973866","6926664701693169960","133232223217174018"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["18063097516362674565","16718802137048758930","10976711790871138521","16450440993261054552"],["4869271418807978854","2152618193993366480","12529695733182074315","16275428432088527480"],["11006674146849986606","2865747550595109469","16757917777923362561","5037765565008358011"],["16976167246048864299","2138891444278964732","17532775324692948527","2577817068620113428"],["17104610863009139673","538331196419996799","861158104407183594","15105423220586110923"],["9015000087030061961","10744689811678733059","13106412666917868720","9886046038553752803"],["5711277287538900773","727342285480942016","7737014239540907548","16243127584674173375"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["5660028837108369243","9933065992668247452","2670994786205654447","17165728910662357059"],["11926352921403575195","10357276637710843021","16101396016159417897","858703256393929851"],["11608092255022006351","3791335986542562411","11524759247470184506","5925331224074958101"],["12402640969305632817","3077486149694183740","1773958567012917608","17005360385813823679"],["13393953534642750557","15331370518537429652","10117191392043545423","3799847903137609235"],["673770263533257643","7118865642947682390","16382718071640277945","7223184226116518509"],["15258390985660459179","13043894390505121620","10262610809340826588","10173314864537643346"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["14445842912582484778","1099013876931052402","8745418100716723339","11963425799124501022"],["7463963253933150643","15046731841267078626","9330276742816904158","7426167649805945768"],["12920391298274059049","17619218613232485827","13813148758069732495","17675810270084676942"],["2785359385281804462","14891997514903582722","8566777917560344276","3882117382777774050"],["3025318085574500344","12901427301704566038","16919495633580067082","16662372649504994840"],["9015000087030061961","10744689811678733059","13106412666917868720","9886046038553752803"],["5711277287538900773","727342285480942016","7737014239540907548","16243127584674173375"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["5054841243665428752","17348751521483840409","647499235518247282","2673418946293277481"],["1717263800045659086","16615664839160580263","14742852699093496526","4450591565064175143"],["10396782865495897888","9153321436259248776","16506812935311516560","5750189001230212359"],["2954640680315817910","11039209286506140168","17996426702965837920","10428665071493690094"],["1814780986033277963","6523133485690126396","7792845268755521673","15178896096915953216"],["673770263533257643","7118865642947682390","16382718071640277945","7223184226116518509"],["15258390985660459179","13043894390505121620","10262610809340826588","10173314864537643346"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["15607189942992506335","9312191343496315579","11984135011353470050","15308367513263559115"],["679954992047457428","10500529509051608891","16601401337449356750","13705400251221925660"],["5789192489267470363","10707061631538220791","12085545492880526759","1294472450064876333"],["18217899982877047351","15246434794088467732","17828096203744820137","7667631181122723285"],["13647310514710171304","14522327916306242830","10137534231160315075","12145128695409683396"],["645573830874016919","958229799808575505","1697955209212318072","5204669028118389536"],["12294971168873677593","15845135818056552695","6453140669136049880","10915750492393058194"],["711348966744739657","5918810761862836454","8574884053342972756","13060902214903747712"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["4013613283768654695","17514566787415834064","4969154224809830423","4378164371123873328"],["18079960775863162733","10032848856167335213","17778845720805263448","17908205543949777147"],["1366819211425428756","1906618614999095343","8211946580473467737","1779544490946075470"],["7051372263208099713","14486375415581163747","16661051744819806305","15591941980447712686"],["10860838693807679318","14494838824314237484","2369056575087445259","15735154589198175039"],["645573830874016919","958229799808575505","1697955209212318072","5204669028118389536"],["12294971168873677593","15845135818056552695","6453140669136049880","10915750492393058194"],["711348966744739657","5918810761862836454","8574884053342972756","13060902214903747712"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["2289304617135429414","12241845144289660011","11605458993896486593","16024170357537748198"],["7950813006891813618","5112901339625725230","14114247210796519039","5771739447725270214"],["10060854032237981033","10979757811130469664","5271529021603555590","8189112633049020006"],["12453407928869622047","14239126719797088473","6751338756051889704","13698276134980998792"],["1258458960192155104","6192790092694864088","13879856893324471449","2930601895710479284"],["7773186267898467965","373422366190974208","2463541234068645568","3339053967917597897"],["230506768822575285","17215915370869149750","1748155644132868349","17870651455862076573"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["15615520775455036781","4154997404437676103","2938250060704610944","1327638643492996639"],["3328654598388852148","15551418353219695887","8529555221579949985","2834840617844591668"],["1707119825851262277","8228075312400027953","3753661598526191411","14905270441175389452"],["13095597383960754410","16843020589083408763","10968552865113124323","18352519965729303625"],["14999755319819946709","10013054613573359535","6927731897102968709","13188316483028146842"],["2424751155961944689","14245945530209339852","8673082055257164535","12127347407110020211"],["5711277287538900773","727342285480942016","7737014239540907548","16243127584674173375"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["11037177437771310882","9353582542854123633","5111488437080881335","2945488822593047443"],["2212434407516308404","15934873485007557852","8071815146604995458","11866887900315262914"],["4970372877675156729","12819728038029916666","1366194353713731793","7056014687507076329"],["8868102943479076315","5250956881023072865","10050949473723591416","10593670539925050407"],["17290532505389547432","9467607547334747445","11109144226554552834","9481786500282927041"],["13667767536022126002","10196075214420685980","5227846050453573737","3457916431807127996"],["1359867713008588584","17006759314685973866","6926664701693169960","133232223217174018"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["8964929976632855106","1366666066103200434","15416903286263450887","16314641320886460068"],["8855705961288955442","4111980970099948856","13336373725204012163","14685333009679586163"],["10973191691973851020","10519664127190088203","17567653319644738238","6938726261988152460"],["14712824679096081774","4163666095647459586","3286331188181620035","5179549209737226997"],["3025318085574500344","12901427301704566038","16919495633580067082","16662372649504994840"],["9015000087030061961","10744689811678733059","13106412666917868720","9886046038553752803"],["5711277287538900773","727342285480942016","7737014239540907548","16243127584674173375"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["7664464852219118651","4620837276168892144","3101398546670080388","17304143888804750145"],["1717263800045659086","16615664839160580263","14742852699093496526","4450591565064175143"],["10396782865495897888","9153321436259248776","16506812935311516560","5750189001230212359"],["2954640680315817910","11039209286506140168","17996426702965837920","10428665071493690094"],["1814780986033277963","6523133485690126396","7792845268755521673","15178896096915953216"],["673770263533257643","7118865642947682390","16382718071640277945","7223184226116518509"],["15258390985660459179","13043894390505121620","10262610809340826588","10173314864537643346"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["3212835782346317243","11321955798750827011","3224364474049727260","11595007852261483083"],["6721026391331710084","5129460462672658835","2398186427766146972","16318060677561623152"],["16897167622919175732","9988395559416426193","5323820155365682640","2405079425566842633"],["13095597383960754410","16843020589083408763","10968552865113124323","18352519965729303625"],["14999755319819946709","10013054613573359535","6927731897102968709","13188316483028146842"],["2424751155961944689","14245945530209339852","8673082055257164535","12127347407110020211"],["5711277287538900773","727342285480942016","7737014239540907548","16243127584674173375"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["8197042263902866995","16940490771265653537","7349084966179382543","706580880351548151"],["18127428303563461698","5417436468779162570","12367628485503141441","13521593649699212119"],["1275781495180341976","6294385295970973551","1819753777647248907","16599875867418152746"],["9389878279423272464","5441633556225635657","12829650960751244992","13292575610445375010"],["1258458960192155104","6192790092694864088","13879856893324471449","2930601895710479284"],["7773186267898467965","373422366190974208","2463541234068645568","3339053967917597897"],["230506768822575285","17215915370869149750","1748155644132868349","17870651455862076573"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["5136544239761804633","12376967687402134077","6439631870244433275","4359845442053269293"],["17799015343604637904","12382298854638976519","8178301433146503205","15011541023179110878"],["6414853420177794188","13031547914356309181","11695311684292293346","5268108152937328876"],["9389878279423272464","5441633556225635657","12829650960751244992","13292575610445375010"],["1258458960192155104","6192790092694864088","13879856893324471449","2930601895710479284"],["7773186267898467965","373422366190974208","2463541234068645568","3339053967917597897"],["230506768822575285","17215915370869149750","1748155644132868349","17870651455862076573"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["16947312533017614323","10214851237327992292","1999039669796202214","15575093398997690349"],["8189154346685488313","992587767057579239","6788599116514712971","13259992060919376424"],["2316941484005320930","11385667458336285264","13178961789653073436","1585885868634099346"],["15745166398913099352","656042965453268251","3200071379484028090","6434231390419090642"],["6253072619472081101","8401913060864656223","7245957224670936777","7116102652382498350"],["1393825858254842737","14939436774176861982","381540148769733319","1163148716152999363"],["13850053115219708438","13015752482905301170","15391101921465497540","15935597887496921989"],["711348966744739657","5918810761862836454","8574884053342972756","13060902214903747712"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["4988108648453069274","5308581365102983814","15617177053785502221","17142073713273452437"],["6287802226716388282","10906424741989017341","16747462020147094170","16160296525904555696"],["12381737365769777915","8385357663205244457","8748816800454935222","16515948249360918872"],["2220980163692425675","13985256994095846667","1451277723574908266","7132848475887789725"],["6590227482109928867","15087504057985861074","13105305177047999233","13802195691446962664"],["1419904050603573498","5711846274758610759","13583903067728544315","1086482609117346415"],["3948274970648263231","9174479020767225222","881073007750692251","9360365243237250255"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["17512503474266470907","12537066567951506150","3702762178842084953","1536446488085198732"],["10829425762120873328","7099529880663297676","846449552078904348","3040611542113094905"],["15837855326850441263","12445662632624470805","5911451533581178885","17060675765638787441"],["3762520461694348218","4994846686791006721","11276076934887015176","9241469610665635225"],["14234794459585643503","8471336217173475942","895458026414515125","11078337229758755104"],["4487598130600735246","9326904595517228060","10798445646714972054","10681193279499167317"],["230506768822575285","17215915370869149750","1748155644132868349","17870651455862076573"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["486281304420575570","17248100602368717278","774323858598881376","5865747187893537853"],["14909036117725407632","14064171340589042720","9491039262542113166","7414608972950131894"],["18390301572297796453","6592959712980279568","5361884079587370022","16996660461601374395"],["4212323990405924308","17120708676029762102","16544203084957006519","3064793925666215502"],["2536570175888005102","8743512959723415491","11513785989792784515","10732033092078527556"],["7903798307448966672","13599018482732667197","1576206447339144783","6533881143897588458"],["9976046160245409387","10253283400276041827","16405211747732623470","15224887293066312419"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["3704044452656213329","8946572502851793714","16539425319078290828","14878149961569862646"],["2932827715003506025","7827497389143490481","16410659587660285626","578563401843499352"],["10828997651314094738","13800503878829343783","2149605106468584668","14098341994947634300"],["14826957380993122354","7845430730859966361","305151136165705153","13641406209772713613"],["13763386640553058239","14643223707215550190","17758720266871787343","9245744261034408242"],["17361058247979932800","14706511583489749190","9682174516669120699","7100352383556523667"],["9976046160245409387","10253283400276041827","16405211747732623470","15224887293066312419"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["5136544239761804633","12376967687402134077","6439631870244433275","4359845442053269293"],["17799015343604637904","12382298854638976519","8178301433146503205","15011541023179110878"],["6414853420177794188","13031547914356309181","11695311684292293346","5268108152937328876"],["9389878279423272464","5441633556225635657","12829650960751244992","13292575610445375010"],["1258458960192155104","6192790092694864088","13879856893324471449","2930601895710479284"],["7773186267898467965","373422366190974208","2463541234068645568","3339053967917597897"],["230506768822575285","17215915370869149750","1748155644132868349","17870651455862076573"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["6023905277655425085","15007389025603492102","11365269994590589967","17691716446872983743"],["7645180230806060753","9884047118088056047","11859465230357819612","5287605315945927361"],["6810296219070875213","16578182793651366594","4668584200578118068","14435702085918084167"],["14391925040106027534","12983795497693324026","9524325330644148146","13480338311922125879"],["16031007494928304939","7581749547260562251","15189426918561152451","1404565996456441142"],["14332593463389026245","13180516277715248469","11748102403865492627","13958830363279624750"],["12294971168873677593","15845135818056552695","6453140669136049880","10915750492393058194"],["711348966744739657","5918810761862836454","8574884053342972756","13060902214903747712"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["5509864527833193087","14720142988310930106","5996546350341734428","16646433154049294060"],["13536058180677339170","6527082372222773961","17772769735770022397","6984523913057645349"],["15003335854975267213","4046387977354589971","15596895215897058082","724105248364438317"],["1138021607097884940","18251088018795732534","6253360317990765192","10409456775419131205"],["16589362174741593352","11019674946081424724","13008315202180133110","16571016738258541194"],["17361058247979932800","14706511583489749190","9682174516669120699","7100352383556523667"],["9976046160245409387","10253283400276041827","16405211747732623470","15224887293066312419"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["13880762508581573391","4716388894734495414","273773535385061211","17800667400827467171"],["1631386147431580356","3172428246727551261","16212963072220604443","642720365135066762"],["8779917660732288592","14635531320898278404","15020791354346345334","16501215393292403748"],["10169600673965610883","6869351781967321706","2563193764375711913","729729465691255673"],["13647310514710171304","14522327916306242830","10137534231160315075","12145128695409683396"],["645573830874016919","958229799808575505","1697955209212318072","5204669028118389536"],["12294971168873677593","15845135818056552695","6453140669136049880","10915750492393058194"],["711348966744739657","5918810761862836454","8574884053342972756","13060902214903747712"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["5509864527833193087","14720142988310930106","5996546350341734428","16646433154049294060"],["13536058180677339170","6527082372222773961","17772769735770022397","6984523913057645349"],["15003335854975267213","4046387977354589971","15596895215897058082","724105248364438317"],["1138021607097884940","18251088018795732534","6253360317990765192","10409456775419131205"],["16589362174741593352","11019674946081424724","13008315202180133110","16571016738258541194"],["17361058247979932800","14706511583489749190","9682174516669120699","7100352383556523667"],["9976046160245409387","10253283400276041827","16405211747732623470","15224887293066312419"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["221688233831265657","5565800278968224732","2763057857509056220","17842754582008954497"],["2786946472053867018","5606085407653700930","14537515951220042874","2203854827055692770"],["13152606023361537282","18058994306388706377","7120963326702198069","10401401808041918811"],["12942800642217550776","9269762081544201392","9311812038202750685","1293016398720553495"],["6997825780095648709","15686840135901633046","11018304176910000628","9647826297694606574"],["12979145662574144726","2014092474488362197","481108290001282487","2023290495036220304"],["1359867713008588584","17006759314685973866","6926664701693169960","133232223217174018"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["11262276421996396352","4252958099959172931","17336789594542710160","3282489698163348362"],["16098546287713964208","4820984108038928419","2524163417030858210","850663441178964349"],["2808079171961736727","5426080321769873405","8458875165343810072","6605764022351812951"],["10254629941605621346","2479531593486636121","9566273293301785442","1462941757489272824"],["12500914466948312464","13152008316939006254","16675853266870224970","12295255178868269093"],["1393825858254842737","14939436774176861982","381540148769733319","1163148716152999363"],["13850053115219708438","13015752482905301170","15391101921465497540","15935597887496921989"],["711348966744739657","5918810761862836454","8574884053342972756","13060902214903747712"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["16366708856476682545","14565259977424974094","11217242836586624268","33576093666590982"],["8604582935894402881","14340532714898412098","2535862800457185599","10258364737506020706"],["3250050456678312960","15820826982444444843","11533698601076481779","2132690866154135079"],["17834193082580476299","5783793567857888547","15087439879130723592","10012487403485815451"],["16589362174741593352","11019674946081424724","13008315202180133110","16571016738258541194"],["17361058247979932800","14706511583489749190","9682174516669120699","7100352383556523667"],["9976046160245409387","10253283400276041827","16405211747732623470","15224887293066312419"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["12003548686883841078","11795218038744086373","17531853282195213983","5402727708572220237"],["4476262007075164474","1608469248225353705","18079195245348605499","6509493425973219335"],["12605483665453743701","5017780902655098586","18072723126294836351","3968967471471712305"],["13565792367464876739","7003226524431242415","14656676667119562678","14881299049790407972"],["9750026002429980474","7610096688996087282","9908001008169481106","13931221801614503376"],["14745189984086508210","12550881164856064564","3590745943848893201","16689210957933884394"],["15258390985660459179","13043894390505121620","10262610809340826588","10173314864537643346"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["17715398483705500989","4340906630994900920","1412398010022533713","3150151975792279853"],["4170460230933925255","1238416020159013623","13302157015880408280","1326918140120480051"],["10396782865495897888","9153321436259248776","16506812935311516560","5750189001230212359"],["2954640680315817910","11039209286506140168","17996426702965837920","10428665071493690094"],["1814780986033277963","6523133485690126396","7792845268755521673","15178896096915953216"],["673770263533257643","7118865642947682390","16382718071640277945","7223184226116518509"],["15258390985660459179","13043894390505121620","10262610809340826588","10173314864537643346"],["7041506182650678961","5003519583586065044","4594229622586913434","3457222320160724572"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["7706158116489012657","5555367864570234795","195005036597444357","5486222101491144228"],["9051049812323594254","13644509291874732901","12872946834438147513","12395506034585412346"],["8502628384533869751","17310450966657683360","872834317478732154","11894927350285211419"],["3762520461694348218","4994846686791006721","11276076934887015176","9241469610665635225"],["14234794459585643503","8471336217173475942","895458026414515125","11078337229758755104"],["4487598130600735246","9326904595517228060","10798445646714972054","10681193279499167317"],["230506768822575285","17215915370869149750","1748155644132868349","17870651455862076573"],["7915829721961258975","18278840530523764824","10590231990031518991","6894896487087679943"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]],[["16137413334759214785","4921598845603246550","5070504818773970168","12783607304909200522"],["10082905146023543660","17438432037462618213","13671903904088699184","816702003042591385"],["5789192489267470363","10707061631538220791","12085545492880526759","1294472450064876333"],["18217899982877047351","15246434794088467732","17828096203744820137","7667631181122723285"],["13647310514710171304","14522327916306242830","10137534231160315075","12145128695409683396"],["645573830874016919","958229799808575505","1697955209212318072","5204669028118389536"],["12294971168873677593","15845135818056552695","6453140669136049880","10915750492393058194"],["711348966744739657","5918810761862836454","8574884053342972756","13060902214903747712"],["10861893380534496003","15870360392857121807","17343223015550662605","4790326443700255967"]],[["13213665453674604837","2032527648889490613","11890412215949760640","16256938124418439901"],["7463963253933150643","15046731841267078626","9330276742816904158","7426167649805945768"],["12920391298274059049","17619218613232485827","13813148758069732495","17675810270084676942"],["2785359385281804462","14891997514903582722","8566777917560344276","3882117382777774050"],["3025318085574500344","12901427301704566038","16919495633580067082","16662372649504994840"],["9015000087030061961","10744689811678733059","13106412666917868720","9886046038553752803"],["5711277287538900773","727342285480942016","7737014239540907548","16243127584674173375"],["8952018639636846015","12414309971009107091","10942476001910263574","10169948013696442135"],["4286956842480602199","14997412037657470378","16521474169808481308","14029647879903411896"]]],"s4_root":["8596606954656512185","16139878724774143655","3070009908807420375","6884143007322977094"],"s4_vals":[["5974829980133225382","998897447387678170","5761401611142107095","7970811267823515566","3509388312332724284","4325002456199193805","17878849572583875207","2442438331315609050","16895194162227352354","16892731545773333535","16842549829493433286","14140941773723005445","3705902211465258031","13578324226763263520","14277967862594122119","285146907237865646","2574021390673001665","12004701169731705329","10768025357239755629","9118344660882756756","12828443534266994866","6127537897551174674","1436307116090906360","16659313198071064878"],["11746142319027709180","13020043758779329708","17371778210479087412","11602281924102554556","5331992832731860542","7375009246806911346","5944779249147041209","3294080090326366112","4612844868822046323","6015792591803883657","14834549230289161143","6388161223037316066","13900982480592124318","13826730446623753736","2254623225739365379","4459640050166058772","16032088103939382432","16787635371771629641","3864789582281581711","7247310553436605001","9915947273481075696","10381879703651970475","6055885632827329636","5532125013170401286"],["190357992138238305","5180215302062213178","3840556362636765865","3138343484827345722","5223615000444957883","1284956480535397954","14035842453645462416","14467678615233248788","16703263973628331821","3132766164705804898","10887904813978436177","12298122567160583860","10867680294240414480","3718333574348282376","11029220315638639724","16389405607714635808","15628389259678772052","10302968851750088891","14640506914975269156","7630130992635176207","15720759331534426930","18055832742797694004","16490396842058784223","17956320546940660585"],["15980327556525331283","1318740234875647913","17298784037697131030","9700425175160624909","13355610590003810954","8684659553631794748","5261526618573362852","16866951268833033338","17263369673365704398","4107128017281429300","16881541450296729414","13516608652216605448","9994529469898194923","3632108911785489350","13586055974336349836","6421496062097854937","2097203265928614894","3828195613014497916","3441118804122021527","136340652227914400","10206106779442986814","6017653886654856741","12461340894958284498","10441487126600714002"],["3315425535686243763","3453958148366561604","8762365025307178911","11064983881413241959","2421502581695296457","15411083338578596322","17118761990768415402","16618717010277124384","4885809878505327324","6149324071905124778","14919845808902976128","6785147971206208205","18131349294055958932","14630101226092894790","16574838202892004667","18062872862570565336","10425359959057751070","13739943144035836831","17778024073007910573","17446326881006342749","14529749861231534150","12933586412100157219","4348126682901896885","1362372419543255858"],["16793496753825074728","1722907052917064429","12293811366752864867","4147618899466363316","5818545498670128147","13042179452760240383","16834324572588865308","6809221978487847455","2936012682067230338","8231302666076125961","9906099137816280970","11469847774498254323","6026131539572201608","8506705017214139033","10068751224746756136","11600200692125804466","13432456253719319828","16584802021590378694","15795807579557918394","15655239402768955231","7827915803595161587","18253272572887317241","3608227823960113071","4209481359135890336"],["190357992138238305","5180215302062213178","3840556362636765865","3138343484827345722","5223615000444957883","1284956480535397954","14035842453645462416","14467678615233248788","16703263973628331821","3132766164705804898","10887904813978436177","12298122567160583860","10867680294240414480","3718333574348282376","11029220315638639724","16389405607714635808","15628389259678772052","10302968851750088891","14640506914975269156","7630130992635176207","15720759331534426930","18055832742797694004","16490396842058784223","17956320546940660585"],["12736713876957510319","9843801505439283728","3515549163495225408","15925164285052764857","7556984104004517657","7532660948954501983","6290619144302668130","17115560673534822145","6541545522466117104","3842705465078199067","1940628734436729201","418943082556073046","9033350452074036488","4801436258709780547","5085698911751216185","10816058445875304956","1645178507604246986","12544737992945237233","3733482382666316426","1978442483151824418","6161495484722948205","636190854293855834","11898375095268508175","3646398596770092859"],["7887112857683518024","14494741578130779055","12035119592711217891","11989805711499883354","12026153496311681034","3883867498215328361","13135178897021024753","15463071747413888782","13972098942233666793","8096801359959999775","7069136050018895465","13084395207703786929","9295500997144160103","4353673577100988882","9725629609014717895","16987225838839907832","13726555518869366068","17090369278322880653","16620586444700926293","7111811231507805254","1780727081470787187","147920351108259259","14615983057171976112","11717016362899558118"],["5915878303165445810","16064713979493373148","8943165600258809394","7332137000469727055","13533689054414668032","17927291860385911797","8412210725537763852","5360159859444148614","13898176897947200482","11246319038461155779","16167045576061472121","3226185415316048467","2266918696716972416","7861673881793781330","7772963305677612624","5132229054533562021","15395866012785576524","14578128059186475688","8224753513023184872","5262073470513570230","10064315596197898969","3550060435636235915","4531281285479243336","7511546277998540304"],["3433864150420123193","15211679525601174874","7632306995923551759","10021386930654871494","16230989709783538438","537645455126922532","2483347783201474038","12969460350945713502","3678319846466756338","12750027282925800708","6779213045907310765","10941899542196106985","14968804664424493997","10450835364826957140","11500726885183815207","17436533347507399214","17938382995131878432","11296868729770265275","1743057571347931492","2340276005588907813","14398959821673738660","8324212772386165172","3223591334267481510","3435723978312510382"],["8644907632138280777","8264567534924829863","18424353087672890827","12105704632713533110","10712994431446978274","1741721426374529765","5522384602786857220","14948233868173984134","319474599678031721","17178985028223780262","12888601817950880264","10946991657811081381","9685593504256283009","16033243902577945033","9915563545510189180","15787327342727616358","12819217030608085251","1275113414966973928","738833236464592296","12051945757198343908","13079220133667154836","10228266957802798465","8248893821782411195","12699289250119998415"],["4857397890950238723","4040731527880903126","16756925475986948603","1389337974135572549","2647502271354284529","16575604410819019385","8541836557026416459","1464842781553127378","10345616988994812827","13693372085200865704","7946890437929248388","15192336644094835462","220209656092467687","6239433183366633971","14332778199665121938","5638806160081084336","15554815258209555635","15094869525319434880","11205787399330122433","16302683228479861587","12025782259959833767","9226190770751786643","10812673744786911850","13603075742319667028"],["4726583319774334300","1462836439268304502","4335921762432492612","12649257545202411513","783444944774824166","5313653700451424257","4463624385493084132","17021302609530628945","13396753725042403383","15035833081533935366","1787990049972968600","13184689967579769229","13751317813621741136","4023401697493992454","3273101198292750107","9449765539894032232","8517503636401748124","9737729192611940877","220356985126444097","2667012411584229078","12034957038435425278","5269732498159888078","5459881292818730067","13451131897501169411"],["17878735278656698084","5672825888154642342","9916088479852980186","8770997635333568743","10525693546611641812","15983292329022183354","8942459434558042885","318628803985438799","13939142509732814312","18264806554604309058","13747205746046561428","2904812348690209974","1782307648946355169","934356744087623271","3783132618553197632","814204360671862105","15313619976908833131","13329159402850148034","12020385710813971354","8425927785327371757","273813201518321401","4785830361997483896","3297203356095536978","17424931442192302850"],["11758287567632872823","16050976816223263672","11740100257069278798","5410606287462210179","2826084932919565126","7777720715476916585","4180698128435283634","2078646919216682889","6038582178160047518","14214723767726178248","11337612474499557465","14527175399478515354","15197481858618649509","16847615463143000936","18179161124755544374","2923970770279556731","16521183017320260226","4818060446923725852","14912098165347589130","13784898722187670529","7321444792554395921","9565064124312195895","3561091563784817925","4111052774140358122"],["6195660369896088010","17272659591481554998","13797845303568017677","7029672340803901335","326689961665980575","6422212221697447713","18401784943666803550","1556492760682718795","10860458042223038952","5756766754502257329","1677106367727628688","9327973425112767053","5291129284983173936","10465775224065535737","14104980204940123575","13403231792273356967","1072259351529710423","9100021039951116622","6200386387267015081","859499930661828372","13340858687862080418","11110873362194881831","1589613640075557941","16535976794410255316"],["13572922355604753811","16810477555652278577","667248699650416049","5679554449653705791","4103779705885905810","5245769446076166897","10369841453912329527","16927936318848770449","4931596156350212404","17321041364921543089","5173703469057984464","15744719669553455106","15532796926848427788","17639617727770581056","14840571962625588492","11234493499130560999","11424508950515117558","10696372111070624753","7502676229081978526","2847745233766814536","13728989578120920213","9237458247670888821","1135960560398355089","10321048634874730982"],["8108406474647453683","11231957207439186768","7984079028328180390","14434164658582729666","11868297742043485710","9834854470337243039","15358238427001750604","1340541935510241653","17983113483579987969","2071548537534878463","18043626192967432741","16023682916803610407","4676837127129965265","13770233903996480676","15422686475689626943","4264949611286341426","5668859730657430037","13840378722450014489","15907925941510818951","13066387519590866662","3121200936748304448","8479469701274046625","8037071275302069223","4214876801886836655"],["13695954240979714443","5984864946839367461","1987827392759386463","3028481708750244859","5707722284040973632","707091347393996173","5281407950096187179","6918597050157071385","16337982241629083146","2579496820443695068","12176623810058162917","1563798397657514613","15855476869728404421","14293661924182340142","18363174390823144541","15963915585666595409","1389116516962657616","996556449634292752","11962165109185113892","17757851120577749179","9896667485199679815","8194034933789809931","3287683346056157970","7447167019372139929"],["4587139771559285205","4636928290770516923","11890564555441240145","11696328267913351563","6016514030599814500","16221517611474175056","16060017934429044080","12799858614866071653","8212097285684364344","3579798466366034651","8026727348902038532","5816522220977035341","5597781686250470341","10527405159018152952","2119064612852908395","2568515614362941047","4648974157291270746","11363303701304776444","12719573119176489772","8721949568799910468","7444037198630520851","12096282847772423655","11194725802403729274","4792846251884478638"],["14706477736071176986","9602033193251163311","13861848394514188103","6535769130101968436","7641731697545979817","2400210126243914098","18111971734334840581","5256263743421366101","18085242085337945601","8066768082909976802","14159917562751960530","17281807689686821685","11283119578979225965","7064244783254936266","7548688810450827332","8908450542479849559","15648420175235665660","13637705697888265303","8853944785960172137","4912954975164519525","10136713305380425779","3307306546324962717","4101781928489408251","14833214351261675605"],["8691991720687837151","17930346000702126209","5309523300688683898","4022282623449522","6368293900245150805","11038708072202663456","16112192141844804990","1461246080840194592","15512115253789495969","7855782986884502344","12942811098027898616","4675726307854326964","17578594024761795274","11171224107799268109","2721198585090332595","4579273586547979497","16744087232289055652","16653053022995293080","735160342828633803","18382912019406261754","17252017043600236206","15175267625271915115","8961927940882672196","5038387591760908145"],["5980598878538946652","12394331282319516028","3282681859379133903","16889466298948239061","11585904355566665638","8297704841365206078","13426748513827218500","3195512762386182577","14772473914085894071","16590903418677077134","17113470059183094674","5281194838172473969","12307339682871542348","18014678268025349144","13316432405079749124","6907031321735783577","14108825494724387761","9706683299892189574","7339304502856885734","15856276120211069477","3643803283082771541","8277319124090773748","12908913793004132564","10474587978030810644"],["6441508802350172208","3403361788504569016","11164460001975919808","266823736592977211","11644727715297834584","1330264141541786548","749570937262253169","7306205338326930557","14443675227843687724","2725661887821410964","16184452491845985582","4467000121795279424","5720165176689750987","8341497282651995420","15913502359478613952","5971765794005661718","10191188948361019874","15073972175148567661","12442884368439312740","17116721191350154353","5577294369861808262","5598869142641592287","9787465824974503296","5732958588359206177"],["6441508802350172208","3403361788504569016","11164460001975919808","266823736592977211","11644727715297834584","1330264141541786548","749570937262253169","7306205338326930557","14443675227843687724","2725661887821410964","16184452491845985582","4467000121795279424","5720165176689750987","8341497282651995420","15913502359478613952","5971765794005661718","10191188948361019874","15073972175148567661","12442884368439312740","17116721191350154353","5577294369861808262","5598869142641592287","9787465824974503296","5732958588359206177"],["5772476766076496607","16573788636949441936","15696209793939879199","3302330695897857755","15506982838431101691","15771124050307201446","3644813454720709232","11878124572737577777","11037377999628841655","3716076251791276236","9262973593959008066","14706096076291643895","17836582082057327107","12623640018727378521","7709089632377421679","10741596275530481528","2858433318039478177","18316511641903561092","11688903358078794031","8165534707133519610","8914188203045466929","1020705635655577901","12584144628722764101","6123082566641571348"],["8299394888114301362","11977613417070558894","12204252328622916527","7768987885234307242","13406258268952259767","12437460371769258475","85898061062382095","16542489933042702679","50734756093666981","2430178687492338738","5245324189550142328","9795198721638851065","17851583690588399600","9271184936094702172","6618055970864205974","17430900833151051938","17247879775127881602","2314266003135281032","6134777068363867544","3757450212130324423","2296377287579733521","1626893820726652460","14162120846914407439","16165899471027838982"],["14915516545183491636","4967676086086000650","9983049040878549916","16122543521381319376","18195419934596670470","6326227780943653340","14128587949459562305","16433053510333049059","12543452266661790399","17034442276835792846","5146927805787741390","14719019125009358022","17143713577968429363","17331000530978799006","16109462229517734247","16868299267445732753","12469751109984377071","11524463470201156001","800275761502512435","2292553721993628864","605272383411402074","16667263274911647929","3086606087685468573","5012849647227406368"],["2771010683554563967","11871895121092829430","15008233890000872735","12582530601540467171","37118721438810628","5564726801427127622","18217952805456333010","1498936329989095952","1339435259755892770","2516997473069073087","4501291211543884187","11520445829780027350","900692780043706164","1361793111766239236","9728433469042373572","8828851728356260360","2446731403995465600","2533532025949509069","11635936287791359180","33351102272670014","16362028167345308838","17717971327482973125","5822699507250125668","2735516894398771636"],["6441508802350172208","3403361788504569016","11164460001975919808","266823736592977211","11644727715297834584","1330264141541786548","749570937262253169","7306205338326930557","14443675227843687724","2725661887821410964","16184452491845985582","4467000121795279424","5720165176689750987","8341497282651995420","15913502359478613952","5971765794005661718","10191188948361019874","15073972175148567661","12442884368439312740","17116721191350154353","5577294369861808262","5598869142641592287","9787465824974503296","5732958588359206177"],["17774623754534147791","17741615096103479897","6541223793917040729","8554995532708523764","4262132547184408273","13994907450078652064","15256753226181201176","8385141386136100546","11208690545874267087","16243268277293365133","3402389159351273743","14044232174344237227","4129582084489769807","14161062380159418052","947973018591806823","16979132976946575494","17259334303690630760","14836774491257738518","7810806610849166604","9349186737036931954","12917875140239222687","9154870667671402828","3372402883545799512","3876565352155260641"],["5587717667461855266","12364149688855273671","13031978701424719107","7795753112470805768","15663125154429509093","153822412258700105","10212138881765166597","1167543000058768495","11527391754700383879","7499506516255167999","3331663280047148671","11646269787420416584","13725921194127045015","16954446285348652433","2256738088758608757","4778530569426410272","16480341951726260166","12348712719885029361","6025248154177375854","4566203523055809822","4346065798794558782","2928021341346240098","6659539857365868981","3198039922327381545"],["12736713876957510319","9843801505439283728","3515549163495225408","15925164285052764857","7556984104004517657","7532660948954501983","6290619144302668130","17115560673534822145","6541545522466117104","3842705465078199067","1940628734436729201","418943082556073046","9033350452074036488","4801436258709780547","5085698911751216185","10816058445875304956","1645178507604246986","12544737992945237233","3733482382666316426","1978442483151824418","6161495484722948205","636190854293855834","11898375095268508175","3646398596770092859"],["5587717667461855266","12364149688855273671","13031978701424719107","7795753112470805768","15663125154429509093","153822412258700105","10212138881765166597","1167543000058768495","11527391754700383879","7499506516255167999","3331663280047148671","11646269787420416584","13725921194127045015","16954446285348652433","2256738088758608757","4778530569426410272","16480341951726260166","12348712719885029361","6025248154177375854","4566203523055809822","4346065798794558782","2928021341346240098","6659539857365868981","3198039922327381545"],["7497846312134223027","11174535124172777676","1929598946041411639","4220644316132070265","9374438906954345247","14804106322932259504","12560411494973420942","9905016918905159321","5581367120470176133","1524581751943546913","11658059392537771924","1860147832167211671","16597242481025742154","6074287011152761981","17019344138049787271","5712897493471989154","10773769216289534062","6272887640661769700","3981565270363608081","17860329653617468251","9978594718056843450","8718854976933767895","12064526361044065320","4575221009802482574"],["8559809057879277541","14230280084770864288","16155892274158848863","17574260674867824280","4609850348001718584","9813476597206572239","15114535635830611041","1002569913158243782","4082159613521757805","18226020327306185367","13618817872640367884","434911519070023292","11232828158867647955","1067098187690353818","15537874282717466493","13016877848807642900","10753858146089831699","8291005955568932443","1296833316347716715","14681924714461230662","7369226062947548812","7805693353032948445","11117976399310610271","288366623589252723"],["7887112857683518024","14494741578130779055","12035119592711217891","11989805711499883354","12026153496311681034","3883867498215328361","13135178897021024753","15463071747413888782","13972098942233666793","8096801359959999775","7069136050018895465","13084395207703786929","9295500997144160103","4353673577100988882","9725629609014717895","16987225838839907832","13726555518869366068","17090369278322880653","16620586444700926293","7111811231507805254","1780727081470787187","147920351108259259","14615983057171976112","11717016362899558118"],["5311295030019741060","18165320624613854811","3616657266213960175","3379726460597469047","3211168405582183228","6777778861240014787","16138250062600530647","5528671687725548527","10948810796314004769","6717407659428414954","11834905411789337120","15195220178069134158","365101640197001041","15820650291334754885","16881488779794861473","8523384163034672917","17398622551354620034","13081978886283182763","4285199772282407969","8945990403325365881","14013672567664381219","10513130111201312823","1439239636109135575","5513941518002552169"],["16793496753825074728","1722907052917064429","12293811366752864867","4147618899466363316","5818545498670128147","13042179452760240383","16834324572588865308","6809221978487847455","2936012682067230338","8231302666076125961","9906099137816280970","11469847774498254323","6026131539572201608","8506705017214139033","10068751224746756136","11600200692125804466","13432456253719319828","16584802021590378694","15795807579557918394","15655239402768955231","7827915803595161587","18253272572887317241","3608227823960113071","4209481359135890336"],["13807626349596988406","15514483340805452795","7274956548812358324","11668491210182977851","8515870156440534527","11835047554150828797","10192109909517482896","10346705046787074452","9976631478795477229","12290541981966980547","7698027158253207163","3511541955516482760","9837522794874313502","17399289671386663824","4533981466932660264","7871462010017017019","3659304784159018270","627211399939034888","8478467509000931974","1655087030141853047","6586951587382820969","4314617224202355512","6393965643676039205","7086447572366030927"],["7497846312134223027","11174535124172777676","1929598946041411639","4220644316132070265","9374438906954345247","14804106322932259504","12560411494973420942","9905016918905159321","5581367120470176133","1524581751943546913","11658059392537771924","1860147832167211671","16597242481025742154","6074287011152761981","17019344138049787271","5712897493471989154","10773769216289534062","6272887640661769700","3981565270363608081","17860329653617468251","9978594718056843450","8718854976933767895","12064526361044065320","4575221009802482574"],["6978808731574875228","12956722240003119650","411866971086931297","3536568923627109638","15449696523640069595","4015182193445067458","11353711776010574143","10952227528345830637","15609306029388935455","7823867956133432658","2100918687595550924","17400985910202753056","10575677820543450487","16763927359454411558","10245989456735893536","7688732391549660554","13917070125728987465","13834616199377495431","2610272734067627025","1796356426976081955","4558561149535432376","9943413977636764409","10476338787270148158","13495034926838567304"]],"s4_siblings":[[["16556821511383972025","3270163173091285010","10058327711687609283","4753680043018971560"],["11956109093828843174","11273682193941242610","147887162416473654","2085404587224192547"],["1935241197433743295","9767733456568356019","16160824911516391739","936969359123890785"],["1372179300458101271","2383893733121972641","11562763748930236494","2411859267292464968"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["1318731059548398651","10323720301733356563","17070417110901630290","11772674229634931688"],["764729356200734616","9832226425491231458","12460206797806578666","17882069861728493698"],["17451115916220819198","4519097160635606226","1168336365873033467","520918089591664777"],["17633059661802426660","2978338877252000565","11054648326663691022","2335592812969650306"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["7673908738295500832","10563892045774251246","13227599522948792574","13263641253964918400"],["17942451637729324369","16310151840178612552","11044215559905168370","16085636237504498380"],["7606224260110009630","7377442281754374783","1145856655706818014","2378384818471500604"],["11914392232579112193","4334750181063126675","4784608308542393511","16839538027006284881"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["6891590567581285051","17986586505037133512","2059471595226165109","48025323140642981"],["6011153053123689528","11775485721323458241","7060433117437176821","11322355035530682397"],["9406685491907265029","10208565731984129505","12661165626958473275","7105591363936147138"],["2128697520937206245","1768959857516669307","7838795616630443042","17026471917692756613"],["11057091302981689464","5816590011048596743","2529092560052915500","14559156626600861408"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["6290889696087393856","5881811721949943091","9649444911737980135","12857387717929632813"],["8828681056833893522","12927337769583119730","11175575193482605008","17369778241567536985"],["2422349760306731297","3237333305029482223","15554547118624923793","14161698564265530752"],["5022997249422880461","768605754366034622","10218099086664579359","13522684221486532402"],["900125451014656574","11763881166729584898","9983276908969871300","1445992903531822757"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["7008708748671088580","1735343252369523483","14441120771121640885","12110610250050208109"],["18266300908708286476","18430624595358184193","16791495134486693881","13820385793287789278"],["5474270121036523201","16731587089021423887","13506068112461182612","18427608379605597542"],["2753111502754105743","4372731372209120794","4492674011632465493","7930090632887006632"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["7673908738295500832","10563892045774251246","13227599522948792574","13263641253964918400"],["17942451637729324369","16310151840178612552","11044215559905168370","16085636237504498380"],["7606224260110009630","7377442281754374783","1145856655706818014","2378384818471500604"],["11914392232579112193","4334750181063126675","4784608308542393511","16839538027006284881"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["2148643538820671540","146348817437645847","9122948970944725877","7329444689124922599"],["7402347686235827242","11222022977025643522","2661264409222515584","7576710012842932669"],["15675815305838567610","17357050537071299196","11205576126890446865","4009545466303029968"],["2753111502754105743","4372731372209120794","4492674011632465493","7930090632887006632"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["9044607525855070548","10632132108963375547","6893882130073544570","14025838862139234772"],["14273335304785875914","16003731348529642001","17632189028845286712","12272786887807262711"],["2422349760306731297","3237333305029482223","15554547118624923793","14161698564265530752"],["5022997249422880461","768605754366034622","10218099086664579359","13522684221486532402"],["900125451014656574","11763881166729584898","9983276908969871300","1445992903531822757"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["7708478037382122549","9584250773514309026","4338869351225280845","17468899000011767349"],["7148917396231613978","18316396437445564977","11131928210110411697","9823220634004239249"],["1935241197433743295","9767733456568356019","16160824911516391739","936969359123890785"],["1372179300458101271","2383893733121972641","11562763748930236494","2411859267292464968"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["4379419623559185792","10172650739007659572","13384246025496543039","9767842672972019444"],["12522170323415766132","12556495256288572472","8397539637108891504","9603041333651196014"],["7217313812018054288","9617379621385946320","3644411866509012285","10107035693641340824"],["11914392232579112193","4334750181063126675","4784608308542393511","16839538027006284881"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["1134775296112597544","5227242730928907256","8956634084043721653","5627068683322199593"],["11080325332714862503","11547371897969758475","9614906791046371346","5712004556514772231"],["13430434791388273380","18254081086613338076","17381205322740033023","8739630253296818688"],["5022997249422880461","768605754366034622","10218099086664579359","13522684221486532402"],["900125451014656574","11763881166729584898","9983276908969871300","1445992903531822757"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["1748520420119487616","10230990690690196604","1104494576809171811","17773042116013818926"],["18216930927626535471","1889400132714556437","11382282743211085635","3959210577564839423"],["17110342209234765934","1766115976984061468","5100580425675107275","10871158589646349767"],["17633059661802426660","2978338877252000565","11054648326663691022","2335592812969650306"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["11208868150519553800","2539896476780928530","8678400883062942636","8131432352252772552"],["1727705322728066316","13581696492994089818","13228021886764588044","3960926087490529543"],["9076709079063436761","4073316522264462020","6440877822079978734","12137975794606643746"],["5967934563705693935","11793529880961434769","1042507447402494345","3225336856375606743"],["11057091302981689464","5816590011048596743","2529092560052915500","14559156626600861408"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["13204548786193445809","13294473411479975480","8352867629655552077","13142013187434290179"],["5282962794920562992","2893678348873741769","2262226617912008922","13044122016755281752"],["5474270121036523201","16731587089021423887","13506068112461182612","18427608379605597542"],["2753111502754105743","4372731372209120794","4492674011632465493","7930090632887006632"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["7985334898647165030","15329659344296157780","16031957307575295994","15483991738725601959"],["12522170323415766132","12556495256288572472","8397539637108891504","9603041333651196014"],["7217313812018054288","9617379621385946320","3644411866509012285","10107035693641340824"],["11914392232579112193","4334750181063126675","4784608308542393511","16839538027006284881"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["7822836124837712756","16480901838414047439","5737673108535653183","6747606035752061302"],["7148917396231613978","18316396437445564977","11131928210110411697","9823220634004239249"],["1935241197433743295","9767733456568356019","16160824911516391739","936969359123890785"],["1372179300458101271","2383893733121972641","11562763748930236494","2411859267292464968"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["16418026762863009115","8909824058418486839","16834657158804264769","17569239763851735978"],["4216599713231937999","1951341835864332120","12646941102980816705","2949076877177998489"],["17110342209234765934","1766115976984061468","5100580425675107275","10871158589646349767"],["17633059661802426660","2978338877252000565","11054648326663691022","2335592812969650306"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["4728775072199187722","17487679330112596959","4378675353200324634","399648402753059727"],["325120807282029640","2611486370847989507","14509283107554150682","10031833145462216892"],["7217313812018054288","9617379621385946320","3644411866509012285","10107035693641340824"],["11914392232579112193","4334750181063126675","4784608308542393511","16839538027006284881"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["16954908251144610652","9814350025949824488","16645169602382350202","6685607404179595843"],["14569184288464631867","12542214888332663019","16338505624936574302","14068116895239810028"],["3968322676574686988","17352932669517410638","7708984161930867867","14646078868026261145"],["5967934563705693935","11793529880961434769","1042507447402494345","3225336856375606743"],["11057091302981689464","5816590011048596743","2529092560052915500","14559156626600861408"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["7088847094757273311","9206724173090904240","15688185454157286051","835654765225846130"],["9713750287770454471","3827321166963864827","16067975526996152150","9548953525549586795"],["15825273347118821373","16643650556557677428","528403011034741039","2493731891092797934"],["2128697520937206245","1768959857516669307","7838795616630443042","17026471917692756613"],["11057091302981689464","5816590011048596743","2529092560052915500","14559156626600861408"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["11631309434914373546","15864898119656393508","729089666941942095","485069682784288068"],["5282962794920562992","2893678348873741769","2262226617912008922","13044122016755281752"],["5474270121036523201","16731587089021423887","13506068112461182612","18427608379605597542"],["2753111502754105743","4372731372209120794","4492674011632465493","7930090632887006632"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["6173114592593102384","17912733247834590029","16953256067197998504","12934553929071504826"],["15117422994443357296","3030987237003596141","14960081347804481589","17015301682501066561"],["7606224260110009630","7377442281754374783","1145856655706818014","2378384818471500604"],["11914392232579112193","4334750181063126675","4784608308542393511","16839538027006284881"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["4438941024742034354","11374786440503948730","14428162777045102093","10228325529307880870"],["6388923782204536410","18285684067668969350","31603890943729773","12409883594083038803"],["10568384955478272645","8669397306578298126","3039882127242381809","3696649570731023371"],["1372179300458101271","2383893733121972641","11562763748930236494","2411859267292464968"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["2843560360861752780","13807994297886173672","16834252836279249571","11477482245817739271"],["11956109093828843174","11273682193941242610","147887162416473654","2085404587224192547"],["1935241197433743295","9767733456568356019","16160824911516391739","936969359123890785"],["1372179300458101271","2383893733121972641","11562763748930236494","2411859267292464968"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["2843560360861752780","13807994297886173672","16834252836279249571","11477482245817739271"],["11956109093828843174","11273682193941242610","147887162416473654","2085404587224192547"],["1935241197433743295","9767733456568356019","16160824911516391739","936969359123890785"],["1372179300458101271","2383893733121972641","11562763748930236494","2411859267292464968"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["4517487877062933039","9324454916638018129","1318095873422336662","5569449605845214405"],["509312975367495427","11589873900757943034","2308660315622725188","14319646941204606233"],["15825273347118821373","16643650556557677428","528403011034741039","2493731891092797934"],["2128697520937206245","1768959857516669307","7838795616630443042","17026471917692756613"],["11057091302981689464","5816590011048596743","2529092560052915500","14559156626600861408"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["10237430813531041440","5110550113862958784","6441442987432386748","13897458961006944023"],["1576522176876332801","1629013533190356041","16181118620916973377","8249614509444156259"],["7018602157614843920","5104072144186592402","17703705326421528865","7863340615631120904"],["3594247247752358831","16643866712665273484","8732516113092394382","1962844758776479311"],["900125451014656574","11763881166729584898","9983276908969871300","1445992903531822757"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["3028060290978485135","13169119454481250591","13127916139929228943","8042798014004515325"],["11676910820902288566","9714607201558227303","9023420075698804191","2686137959960736949"],["10568384955478272645","8669397306578298126","3039882127242381809","3696649570731023371"],["1372179300458101271","2383893733121972641","11562763748930236494","2411859267292464968"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["8169160952335494961","15268009430932743422","18076035274086638075","9830943959241521185"],["13974169212337195028","2655277104605672970","1482424255073740725","7680328744821341585"],["9406685491907265029","10208565731984129505","12661165626958473275","7105591363936147138"],["2128697520937206245","1768959857516669307","7838795616630443042","17026471917692756613"],["11057091302981689464","5816590011048596743","2529092560052915500","14559156626600861408"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["2843560360861752780","13807994297886173672","16834252836279249571","11477482245817739271"],["11956109093828843174","11273682193941242610","147887162416473654","2085404587224192547"],["1935241197433743295","9767733456568356019","16160824911516391739","936969359123890785"],["1372179300458101271","2383893733121972641","11562763748930236494","2411859267292464968"],["13395694084677380735","18382049308904268992","6928488792982348162","4933646713731358015"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["6250103480383869799","10967336232564466427","2311761404107287580","16080898523102927262"],["14273335304785875914","16003731348529642001","17632189028845286712","12272786887807262711"],["2422349760306731297","3237333305029482223","15554547118624923793","14161698564265530752"],["5022997249422880461","768605754366034622","10218099086664579359","13522684221486532402"],["900125451014656574","11763881166729584898","9983276908969871300","1445992903531822757"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["14982955752283554224","11928732569179970231","15992456661149936029","10955176442739892133"],["2518617547955780685","6769142509152539101","13729451797217530717","4147948709153212996"],["17574792344662013763","3274000482293172815","15398027728693115443","6680966779622076978"],["3594247247752358831","16643866712665273484","8732516113092394382","1962844758776479311"],["900125451014656574","11763881166729584898","9983276908969871300","1445992903531822757"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["2148643538820671540","146348817437645847","9122948970944725877","7329444689124922599"],["7402347686235827242","11222022977025643522","2661264409222515584","7576710012842932669"],["15675815305838567610","17357050537071299196","11205576126890446865","4009545466303029968"],["2753111502754105743","4372731372209120794","4492674011632465493","7930090632887006632"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["14982955752283554224","11928732569179970231","15992456661149936029","10955176442739892133"],["2518617547955780685","6769142509152539101","13729451797217530717","4147948709153212996"],["17574792344662013763","3274000482293172815","15398027728693115443","6680966779622076978"],["3594247247752358831","16643866712665273484","8732516113092394382","1962844758776479311"],["900125451014656574","11763881166729584898","9983276908969871300","1445992903531822757"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["2885464091354679581","9099255433365316181","12484098079095555571","16781107691817203930"],["325120807282029640","2611486370847989507","14509283107554150682","10031833145462216892"],["7217313812018054288","9617379621385946320","3644411866509012285","10107035693641340824"],["11914392232579112193","4334750181063126675","4784608308542393511","16839538027006284881"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["11274882392710094207","15310599101634782683","15075920854007520603","5054199929734224894"],["18266300908708286476","18430624595358184193","16791495134486693881","13820385793287789278"],["5474270121036523201","16731587089021423887","13506068112461182612","18427608379605597542"],["2753111502754105743","4372731372209120794","4492674011632465493","7930090632887006632"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["9044607525855070548","10632132108963375547","6893882130073544570","14025838862139234772"],["14273335304785875914","16003731348529642001","17632189028845286712","12272786887807262711"],["2422349760306731297","3237333305029482223","15554547118624923793","14161698564265530752"],["5022997249422880461","768605754366034622","10218099086664579359","13522684221486532402"],["900125451014656574","11763881166729584898","9983276908969871300","1445992903531822757"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["10438910678018707253","18195544035353867592","9232258712468940667","9889684237836807889"],["13015639956460993901","17912770266321441362","15009066649999293465","17925682602314181254"],["9076709079063436761","4073316522264462020","6440877822079978734","12137975794606643746"],["5967934563705693935","11793529880961434769","1042507447402494345","3225336856375606743"],["11057091302981689464","5816590011048596743","2529092560052915500","14559156626600861408"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["7008708748671088580","1735343252369523483","14441120771121640885","12110610250050208109"],["18266300908708286476","18430624595358184193","16791495134486693881","13820385793287789278"],["5474270121036523201","16731587089021423887","13506068112461182612","18427608379605597542"],["2753111502754105743","4372731372209120794","4492674011632465493","7930090632887006632"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["4703188273321443891","9629585498042760344","3641430306717757536","14536798439190338419"],["2518617547955780685","6769142509152539101","13729451797217530717","4147948709153212996"],["17574792344662013763","3274000482293172815","15398027728693115443","6680966779622076978"],["3594247247752358831","16643866712665273484","8732516113092394382","1962844758776479311"],["900125451014656574","11763881166729584898","9983276908969871300","1445992903531822757"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]],[["2885464091354679581","9099255433365316181","12484098079095555571","16781107691817203930"],["325120807282029640","2611486370847989507","14509283107554150682","10031833145462216892"],["7217313812018054288","9617379621385946320","3644411866509012285","10107035693641340824"],["11914392232579112193","4334750181063126675","4784608308542393511","16839538027006284881"],["5947853257457294826","10038181543396934889","10092311301146220263","11742057260416924324"],["8993956527483528584","14323677717977836027","6494850476394925862","15624766286206596949"]],[["16059664202914045479","13642109638547524797","6315923114705673881","7565653673483945770"],["1727705322728066316","13581696492994089818","13228021886764588044","3960926087490529543"],["9076709079063436761","4073316522264462020","6440877822079978734","12137975794606643746"],["5967934563705693935","11793529880961434769","1042507447402494345","3225336856375606743"],["11057091302981689464","5816590011048596743","2529092560052915500","14559156626600861408"],["2150192248339640635","10446695539446259966","3163710972146264440","15036576969893183013"]]],"s0_vals1":[["11560448466618582392","987610462385947453","8350472731350385294","5946994320394846267","15216178736621131321","12278649731445995768","17086552419757332986","6422647008705863505","11808383004298212582","7780196455342975423","15993286769707825511","16152827770998750681","7380481928468366494","6490567321326886601","12863072744215564918","5819306765711046133","5402004558192455081","16837595521915551582"],["10066458602375454478","15161984570603276905","3155183298299264350","16957368713703158562","8040942108658216734","5453136839619480005","10899838800412303995","2186454605408210485","6162782753873189648","5881751142811612388","16892931781995027005","11662168376343386443","17814720154019612334","11104030655352135842","2813099196505356771","3470301224995816568","17466155632592272897","3049328033329195208"],["909431221416892177","5792312689299601124","12064716645430335798","16204974956734818243","13052524941366638232","16711273338155485448","4189932552577812239","8675414317733822686","5566992153866582426","3283368575850856149","430067180859830892","10386308222460231960","5140483055611035271","13933192684426124428","18268376927324031390","12523126422508585079","1777656471764857408","326686705566391737"],["11246276960473377688","15788713363944746798","5364944690765112123","14566902829048032798","4024276471308301847","9235708693984209302","4133390817108210062","4842813684005152390","6310883690184546076","8682192568713051103","18001110444481199645","14919664221305299869","9040306948135475116","12768888240688689537","11562202753581958625","15989039859641390911","3236698786771729565","1630093406683669061"],["4335947133478834482","208703187268136605","1899156754359697226","11343716519933722638","14738597099147845231","11469812203025016392","15626226802905625888","17104466666600625641","10539287862811431510","16350303294688940245","5407706698357590420","5753767636311553148","17729180554904352965","5304547155756325486","12523616622372111144","15007711427480800200","10007766898629490920","18030476850475754118"],["7641080365668409140","4705999629711898933","15541645537719955936","9550843425360444330","16974820750056934004","5953949300098354006","4976599881186050391","16356189127953558199","17362371318351071479","199877924113540698","13194000339172144043","13067940706182545513","10207017812676803232","11176758616993062734","3710835642747236135","14673491052742995602","8404070319503104840","15836751042971200212"],["4050486058836588719","17293014841494603887","17292162902806598365","18229427745509838392","237719321272688805","13832679981782149028","10950841382364943934","6554076734167927771","13693738247480299471","2810187461000749684","10305445042047083375","16139328419343948868","7164660593941743883","5509412007666011992","17745824948112949777","6041857776923815912","4213970281138136802","2217282102282810356"],["11977254614646770982","18041465977040107269","4614931782204042968","10859122142264565960","10708999964049892195","18353111674797571305","15495893676849785604","15474190721913196846","6028832738458189915","2789914240413991879","15790468596299025181","14678016272292693709","3978879895240906567","4577960146842076205","14889139488499638747","12687793312432760395","13078017596108792253","9267578118623309019"],["8076918535442881668","1129071321055988986","14533591581916513836","11470288697997827916","7645806186975261371","2627566230409907263","18367880405100100513","16212118763995752028","3805766814268816690","11993043720535791803","15490101515464462203","8764186862435205882","17268348247477024959","16573243109504172298","10500481642548470604","16283212722552446150","4742174127888224941","12211554533137785870"],["9606126061438933533","15197076570199453538","9756942978446489317","12860455636563386610","10384678332142032973","7352028076411657539","9730353897105447436","10267647660652357050","5926374651129656836","304579183031574922","8707195694857319860","10506306113073721024","6211875516969585499","15017752616377084773","18398703344015872222","16489293437534102870","13821006585535386287","12199559617278323465"],["17157073753344363324","13861507417242933255","4198969560412242132","18076792429437802918","14202084038655772103","12677024984250192382","4120754206646580043","2963469599249131654","4077754049037002754","8085022929390730104","5176174665517900472","16523499358946489916","1549834394894288398","9017845912614668940","3547749997592083573","8970383963918097628","3504581361180539852","296535783281294713"],["10844225277464209383","2232468561192225531","18373756534748437378","1242029505059291527","7087822676134540795","3140412671701175472","8599156289627540759","11340442893708415031","11337377577203507942","13118620061437916575","9578467040691165859","16766133653898273319","9961537466187342395","9058510618555248483","274823521076726289","1409505321051947537","6105861941618700087","11201241637780670067"],["3474296298332994501","6624743788284457293","7598489400819744364","13669458512852819209","7227820094153534560","13252944055947275085","13021758279183007045","3521758986717872821","11358275647535977333","10231556810003775585","3305021608378152694","16067234041959772431","8135858875504498738","3694642576629312422","9958710740725159942","1241038697261299326","14267994373103375334","14140707754752569644"],["13159350418873634146","539219967519939074","17599154873137455299","16332822801250957514","347663130357933660","14734136833290761581","17399083778847155538","12669665997151679816","8354899194793774659","13348065200317024612","695781281969379158","576510989425139941","11256455276620177727","981544290765659690","5706239328873055431","886709899294233753","12350568938597527374","16598971882522059728"],["12040506962124071579","16089967572823194826","7055838027198692045","356076159346650029","11964288276814964424","4585349775914195117","7648445425031726025","12156733168371752079","9954256595088951396","4262810352375930837","3803132944049933369","1297949273187059850","7019127969401104215","8845774504104870513","5964793304784238032","12441779811612224446","5045074634853933860","8607136464578429124"],["1808924046457729007","2709628612404016979","2903742559525831791","9316481924270074591","3594738145638605267","6595594859948497846","530454188037777559","12901285771092114979","10993250519006171807","9450129460844335092","13360887078051693505","17945537394471773219","16827154989546556939","2210106263691840918","13494307181529043544","5496774946992578807","4354018851588634540","8029072590524771442"],["16942768899387963280","4863650064437900270","16576773782389835198","6792071580900251226","14106031975937777578","9870356081197118140","8727932362593218543","6473116152082324975","12335948033769522729","7179268222427621538","9747114073187792948","6533390323875929337","15873584484638144215","11010895978532012109","10313221326723034888","95274752673837908","4348212494587276109","7550299622065867186"],["11663387945074133667","12559962099747517474","13029905668597968815","16895071331589384107","14656561358901250935","1332851740373277638","6661483450863417010","7310729204577524252","10879459018020382869","1340098980111875267","15163677868907304706","1939506522474332920","9985333534311063955","11172227426076876601","10117580593319586775","3624978813910617299","16504479417616493437","5368457389165277315"],["16517817014064548649","8131650242537852846","7544276222732353525","9999185591561288024","11318273911523125150","14478956592009936901","11856468610831162714","6654445657937629578","9735198073085979730","11119183090687516932","10876840210718683611","13504616844851233934","16932123940418652281","4562865340015530303","13734799720735585239","15684296150147012204","13982732068216651708","1343308814081907205"],["1307495453499048681","12597452321991006602","6835096490797168155","13908861729418013391","17853546064996675859","14883011432563531636","5968067753376189703","1731121051002509008","1357489954393365782","3933905785016520004","634457690416525399","3862274849044734220","18314052660351233199","10966700609496342862","11209758177081703245","6928530553777649518","2587030216397756082","2581658977527938314"],["7600940104869155876","4187155989712222330","8877564089769885202","13387206322065677974","15896026856885984942","13203600360886376587","15802450204632883085","12659451141168528601","13110757227867622792","13232399360449451395","18057280736950126328","18053433327667285157","6749488019408588211","6147436474061071130","7665998425592291592","679663941181601843","10689053535648242417","11120982697030738141"],["5896409283247894993","13010089705897929999","4824807612939544660","3691823151509556495","15695551809429906612","7239320027789093710","18329345661955467239","2715764566286354516","11485591631990981005","17603601076690523558","1692842402565266922","7079984394744929191","2715394010415959698","14229931849844446757","13360619124490364585","14866857881247484912","5677925714258313345","17051685507878024198"],["13410431229793670134","9748897868337739577","13640590736804767035","3630065728907802396","14009273185767388658","14808381137190461911","10148737263842119649","17852385986726519903","15491803184172048440","6586947151726281912","9564071645488130167","11195891224064912656","9955172343397945118","8279723658729270265","5134207493318172392","9369432334050761155","13516694393585428332","8948780415230264303"],["7410695013269350329","3140940156447686013","17149664458232072135","6159415796361396530","13981176036488025303","18429055159240141852","8682543453082148921","6174250362484739429","15111085345068228002","12772709057602825765","12962148673066144645","16826141330997964910","18279470481487434307","13983203250164551578","10433788533630223842","332081521118377229","3796772702184057941","12353088997721977693"],["746226386629138425","659902560609686234","13866426627633371286","15709698548500477687","1096670592174470324","8597284174688976968","7211891080530091782","13892876841259328371","17159801551457340384","10192255398449978429","5600960248603992858","879084302898577361","6014133096550730165","4153894957447492101","9661601389105679527","7966644329761213930","15700918248499572650","7885639548174942315"],["8386914867712074407","14100150243952325204","16355399307578145342","14202987542799093842","2046509858667365435","4916162728792602569","11840578443695336405","10982353707993535533","3196357470675808153","10977473820730221379","2460440588624601714","6084268526942794780","14524090549567463920","9689168939915995345","1279688669943612838","11363967959659047324","4823188927537107883","2042703161259668163"],["2010507749738001963","1726897080033212812","6232754893963002778","1011261609162926110","13512906459058141143","4853778428748251949","11229190320659839061","482852932135448908","4103825570713946634","2791790336080634213","13478012019348902758","9660496471195795633","5399714548632104877","15649970999881028622","12110648934042320113","2768251313050297465","18183107504838481103","13733812122225782909"],["17396041813435639419","7361684720131938106","9084408569943956354","6276428134303724040","17061480467233686929","18202004055964102821","12628191946285555360","11721095518481429653","16219271758178790267","2301417690387684854","16481116550879807040","15056620072024533263","2242218410267623041","3223240049069230286","11863632615819892887","970403993478443800","7781931966357395641","12481068917196774984"],["4279851763740013780","15674498072591505785","5507828861342938518","16798176436396745773","324238170483215839","14240815547065362784","13171146430252072189","16928000938619922208","11689694881732450966","15331416023856264861","1375714882128079695","1739806104723260447","12463044716548214752","3054893832108705412","17777123300430150468","1476925919207820385","11961548252741367281","10869370940289586732"],["18145529407435186343","13318909570050044081","14636323575966317112","5253034315393891282","4261329668163661612","6199954256327819748","7580511989476109933","5503364922626059035","7687408728318751333","3599789887549077299","374250511507562952","13968706857524895161","14375699287828733607","15099825866744492821","3927112904128322239","18436593598829854547","15732685728734627832","10751622725965053410"],["7892102509792470034","4448529804764202629","12514669365746511252","6916567272187637297","15941990154605736365","2924317461549262445","199528734518093446","7373789455161672631","7083768339405586225","16915911188612138798","16032607433292343163","9275307993701838150","9220398941655226203","1203804750126616756","5363216260286743685","13040169204540638430","3050632195522937108","17019942687578190854"],["3459275883860909287","15247697141608628555","13146999566624068361","13158349969265088515","4985692389521053904","3714649117238972475","7821506485709474764","16040095552823017339","1908822888498289611","16325928979960020192","10928507005422648252","12232398949423291077","3421972627714455131","9435977195676071919","478212014138618097","1502357106327501376","16355642145543639879","3243369996899746621"],["533923533750990382","14749336909072624070","18088027627992294025","15713126515048974749","18265778385253254754","1281683149147504423","16171657976825419277","10663514363612707414","817319953280031464","3803978213973002095","175478564156467354","8124266080836725707","12013646802207034272","11038204512819875190","10219985958437796539","16302429040294456680","4250623336847613880","4016310990251810533"],["2707107148723034825","4477276717891419113","643040921753452700","10401376469296517557","8910426142230064029","9907036373354828470","11330766532560952661","18232181293737781988","11368882736618488900","9611766023616248535","7239320042041280603","17865885159668249252","3145132964480197019","7403470666991901207","17380244836185330327","7689430724575580728","7033849061773450217","13371418138377844418"],["12309878567454657125","12558923487634665471","5236203592286108851","8477653890731273005","7446003552955675902","7700037406401517240","7950558577696676784","17643709144253448502","716041711572788523","5758934925327203315","13231014814650011806","14819276214097715120","18123392930105989343","7426304664402459933","5635606659986309776","16633635677768124957","10132657322946101814","13682696630295041478"],["136261237855523259","7980539385251884205","17078946028871166480","11865172304119771366","3482953273400376252","4762648250187153322","7401139246375497591","5875144750135780285","6473102557318245327","8827575433004955647","9242909917971759796","7698101404924069137","5347444996974716890","14381082195311738507","6025207670694891271","6892518475787865411","9794619798557171370","16461302396793099899"],["3366546736949148424","7118868025835895536","10335053523390148343","7585263404392966573","4818671191909394336","235603932201303277","6957684999494835998","1253582354499056409","15737260038897250884","9407851292071030020","13386431319266661079","7882705045372413347","16008562595961278816","3531546731289962219","8539098891763258659","2405646896286422855","9179080012972890673","10683233187385164657"],["3899480198011681725","5777345428613032479","16910193705837922240","11587921626661696362","7354858566467671530","7764759508338157369","16911554068049721772","5615603565075018020","10647011393493094539","12916474071971198666","5130685043177771019","15533068943578692701","10430074613721618968","7047688071539720037","15318825218912630741","17602670657469293741","9071514024845388991","13709010552839060967"],["17591277342912534313","1327809439345832371","16877421751919784760","11417677163022676349","2336693870837357620","12796730796909149809","4366011216673309654","3831082883153455692","8310813300044032144","11507330368563515019","6759200865358303010","6474546744490112694","17484017045345381890","15298253485005414302","10434502636903554950","7561974772021512672","2490165277810502826","105646145600395274"],["11699825786823327137","5395701442791371418","11238540406621595185","13254685157479409087","17159216909079250858","10731639143219653014","17933013953782362649","5202862509949524752","4569710132120281920","7084514684346241505","4534416040676296678","16190897857225506969","6546564792725267154","5095851151384690178","17303536383255184413","5983660633560928823","3127065335046448516","16859381342750120230"],["5897461634674337382","18321193575871263995","2070565996741164135","10545251334576358697","3556223150816123856","892165566169840985","17824247403811901120","12944369878398181554","11782354500206987372","8910758590208126490","3713333314786037769","12096543773959026219","7975034498040098650","9722530274514152857","2474917841045070581","15593176463503752211","7957536999217698692","15272516067610675464"],["1370071897198320509","81947000777737015","1121812285864862423","12472978678201670908","15891366556341099851","12783317162045095918","17746080679159849241","1276001092739986364","10158445613980590799","4938379791835198436","7728616292965776326","9546193011735870004","598087864952909","1855715096386788797","5246240709592976288","1946067087940012242","18373627748306920566","13728520963103947626"],["4182472608446185951","1596521489281463650","1651588838496383926","13426097493647844472","14827821510724047060","15732557151127727750","15817663048702763082","3536111979415733818","15086398550056468158","7203666463742165097","5291012248258946325","4356639071873110525","14353129439358135742","16738280864017209098","6990518187473508382","10796808270012792164","2148785458607145966","2948622798507142634"]],"s0_vals3":[["15324581724705712130","15471363863021807177","17717673596238657295","465699928005888129","1716265122946641875","11132911073530000292","1145940559481396270","8094902555175254587","15925477327390330550","10864603713571994147","9270083038752117833","15794076091319462731","10927186880043455710","6252185674144632739","17185392085250965721","4579725602090766714","12793560383301159610","8243417275410253639","15900503246543388407","390282919391385863","14775564064959560877","3888315477870072873","18249977173933843684","15271678582982188403","5033656130768322637","10674437531066608435","13160356359438329091","13808445683866535872","5113166028163006577","8540524233416832138","4188060351997454950","6615016829702056851","13656766247295261672","15208140580143890878","5674070276544291042","17254473566223211706","11458957079146308247","5145158620443054245","17053592970322157319"],["15915266184464524942","3177303409530282651","12268850621061873674","16745393537110718999","16791728362317833751","8170233015144364639","1075723000410592086","5963394406885540894","512803836304983087","17332186290284504964","14982109510787167133","4418510194833901342","6878305261277321436","15319725630726182912","6944008934692010412","15689994729650871431","6725047991898254377","10178552344733682761","9892081249499381515","7555325767961658141","38052049443476161","16860542089603042491","13708158352894536107","8457212142835174680","5698853848326136518","5743696967521643633","6438558419817659357","6383123851050695235","15726766262947075378","5207259951516482002","9427334242965865237","861469698033470727","16850306152233734204","11153460821571099241","11703613613374485080","136285747586815858","14042460334182127678","1763325026091046972","264298295805620635"],["9001037016877181619","14470732683672097318","17008803788320216962","16296524371083352497","9899938386742167174","9339212660646037112","16003224324235334119","1743811765893264546","1915258617457060109","1294924566935371847","3087131209024884827","4673606615733706312","6445513083015822539","3687270410217560015","10084509771831618949","16781063714338368011","1542787066793496103","11173781179663456806","8258694542721742383","12642983576346240332","3440302087560713663","3199504652489077601","16401625077840033761","3959400425119732416","9198880531936068998","13146441592740667425","13302213269152194411","5379777329426838248","15464666909884523801","202759372836654927","11411897498430087823","15674108728494708889","14331747991381598335","12418272839097465104","9046372759627778403","13272328674423313861","3169559348414660313","13020348571832577494","14569690100783176322"],["17630901450057524413","13851076775133941266","10743353878491113613","10404224627517096562","4245380899764785046","7215323722744461943","9487802471903673547","5086103637170086471","6835757811548811881","180137054420490811","13322331647497282632","16565167947615435738","18152484612293276959","9916902596556645917","7432846472450602800","13258793256841196818","13024920674712131497","9409503081658195506","7939258761061133763","11456315664496183519","5967790578508230744","4465379776466155048","11077839326601123843","10569896167629556117","8130279974933651203","4110508360094611673","15443026498752552693","17570002691659354013","10556272742886436401","1906784789091413327","4946107045748219497","14395419100678506128","15737314871010747189","18400791464029118155","12212418869584250249","11957505903557040162","11574144876302235761","7188756927012509725","2892935477056477200"],["844053434280207376","8070905411737548636","16574382712824903117","353994928953989682","751324105889497324","13632540632312019537","3747476359162615145","10059130166178414393","3684010253385950508","15422918982793657784","3179052925352569115","12479389623465988750","14035634797228088474","10824981307495404337","12640350387694610394","4194648784691454941","14116918330640741133","3716259975943290316","8561647406020430441","6505788161615091428","16628578193898200779","3158354755892471559","3049369694174592560","6629663831611410891","3171464374818389891","2652070804222288853","16846041176240619041","3664909428122835677","14744652493490913186","8642262434526316899","16289455633332423476","10089644384238922908","10890613578053700343","5658558972240361203","2213280608650018900","3704758918181105101","96785310926873953","7780089839143802813","5034343952352472208"],["16899128547061711921","5504111578207280568","7194747015953406117","4815436697578079249","18112232813908251075","15810555853372418534","5602295975733624591","10772065960521530292","8711758409357415954","3825370741276868224","4137098669422840902","4016634551210490606","8928138753884612754","3157938923672320415","8156663506523375731","1211118413863751005","8931838351060026968","12625005411758244766","1153797031359170470","8803471254777292949","5942531332210124364","1783480144798232815","11566808560618052114","4235186877573374161","8276638980370853234","15464760152430417061","1650246570897402138","4706465913749932408","17332479065374635125","11186199059028226208","15253435942292836569","14991197878139060980","17233540083767572659","12562930073530652895","15788397508159260999","18136795354241839985","907469707809596901","14848177187605861805","17636913805646660186"],["14497373224239526668","9703245897009477936","11453957257778842350","16998854645495222840","5661992365468100506","3158028935139676668","11453319807238057970","5912998465284529450","14460317944514177063","1977444676671184966","10826313374665485700","14076975644208804365","10763622111439241733","7505272181817827794","13453008043673614066","7983200701562563761","18329831113143348397","4233581132818516350","12247228221102467080","465874126519259316","2044198011873122635","15419258884943726306","349916666895297559","12592404389693829807","13422472367283032470","11004983055378477125","1705228922577091126","4418489207155839194","2765080281201539048","1000407361002729192","2087222433593936351","1998669822874756778","7309376882895818636","6033870186600870736","6444089500673766444","15352282419113238429","12711397538834027574","5150641007898179888","6797284949751309271"],["3203785938092532805","10974796410784244891","15010718840099363267","15279156391810610206","18425568630994868321","7692144571154049379","15531069766106481796","14164672488575932524","14522450334987353003","16790472564247789580","5239043029456795249","182360249982517129","5824465986836489190","15260921732033883882","14820182136859208747","8715357611927384713","120605074380968149","18073062784157097567","17765936490257700802","8393001342325346531","9244506732441108508","10835092656863118520","17597201517440408011","1545934628502105155","11018625545511935186","6482760938727041392","12594539682448119819","541196400134030460","3637183890027311078","7654631807918103953","12436042196203968211","14676151840670409579","10699148624306242183","8781402419283230287","1455383514976339952","8116701647264948449","8436767276781524509","16263159766391874539","14999359343395212361"],["18421861234539698263","16325165192874265927","2433901442356346376","9639662965049316812","5352122432995605523","5123230471430563562","13732080345472888560","12408148041755041254","16271259181493767181","10952518470912145850","14684662731644360795","5637609768852016753","6235280903796090270","13492383001215617722","4634529742761577802","3280813649971557516","7972105987553935653","5967270820249206487","14932582358439137210","3196257480419830476","15245560638633504965","10616934730955453478","5096791285068521170","84939979639406425","8661105309326925543","12475066061523785028","15826191608259550958","5212630916362354732","67900761899879201","7286946413022252431","1624812942254219345","220224267224924398","7375339980061253955","16441756944770497640","11199162312272889427","13103401943603222743","3972236518058213085","5105523115495744601","1195394805931727096"],["6280284273783076077","9698431689362269528","11294029755219838440","8253926575848716326","10855819781661448385","10976020611414363519","11264969909611912926","7137683154124713673","5941504605797328","1553159140103506171","2730164664504216240","9789616481516104640","18123471246081685916","12600325683878536325","7743713298749864559","9781533238389771734","9519832344437679409","8486720066336966997","13401461141728203992","15712016054995716621","15026609703689471763","10197850439801177377","491879917258312923","3852820566482722617","13672121419352210345","841154378602372899","9033807365703284325","1650686087229231221","4781595617980993573","17585020169427577909","12402286455154713695","10173553673667467770","11225975493196826068","12175601240218150073","13516002210870826028","5485423596813854136","3349324094269426377","18376377154620849681","7513610922416083340"],["15859581187007505477","11409378422149609306","7223359925586191258","8642464636163389554","12453793310092854111","569394751826178058","1195368391144241207","9820648601269487190","512052025298563956","16032886654462582777","18407671886289185376","11168914663640190739","9747476005639195426","12815616440500256036","15509365434238412340","17458295312687914906","1960434579783569366","8509438446743790639","6226582612158259060","14911403525549989595","3931715653884577997","16790828467240823032","11866410508373157721","8991858537181087609","17486767232039732592","4808960005024763693","15633666437662811328","2934213009887735942","13530585362710313959","10251552343885767631","18404216543883833073","12928241064993813997","9370327463046018990","6178010903093984155","2598631993294792213","3438654093504655565","7628396362373734056","13016715940042965064","5904600343615846492"],["253168598035376346","17305570154957049879","3144080714872150936","9474081753781630066","424930089903108304","15072573530359503764","10172071350042837486","2959879695040310194","16420387159398777306","10336981667615742056","2348022064472141951","14480204889078103933","3378810474957513630","15558670807602014219","6865432131103904508","13391291782927824256","13022674059107796083","8254135284453456361","9876188183027333636","254564728719109812","17661891268985456567","3819538950651480926","13427625418425823703","4040055253606221397","5004832120010209112","10147687467775438836","6694428390079406921","16441166281580975885","15994574226339966279","17694221423305984336","14283428626091465652","1581676504176406958","10977724319994980698","11879848285115928521","9004718297892945510","7813049251726082015","13711315668642917356","14104664162953574465","12508720335504125227"],["225326273477149487","17895555638033173140","7235882328527688266","10582636932386914315","13713533714384675106","10361892994723411273","14926703879274956350","6236665204035629859","14722808171326649763","9721413585823941829","5221279352112175390","4568354423879922670","1288898685378324320","17742123722429199117","7121053498107223149","12894998054058613831","14499355391787527895","1081659871361485063","15150106650328966741","1840884470077103907","4785657862568017623","1698313236761004519","16476696127535945969","16267160416079596525","4779488007270615409","15292973163592074142","16594209809304514087","9249525409070218797","109200918298038848","14624658437118833825","15963414032391548289","15818200092254770712","3315900948689438452","10540560315795628480","14844582503080327742","1476722699852057855","15077169802942483669","11059882926804990992","6000199109733262760"],["10988740174147350594","4941951046126049411","13443841403479837602","6183633518444525837","10733691728799529392","3000553153197821160","495711468951002750","6053616494302941347","8680817170556542897","13518704513031066776","10051893693846323279","2137789970418565148","7510447332586806935","10735857899874776979","12525287428883826992","5599638020146581693","12665726779036739925","10293664082583391014","4559887965733831812","10672225490865666295","10429595711772486040","11038051143280566345","16465490362534825693","1901227198499067629","11505422671122146754","15337426781476452445","9734517005055553501","2276529537519704544","16767363714969175773","1501664104468265660","5483722028432133342","13919919033769577166","14867713225320843727","14261424977462514863","9058422743846541510","5099529948967868092","16008243497757643912","15270620861600524982","17641877638370008506"],["12029647712942165495","5484795230918309618","15800367678345004718","10085001613656689000","15813956717724676430","8846209254272349285","17088295623480714043","16090245753785417509","7901404766295074491","16206429373522680863","2855553384051747109","8315296869579957226","6464370589543484626","16806525031569140498","16021206170470106382","15886572946105225338","2859522536360876384","13420020978997857707","15280642900441184566","15691814288728838437","8719049412755427964","10560099273008224630","3335025695243466746","13637957520784747548","15097689674043134354","2205237781472431730","18102739954119286848","13249654534068174737","4317367895523290626","12815362950086379161","4831128908971235267","8042909378174468418","3316400557211507505","15671083327611381722","16538227011632849769","8992860380350725154","5097809412142232083","1216554833827924465","11687649319796809744"],["4545488201859795815","9007079911809020317","12696575506228125508","11526935542639285642","5362599880519608168","16235942974683202623","16789504355143415049","7551983045738706174","4735745998250423785","11083759241957041340","1822420392872385659","16365143815850889247","1839432686235501304","12211461119345916797","16602906357304262021","14797252269510255929","18427432941921229622","15075464880663132967","12913562163963032008","3195276560867768437","17554199352948444718","17423812182389326056","8977095176105261713","6993544854582306044","15839566539497198558","7048553251281132981","4941313759174591115","13802845378388816801","17422942145890996231","9566301538262345315","9239299825085497915","3847027856106252841","13670610015745827354","7667090370660553568","17680494861020330986","2996105896999832822","12688857581165639307","12106149894368753156","10022360397100811374"],["7047352610121925914","1093873767150412048","1135134145446325872","16089410055334035111","6063086831340999325","2004350242345512039","3604926877572991578","6622599780026866024","7434473366375713615","9605226000414780045","16902150989239041456","12262561052413255171","14138254194043207151","3004687822545627766","4816771646096223308","13613773758992293415","6059528061142836584","4828283716173004101","4432979433571862583","13742520632285502938","17981259468430871251","4227012282766935873","11060940617315366714","15417762510831059691","3215167619415702079","11975913387910855002","532060963743401789","14544601893437966691","6597772209491602722","13188338849342482499","3295215836683739061","4032004715414394746","2721337749967809910","13243532972710023017","5368663886679403320","7019112698367519946","11439941468523063855","1635327955840711251","12904316470703939634"],["3360994913515565162","6799399300466668952","8759160506730266642","6008031935022930088","16776287679585736912","4382884273012244506","693931031686640559","12000202643377956759","3236704056816238300","16919665351843116493","15634166517604997133","3774856885631479697","15232899844906262459","3033750558221723546","4851546214411607475","2809755413223176734","10490438736336365446","14862455344911218393","10473501340463373003","14557738239540991933","15303810115835559404","2733729036499181106","9931664762768809506","15807409186117851215","14010148988724012242","3964657748069184410","15949965844990248101","5988261941960847835","13094753130334075730","17378732158933351225","14997304025386849570","13433408273742497473","2959547141404418454","17819705240684873257","3334762488249289896","3371654164682665419","12806753519608152820","2360029553797095826","11802361206876947821"],["13493463140284626067","958381404089788448","8477583734135890071","4821767128763260245","9197892531007898422","9123756196400995374","5815431629227593559","5818209901443727193","4636232924183662583","10187687627857539353","860160727677379394","11261163842577526216","11114644667433455496","3715691611496935782","9121322240377885606","18015291397914718727","16576415936442252404","8618428458804313590","7264855306667833035","8709112176337585363","17384828371781303733","11277954114665130414","9224875894220962729","12102315794349616099","2286180007569416979","9607356240589642706","13996401372233666885","14945686897195556801","9960862033659512121","13643428040772703804","4286414016966365192","1550503466678451996","2476614341464874671","2943474817097947505","3388474682411729571","18160387327138155609","11106604251783013601","10586002952661671172","10569037373182755939"],["15050181816157221698","1923721294570023315","1656406821794467909","4074727916643447133","7226548587705792791","2277686336908490336","15623735140621800880","1683728322774991624","9606111612975205080","17516988145073072051","8494666551996507327","14561932175162548309","1418973961568018741","16728647444859312406","9760102154755627465","3286340234836575380","12712943958763887900","135762780280757395","8611021136707759484","4027061516777851161","2194856379174877601","1975086091931063228","8649880014590678587","10254068294449556576","9258696035733813013","11399091829607875553","950882671503561623","4626820147710587479","4594927508341790769","3771338059007096736","6354619251016809265","10002518596052241832","15153938933607023901","13736166884341671790","2378638965405555755","11800603599508476335","7848091146695798373","17744317004130300518","8052858764350490393"],["15910401201130189665","8158133579859172596","15622671337193679195","11062748349184883973","12722669190302728943","8323760051827521069","3212672595477650876","17836126712824641582","17651291573740034707","56954103493287876","17451619076744641207","17335060607072995308","9167070061003952402","2370196754934371627","6287661467483342479","13721982882439744957","222576852415223999","12672281894313318897","11094258632866436885","4762884701161125740","3638410776817449514","4238099368070155382","3232365334158151915","6178973984198856123","18133817988933390389","15605235567734475425","12040315397345134564","9118116025997687069","12005562166787906474","17437441414852298543","16871609175189547202","14095687263558119418","8265457799326718661","11054401493706807535","10407049830118799770","2175702227759154954","9137133149557896338","18083048263414799426","14398992927547407658"],["3337338102835906632","10859107911752248215","6692480383039033769","7941748812409570147","2710293702945014057","5016438069153249627","12429924761860853154","2576616814235561846","5263603732716672567","4511883382447646655","16565647481169428487","11434905880126517026","10336536774228095571","12199401106404558603","2305274231540681395","3170867171022884630","10367095561065240269","5846488814545764531","864502216553758726","17623785853857863839","10286254305281687297","10117977764744729592","16953300672540845118","8179095492181247144","16395528314433144175","13467906874992656382","10759803651917167665","18119143107167364639","17727268433401192880","13074987233936255418","16242171378969605379","14872886235014369011","4617224379936902359","4079311510392851868","16720647759082842730","18262271868608047680","1912454347149263951","3589073207361972810","7437110394934377954"],["5209148083810227073","12868952012247499104","6745708886724352865","9156065914110569245","13569898143736086928","5949223176657820270","11658502314253123786","3044785490427458500","5962368117836731437","14658044011448905845","16469852787064914439","12198048303112134651","3200003437890163255","970515030455071790","3304527307444865879","13117966852449760812","14675788255054590145","5662033012832644154","14531848378973378738","7553470960854532307","248725748916194355","17057663906751705491","14378515481232506818","10474801811635890884","11972178466204420904","1355522817851830923","14818870554530582715","13510806967830210427","2889990598824629041","13412409195736016501","10427903735840458754","8521906712190057231","9233008676639736415","9072226715676484774","9072494013913645681","9653168656762173460","6231720336832053287","2999816986412832765","5041333569839113916"],["17853508204161147989","2937219985429119827","1143163413696110724","1756653945591566886","9269800188220928746","2756887567676593125","5720282767724890629","1723467559065632283","4497097580374764135","10889158133121457133","9002303214660154221","6640040197090384061","10357365363344585216","5906147457173022978","13951804083229934833","14747886994426476442","9515147384304488180","9663881671414905116","6773688521069085652","8050086687598591725","3433243849929084628","1315379140392969212","16040796101867116269","10272645940240992269","16828878482287312493","742365222170068730","11157851294648061794","13098140245776687932","329366217484992883","2768343000716763000","15133259554601818940","18363828225795754004","5923656563910931298","13714082862815806864","18142537228225964678","5746605941984271795","16570262159891189883","6664209079378450384","10887860031834773355"],["10936582386559525999","16544669730172812772","10061679289405128668","4030431133625399136","4749887989252992467","3558213396219754858","4464111899594051760","13316046759424881666","15975159487290381554","18173685196673107136","9151155257884113160","4513795820054509729","14257380470961056441","16197884711246017067","5004201515993991649","13500883691002478062","16323021604856386860","6035956344797559747","15482300912045742484","17411794213992007127","3266183652003970536","6525730358267166337","1629361618885992565","6332063760525350698","9916415092378873327","15296978489472522897","15118785159643242621","15469005487543603515","16577035023006576987","15852500160167776261","4815227301816442474","16400223448529389794","8152174700588332241","15695056508586087826","13639389565949613812","16558203445855899622","5185613926183653083","1273709528844869614","6217299830617463187"],["4363353001337518720","3759597294687404521","17205627749589829041","16433987525803952316","16712905704063996332","5830654868000281807","6251250240405919588","14549660997772015513","1468599141154144083","12748742918154915842","751015689846190583","8535026901224953969","8519475940258372540","2788367364236885155","17019693216535276675","17021615276045077035","10914936056044647976","17462022353817253247","1713581502304390927","12289380738852439500","4200457550175729111","5392413795788207114","8032962163292642702","5945950723331914811","143702402117843086","8125035250340040968","14538183761939119205","6650694683897773100","5554093410493464773","2136629304906861802","13208216167160135056","12439706586213960934","13101579424343961503","98354716688922300","18031019324413444478","3003834305800236790","6690525996913068872","13298357142107417076","3129817622844100271"],["9968251688308817830","16223981291086713142","14948642153528172906","8086554991061187663","14842584972169628974","16339327444361537521","12225632246957115391","3151578954966309488","15525018787322363699","14124842572746590761","7619368508964643241","14556348506396165082","18014020737126036444","12495277666592826178","10273306922930424039","11830695952893165720","17509721212746071308","4803282562686930327","4722831008895672789","10451886766875361736","8707530922684997851","13464490339542538706","13672697402699771807","17460198910961937507","13580764648889707624","932370312994308641","11403315482561274074","11666294659596738887","18376593254367464767","3811475269682972069","12787619840615028454","17065660958274961082","13833968696453974205","13515901026422288318","10534331101347425390","16470412022489692924","11169734349144631626","9535871708900227114","16613934040293140400"],["492584141526855796","7106934358633026565","8689991228697650005","15095593459900665680","16805984439682140374","10072139923435581767","6179242515240318757","8605064287687728894","3353382838618813821","9410040780520219379","12575666968711041459","11369498629429693253","11518549872921286121","8464437516411505179","12576477011570291232","8090584744479258268","13159922468137608420","15385002952294008048","9734757387545954099","16694410458276402191","3964183497464585586","10045663120221253006","1945178032699063067","4808986582021171098","313898663738932921","10085820776402562663","1152115099222250835","4334986120104914327","17814924102082048535","4076945516269637272","6068426610300473220","5569016112947442625","11569122332619871499","8432373241689571159","8099262292225758363","4315036586042601086","3282020735219113205","16711990722097441571","2707068743883901590"],["2678561034997328488","16508025858635315453","4176094362779291854","17326471121017248714","13547101382787113176","17038654753764771383","2126492205680205248","15483668307366368337","16132373195440315897","17035105413769887709","8163188242313377456","18294262462064884089","17861016487497437378","10385840356375663348","5891585266390941005","16851041641522327859","11552865659377369774","11854109127349268670","2459764169995340650","3813118271120582044","1774520969621357329","16310751050059294587","4950128168433570862","15852575266216305992","10386061736958773233","2474111450201329058","5550434024947525798","13051530582211473089","4516772371772247633","1001327408963118221","12618102362483552572","2384226017579743062","12100835945771316740","1431246169894572859","14108161571449606365","17813669200205265837","15457428480053888005","5804645157783869589","5050479558354529812"],["5802527822243016688","942893690899553390","4934069034603724163","8493371287690052387","9560290679859930832","4787068006046156783","13878530522656246075","7836703318633920292","16365914950565456110","12244262115271327631","6632508566217401438","2220249887371472817","2263195799726856459","17304711036510911998","305632773653221932","10568220510128894182","5053196170598115812","18036807038991051784","11775663292317478373","2124665955248702303","12296172233925105158","3273783751554030838","5301260540028158473","15461318365050473875","6917535670642810598","7922885219977292426","583479453191922162","12424877606840550194","3125530387155360002","1324522508738420332","10304458990740675334","10053880177912583504","12243771917278105245","5451329949042160019","16132662279696685107","2323506718323609171","10476818565010252626","12335967052858566943","5625603150807597560"],["6410351337393248426","15038982816482967311","10179725872689160704","6972353394351693433","10475059010988532297","864830636924444665","1267924587290103872","4649020072203105263","16603562786663781669","1588018685123615436","2258583130408258337","17684304546513336444","8263131752770421369","122079490267900864","11459663411422711675","9219696616175339872","17489456248093887934","9697867417973112876","918000223727102030","9896448689234450715","142055351958046131","17813231780104686478","3377420551365396407","8743928608805543998","16169537480012874538","1318269633854988218","15435285324008833405","10264064538464758374","4295460442542661303","13215671153122399783","2407168149450082499","17721930422803610192","13540850634688774491","7375148482764270116","17720986280411485164","2459128908613456304","15426774094114931750","3148507157376676263","14402879316688212607"],["15809984171513386287","6904941190569833327","16136423709446641075","9535808451639366328","17255396536576547196","3641858620793271558","15374446455546979613","2043472237683845047","11025744126457630582","11192024087497861895","8760261644222197077","13259062829155608759","16159902087168499452","5807222023135716351","4113036192742376052","8676411430171129784","5039891119437650894","727697835926383765","16480566826889341987","6195755625534183233","6287037066681038992","2112517810662530943","9549075416259229963","2567410508812563328","12579918977286191373","4592662924186564357","12739553083571712443","17930598309717701476","321406803483384466","3124425069597827835","5098298146666339473","11125672248451920762","16859824667275772530","11311398431339568267","17920542926255695959","11526517738881508724","6436917303493664507","4780579473800947921","5305573015878563594"],["15495613002657320428","16945106797166542214","4746766598641473266","11828671816810336680","14783795854109264274","5620619967741211107","5693658821652425215","10149411807458475927","11545739283943692061","17047289889060158059","8449242047634232212","6487230136044334437","11177825794568276144","18131337959028395716","578674881376942232","11870318275363167492","4782569238124035527","3815642067148988081","14128598975575569879","1684916336415691117","6011204051843396818","13721396593536736630","503387349910478856","5892790264158914733","11045621014548186128","14404804279921286679","5829858118381162245","8343302166607931040","10808830157098942355","6500820132267314882","12440983052663945059","1569770612439269776","10148780720104551774","7278908718238148060","15579440175634808740","11679654019005314851","6962130222473205735","4855070621186284293","13570519982939525779"],["8945401901062247526","14108901737871900157","16048081710728948066","15033794833158602799","9986750481764216787","1260838089940874890","17191004946648685752","7128419777363106168","1054677028271347814","10730256386056318666","17518007074400550344","14739403814022452019","12890361205311014265","2413197489577801936","6287026959326698305","15180070237595784363","18010606402161331828","12097047002035287881","9879907735538904492","12576577801792290228","6256460961486982197","17771068328708334105","13836383498508604617","9118661808785791557","391336141333559718","14113578546560041326","8964854809485525","15592891614317015732","10106086367991043604","16506883148425540039","5381563443915222362","10667713155875638123","11116289667635134765","16874457764618150092","5937290586241750191","14108270505297796221","14170731782253314640","14053573368392566637","18253940993958801188"],["15153387950197089976","15355626595917102817","11403091654722076698","11025850050748433664","15183402139481662411","15351110941687486895","17897043390935899640","13414796474831193851","7929376148042027784","10542823365439793430","10203428278475005954","5207125239198790762","289942691730226765","2091041914776954238","14573809219527149781","10986735076155115674","3071047434642361407","5449759635200968803","245005840260972893","2321587812265010478","12365482264586201715","6571092779321413777","7053623445749164925","15898221135995595761","13735510566623672133","14803884569658711256","1252349559404497597","8719362995232786646","7921975588256543726","8583557245808384380","3567771123173691875","7460090090148997103","10846460129863117014","5099234530195061510","17568851099930824824","1883998875195538250","12175105016450189107","16715498102256169563","9579546262454816128"],["12654840203509154857","9966693451328850829","4057068035860873036","17336264091346838846","17358550077345427239","3225807962798602744","1425276269449709455","17471614172835440434","6923487263836120416","7369815646432421284","17263186731552635709","9335231076786042597","17661030628156259335","15785371588543222741","7301809077507854188","10956076792632997062","8395531616682237972","6784973030035566317","6548280193343722002","6433546560618405731","18290604462711769097","18242038960813848742","2457305464112941102","14789364453468235993","10017596897758023603","9927244029402908897","7666497544912639418","11020436747762369088","6655933162753675231","4588979387754636065","8370338400355178257","4297852284278843294","1372303481382980585","3664606023941508678","2748893948787055520","10215203726585432532","8821602024383155821","13622393282372468863","14270823399036950620"],["16937455718127529433","9602777451919216859","16893792116993651140","5072890326808769760","1863439985563411131","3311352629284544708","17018671358778115377","6971629781369560393","3784170423317910024","7110888002384837834","3885702562390671062","6177937040461190610","15018301818542821820","261978959875036861","10549835419550425898","8933510002433638433","6349288427196023637","17160072622478638110","6562379486514444673","10552270097601596591","2009965441203039646","12706288183083178086","12613271684857359922","3795004923736468925","2294225080744789600","10903216690935606596","14876243858651440355","12654036790334458802","13820456466561018621","13109853808043979453","8645421092749617319","16445025350179292691","8700966240823065983","18236532115285480606","15741895247422838284","10000094992697005895","7283401567693141823","13693707300373841368","16403147587231405172"],["14128461790457816355","728501376578915414","16904581068035665354","6540000279200899664","13528034072285480645","4666618875026039891","16040226670454081140","10881117014685229702","5735448224439482579","7749944350640084120","7439372047158867229","2760148062854369346","10452816517854321898","15411486528897349090","4744456895373930866","1249783691239725003","15381778419543287161","13480619981739569639","4316974102974062997","9867899061554654083","6849189036731848490","12888949851256354907","1401621451713373347","16442478028672376162","6148000061391931415","2357388017647363021","531036821966736633","9548766498809829542","7417534900824271610","15101815276310735455","15711673410200004341","4582024336637704496","2956957548889884820","5051910775909002516","6819344568799797298","2105784752360313503","16195630769671592572","18405778884037499496","15442380737958603196"],["9468157678995793212","18164334780431129087","13738954307831309679","6167922646878332914","1735877108333709145","4522055551287494881","17315436571446783932","14753209441652949405","17789285372295775417","11442741696764904453","1065282268654208600","12404206281623190883","11707927573263672484","18446101198017653749","12197816895242602284","5494446404790841975","1418895553492882322","5251083793344299193","7813560728201571657","15221831863820756102","17816810174018904318","10121610034496619177","1235463522189724606","17227589013007265968","8392942751878326617","18066313338019713456","12475835315649754859","13578839735319553911","1809572948087877548","16163128145795480849","16085766848379013659","2785210002996246045","18281148441890074811","1331893690280168704","14533111221346307575","17506669569980301259","15384191673924114173","5715971713274477430","3897122425590909422"],["13478418223192699844","17175050387022288671","10902278731955112413","16585246306954940983","16925736301117145155","6288024731072279137","4033031625393408292","7826952373922249620","4248049775560374861","15281008544909049089","8183664466939366782","16945499705724188102","16675159839962631329","4884967958725037025","10703517054542923263","2055476167430399224","11541531583921439000","554865601783441534","12446020364843654671","6818703750249278699","3430251956709704478","4727395652646547438","1342256864557026407","16080337362220658462","8600368892538806446","10080835595198413697","17124207368879291520","4730070074666246195","11423451136211266162","14908123329569265735","1353996540883201417","3062927653676132015","17816260798517283858","11268588506323529615","3584787302139713582","13615114936334467167","11629750191243441401","10450425245713135903","1177371417535319756"],["7001638588955616344","3926307985776116411","1177982445153358519","17940126345005267174","3610307733202173404","16950525772519062543","969228287416959030","1395650072696187320","7178354131129090900","15927833404286227841","2055332406773162996","1746696519294593958","12974294865912613642","10958576788795440646","3122907467407292798","5935739294189331610","2586045762694512736","3811106977313103807","17893597842535631246","9402785140218062470","13841202733563033041","10041924135065639662","10588247403969193015","2042439274060623713","9552104193056492606","13201321973561766851","13494705901607746425","7361092056324549326","14876629224882273669","6007640394734051573","5176659709375898414","991980303101868226","1365173065483619680","9110434290249459147","16637005715542401197","5279249516432598124","8360207987074060748","7338795119759429492","10138171654496535646"],["6679046593546121633","8959209376060713070","6777645224795478343","4927171628580718756","3347116681193301929","7188780313770776555","8077286553494780795","80487450389379114","3524903452080479229","703124227233432208","2935488931725051485","9930980694784156492","768333546681212353","8840113265646222595","13019006195645153150","3339041310423831733","16731452489721921669","5514809898837775092","11736956851849901370","9234159856561912065","17449732237823094589","114570120874515255","10756989033651439188","14130238474203147134","17486685628516544180","13296019585845129206","13465458366242992167","9592971509390579733","15148844779716298538","7698701121280809886","698276570577746094","11664162558600706614","13764387722845204049","3328603456301426280","4879390422652976158","13961304198346052848","9362301929620170727","367628149622846069","15943534928896300730"],["14077124294951958148","17043021171070793724","12416170881176501209","1726452609077829200","4507788514711324312","10146213426861657370","5295200698592194779","3255830618987500554","7401925069993732288","12981948966947542748","10518945533322938531","3788899298058864990","2757427234164096010","15505998356716427645","13218202032601663781","14840709955944186566","10839681696674350081","16112973188558557353","15636482906914093664","6940018048414775241","193753321854019241","16743904515354245421","5643771686445084211","2548374084746982135","747367504105972018","679041209443125235","12378710548618166183","1627970236842163492","17528816716832089223","17785675307587508405","7821465608565497360","5698835362996914685","1530834361983135674","17243630433391255194","12689546916351376469","7498848983843401214","15476083514089408497","16735457691747073043","14438991679274825009"]],"s0_vals4":[["1173691165436006437","15788197332941684420","2852516075101665345","10511868733459073990","5918731972067563290","16686924208202423965","16291783775414567660","17892468939355705085","3227911721459098710","13193732708075450225","2269567024271818169","5860471515669405284","16686491219894406462","4175022887579402255","11978747558199134265","16602749594883009782","11331276731476906979","16260111790395608000","9589504319151612410","12322072379988683852","323057781532093869"],["6050485842396154527","12226911404487962603","14510338685578204365","14720509083587887860","6913266651105022213","8543775796425787464","5752326253794131492","6905010815221627533","17873506935263631236","6525676330152824798","9062596227346010856","10675085369545578348","2320443148048955457","11976371116540619345","5009072721625311364","16386902381353427315","2861343192651447417","17195152823741085190","11973473920598731083","298161975909888859","722085933182230953"],["3829528643365455081","10703734866222924301","12633758466545291268","14200410919617030672","1913460083343085907","13692347773788449998","8045194750309929909","9955634084941976437","17394720027123550612","5285348799395170987","3292992152871071507","12650763751237532145","12803324403906270163","7121221702598093859","6599545223031262772","8848805115911618715","13146752775072941265","7110146124328636586","14230653766626561022","14229326431862323224","6011793125385559114"],["8844580489959451736","10941462862727647984","2892876822285543033","12843908614022719963","11536170576171053912","1308602155504360374","4428686771267345349","5865892064970144303","18047206757398388459","1272722627101176248","13985849608986787717","10212454595161758431","1377611314929572302","13906955582851248291","16425256952632899523","5818105671003427143","7887494206111326931","12969173691363080084","12501784172894330967","7884585313344434953","1910656615286477977"],["10359243989046369149","18309609234759438722","2180503046436076171","13366162657815255090","66667622653552877","10056051856141422610","18010658147934503994","12623995279033707082","12251841560305153521","5204182353798127485","10288708785945558991","5416895248416152354","7165971922359171609","17462760168654647234","5768418663737257204","811355368707002130","13232113226515935398","10437507178732856604","17493818550350037598","18104952223260543246","14359470722068761870"],["8755167947454385951","991063573215952935","9534126817697446188","8542108496871115896","18374324589163304294","9019951557733845020","9804149031612147215","10447444814512749717","3426751714392531832","12171733318432626203","1156771148648795705","11499599536907789487","9513087720151293712","15972235610992295954","241347014484211918","1779684467641015211","15474967493721047061","13663971710079458005","76086082149582450","12827010656513447648","2473566108387394016"],["4222122197172923999","8353236709470613437","17264936396455354926","9454878252500557519","11612580983538369950","8408511636203570395","2782170077967621746","4367286541563300970","16112813858492831805","13482588323911760074","7489830607812530370","12338873833674154601","9263368147941836080","3302954165686967924","930866806997281106","15525294626621215047","10449155969197735350","11509917470313716944","17077107534474947860","18436953926029937997","5452251705057297877"],["11857899581637107107","8748855672312573344","1766748010416768632","2147305944720472183","13739543596936075915","8638220643624705268","5619923480337637484","11655183173417132602","8682331438585232310","18245112335108697669","16186914116087437061","6672969848706091226","10580825854551058111","8316516756524935572","8358510454901387496","9552862065644701215","9874076980543644574","7807413111926678706","6765598899901591001","14745824876627476635","11688280169766790622"],["8911499333360264865","4139343689548070876","17961095525175689977","11733443513449013407","4528417166049121720","8924893213415596708","694708885095431017","8547532322494004843","17887138334054801103","10366484912919593112","1200327763370705184","5090370302504135621","18387728848324795989","13303621119255939886","13326815844171313351","7079929331812561868","16184744645255857989","3066818707159667416","17271848846131259049","18128520092216620979","1621445207399752133"],["16017050906346594202","8533635273228855609","6434651787654425707","4389798198558487097","16387523352052888614","4957087618694597942","1550874674393457877","17187035337759409649","1350582696535543400","3136162514687061811","18184992935537174285","7996810830596765307","12827033988829183727","2398169595657877347","13203879781366042807","9158238013673349448","10503763736528818532","4453564373526950041","2427216893732395104","7073291778921077089","10664602844890127745"],["9332205047326885397","10946727508619618734","6795084282127304354","8695554611612540227","5751486162296915472","16315006350929408883","17058340196790004726","1186350917130666639","3979917009907681575","11589342765166071337","4310399601133158408","11296062190479028935","4601654014982989164","16831138994380998686","17459457266369983328","7414993934883096073","3323882814790580317","12920979981565826893","1091679598511025396","8306668730316300106","5288424784577203471"],["2944093472359042156","10967005669785090941","6866425257421137194","4869995683973122197","11177712650378502853","6099726994419290302","10064516795651522462","6575222027260190005","14970813229948911503","16270218028441018694","6519131767995881571","13867142821608317677","8135388059683144175","8266670258279398968","5507575271547136332","13347447461390980632","1464742583458204426","13696977572878754673","7989795163862974401","10646772328602514651","16883555452689849480"],["995811646460395765","10807407238057702047","7169105679351181598","7193350172459796377","9662307450594747404","5048851206090664850","5898319874481810288","637971840088907595","4099246004658546458","508681888296757299","13967205860316798180","815195228478616447","8579343300279833199","15620581807478694433","6985925863377389340","3677307670877467300","11744806834624900460","127062016113929404","16140725286012572244","1259852978928582100","9668956874664400287"],["12474707391792506392","9821095748418125902","15522531193963955464","18019408754352771428","413673317201341412","7134890950125531034","3356110017609862557","8967654875707789062","9350554311205865304","4745105842652637974","14878299243641798996","13426078803390722051","10701896603056503110","8901687216975244443","16168494296636511320","3456807870383453627","14260156526127250317","13622658653005458257","11749188049052082555","2475985757567512577","5985646170247459453"],["6653461213791249053","9830538786239308513","16729102496104991508","12712942575838975123","17163555935368146110","4296944635129350795","7985480644254563082","11806502128993331117","9459606197608163110","1186688564049802256","5704731449701961233","15647579614030076609","10128314865545924112","5220533265586373503","17621956595381822387","7607349317270744181","10966482269963923812","14367411284795116216","5207353100993303827","1636243908457061725","7246604526170422054"],["7133954499238140828","4638167162029923708","12956604809977240380","17053757584163162471","16365608773545401061","42446891873846634","804335154451579617","11427171044793060698","15043468672199908177","9412320716063368708","6458499360503478947","7051659545386146310","14270326244165514125","5196004923565032835","15438242100448332251","11284633713409513718","7090228844824115520","15313219271796497868","10383131205770188111","13217483436941343234","2267959494049670444"],["16993855404274929229","12500988888325465041","3361353007006442192","12794618985776810311","5924260426439560173","5455734493179252739","10262920006300766187","2975035524806938163","10547165981141754878","2828835379644344252","17801255874586775844","6499374094681064250","7557288688867946162","12110684146589954552","18351064723005842924","11160596269783799889","9185930789158106663","11976876118761093402","4121353238349780880","16817816617886760360","13081101016118180741"],["1306333965714501461","3845418341112697489","2218960955360703611","5173390925541447494","5904562751918967059","7522981289066090956","13565940754182330686","17859619369546294698","1092764603283914305","383139602883808822","2967963714458275986","17249026945346357998","160463429450330908","9704038455146077417","10390188354207456691","5202550647858522721","6752096016324026137","12256357770439598668","1208108750025588438","8261133359108855218","626559213345826039"],["6003011053750760947","10308340697319870565","11416739546769528086","10056452056460839497","2656172385110278470","16360062884905923426","6598890686523661420","14805348927585243514","4611865114184196652","368966058255022550","11691826594340000382","5463680350830928125","5237164452536623869","3740331073779951280","365985493542595612","16279805300943283700","1509831747300925332","18001109588522112777","1347490456939250332","17197376972250522646","6199972596377054387"],["4939703334952403905","17854176711165781132","10318691052506556565","17072983483382177340","15732606664692924952","18433413232226428894","7686354041591651656","9953156267093285775","1658315993178223181","7663520442599559539","15267282046150009800","8834688319627752772","4792041635878746313","15552174777156152443","9734636215140640235","1084600359496855610","5775256961767676201","12644578282746982286","13019618401981233156","13931390306416352169","9097690182138839049"],["11376760462793511673","10903617782049958318","15472528595219305254","9012924488823145720","1922930910428947818","16977326976195131965","8847029365458093800","17463961738537346786","3781945889090708162","534082445113332565","55048686510914724","2048681369597150458","5758301626181852578","10227686812265464439","13948479797220056961","10143177779471427040","236496848780852245","4139554321902279935","9344840939163437187","2407894655306605783","16930960275739776065"],["4211977446044642914","2994083788326384769","8708807849957288332","9281437969200917245","760403227284961461","373754899829675104","6629415745353546528","13638923022889943040","840739065795263259","3410375226988004496","3984947824924489944","11667749580969147935","6829005529359946992","549626492873993887","4267787697161961364","6944088567133856883","13697765049431968354","4669794229739420841","17421346792212787602","15629690967541499936","15446596831974937596"],["4230814730813381119","4943692891835468469","12040942249331179037","14526353392457194928","11414785087037478255","17379627063475049145","10769827394920920192","11804471733973963264","17575918881001233838","13827125229995201078","4113977596459343847","4099843152480258648","3043497809459249725","18316194801426901412","13642371031612493408","17563050736529227536","665624569108248172","10614977913318909002","4797053533357713648","14874737751126225134","4835447760553607606"],["1019299379718768628","12230453837385974535","661822620088288802","17462311540682642362","6701188543862540138","13464342084446448281","11765614375554541380","18130228355155869503","8757811336582047424","2408094813856624870","11613610180842072833","5189326420812212580","2994098791339984159","15891264655562470348","15038290314935670457","10914184657969741969","4020189600213455916","14048760767341559749","2323711872414799654","16800806099545020225","3060662686782223152"],["15687311383972276584","10446587026789383464","12235254979628633530","15499708671177577579","17203143748646759335","2577794949878331590","17736168928991829187","15757924787274483430","16809250325468153853","9878283202299493005","6316871122031790148","2328914781588984404","4834739419059869037","12652835793972676047","6033770824078476287","1501293382784357426","1585205162488356795","16557101924254579144","13482217654363282604","4760149498467444635","16129697138118418239"],["6042460406286030970","8849167117152512757","14891338364380868649","8320100706675019077","11412064343646007774","2451721084765399294","8939160336588883961","941140120491164505","11597556628317404577","1064501491089117258","17832133375848509923","385053179747318095","14184543757522223275","17298249455846361296","76504516047484113","10695741929222548573","3781961922100977153","4372198853340109462","5649167116866078305","5898236410212840473","13503528058605837322"],["17268523761015017935","5275167581443171742","462345506021376440","13512807770391257634","9102145403486682387","13743891975253664536","16499961542885254326","17165610075033659220","15781773393126650412","3720762518271928020","15863496622277670414","3546651194060455840","3343546428279742333","15418835805632764896","12239218602658447678","4606384145240158785","6038630103161546543","17244337053801991177","15868363468899708434","17427657670424959167","9009506879287202382"],["1074591337868791895","10213749248413641855","7531954398220273966","14393715892530239968","11156083684194628322","11703042330065050250","14965208150865533689","4500121193394020874","15268261199608264349","7451133143242072270","14769683601316346464","4552915207747910238","2136660485480067485","3366786513626432928","9444405654753880446","15023701758869893721","1471868622754464163","9851787137149001878","18065072913121851758","12282583915043349128","10718198122870145991"],["12230184459487956597","3084206970716911482","9182738308486364154","1351777832654632919","8238374641961336175","8918858562256168695","2911962676873008073","4513579529477688656","5174231521953506136","8517214804399521628","10567618164496683330","1593914216756091553","12496251586950769572","5958241615627974640","1990853745347935097","8844233057035883774","7158233617537174248","8086476280524371071","4225782039220505551","7486736312674633018","11955647024648850675"],["346533704105942724","10710014324536368918","7445824963073040796","2099431565460036850","5250027782301099534","14463430598238934575","2412286494263739834","4162148306737259190","13578935404166616305","391646396114389252","7713790100749195168","1762065186988296651","13957614670334179246","15734575270645717070","5607056769979004893","11651801079394997804","6060148160215232550","3841322261786935434","3038375743098345157","16678576868688563704","8535754700639114760"],["8350233568042871519","1303908656428360394","590931793226756257","8018525932816743451","9034482688321553258","7493288412405706837","17394512135007568523","954168497718660004","18362285383844893689","589209419963830810","961293079771718903","5133501997877853889","3866370556313889988","9189541295892132458","5652215593348078887","16411574499834711644","8487580095516309087","8208550686381043968","11001869708074491599","138596037890713540","3733119617644880976"],["405605218865093703","13698488821448558839","10136916146490573440","17419234228901967901","9233438204803664249","8379572728186593943","5773159577142497484","6802532181049455259","10205620047987169091","10175608636713363301","17479292917513993546","16595964981448803219","18139292962575632231","11006674604139368358","5209884313766766532","13339559861746198861","14681671645497378770","5332384561619617799","14233552669504717351","6195128788638285213","3414107590900268923"],["2298113984372273231","15571279380214320180","9137153249865750220","14656851071307169919","15122702460403195250","16127979747000491580","18334971798998315914","7375213290103354010","3864280867712243384","12313985968359570175","15949021626553181693","10527787751225501634","3573097174726709594","9961758325597327051","8995334761539923466","2865930622946859487","8996543058987283076","15428365472912109171","11297020887391247206","16324004061339996922","16236048190779413809"],["4205814297204616279","153506735573884793","8641782714424334750","9761127653822451430","12208636833723780691","620443850705570187","7134191587619629349","10108134179747110825","6601437309864334336","2156033189390588940","2337600057857205430","712352880978539926","17926726921044219575","5396769980110971444","16929261259146489424","16100612236077619615","3831780236128071950","1542994898273506398","14838035405995610536","14214678923557081583","5213158773243270073"],["14417744294027598417","4388908018253402172","11313182547062753813","18022602676615725947","18192554657161956322","1015233327108344050","3441753031965087048","16883784009516721334","8768656814494829857","4668637165621820262","5510803763568501034","12316432653589881731","7213484251818758876","13228065365438176523","16958945943610331812","16795323253248256071","6231780290592074059","7699268085482837370","1808369912135714141","6094435160736768557","10559535514088298801"],["5196282291227968606","13350090134095747242","7050018066415417031","17600331002147897236","11847819368532848395","9437831360221599877","7952995845425558082","6075510748813831159","11758236251157234485","16735464888668342962","10831023523640210792","9106364964644342298","13653849323428963292","1663071888737034941","2664444285537571061","4635369203337762271","11793391282931256998","13391993844839710091","9418853090283211292","8200367838898498684","8734591550323471074"],["2802161077721348257","12850401735404495121","16127222040779494763","8788253435386955088","15421152510186374566","10958363677825329371","7919081775503179790","15936032257215405474","8981161629927427159","9080310432271578015","5894336853416916539","13250572408498128089","1683705619238526556","10217087520148475020","15767128061749722009","1901470977986341028","6885553813320264816","12465026030425183380","16602072511117230299","4625656641444193894","4994503246261864855"],["7370729530615084953","15020328247790959368","1232058076954537480","14196197240773178619","17273927272227781708","12343242747335356354","14782369160433590475","1903526982427160054","14465259734826376373","3869823225819272999","6582068265146383625","2473622086800911138","13120494870656071789","3944744543895537892","11280757372452857064","11456354552132219890","3593954713876839753","4264585720902895978","4156304670926421737","17615809583412726105","17811908208738465797"],["1308389237556312739","18335962052511975362","10457353562597345192","4591920480188070080","6803788493434657721","1064477996212869663","4828736803203101449","421706249155003183","905409495620606297","14591650834204096262","12905815098327980874","8276324023424056779","13406088623412294908","4913117261138464593","10575658629044571546","6741871895380950009","15688997262165850706","3099151136113370969","7034100252088581983","5945041004994258929","5284162819622522301"],["498072514422059992","17244919221439719478","2422708099121159903","396401539008166878","18159907826605810934","10285233909067084641","2707182400833449983","3389523679579645339","8802396663840556913","3756535337476111365","12379835952779533259","17284266014559833756","4424374411121097933","17441260648947262310","811797088723221558","2278695286821478195","17338552836429976355","17107866066466930707","5991804318132186679","3128077457195374457","15262556664796033222"],["10340783676582472207","16897240640513412870","4285275043860332699","2770276139564071131","10414584615713998788","9349634177268266633","8027345170638636311","396039507276681109","9763178267086954031","5137348518778129204","16689587191960770070","1577410775066614819","9065937284198511049","11722332323047099093","8113877300398941885","8759681655872474961","7213365045831726825","3600851091440274198","3090710308412959952","2614843774862318514","1378719135190074332"],["17484485269856883076","6775298285243987555","5141581909050867963","15077182067270368063","4313557514517351041","7080480794853234064","7166157712485557908","9396529274132106902","4662568563876678582","9372397969133816939","1760404529796745699","549116147060920484","10286505866802026923","12401511921952259198","14877893352719774126","1178235880815462839","12414088930025039263","11879745027366527061","2334024847305898700","14213092177678463989","11420788222888613192"],["1437876614148399389","4332822542888498625","5332123261655839528","7260399202006207421","13137454504533745680","14319956186026028984","7356697849009175004","11969180116271222070","10534950059445994360","3577558796156746450","5372585270404579019","9015093048353499933","8077182871823834332","6762746028353944564","16942683424184208224","7577285770631827268","14637586099169940689","15084171682593264462","9176523148384710263","16187216074705109360","13514214982570945081"]],"s0_valsC":[["17112251953876005682","8926596817505156249","9752336556654973591","6740250459288288350","16567511857435124407","6801094368791041258","5601704722009356552","3572329702612702170","5052672098686346207","10886540929033382578","4345840350979810538","18348468514184531113","5619753073185033228","388104687588291293","5585537535317767013","14859972062774297011","1932633982939958274","4130666271813913982","4235978900285723905","11517067395565374695","16648010785161294074","2990076847672790766","2919535788115581185","5813347057164042026","15674810678814375980","17065681613324477352","16551789080827324480","15425385200470475812","4213737495398094678","12089339439006702575","4689292680906031591","6210964075135296992","11165437895685253594","3822343612090793745","2609165495559509788","3610095795086230171","4275029164001058204","1148350184614231519","6614615427858766300","0","13426381752312628132","12951428328892669827","14074502213962581720","17273101669855677964","13195377985705756953","1186814155067104438","11147250327257450040","16950784235955898376","1140719641839312472","10240436418074073245","13463815922698484384","2806839573413793505"],["16919354609137942597","7569414231361899194","7314658262148899814","3217475012732652557","1705721515737481232","10047104719123087093","8733841090059315113","6675478547728084992","1732815054872063660","3563963508515877649","17607093954953810521","14244192727442348169","12510452134722691143","7655732670010713116","17686976487705436991","15354489783578995268","12001921680940442951","9620662800973681871","10658300166647278532","9473931124482447386","12921290253905969423","15484762292357475055","13187783633420759749","10108131789206888824","8010895657786290183","5011776267816603753","12366755413430635958","8345000525634993820","15917655667684289701","16642664985636197699","10581906485141995762","15679004221657583335","3211046222320325132","10558589099377922319","13755660139140110261","15436512820069555392","9135175940757912332","18117106674686325229","2013515368560229696","0","11065503825937313844","8686378711491984607","16448461670863400859","17255847361384812736","8437833251763783952","12799507024240735468","5001403320370222694","17976348180143891313","1980081075796093962","9993275900819555735","8643270634853897002","12237886164518398772"],["7113369836474761629","13555835634808358164","8207260362145294918","11422889664123451394","5899180308619687958","1821267312204249641","17597834870009482017","179795672620862650","17933055739021317786","3214052286369202853","15352847999913049843","5143892952595371380","7646656526052208529","14112562824954369090","5024850107988470629","15700490067735274923","1230826734073109686","3117472962296893350","7371584929106296703","4759818117005026686","7987299637217686810","15338762582092965525","18205093283370102311","7242904463423889304","15990925394259122046","9846762084328667150","16834295354660721226","16884454327731941060","12077256653262512441","5850363065296510953","14969310647498631235","16965147637254645149","162269345838064738","7204625968987743446","6262472781583417854","2769528968380256263","9065582099748576436","8306219552876827368","2861917898288705435","0","8481442297177123551","2291653375757481119","12144738326231297731","4102984740977390445","1391363987490104240","18230467194114879827","10195338357738810187","7858609539610514573","15175457381161257924","6841748398734362285","3717554163257085831","7985977478340868477"],["6233115037886316068","11563824017059959700","4956782540289034267","7373023599838677760","5095595584517969959","14081486396319862233","1639949876207897802","1000566706150003167","5110721073975562879","15318788197991719085","3468238491395200544","14879621641728691524","3956685646326008312","5789894067721568735","3058098095290574292","709441290389678064","9773924915173933869","9617164277167552519","12002425623416715383","17305005342525202129","12417481211308217840","2657171719904345024","3330249743230824750","135193988569102177","9472032482432273938","11361359151433382048","17972550984716932959","4785546457514061933","3825488565221093881","6517601051432919641","1309762838284470406","13690302292557199203","370502938319768652","1910998906229060420","11940473930692756955","8990299765016471152","10171834265346226540","2145929794317227338","2003643807556640576","0","6917554283752781969","18159819634194777405","1687606110408373815","11601161587468872418","5369696789626154615","16115973211909010314","2552093205864908958","13571103182544820646","2968417263172068745","16473010038108870540","11430801762186763026","5423323591600110258"],["1750403862246325322","14609884077267812578","9447130036111752519","10157536331110426568","4681626055237448536","6957040674430761587","15482541391544679799","11017137439660053461","16377662507018266042","3652035851418930804","17325809690246380754","619343984826433089","18201648630890626301","17703307989103612494","5571735337961796150","9502880662517805380","4742200375505623151","18124194297356187007","4550629908672003130","12204176537511980163","11299911555039032870","11348095247824360570","11231605585707837601","17395437762892051290","17540577134604318654","11706790346988987805","11796021502710602811","16365502491905806344","14119147249808711359","3476883515816998654","8353055928322956046","1823250579031058296","17625698244117767878","3466075539990437459","18338541531748787179","7006528235708491428","4930664870277793991","15770718705753391095","1207229157966967561","0","11711715544634878730","11346745609449597463","5938000929996328869","8296194882446576117","9606227066580624712","6965036976635623185","18107398657913548050","12532978798951429027","5756136961573986094","15646524366537477950","17706851129441979875","3939275387399396185"],["16963586477075858020","13528164149308365717","3769964834411666897","7272436095827341220","695189038150123981","9219021416965444166","11130308156275716271","1944517056854306645","7050200571195933552","4305311877589783490","4565469470009030520","2812925555259776095","5105249343431711503","11424060715176944621","15234206744642665102","15281808817269944856","16489061928279881528","3016232788936648982","16379356466415184111","16694231096376512157","18201272912338382835","10649375804480469738","6185086475922491324","4841045547821244055","9429530373242304450","11945956818608130663","11072286713819423434","134312333624125360","14763024161831692132","15307477502670619961","9020584097904801299","4724829784646115210","16366777913812823197","4610896079271222274","4461444556756416875","15997981006174280057","2070338797272704007","12821205993932677706","12616009379790412183","0","4694363004596743378","3811211266167102292","6909977661278998867","14591619202372178988","16583123716745463972","1803213717350484853","6501416902139915089","15033007385173294295","7755224497440656135","15787934901110349576","11570119441247008468","1074450343208569863"],["18414458691931656667","13741728178623918971","10690188259483359956","4070567466435871473","1624818771468112500","10911634802524408043","5166556270919295709","2748879548846747701","18439272573717819532","7830923984836564310","18423653177364490141","1579610775891366924","12377686767331176704","13856154319291302058","17976408162438615018","1484705360166343179","14424818803783454395","799548492254235607","14542567365269828302","16007760843924287260","14995839209609179177","9591687656056650447","6858742617624628713","13701713736263939431","6782072113672530135","16191411663556885944","17829462483223060075","16402469413142539182","15279870740894586736","17069876868355159663","17530761924291299081","15615469323781950585","3016925734510220043","16181981606456786959","1622905036482594264","3499783826462486157","16879849228862679873","9738280277802934639","15187741726030612353","0","10458146863277409943","14237488052123662424","4619085110458245986","14515180740015679960","14425520998871753108","8682827276648579783","8588039857740016386","16390025455322430809","7720159979044774302","16871117113018535334","3489562568109063614","7594667068958734507"],["4157410593640298009","17274049073575750082","7971975612808794244","6801253727947418968","2648490196780530508","5984769225185922939","7100957433982682851","4111851185567024223","13729624543967878339","8962368647014126556","4636072408102180251","8102490771371349913","367741259497427518","18382675444870131772","2128106284878024313","11433168330656592690","5001059526346328436","2131114386188104942","15549926303586860196","3483638079514840204","6121509721317308643","13953813351978778814","1135875602964902513","4539285745436083176","17179661893369807245","7717678491009442550","12165601124633671722","14548944456771829897","2049783511567327262","5085009444281146262","1541081301546782724","15024328243787934660","14222202394608433643","2777898345416138835","5294732714129925102","1924005775776883642","1904182004061427487","10181848225653418130","14185793765964125963","0","15566381497805469482","14252905305589861247","14535008312230156966","14996667439545147366","12428350010946208692","2361614793702335163","167403581981445388","9072682950611879429","13440553548992046681","10049587543720746523","1353756391047241502","16873590640522818780"],["13625439613798755900","18009672244873880091","11318465679370698566","10890550148692718166","7993149160005816502","7206902447610469848","16511562600196075056","6533005396048699679","2595036818525531355","7518572378612291736","15879197300611349968","14282372738422086552","17807176348971110535","9498856364589289471","15734370985284296211","5112209016734826880","10861666882306999302","10193382333597065742","17934935149495097000","8432845680219830766","11223114658650453426","7278106094082165424","13135685129939386980","11614082821171687926","13479415421906109693","16441065957524140531","3869148290890550105","2607055858994609564","5618370301197377720","1646494682763181484","6944289258922401703","18423454614556685219","8189458293769423343","4843997221234014937","14196697973795061562","17426719746440929484","13972005433011138455","14277857646370565414","12751030182440343066","0","4781090337591282662","11780938204183641561","15893483749579613539","17210412501053233533","16468645299449114900","10872485706698353665","9860918842313351781","16051259801671038093","13281242042911752353","9869985554852351333","16784452302971944688","8530407098709067095"],["8796098701869825091","17254297734644429688","6261653758267055896","7299254531615531306","11949512841650279507","1274828864607085492","8757403646771308092","5591676999303322843","9110489477829507731","6300956984216029816","11765566023053151810","10437796555330856619","9885928505713368089","17046878620639466474","13151139569296629363","4584400302761507181","16816094875492480844","6832733076675930884","3605906022909417718","9003213471142918855","14179503413376362735","8055301223831570176","14297630710874344719","9548040088173097032","2918204739939587398","487878410973759786","17190674533754439792","4396279377938199273","8481806925286726971","3943343764224538279","8864744680643906193","9345312731722903129","12478261441026711945","2704811072523662416","3404322045982896258","14978547211242471278","10174810450138703667","13496058977311789973","15956688385045856353","0","7053660517758933651","14518655948170243703","8008400757611241667","13558840093219970079","18124802316221820212","15633889981425407215","3452148867164527973","4642968027129709393","2580632357905012384","926527195920672366","449993108628071208","13722025356747553127"],["2721587495201542054","10442530537986903758","4823742707670209653","18387523463052379765","9315522604878921954","16533420002524779873","16002965088409366717","8035973713228929333","13392777476480195412","4748457075011222346","2509639087256531658","8637976570323047472","14823470132135069278","4358958058374128926","14916022416474188765","6635227912970097913","16080530681243159047","11628911545074332476","17245131374028676527","8354806109768601184","11862790065151681754","13708642584599037871","489779115308562672","6088735983463454011","1473435498665345607","3701639577205024903","10415818164187286232","6340436783285582302","113283817996976327","12813177339154107055","12037542585459828152","1201714608455474379","14301360445271313028","4108748849708476741","12084289617064531276","3879318027448485936","17143188949909994345","7225591730894890333","8809554492668104528","0","11931524568591763737","13843412316555598657","7159501106127396640","4201061441612260686","5202596985525874336","7993002617940012736","17829111140754687121","10728427391861853918","15055791261409241684","10600236286655501823","5013063642155549176","13364723473592970297"],["8754274270368709072","6894298436448584302","11852444872571180856","4897019632954643036","1647644723194745840","11730946605737208438","10766836133533550113","2233064608619958862","2873552507254581129","11702650123640587726","3383918645699415343","11927281683402391559","15259497933101004899","12273250311819470675","4103917461755335633","9422582883719809818","13633477692531247943","8634028663043653279","13756024265606221110","1137298068022150960","14512469156886034120","1933857106373191607","1218175145526244080","17612284999525563259","5424973079757995518","14385569847370438664","16439370817191645049","14360949190147135457","215198271221218340","9241924328544164882","2721268542935803249","5560570538443579797","10807856604170605936","3344631709802879899","4868565553116950986","794169638255963645","16880645061571855052","18125682000538667465","2441914236389033109","0","15195316470261210423","17726482254418917473","17752387172723543665","16217171198032086605","10710283814812252086","8299982896553703016","13668803898104873904","12806593949988021091","2184336038416444516","1088940038361617656","14620550238437563022","16168337087766327759"],["10479502876900860151","8732976457833888597","4146542506638881302","15346380859767828264","10425117220885089879","14219962931631851430","11621849834640038834","16092679558949038559","4668254400704688287","9968344109478979004","860745264626542631","11490213419652970209","8871671628224626553","6504941655662571785","10528424676101950170","10484023735563686271","4761963549038218440","3360487210939224425","15521265424606924810","1672647745811217146","15478691529437217024","9452732545108669144","510134223720355463","6199459639444557923","2020877862859209433","13570221601269356156","9787180439108748299","13961553693479991796","6676634863553433778","15135296529997769607","9183225030355004146","2495477156754621164","11093780996081058911","8752737529638398143","3458347217733002394","9554124404696134882","10776105336903391148","3424471577302567932","16933491888402064081","0","7549325328968483867","4500908006403284279","14120289839304965760","14657303110111915807","11658982742881292952","16877876609163529726","1986470415384575656","5664202155873042686","3873558296627091372","7776936699517140375","11094980727429470279","5761469204938513816"],["11558624473039155022","3225921322755318421","2058034756439848176","652955282662264143","7282790168004488228","5480664695926753476","8547797317723278605","504632316032573868","9133220747592318352","8822165673519388120","11793171787398803898","5904545208443695636","5988294360675643800","9440359050466412389","18150841114377793328","2467577268952091873","4960807827401542016","352770164041788388","5223195557455404872","13999406901181061326","4472451627605183880","5817480573423309784","11047549314598725081","2624341993257628147","4707687112224398192","15295678238531968138","8332778895198388737","2660662809248371600","1741819561286344073","7636440698538662963","16626279002921916452","11728630195891634836","4862643231772115791","8346874722226296930","5681800244638974083","14580317679974243496","17324647295783003970","12499673341975704608","17263149847880189655","0","11298220494381561114","2733747414667905898","6723608123667197220","8265787088499279445","4215668498332637998","16687595522756010301","1461067008395731729","18367764312924373012","7064806693999331186","3490998819911147046","14847470899348195013","16877784400501764179"],["3898877847935508722","7237160778778270735","1388873179973857309","7753158698804164802","9663500521621529361","3365948809417361570","4752649843012312163","10608402139895490543","17788456152855075682","17972779983768078319","7404558086524838750","11234886812599674878","7213997133417194961","13153669742780838240","18435108491908504252","3412503349876359994","7654200558553839789","17888496002827394223","11777387621544268475","10091155343369289047","8059469630068984518","2057546048974579977","6441467262202517556","13572989555666936885","2154932661424406086","5736198266056468387","17918883516983654741","1730910010558059702","4690410117799727821","5205473330428169628","3302986356886121783","6809896381979292193","11198219488575236009","3035301946656532692","15712707223462371146","10118757216581610664","226630803386381092","11999362274825818752","7210934840558709298","0","1161282435108973758","6248742401355594730","8568368609048898578","11958115622355423366","1567202878899037098","15292076554689178000","13516860252748606497","16141870598993949096","13806148720456746437","10975915410886310172","12786841311789717970","3632497167368906719"],["16952155114234811446","14372638113044914292","16469839672777353371","7407186911069750511","8599302514691516072","5426097315960635372","3260354910437959841","1098797371144559496","4652712136200760014","18426259440379012620","4051784878634719918","8168299237966502062","11059812610319097090","15722316377213099630","10871616493683600656","328675825976488696","17367786616497931650","6398004252462162555","112017360165637469","13077258032991185572","9320580081749981056","2987490952219649440","1841088823947271993","13986598446244133867","12539908000833157515","9197866823634488064","2781786146946549967","16278926859191328110","16216866552962146825","18022538874534509305","7988808386682295816","16570411523697486884","6757471170787562167","16420567493696313611","15795457168686239226","16577713887055694338","13285832369077595478","3694604902715566836","16950826921740910004","0","6008278022091065108","2746177908451359351","5639894114462358724","10059617520429769","5907370539972884481","2657730199227874015","10414252555593695514","8920731887807712636","7111286604749823608","2441846328037222483","5434553191112511704","17601644876768799872"],["15474066244720704839","4443528845770520939","8100950467975700043","6352060024606452282","3291891207711316776","8384844682695458473","7224320020221188785","16250115902298469748","10421688554507675651","11901263682817845389","638221144845557750","11594992345288103387","8360863750073699141","5227665705429506326","14674985107680109750","4496192155935522320","8656250844613656322","3691975184927439622","404363188453829699","564110351908601468","7727824697413295742","2472334507757419283","5124490161779742250","17470680948857404768","4705056143427273188","5872826393535720926","9438866326447775066","1857661406663477222","15515334257561098268","16552981548492563779","18067123659739909747","6720471561808912513","13877727530370138453","17492932714151913688","1331437485045119524","3874727651987653008","15766411988892816619","18392733089784484262","9397507818287426431","0","18372416050015247524","3655635023616704531","10114806031974303763","12382404516186673288","2369369048514423338","7409357245721465228","17257882537410100585","811979932764603106","13736942449857806417","7425904261845276191","10949763184888242671","4124711130285071636"],["10258506288766768480","7735103109763914609","15221313216473544386","627343498569098133","15301533636844236960","8245541869383434639","15420184387944142014","2158932841822901257","8077647725023804215","11182527834604882196","18264300659797999838","534487444087068877","888638786275192966","9105561599587636417","8755579344773666100","15616481219762031258","17478415380741006336","10350737571283838235","16285953142276070138","3686903254846835725","7418616566417281477","5897864853439708965","14270700574944975819","10478472638775235421","5917316455754354598","16436781373692875464","6158008705672627306","216192045456716475","2686519415788103769","18291254223825884713","2575795483090049431","10422032417022965477","10655162713571191875","14785448595561668750","391513126484472150","2325543224615014524","11189916111109818265","10459826168099044454","4437009518072906999","0","3333633370273374900","11688452266166444188","3798932924874118006","10945237223180902362","13870840678216926601","11674794096667799522","9131963742252880873","2167834637144395147","18128365894943053681","17583769257609999735","13864933049501720209","4652796029475875804"],["18213863485795172772","10705263132564247041","17751110515546404752","568578264535625673","2071660743099466544","3066152576370921602","10606349436130392879","4164589766999593085","6216755546939024753","17493040260994752504","6389000290790905501","8470902814181820089","11557743802983609743","10189391730145930981","3060983973181742164","14421097061316722965","14766517296057329464","14940368058039249187","13272612958718467506","944226655017184646","14106463974812710251","5121712562824498403","8580923277234091118","5299121618967255711","68514593841362926","18207027005463748588","751351210715842336","4395135783834892766","3378944488096942044","5686546445353115152","6858289270693053393","6626615682696093374","12052095305908937027","11686623568660399017","6561178607613968216","3587243315896955628","4416098957202275062","15095359788336053218","1253464636083747252","0","4119494673685150085","8626471776308769222","10547363735385932215","14269770882826721998","12392960361423414897","12330823402002279156","1477221388002119199","12545402002867150274","16031183001964636032","6687410005681593765","15897779358772659640","16557402488424501389"],["11872261892030803317","11290196887295187857","16823034590805213270","8394273138906272462","15015809995835726330","11315860726433658794","3109393275259075539","4713832483520476641","7911868821217082941","4683398303567331403","3084568024208892279","3779032821095955365","14061168300328042627","6785212055427016314","2411135155388855129","2183542178088054342","4507911048517502431","14537612205328310987","18389357470169127780","1849020878530890163","18101202633260012132","4143330063775131292","2670492041396309763","17698506014536488511","475479071125845465","6291739461001232044","3786939677901455191","12932312559008024738","7441097261325084938","2773804785959142045","9108227014530653897","11834749286665047911","16840515609670538719","1370520114362382193","8849558755539227566","1560414202214769913","1428755143879096493","3806085301334232335","5107220698347938669","0","12484601246257455904","15922837489693067370","4575040436565995448","4734407731890073147","11056853341542245554","10891889771673668741","2315308801864386942","13405291940740829333","14176082648890118194","17762949753163928690","8512144376781555811","5704641835162983364"],["14017644902832729177","2379501937204414682","11498043844205126886","17247812559078341085","13809805075145506465","15006209993844697896","9935816286845088740","18287615699031589990","1131976560235427692","5321384858309158810","6825588498899531222","12523698303674436996","87256359945842980","129606263425896511","8550655611451403302","5974412382611886810","44392603084777643","11765412478805362012","2497627923990478137","11701835525946302561","3368786833050629718","12683888624404869871","10272537631884707460","9416847271001918718","17259723413889711831","9487702157244047033","7170905319571944287","12723921709014939974","163004883601285769","6568643848167484139","5233072372956918144","1417689604000878785","16954809639652948925","10511578910713205843","14402613721790490760","5033716999305836902","8735090187667373940","13707903344180105421","2381666880666284295","0","6527558896398586223","10264307909934693224","3650078418956250943","10251127156992501053","9658316313764205986","4175665900525967673","3028570894330811404","94046615130053221","15121296683500795156","9851020210183634929","8143235908658845395","12204027094446092825"],["16094845674922675814","5631576515721006463","7900174951626458740","13833521465014171460","9904294972029447448","1176588365946109947","9990920113870775669","15265855657380345953","8623986856866084796","11837673969968495957","12827285471425235518","14735520445112987222","3567261948271098213","14040325959019555040","2810443962990300037","15433263551391765134","404497771523055571","10523156760057816917","16918183518339407641","8474322165966810283","9714786393682015980","2645105087461454764","4958547050515281676","18416130175247629800","13796609041315245336","7261387483057172279","6757824885397078299","10902908377694276155","366374538964503734","11197103599054692030","11088813987260774781","249268386114914156","306512866075885774","14778669178612468567","13428425882939650815","1948615013047531954","15433279500263384682","18255695542270335615","4366515674702516673","0","17767463258220662804","5935249794672055137","18196740224677756119","1874451328116491286","3100996361917188387","9262156526452628423","337105081225072789","8101525894361708878","13640504578358687360","3385770449100916901","7468364323638320127","17325302928040336573"],["15855666361693264063","17785868765493020789","12806001741049709451","4153844694398389809","7740354637854940680","3053528045041136270","10323418698349733445","9159222268005402293","715844130823331860","2423025517805453356","7625564181233062113","4603122815338547098","430545895149063241","14229616999458839341","14625567920801084908","5816666734875820462","9556021821180659969","11330599885961648696","18438312051385352304","1009295072779622717","3182593840294912714","4969415610430990085","6852821500323489562","17103955111646369498","298528569359379843","4554287757258949532","12052738031918649471","4062435143381368283","9399957438666574772","1868892441131427903","2532763835587719933","2514666572399191348","9297670198271250464","1097677433311698773","17611274237487217940","5041126642570763127","10457465105990784135","12471341020728459229","18410473569921015539","0","1378982631644793659","2619196211985477661","4001947044900526540","17160787703405205032","18323882786468735270","5768753223221957011","10337183980784033703","9588630931797820339","10842489772438595903","5058695108877798507","14635595991139144735","5751929852189354132"],["3770799095281866722","372480352220055165","13591172364950432873","16663344031131816740","4862633794884215472","14348973726384135392","1099081608281794506","1964235235922200060","5040501422145184893","5384747806568824620","16838311163354142977","4664341115010116628","12415286907886748811","1917431755713939722","3806290630944761461","7788839669284502905","1598734288216998777","7766729568561523066","17197282836986288874","4654936488129859815","17345661747957876378","2653289502580426585","17168961188245004872","15119173301838346417","5325282573099537512","12990522293917034444","5719108137116429486","1867180160005630961","6063566250595491838","151122844952692362","2146631460378911228","2866618953507766624","11848761282113358004","477112257110318749","5146484381952272268","12232145468215915957","631876350119467571","6907201407237677657","12617981398582609041","0","3705596066930991639","13706289560275737821","14604323824554208247","1388724150394889592","14699927080963782846","15363575106057750274","14827310473764496390","110798113428879335","8227793193804025823","146650378133648087","130263756521761457","3898868729055055221"],["6047728665128304292","3938690236229005370","10975396808252881463","12576440029842433309","10814985509697724760","3965470699921294220","7943127754902775477","4779757830626985441","1610896614889811042","4106372227320690190","11551654782818609101","2096827324495633331","9311026869533387401","4188120816024680473","438794539626368973","12154178880522551126","7702450898519970312","6587295957407036669","6451740808792485557","12546821616223295360","8509189195265758764","12639531887664686316","15543470779171442908","7234392438021059915","3695070916839367288","10096952772130015019","2675572416131158742","8136519969555106472","14063503821648372189","1408112924997748426","12273297551247562193","11063944417950937890","9264688040703714528","5319079302276435945","2470937063572887848","1146401317004495683","15317206127017312013","121158659416374720","15703066618304262072","0","14081688870279814845","9658761352223197797","10688112749355725140","3237715109546339485","11866166725288084027","1506587917746202594","8126579699007141703","14138177591943654106","15258160407591430858","10849099681040357556","10865088600707795580","4552615903826672402"],["11038980579391050398","9513854453432239402","12427055687926913735","11494137464121178633","5569126932729966494","12528627682455405399","12119912395768709251","5050111941747696232","8296721769250684449","13820571986319508935","15271127897482015166","6827859432183419066","996287224778420538","4617290297630262068","16927756131001848479","9369837455239899484","13572823836094197858","13295124506439551701","15351089599773033850","13824036262029273120","12345456652039750483","18147554936672648713","3163164575487052658","15752903038891548350","8931164610614279431","3852659739497903920","8157463153824162342","15884680525693612358","17010290685244673489","4650826401231246821","12119941878434895800","2837303064686413731","16642596126499991032","3507362336970155226","2903619469091693566","10597922861916299562","6830678788764814734","10060750886665895798","2732392556411086129","0","11086068691931358503","3657375523102043080","9066242115177338507","11367894631366821206","6750844061153355200","11813022732270145383","12499705761008126536","3139893667953887995","16768248481972373765","3482719876680988350","3043136171909149645","16568449570089806926"],["8676426226188682405","9697492833201473051","6848876997309449845","14219408369568794414","12670389326103055340","2075773899237146130","3338388412014665974","2905509505022415232","3930367928728634914","6054523102850122761","11924782404172851399","16604553835227056235","5422451738995616518","8198232461559555204","13111691985361219281","3662429026089061661","1840279345662082171","10157510388125983368","2366271061896860368","11911037791329008372","8249975175312702136","5431996813198947724","14012497947510476432","12725560672787861442","10339510151014320562","11870743647981515873","8660622536242627689","18236587785146336174","10114552827363695711","7769744705385546608","17159430868308757045","18343936264146766448","4012174308023366757","6523820145790968044","11441508383453492726","15001826041853774747","6992833422541264136","8117569689964653823","8519309755162041494","0","10867676974632814436","16721431793663785303","15058229701570248558","6511198907656434490","5607968094514504196","4907076332910272395","1524041833582323320","12186454174684155125","10740488217800888083","11052765349904813678","7844437680931010502","16199509432354550639"],["16221454823135414848","654870609336583924","9730155214079009094","4600998593936438453","7220606962246967327","9728213393432401883","3156909948059513061","2222802114818709098","16457728947923808627","2276299223057360540","3021453402731693221","16454799846268471603","1930913889882032390","2859113159649958950","11527275053940150693","11619206174586339303","8153552184369621312","8841057039475593854","16274142251812874030","5052130204924931796","321048678304148105","12255436476043412433","2081768487582137875","3633710525565448760","11399657482100762300","14666118208178978232","5898776222740254305","3373991949762349963","14589632112437027398","9553656896466182220","5237681527785917479","2890253586425859949","11704250890458904004","15228391475040992287","1731382082792306756","3276354397294767353","4491790413428402125","14183226848573976058","11538609439702713813","0","11646742598284349897","17544723892747941951","17113100381772011616","2658654950033323863","11142273297343310292","14523770916620819041","6022000452700668798","2633529515027940288","18110033460017199164","3661474325219769952","15245322410226502287","6370447022839401847"],["2764025093081191199","14759992152032829193","7889944283315008501","9274580286195786644","14356924313933234486","13150874393050642439","4944460896014097520","14845787007145744440","1436759275084446899","9721674571440248189","17275129226075716899","16896936833658669559","3918763474585017846","20702872766687110","14027080967648657944","15141398291201344672","12421066923631981705","13267453462699154550","10911936434119623641","7651831959696688371","18271864983188036101","7030223921635885172","2176932193289267123","961685573521153535","13808302895266174092","11170252328730823523","2110043723170249592","1026841981613263942","5026414154221157739","2872223267843692591","1750552520030655585","6865017208618533486","17118902112415866827","15450799092458072178","8315777148724030896","13804463334941118471","8547581521298103642","6228704782286170656","10808124336813028262","0","8681678355120255141","16390971157204160615","924419563152732638","7243901335187768769","15867421673335998402","1327629256173946405","3842770563532482338","13814890913245662923","8448964823936940471","16615183981854345625","12310290023257611043","17338737963001207395"],["14719404677168946160","5629527473906776046","11281712493707182004","6048546781207952928","10036968172406588880","16171697262304261994","11518295840418171243","980479124652678605","13478147795650819930","3985990227804287700","4474456308611147314","9109258574649131850","8906932975787478101","1261508745086407483","9918401670595484333","3310960741292798616","7020198335107952192","18393437970869988014","14340018635157241981","6129379454097484335","13652773149180131687","2750380141110578955","5998132587401860339","5512609956704511024","13905491433866913762","9772648204878320482","10143051099145028674","3838269476384897613","11828016023289528235","18037422529791602029","2069607729376298713","11814791114817478051","3589061229656409427","3394312529164116393","16234527639250567870","17376842287791044830","6494549497103727997","2554239493895734724","13900354250396870130","0","766265099189010123","10885913742627483827","7752444845740448411","15245255881701291458","5565599559064147969","2015072372423117622","15464851148445703884","13867304120203690330","11082614993987890504","9597428843840102485","13058622384502214025","5060947250471192459"],["6620114701115681664","6230084102637132492","5981817859249950200","7498267036599756754","9994876113076872483","12380301488589858138","9877994181290018227","11471647879992800623","7484203205260357604","17302868236869205634","6342043923927743593","17305847808915221117","7459648166607626211","18276905384006990148","7508932491974176188","2392767518485786037","7176721122529387919","14314068910595045711","12400083168284594673","5304391219264979083","2225109345214806143","6847194896757778653","7279601592209274064","14780918748942585868","15488483935029780757","13646929938655384678","14875369045157426622","8268550085371035525","12764404274556640318","13797580594435923115","13856754230767570281","10190441661091028252","10725736111569966696","5773654144467614196","17761698190868151514","6784775769856485196","1738991595390755355","7550672997793627089","3461319405888927753","0","18329442510874329573","14989029378697371674","16430954832115082661","17452820886788982077","4837246229546492936","11857043250957552857","7786349444280880617","3430421571696692018","11356436436685025742","507425428071463812","3605643678190197327","16548290262823872048"],["7649186984345981841","10480500857389425089","13539005896574576459","9663810308677678477","4506223329291037350","16218834207058038588","10819539988732699860","6950537362376804688","1989328716613131664","4431709150708398951","10488116578389665191","4509107871233023274","14168141222981533712","16288053257738552348","12776136301960325682","16210166757169358628","5596937709140253549","17694197388030489879","8992044448022901297","7116044655608284476","2048532247808391486","11343491634916139604","17152984480761130487","16967301984588754198","15537101812356413071","7557492616270233792","7332740175932711293","14521607605905412777","3861016568434682588","17817135975571095955","16440070049386266539","283323797903587451","1033892092219973811","17182797548357685346","8009744135021346633","3394045008609263007","11045683329446678055","15404606792088440507","9112967366124608238","0","2412463669596669945","10145555417742890746","3464513833981627268","9342014277952775675","12729401027476023741","5401665740202924167","14532908604246013420","7175443311192388006","1331010988564648469","10965147175247116793","11878524656150092004","291656072994023187"],["5498214803962960264","8100894810023662062","11887599585007595272","11464971257258243836","9593301239868679300","14429258466132105290","3652174868111818031","2518540021221044823","13515391603089095981","11962091863996677580","836104016761317699","12796057256902100814","3231377760265544420","2771191594877641336","14288234196922905599","17035319688102228360","11547049250077002296","14681936299489698696","8609156180944689665","15793558421163388491","13554766294732983992","632745209855420887","8957087166606688834","3388785038768359320","2909946914461404183","7262924840666810007","6931467486409789092","17352391033873563005","8234336313887809790","10006325445037058298","1134430200567469566","6764939646539823423","3709524030024553631","7910211817040787030","5453320586240834084","2014128028927907804","5669565708828296012","1064228248137742929","5326728815992351679","0","6802670178146706096","12326117925844468672","16467168662886366147","6637712311388542815","3438749866610596966","956751698908943459","9671393507730786535","11438456611876306471","13033537396941504537","223054253869998525","15435788493791690985","4329131463695572317"],["1924114283991687358","17606494458377407943","13254574906066533049","15827493349289231537","13125853110624617567","13860837933875441560","2638375549486871082","13883240536198668991","324302787912899701","10716018115413387153","1362340028657871921","15968884857874380594","3942602326991555729","11847946785756921040","24981486665970462","14794745010293643127","15532089682779936980","4267448503238100723","5183711049000589327","512675847984953978","6934201899105816223","718137931456354197","7722324864211337733","4634694137749839547","7189089485666118154","7334749477125526145","1496338397066933342","17154585072896064659","5889440769121062726","2887817185063100494","15820955672594831664","1274205406342898816","8683260762254395803","10329523095611343602","321290724791075241","7276698669093517998","16596244646831743482","6964903633325914913","18012380872920525070","0","8787971955187316572","7639823311220308644","3804773856890974093","5314268526853881972","729717295276712547","12355686996931116762","8675686333316380150","14417843136070180728","13398193760938048642","15644749696222738540","16009077708171885407","15703168098561192722"],["7699915129156388577","3467387460645344477","11632118006376287694","15403161796018836074","10827693493879758724","2154011858510626054","1822343337032183154","5992951962385770446","8235638151393344610","2922262743819698273","16186523286032265314","16447575795539801702","8866281057782979960","6197921732427632856","6962410335850566098","9533913525824107408","16583681870774030092","2402054832436374516","8357918054426583829","2020097498761613003","13993494772816269220","1990740502201217228","2306562448917522248","1534103917292946091","5014827014926604961","16466078939148903220","14003561650327561730","14145963383677409009","8174573333757522448","6280318742930928346","9976969106150868952","17845625433515773435","6921463204536980956","7412873336674005602","15894335973163817752","1249703907224329299","17364501864160566342","14794929282967007376","8551364585269236194","0","2488490731644152678","12728246017365717226","4708835149002130157","17204733974095663345","11834528182241771413","8952378338034271349","11590829437172915627","1406231665937646310","5258310204296241430","1113173578721680199","15999899175264880696","3170470520529334808"],["12084186472129132079","1372784550121957183","17841959496693162328","11735887845476878574","3222107424377540371","17094811367999972867","17850004460215149644","12522072310272973981","11954619700089149569","4527516646631189996","16016516727073439134","11435686530180295126","6423736605949561144","14616265988909609139","329291593034365966","5207240435815048748","13925808945931941462","13710737213967105483","816862109831945293","3660266204734147744","9372012395057408666","15560125298517798552","14208430640725354141","6795178974893615813","8246109960589538408","5110764887779674281","6500527235130106332","739913804533876426","9439452848537271739","258780282781298792","563934998519284991","6628943211190331712","4869290521892789408","6755238311575556953","12616169881236719903","6547318500248534363","5298667776057015361","18171639757110604111","13736359554046270233","0","12276363840359815225","8405368941228868089","12786419230666510686","1618237936084393309","4708403123315972693","7091191955690157705","5059042381170393578","13395523259045980536","9240547525656150345","1451642049512393864","17081085170758502199","13528481681172168779"],["264503029756250832","13565208017863225292","14063950722582988247","11179343195246858093","16081160347382948882","9405902283663397308","3127411760595612126","3494158091097926088","2946517038836441055","14089237786705220926","5281947896872158529","11785214830573019094","3809779453073239068","10218419580881566960","12790173516425184855","3048644052420933947","661232123260273829","17495603663496098235","8150572982468095637","11511377619765557823","1303058745493633171","16116304031836299617","1248293604457493717","18404250596012073045","4989138635743526522","14822859680365211908","17292343235337306025","13205403873742934581","11350823431521131435","6148214533581785804","1268699103650164806","14140025463883348960","5932096062089312209","13823556465583236718","2986193895047867880","5746550082552899906","11665570408667646001","15465093417080299469","3597462553722003312","0","15994557897309264984","13290701615777410923","6684018935134476610","7945233698250775380","6534436858420568710","11813973631270993977","14464177418312625236","6082414161101758995","17450918428335411663","13611678869010722357","1096917101093509668","6924423077711337156"],["16272975784916634688","831781039747589111","8973601072605395085","17955567381654115586","13400504289204881769","5232339586179759518","7027023840198057361","11456535331064048766","7141094676147038333","15504670179883354539","8436637738933397876","8250580284830323045","15015921747134247830","5664927802522024527","8558592257018628011","3587746374857734592","12136623774080314281","7705920312799046407","13450540000109261363","4067195313733686027","16360890930867956047","11038755272171965391","11626929774822701657","17815593842874457919","7069345598574564298","4534520379703740299","2165063019286772854","10940585934201295423","10393825618010496224","6309311028684266836","5695152417150413157","7770033689267275062","14109423910991005569","3715839515079891723","13710995621520646466","6370732657597020740","18417740839017581802","5500694210931862785","297296258198733624","0","14837675211029822190","14163979308013454","13763844812810166217","7888228612064807659","11594430756012548891","14476971673828483481","13548219159891309045","9803035760302385916","12636944805594552377","16117666535965948818","778304504890336425","5532613955362664258"],["15360904412117104916","8981678815830633221","13386787983265737767","7351049509310418789","3355487844543310456","11146007802337975958","16001094312762961179","15959659698131878586","16764242957604923891","11774914732072879762","10632273912797051128","2731986952067834386","3940795907504503528","11832430055758150725","11608769194604759407","15232612317206638541","7525994533939284020","4244606329844892379","9423035223464888325","12059073534941675993","10039601219177533252","2034530903141057557","10346219445963557175","540904447046398408","17403083266915075238","9606171646063975829","7721910431729160465","2361023853177357208","2414057650350515216","7022844079845462193","1093124247375299479","6273444520238415732","9561549616457966400","3911951604492761113","15554237527929745976","15269195195394871911","10983081534651740754","2126350986730786309","16025599738779284503","0","10659381104316408194","1895947489874584770","17918956062887081886","12205198851852871825","7462506884462193236","6578390463701296549","4775352505839554095","7972583211872292160","12939387833315260220","9612145945475593764","1386815173270922504","11509859255966039096"],["7879407846055054524","6787049889244994678","13890080858580038319","17221517506983355869","13982694576543202984","2717048483723299737","8286040674062619509","14315298816068672366","3304382214510350400","15506990873477076045","17091041173956661098","10078058491298661034","11587098565940243804","1903677235353566458","8704081629866575692","9621648426205120264","8635091806848730089","13775853325414965114","1562252011336451004","4114716105031611207","11934880408742288804","8933992403094972501","5913910942875969526","9438488939077466768","13740148155498822198","15499784261862870076","4507028019944750297","12817892463338095284","11433678688920588796","14287835893042457417","9266782520002011102","10450662409594538484","8957504082237793013","1321421122995524762","13797811974361328093","15756879532639779236","885998762563087419","5551688154494813929","4920807927685299820","0","15435415058531593431","7499468674738905438","16494010950321435422","13521793896141525943","2608621768552257281","2444521419934657336","9706934687992494658","4388649263527562250","15835916221530202799","2502994476030302034","11433921412375207580","6339307856252257366"],["14089036209489228281","10473230449595627818","15477731675656445864","16356853205655506990","11910829651759745503","12602069694625875655","986574163621302741","4174748474997534053","16069204255053750739","14287771088261968612","6470388385080589037","5526280513553812193","6280626069621779082","17294643545980023540","342610398430749177","3624050519334907740","9917550665566834863","17651586350720396954","17793952033611401152","15606021317221293269","15666224103023702862","2497838994403014312","12510892187001602026","12029078319084930212","2981928776700808864","2201158438404280164","18119165009581413028","7746234656359901891","13967372415377620597","5733392851374252845","8954731745696791602","8688355113533080456","1019960908024267740","214441346884281932","17388623944784576175","10062026997830577014","6695599905075169430","16210126301007973230","5616155639709848377","0","8921010566496200218","3901861623647583799","14287722417216976747","11494009489340573445","2696307790076675849","10396834880425913885","8389181287372172236","5852132928292531744","12767258424089049400","12303495591369946975","5077954986072271959","15560257937750515584"],["2185051318213938570","7084841881525805686","16373270370222643000","444152178307015799","17219461334026604597","6371235884921370602","17361338154567070573","3106317165973291807","12514812912856039294","2640755583315598485","1569470028488483341","1204467269851536011","12778821021600954560","11368649887750798026","10615924641275706240","5427693106048349262","7609079375761030396","2361039775303784610","5186448025442202705","8665792616790541952","1128411995296182365","13881729625083397670","2740597552885763966","3908865107996562095","9396481106586648286","6547987033926146124","2638008631662352242","1770415463264152341","16375538083356945251","4680043507174771580","8718702720141565322","13883140671819511350","16813722451785995710","12586614397255887929","4305351584311182822","10566447967330643851","17973977557077949536","17470655352112315495","11400179566548196201","0","16131969774937695499","6381609597410306168","13125202487982648417","675248848096349055","3594556922804573661","16813823955003179202","2541437465040617342","11530825482105119539","489692835183123215","1513973530034748943","15350625719826424426","14258863392500685689"],["3750413020622690492","2374239195611768458","9245589778965454588","12667812580860056962","8985180063023763861","6844211445649972562","8599622829571127177","6214681851219344590","11861953567656368417","4634851030240916798","4629753873751656046","13640846660152881083","14766848352854782954","12040985377013767523","8044708441486268327","17559818699741545927","14499044451915214932","5301740984722451407","3772814910207770899","14894727180538857260","3611817696142194193","9729646351469606751","4952443741930972316","6877176456670399854","9856242678133203798","17968949843461077104","16708433036714224813","8386852963327607878","18032607610087995621","3042930419571934236","4954985624511609006","15299491001832261914","2686207959588617300","4232278323616907778","11334140228091334066","10233467766263802873","6172778315098436040","9044739682687072740","16412853317154225156","0","9020091012879112879","18041128859224908405","12973638025274316189","8440785408675103278","7468679468552224466","13782700010060655801","12933221015242713495","7151374936191984735","16472136318158600320","2051057901626653997","3772460475154297957","537696213020160972"]],"s0_siblings1":[[["3562996981255138330","9815634411783139031","16329198028814958616","1619774057949333070"],["5269222247484902216","3676461272979902935","1423800174558221214","16730354466248410017"],["6048743340522966252","8866782752324993806","15419087971726876803","16233966224173048646"],["13960360351331058737","7953868895877945086","2506604443344066010","13576350289588113662"],["3068187934822880068","8711171286480791113","7825977608919484805","9277958351629852235"],["17721585600870718797","9809868084318010719","553133994399436145","6841375534731763948"],["7342194470465076997","9033120621014017995","17925459555179674393","8836119811751636476"],["17959154418820916847","4447058537045782493","15304623216563610870","17741691184629573758"],["14964661804864026474","3412569196251427410","4227326653148570715","10319760246576329502"],["13610053090747572640","16775408697234996518","3611398054582041378","12042249689212926706"],["15574796635985642157","11271070872355573547","10742402833495467561","2499053703110220219"],["15944677338251864340","14585523616320879030","14726285651757815755","4579615544306550905"],["10089749584011409623","7487308581292801817","17000686295819184578","585092384006237692"],["9711035571421133482","6261882463824233335","10259361566185289708","13145197403295770065"],["11778486266452964648","1073021927582155697","12544576200921172531","3968527678982447300"],["4656776847441356964","862231611473696660","8083583813566479169","1750474803499305424"],["13780084430085199989","8583720973155775189","15871204325897973652","8726653407878623428"],["9054047494787423880","3824385377430709437","16762398139846028678","15431691381426894460"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["27707841668505643","1560066303111187203","1483552573685029717","17609737766031373986"],["13487389367773367671","1231814874936206405","4315734881681753449","17849864216104565751"],["17859538048667065440","1219444549609427445","11560585017028166994","16430007243103320727"],["12515056279634607183","12990652289775074258","16385358123089142916","15596944430146634519"],["3412631614378784172","4238021963545252635","16144945930183412428","10084551455147190177"],["1325253550729013916","14121039959972463209","8838026204787800265","17288883942033673599"],["1579774254825106279","15020157171054329372","16150903115718752606","13481491917980225475"],["16680677468455634033","17297331696921875046","1839345875151335347","2170577918539123380"],["1543695960132801122","9957552927954948848","14665685721304816591","6341181745207854472"],["11981585761809899778","11737823638066806992","16334009145865966767","17573691077040169820"],["12162791320777674841","481931264984463824","11381707476509499951","9051861044946528458"],["14714888439779343211","10943811418011008153","1683362728125659221","8367641041576926508"],["18134043172058978414","11060199041383180371","15157073587290891278","986401166388584653"],["8362823665932305515","8644286043489313806","5131014940485272368","12844706561474762984"],["14017626173225401864","16632475370634763332","7083081386805611403","16773749727669561640"],["12569051909223368080","5133382096549235292","8147627853818488917","637995160825387868"],["2266019841537645099","9169772412252882331","1675622754192116621","925188597424649948"],["5552341697357775127","16919043199336805496","3538708379611692730","7146610748207227607"],["11610206952353842192","6646049219797398177","11325798448311753815","16558695291543672982"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["14468151362665143765","15218123273687721179","10940273172973625318","3640109732272118962"],["12819347601641977678","15256003767326760616","15457732112474675906","1040972704543477396"],["8499617317519693375","630775273391288978","1183916685183703812","4318900113265566254"],["8747767453310405955","226058094850225427","6316383919329576223","2883456912566839479"],["17584087758965363669","12767617582832494193","10465913132673901559","3472585666423092571"],["5590103920467455707","13793285352203000757","4580305147603735794","3295621286463316222"],["14893519971139705596","13473630857390692448","13112249379710851171","16583526246041524670"],["5696140802212872430","15324956954019959773","10480039166656412725","12863486198917885090"],["6018004601739560873","9078580209500698215","13778644372931666442","800067887395748891"],["15471878544517016622","17788216969765097979","13513129789601088985","7813148506206230259"],["14294296082431014106","9791235064876898445","2885270946952404954","10082109165656766684"],["4237526470436069311","8453975216094983801","3434259729574561762","6659813875066021800"],["2723390446057220113","16906727064117128804","17511469037482503383","7197187393766730660"],["3958602433237211201","3779726499154634970","9806071805155388460","7948552514805876549"],["15590086087157393580","6595115805923204247","17933236088005070781","10699089235742137668"],["9144659171070728453","11896887417966487993","14429778159149678987","14504203643032258245"],["7460364095719151862","18275532881303460657","9930423696008831918","15824799171501025426"],["12653989498030917547","8441757620766285706","45870542927902673","5896930239799338328"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["6400234839366878543","13775863291108474563","4996506677931969479","17744935126120500240"],["1671577242976591416","13623156464029781921","7609545457322035844","486153843309596926"],["16732032662648254330","15193267413251379031","95830438553594773","4485224798717042916"],["17589066262848360848","5275074163599021833","2943209142537943196","8473734016683195283"],["11348083351366487248","5997439198191913266","16170758810314772448","280695411336001223"],["7632934521103119189","2783556486116529171","16948677289950549617","8590307215448655942"],["9753655794154411240","12263599107735816067","9489992451010250645","4901844325818694802"],["13797501553289565566","11477695082091832234","679907873978645522","14437969693853479826"],["3756932080664355521","7445606114510697873","11470020781413246900","16132088761313721037"],["4070743583417577845","2470110379123956335","10819531456999137440","10648513858881109695"],["6119680383392289122","15923270255580622762","17823253545532809322","3392872728755215125"],["11178575403698170817","14292352887990235857","2936061729720557904","1836599311383918192"],["18388860214803930652","16052878324855055532","12366070242707870108","11713104988137071133"],["12338945254024237060","12333653872787287514","16934042735370415673","6942577013493424877"],["4831572156086257265","14817742377097591749","1460743799140884650","9427901066467421113"],["13796112423937538834","1480655958676982011","12092018984837931785","4883832997580884720"],["10461903974743460870","8871714333657545576","15692472446644335312","5383894551670032564"],["14082538275419754221","10793403934826328431","14626154253975899467","17892316983772254351"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["1170730021720452166","8298004663544795076","9030728379496902054","1922200757853004519"],["16482718881026868891","17536027630603959748","11584215941640851354","8230921647446982118"],["5324096758830329569","7847754779362746386","4948544082140542934","14598131031754578478"],["7034522799380288328","5246941841941198287","9999185638350102862","12787706693217927371"],["7469623928460963142","11974598841944833285","10698435721579110396","13625431186136357848"],["10914862637133515600","6167880962850165390","11744031624777976536","9891045552191994507"],["9411884778735299106","13162719722172765243","1437407323607047083","3524646929452320602"],["13740613677566581634","544172075896395564","8944457539591665659","15801589729191225811"],["16532934208788661073","6437279881521398291","16624798080195761322","1317642463842843559"],["15534596670164979905","11114339255900389619","4705484534505019778","15198601899937753837"],["11084053946669504452","13123733230872735935","196851678979977298","945884957277535825"],["1691745731610675417","5527175995157377792","9139171768972193907","3025324206255154890"],["5938298233329682280","16806171497786111205","5949957161528625148","15908704769071453678"],["17534529593592492947","3245104099254207380","8972407624509287799","9668050623454107350"],["1819330470092774361","15624253960996701489","2771896610053617484","10090714534469474977"],["6459360784696058312","12428818315477767994","4645165816574732764","784920764760757909"],["4208352311132621900","13689206851327566246","10964175249375483054","13762707993261797067"],["1159206241470707158","6377091497186335717","9752410285207362962","4028015260599378327"],["11610206952353842192","6646049219797398177","11325798448311753815","16558695291543672982"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["7831540629002872905","11082874549621030325","12123973239843346245","13286199360490995425"],["613085867092895930","17368766319480654918","7831349408428425008","11223569065305621397"],["3211478396113516528","9712763899399471914","16685489886948004596","16957610403167232046"],["8564825739957745891","13602319894184749197","9746567814042901409","5929162480905629721"],["2785441203210112025","14149899180010850119","17322182728814612582","8372981656055764841"],["16961890875628599029","13182592742219408471","5210745791377200984","1405778529034324072"],["6091076504624138637","9545911683335811808","15922168657280335571","17455348653025039171"],["8679891917224769797","2739590172710986141","13656645961173698872","4101101233651561748"],["1899872133457072100","4033439212937759520","14200174800797690637","17895024933337137443"],["16500565157475795018","7931845072094370279","14213697615184090818","6232082294589482583"],["7316371822298251092","14134720534969248927","10118417853906527601","8646085211999391792"],["15425577499983685352","1514105402104589220","4158481952641921177","7435331525585779779"],["376240240316197651","16969777606822982082","13453942209344048975","2079447837644287301"],["3328178848501354337","12670366007962868128","8634857334179527218","16711568633429457194"],["14030438513992410614","11795251121196926153","11189912820760371016","11818439605968940883"],["12647666076263057152","8658190044614263848","14872609834023090032","13229634762084473581"],["5268495829969668169","2891110452426581102","9327021484812920967","17394174152949679765"],["14082538275419754221","10793403934826328431","14626154253975899467","17892316983772254351"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["9754312780410498933","16179514152078837429","16523639145413558023","9160232919774958889"],["6708052037654739703","2112654995371881605","16889554250855977367","12619500506356014262"],["6854966857730841617","14733660019018874875","10387548326272157171","1260182199500177821"],["15661062065740209411","14801270206903253920","13250620439177489386","5234278135265519416"],["14743568565088817772","6976182547899324366","12656174212181515557","2350472891581376553"],["3506963423180606745","3111462753045164853","8307731428844690457","17838775236633582972"],["4270863778729392017","17364597084451163298","11499830135553156100","6462413403003591488"],["13342836310230450700","6720793258702336837","3975718691243600673","11905927232188867849"],["5807335311863430782","6788868765599079891","7102656224994881946","17856653644299169735"],["4110878839677954162","15375389008617057372","11364630531945198932","3933084949142790716"],["14545552306994504367","3807129678226824048","15999122225951883760","12572601729751380939"],["14526311473225032469","10317778058456569687","10329667852330661247","5090154251291116301"],["10892535587319969496","5225765602512913345","2972265904201557979","5620344202976783262"],["1424221708490825135","7979512343567443534","14191059454599957971","16063203723683264612"],["12817636002238322256","488454582119519160","13378256568944457310","145139159979114400"],["13930497499586105444","17346102062679286855","11904250243825127650","18389041429519565966"],["7632374318585891276","11244134348418398191","15838445235923991840","7214529571736377195"],["1016460783398317128","8021669763668649402","1818724354175664391","9894065517414349131"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["668690206405990429","944758963965612811","5693576705969802096","8533799664801285425"],["7282976438561981259","12792179793410044620","3492759780748073520","5974814509917554649"],["3775018444251023298","6951434912903418377","7133354465995331797","11183188665670677240"],["14525438566566499419","5418142182420039413","9777396536122845789","3075605069584146018"],["10310733202361502952","14324081940606861001","13576311874564070972","18340110092235624336"],["1555697927630788607","7457126786573680869","2657655915206686888","9536919630520546749"],["2102924645650346994","249545126576254296","16647789353368806546","15746099100485191304"],["16006536663153431868","3511005320621801804","4700224956956175347","18000993327913905624"],["5347419656670377845","1545217712519967673","5412553627763902032","8791863853826099351"],["88493867690130162","2004865037416509934","13450340290394487049","1705423278211523622"],["14594436684268820425","5207091859438906330","11082586532684839926","6192947857557263689"],["1632492296803048308","385399640503020797","16672065308677693196","6788035547123676964"],["2361152746029061374","4322328589169088506","7769202533441380716","3424663289186500358"],["533183696995493430","7371002908806883687","15032738745564059381","11029219068446106405"],["11998250535133043072","130935168048350063","16449861850851656319","14792556027326333944"],["17825796129237642677","13577136452990657773","13427866815688117249","2481537978636088051"],["13780084430085199989","8583720973155775189","15871204325897973652","8726653407878623428"],["9054047494787423880","3824385377430709437","16762398139846028678","15431691381426894460"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["4006836339650856164","7725161624811708493","7355553130089147074","1244357940031607920"],["9506743132860492677","6756075762408525477","1284218606687352924","17998493116205337167"],["4251542901689738740","13398792693678843888","13505709149565021617","8230647626005718242"],["6742014775869389647","644092633121452340","13441529368056858158","5291870967859409296"],["15668840205120227353","18163421974646018623","4811160445468280800","954856078591970511"],["18148716813373288744","5284375463461489108","2381327241255308778","12923057182413241969"],["3682751731592100748","15643098587440336585","13087161500644243752","7718609082186721912"],["223790219621653544","1519787546270560457","13146135349103492593","797646383778908501"],["9789616366552227082","11874288381411254621","1086840384382137412","4194544688934842997"],["11307930101146982027","2018277861375674674","2331761477230054127","7540899640796914521"],["16161812846461285115","15728290502645708478","5751740196041711670","13701510068042495577"],["5003336105212627697","5374504631931638605","9587614145350081161","16570866081186379115"],["526750761860834120","3111077264133772780","12813077556331092554","10051023186779882711"],["16466662699071333761","1945470057834293282","1670750605237079171","2779830105572207643"],["1959354154875409371","16220624647102200878","17934716935852381173","15928235259054173798"],["6459360784696058312","12428818315477767994","4645165816574732764","784920764760757909"],["4208352311132621900","13689206851327566246","10964175249375483054","13762707993261797067"],["1159206241470707158","6377091497186335717","9752410285207362962","4028015260599378327"],["11610206952353842192","6646049219797398177","11325798448311753815","16558695291543672982"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["15228782932950958457","13916630877926709721","15755311407510129753","372274787693134278"],["3030357178806237253","15632550708502100187","3651722403185260674","3423668106952405723"],["17192119929845720187","17840004524569101514","3529453311698759654","11469403186648338075"],["15294501739254946350","4362482871527296883","16674793602752290987","16235763617519940963"],["7549701704024245037","3798581786619015083","7487850380853379975","15366593630268916210"],["16981100895756983897","69740269815875272","14839733642961147638","11280760677682648885"],["13955299261991355059","1015827088159327787","12464142426054733439","9880640463648462231"],["17567552444097639994","6790627211744568054","3972571638489020588","10443113220694322981"],["9586012384826741435","11307801909962722192","17086105753841810701","7514033662182862190"],["16074445241462894919","10867772945167937087","15096030241903550955","8127682169877853892"],["9128220514255825631","15434270556393550250","7322539939184248845","13935874951282198715"],["13347593720414547969","10868685429554987401","1150386339362769814","17870434895373381893"],["12192585397456888004","188373057547114906","15831473400606361571","7469557054280472066"],["7690088188320918146","16897427353979436202","12557037491841507800","12545426878409095903"],["10380840844523869118","16583556611895855133","5791030879321993056","7468800432804304566"],["17454692631719155994","5965444943438613009","11303654243799326671","6469299878520410283"],["5268495829969668169","2891110452426581102","9327021484812920967","17394174152949679765"],["14082538275419754221","10793403934826328431","14626154253975899467","17892316983772254351"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["16144773092643971594","9940741132494417882","14152256664470672106","18198355977518029121"],["5457204364113371751","16394883805772593227","16054825022256979106","12304833257388910655"],["12099794591286789381","13638465805211028361","13559136592164884479","14155007936140427337"],["18115519129830881367","106311393407198792","2046921136254162493","5721872519807279678"],["6756482859340909874","9949291909425159432","140499354149686964","4865539308207217679"],["4518625093496406561","5913423509575726919","6928241186340487164","11995426728601268078"],["18319778290711962115","17159179172026717017","13061789971812809770","5558382604004483505"],["11742425562765730950","6966918746076760889","659989883956344102","1792734200805677815"],["7042758458557811370","14395275302480244945","9842506424055294693","7436531887958962624"],["17743028676263626709","10836012765169854360","10390566531964281560","14931563371770521957"],["10204123607404254279","11142086273679882420","15469965987825975721","17481747680592632154"],["7138593834852721904","18373684822837630984","18443490980023861253","12366122797318222494"],["9461415331432833658","8805178386022908009","18423268283034748342","13734137768332048498"],["16313675108651614518","18357834730480896194","8691408839549528296","10641062078768974151"],["5960239911268207128","4790415936267232787","13392833516945870864","13632003537072385475"],["7707030974208620022","7442425321777082939","6867291871334765571","12706474383542814121"],["2594450560437958504","13326386325614682720","289589846909833274","3774864326138654363"],["4887551765265295267","16368491953894427928","14778415477943092503","12205952505271886829"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["594645719680626614","5377633492277039888","17516778116764532123","15671819127754103340"],["12910341894371559398","8303002164284658637","14194890607091536695","12186255806114804773"],["14685083693748055949","3319130577928543867","13952503029258520728","41026475583784715"],["18098903030117800251","6720622245220344978","1363181296842203241","17736600769070787282"],["3050349375941731822","5375497799625729830","13786544101856442570","11013870203416194785"],["15062695801645559409","12808613717823540087","6131647177782814801","652509928634335292"],["7353465348000910870","614964776365819459","17205708821927840775","8161667959052391577"],["4607096684911330817","3596785181226638621","16709050092660975522","17509241260872766330"],["5835133773545221495","14852696299108327010","14735212741723282017","14232554792948475274"],["7967756319472226788","10278989873667478509","5828263259703482814","9063453693745465354"],["16367436475450980888","3672084748019618429","12671592426604769481","9394640804715382851"],["11601892755205262923","3900357658778081743","9240715884154522511","10745327481084613965"],["1011030921219211081","25718535855041897","8535134614092087535","696789118942732542"],["10040253679797728270","12605239530806655943","18224245683887532909","17123782964836668608"],["16903814067572946344","5658189838025353604","12571106900559915585","16862014160411278356"],["15798805112664225392","4848598396656955320","2174455417066827725","8424107255508069220"],["10956161648081653700","5305488546397965065","4536077016729886571","9764173028396779832"],["4230551385469738003","15416066491276309","17253832330667124450","5167203867041597734"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["10074684029365044017","3060829663165287211","7343801805180656701","8979091089253640512"],["5551799836573983279","6360984301850704410","8013874060429806179","3251458572070547648"],["13107166762414211966","1496705791170778835","1643059187598841129","7621074618365947091"],["9793582539453001246","13088068532308346226","10038589659564691413","8685949928323128128"],["11934241782779132781","13736491471459758087","1390580646444096021","17100163266952614497"],["14308524642857564447","13355478686272823288","16477831964007239664","3883652389500579502"],["5776234402854260135","16142639047024029215","17056203900196090432","14779339715755530137"],["5159578293660710520","597775015894401172","5383479388626949174","12713297691069837356"],["8966604309773557392","5810991144927523532","17581609766778793225","15667559257116446430"],["539125833725393109","9872887637010128612","10227404400278634401","1247831096610352344"],["12707985862951816861","3191197202897964369","14451517086153956927","12839082395733533751"],["13810439157895427754","14275446473103371812","14785502175710337344","949668571313804874"],["16240869820304439888","6334804476052903329","8206702212304352739","10529849602583580068"],["5475831144052990471","9712546057231775522","11769926105187351640","12802321772077978272"],["14372678925525964160","2930140004453674159","4855220576625174882","14516814375152286704"],["8000622347947002654","12177791431173579919","10737355783106791316","14593625702807394229"],["10461903974743460870","8871714333657545576","15692472446644335312","5383894551670032564"],["14082538275419754221","10793403934826328431","14626154253975899467","17892316983772254351"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["5342039870334426038","8200720697166037668","15293349206705428592","3881457575981883888"],["3627546724569485836","16909454858961006176","11555878776827497547","1643487695886886203"],["4002530851496196285","8506313496451518317","5095133214229513869","14699786043436118831"],["1547539275276495763","8178178452932496707","3946022013419799153","14647125652458217932"],["16794239293288180011","2815854826236694665","11852621305084050474","11512636686999835250"],["6908572227136102660","17815453360518859430","11239886480026739300","13079167057188568700"],["7131371615954745187","7677586664400670602","16967427993745649311","9770457978423709341"],["3725856408166296321","26846070238647971","10953228058254991971","5958586088120740616"],["18125716838187607814","12723015458891927179","15484937241592078103","8337322995331176782"],["2630355489485622310","8658070360261114538","17473985065311132976","1994576232492126242"],["12781016703594271165","17499729559281065314","13507948594638369621","10727501138286600595"],["9779230219625445519","11603560968101383234","18409058006495578527","4855968792765392479"],["11659825930428695812","17513498376812407479","9653041011770273175","17502963999757928706"],["8855203775426397182","1219974479073896063","2028213918809776338","4572512297944759383"],["16491895253722116888","8657181587966093158","13030811319640521496","17831246185118712512"],["13930497499586105444","17346102062679286855","11904250243825127650","18389041429519565966"],["7632374318585891276","11244134348418398191","15838445235923991840","7214529571736377195"],["1016460783398317128","8021669763668649402","1818724354175664391","9894065517414349131"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["11072072522361497376","16419414890210270128","8007311858706467594","15610560823973933075"],["7881934812792504621","10892620123482033025","11477406033890263872","13698017484161747504"],["7347886019880352513","4107120676461957401","8237113156359291594","7093276592562740493"],["3488788289107621741","12376317024996993360","13029673741881309435","14848047204783300094"],["8039029773040958993","12163623308906347361","15706145829295839059","14455609289504086016"],["5088556933027511524","10056881636750457568","1789607287143842584","12582248122373834700"],["15233287399267202571","13512017419467974148","5674713326098055138","8968476857119488932"],["9354913638841636749","5010079951188769629","5917358926877854872","15409136116072781667"],["5372042763067438043","16249931405951663567","540525586485528068","5020973399075282132"],["3653661367551483324","6317066814933432358","2831037175564674795","8422496900827774436"],["1335407170242608374","6721131464988819760","29040093442841099","5652607747800702030"],["3765478407281460094","4962460636193922798","5535995854219073941","7747068360580576783"],["15613554506107198490","2371285007315800284","6048210430528802396","13850002240119239604"],["8330769680521589425","12517560467066579637","4267282472632090133","1914829763074813182"],["4798799355418815032","16832020157812310550","4677265303339815863","17040457934948945226"],["18042605628621199565","11059984990238828295","10754737421664011395","7325210569172748622"],["17350551320989815162","16944265293362413801","12448584408517030389","9253725613738486691"],["4887551765265295267","16368491953894427928","14778415477943092503","12205952505271886829"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["15863183121129395617","902953541900596391","146955331001381006","15399403190264133040"],["7662118903709584499","18151627439927992114","9729711584334501065","8164620310161997033"],["1737628355030911185","8651985878032109893","3525493032624010028","13490359395850889057"],["7279563521405616693","4341072336064884053","5513807600279478723","8043256720396251591"],["11848376442020145821","960078362028036211","9725908294192457256","6235936694256029740"],["15582760761926163211","953477635374771521","14525579235289543783","13286994402480617516"],["8044997853864518340","17050000313145531563","5428342097556724066","3926364534036801933"],["14431157184582684357","18192221024934552357","11781171607339402038","2093997655466585454"],["17974953617250364036","13477342047761691773","6221068280468304030","15639827707274290578"],["16851070989032365404","2051974278122174832","10488671536057870181","308045361736577745"],["4344315027055250511","6741827395667143674","2065044860921304965","12592532550815569188"],["2651159853991312789","9793916290783828282","8459975935593622562","15046333424363431461"],["4406935200376103802","1515252767881117285","5650532341634489146","577705527294428466"],["17541951353402197683","4460928503403299699","7740021360118731432","1936864101491317107"],["10497218838141704080","10309928305540356718","1833725417115021727","10964436344684103245"],["10416822841592735027","8581727876276160421","6743143673154402137","7745037302045849271"],["7008794869656102888","11117117320234639249","4358315515738616278","8036671987565366291"],["1159206241470707158","6377091497186335717","9752410285207362962","4028015260599378327"],["11610206952353842192","6646049219797398177","11325798448311753815","16558695291543672982"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["15711470837189353606","16393278769138467139","12643815528240783649","11784038268412886001"],["12645982294901886691","17754887853991261142","2267523424349042931","1684064161043233161"],["2792822128639094901","1395827624062442947","13837516175006012001","11732162196029953697"],["13781164394926169443","5679213306802555015","14551591005645175671","12382245218023576803"],["13303090214971266918","17331265275666989308","8633248733586379503","12154324250810494288"],["4996347075170367071","17916568828054083896","8169937095036794084","16029408792942451173"],["5610617219381303303","11467871440311188352","15485494199828789074","10194148581596796310"],["16450149448280745556","11778341416992560013","6348689421600437116","8539103176320034337"],["7771316728956049796","834748677608721978","9551003543434069550","13990124168768093070"],["16743405275820629980","12952239433991488020","12198852895617768371","3404144100537473054"],["8775465223576216349","1926709423343803746","18330193618117401761","2462241249505009843"],["10289219522325284458","13605325306473516220","5490275712690631924","8742166503424177864"],["1669587353928964271","319155184597914925","3357533989256646777","5170060241275074132"],["1695167787979617217","11554071936990142032","2256803195006454260","15275635975399550786"],["16315433114873524539","402072239318113363","16198732823016773988","2900775346697706854"],["12569051909223368080","5133382096549235292","8147627853818488917","637995160825387868"],["2266019841537645099","9169772412252882331","1675622754192116621","925188597424649948"],["5552341697357775127","16919043199336805496","3538708379611692730","7146610748207227607"],["11610206952353842192","6646049219797398177","11325798448311753815","16558695291543672982"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["13304026382371665429","15952943086034043791","12161092306778210333","3500288368752867102"],["4949580084374636757","15950587351273585801","16106845436693234944","7429820661233386602"],["12787321667158552647","1225971388237198287","13441636962650531184","5106481729474196432"],["2829353605716897122","11185832298321867223","15350486455057046634","15362993774302697589"],["12664322598314717013","3499721470804714241","9544835835489776887","615028896114462934"],["13468279334210007366","13042365502403755056","10673761163694735111","16298305244051981369"],["17213227342508365462","3766328398643175691","15193816768604215652","14968623277136710381"],["1997072538101764754","4381579401080070267","16811320883165995335","9400194875941287543"],["17551608653474782724","17940863198070737196","8010502568753290242","12222659192958971911"],["389825788501665893","6847761786790504354","3929153893095608894","1714647927204554715"],["11485828201467092983","5479555260485717345","8443406527503781189","7270062446956483299"],["16396995801363486652","8604281156051239246","2837657774837797391","10556599909882273018"],["3650987518537085695","13296139557925101396","1964037993855869869","1780920993397103082"],["9693740208304096180","15712829651236439395","2718510730707003473","3908164115688020105"],["16794250015824566764","8556993275139984672","8750325699388388316","6607036984513063885"],["15984816945021754036","9430405643678102155","17766264554676561155","2323040818843168408"],["4208352311132621900","13689206851327566246","10964175249375483054","13762707993261797067"],["1159206241470707158","6377091497186335717","9752410285207362962","4028015260599378327"],["11610206952353842192","6646049219797398177","11325798448311753815","16558695291543672982"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["17285512661029700451","11004308732409295879","5480367084053570051","7132907934397673553"],["16198889215718740565","10309220701839574947","12908351086223695349","18191159383996303547"],["15814930293416965828","10445350534553187463","9010741901102515450","7439278146662447366"],["8527579914452359936","4595050434475746034","12009175641438440094","14464350219003777665"],["14291822119921593284","11804913571905271982","12609535920969228670","2488268591058740135"],["13741678748303963805","6586507570705742583","14488595469103102188","1841594372932695475"],["17069547949644508060","10262751131648217206","15474274413368215063","6156641597076074374"],["11160058779055903010","4648965114405158990","2453976932391876882","13841943909827541505"],["14996025147467580564","4841235461576743418","16816783377480352130","1208214486782991014"],["13689306315506455112","10469717003514829358","6569283839848340058","149697518111170904"],["9980019885413711483","5932674724400544440","2795001506318258902","228026138042746310"],["9777958190091120500","12028250452967543571","12223679929481346140","14395287756230773682"],["14281678599427091897","15659697958095235184","487831963605912345","15618275546269427451"],["6813635321193040393","7601348788632151202","16136956631226405411","15335135708013340446"],["4519606163482697934","17446446584142605877","7601454743457715182","14100192351940325080"],["11754063932017053360","5500617911602761755","15180350028059053321","8461642190443782495"],["16289884673891148953","2546791332717774971","13803033931942822459","15012349579825605105"],["12653989498030917547","8441757620766285706","45870542927902673","5896930239799338328"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["8562708240193919934","4211667631196393964","4426389171791587057","2276149000459226330"],["10418637912738920546","9030646425464260601","827661559117211814","1012652486695364230"],["13694406897481555596","3286242251575287608","9150226452006014911","14561988286407167821"],["13843607527113866555","1366997561583194423","14294936874761003612","7709112149399455634"],["14384919809901596609","8677932512912509479","1883751953302505712","10097165707634207747"],["10779166217451029053","3945972597197396436","5703998473537766801","15374485771464235019"],["3763298861599730588","16760898408114235801","8623808550480303076","10976701534327476555"],["6111096594363425247","9788480824772240065","17218740369139929360","13394647804786935480"],["2629824528857334828","1468935363939405035","7246084335665194714","12522099388374326003"],["14268590568754515933","3587557976946665023","17465381594222609268","15358184789437800560"],["8043587663796349620","1874083695265580680","2113998164738065872","9940399745595779668"],["4134636254180817353","12713277412502213037","10613478833699583212","3667915458710915955"],["4406935200376103802","1515252767881117285","5650532341634489146","577705527294428466"],["17541951353402197683","4460928503403299699","7740021360118731432","1936864101491317107"],["10497218838141704080","10309928305540356718","1833725417115021727","10964436344684103245"],["10416822841592735027","8581727876276160421","6743143673154402137","7745037302045849271"],["7008794869656102888","11117117320234639249","4358315515738616278","8036671987565366291"],["1159206241470707158","6377091497186335717","9752410285207362962","4028015260599378327"],["11610206952353842192","6646049219797398177","11325798448311753815","16558695291543672982"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["10690312153860905858","5984360746424683791","1326207279934128997","2905332972567721390"],["14652548307844622220","11518968488459585538","11903884288469204364","5323602353049359410"],["9070151324713766758","15482630293097353536","10820333586541059719","11983501503327812835"],["4081765846484259133","3601278928514809921","17330080676381065059","10948138125172137290"],["16235813185328955899","1263347394076323862","11440648444497343439","7574953622021443838"],["12882187530133905987","10965900697342364867","4042488467493203361","5996152601383979030"],["13995219890838357652","11112254041326512549","14907345538636855158","8978529643998574081"],["6027691510419034907","13481631294705681804","17274172319719049468","12364547277978378336"],["11746187919008398910","8474466625497587772","10217979401564822351","13232851804512245546"],["14399621182852886118","11492585664640636560","10173549959398872019","13456490157793333957"],["3212261156542643212","13860288554811184619","14092297796173561234","9877992334018341393"],["17178798270249835647","11543951579238240009","8980335829640587566","10143710977909922311"],["9293751867527054006","10245166494619809900","12794035173157783815","2600903383462605765"],["2537592824929085175","17094472382523593694","12526972033503320313","13487922229069918777"],["10587625103673366907","12281941005423554334","18354582581433385601","17101648310132252846"],["17825796129237642677","13577136452990657773","13427866815688117249","2481537978636088051"],["13780084430085199989","8583720973155775189","15871204325897973652","8726653407878623428"],["9054047494787423880","3824385377430709437","16762398139846028678","15431691381426894460"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["8541421599838952714","9056509347339784831","4351346583118203909","394124053388933014"],["8983927965205191949","9421082640989715019","12932707558791982308","6168747979116750766"],["13599273745525037575","2403206230343276291","10896816628200366423","8777978314696690162"],["9376404454645595672","6176752578071860712","16743841641795094233","16203645062781345116"],["10275902155485839631","3541447846249653988","12932754577521886427","15393226609978910137"],["18002413371413057260","5362546793490138840","15550098294792308623","15137910722714010400"],["2781108381348155389","15583252517026626816","7995802887486108488","2815193454628033292"],["1896463869745191312","12759513294680903961","1466993664899169561","18069359908244323577"],["11739309337752612586","707714176475550831","10226827894579762707","5314367754142828788"],["15973926961734096134","12777203974456255994","16860203219414475767","15899335719535428181"],["11534053789989821811","12311372601799905619","9079645913685622367","10323738750352743147"],["11206309614618985283","13847700306030559251","11606071718144837329","12524150450981010374"],["15613554506107198490","2371285007315800284","6048210430528802396","13850002240119239604"],["8330769680521589425","12517560467066579637","4267282472632090133","1914829763074813182"],["4798799355418815032","16832020157812310550","4677265303339815863","17040457934948945226"],["18042605628621199565","11059984990238828295","10754737421664011395","7325210569172748622"],["17350551320989815162","16944265293362413801","12448584408517030389","9253725613738486691"],["4887551765265295267","16368491953894427928","14778415477943092503","12205952505271886829"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["5748598281483922024","12420709395267620372","15515456226143895782","3594252629048297948"],["8000674658590390013","6027377931308433446","13699795418188657954","14509180940488965789"],["16133286799626812021","7356388158660626677","9015530152515159694","17742295124268367020"],["16795245886819910590","12973244736534813362","13440702954507956535","15777153539376835325"],["2068608042123478371","11148527700185543415","8477309668806658586","6979076316822278313"],["3685790764448258425","3491551734218254659","3602645700271699885","13127801243021452794"],["3884048683107721497","5552233418242377756","9729851231092722900","11085024616449726717"],["18119000854720913252","14831354588169713640","6265120790785959009","4180188524565857967"],["5228243531417668794","3650229993772936988","13367396185545948974","6507221254884457577"],["12381317862175911274","16291373485227327123","12713373209711201403","17905456889740957697"],["6119680383392289122","15923270255580622762","17823253545532809322","3392872728755215125"],["11178575403698170817","14292352887990235857","2936061729720557904","1836599311383918192"],["18388860214803930652","16052878324855055532","12366070242707870108","11713104988137071133"],["12338945254024237060","12333653872787287514","16934042735370415673","6942577013493424877"],["4831572156086257265","14817742377097591749","1460743799140884650","9427901066467421113"],["13796112423937538834","1480655958676982011","12092018984837931785","4883832997580884720"],["10461903974743460870","8871714333657545576","15692472446644335312","5383894551670032564"],["14082538275419754221","10793403934826328431","14626154253975899467","17892316983772254351"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["394337540379572033","12816733376081732200","4030928435566218832","13436868213413189743"],["13245399360590730579","15173321404433927760","7450099745393008544","8859057921459336070"],["17373643030375626689","736344514553275449","10732347104818423873","16249902256187137091"],["2207721862075603498","811965006109561248","5152712676599670468","5782686904091156017"],["7176894592794529363","17203615513927373780","7455542374348996728","1444759401581277293"],["10279409023329491458","2253120608808446088","2275449656397429133","11986088024721294615"],["6832788886145515234","17724915636656904659","644742810866816429","7604760517640208087"],["15840986002019628626","16941693985398227301","2353825005089236096","1082267086343673038"],["1642457111089246923","1470482590635106640","13776492895052336232","12359574644892276964"],["4614350366351660019","4034951521136506379","7622746216574468362","10215711745877045196"],["15430853888570539171","17238055510958714203","1531910147623885250","15283446963971767641"],["16637986005791303677","17913611873093958893","13688260468476667115","8705204358439837958"],["1719898318137694835","4787662107260995518","14640339080981445057","9526899859951316517"],["8621848687054458280","9309255233268348599","13747523826746118236","17377166616643622283"],["15590086087157393580","6595115805923204247","17933236088005070781","10699089235742137668"],["9144659171070728453","11896887417966487993","14429778159149678987","14504203643032258245"],["7460364095719151862","18275532881303460657","9930423696008831918","15824799171501025426"],["12653989498030917547","8441757620766285706","45870542927902673","5896930239799338328"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["8455238132020211995","376389790600883595","9919487768471925987","17210894800688468816"],["8253885268385784850","5037609287867346670","18294432186644342364","2330892968269001494"],["9930319928108194120","9175956504439868266","9491274996086807882","15500457272486896234"],["17137060285012595884","10405409569716430697","9924218069089784224","564132915619194688"],["11745256854483515122","7012408461624843891","9390515759595122020","6128918763929074529"],["17409625732816255575","16429569915645467521","5895916502647912286","12348091273889478561"],["15115715029857055697","3078596218858855101","6031111367137158710","7092930932466876197"],["16080699055806620048","15988506883724935081","10599249518111325444","11747051348495017595"],["6474327386735373944","5474709103817041293","14150956333851663405","7206931897007196584"],["3548417789216927871","13642731468746985505","11418761467195556028","1468619756180008283"],["7865117799329606788","8479960163213493661","820788370737250830","5396972305765692115"],["18438866639795627473","511996156537842748","5812827897676688766","818800462535808446"],["3162569244807243070","16316940676894087863","210517853864271120","16656305907762985001"],["15130806659389841345","8757694315634646164","16590281925798179874","6258562919336195738"],["12400399997757891532","8573590098310114791","10610495445585324941","2832828611900129714"],["7210457703368169857","13806844341202096024","4122970130938419837","6258495173256889683"],["16639120711325476028","6017975435745381167","6181416171167861310","5996359530951583001"],["1016460783398317128","8021669763668649402","1818724354175664391","9894065517414349131"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["8987749566968707654","2029113038214468980","7807935981530599490","15370500197816900608"],["14731606121726088166","16610742666358810031","6813990942517800309","784689935764401685"],["3246169436609042921","5036526520629207170","11314144599640932838","8469117040663823661"],["13324649636789028781","3862204849105457447","3550315778811187458","3815771673646990606"],["17504016203255219377","14838910652724406224","12252069693533196128","10662930090262040320"],["9543198246707554895","191121942305190750","14459702213337513447","11615764276478042390"],["9642419889576630577","1431092668773654646","11271793296047531957","12866139571402048643"],["17246745063542480306","13266422960480820718","12533269897944620205","7758087745356606402"],["5333947292014242051","12540207241477383964","18396634470953060922","17319150655526588819"],["3630231591427122942","12195195749323782550","4937517244743393497","14305226068570391915"],["6848516948034535152","15197167754754529973","15160071089033993330","6616542491537563930"],["13347742880543769659","10916614364679953697","4512338232074946881","17014975238529124879"],["3160484211357811798","6308040151658854571","9264887096200945111","17188078859455667351"],["13881514714379544459","13677568446449934798","13773025837093702919","5830510771223445729"],["4703421380830974364","5372769501146544942","1495427597208174332","3784493666127890416"],["15299932375920560810","17096200872175975239","15948784315763689264","4689056114923805509"],["2868374879596658074","11935513620687568527","15053500307562189031","5744690364076802320"],["9054047494787423880","3824385377430709437","16762398139846028678","15431691381426894460"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["11655540525372267407","9426243031152590244","14546498841894858265","15570695931005003691"],["14210500110547774145","16045360231704793183","5553938876167663413","14259087270006919391"],["5328114385621094181","8353504241086989317","16056394233399988492","11698364561226933949"],["18045754766719495536","16482744579306654741","177368406999049984","13440653048482747136"],["8099733224730776918","1037086795877324750","1942979862850895639","3197627524100277861"],["15858194301728118429","3720196156370212243","11149606160226852553","17740660524368891386"],["7585498150901589598","15577827696953352204","1915935763858245097","17338494039784461747"],["12717232997359793954","13635198319841913356","17387558416587579018","9183139947662971453"],["17890132823055731196","825199779382697248","11219323647629516301","2561153388329441383"],["18199000580023000169","10747121919042998796","17304545311862013840","8644231143800611498"],["15672714736495442520","16832824970037097966","2548349935977578421","6387625294174107988"],["234735636588079706","617484916247245643","9253551340164608366","14962437258292609812"],["376240240316197651","16969777606822982082","13453942209344048975","2079447837644287301"],["3328178848501354337","12670366007962868128","8634857334179527218","16711568633429457194"],["14030438513992410614","11795251121196926153","11189912820760371016","11818439605968940883"],["12647666076263057152","8658190044614263848","14872609834023090032","13229634762084473581"],["5268495829969668169","2891110452426581102","9327021484812920967","17394174152949679765"],["14082538275419754221","10793403934826328431","14626154253975899467","17892316983772254351"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["8294417352551588994","14455737845630434984","17817383354756798834","16413960612255342076"],["11139671685319783945","11772265944128977417","1754281252001719526","11167922958058445668"],["15149997313866895175","9524145026915426999","2550095714682262735","10176223760554961041"],["10402016184824024472","9462452424103900161","13483237861837860756","12335309576024309356"],["7067460227497977764","7069598139847169849","5834472861593897456","8324991496091649429"],["10552806744971439306","9087082179872612936","12918173532597056796","5833025941198409863"],["17820690270302701369","15858262977993330767","10443600977974122731","7478721509040218863"],["10857013652087018359","6445802160427041861","3816966733735016268","6130553293501802000"],["11663804067239378963","3911260699238913923","15244439929731893517","2924117268998348358"],["13510752249652933623","13340909613033880833","10892493875417185185","15740645425812294408"],["10829077474946417870","12571139230066466078","10087608374056445779","7648026086958793325"],["8623580766570538161","4568697600549934133","11846805674515142137","18137880325821264728"],["12754063199329309410","2426868338525025830","10712749946908934417","7796322579010865867"],["15018262119971638506","15144288981884686337","9018487722185998634","14393235002039135304"],["8208071256728319630","7772784827526045954","13038097961632634313","7957828231678492780"],["17454692631719155994","5965444943438613009","11303654243799326671","6469299878520410283"],["5268495829969668169","2891110452426581102","9327021484812920967","17394174152949679765"],["14082538275419754221","10793403934826328431","14626154253975899467","17892316983772254351"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["7099157311018093085","11378952258317852124","18291238007943401785","14990024982541712707"],["14587909608009534767","10477958291847067993","12299048441842629063","16980390041814374459"],["9941454922998181350","16184109803701961691","7068985961353596537","10457026122360499873"],["8653787574183895551","6963443382449258676","14855268590334799968","12012341231037408114"],["9412804746849855057","3464657675498232345","1170871910769906068","6557799572741199013"],["14456922357560574537","10204982810814756053","3429834721007589563","1439204977845584922"],["13488698853946213144","5110472747743674497","4479959741575415876","3354086236895705955"],["17041184535898624083","14427637200109364856","16449603216181966594","4426051375845619087"],["5601327725707393543","4862390177423137562","960647190381928816","9598246318012881446"],["15782382296828147509","10164749144690823476","11313891621763546715","3378696395429760978"],["16031805335100157264","15297334405467895938","4273443693757697927","6650557105138063110"],["529589351411629807","2355232716789294151","12273911657548372632","10386608406242353117"],["4131740615666437037","5784067417878155394","7830838527307201010","10960646576759854024"],["9743115633317447834","16302791831821174115","11432383927588961840","3834088642119322404"],["6310951820218961482","6175644377544323195","9939509663736254496","15161906161020701083"],["10796306385908984535","4896993107035129883","10201614451662537273","16454191291011507568"],["6397578596432800270","879356400815241104","10906258998956310883","5340667048952369339"],["5552341697357775127","16919043199336805496","3538708379611692730","7146610748207227607"],["11610206952353842192","6646049219797398177","11325798448311753815","16558695291543672982"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["14338060210406418438","9445229171490841768","6737564141709153672","6947201322988748688"],["10657383976077276271","5893662352604633449","14652593749660576054","14068524760542208657"],["7815102006064077860","596333375471795253","16274919445162754266","1915666182383454802"],["18350150853757047067","8623927133835691751","3966030367816662731","6396871594804976103"],["8111102380479144065","8577494857622490849","18095851037542647556","9370717697138863270"],["11250277306419655028","12821617330729997896","10532599575481666888","15593377050121611867"],["7978361943056323066","7312354877987769220","13258891900316288953","9596077279723446450"],["7906095470273565796","11708789986327632788","8399302752129741999","1878735932166869387"],["9622454897601424626","6412495774627694850","18344681787146180160","9452014699220451195"],["7803183249565285298","14338059759297134269","18235215550249464229","8858197484910198479"],["4534841895691268045","16406565969479663280","1706276640871287574","1638430636800554701"],["18387289695476957482","13925640002226686791","17495563496412706655","17087146553094737660"],["1719898318137694835","4787662107260995518","14640339080981445057","9526899859951316517"],["8621848687054458280","9309255233268348599","13747523826746118236","17377166616643622283"],["15590086087157393580","6595115805923204247","17933236088005070781","10699089235742137668"],["9144659171070728453","11896887417966487993","14429778159149678987","14504203643032258245"],["7460364095719151862","18275532881303460657","9930423696008831918","15824799171501025426"],["12653989498030917547","8441757620766285706","45870542927902673","5896930239799338328"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["1968062408368234979","4386040103231123620","14973626653276303196","6439393862403475248"],["4684134200189692715","12059756447786377648","9309042200109124134","6130696795363887105"],["5267270131170322304","10097791367735672111","10579316712313847143","7321119835919039419"],["6116853478596261234","17954732638696074263","1322673911195347909","6577318205299570898"],["3114468635749847337","5255929467421642667","10469945891856179556","12505815276083100281"],["7997741033556089177","5195144462142651639","10293352687162957647","15217886448276297701"],["2759350782366723962","5682443390005024048","1383521662634925691","7610906647644560123"],["3538758753958612407","5504734047472528784","6034385756467810803","1310022325883589223"],["11813817357743193566","17362754050989633535","2710321639838772413","10219414317119430523"],["17905906455382195453","9873281670633958856","14113171508951221567","11257145900244312445"],["16214543630568342437","1453153835510102615","5242387588347030354","3663833713523707128"],["6321846977183918250","11049372780075933275","9272483811965480209","4122773040151643554"],["17842612224985630261","215468763577638563","6053585321673142742","17902474841277007914"],["10137763731948383188","15103896898413287052","7515770346776101426","1265790041644972426"],["14710516573819728404","5291806229433606598","14332030668078576670","5163375266889263401"],["4315436274904027079","15479091086264646806","4802797695473937659","15402514805726730078"],["5203624765737110585","2433260849123260895","13388530578232375543","16952660975824165041"],["4230551385469738003","15416066491276309","17253832330667124450","5167203867041597734"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["12602682365569728954","768486522351410412","16532926264663443575","13455055381724622296"],["17745405802333477107","13997990190388195827","14348356668555439892","12032971035473417939"],["2312661480831229023","4864241904364523004","3151462300429376678","2489107016230106223"],["11433234095443260702","8219917718818439690","6808318463433279293","14916393976024876860"],["14051144239740986289","17606942058938331633","14771311770140343715","4937988653263865752"],["15770892889289250458","15463871784601470080","337158451747568183","9478597695721266596"],["2911208421381777613","18029822572519541182","9466348337736958262","14970503166134668606"],["17979349902258985128","4990037377129870591","3241280576526137573","3753783379015194467"],["10832627403320565157","1165003335450086317","14434773624124422855","13164387846023321078"],["9224046267026679514","6940739670713737078","3090497372569563399","4494668948791147787"],["10094943900623781828","4628304867776520110","7810861988610344632","15320829722208808761"],["6754109425763039046","12431808601552188945","4660650288397612989","3781080421511966937"],["4555195623470848892","10854483617291765739","11294970085335123831","10367765451910208446"],["6200129571321339735","3744488865903607330","13096293368326384269","14645874792662890927"],["1595637241902997169","9950522069758600771","12143047615226508509","13565929611502303763"],["10611017425796532869","676242853447377535","12523230155262601254","9668938586100884827"],["5203624765737110585","2433260849123260895","13388530578232375543","16952660975824165041"],["4230551385469738003","15416066491276309","17253832330667124450","5167203867041597734"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["11483559466295190951","4042592399195716992","16591076502709630627","785301715812572281"],["3381131938929026904","9311318675165087549","16457558726703425394","8768842040776296442"],["16193574344260889898","17532900996350412984","15647867982884597003","13714623336087547142"],["10731472881631600229","9991782769609740153","12222266095407656564","4524602876375821309"],["15484883382183474238","10244893265366143103","14245116209990376086","7548914539381292659"],["14321648847524589368","15772624460362288314","11562605057637131673","14353849184104811635"],["17611526266193587504","10869875476767382737","15104351659773390172","14543210171889188168"],["10082988717656987053","16399845023757602879","17371875104318584652","16829358279138417583"],["3157319215706696741","17944237607863920158","4651638309353513769","1434745825981967449"],["13010981892582202792","14669433484894635417","4063251188578555897","11565956901226445693"],["336361674094414455","11514109137362259962","1985600237233315346","17687872783295188064"],["8715517462666881607","8451155069114303587","9005863951984989464","11746927532315089133"],["3260909033075104018","18378603117671952730","4553931194894845965","12263130863756018076"],["2611439960973455039","7871988899184451127","3948863764543822501","8751007977588605061"],["7133677688685023477","4498248111824529218","5766616003650213389","13219812696544554799"],["7707030974208620022","7442425321777082939","6867291871334765571","12706474383542814121"],["2594450560437958504","13326386325614682720","289589846909833274","3774864326138654363"],["4887551765265295267","16368491953894427928","14778415477943092503","12205952505271886829"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["15075238181559149394","5808371988287832771","4038229930138425469","5691147003074338133"],["2771803773291141860","17611684656266110356","14910053481414695537","3361500738424382673"],["6848477082601934650","13072168749296421760","16746145664820749126","14799786099543432967"],["4373463316727079111","18139516956964796478","15945473270701217057","2521347220996251882"],["11659337865562159563","5507114976211897195","8638167885472995943","12830061809377722873"],["14489256701706870042","1047948261806740089","19358649062619106","11031948815664321925"],["8355929732574168878","17036884282697764793","18429339274653101707","12237016932544413178"],["1739812901248662580","13644112834340354913","12554395694748212688","11426986155826755064"],["13452554643654835173","11722658066697327235","13099744998567371530","3226138732315578298"],["12492187623974096151","1694590933923644732","16753977362763765582","6444744752491523938"],["14813515532057783003","12345734699061179585","12399361505275848224","6135299267879379148"],["16635923421219389639","7284737282238432629","17880391633729642544","15139555383005081537"],["5349446847138277547","1565057562291699975","13106293077833125483","6506930666359257601"],["1765753354497685335","10321109297088450995","15543631488515393661","11029455362256658901"],["2718358271543565880","1159007804947438096","1555011789506460879","5604288541469355697"],["12647666076263057152","8658190044614263848","14872609834023090032","13229634762084473581"],["5268495829969668169","2891110452426581102","9327021484812920967","17394174152949679765"],["14082538275419754221","10793403934826328431","14626154253975899467","17892316983772254351"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["4162569931329246534","15055091561315810164","15038017446447560176","7856970855158216577"],["17867637178970370008","18350707221964462479","14169092826869385712","16186304658380555961"],["809070656452000455","15668710445958697175","9110345856674314077","14715820605061570010"],["7219901975281220127","17451265309898252782","17327453735481526434","8363163081289072418"],["6247402738478778025","1478964763545933191","6599090124635413249","13770667643783667591"],["10351179042620244530","14568890791961429237","11471937792897849140","6557364579927893252"],["13743419938728038325","739312113149972017","15029847700865744625","16532754058280879576"],["13414447478938188894","8515859921316132821","2820815279274807245","7536430773455064757"],["7451202585051362366","3907192502967298233","2228472601126673575","7014032135942733422"],["5831074454857623486","7560452650831737194","5577585986081551503","7014467401281211725"],["15168101471363382702","9406759176930136445","13980454458775348983","2600663177566351333"],["2593467614640758018","12097906385710630678","7929957057103532149","6661855677048940274"],["10892535587319969496","5225765602512913345","2972265904201557979","5620344202976783262"],["1424221708490825135","7979512343567443534","14191059454599957971","16063203723683264612"],["12817636002238322256","488454582119519160","13378256568944457310","145139159979114400"],["13930497499586105444","17346102062679286855","11904250243825127650","18389041429519565966"],["7632374318585891276","11244134348418398191","15838445235923991840","7214529571736377195"],["1016460783398317128","8021669763668649402","1818724354175664391","9894065517414349131"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["301008622917418357","1373270198806322290","17708009602716611475","10233282961789423644"],["5444370568065754865","10144530719118760830","6444454235415686439","6757275964576585891"],["4257821585296255784","1522371538877372671","2116098025060323647","301052278761060588"],["5187608815086417618","284477850998837182","11066149906698843471","1871514818341019717"],["16977189887952716837","10098480044618848454","13162004767120018191","4902604379560071973"],["7232206544293700639","12929190699398819840","966387757370879710","5030954957205244289"],["6025770847307202220","5082642435387480930","4552458351659402934","630579557933509191"],["16371859828450473147","3756455681599558062","16300344700912203017","4055215182864388072"],["194155877111476893","17761500889793792773","12204704002273347043","11624542623404140630"],["1899111050559414660","16503237312052376629","6233532671400210023","596247668227266244"],["13999669400157370070","5632694500568599530","3851748865619819422","8888831057973672011"],["675766318002680525","15166434395462751152","4593275007586821618","7288674319891846372"],["9875936979530340144","5171729370319209495","8131355018622667110","1245160115899142702"],["17343779919376492435","4699418111621508950","4199015814446248917","1267591159256449955"],["15295481347445823855","9459033771716387941","9128431388744876654","18187934618194796137"],["8956344200455419511","12330596924768603744","14836963918516920814","2427657816380905672"],["7632374318585891276","11244134348418398191","15838445235923991840","7214529571736377195"],["1016460783398317128","8021669763668649402","1818724354175664391","9894065517414349131"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["962841306262561241","12604349158968620295","13611621810482971464","16450234370654962032"],["3319506399490994595","18041143822460983249","17977456956993736127","10967660473694338961"],["17814284184471337566","16891513117143762596","7585455237347513662","5959575482366773432"],["5978146565576372940","5023289483389158781","11698473711076777626","399173051386027109"],["10878520885806063750","9995188785550113603","1374491393069212632","4067071720420385146"],["15579679593373571793","6915637171249915821","3727816765917776482","1541662020038225511"],["13226435120079723324","6457407118423081371","6349504152104740496","9698106707144284078"],["14245022257869212194","5726067991442822678","10853012203284080123","4913273376541212433"],["13768830935010695517","3340702515364568377","11532869931465513135","10730271596105289690"],["4372972445857049399","14471164917823004049","6938583670512853102","17857755191682826233"],["11333061147595990406","3273759807319990943","13131667096959494591","8320293333255930535"],["5689701716406589964","369972894370088308","16559863236972892007","14788532374459734675"],["7358916182838717766","377206479466329075","2389873770326454857","17765705980336055664"],["4672839736427011800","18175306754978496637","18174632501256519337","7080207530390219977"],["18227460496066733162","17752337912754083832","5996102162005602868","15744036600592675204"],["8403923871014755397","2204899910990864915","12255810770929927893","1388577141086358237"],["2868374879596658074","11935513620687568527","15053500307562189031","5744690364076802320"],["9054047494787423880","3824385377430709437","16762398139846028678","15431691381426894460"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["8070844894472495494","17690742823053587677","6583272170724619180","7452422713293446144"],["15371187901347782784","303481509125726926","3786169083577138296","12460841998078850938"],["17601623480685845559","2857096931906900571","5322531431774545685","16882571703480571892"],["16959270116869736415","8654065441869305398","17048776382964746268","17792639848851324857"],["17202884293041400405","18349234714088298839","12448658162746918186","13058512348328570726"],["11456298784729385842","17641672415062520315","14083845700313047097","107535350932231318"],["13902432114895262657","1189060637728042602","14093574321541171001","16593460406029375769"],["1206774301704883041","14684788576437018722","17306663503173039916","6650128425113636964"],["13744403257131181719","12664553878568589336","15271342772657247365","17201581019296947019"],["3112868176990231431","15046107133898524689","8086138334336614859","5615672193890708230"],["13416368231190456631","8635967215506027931","15279108111453339447","8833336806712516756"],["16847031280003518663","1881410464266850361","637992354692398837","11356075352658625075"],["9293751867527054006","10245166494619809900","12794035173157783815","2600903383462605765"],["2537592824929085175","17094472382523593694","12526972033503320313","13487922229069918777"],["10587625103673366907","12281941005423554334","18354582581433385601","17101648310132252846"],["17825796129237642677","13577136452990657773","13427866815688117249","2481537978636088051"],["13780084430085199989","8583720973155775189","15871204325897973652","8726653407878623428"],["9054047494787423880","3824385377430709437","16762398139846028678","15431691381426894460"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["8251088029306855782","16245707788779805328","5488330303527355402","1013558836912618710"],["13181796986132155709","4312055417091840456","1186609478662103586","9012652069623363416"],["13093315873568829141","7290870741143320151","7432063396933886722","8340894542628131110"],["395187728321083964","13216447890748167585","1690575789176058538","84466874684541669"],["16454786044822768213","8331422359266842158","17901370573228732483","3422415648163444114"],["4389607091248755586","1892943584235556320","2293171452912989558","14487630229178817518"],["7782289875725918306","17990720152366479239","16878530499086413477","13683649317300721352"],["16005088190269545592","4626388954814528762","14925939906117172986","12607262343997648195"],["2635372484955700492","3941330706664343822","11557761415773826598","10979558285807428809"],["11620445166671951335","12387887099266192289","1728560002510877599","14395642821228604470"],["12834496631108699007","5848189792991750051","5597294918551246287","1244610332039242158"],["122722727172021313","8103743665661341439","9499110077564559109","17786072675319066342"],["16138281024313472248","12249673140018746464","16368443200756274605","5732410438230232912"],["16260134495842061269","13264414401542480985","2940880487222701347","16780645204700393317"],["14331818645172135191","14875763213771896848","1286353128086352376","13388941526069109363"],["15500372357837036547","10351692232472936656","10097820123755180400","4588132135302265393"],["17350551320989815162","16944265293362413801","12448584408517030389","9253725613738486691"],["4887551765265295267","16368491953894427928","14778415477943092503","12205952505271886829"],["37135097362135130","16110025115320433237","6226734709075415499","9629171158143618488"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["3051668506322416044","7615587624823587536","6694214193551645903","15572788867451076361"],["6189629441461816692","5004029541030291759","141942553056157768","13081961171745415417"],["8137569750564302923","11929013638107900040","4942989877526583783","18434773702120422591"],["15969886946586738014","5545120570047872645","12158373509396535134","18355045271574438542"],["18437012476022707122","8867030184117719012","7453790517696116205","271113280526280"],["1843336533628436378","2020576452493479670","13065625395893161365","5040860933161543798"],["16606917291663742516","14827009306630792746","9694432072360469526","640511652841358984"],["6190620944897998503","11736078202440890837","5198322873066921315","11364462242521574019"],["7283833204396595969","15134803188090362932","13355716236553596423","7889952928730923374"],["2012129696097199342","13413125816967630746","14274023520977788964","9331455271230777565"],["17769283874618287946","2945418813194721281","983972296499433294","1958878230520469660"],["6110341318844647928","8418595859364095033","8354905076237055471","14993436212277081282"],["14116263275239341550","8391281293881194288","13393145590438923977","15419116101426869629"],["16012359365462103600","13931000577262307100","13218028379360131938","4334050769414480989"],["2486099582619240518","146443922273765026","2779510236466846219","2672603126012082126"],["11754063932017053360","5500617911602761755","15180350028059053321","8461642190443782495"],["16289884673891148953","2546791332717774971","13803033931942822459","15012349579825605105"],["12653989498030917547","8441757620766285706","45870542927902673","5896930239799338328"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["331985216504341150","12760854043684752513","73127274104391634","5750835509363002648"],["13285632316878100145","6286656136312431804","11224998202793890730","12297252074598581975"],["17837214645239084031","2066932639102142046","9302123553609482412","8476961584127268003"],["8512416333508193435","15232560536198994300","6534409807723198961","4470017778731482381"],["16553673716369104420","13554495071903360875","14357056915421090679","813295950236064937"],["1103422820303158003","3046626364735149249","8804539797412613082","3711846692997219201"],["5396268037713911712","12532529535732230152","2412747133012242181","645532354540335460"],["958844150875124288","611521810859136974","16171653959633539697","9456329709991165039"],["10286735580177232482","8661983146595959767","12591821103360975672","17985393896299493721"],["10071150036779851890","17633700583151171842","15007802112511794814","13645662720814475981"],["16429542718829766634","3883489871967141246","11391635950116727850","9197361164231716548"],["14318016886285048818","413842953726029357","6305543267385076579","7867792959432114421"],["12918669308236413568","13067713568616270986","12701956564852667902","17479482967627143062"],["440312285696898980","13909846842129942033","493973926465818366","7847245847637719136"],["13304658786635405925","9279065721504618380","17573250156716512595","9043926594066860294"],["5604058107578966108","10668918200327299816","14003857853358784968","14574120426673862325"],["7460364095719151862","18275532881303460657","9930423696008831918","15824799171501025426"],["12653989498030917547","8441757620766285706","45870542927902673","5896930239799338328"],["15545943108431142264","16449939446374205299","1176447474878008756","9182758497216758248"],["28143096647742924","3027175492143454147","9846217563890845950","18082078469893501075"]],[["8481047176077713568","5726510443514947449","6719917472866153443","17401473222966435785"],["16461587780769740242","6169724502066721485","990897772109313364","12266207511978343315"],["12179049144877159618","1097054055328086113","18104832360811771641","9156174807144568119"],["3173865493602270956","10033169943661556502","7634090343844806173","14895639579791396059"],["3124672723187483290","14288369141967298593","13939786146835537833","9160152115951128404"],["4204186719708676562","10088604878481651007","6711377712156081703","17328628787471012399"],["16559963165558928104","10026192216110554088","8743428195768466105","15009699467174672955"],["11253979195711031845","3475565545846185821","16228567324953301561","1739104657170802644"],["13768914352173210884","14050759775950070413","10965409443062567936","13554417697599723247"],["4787718711850245400","383301119804451990","14849272536925832439","16541994227950790363"],["16527695458372175091","14615110105114729818","2259613495098384552","9726804109075497803"],["3947589489682106680","676349895631293921","6408082263158632798","11257794273122979070"],["12103428596595311423","14701557845413094743","13937296446063893601","12577437862349659807"],["11436979456735746566","18371213342646633352","11033511950218053814","3824781038183959499"],["6310951820218961482","6175644377544323195","9939509663736254496","15161906161020701083"],["10796306385908984535","4896993107035129883","10201614451662537273","16454191291011507568"],["6397578596432800270","879356400815241104","10906258998956310883","5340667048952369339"],["5552341697357775127","16919043199336805496","3538708379611692730","7146610748207227607"],["11610206952353842192","6646049219797398177","11325798448311753815","16558695291543672982"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]],[["6509782228185719300","11969791219410813568","11177938690255315720","10448763985481126167"],["4354051938241734517","5557953337572050752","12976970893967706981","7845597371470880611"],["421655100359085379","12407695476509516166","6543163510163427807","13479931550308178067"],["12002302368528236040","15867118617012895889","15967554283123029855","16887158103031442677"],["15600664850741551367","7741462375839603770","11558066321999207129","9458347307976778537"],["5673470960837114837","13441091786605836034","12070286751977576832","14153394391434181244"],["10184608779949472123","737199413475994729","15865988430451753202","6376748746596521636"],["4222252926234743307","14808565105442494533","5075351893893913412","17203354531021963365"],["13925510489098535575","15448744030090986188","3539255474411663554","17908382929217406595"],["924254370621441943","542356416225086397","9867394730125875120","747323740395767183"],["4024182468668619976","8716230135219731199","6599400991191917868","3034232414916701430"],["18154776865767771109","2132174939874679325","15349801933055743802","320850055302344507"],["2779625437701451302","4087053373455878349","1762700971877393540","1994321286963806109"],["710542784653521256","9978795947007244286","12466581912825611757","6564092000147438154"],["8852431738096181933","909721558945026009","12685893806651424634","4540244178002744952"],["15798805112664225392","4848598396656955320","2174455417066827725","8424107255508069220"],["10956161648081653700","5305488546397965065","4536077016729886571","9764173028396779832"],["4230551385469738003","15416066491276309","17253832330667124450","5167203867041597734"],["4035697937248130240","2662825250066901998","7416449340455907948","6252624361191946730"],["9565600624196133864","5373616155213406664","3517143074370569420","10669030402008057966"]]],"s0_siblings3":[[["7776772946158332758","2274219665048001262","9762388317177895258","17095503004310880748"],["9105940973818682140","16842812395837917595","17073354121403776553","9358858730818526302"],["10351602480901851028","912337231977162847","5112442029985971099","1868792780641681607"],["11948417262399186354","15948917527173853411","15178554878913816689","4695996699091580214"],["646338741822706887","14806782199346776786","7792119750541447988","7413994776725692451"],["14139119119741195200","11597750045057677848","8848964104562225693","1726290822556646028"],["10544877903575867396","17233396004191242388","15307678797123291941","9074446628651897336"],["11781205351593582082","2451053258277578412","3263025376978680921","2472489702119320142"],["15576150577058590005","11720150837155209110","3740007436121538358","8617842401092312622"],["1196224370449043263","14792419071236029839","11571814774486611274","11337769864646355541"],["9420709395184746553","3379531417072285917","2140560488601178520","18402439217873896053"],["13514963558930774989","2052985115195065932","11718622847884188619","5641737179051192863"],["4092348051234082003","7427963352645808794","59581989668796788","3073612980129867212"],["15371574049112614748","17416929168906208741","15879320791073235281","15630628278782619507"],["18387374193315399525","11416976866378688699","13328476135348924434","12666568654571462505"],["1979145503311717401","6700517919427746235","15425891872253741725","3018974599721715625"],["5210848005197040569","14733774541674927026","2572144881996523486","7624557391727033745"],["14901731779507881564","10574711314538625848","10442462692328694870","1217431753485994640"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["1287585272831147600","3001811335015486006","16820879280170539822","15459481214438891170"],["11961460644139678389","6665191106616204490","6917365119303656003","1054803389872618825"],["11612545434107558888","9068561264223721693","3505307113754332376","1957781457894458722"],["12500779258862667637","17100421509514664553","3258504083968816259","867845231321550307"],["12499026359204935315","4331099306746906413","6866004951455470052","14204444053667690349"],["1846614061460840485","9278233872594244150","12031019116130422766","13721187722135024775"],["9081703992497942116","13406768943574032909","15692463934718167934","8905240997644410458"],["10314161748567361588","1277399365751336877","6127450526913853750","12073426849236468362"],["11448529862436892542","7843234946503859675","15794327097068779554","7264120859865880098"],["663965341282921988","10457620423268224234","5745510121005602915","5652476236398491803"],["13793946266559652447","2536830249474506288","1240601772101372336","7986035306619290026"],["314953385413182684","4701384723142018003","14644441973914353842","6554350103635424542"],["11314981562380557708","7077912797830188249","7665827635899880144","11135760575894893452"],["7437872356815174169","2690616064439432959","14428652355415434936","8761579525761462012"],["571080507933852620","3317670258094494774","12360218929615774836","675771496056402108"],["14384319261732485826","13925451964619155811","6592168583512773544","16963348669966103457"],["4365919849128401627","11593838978834310906","16252805098250220040","9390992772565522943"],["3494947538190611982","1347831767090636865","11866844666890121809","5714248105476918829"],["12991690495139961638","2074287337477283576","2456956125630413361","9459670993420739322"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["2125537798827571748","3763582274420187317","2749657217172228234","7226531912516825533"],["11880665286031974112","13057246610731785496","5539588850369350320","14793415972364561154"],["2615236673846627617","16587651397535201781","10767616816767777935","1950960704737507479"],["16417350589124830186","16836879547019388522","16668578684272163962","8525897425768633474"],["3352969692086995895","17193942824004325376","9795128896370520632","16425193064260863368"],["8619238183954278623","17131666620623301383","9169095258374510554","3597128498789912844"],["10204183470041787679","12281633523429327075","6420088126885219548","7924955741442686089"],["17667139955208121549","13375634524172153391","1099393497771826262","15439742422203356159"],["4467286118883215984","13163610291647680348","15898120539927656939","4803412614562670830"],["5751242435368882277","17056766575002104354","6524192093570423368","17747913547515782716"],["10121378715799989046","10975301327088107239","16365238800875388593","4763067900733822605"],["13951417343899280872","5286994185538154583","3829769246179625929","4433871467826975734"],["11679626028682161570","2451445210011970001","15581430564544027991","17370053103197799687"],["11224382084197137277","3117342821596261844","7151358997101978491","16168486204573990319"],["13353697782334840520","6007424676903487993","10434233176239545644","4369163016975394807"],["2880324650290290265","13999319808762610046","3411756831716427486","17061663490669407609"],["2425274213770720311","12770482547548521185","14364886785465224781","3426616845361208585"],["2401950604907657224","7861180221959971251","4763520148589021854","16906499967233534327"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["18405939616034120199","2990304311131512731","296736073235357712","12921043568448926140"],["7396476424000604579","8207133243573447679","10349085000569028865","3407151971805305773"],["8699648117060453137","5207599393948126913","9644455022650163033","5026775666361047000"],["17981705451583028444","13221404809158892115","17377646493538801190","12832047699162886333"],["9025971589676838095","2855597223442571987","4309254082514597381","346731650489046497"],["5805201288699458382","12246907649039699677","9358040948450106075","9895936051588457748"],["17989396093996675368","8425816177623639793","12007104268818975210","16292462328867936737"],["15817184564376056780","4112321683322766609","12158897507524959761","5130256086478766683"],["12971353439897824838","14480199635582207870","10158521278053162486","16597837702620707495"],["4818032997252658177","8629720536146292951","9082122120409481928","7545791619590223362"],["963130690550099069","18054969767184089854","16858194708403003562","9372817163395414769"],["17760264187942172075","11880237903307596831","93421893112558476","1009369794626009976"],["16355574612971700780","4232274989676186121","17772325619821967347","10984826355516853716"],["2678086617410228132","6472941203454722806","17947785773642228159","7337404378368695745"],["13786778850887182677","15523620225281516804","9752438213240802248","17747606136334486506"],["7922181173767372079","9655837121143151694","3150956665908353232","8064289650256221116"],["12167543278611310126","915942281310601775","1473679395886809705","17092211033656826898"],["6162330360342985052","8378541946499981945","4061547640024123855","5187170816140781599"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["9256346094617139722","2753442860005530705","1424973124311121873","13396410471066053679"],["3021230393941789352","13305726180371377815","2389425943410172018","6058836224861064993"],["6953180160302928208","14224446184320674258","1280115237813535792","17773932630695091594"],["11578796343417341770","13218795252812539103","12606360778095030463","5045087949420184625"],["7823590968707713269","940528035136230048","6469530870103244812","15972508135744880276"],["288804007059440412","7923306588380868900","3256933016452828480","4704559588406999388"],["15316603968371675029","8732675423130576715","9359546056385512306","213595603820867638"],["10406763830099491358","9115407293953257120","10063912070033687891","10114442263645453902"],["10391458823819855098","10344127035453039653","13522047488338711697","4257076985515116719"],["1078150041164648349","1072142319177985067","6066362600083403998","3076842086880941381"],["17976356225550189443","12235604076469891106","15634138367762014304","6413176208555228756"],["13391520584822387103","2454058866065004284","15297937324196109449","10162838205158861873"],["5929457538724265917","14010406749595734044","10484961236900200584","5455296040108255398"],["875254344342279919","5626580270897020873","15346796795546312239","16146805320138649219"],["15799648980323453410","2704699080778740119","13973276222016767847","6199679694317869749"],["10043577403695440375","16254924238005253264","16279392197103382379","1666316517827247700"],["3151448205336896235","6398701395070248259","3588230562613736349","1983091422520405446"],["17314173845656511468","13269962559704133052","1563518481019692234","14323835779139036250"],["12991690495139961638","2074287337477283576","2456956125630413361","9459670993420739322"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["14958055144557272882","7254153882385929657","12590831702927633070","15057928035775118882"],["12995914453765799804","2984471590126915224","10380137814879008124","1843344495879954810"],["7657637432799986253","12645822475764202143","2379234243880284163","6108695846573439053"],["12905809733604418063","6044861775633646211","15297855783252994714","12390597353308587217"],["8744388933289222025","15047156468086592050","5600963189715617245","672898245531311466"],["3908836066825765987","6179075925052114701","4101832407261294176","4906736373792742450"],["11765727967090606460","14194280066876837074","9187107413816912248","10032600905719411908"],["9158883274400875889","3956645397853414689","9092407452417832481","3086933990732408948"],["2611310094133183797","7217127078185143839","18415841358303709713","17497785700160199066"],["16281003853480797574","7057810995871725759","1794823134783982812","10511962408506530128"],["3905117815961108227","5050908868631139440","8348665458906742259","17704271311927796232"],["10850526557002881197","3923964214726016896","5010289756588979408","2949174482826947171"],["1799727370030330027","4066978513907815602","18366580455937915192","5404329626018041906"],["14689117911358011941","4055235355787516163","1270845768259763453","18288958409230296535"],["10137971023445758414","11789443677035170744","12075452135912209865","2730410834174194209"],["13015057663619210440","9062073650971123865","6028712964826148869","17236132219275504268"],["17277788250072602133","10384231349916978196","15773954522206816129","4607979286954212040"],["6162330360342985052","8378541946499981945","4061547640024123855","5187170816140781599"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["11682941605957529968","15280623265434512189","7586840418919901331","9857189274947507212"],["17803762147112371684","8602395696701173228","11669354513781024208","6921721008019642828"],["3145556443409601101","522789134774506346","4001705373535826306","4241825886755015463"],["10093489403740307415","3772586938986764924","4851549147060478652","12003318480309263735"],["7919650734520686833","4203077757635770920","4310477277649263693","14807571794549316024"],["7773144357864876244","10602311550276301549","16838492857823643406","14151775114177086784"],["12692760897829079082","13591084054228323653","4402571503196903689","15607566047454109178"],["9193871450333402","2631337437938841685","8964936621873715788","2576339472811138794"],["5503317404139632084","6523858833169667969","15702826402276490840","10996371689047119927"],["10487832483500373994","988106731152675046","280133262157965225","7172115631015858048"],["3908960015153414890","5569288565140039811","15142452908845155874","12530132886269916800"],["14360614740086014419","7358220572032918591","1289490234133448737","16133422580966407125"],["14786141973650061575","8639860718868155369","6863817203968194823","5522776430070527785"],["12525744400709249835","13113426886493921610","15296063024458781370","15492475972187323149"],["2592757921740130445","5651883875726423121","14546538317201008896","7477285519255954515"],["15687829735959729311","6516556851341192221","11441211989218421067","14429126124654215333"],["730719862925220513","15384082578704070271","13926634430300722446","16058045299611073844"],["14003381425710184331","13638309150148055511","9663019428035781719","12722113239150579928"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["1186135069628359114","79983422560396735","5393345786066616980","3062067154550633843"],["11754653189474621902","4848746476546820760","6278611363788514742","3573832173617859185"],["15829527326034936898","9002152106008806966","7679217754315725118","9859124097717742689"],["17822745231119318228","1714569577943284481","9198038368046538960","14903880180963675375"],["3495705516872745640","4172796024326831451","1673619113646096762","10037650263765851230"],["5208883251740266894","6273428518457227917","9751686071584457281","18366912851291076022"],["14422766790149917278","13627554793569697849","2261696267876460794","6366436097871623355"],["13484566333599083348","7827053468961561714","11363914720637237506","3620858830940718174"],["30834747950694145","8732246652588657614","14389556672053167896","6723605171341699712"],["13767113996124730824","1750836358159874724","4920931774831525040","4397760299349122831"],["17498944303742945880","6189571790685954509","7733770701544212979","17264592971215520498"],["2494641387906531323","334458633729042241","3804165409685387062","1284601236509377230"],["7042636019288721769","827609333939294876","15425490291866710974","17844469338738358830"],["2111711267840294792","5477342564312527984","10075938217648288124","18206131987822942829"],["18422386698480229008","4641238750311161325","4201721604738624756","13709304211483990555"],["16648891189303204628","2645219231804626322","12736856414083959735","1489838265398004165"],["5210848005197040569","14733774541674927026","2572144881996523486","7624557391727033745"],["14901731779507881564","10574711314538625848","10442462692328694870","1217431753485994640"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["270593081985956569","8407676876721948275","6210822257665653452","4747216234678325144"],["13776255926754384871","16099575277606722701","7495718433598020117","8842848643092209097"],["7375661170676556186","13697217083460234644","3625742386705422662","1167764362250934013"],["7529299242984993788","16851944368616993905","17458990610422577569","8854204422285177159"],["8438959700865926977","14314470145002401215","10789964841856874599","13428823872715547003"],["16753844192783017111","12650201282557464084","14367450224674924194","18383599562293640919"],["7080349907506057596","756187037778309268","10039725720518126052","9200318244140448635"],["17869555230718434096","1698460283477317169","15925583673868734588","8174733715377276962"],["1978924834928473157","16582649729242868510","7041824693575397353","12334638153460188486"],["8269347209228426971","12299532354979219434","7768384416922103433","12315749236673055825"],["4007718663404616474","15188870252376002119","4816402453190122305","7797419912339545129"],["14938953726783177830","18061219503774756569","15907074893889748318","6697722208591049617"],["6344347761047691879","12558873245390562663","5985864519477298915","3550521883984182910"],["11357468849707490750","6601779213249940084","7677981451701179739","4751756616106392220"],["581858070990404187","16634153904284314000","8421560616811710777","17316562736597279444"],["10043577403695440375","16254924238005253264","16279392197103382379","1666316517827247700"],["3151448205336896235","6398701395070248259","3588230562613736349","1983091422520405446"],["17314173845656511468","13269962559704133052","1563518481019692234","14323835779139036250"],["12991690495139961638","2074287337477283576","2456956125630413361","9459670993420739322"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["17885747674412275629","8488702654525203268","13619103662577364100","11220225064744256166"],["16683728581471514894","15892618612846038492","15899898025927795469","5395584966266185237"],["14895028012247126073","16074254236507428056","11300006700331667739","3213342018724416731"],["4499664259202329249","2701202920782287280","14904146342932331691","12971718042376883611"],["13564268903715073175","2391272860823029179","10011243429355882731","17989315338617342444"],["12906788991558097325","13227655267944428850","13164075983343743245","1663871992385403531"],["6520051716294392267","17219894916585596564","8515150980077558752","8911809781166745661"],["17843754666519953602","14287899011036624292","15366533540063053239","3495382348396494929"],["14457065193670495210","11262278736247329648","3013473050644173387","12587939049260168557"],["12920543331330843760","12520720059959016665","7208650007656994549","16998470969186019005"],["15032668566723827756","12713604648746408054","8072352795079531662","17711469983281583341"],["1918308817991326563","17916419849757678592","5876773053978817577","7053374762866354227"],["9027310105208414514","17649453388070790223","1649933283347131039","2626856155316417484"],["14542698285075473740","10933508530245170720","13917866314255388805","2198641671764336654"],["16526358592981813643","11833589679322174361","13056423306379226034","9315464889653224232"],["9326302263730018108","16004691363673734872","5887032294674778058","15501500111450739611"],["17277788250072602133","10384231349916978196","15773954522206816129","4607979286954212040"],["6162330360342985052","8378541946499981945","4061547640024123855","5187170816140781599"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["6076114759478512563","5024261451490231201","8826385441036443068","1200413106537896253"],["835378583313126495","3536436234111462049","18348080232159660183","12324287702534165180"],["7885871019757448229","17150838380754899961","6900438090938046237","104699980389594445"],["15874476687009755537","7073652307339760576","15839923746443822076","4733104750729866420"],["17174554258794627390","5505463848061461426","11404581971983232891","15341757820665370035"],["3733847868443840326","1039535215825964760","14939208026792896363","258525434605070831"],["7571569329668188173","14863570490590994450","14356981768836499666","9271835830953613488"],["13500540689361490408","8529813291832811053","4117955414060716002","7080836715842704383"],["11178470664338532850","14459694975722368154","1728928890000501225","10776231057781655935"],["4342312451671194879","8224602453321864514","2040079989246267262","3389284138892177568"],["3157788307795955382","16409426262397794380","3828835931030673327","16494025539296187402"],["2756783873758125225","9536297453427286305","9762143065185330214","13879164355645294751"],["5351863367275954680","15000729602782048194","7885645384936599136","15589772005322926677"],["17786635620728443624","18192824764169454808","12398808129763282110","14295414406719226063"],["12219908092743987954","4279731547893057540","9200220035479152586","12909790291144614684"],["11961238792131728002","18366542927028908006","7942583536964066388","13709503985989244291"],["17566013197748551026","12521760151630345767","10377994413768657575","5727361561330498592"],["5820530779722018559","6304184412942328405","5167181935745190447","10582222560072022039"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["13664007500396945697","9890848598436149266","11079976933741513691","17363675036640961554"],["11197289570910445383","4651500390755386499","2126466205281538265","12276892975029862367"],["10896963960716570825","5512981150448617225","8922235693963620513","4194409698150102926"],["5610891793572223831","7439016532171390819","16532096468975523934","3083615127480312869"],["870641123090497255","14984634497415370437","11851472135864170449","8513329966524952385"],["18357376090894930841","10691531512853023034","11985672582573766456","9274002033882280722"],["1394286281990375216","17042599420092712969","10228613981674178597","885434008689431690"],["13464276426263391992","5631549985399574135","7400107568439638940","16081655632787454401"],["6849182783550733570","11217506427551593034","5022244731124546813","18025225748450669457"],["17789821268835705405","12470635856312459118","4378752327114949466","12520293626500773839"],["17989765323880710009","5401232860200165707","9583132520276227517","4770656543598071160"],["6373412927604927731","3526984370503069914","16783810342474392349","13860722006120540929"],["6180160306616813757","11611752436774596470","2039091383202350325","16339367667384911626"],["5076243270880229252","7146581705227747883","18020055621873005447","15762029957181817604"],["4575547852954849009","11566690515511094895","1925578226649022469","4313617719407074685"],["12168901809481681499","7420800314146159848","1713114377214073123","17298322282438408237"],["1974315078251098331","14114736169462942725","11406562281532933013","17502896452745901103"],["11576565975786037173","12870100872917598638","17576693105436804751","13228573966506796684"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["11540032466870942389","17438024509172095940","2010302114382377063","5413033646695116265"],["4571843952385994736","13261522375578077265","7176178102336876006","5774881475452795235"],["12664449707222679132","18161179810213811840","11050101919704118754","5789168670660222656"],["16347685957949836098","360271559428967301","1247121635286451414","1793078170620846509"],["163942219502528184","3847669801225167915","11700255296370782226","16829859312151255164"],["5309295432327126011","15576986660715485759","14500070495584020185","11962587878079227751"],["8485652161512511368","9380619674727744976","2861498934907522258","4729384831491466824"],["16000793044900215307","18320389106905005550","8134429137578389564","6386012407115496176"],["8155473589512165604","12969539838394441204","17902840983170831491","11378483613067552666"],["5047892352664499318","12517155967012117927","14182063270749857379","8613085152557183275"],["6358873583342619210","4630959493365205582","15363740645153973784","12025907490987177175"],["11701619812699847937","1591835224697970959","6435016591237713700","16874564955310610023"],["3459839775658485956","4256605889912100977","10877301859926799291","5341323859096563987"],["10048217929012928786","12918713079087885586","10254700313703403959","7633548903431082982"],["55905371950599441","12901637996627097778","650714400431940968","7760993189634210950"],["7207161804603510522","353348082438291566","14650017216153300518","3884111352777343710"],["12167543278611310126","915942281310601775","1473679395886809705","17092211033656826898"],["6162330360342985052","8378541946499981945","4061547640024123855","5187170816140781599"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["18439737447388103233","5066160338539186911","2077988144100993281","7390604799423542443"],["6963202349498518766","11319020228080866289","2526779255735325802","2965612772412988348"],["1160325360465570172","14112173658408068809","1507701979167454193","3555048041379272196"],["14065709903030995159","3801121127777164968","10258763497687711397","6612938506779582826"],["12658738845955066390","15089811550490570208","8720262452170986727","16778775442809437052"],["12027700946015883522","5418744468936830548","15447949271966484843","14022083745118292428"],["6795416187415021881","13100419108275923693","16619719825858936228","13801841963007412554"],["12861231967655308781","1510463707367496430","11897622225367674507","4968974208623736247"],["5775198186787500139","12570800045935562646","12900121364650346692","18247470625971760541"],["18057640747383343427","14985177756048995966","16781934822554657963","3680170534751990148"],["2437549291622612309","17177702607493958356","15925517004560937637","1246231136964012962"],["9940506517850533482","2948690769841460487","11399996703045275987","11440057769050493783"],["4442388201416177931","16197868095700771819","11345268520008202165","6102675446188145094"],["12362859677038624873","10795316931166966018","9128497566080679296","8750932216200502035"],["2316905186922853885","16781502395187261519","18345466152711821420","16638892882865176477"],["15687829735959729311","6516556851341192221","11441211989218421067","14429126124654215333"],["730719862925220513","15384082578704070271","13926634430300722446","16058045299611073844"],["14003381425710184331","13638309150148055511","9663019428035781719","12722113239150579928"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["2598787575100315778","15946922602832297291","5145716750428086909","5112807497386558578"],["9618821897523234123","3271243050300873402","16901552320307469791","2975255698235260199"],["11511691315104682615","403438693338660828","10284878875606093554","16078140347886817018"],["2671018311058100556","4650753033538336568","3162150658767339440","14469735326742151928"],["13630395066335600141","11585422526385931105","1676289121257436106","18050658882336584866"],["4044184053729087101","2487825282136037765","6678137906484681755","17051964174539132167"],["16910409841598880419","3117241397322463748","1272702441477878611","5028924830051507195"],["2757084028606526684","7576473733326515161","5827671578241766540","8622134375052248536"],["3380091908378947151","4099447453929852494","14207651427879085141","18181251503787128989"],["5680358479386920998","9640059116242075944","15332423650770126304","5595101992919679886"],["8684090829135950950","10353828614251351762","10915418769416716672","14835001116383176811"],["995286640007899038","5024306432929742915","7967021128786491803","7525726947335720751"],["8326179247673411580","17244506070218430785","11695380657817019325","1851494126953640945"],["11176078266128258332","14253734958668171417","3834079325426668495","5072883323514459465"],["529302257692046996","367683597746962417","10208695113235880919","13868482461030692156"],["6495714102569215908","7141579274275146717","7975414449766858562","1771909155100612486"],["968130525463116068","14995395785321110365","6719283690607124553","10362187013929889064"],["5820530779722018559","6304184412942328405","5167181935745190447","10582222560072022039"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["4937020937121126906","7003160348357572936","10454802494768910973","8740029685124299520"],["12780790670335860735","5936222613486667191","2617209227273649227","9405160400549991459"],["1802970247456527802","10837633729029540698","1841717319722542333","8530937692097672449"],["18151340605215960509","8810166253483377201","5444359666051131173","15248364042698124590"],["14841913770067937408","11309758834350804076","9949190050796022679","6442052889646559895"],["15620494869447217887","4825360457360025723","2707226698220063863","6739819223018019107"],["15224463681686373781","10008592080492446106","106371972117753515","48682282038670013"],["15318778457495824097","16235920159423296565","5515770569589742331","6773453397757166222"],["14353061680291410983","15583955477643000610","13688811667059792768","16847157526240451933"],["4135097713426990380","9566863239541643157","4035713692978856489","9866639581191723144"],["11763167580901407399","13258036930727747896","8803140816375733860","17835332028996410899"],["13318860478493518861","5184861333847180200","3124359766885963129","1103408439583032998"],["10701818193311469336","14044150846325879126","14435639557826732951","16858631939577024847"],["13634955308921738237","18285452911814623629","6655761583866135906","14446135733611228773"],["16629496603473668213","5489151330629036682","14343090652133643364","1950150132859157649"],["7546877407994671646","9305207259412965143","2970679382453485639","113781106709191953"],["8963285688426163406","17618602155792907960","4717120524796942906","8848889850158922648"],["17314173845656511468","13269962559704133052","1563518481019692234","14323835779139036250"],["12991690495139961638","2074287337477283576","2456956125630413361","9459670993420739322"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["11208547815363707065","11474510503310940874","4758817243467790077","18207922824812218882"],["2753795069066920864","13768978521022817249","15274661441052609657","12996760886490771474"],["6309243827507972554","9799841090350916726","13577022787733523201","472377625302397174"],["746409090285547676","16828393488798489723","8676149406259663442","9826924124893448433"],["16541297938233741986","1046087537395199557","9308219651892808525","16040560505749756216"],["1493398723787339298","14617723430763219348","18319134748011080356","3400073822913709268"],["9270569371551140626","12495053526589928114","8294357712497846232","10504738082551843376"],["16951444341648246381","12752286790937368501","6984927432473604338","13821208899775839923"],["17604494922469952342","14242548968612938055","6841248228548890239","4197566297238447216"],["4130751855496614928","13597810278653924273","18026429545292648150","2038963450449535540"],["17505296494792124939","13917798862875494806","2972515477913818357","10582240819363642462"],["5961519131318005955","6832828451523683964","10108653235581892624","12245640081920178546"],["8120653653178524408","16536200873696686984","12160002452184890677","16729810651091217142"],["1062819008453806770","14365812684943247233","9078171538684604058","12744160617378229968"],["11298639462517399171","7147344782215341987","14306564037182565477","5142966631723742704"],["14384319261732485826","13925451964619155811","6592168583512773544","16963348669966103457"],["4365919849128401627","11593838978834310906","16252805098250220040","9390992772565522943"],["3494947538190611982","1347831767090636865","11866844666890121809","5714248105476918829"],["12991690495139961638","2074287337477283576","2456956125630413361","9459670993420739322"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["15228187892508230384","8774472858455631277","7743655184713360792","3228840362594061082"],["30898442067788379","3649211374957990064","1502512694285228164","2384043341932483087"],["16304540402221196936","1974377429014536705","16186070841206608068","41023437338627425"],["887324418690191023","524448963806975385","11541506268506389394","13232784018380394846"],["1239656853030141287","10618149376272454960","7943423529040403399","6811988623894432452"],["12501271847708420330","11533469781050541940","1235143831567576934","1051762268038824316"],["2471741220232890047","2436770353443854057","1951195568265064836","15805703460655564018"],["3332554907056915455","12175993118057674697","1703969749169905060","17406605039947573293"],["4970799359297491147","17401891254930285959","17160622542121453864","5540542313571678453"],["15850444243717374328","5570071899319116277","1466635824600709003","11967691327181993071"],["8033890090676086534","6976284027776594622","4312305332981346237","5441957116245622201"],["23090441702052415","5505233217693597564","27967806668504865","4219946663853201693"],["8690305374209161200","11057600071420669388","15411529615401564897","10663013990900501118"],["7201835094763063054","16753763517193169789","7421883478797214197","7379058028888611248"],["12331008977591923059","2254859590467494800","17777369591273200808","11392226664116292043"],["6746811697986069113","5642476614661783908","9610563617486837536","13341706891505759704"],["3151448205336896235","6398701395070248259","3588230562613736349","1983091422520405446"],["17314173845656511468","13269962559704133052","1563518481019692234","14323835779139036250"],["12991690495139961638","2074287337477283576","2456956125630413361","9459670993420739322"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["4998589048680254840","14288609126951368214","12602780845315067924","8279516291809919380"],["9557877524492236509","16749062105543981838","6748286224405095432","6449131672639138179"],["10640019120112314055","10234445613527359143","17653666565537304612","4580664348306375312"],["6520272376201036381","15385350380434133791","6732488976112111721","5283959440624668235"],["16289927421928891479","9250724843226869034","7085941867517821791","3226359794825437219"],["13707104122679521280","882843692061819003","13872764687940523028","3095861550619496313"],["14727672615842464742","2141964895332592009","11704925070905689138","11586181730325101537"],["18168665698440603583","10128022091282558751","1944062276423963519","9760820133627938965"],["7032600374409323582","4905210361674873814","12404860357082973808","9492534467603092078"],["6538124232898333030","16183598056997650563","16795915744985164662","16485669525690424745"],["17538999810928798513","6077820345526780236","6112240667711645075","8982330882441322368"],["11310461888907489729","6667535340039446879","15808833633014405636","15123057896425836145"],["5310944427509693586","14247781395218243045","1036660131300425438","18377802543229187400"],["13254221701238571379","396434766215631563","8702919846606263730","10500135268629167002"],["5387051913493441707","11671874480491586911","2198267278227645854","5514912271754938329"],["11893367203027085792","225841217534124645","14571549358992729543","10161836992696645712"],["10190834754536038006","873407096979937838","411029414440855047","9358840834059081278"],["2401950604907657224","7861180221959971251","4763520148589021854","16906499967233534327"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["9473511729902016218","1882614903537407995","17165684303608184892","13351043786484412767"],["12676434134319648429","7865088112480526391","15631674723846597329","17018846271673895479"],["1496094960576316456","6472439966167972986","8439723400653790680","5943610612111989365"],["8309001344458844260","2463068714789656510","6777622283221756546","8800775662622823995"],["18156015893729772455","2787646055436255234","17918586608646209334","1971654126132040222"],["2850896124851890994","3155620742483316515","16804297795242640693","4512560311887691412"],["11084353332627726192","2921451383910652866","7105955005537137236","11797136138054631615"],["14649213356030831928","7311158096207681585","3226295899209336795","3605298611871014371"],["13008182367070641469","16423446005318795310","9289087713310015846","14885320413389552148"],["11047931604036084602","8524148256699063450","3412664958195930587","6345935896901851460"],["15785169635743215130","1980859872136648631","15611692250682793258","1456677218570439854"],["1943722442055311280","5701948830987977980","18336413845571491939","3741708797353048330"],["10701818193311469336","14044150846325879126","14435639557826732951","16858631939577024847"],["13634955308921738237","18285452911814623629","6655761583866135906","14446135733611228773"],["16629496603473668213","5489151330629036682","14343090652133643364","1950150132859157649"],["7546877407994671646","9305207259412965143","2970679382453485639","113781106709191953"],["8963285688426163406","17618602155792907960","4717120524796942906","8848889850158922648"],["17314173845656511468","13269962559704133052","1563518481019692234","14323835779139036250"],["12991690495139961638","2074287337477283576","2456956125630413361","9459670993420739322"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["9844495709864690999","12470852562305330346","866813864053270540","9960170233838428173"],["12677946909128130401","8216644736857405426","4548977880915996057","3825842955705315661"],["6929599944206342610","2845158358300941498","3375626375586005641","3535325017969491474"],["16815261813453560263","2019666783052100043","16780972836119779774","14096319775928084638"],["15954189292217796824","18240146510572163787","3405461123365207590","2921347643400675356"],["9838138854444013500","14183843233469134661","18160396985485675596","13688030047841180758"],["2748708955234150012","5649233940254257082","4467485171560613373","6201276093954476857"],["7926303506263266712","10945291468242143650","11148808771887885748","4390128522873568555"],["708960914477244860","7384667612547670514","10784632866854229595","12135210099803391015"],["13885905788456395652","7527744234646377783","17105729086627232669","6450122345126382214"],["16654726534330115074","16493977557093269682","6363144533446549045","17208312021317243707"],["8871313314548428705","9585190909860291244","10546406176090860588","15730585448404836038"],["733680750849792388","10521227127943762963","8782777201806122272","9101142754218869410"],["1220155352680725008","8921884683720843888","775608471691681909","10875965450511369611"],["5082211021956375481","10992092915423902935","5133286265785953103","11124538297519717987"],["16648891189303204628","2645219231804626322","12736856414083959735","1489838265398004165"],["5210848005197040569","14733774541674927026","2572144881996523486","7624557391727033745"],["14901731779507881564","10574711314538625848","10442462692328694870","1217431753485994640"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["12079935692431560218","6881686032730222818","6112385024930089286","10346290790050610192"],["6990549753381136044","12430902864816868228","12565294212318925101","619584527735050346"],["17058425344096239970","273506327891994629","5653988267828075117","1339873453813620875"],["16067604701841273918","16673566240669381896","8531769286802322443","13177310166730280271"],["17764344307138771483","17923536941257206714","15739103191127842773","15302667768684929162"],["4590332552605100474","17641466745914106616","6719553002494163630","7413559296238493185"],["10533301669700439477","12451859791697166065","12366449359139109170","14186835364378978954"],["4879921760819215236","15328770402671567944","15164878613879015142","7904643704605431549"],["16067756838841122542","11355202148280631372","4686467488617820159","8243299402085997443"],["11372004635663685843","16254834523105644724","4732815249961424070","6259719723286547865"],["16899186677300915936","15681609553256450030","8062676787381482498","2995401713804338489"],["6816111041074667515","8811781650320026495","11159234008771150991","17202358537595453632"],["8326179247673411580","17244506070218430785","11695380657817019325","1851494126953640945"],["11176078266128258332","14253734958668171417","3834079325426668495","5072883323514459465"],["529302257692046996","367683597746962417","10208695113235880919","13868482461030692156"],["6495714102569215908","7141579274275146717","7975414449766858562","1771909155100612486"],["968130525463116068","14995395785321110365","6719283690607124553","10362187013929889064"],["5820530779722018559","6304184412942328405","5167181935745190447","10582222560072022039"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["4740865546569022011","12920243960739971686","1490770481977494976","6691958499536750120"],["503974109491278677","16576601366875771708","2268514456776678927","786470821077214225"],["1257324455841602725","3727099188388818586","3068153394896333565","18215765757565543620"],["16871989512302876426","12623024961428234368","17792825498044486185","10873887357683417463"],["15551550887836646950","11916086938325082407","2605104639927197400","10194395307767515184"],["6627410505948849981","12369392969458124244","12610219755312561097","9704476513470596578"],["5083986492936847358","7314208682010565300","9666419435294742320","6520540733221576048"],["14848952885832960359","8743070269394458835","7821757384023559323","8246089377618709562"],["2178299101732784165","12262796834596118217","13433012372591571425","9308355456935889935"],["14072536718162591124","13702443602254209406","505925100939264022","5624691569714922353"],["963130690550099069","18054969767184089854","16858194708403003562","9372817163395414769"],["17760264187942172075","11880237903307596831","93421893112558476","1009369794626009976"],["16355574612971700780","4232274989676186121","17772325619821967347","10984826355516853716"],["2678086617410228132","6472941203454722806","17947785773642228159","7337404378368695745"],["13786778850887182677","15523620225281516804","9752438213240802248","17747606136334486506"],["7922181173767372079","9655837121143151694","3150956665908353232","8064289650256221116"],["12167543278611310126","915942281310601775","1473679395886809705","17092211033656826898"],["6162330360342985052","8378541946499981945","4061547640024123855","5187170816140781599"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["3350485253112342347","6365745014950662204","13394260492715235261","5940176265351267972"],["10288918213581238502","13726244445757723558","12533211301353988477","2103146453181958917"],["18010541558960587871","15635617993383022667","132516602119330551","15299003525918247942"],["12093212548115785644","2631814769327387434","8908003891592215211","11948847101580948648"],["5925037740894400443","16257142004696891655","14938440851984034643","498653934073377532"],["7732342149750160966","2691701280590615812","13363163025475050245","14206742251518519951"],["462694052733783014","8820265368698752609","1555209114171979128","15112525689261370848"],["143552341779391146","15278697749964837490","4627489805871050082","8304486169214214225"],["17655068183955342478","13610417312929051892","13849601163533237510","1555515705761802605"],["8004900020531172289","1668430309584906905","16624539262425702897","3790815435294918219"],["9817973694055912616","15686892981517227188","11940294931533894564","12078164367477256671"],["4250959407848568719","9995576095909560611","18265725858711934310","4273517689700105467"],["9033667917416949618","15860109367255851187","8724770781907514305","18390853120238178799"],["95483791775268458","72705949989891654","6954937253673231900","12767434449102477658"],["13353697782334840520","6007424676903487993","10434233176239545644","4369163016975394807"],["2880324650290290265","13999319808762610046","3411756831716427486","17061663490669407609"],["2425274213770720311","12770482547548521185","14364886785465224781","3426616845361208585"],["2401950604907657224","7861180221959971251","4763520148589021854","16906499967233534327"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["17625656080350559358","6625098408377471397","12819443731443190924","3760701465855402674"],["4648996133088635458","13012897892235157297","13502364510180820838","17082386805578784876"],["5116225477127069116","3621568423706840138","2757633801748048705","9124117080379401341"],["1142795992780287161","2346339055185826960","11613666944150606392","3523864603894060449"],["10179563651886833661","16105063128028572809","1005194366244593065","15894486051604658962"],["12196976370997531075","15156616718393876406","13325367877199228080","13558330381425232222"],["9799222797666426623","289131898275521559","17126512538586869590","4152524591264002296"],["2111693236767594477","6716713584361822648","14810884516762584181","17066957485349855684"],["13010284648864219713","18135703397187761340","11550684448389098815","16806830158051940850"],["5704485933009831950","14223634785452822829","3390672842951739104","11377315741691942557"],["13996354168622686286","2024374164603959121","14660682781872603187","4931704019246303210"],["1822377475773009073","3560839580706842916","5625976821228135704","17958140410995380258"],["2909682383765765958","4689024363105114646","174516334581448191","11934159020041015350"],["9107205430167397125","14620462692863090223","2585157112636164911","5203809182431359086"],["7775349839337878550","18325575486072043136","9472876614026869210","284981177592395143"],["4385528776411292284","13717787645759370262","1752810056449876238","16991941778033837080"],["5828369447015044605","12549726102973668335","13842838146549419188","15725713906570968817"],["14003381425710184331","13638309150148055511","9663019428035781719","12722113239150579928"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["18019478791296973203","9097493816126738254","5928671943425061594","6759756443870361394"],["99279628598001705","7682489061291723613","12607059888606532542","13086392868594331222"],["3170219620370646521","13140496084146596928","12336387225828638583","14320347440977715950"],["7551152300011567008","7268956118723218096","9715356419456598991","11343029959102588015"],["1244774244132511870","1113305077282887927","6087095321514605659","785373025981378147"],["17069319373084945068","349865897381838696","1220421125068516211","3083213271952733750"],["4994702655894693492","5301093421262586893","16198769677174621042","5414636529205153560"],["7909009577989058645","9502886021843143063","953822209968957177","10624637925022479514"],["14022512814360566462","18126698163142833016","7130604750388598145","8586025508086844354"],["12926624075555794960","4496850559164236349","13806907291672106262","3900254999425138826"],["10852534631078431183","13384044107584894665","11787155443690834635","9626062924001878323"],["12759461542407581213","3847253021770163640","7320428808061885703","735451436407803927"],["13814123119567688126","10751904678188415923","12349271843808662370","2649203640005291990"],["11140601413481329128","983348055293436002","18020164842310514288","444800020811624405"],["17555446551501331261","13847402598401104059","15037467724046706566","16269965004944880503"],["16985486996660308953","12122126447155769859","11367889912211289095","5901050698582489358"],["12488394706465240089","15834690712181612047","3590416837360683432","1410227018642831920"],["14901731779507881564","10574711314538625848","10442462692328694870","1217431753485994640"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["9252945458035902185","5236618676327011402","5629683364568137220","9258753624087519174"],["15710153186330960738","4951177075639313127","10375045584933810593","16643169507111980312"],["2487259007312066509","7844573032335356238","10030049063543787309","1984675464663870140"],["3099492546938169800","8630507433879104574","8659138673190699548","13344962633751344663"],["1760220316775277072","18277531616976894751","5235008849217019594","14340977514485608531"],["8278896624830811220","6126647272428063863","12835776107086086277","14580441944668101319"],["12579978008243565265","9095461873332511539","1106230282207448895","9859118546600442812"],["14389392355949208427","4629355264950011472","6670363920049058626","18418856168672530367"],["13548700229021392570","17788581907250367926","2377224096746836952","14632173739190868551"],["8468892975769035222","15917342347841437306","11644032668715543483","4061459016165709771"],["4480514386620479789","7834787782658011109","2542014049870745222","14349548403157694797"],["16920856786388780134","4628006793851884771","12023969920099408171","6627093260229855809"],["1799727370030330027","4066978513907815602","18366580455937915192","5404329626018041906"],["14689117911358011941","4055235355787516163","1270845768259763453","18288958409230296535"],["10137971023445758414","11789443677035170744","12075452135912209865","2730410834174194209"],["13015057663619210440","9062073650971123865","6028712964826148869","17236132219275504268"],["17277788250072602133","10384231349916978196","15773954522206816129","4607979286954212040"],["6162330360342985052","8378541946499981945","4061547640024123855","5187170816140781599"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["16979046381770922240","11080305478839205312","7568931262912464906","13618261826711188931"],["7675888257662059928","12468800868983272171","17008126582305317019","6678508344494484310"],["3171947979634300272","9197703867292449749","16890229252631845702","1036783741776349017"],["14071448138717450653","13407304031556158787","17015552246638778242","10885822973274889035"],["16282569702361744384","773214538587929464","12050159205702748665","6385835485500858514"],["17865524943638299517","17899805054419058450","11109445653107676448","17719092998293574765"],["14535814910197696530","17476868194014620665","15057116793840380784","3738324675208936368"],["17558744252132570637","12162913200056349087","7900903505643489876","9199297334390028268"],["14258524812846919878","16812840483454133260","8607956662655890023","2868048154852099840"],["9741665171648494703","5447322658809940364","11947277211546883364","18179785042908073861"],["7662971498293210282","15624050404551764074","6843634860137879206","5696380280874265565"],["9780783671089037713","8427274491870461035","5017056333908391260","3105584886854980313"],["9264144162745360499","10495470625039535878","2940879464231730130","5222091031360729654"],["8608720754847020942","1081684131382346440","14705795344480965294","4490099356999300960"],["5395450770641659140","7303613332211706826","759469592753723852","7473694388665038485"],["9326302263730018108","16004691363673734872","5887032294674778058","15501500111450739611"],["17277788250072602133","10384231349916978196","15773954522206816129","4607979286954212040"],["6162330360342985052","8378541946499981945","4061547640024123855","5187170816140781599"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["13680675929387163923","6945270833224408748","18112404452650658456","1971959668850102021"],["382665771221815101","14074822666317212856","14968372247165758971","6398279178410628501"],["5340035610567436755","6681880148779248185","9548674119441640728","732627145869974935"],["4567928816911541806","9888205031996095351","7565788452596362371","441468054430765362"],["3367354362453119326","14447358583783770713","17590214551905281432","1573026086725728882"],["18230124488800511059","3062486397462202320","12966744068387560179","10321674729755452444"],["13560552369138904651","6603274145703350149","8983856000493276646","15971490538159927772"],["7403601441498513952","3726821863077962279","3159804389384381731","14671212279083198778"],["13737134799846639051","2260590294295595213","5726587389845090093","13901518190763901730"],["15760455997641186038","1944073144040000397","151679256245751602","11270152599412366127"],["14192802715672215220","18438069743624377832","11179207996480987068","1958381333491438868"],["3564168680005172511","1565809703372646094","15673207193705159468","10358190024414278365"],["6527018953695477804","14540188417359288901","11992343773565608484","10411538377872044155"],["15365211569144560596","8020415671666556917","9369749406685913041","5006517267245246918"],["18176902128312403571","3661695526374641308","11633806772290739010","9370370625500345925"],["14094201640751473190","11321343262767754521","9003077178502136192","16502180117732803960"],["9277477259301278568","14449705143725600296","1898453710911756444","3100501532992462474"],["3494947538190611982","1347831767090636865","11866844666890121809","5714248105476918829"],["12991690495139961638","2074287337477283576","2456956125630413361","9459670993420739322"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["6021689955160100200","6596894243408595056","18391865983040800724","11896016858449508226"],["10013802008074913257","7744102666469580664","17779281797983122523","8810130367934809217"],["12354475669969216400","6190406411399400646","3507938090425702055","12379613767517745691"],["9403733238701294377","3238546012497347666","8211736982867838816","9363620843483128187"],["16232050877541649493","3021469677370168417","14009637756536670857","369994749540580410"],["14507806589736499844","14119738670415393217","12546964178077627494","6644945167625834529"],["12131333711589675762","2839543309614310332","4518433338721727434","10029080195977772307"],["7422081510239760427","17815618587236471842","9369989827529649242","8176102861421479367"],["3940043933413185387","12927673328208715765","2104390628496123639","6501065220409096839"],["6221988021102540268","17385884358026960567","1695037035509829136","8013663140728684501"],["17690128796673494449","9088184552228918138","15741887065300757345","9503428439309298179"],["1171580309897914527","9983029799525215590","4980361134789768452","12913402364570065856"],["9033667917416949618","15860109367255851187","8724770781907514305","18390853120238178799"],["95483791775268458","72705949989891654","6954937253673231900","12767434449102477658"],["13353697782334840520","6007424676903487993","10434233176239545644","4369163016975394807"],["2880324650290290265","13999319808762610046","3411756831716427486","17061663490669407609"],["2425274213770720311","12770482547548521185","14364886785465224781","3426616845361208585"],["2401950604907657224","7861180221959971251","4763520148589021854","16906499967233534327"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["17125863479357864838","1890815970782245286","14294442303445477274","6348570231026603122"],["17952923130453146368","10551253296997794377","4615899758390293558","14437391840697130292"],["15536952244985731915","1059586520200902161","5871686796232731542","4058918721930602093"],["4027453149003750891","7442062059667678177","16259809170129880973","10202917541847370518"],["8691561008013331283","11800694902858299242","3148264859475605144","16696125489542835945"],["18277987657608824765","16529466335857353378","353516979623700218","7663994995233188011"],["8132102769038825471","2741222589598367416","11825365514106803460","4147363828085706820"],["7548214153254758704","7860808775512974831","12608705432384659075","9057896586126619886"],["1536817849028393693","5086657543677311730","12943669856260360358","5576556119464024184"],["13400695028770191133","4842153967721705386","8740137752465869624","11272498886397076310"],["12371213484730953326","12370910731389538304","12217428041170339802","9518598634849299903"],["12839109448927225260","12000872005342154438","14499262406722036972","1145361525300677107"],["14679319116789437236","12965185900557040542","17120357498973477663","17537904830193050594"],["17011081197152062674","16264737989606843780","16874247415357037138","11489125521947143110"],["5054469195892559287","15510484143087685859","15092133020817129765","6805664176636140762"],["8866705981341765036","11078971850410758350","9458545400559195024","8255502527697046168"],["10548124569314535418","4826692051664270299","7496685620080237752","14875234956075986683"],["11576565975786037173","12870100872917598638","17576693105436804751","13228573966506796684"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["12063939966723190920","7844280089152764617","5127569267265873343","771187919075707244"],["16052479726739592297","620674190320991758","8178310068728843208","4769023809032258759"],["88460747135993394","3516626554383666336","11393930894446583083","8362577946772157034"],["2294348590225265257","15742074024482988863","3970341168302320367","7074752296192689164"],["11511069803835152719","17216705417004724494","1698165141848952180","3537897751779599945"],["15352708481142626853","3737281809290509747","9780341912282686267","7920160773912809110"],["5152607449660592587","13794897688077697752","5770362804829588969","9126806231414754901"],["13233861366375089014","16831472430088543654","4420796129162205806","11240745477949049077"],["12698547921539401203","17653286983283498741","10449896757973289485","11850193114352749807"],["4961553249143894892","1632024263652831928","1883159004091391341","11016504222485329522"],["6027429124568696237","12830315965781000077","8212962845835936916","16010426576879487970"],["2152874848085706801","14824454297270140742","12262419743876897059","14599098680829794813"],["8687572176315739514","861340421251011886","5046304268427969976","5260004364402015875"],["5558275482208136486","4536444138500496961","9111810246014985716","5698001739948642777"],["1917475104734948791","3567358663868825827","7456056526259615475","8864381471595616015"],["9853071036601281501","15773911522691889762","16536901254311422669","1698272014134738150"],["10548124569314535418","4826692051664270299","7496685620080237752","14875234956075986683"],["11576565975786037173","12870100872917598638","17576693105436804751","13228573966506796684"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["9508738997588823067","17717849672694100720","13385993087218173187","3166011560823451664"],["5240820357243123898","6971939477326131886","10840332802907196081","3040092888541559621"],["10282423480483421930","12385469472276619880","10155133684853450549","7474680763172120728"],["7780063970633197838","1533462728698968929","15865272341839736936","18314816798879465165"],["792098122205375258","8948632968441579182","15572748765567802630","16613826498970448070"],["3296655768838669517","18027523565306855005","2512806708526802192","13071625930617757705"],["8370049353905768104","9091586433942667004","13763266117798213008","3088573683347257890"],["3488740347213184559","6278355754636892093","10021253478507001500","12260833039299584437"],["3315945152831344516","15360490199392420936","6070877278375991124","13941408663674921790"],["13840740424343255382","5730353078413745952","6103686960494727958","7877010902661621603"],["3335749183091249046","9453801626390734641","3242502860447339480","5781931323239923786"],["1318156056219374401","13003041873399261167","15703647826913916306","16099800244049286780"],["15383280400444084960","1311480418047544352","2540128219037375990","2550478910760765971"],["10827545334586715138","9571975714683895843","10792286876772414940","10153953028864811192"],["395189665951855136","7779824826353391314","10928732740556113729","9863235496092928092"],["11961238792131728002","18366542927028908006","7942583536964066388","13709503985989244291"],["17566013197748551026","12521760151630345767","10377994413768657575","5727361561330498592"],["5820530779722018559","6304184412942328405","5167181935745190447","10582222560072022039"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["17144318517954837475","13650680106513649031","6206776134718323947","4174125243329214647"],["6822023693576032056","2083927025186602361","2332096170007244359","2361455173658970377"],["15238467759241117539","13154055186700157562","6829064519720720556","4399169658963104946"],["18155865242698378504","15429377526259931425","2292374872960292700","13424047504614732819"],["9002510712409180603","10351376751675131722","2294791053318651772","13953925138946890315"],["10637841128347769457","5245796295439822693","4155892611805415843","16425432291484512585"],["11419122727819389301","984503909951093518","2344178560905988712","17716637561226259606"],["10971057401201534100","3698924684011267909","10041801983012730671","17814591012723109231"],["16516536467520939673","13811289306436364267","12020981953087131690","1294767415030173285"],["10698201317393514629","9338438453785045490","15123745348566832593","6753055592556717220"],["3275794055874417122","14436051351192926214","14198795705852777401","17093679594798537771"],["16490294570596493490","17193168067807967261","7499306338878032319","10451735609970404165"],["520258757867099082","1494382802909667194","7450996382404252782","5225000788450352466"],["15428126140635848293","18086402674004595205","8705902950036959438","818082720936682044"],["14365670793915903597","6275296825158013570","14358002704804559113","4931130002877262653"],["13015057663619210440","9062073650971123865","6028712964826148869","17236132219275504268"],["17277788250072602133","10384231349916978196","15773954522206816129","4607979286954212040"],["6162330360342985052","8378541946499981945","4061547640024123855","5187170816140781599"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["13688227077886769550","8390155264182316169","9591312717992614878","17599444157367007777"],["17944009301402742539","11220882995302634634","5843985088319606635","15946631884127324222"],["7044239421212236271","3523764234197723872","15822882729417226590","4126494169545676213"],["11182133310634856431","2364823664358346278","7281087227938520101","11074052181531045155"],["17814439647449491956","1394931065511309045","6660906402782817443","3649641656287935453"],["7226464200988509377","776684550168877778","10191330662807881272","8196145503453801583"],["7583819648838522306","341307821205481879","13365100974959204193","1671319916278463571"],["11770485583823099631","2641519352638100376","1114108045867655821","9429657471792128715"],["879243503574717977","2805659201023085773","3196971066866658152","10261593803942436609"],["4395900156176187227","6080036304643715267","4722547118206817550","4900988307999169565"],["12279017905075020890","18368329673628262121","16128749186563613017","11382621289393638709"],["6333359303972181118","15116657910574816915","5091264625731329779","14086028298300142520"],["14786141973650061575","8639860718868155369","6863817203968194823","5522776430070527785"],["12525744400709249835","13113426886493921610","15296063024458781370","15492475972187323149"],["2592757921740130445","5651883875726423121","14546538317201008896","7477285519255954515"],["15687829735959729311","6516556851341192221","11441211989218421067","14429126124654215333"],["730719862925220513","15384082578704070271","13926634430300722446","16058045299611073844"],["14003381425710184331","13638309150148055511","9663019428035781719","12722113239150579928"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["6183653183560165075","9163357369771881449","15206560487309039998","17864780717172124616"],["6836754094125277617","1940740963908509073","4735316182518355578","2931510262656134625"],["13934910994411195380","7102066582712568242","9376541547507745424","511449564633300754"],["10396452713107230244","16628608829864598567","15392769996458023634","957016341833939518"],["1686686880077954980","4801075413142822139","4423608724543349711","9795924710818117135"],["13615475897556106098","12156298209168194265","18104069953002246983","4626658465015036195"],["11411452670883170964","672615263612027923","5986796208349821578","14094394405501754797"],["4885988799383892241","4534093969934519326","15937133742097477795","6879708554771222248"],["4737589504406796675","13347819366366194526","6910105399422377588","12419122128965003212"],["9757338920120375789","7211860263867200172","3220291802011016156","9564461190866149553"],["8923489281960412082","7841379004928163963","16795714676366787206","3947109461424249191"],["3278087301882876172","17579118083838705598","17916527245642982314","14953815162991345989"],["2851260308612581103","10567633606320694028","4858628510925511994","3957587549648290845"],["12097739505784335541","17760185497604032316","14107912338546506360","11263985501489085950"],["13342092338743096341","12530957831477839802","16489146098268517396","11008800802695987144"],["7703208751106783976","5278064592114944242","15046355412690157444","1605430036046167863"],["730719862925220513","15384082578704070271","13926634430300722446","16058045299611073844"],["14003381425710184331","13638309150148055511","9663019428035781719","12722113239150579928"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["13925779156268042216","2932553937483674384","6326608870237560817","13594757719076736648"],["138039077871044372","13975524912428350436","15246073477654879804","834079296102174815"],["11835694740710308733","965613623792608133","5077693783145211830","10353580978950425319"],["6769872101487488775","14938049893851207402","2084253183461848149","8757148601142061214"],["17315916186572354547","5891746650869542627","9230131082018266590","15342840860750882085"],["7687564734203942065","328083936419288314","8695967246865443865","8002398336166366787"],["272293273255724624","359712466763163397","14373904275741717859","11643945788276917018"],["14137700818234207637","9974139139559085675","11806955518532324469","3714927276446248391"],["2087262241073026546","8574735072334274236","14659793664518415037","2708637873808920039"],["17859158461515223276","13768328259209297752","12500517467975244935","6354220279934644842"],["18029882419050762456","2982530901805079528","9600093296372742963","10044815562709267428"],["581165983912154168","4317337034611045298","6057081882712850584","13518942477411786736"],["18109651698237524920","6029313517786204896","891609424607929371","12898126006490281489"],["73285968421549515","13890521711990651845","10610984248036743597","5921741257955507971"],["18409996871538827231","14491025550541860426","8532623148479258989","3132989885454334065"],["9785436682633389902","2448078181302483257","11357803930902852855","15563361162900229354"],["12488394706465240089","15834690712181612047","3590416837360683432","1410227018642831920"],["14901731779507881564","10574711314538625848","10442462692328694870","1217431753485994640"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["10001416596994402448","13306544305800081048","3238896374773948417","8590175960273616597"],["12842900586427286086","17792531501103114392","6028983785641025708","819962088775679787"],["18088188928563221344","10068494353747272331","8415401632551492772","1231530182772853919"],["13486803964233669436","1176914814879050150","2810155353498900411","2857420315192004798"],["7064144281911499060","13481044175388099562","18026273984326803141","14700242811929081599"],["17316432289280016426","13634391689270380626","3815832079845009063","3254771613669330826"],["12174034324662225571","14482127083449125759","2838953843161227378","11503076637956891006"],["12991568864336021794","11192103563700726931","11368412976251271734","15943831166814240009"],["705175067248303833","11332028794848924134","11490748161354009565","5747845321075279211"],["4107637403040897172","6418985522455341755","11470699208567358789","12531929241870432536"],["8260403980712656995","15931811600042876085","16729431825942279870","7411574037995113750"],["2590766138084801570","1933324862997081982","2859145418235051515","3140132950643619618"],["733680750849792388","10521227127943762963","8782777201806122272","9101142754218869410"],["1220155352680725008","8921884683720843888","775608471691681909","10875965450511369611"],["5082211021956375481","10992092915423902935","5133286265785953103","11124538297519717987"],["16648891189303204628","2645219231804626322","12736856414083959735","1489838265398004165"],["5210848005197040569","14733774541674927026","2572144881996523486","7624557391727033745"],["14901731779507881564","10574711314538625848","10442462692328694870","1217431753485994640"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["5404985102170799797","9361983689616272884","10931798340546830975","15275664523453055382"],["14224449057027782546","14063976625741506895","11281400455129231870","12629614998565197664"],["10257889086660672214","263562012074774264","711183726470645337","13208509018372146030"],["16057511730155852756","13205234727149066643","12002088828557267873","9296171693653872554"],["15762944296098132865","14179116781945459464","10882093212268785466","18222114324128523625"],["10714770417367383902","10282739254427160302","11971525930464714741","11595096133763822786"],["9975837922061848467","16204693482312722807","9332538678632695430","12728217342810957726"],["313995238601750394","9547587999954228508","7000311024113883843","8061435561712454033"],["6279549059924159526","3615460010791718758","8728714798184037346","213358119245287930"],["9697548927275978075","5839550466433380955","11934388213098029209","12672804410697676516"],["946013454218447376","2641880044135140118","10692789002459700193","11221185125536551461"],["3331663911108369498","18307376536796174228","18424257746795502214","16802611347588297252"],["1220437067626451921","10180964530529950555","8489705226713679916","17830416059657466225"],["15524457074330938170","147210560559963462","5036564800911527959","14156657777542973116"],["18202534122501308408","7444942069053923357","2496190371402317944","10807730823989030017"],["792366278911746290","17323294680656462312","3368373640882174289","6797464879349654689"],["968130525463116068","14995395785321110365","6719283690607124553","10362187013929889064"],["5820530779722018559","6304184412942328405","5167181935745190447","10582222560072022039"],["14997407593234692088","2576039719172047406","2899316107813201979","12753815663794485949"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["17484759323748754535","17698355741094974939","3672046205000484838","1996728362307402806"],["5184016013304127915","17406096443614832558","16411984110457975783","9493388720912890163"],["5407028989325101063","17694504153513511910","35575523133362524","2577552914567049538"],["10619485203105779604","10104789105509506246","5142087694555949625","7882774657862549014"],["10162391911222785390","8296219427502186053","2610263048675914209","13799873708997726775"],["15576749690368285821","12861994776969529112","16976782655746550217","7849085389727293167"],["3700262053535205792","14035920829352622426","8588316350085935668","15407744934707151223"],["9507414716995287701","152959788543684873","8971384253910869128","4407942089386286638"],["10331267531397713373","2351969178850844282","13610257776124076727","6205967953019762371"],["15221540424210784014","5475513446815255249","5448505596742361291","70391240548568440"],["8025426494629011266","9774967809684651030","12381895976260818934","8722088875756872874"],["14333616527317006221","14223705126025576143","17444712937496728567","6408415727799180967"],["14059595494992589377","7360418560510946445","8884204186002592001","1351630903627639092"],["7271475489757076117","6833494745682335981","228850913896549139","10162846269521522014"],["17147056113803029302","4653334843652782904","17437702955878840985","4638097380004495733"],["11893367203027085792","225841217534124645","14571549358992729543","10161836992696645712"],["10190834754536038006","873407096979937838","411029414440855047","9358840834059081278"],["2401950604907657224","7861180221959971251","4763520148589021854","16906499967233534327"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["6347392281515945946","18252728321843468144","12987281757954449374","2548216184529999779"],["10104219124189772152","2946213668439750306","8557909278441835107","2028897856862688550"],["6098686088250340556","7010366307544451227","17514414697537909729","5773582279477453664"],["8843032949867038365","16238315627041730015","5279829530569817157","740747101003979414"],["13073607450226271399","9992573491932511832","9145039681157267401","1504407837144155453"],["6691036733489062513","2748602097679252048","4271793639070958225","3235198077169250524"],["9836158174057245999","14460851473256581138","5702523298630173078","12141953662685896254"],["17677361167292490611","11665896735276457497","1263913595009842444","15081105252915956905"],["15065289329287325063","15759850061401982656","16247080564513010593","14690356966317571481"],["3144698095547709968","15948828320122824129","9930188669336078","13862803641557508125"],["14953771803673431429","16300334589829329213","14865010485802308291","11422271985616167956"],["14636138179202107798","5556320915906373575","5503552744218355645","14847556190503331601"],["12736586154358901627","17633654945417275317","3042568809571800366","2088240115558429242"],["5568459983775598945","657563090007833664","10822103278518652925","11822223516572917788"],["8938216524051280548","15683900382761070014","10421468825593509187","11497891498428822093"],["7130139622571864331","7260645645731647938","958963632347591605","17513424489254112989"],["2425274213770720311","12770482547548521185","14364886785465224781","3426616845361208585"],["2401950604907657224","7861180221959971251","4763520148589021854","16906499967233534327"],["13798898671664739885","153090482563049595","3814643235903680005","8788652239032997885"],["11902225462482206730","12239975539202984967","17397159571759407637","13068673423531537582"]],[["12007413125353123853","9817927629176020698","17062895050891032188","17138613190105312640"],["10595076130251948516","17213856486956139549","10611082999053529751","4449759022421723324"],["14635314289002538701","14268839797103198227","3140725908559343897","3961439240847600943"],["11347738156594123706","16087086831806641682","5993609741303164324","14237479096619019431"],["12686296443612657641","15189042211792402540","11888213549934386562","5850885310512317646"],["11368475268361367351","9226557682104711320","17863013033505727764","2713350730394391694"],["991362929203081871","16194057271032956563","10051338730292353547","5885319645148965246"],["14642176674881940274","10734872955730896484","455301715016129033","11021638457373497087"],["353491235259923869","6148056549738422901","8012561298167068013","2779566767696633814"],["15472036913605698305","4247358046604024568","10871652156496822632","10050703073719125492"],["13364037952172484770","15849478151322635745","4091861965137549463","514074074702002457"],["651226763933428349","3972396166266828227","7909156411637613174","9588483111440898446"],["7298033566630832546","10723127525761516257","4575104717636758724","14798839023042424602"],["17016181656545093297","10325942557081534488","10558971397614973750","11536861440206092575"],["18176902128312403571","3661695526374641308","11633806772290739010","9370370625500345925"],["14094201640751473190","11321343262767754521","9003077178502136192","16502180117732803960"],["9277477259301278568","14449705143725600296","1898453710911756444","3100501532992462474"],["3494947538190611982","1347831767090636865","11866844666890121809","5714248105476918829"],["12991690495139961638","2074287337477283576","2456956125630413361","9459670993420739322"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]],[["11466229870411632264","2316879983194623452","16883956157346432515","10299045994587905378"],["6044313175595044908","10538477645045426012","8579227460881121357","2005418210227144982"],["178058262307828580","16907337280670720469","17307164920027411167","5719314210141645025"],["10759683046652051794","3285014487693896531","10089268695436562756","14731087978763092220"],["2165555038534146525","3939130456127736024","592212733253653669","11222180801811770463"],["13979519570525121675","3998044110905883131","10200107442755160772","5283796471717311824"],["15497501455330001129","3939205926665681662","16011926486755527297","245595286760219411"],["1721947649860005645","11270610330081364117","2516060692396057296","15416663528099380521"],["14059317657526057861","2952515134445829168","7555566182978531496","5782863168659162608"],["6960366136438587036","4842624220738736153","16762166772175793928","8680080610051158888"],["11298373822928419046","3950940918460382906","1831731615888936417","18102679494891925335"],["16077858426725502988","5827241225730433573","6353920889995357005","5219836276959349575"],["839470855232564324","13557017830887558471","3554414535151449798","10606890800991638899"],["11725545518939510377","13202968733386713766","18129895480115501694","14784848733427607561"],["13253798623210205888","15173182446247215517","15878958053376407133","1937923960861090727"],["12168901809481681499","7420800314146159848","1713114377214073123","17298322282438408237"],["1974315078251098331","14114736169462942725","11406562281532933013","17502896452745901103"],["11576565975786037173","12870100872917598638","17576693105436804751","13228573966506796684"],["11297843515338165419","13142470278077687817","6353197292686771066","14269741779272253920"],["1538038421848476465","13547331863674209611","12346359307970373291","15564649252365816191"]]],"s0_siblings4":[[["1010862318184147222","7911326300453725085","9934601857650114715","8864342766456594848"],["9923318261066265611","8169473012866896119","14507529396520591979","641991919438328853"],["3083275926097960360","10330079121294493442","4080094814019866189","1869444722665186226"],["13260137362079929803","7243946876241493773","75301701877880314","1132897110164015667"],["11572518894095176887","1392691547129084324","16314561949347630758","15522166975487966832"],["11961985747394088213","4840662492656912869","17799056839489023217","6188250431375452143"],["12214286868003688235","15968161932150224980","16203765817160455151","15925858511583762716"],["10550490818255729119","2448745064207109822","18148492298088625852","6811662016104549846"],["16253217802371172404","8951306393273752128","17896168394078559899","17315514776582885771"],["18078503129979488802","13929403125770192418","769899764672120516","17065873998755372271"],["2868682376682181051","1658508198402196776","15593255857382069537","7012206141704504130"],["2802674432158852611","1113217910835674966","258844245518750505","16536972856386318534"],["9305486496132585118","12436211680301604053","12231657272092983497","6302877654066640064"],["330611269574956622","13470994447228083166","16972076621194412191","17462742519179105624"],["13564285953669019505","12334805451653009568","14627647751230802849","7903016175337901921"],["13185868422210228094","17271813119369072104","3352108626191759678","10561360403648091384"],["14154172335363195314","6543087758124510155","1883684516002736252","7322629176782258594"],["3119136585879292745","7490131299967649110","828051326070031323","4278610072206702127"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["12997533773502883712","867631380807225784","11299581461025890553","9035914579884350655"],["10200649696256641816","13002017639108410144","14284416929835109765","6777339410040385029"],["17563351408961220384","6488762408329015435","6896952514464363105","12805131979809339991"],["15397757872114823130","12593296920766438963","18328121591989106200","8512173596046621994"],["10021405943888538580","7443090656538947613","12725305764623071410","8915575539370706883"],["16118922995500977903","18035536393544103332","17684131012889122559","15108538098548697354"],["15941695065877876002","16517164112711727411","15897188967819267219","3336279018995007465"],["5601027031695340640","18172478961954275707","3629955065742689523","6513051308356324003"],["16162755609985409183","15594530871171593246","11296177318011541073","6562787526984612590"],["13837043001911506241","6774514762586233124","10501564877934861609","15782719305906638329"],["6753144152880259670","10384764419784681764","11822315805312127438","9043521474115343112"],["15907120855550311321","1283260678834700027","4679338087038801527","4400042273204630583"],["14761042536446172090","8341725115485807594","8941161028568697056","14696746271770994248"],["1369971504069368296","8374736811352251689","8234790255994261242","6281142402694389234"],["2890203562532929202","7366031208940642495","3654465172494391456","17823985265664642695"],["13512299633245227106","17065357670303556969","15946428789888379831","10091878485978301519"],["1553087316102440461","16135586056947034487","15148614084548764460","9873321275383678928"],["13629659985378254966","13590100351762247508","2162575799815422155","10127800496631883310"],["17122460220206071783","12564769359491860020","5270110973730144271","8321565833009507767"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["10831053084190596451","2068107669836839273","4425663480807761698","15087697310343161246"],["2436512854367548698","7894586444088723421","16328277840042762248","9191921970154352607"],["17025146662988508512","12470401033282287485","14123995831305472963","7332418000757201172"],["2472479997742570130","15701286438049067766","11716942740570907570","2193495712523624074"],["15836489786585060265","4592463809522792646","1391072533211796662","17610700415847122884"],["14852241114107486073","3527318625589904040","14453265177234619600","1143812897198965735"],["10958194196414990498","14063149780280006711","6178290523890719414","9556189420851044114"],["6178831879360818388","2412580998941148122","7644577731213200074","7953912765598027539"],["3291230442255032735","10114955700869011041","8670249274078607455","10455125520982320799"],["16430125841859449536","6500949477425289922","14690080856141037865","8689551856676563975"],["8638663212542086473","16029488394870709371","10067960705163827213","2245709216851874596"],["4272965121266592128","9044934096875508669","7692643209168009986","10304341361664582994"],["13091013270027685791","14415417243803426179","6552355724580918949","16753469880201305910"],["4693581945497096929","1834108813526066602","1488303742167890003","1325425568146743043"],["7190313059941960243","14832481321287542068","6444587735771247642","5380465646415035962"],["2058989491806562132","6133763020739423292","7990509547661920852","1613981197883466182"],["785904690134488162","5929344153900299994","13523322037615626940","9416282336100783118"],["11359477646958430534","8517033210878698691","15888744712328743090","14868511380136282093"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["11753804397337236237","1649193065245797967","14551649433607947277","9724177709407096272"],["15077536057639611604","4114231960226726516","3634994771450445005","1469715210661320785"],["5595269739029672291","10133993706997161695","16850395614229788595","18437205513395286888"],["1106343015485564076","6319022344700486661","9873995900473257617","3552753611822426695"],["4131223061105067525","7377687797796896444","18355731044420217405","8292019209271614075"],["12107779300397997703","2467810539148468391","16360754380675355432","1226868838450421278"],["1207994075743605532","5908218635702072062","16537701364429303293","1693644668783241352"],["8497770378547845194","4486611241687245075","4878128917853357830","6670362063057201560"],["6357446260148241978","9889693906533015933","768004445249123930","6571241128206562359"],["17222104102660834127","9472399356196959824","2040811347465995483","10535874436218522001"],["9635181627967922801","9985466545609722044","18312193290827772681","8907151108207722807"],["10613571961519187097","14195899544766722182","7772973460007726924","2322497799359203580"],["9083781869892847299","1175903452379553427","12674084905428296292","5846938199058910619"],["10052489059029217594","11684158300706926801","5273375948419913633","7717096340433593730"],["9240763848705193294","15413495415864224425","6944838339743176022","10640186678334355516"],["7692187475307456224","3992146936234148974","16343965267287456477","4197959909139655923"],["5114736428191773765","12093396635768640624","10739603702670514483","8987139269759122106"],["14173759944723708939","10174679116860132213","3445552952374000047","7037800858817025163"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["8136400778772363021","2903017920989784153","10478887345345159519","5621320238369725793"],["16080741381943580163","9779901972631314426","11767588885526591933","7820332136080717027"],["1853428934907000491","8405765085773241268","13067143955529197846","2185116454450078313"],["18414641949819226235","3421003979429872895","16606547432725338107","7913969160608834409"],["3539978573230611878","5545739716802873477","16850766936190796665","6792569484743644978"],["15579891256590849951","12412107078867642816","8206011552380676543","10615945577118358796"],["9469016076571314502","1559579345278529773","8189640415541851992","2349676649687711619"],["13388890326110835417","4304930294179007557","5243715756618225623","10165742275906178667"],["8411468442747436190","11125951586146800767","8146176569544675311","12236954090715097551"],["8013114182640881093","16825420807476551582","15945849411272276879","1846476840246133310"],["14306966835448035089","15438755427959723894","12765260866967971480","15505106573817014079"],["13773452007357536481","1346200886760465302","17510203353033846109","6647928693724961219"],["15739167665067391940","11413604204809541675","1545742520371914422","1068173004010456109"],["407267189210330931","17775661833534785389","5817875520018072071","9148491569372852573"],["17716234271130676261","7419849569429604096","11335737685252020834","5156277418280796398"],["9072235517685792952","15691197737865295402","8784018664904172830","15312586380827049951"],["2586029427150418109","1610309236504274755","12456407186923738372","13108333239998770513"],["14929577280511164587","6163418532529977052","3828384395550760998","655506502610117573"],["17122460220206071783","12564769359491860020","5270110973730144271","8321565833009507767"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["16004673168698387513","13137403613234421016","3251256949067871301","18199669770762410282"],["6956080246274763278","701379730103832153","2816717223547579688","17496568968059239553"],["3392311942726091028","17036602789956753711","8980546729348108709","15541309987129640143"],["6290454514927148733","2565987680624430195","17231945841784268690","4177995168730757938"],["8934227489659402211","2284052430785535275","937686263541437357","15743356598672777613"],["16113672264729170950","10890936986375760987","1740967063640691246","18115432138835585250"],["8080402704265361256","14742107906069044612","15689343518633218268","15649394363117290108"],["13422105103431766169","14878128470060699466","16105857908903241632","18065442274963197859"],["3488567538248409631","9217842942562373777","16602752421836710732","15639175254083792405"],["12346593969391323604","7730172065665030820","17496415258167948060","570463414215937187"],["10128556055390626114","1132807890506254928","623536428906698107","4410446880960496454"],["2819835893998976772","5180432874641163496","5227849554795101337","2818363286715667007"],["15641564709151297898","11469711237084843304","15198051049092373152","10836044025182912429"],["15198203480044695445","3523273166032653516","4556363970087078773","5242923316660737660"],["14387246948478338502","1978342646339782720","11211487281138132056","11154886835789490828"],["4257937842835594161","18117371718950377350","4482568012897376230","15837965626294718951"],["1919984598761041094","13985832954062410251","7158153538361143734","4041630250170872232"],["14173759944723708939","10174679116860132213","3445552952374000047","7037800858817025163"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["8498217390066826183","2642367495879996149","14213329546749459156","15972189150999476463"],["11818501093360627967","6874723025621563853","12370850706590311445","15673063484412539055"],["10363662858387486796","18377174700195974852","3673248551521246955","4975088386814713177"],["265680846318398357","2702375350748430844","8514575960678218660","13960693369259677613"],["3574780145564938813","11344371544174516043","15824165912551012049","14076867173462092121"],["17049938516234554431","1493630147626614857","13382562143006912214","10345546694300617260"],["10444658281084583354","3457618656127721867","8369588637082655966","14136431687814965047"],["4763395772354589944","16958213886047270480","3213426545424694506","13148670818819447915"],["4925315851863288395","13222328935837389085","2803798984419448355","8433121111294816968"],["8930013468548931015","8913200207379821492","8069526999457511092","12374477797316792123"],["11641650555652225462","14366588841202557715","8697123887671584916","11626371087863698488"],["14341911399862998989","7455057224995929739","2242688509727412206","8903716331535606147"],["7386400008129507965","1859739080139523021","1968643955100509553","9653313247743300475"],["13976564952001825948","7197741588406978043","3195062872443920986","16412846228287845322"],["4831810938979899578","14252702377346181492","13865343067618308791","2452831920177697054"],["8028848988322825612","8613433321434884936","12809121495550960688","1503081374719333119"],["10087258416257659676","11444637966051878126","11515692984698400439","6013460576628189146"],["9624654900264346872","17966111329147323705","7916595077761605593","16520899573806914790"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["15792551077824085041","16568687838316312759","2807108401905831362","13809890067535739072"],["8172540926379903996","8927841564467558359","9446551941978793685","12520101083968314673"],["2203091440364202230","3974532568979482738","5822251262917435735","3232680951270408489"],["5716671790682196310","12151415578873783734","11274836668183556018","6787269856755611452"],["3352551116748820594","16487587666692695352","4177202571015998246","4717042040001265618"],["7036809696558893588","18311308823779663067","5650555430995304864","4002348967200443836"],["14306865820981218622","4678614873454678943","10273675706309578799","8234750527391242368"],["9651435717574336614","7913684494031474983","8298514710566362551","4626189907649510090"],["6041973328432047842","9601345058236084198","5927070019002658518","3726040064163354712"],["695875652002833565","1365923077293785987","7287790283409084792","6771469248798885128"],["3001720342790045126","2701639097552216124","17934502267027471401","10936940109111604250"],["16321751770398978157","10972296733507806405","12590006101914219144","2583192199283921281"],["4984301436139908653","13329215233177715988","17691915084087105678","675940088508747127"],["13950313046325381006","17148291264677095310","11314237806710362617","7536948840495818356"],["9750483351106345030","3159758216352203356","5744697021493670322","7013265215879484636"],["3148574163094703516","11541276290061248349","1166620483661496917","3244136626225612661"],["14154172335363195314","6543087758124510155","1883684516002736252","7322629176782258594"],["3119136585879292745","7490131299967649110","828051326070031323","4278610072206702127"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["1569690841770754620","8425066349495076873","6759507863423738828","1786124876704143287"],["8555339125794606573","10630629288614357747","8930590393473041608","16877163743719686585"],["1777209211097063772","7966360886405787800","4599760282831274949","10859887083764410610"],["17494596522841944662","1704070833581015511","4177781528707827710","4387168387074361178"],["16872357818028142643","17158403140752180524","2841571475558413978","10741366810977551423"],["12855715253107168154","2438499208319894891","850368926012821689","13183179159009542484"],["10204006427898594457","11709105923806644851","13817551418151369645","12089152402525481365"],["7369219434797874400","15522971245876410959","9030381192919444781","9847479977911001217"],["9297879605853272430","12218177017542565663","16127757046990266611","10779359056435031701"],["9541834935807257770","11491193943252801325","2374621549707180505","13107659148400790197"],["14794566730135037999","14681598775875327797","12619750350331819258","18327497725109194062"],["298617037819949382","14610129721646094617","5389955486452251487","8850724612758218792"],["13338797628246028155","15881460081895483036","12514850062040120456","4858822802941153794"],["4868538138078342980","3314034766213017530","8792664056711650186","14505166983463428024"],["1650023824553839115","9465968401095041786","10033217116759756342","11609417580616433448"],["9072235517685792952","15691197737865295402","8784018664904172830","15312586380827049951"],["2586029427150418109","1610309236504274755","12456407186923738372","13108333239998770513"],["14929577280511164587","6163418532529977052","3828384395550760998","655506502610117573"],["17122460220206071783","12564769359491860020","5270110973730144271","8321565833009507767"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["6403468396089108019","4260978290692131376","17816118909852059739","17450740229269558875"],["4629016689319438133","11927789969425432799","13062610888787630129","5966284352023167254"],["9509824006245591476","16308409757486965785","7109225786466971324","7221705961384286204"],["15545439017528524828","14764653785621617663","2348120748117616681","14588988328057204353"],["5129561381744322530","16255676478317896300","15872960794523299434","8281226025837050908"],["12434852438313118983","854142152577518283","1190233329357578574","14468508472763898311"],["4738481040857747271","17565059648098803447","11515174120995329997","17394521078779887"],["15110476899475992616","1238514898676065051","4888035649414975815","15143183532440767840"],["5432199643264135309","915205204625257253","12808964374920099595","5789688764102675746"],["17849130181451305034","6705400099354555971","6383859272020387809","10834618195432909593"],["16812184291418343","16165062011286038572","7402841865363789810","11010721976700588747"],["17256919516811855287","14067063189912024092","14729704884405720076","11098206322624893624"],["7177607003293776200","9150499825343120560","6860832195307013106","18386673536404458036"],["6778119558733984580","14580366253686829422","8070172676082308493","12699699058819856722"],["9078858517472549758","4163532663083957128","367566327224595784","15009326890036278558"],["2690587542893983643","14896508967066612246","6927736707021761464","7174306600573742238"],["1919984598761041094","13985832954062410251","7158153538361143734","4041630250170872232"],["14173759944723708939","10174679116860132213","3445552952374000047","7037800858817025163"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["967718899518481805","7886350682342687469","11960088414354362185","842099331497515783"],["16530709009978773154","9628098169777413533","1304764187909915106","16179543764947062342"],["318692831687206089","10568228048238833813","4453850577461344683","6850268105888731987"],["15859531799526821476","6444727144241704273","1462989221245206923","7658624695258327579"],["15255984645623027891","9786567292751008944","4461275361158349316","17652658044143378605"],["12794398465338280840","4533146797839818979","13639424032840401052","8630382476417502763"],["9435845912952672847","14643847539690460940","8130555539556903367","8898665611171555067"],["6763109754822890853","12354294278739949880","18220559559018693325","16401422420718190473"],["3018989252285756964","14229074677594566307","763446409340874843","6893294237149088748"],["4890972267583383520","7175557506674852712","14814443576926307926","3969150795708736945"],["850342245015223980","2744099556820754977","9532840176167822561","10764689270056529995"],["10817696203901643781","6406578763647762373","14785635532772820624","2294227210747675396"],["14185325583977054062","13318905211644574338","4258042845791496686","15267833031663281528"],["13988147518216236686","15773247499667010758","16694862168767307880","16826529610907872763"],["1549519009886694387","13187854033750354334","3952482393899818606","8332825751118350819"],["4631124659430145157","5328584484361959863","13293490676944235082","5056850889983678777"],["7804067743228960354","12729092859301736632","14402344718993673733","3721571896361481707"],["4185192585148032574","3599735040781019179","1981645050124006882","8223695045699085604"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["5583993336942803038","4501571696427150846","1916838760720151665","11006831069819538576"],["440458645974700571","5787698015669661934","12002435185948865213","16722373879924729549"],["1006459847447111250","760974102793734641","5925581592451292292","12684576429066258801"],["4001785627655591740","11290629177014224082","4539867150581639991","5492740179849937219"],["1913302623279039940","8940316104893481995","2915497335152547371","15258867481583390946"],["7380840087381213418","14712845623036387715","8349131623160018990","14207113655185611561"],["3348771705190956095","5900863825141874423","13464910222601502426","18006777164688747139"],["2469757987998798087","9912420571234115334","12774443632420351356","18039143648716913531"],["687179846790413016","15803970972327557183","1653311409240297545","7014280584369276726"],["3219426387258532579","16647278115392916883","631793350472474125","1053643698313111751"],["13812331958521641163","1074702628791444515","15170813131932833768","1773214030904159456"],["18099758848232242557","236141218257838935","15543248008338293439","16954374387318084031"],["5004425028889243099","9215680856101346808","2228136038033301008","1447147510851055955"],["12665900944987865101","15701416346243372737","17345075474388826856","16862998619206152276"],["1858765242640787792","18108396871216161926","9996895398549918389","8090039740638098329"],["4377682174139124305","16788564585086899803","3893506525196528119","2941387207603725765"],["4386483632152814671","11117556894630963127","11848991596684944789","5239038884843774122"],["8872652002074183426","17318814729293237782","15242072589434523151","6229326250009233301"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["1419441754806036562","13967895818389458490","10295626235682218217","3181672969820686484"],["9780578207361822586","17634502138347200446","16675616824340836315","16893970632531335802"],["2569180146531097642","13401237248048249542","11004244773387388092","4505952185944004758"],["13225391131972283283","10332760525680464503","14715341993112587800","1079797102508244186"],["12106688169409196923","10364047222713986209","10990776374763423109","15419195055877524257"],["16940457371644187793","8466079882252123919","3975698766962083685","7170838562639692135"],["15864858202002488340","16219162075768451101","15863858025641964954","17795515409253579577"],["6303814912121815288","1363458798216914846","3800292135576813842","4362153163584560617"],["11724849661361025222","11555836762171099443","1993943354754566217","4060907572418331095"],["15281351784645105721","566312391057693532","9314233155755538709","7002202838222378728"],["7206998172725679384","3185243743539306694","13696416083505142701","5730594169011283412"],["7997655367932900419","6427054032075011471","1203208008493074860","426700602515233972"],["3106256850769853669","5129656769264991979","15596104591445954750","18185470362518592988"],["1050020630596231699","1097256233832386505","1099001550787482505","15284918894686163151"],["18441464410239742492","13242736452521389936","4355935798637381702","12678162724358225305"],["7992608912096219376","6056142068789275743","17632799310680780601","5205607633410651065"],["5114736428191773765","12093396635768640624","10739603702670514483","8987139269759122106"],["14173759944723708939","10174679116860132213","3445552952374000047","7037800858817025163"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["1781427230085046393","1898019919970928480","4420970165363661078","10050460292334574958"],["14276682210879400258","15992164391520230140","9820436286056657839","685208997352926816"],["11800756558935026003","15863148086662839979","1074718171909349425","13657588668428788027"],["12144509667619940368","1559536724957842548","12517398932447247002","15972092827713415590"],["12173493701159526269","2443322589885233220","1883385820721825514","8631240602460640086"],["5099934465394563344","14536717746150918212","8671789342798293248","2262795961529680617"],["7736937113121845839","6547847364062767540","4577236203625966755","5098864271814453731"],["18348237305221414080","1259442813426473679","16181085964002875403","14033408505542852531"],["6946545435619020974","14585597575513762241","3778757613610216089","10349633890893523857"],["3882491756743752793","11362464903089498486","5198998737888308778","12651006637802595925"],["13646678844525130721","3785183294782269577","1393748630582230043","11086861978438659259"],["14880059599066309836","13362368881632964544","5181188310888716435","4069985695256210218"],["10924627480133851619","631958499874981374","12069453347603228420","10934963993843813522"],["6663696460922850055","7427566667979082557","14548105495219163065","9068777211275860172"],["17434871794873780870","4618899522776926891","10454601315217600175","8793859896604644077"],["8028848988322825612","8613433321434884936","12809121495550960688","1503081374719333119"],["10087258416257659676","11444637966051878126","11515692984698400439","6013460576628189146"],["9624654900264346872","17966111329147323705","7916595077761605593","16520899573806914790"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["3464472897898257835","13116179543214556665","9530534221144065371","8500870937950546101"],["16936789743262471764","11188457381927193796","4347506173950122380","12531126492454596057"],["6247203093152898131","6821025141566526805","11501413016097544499","15920938328323682629"],["7408754190034573966","1379909986568328827","18339876715620243663","1657511729486074531"],["17220266677660838568","4650896495620032312","18160206590353540662","16782696279337237739"],["11108908334435013079","17969518329036275136","6553110588297567231","6822990886821995193"],["6755448890368380814","7793230263954448953","14379981871842140546","2711266754170338555"],["8479880363864874063","6810672390682692564","16576989493951230158","13945320740761477829"],["8742882514072556667","11012352881705787659","9885497517317260609","12404327270334165171"],["16871076647792169684","11261655022109107548","9500244113590653975","1516286265811881637"],["3435148101738883482","915538232873532684","3906363678242787373","2533095213683617030"],["3305456655349867463","3928347879445848281","2120835931396189912","14505629177237482313"],["11057906892807392828","8504976474593310873","10510627719283234148","14880123803027540140"],["1067141362706114369","7778615169200189773","4181405333965669500","10951206060492654802"],["18424881720411133842","7710932898722184206","15369696531852770263","6812586451432629242"],["1351996306349437652","1006428047409625853","9690445657533885903","15024330231375436396"],["996014631096918611","1024408299314328054","15746093871933586905","7054273566851451476"],["4185192585148032574","3599735040781019179","1981645050124006882","8223695045699085604"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["13723336182275942921","11088303644597239900","12276416719309698788","244828288005926636"],["17355212127685018662","4867285638564135146","994144437486268716","18120020367878067418"],["15131572060074850934","1168021804609407537","13859238017045205399","4927354542801233453"],["10304233872394606872","7656606979414023740","10876160778953091992","932474214191045668"],["10399966105232365672","17333708857166004312","2916293896980214614","7813631767205342208"],["11660990731988815859","16416146614318402948","13151559008164527485","17132683900240282871"],["1731955125239679605","17863231336468881404","16211138452335792372","17031088795059791701"],["12690110866355414101","5077631143701967416","17405111763289113313","1478802026334920592"],["8138673867577865994","3046284150106225842","14067316923854528717","11141528452044061896"],["16559127690950405517","8646770407971076220","6019355881236387938","6327044099042257088"],["4878634313183510968","9621301580367497185","1001379498172446397","14448832444334624778"],["5436999069738284827","3225617724148778181","9542057773140139638","4965389361375223633"],["6095455827053015614","3035767083665686180","739648884466803077","11321716791765544679"],["8713358053016768277","8421552608703136332","7819772283733189056","10899057805650173188"],["13861129983496539020","9173289900524319255","7319913535480433192","13184809660208997148"],["3772347669682266699","7725265065564590357","14239217781129699055","11652430043642255100"],["4714053676876986718","14084185045815878676","15481394857926927859","13451947544546836985"],["14929577280511164587","6163418532529977052","3828384395550760998","655506502610117573"],["17122460220206071783","12564769359491860020","5270110973730144271","8321565833009507767"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["10007521063928224233","2133987314744605582","15536741057901098802","7300968166929626274"],["8489755732712099184","9152348442896180904","6582576205149505010","8728160745783480199"],["7245732202120443546","10484435111906366037","3031446223340860611","13763129217883427547"],["17547941070981549039","9766085515662485938","12081187462833342539","17189811001803610260"],["17992775780355063961","13725812611138921804","13796223149246478048","13628059869666340377"],["1056988669915152498","16671473906529973234","6343866204248543014","233179074441535831"],["4966170945870678170","6340051650035640732","13943967503606044844","10520516122902795823"],["13938451551264450466","12400791172937122659","6107067045392766414","16054369413838096247"],["9709244328033624953","714562831511534817","11273136830985999597","8528950588382915288"],["3975272240380786612","9667117275721421678","12791972351163377359","6194804456410032463"],["7195741723016604032","8039538562737994880","1874226776164148219","2697811951077194450"],["6243152059262401836","8407097684051332064","6747684619516997275","14730550591578540902"],["16373561010656701720","16058524572912171672","12932087020188316277","15254630421694819995"],["5449662082254495139","16624593511132265854","18334389465803719525","4097555189522149839"],["5205298890273662542","2165963992052328057","17519991777835055785","12295572849681352293"],["13512299633245227106","17065357670303556969","15946428789888379831","10091878485978301519"],["1553087316102440461","16135586056947034487","15148614084548764460","9873321275383678928"],["13629659985378254966","13590100351762247508","2162575799815422155","10127800496631883310"],["17122460220206071783","12564769359491860020","5270110973730144271","8321565833009507767"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["12001658748714388947","2436977436219117852","16334936269839686562","14297977755757827663"],["6060402520511545265","7228997493901638458","1776483230237011121","15473982631638503206"],["3943392290078254317","9316383419536746645","1204786810233283252","3522348421527735896"],["12764632004832750439","2041439629177384640","1907541929892006490","2657029322933233408"],["15664465664043041631","10274156970701146299","15427667120646432354","8368941003269259418"],["3793018881500476096","9581432938043116383","6727727921442397499","4246615386936644945"],["14140239223909978339","9469955201947636439","2988797272889871782","4027451856045663640"],["10737246467170207452","8441987610480279924","14168942203872837589","13640216622687997934"],["12786262492531572726","14954845907624002025","7555102795931623980","13711424647271071131"],["10229532380012704928","12230260700560907291","4664349942721695617","12831181329421728691"],["4808333135660010227","5117208426300485691","16770333804629712575","510015417871338882"],["5948837057300772899","2420543790417558344","5420095028563500177","6212599963225792052"],["4344367110331694049","4920258728140370585","14345000503376454423","103424837245734267"],["16955714798091531155","920394178492863762","6820606966698726930","8637550596672727195"],["18429899984748886064","3374887696646878791","1194397190930719951","17588341187149350577"],["3380190192768489420","8004283102278176969","1388298875478766172","17735890211465192308"],["2586029427150418109","1610309236504274755","12456407186923738372","13108333239998770513"],["14929577280511164587","6163418532529977052","3828384395550760998","655506502610117573"],["17122460220206071783","12564769359491860020","5270110973730144271","8321565833009507767"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["10632200986942047333","4476577733417643979","12152296457328434456","14242675143643414903"],["3358333530450434849","11419845168708707445","2259066466198053686","7865944173875075139"],["3753318486859676620","15788226367330053907","283060452547930943","14845040543318861513"],["11410203445454200005","7544836437935954230","6989157675828447554","15262701351323315426"],["16780087462536517542","8825308741222615436","10857676743866693594","14845702293215347833"],["16097019265658337793","14924841317593769161","10166450020896498008","17800785671881763837"],["7904339252646979644","9049548291366560724","18164875958230594814","3025588794544532803"],["9676665405953745722","1624582162045196786","18022775565702174670","10995994178171519901"],["12905276200546296332","15195702932450474566","14900894205779639798","17118229703679422523"],["16858305843699881679","5201898144302341160","5207699779863154405","13983835548520433635"],["10413017696466927874","7390884029851031758","3332388995824686911","8035067216786151550"],["10675985367028658624","7758172551974377448","2670555290733310788","422133959020567347"],["8010195282012877072","3892805959819163012","7316340525704556961","3125724300324078372"],["5629656278129131719","1545012856256130130","9811814378748254112","18231288017706576030"],["2160282404336060672","6490771564912519807","9712943359076318016","5675341123322707423"],["2736470111914326132","12777468894381323157","660264325114336534","15878989086871222529"],["8895410665619875050","12548430717884663176","624653832735942957","10117580798957429286"],["11359477646958430534","8517033210878698691","15888744712328743090","14868511380136282093"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["15201472790311381357","12725507183581574545","1237389303979401374","813762028858697024"],["14567777739098479316","15478661508164714125","11769891155639966641","17500490096961494845"],["11409927496910232830","9730118271419427654","12358109572731255720","3796464239306707362"],["16264007361061195785","11147928514328722515","5699786535592088608","6321564512921801973"],["6584076119468406191","9378878861371146862","3709821272120784178","12699550950292485276"],["10698162853749320088","14325637800630051542","6696912179378604574","3921841327765725432"],["12483072014683801536","1644951158752371764","16740777834620875891","15978250735134938197"],["6799534707354781358","4853024653803486426","12786947859792793959","6277304223598262970"],["7420253357514685543","9347726986125472084","14193241404591767483","2714356203478200652"],["12602889733639724834","13775843415229182836","5211325963762128218","13721101527830542613"],["16387321340060999263","11078736438907963918","11154438518428333720","5722929738024635905"],["106685845657886915","9033343065998107490","17453258123704444607","10776185827220972764"],["6095455827053015614","3035767083665686180","739648884466803077","11321716791765544679"],["8713358053016768277","8421552608703136332","7819772283733189056","10899057805650173188"],["13861129983496539020","9173289900524319255","7319913535480433192","13184809660208997148"],["3772347669682266699","7725265065564590357","14239217781129699055","11652430043642255100"],["4714053676876986718","14084185045815878676","15481394857926927859","13451947544546836985"],["14929577280511164587","6163418532529977052","3828384395550760998","655506502610117573"],["17122460220206071783","12564769359491860020","5270110973730144271","8321565833009507767"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["15659179279046126096","16225912351550008488","17729222288833471484","15661121650484201368"],["914032570176160756","6726151617779433643","16201775393790736243","11013150384116192398"],["12234683822343348480","485953731395284622","14901518496799658897","11784325496551490976"],["5217884843757440026","6245242293089789868","6470685021704317281","4842004963472043729"],["5912942893590629315","6093042783845941597","7668722281334140533","5684563739194243956"],["11037087878729181626","10033762830225339361","2449231986492953723","17144817885449740041"],["10538098005379766316","10691618068988952157","2559362201355904027","13281046273699298225"],["4504903345021438977","8524304849638762521","8328716912704317037","16882421797965120366"],["5045246993589888635","18323417290931500427","15130668422068449956","13109958589266150498"],["17176314904856445188","11247877958682269580","840282372519954111","9317587147262200432"],["5634255411593896615","18344695824571972126","15092426041694200481","12698328730486424825"],["3994838151206938482","6208562726213808595","3375682528978925163","18140533845368955877"],["8184752119420446986","16434371439331270015","6854239518371754338","10965928389056453710"],["7743074281022974191","5320480811299599676","9829779961903346714","9339595098345130490"],["3360091873405404323","8043855496441172128","11901614897686408159","682939627130176706"],["3148574163094703516","11541276290061248349","1166620483661496917","3244136626225612661"],["14154172335363195314","6543087758124510155","1883684516002736252","7322629176782258594"],["3119136585879292745","7490131299967649110","828051326070031323","4278610072206702127"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["12975071353682368079","16020089332154938239","8033552625200873488","12044089805349139030"],["8965759007691087370","6722715517438625673","7267172405252541211","16950292538108421760"],["18015415973446089061","18371428284881084707","14808417743192835431","16686914423173994576"],["12148236072598094292","10524553972056084269","6496784084247924957","789703673715829770"],["7494729275137807151","17629868532617373119","7727446632330623711","2623289168032100317"],["15870484746121707974","17361995821753691827","8681306552438837976","1892330685933806427"],["1876756438893756559","15928182566312864299","12577111946260006032","15564552425903877793"],["14138816886147716765","5307230374236540448","2542930513148766675","18098904728708092720"],["4226233295827010017","15362143196457250803","5916290291952101654","2799216490359084392"],["3124942992665919217","12503598653677465019","8741134475188224375","975600819643387886"],["4655633164377754332","17429021529902988154","10092284658448175437","8737275132189155598"],["14729876126530334179","15459502470798997952","1981950851624874238","9467423921413778046"],["11057906892807392828","8504976474593310873","10510627719283234148","14880123803027540140"],["1067141362706114369","7778615169200189773","4181405333965669500","10951206060492654802"],["18424881720411133842","7710932898722184206","15369696531852770263","6812586451432629242"],["1351996306349437652","1006428047409625853","9690445657533885903","15024330231375436396"],["996014631096918611","1024408299314328054","15746093871933586905","7054273566851451476"],["4185192585148032574","3599735040781019179","1981645050124006882","8223695045699085604"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["6938646880262645804","6514478895042558515","8544893883090145753","15571158474570031590"],["8243869447905149584","2188866757999732011","6187266488834758866","6080579073995025268"],["12313288212069298450","3921811909821291731","1367188192971758612","14437002693395911488"],["2070117129463447808","1422564623774055739","6391899520447157327","184930903558038490"],["18284227983288985809","14453881573129825974","9279786132144190439","13154012671320915358"],["7134122667596596961","16020685818286302294","7870377481873969034","307342896601710229"],["18303402219017086522","3692622553870562911","8204893738288559454","3442186060890848768"],["4085151165460294222","9751823767716805314","14563296069872899342","10093614518723052023"],["17925120801848540429","497819197096111140","2832266579200791306","13683143980767889093"],["3741797804255435476","10284523078939738029","7759772066307558654","17128702745588775751"],["9635181627967922801","9985466545609722044","18312193290827772681","8907151108207722807"],["10613571961519187097","14195899544766722182","7772973460007726924","2322497799359203580"],["9083781869892847299","1175903452379553427","12674084905428296292","5846938199058910619"],["10052489059029217594","11684158300706926801","5273375948419913633","7717096340433593730"],["9240763848705193294","15413495415864224425","6944838339743176022","10640186678334355516"],["7692187475307456224","3992146936234148974","16343965267287456477","4197959909139655923"],["5114736428191773765","12093396635768640624","10739603702670514483","8987139269759122106"],["14173759944723708939","10174679116860132213","3445552952374000047","7037800858817025163"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["5455729764843273373","335479637036754536","186624826453313812","6919863931975397935"],["18265815157347375017","2765611984120742096","5134508626393484170","14775938630414480599"],["7357792204254784502","10423161847881619942","3950626422028888222","3131082126239836963"],["1862717791243973250","13926823894774727414","723183694895303539","7832040639579359323"],["3611171916916862366","15859408570303005739","6831342640318125603","16628953624111608263"],["3392012321303917732","6722637108122069263","13300369906786976476","4205206658235417069"],["2997716867291251137","2350654841847466608","18007990492822097602","17469339866766567875"],["18268183739887322687","1989127376833201081","1236861694422321288","6139006874388694284"],["16923414439390270217","10173085165524188122","11038243397050447555","11296956824258456542"],["17260252141759688982","11689484123744577316","97760934189150096","1806927833536882293"],["6552006825938347922","3911421023897418977","7126607186884467274","8670560200822803875"],["6953432091095267669","5366757186511056052","16603087301182051310","10381941771539977156"],["15956458490237345255","630778417956088461","8755703808770584533","16698545042455233405"],["3504133398272119650","13050583611779498920","10466806596245974812","2678992933416397306"],["7190313059941960243","14832481321287542068","6444587735771247642","5380465646415035962"],["2058989491806562132","6133763020739423292","7990509547661920852","1613981197883466182"],["785904690134488162","5929344153900299994","13523322037615626940","9416282336100783118"],["11359477646958430534","8517033210878698691","15888744712328743090","14868511380136282093"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["3354991970699996813","15693581507842862784","18007464080415505400","14060670849081146355"],["3566681719247866915","4750760648342283646","40028284549597702","17458685389336883411"],["6766881540357284246","11339030599211616329","11713704997722545613","3807245628441538156"],["626432800432280665","4537030791845246992","9737567233016128002","14799745485515360589"],["16663851781739276707","2902706251684071732","14845909176186308604","5494513965195683518"],["9342817062439488302","8490215434247723623","6290119502592653794","10173598798179127060"],["18439201671592993073","2576554683994912235","4420790524927344884","6582437733013356822"],["9217623565976649032","12840279206226877795","17532510619026421385","10524014492626216113"],["1484036469930723654","14535728050788550486","8367638141062484652","2871150554160915101"],["10899817391382670588","2664689199297634452","8517736293444914659","9924289701292499425"],["768307097305167737","13812877797534846504","12803885734815493877","9621632808105201678"],["8127865255671422823","7038445112336757831","2513296202592339027","16571099512629600651"],["2730516261450134478","4017256925003286519","14846637287859344296","1680012872393524873"],["4610679585484145100","6955569864509252888","252004316089079964","8299054913632611793"],["13111571918673732550","13275607641400369542","5800180696865465855","4548363437284998421"],["12895232080884690821","5174702330956437878","16432932882902936120","11639108371707474141"],["9803653709370775798","16046521916048736185","18378498016164681457","17836173034796299624"],["9624654900264346872","17966111329147323705","7916595077761605593","16520899573806914790"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["12178023919096765789","17131181058500392537","913917265032232614","5525291633946487968"],["7963473996140579295","2778271262641717673","17740621259823488739","11682107498551596650"],["16871700922656551870","5566429615425582817","10493296883032523163","9660143050836028119"],["6630380270512968550","10213880562042389574","3818059967135426421","10895140610135582470"],["4946099065811027908","6006956496841343570","939964391973511787","11900813647507061564"],["16936937065112929387","12975943050565911113","17294175358018748817","1848585138303263905"],["5263712602363133237","4427824068498262104","3353385420346030933","9282978170965431205"],["1194047476963652601","14581974423189700897","11714853505949071965","14329204686232059995"],["11522278666572252804","13373342843191703807","13615787112587471118","322709273690594798"],["15173983901219797948","12123762157175201213","18263536695298349741","13801821517930689121"],["12322009788920255016","5599533994987333535","11646192154756889623","15157775780179882310"],["16413392922640338547","904533111717798241","14132250062740470944","10917065440411551803"],["9808131516556060245","15851696178791512465","3160529247049361486","15130405813410188477"],["8847476760867159659","15035398165986617414","12634630379017769823","16324796224885550615"],["5993053642853060996","3603365521605259707","8344169143569311604","4291888338903780584"],["18395963853711689278","10867905872200141793","17509916357284794888","18370697922477931935"],["16913643691653516775","12242795915359986339","2889796688069880667","8466845194960484202"],["3119136585879292745","7490131299967649110","828051326070031323","4278610072206702127"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["6410764623589031249","9720308386294733850","15896528472648406252","13274094309812044353"],["9986934298803336580","7046319305800188449","11817523862346684208","10892576881674606934"],["18386704272569648923","3995547653899933028","3989970642834886673","4013895835115330143"],["1520965036055385641","17075473182214576908","16521990216485150450","3047860586822421476"],["528026174024076210","9417149828172616106","14845788627183699179","2412683175331413298"],["15949111439853786942","6620829248514783925","6907174497211659426","4563056553139754925"],["10712005360912893010","7583884253337352315","785305899316745166","17582855336993116571"],["2065230787895501177","15150130215878825996","4210169954214882906","5180372650783732080"],["7984855458852936127","12313216510525112614","14212535435378647159","16509682141574309494"],["13995990261397004877","18264593207098069763","3935349533601080924","8581181029127947075"],["15204990074450699445","6409788456244504358","16448395539324772184","8636488559388816619"],["8627474248504111779","8329450606706859367","2269807785382581895","16957685928131663437"],["15641564709151297898","11469711237084843304","15198051049092373152","10836044025182912429"],["15198203480044695445","3523273166032653516","4556363970087078773","5242923316660737660"],["14387246948478338502","1978342646339782720","11211487281138132056","11154886835789490828"],["4257937842835594161","18117371718950377350","4482568012897376230","15837965626294718951"],["1919984598761041094","13985832954062410251","7158153538361143734","4041630250170872232"],["14173759944723708939","10174679116860132213","3445552952374000047","7037800858817025163"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["10693128882431406773","81801452588414466","1146376778150272643","9359348088447382619"],["1989800687113181246","16761440878577760649","17256471540033278051","9652709297641406946"],["16799314489131053145","8603362020206902693","2163159545683477888","17134663455849729568"],["5220522704177282243","3576772472490696863","5293591066573322495","8931735356812130019"],["17344153043534663908","5205074793574696624","14242373069003272144","7309979161940470047"],["2015813565101992520","9755684744984906894","13071263993972020667","16840678273279442972"],["861832509252583237","9504248792718350216","6357496547041700932","8128503799697492209"],["5801010782038722881","3443999014698106916","17554265007878461618","15080672947651093022"],["8062512504853032692","15524344064892910560","17311594919824318327","6666731912620071580"],["6209868654115623041","11837724670966896356","6484227320638053508","11815253919243986782"],["948883742159935662","11953765239932781679","10297330067179650637","7114468651559165305"],["3167821859168008198","11962414330204443186","14093648545799583088","11245009456122659984"],["16433709993743147745","9807844064652455367","679727916892255585","9073614778023765001"],["3793166947017543920","13432479599240291937","10623433623569042394","3120333904117608458"],["11192479708985798140","13304796875653812096","16371343908802405141","13343778408931358614"],["2690587542893983643","14896508967066612246","6927736707021761464","7174306600573742238"],["1919984598761041094","13985832954062410251","7158153538361143734","4041630250170872232"],["14173759944723708939","10174679116860132213","3445552952374000047","7037800858817025163"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["7453283289150291101","16748459782160954453","6236676597192869214","10362742844006840955"],["8820818604130472807","8865337747835973371","5433240470270567509","11637151144519179425"],["5423848554016152007","13635820264658006817","12467218142994670336","5675474867712903780"],["7113083594794494610","6619178647560821764","15581241359127875769","15662320992442244780"],["8319089556335031505","2738890582547312342","11179980534448784277","16536096114834551335"],["11636015942071648885","2494154277844330055","9512815564024993379","10291635234760378222"],["17986687513745270591","2107727260288040046","6103461151151347002","6438071429016022845"],["13855240063289866488","13797606741709309460","8282809152614778033","496533105410451812"],["18097992309792879940","10049581641824398747","12138950655661752813","6038908196457571722"],["5813378143415240140","16624145056370594998","2207010758552515852","11692241969143566895"],["2573991070612315155","9603072512812643234","3229302026135664604","11968730082759410891"],["6156331520730942879","2960935221840969754","6254870307013767465","14140484292869953303"],["5182779156874447887","6102537098330122163","17974835604782089738","4457901884019526805"],["6781944709709323056","8285371951633834520","17850281319876477210","193264375248811602"],["2606817759794047006","3671350265308347499","16237839949803105405","2213798930830187515"],["18357355375764469991","10445499259627886619","2338099703353460463","11736772697834938597"],["10748295066249824839","13351328035006347072","16114348180064384506","13560162420664514328"],["13629659985378254966","13590100351762247508","2162575799815422155","10127800496631883310"],["17122460220206071783","12564769359491860020","5270110973730144271","8321565833009507767"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["8223554425914551216","12467552572073180763","412539130103062385","8638887234230085337"],["2465298896041171168","1537986605210433647","11240290589903517256","8509931271047500527"],["18277375443031749496","11436520198554300669","13418581894482290382","5387274956534602157"],["10305861033460714513","5647084822123418603","990261284338973691","16149664264085357897"],["5057646134647626125","4549899923660460488","7879843984279673477","6064419685101666759"],["3952281068638940703","4390705381447915497","11570151776422537451","16296131443931067421"],["7872449052989367371","17726689117672363988","5953813263775283754","8066152785938376128"],["16081382275284059167","8781540261953714175","7831742883380833360","2438324952760311477"],["8646245184675319634","15571818276319109710","1111373944920163517","7276870139962578671"],["893616574084385820","16904390371659768306","13631973912044544522","11037116692869773575"],["16728398968143990984","6625616910278461834","5385177001333314183","6012158024625894219"],["15689180277192214614","8735341980028406525","4707477602816507777","13788962871484169242"],["15956458490237345255","630778417956088461","8755703808770584533","16698545042455233405"],["3504133398272119650","13050583611779498920","10466806596245974812","2678992933416397306"],["7190313059941960243","14832481321287542068","6444587735771247642","5380465646415035962"],["2058989491806562132","6133763020739423292","7990509547661920852","1613981197883466182"],["785904690134488162","5929344153900299994","13523322037615626940","9416282336100783118"],["11359477646958430534","8517033210878698691","15888744712328743090","14868511380136282093"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["17799188791081421738","452028610421870601","1070981173277105432","6176723411186607196"],["5207523570435551196","14746569150408483548","14164262868940467886","5781958146370304286"],["14020912302551483617","3778556673869029935","6414149275121210955","9917298596083918465"],["17809893583057560257","9407621449894162767","2901946326704185071","11386986340919301640"],["12987206656615400967","1103890226789579823","1898218497638789849","13759052424663645929"],["9894906380089421832","9547934219101207102","13125595282540038102","11602217134125966572"],["9661342843803681482","2676784205124512883","1788939220353832546","836413234528265318"],["5124420079065698400","13038434476608519538","15745486428552456402","10898454633432084827"],["6080869853604600049","8989266874208805452","15572685253661922376","16256181802884951291"],["12502178101174600203","12817637233423506120","17286915007592576917","17748750532993830792"],["14888801671075585369","293343450156137151","6976492158412620144","325076920254775361"],["13879682760138693689","8387148428411642094","14834872901511260570","3575961418372088565"],["11189729607448385035","15507674606063529847","4172237172786547219","9513342898700845354"],["9138559974012497092","3830619546948254186","9400034587836733032","12452209586332170233"],["13076178519666613440","6734072269330176761","10911445824056488548","10197191151975023032"],["13540416530737457918","16361656050399763059","4583383302962278917","6063941463483297515"],["2961287060917419697","13288506574335965849","7947004307469308496","3751294754463056118"],["8872652002074183426","17318814729293237782","15242072589434523151","6229326250009233301"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["2352561094863086181","8028161636272726387","13649185709250767550","9106488173231738973"],["16096514791710216574","4157983180468129611","12690761873745686494","4393381687480872218"],["5897295558100384335","90016463415229268","4398403254227992694","6200445758870283016"],["13539639226281594429","9273027020941996080","11030249635795824389","8475599397258605273"],["4396182090016337644","10268748091474563343","3270724213708477077","18336454809490361326"],["10736652364694524918","4363969023473782849","8180853910812605853","14867107484463927769"],["4557626115218918926","12854322331896488030","10845613624465560019","11042855122474515671"],["4066607486005309101","3285086731987187926","9841847682390481410","3194259449231284521"],["7183567593593361284","14548857664334204192","4760567524513746267","13719924166672728334"],["4520719873669761093","4184968596092356069","15829243118908029875","14400923821833105744"],["5243909465490110556","10195842244969712868","2331355148267501482","6743599483388627175"],["3681766986837705405","189975427104045287","16371579358435415193","12318294197273638619"],["2481822382536262318","7374986152044541173","949631839440528604","6032102581042569640"],["15672754310359121261","13094204401584970765","12131349682791449156","5437079615271198094"],["13926639174676215947","9797250415974130160","16869153554734121809","5584784572898897543"],["6874001661812296991","14381828621945793971","11609643286147888044","2732811680283427817"],["2961287060917419697","13288506574335965849","7947004307469308496","3751294754463056118"],["8872652002074183426","17318814729293237782","15242072589434523151","6229326250009233301"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["4026126888315186716","7832351908697814163","6098904599641701428","1506357397542945681"],["632939832170145251","7616683735466490327","12986852893615330404","737445547624339581"],["17757059300148892160","10798276684650120625","42061639680406419","2569652892460117435"],["9860222859836508691","3055920691146139894","3830289805153976272","16237662350600384147"],["10633451182334826619","15951087486517494997","10553296656483937462","1089939586685763709"],["5321166616309305986","11608809817249827343","10894199353078500720","2205059873040313625"],["15994274744870080525","5931400813254281187","17201095429693509620","3267532430780833137"],["16155880474537714580","6322705995042277423","1408790396425121885","8591596971577279204"],["17412915017873545714","15684173185337614131","17490466152115849415","17501597700516186610"],["16366152579475337365","18168680416963570684","15890036883696138287","17000109183694653381"],["3814790045122031270","1584417981243855780","18066624168826523340","11632487926136278577"],["13868337143183852839","5397005806006299552","11883864770925512588","12417935057448635659"],["16810762246676762512","1681785331183499413","5721474979094018781","14361170170058355037"],["7785893841997252415","17990825063446402070","12720392887086398012","10411060393535048779"],["16299387373723048672","4678617626684154818","14747082520015077142","3524239942363569127"],["4631124659430145157","5328584484361959863","13293490676944235082","5056850889983678777"],["7804067743228960354","12729092859301736632","14402344718993673733","3721571896361481707"],["4185192585148032574","3599735040781019179","1981645050124006882","8223695045699085604"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["16176202566865918069","9379751426539319878","14988442377411838502","2612896264033875207"],["11961996764842576489","14820703981976604884","1192543479859150846","6313475037565385181"],["15506874053517259374","1415397956665687987","553998194836589549","14210748345482957592"],["5945244800369266547","11309224788381899667","8090125236304252969","6313941291672403140"],["7650607457220236885","3804173234751181168","6479052682732679243","13599347003413085103"],["13844978436137453585","5017768456009042462","13807957476754208260","18192387946403959471"],["6446378962553710178","11774781823836837771","14568826374023070837","13295347834601981038"],["16039001671560740331","17483124815626264274","12544958432489499183","6796723028477248236"],["15012504352881010341","10005258182602991031","7855060070832106548","10008442831346586033"],["14405421355819534579","17585016462810816383","1953622256943132662","6049662384484124458"],["9285040419215091374","9092593070877617613","17541310170118589906","717200143618162810"],["7551723892521019523","825141365330913671","13208712666765142855","16215895763564505722"],["348120529647321191","5535624949044491909","303531660791158008","3413445871333082670"],["8665389002874148925","3699828762966532740","1097085406136490922","16709084495912879786"],["17337860780936858957","15306372718017806275","3955204923031440255","10965658424054538934"],["4257937842835594161","18117371718950377350","4482568012897376230","15837965626294718951"],["1919984598761041094","13985832954062410251","7158153538361143734","4041630250170872232"],["14173759944723708939","10174679116860132213","3445552952374000047","7037800858817025163"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["13869764264440109654","9891451649627832123","3698338574014439005","13735824931076287090"],["15062217242447661676","1868402436716585404","3040191875528547455","15111510597699604761"],["13988149382412793316","1213976547240508832","10926644617805407785","12407939542177109860"],["16211177999674186913","6967737928280650356","15975462238440127041","6592823345820702933"],["1159037578722818179","7956914575980897168","1412473965175591196","3840925488252126459"],["13259040453564762307","17713356663793916072","7294817888657634916","1542886779768781460"],["5137955115964283472","5784319113179752012","17855837368135825762","10646254731437622899"],["7998045823237865772","2430880836813580225","5059292405441424622","7929031737616336191"],["3051969166798951092","16380389583421762102","5711047335558561777","9584197601600642474"],["13796208106827970548","2926056821508815672","11953577118764666412","8414319766610646186"],["12039950536549816574","472429389828388950","17388855384971127420","2778786588039326503"],["15923148466176442695","5175290105244161231","2314014929398020689","15617591276246680078"],["7386400008129507965","1859739080139523021","1968643955100509553","9653313247743300475"],["13976564952001825948","7197741588406978043","3195062872443920986","16412846228287845322"],["4831810938979899578","14252702377346181492","13865343067618308791","2452831920177697054"],["8028848988322825612","8613433321434884936","12809121495550960688","1503081374719333119"],["10087258416257659676","11444637966051878126","11515692984698400439","6013460576628189146"],["9624654900264346872","17966111329147323705","7916595077761605593","16520899573806914790"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["13853460669405754213","10588712749705831549","12444242918550526634","16003018925672306801"],["3235503400702107643","6641753870723647162","4489120690971452322","18316030226633280947"],["5333429036094582620","2123031945305456116","912972555695828702","14083496779138840475"],["3586163954897231164","80815890013474317","9052793227728964442","3085663577362879899"],["7343719529470404738","817241824671097142","2597410608136304522","1561734791634826286"],["14304447485839725108","9575391893068761950","12467887626234532831","6870835904331124577"],["13903948788033843115","3067071017566328700","9634578323324305375","14947846959575102608"],["5920414359320067947","10131515597254367871","15522311978005278666","11642146848387938242"],["12672472475725103287","10688383524730650054","15639954983524637183","9215017104827426188"],["10172940998830879187","17698539282532673634","16758142722242405642","7501370450388722345"],["8074484450410161467","11275885936398047849","14177349794247352063","18317067883375433708"],["6676631182964714997","1261633147649351017","14518974955038532612","14297429020996429439"],["2313839834845679339","2856486931981179467","11175408665925533926","10159978767516978000"],["3109108151903398919","14550140363724141837","1663394021754629751","17061014184112017221"],["15598463943286507903","8987387064085586027","1136801717249188486","16541208639472780163"],["6647239534895260991","9890590054046248950","12604189911903246408","14484571659316880536"],["10087258416257659676","11444637966051878126","11515692984698400439","6013460576628189146"],["9624654900264346872","17966111329147323705","7916595077761605593","16520899573806914790"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["34409765757266814","15568415203056281012","156956598482844619","13879784403438421984"],["4258140341294570529","233788838846848586","7088802480481407406","17270880820809872246"],["6790413892864721264","9857577779885551215","9474533302090836748","10230580517976416379"],["516698525842320496","12190572362498570485","14771857436843166515","8908822596001013947"],["17605437730063257007","11362424405813035524","7583151104232665684","2159732513758974906"],["10957947638510862432","379302760431714965","9123629545336678676","4116311345983063601"],["13191341728863419721","232787084242363654","2368183752458443866","9286460008153317594"],["2931200434717627338","11508239883787911078","17924973986544872823","7320000116997883739"],["8166998905636059952","17893276904907587500","16416171589997446538","1144717944632592355"],["9040199469590857168","14007833825110483276","7698288455306155765","11471996173029966391"],["10279610158991406622","15709941037117863533","5024348665699595726","9972639424093046334"],["3081766580496712169","11252090383803363085","2021090602911154782","7327466865974392630"],["15995463385869536916","6311296086691328091","7085017066650991298","17858442474298385840"],["3531740396603573503","7557958226946078537","13034264774087932484","1847577816250468355"],["4760505357692088391","4503784690764724456","915209594170908788","10639988551929674389"],["2369239464151966988","7474384237895543268","15144049386667763656","945273586142790539"],["16913643691653516775","12242795915359986339","2889796688069880667","8466845194960484202"],["3119136585879292745","7490131299967649110","828051326070031323","4278610072206702127"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["6107899437821333623","15951229998601223216","870456564103293973","14848382493211734746"],["6456136449539461456","15614451093362648345","6669076607537178531","10203535251793223635"],["13202970519797318713","494388607694361608","16711917311662262685","15385981616724884091"],["5229885790596646324","13658497636178946571","4912151542755571441","15745711890570782195"],["6419564037056364488","3035451238661022558","16068557385812940208","10360135436601719471"],["13181284820982716014","10050431533811220834","3981640116093704685","13487869419050813409"],["5351771809175529619","15466478758070910207","4428928716732157916","7784797288195023232"],["9145312579215183817","17061938869830233077","5577831823474482541","3595604878070758039"],["6491798898609072205","10637092529846477051","8304229442117365167","13529939961076038903"],["14995893073313855562","17822691029554840741","738962226450405918","4120502851991461616"],["3549333685427880047","16452958399752868034","8003080788749011615","5554847716262884503"],["14340248155085503300","13297085240294387594","6765004211860998205","4776139629942790566"],["8184752119420446986","16434371439331270015","6854239518371754338","10965928389056453710"],["7743074281022974191","5320480811299599676","9829779961903346714","9339595098345130490"],["3360091873405404323","8043855496441172128","11901614897686408159","682939627130176706"],["3148574163094703516","11541276290061248349","1166620483661496917","3244136626225612661"],["14154172335363195314","6543087758124510155","1883684516002736252","7322629176782258594"],["3119136585879292745","7490131299967649110","828051326070031323","4278610072206702127"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["9975378966409959789","10614561090108755026","16681751453995627489","11466333094475589501"],["6561109632801575618","6611545174443178114","4943758013909409637","1224025969745927764"],["3189122460192295152","4697249528087557081","10265498551050114329","2833195200924351409"],["12548710727526835180","16832644851471216956","10239139543760947995","8124072779470645691"],["65295970125513253","9872470969313026363","13091318320548921186","6425860625652174793"],["7937934615883933099","3859799787201069868","5804850908029477337","12292271485739783023"],["11602456649766851003","8993403297914375338","16775672954490821258","269958426580294646"],["12189075750380877358","7742293074503143206","1083715570497646534","5663843314414111003"],["8448155832959194694","4814619620130614424","11347217620484450956","595398744727835588"],["14747367828448975374","5137199453395949614","16247210249483597756","10202802631595691863"],["5117964997867906138","15865611549560962444","17652654368052003394","12606243308207889059"],["9978738239084650436","366365873948231729","15882353739961208294","9965774038107192081"],["13548282279696479269","15280840640179723959","1291172486214051506","15478486128527472893"],["5022364156792896272","4109153313108411328","4156334827722607670","5246452523661592236"],["5581342014906738134","1116932802272380043","7535419230024555263","5299140857261870548"],["8061473617255521523","1637388225193435618","7910129703695506967","17167942682784537447"],["996014631096918611","1024408299314328054","15746093871933586905","7054273566851451476"],["4185192585148032574","3599735040781019179","1981645050124006882","8223695045699085604"],["2434184032816965239","5077733403517228989","15356235494221837505","17048466309669323274"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["367706464008303157","2784065815515940556","1908647099101249586","13633082457303803905"],["7510364509867296943","10764734046083788878","4146073189906265442","8759544822252925302"],["3594685752510746083","9885317143881954233","17075166246928645161","5532279943976123072"],["4223838641154593867","4029024748367343411","16010600718605156293","15337057436402503906"],["3659527770278864055","9994689047063848144","13901856606000267730","13011823098329963494"],["16022891005777315420","6781409150040203378","5071091723875122347","4078147926364077652"],["2166287786598438934","298673048577519141","9011695840958942871","8064058242093487326"],["8106025139829794331","16159026243335869090","15407438834662823885","4016191841056150077"],["9860137657634765891","10550924089874233448","9622104756075192662","17689645971177755375"],["1471850064110283863","5233822744289242575","13142821134610282144","6842641056684514062"],["15656007537748430895","15906919424657235130","368769447875575718","14915613449176279677"],["13390308018268357306","2511181469176723736","17514529783337227479","16700699804673081102"],["10264460756962948348","2193508550265718074","1848240214473217584","12125342042227002968"],["8855513499093733915","11219780718924917781","2991291214990547078","1509644261366727331"],["1243776677242101934","17164835022779409652","2695837900855522540","13354338227866457323"],["2736470111914326132","12777468894381323157","660264325114336534","15878989086871222529"],["8895410665619875050","12548430717884663176","624653832735942957","10117580798957429286"],["11359477646958430534","8517033210878698691","15888744712328743090","14868511380136282093"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["11839267801606687403","2350219589549309962","5675144699232233620","273543039748338726"],["5105415278586921690","13085840325613689961","16306400995092883346","9711454048868779853"],["13453455600153338668","16129564317197985008","9245567141954465157","4483456499387828268"],["10543612806118868316","18237919606927211254","18327956452136296737","3390803850768055331"],["14313013204944294298","6406198267558719836","3032729121053191126","9258772125236099186"],["16284937266888866864","15562638234768332241","2109449806786139243","7116660709060525442"],["11086041889011810281","14769204720928362524","8712190384714507448","3150086936995285931"],["1475483520261801080","15988937490925853507","949887903763672507","5165033561483013908"],["5662801346967022880","2673868802327509134","14664296323402804350","8270807476466136170"],["5326776146798457228","11298315665246774131","6270385219108655925","5771644753663731003"],["17723190713049492039","14252844358083332190","7026902183047766131","13126240194491162620"],["18087613090797275089","12456368930907925911","438399409302069088","10180087149927978432"],["14332420599818487870","13716612434366164479","4915747806059205732","13463376878724210680"],["14483218824721008229","12847105779699304560","12158150598800068716","17523824069681643002"],["14043343865133487541","14852781510817452538","2972071242263523462","17947103710401878291"],["5471958227388468300","14480252247004429815","14909551538314748660","8443809170844949021"],["785904690134488162","5929344153900299994","13523322037615626940","9416282336100783118"],["11359477646958430534","8517033210878698691","15888744712328743090","14868511380136282093"],["9714392585160633691","628099318373216631","15508546966858831016","10921957958787355805"],["5864292201423913800","13542170798502076378","11513334765398452469","11621795457902766540"]],[["1182362073917280045","14561703602831284440","981899234681046584","11290984692923257176"],["609572020352091980","4311230084322551990","5762720592013138978","6486195161657651983"],["3129618123417214791","17630067490255573797","10267085445452065697","12335461220564594658"],["1189764988217142","8377357492476826803","5589085154626227575","12576235693312252647"],["3333766072459120424","2614539383664750798","2929985407611519680","9938989586480632188"],["13462866885044857942","17892224217511895831","3314373256948287319","4376701524420122891"],["12740185442238057760","16888354665704585889","7649865196612510581","13929779767255915974"],["4663055896016270975","17487985271791910717","5692032133376344593","16303059774434126337"],["11238843489688587935","14696042862721638279","5568792633160072825","995855503389297177"],["16422238030707154573","9332946789353345413","17764179753722918483","3092070269876902697"],["4616797694484383062","13580399471364500149","14270939976795181042","6305861217068426877"],["17667188319976369484","18073807847241940447","17831520005203381455","14020123914038046743"],["13806917801899261041","4004744657387210403","11686002329130452683","809326646489062220"],["10496962959007952995","17231476586062456314","7597490937284233840","15343340983600985836"],["2606817759794047006","3671350265308347499","16237839949803105405","2213798930830187515"],["18357355375764469991","10445499259627886619","2338099703353460463","11736772697834938597"],["10748295066249824839","13351328035006347072","16114348180064384506","13560162420664514328"],["13629659985378254966","13590100351762247508","2162575799815422155","10127800496631883310"],["17122460220206071783","12564769359491860020","5270110973730144271","8321565833009507767"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]],[["13045100449896552807","14727964788378318686","2946400991868464455","15634439495135972611"],["13682717481807180839","3197110998569456889","87828847810783233","7496794996327933356"],["8802683473371483802","16675296142623070044","5092770889631343952","506143888491439825"],["5962093952835320700","16897112444020215717","14340718768103579605","4933870956595655993"],["2330847331074272158","14982074726874901862","4082599934497799941","1135026141379774230"],["3181733391570861242","12021609415554012929","12863314389170295993","5573061058416302195"],["14572076527586687966","4210764378085936096","909996050788214490","1390232754187962697"],["1971872173479194450","3078241977440258012","14264256374170853866","12929029561033780666"],["10423712275726817171","5689565082373347533","13877337239073892223","9856204802902339413"],["5686743280750483676","13430561493253719295","4714950513406003638","10065802686681910247"],["1076009252815169530","14660251292215896666","6553143214597925948","12309725676881441408"],["7076763466837995224","10290483499341431419","12490099459763343685","9723866918001796486"],["6067115005788883756","13484861934231629811","5487848718418385332","14734394886894981094"],["9760325606302736581","144123890035501898","7591754029305709637","458395024341544003"],["9722964124440457625","11422056023434675328","241509422855520433","446165900167833033"],["4377682174139124305","16788564585086899803","3893506525196528119","2941387207603725765"],["4386483632152814671","11117556894630963127","11848991596684944789","5239038884843774122"],["8872652002074183426","17318814729293237782","15242072589434523151","6229326250009233301"],["8687544045691662470","5643134922972964514","10473312008752063000","103437434377244341"],["6743166367176045080","5924839292179976717","10925984292178644170","17370151498654619569"]]],"s0_siblingsC":[[["17391626271799447788","12185554943084587236","10702839068915484720","6822880520559742431"],["6432682865723910811","8479967424984668855","4414858037274203898","17206572264220759912"],["4157514665682502501","18354190491453283076","9307163399217512025","17294630702434960824"],["11925836573372008444","12664193147300067345","15185207981864543919","890219118576309558"],["11806240718516052744","17405240796356080035","17796521330581117781","8588350224749314942"],["11157222071314259237","17127165767547799826","3656355399626402616","17959818682906711138"],["1681758855970840976","6980773368707616494","911085613121111195","1880927602139084126"],["17636117191750052829","6138667614529701798","10738790605390626097","17087601288727607096"],["16639544254673402271","4085193922451592381","2611684795209035935","3773125936618515686"],["10617732052350639076","3070373942621273689","16199622466299285534","18338806088943391490"],["6571215203753502189","17038900894441665146","2434081839268719145","4919622385195592089"],["18371488969736579567","3968357646639294767","12013693554087591610","8517061644538084211"],["12808871011841648217","18127594890518280897","10822771302784768953","17517178896118242921"],["17670741666062774311","16643700802079469384","6307835152049706815","11076070428862772810"],["18442753413997091329","11078396506290018863","14754878739457053505","14311492571136666020"],["6775248609466444160","12442777071342522240","13361447808815528497","18247472270039453264"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["17550716060450901601","8713484909919629063","11304304134138550716","16607531762300892347"],["8385337274571438619","10626991079891263458","2514116212643743187","5766620559378332523"],["8265169970453894868","1893772437595085847","898152921508973762","12758083015437341815"],["1131990836152188483","13776109092166074443","7048675994027973176","18001591414441005548"],["3172855746652489353","3868269616393580102","2887696243355165063","16547993767626216161"],["17890833013512866129","5872230826568419271","13020104731896348440","14154901603167923118"],["11442083276727316435","8996128508158978620","15971835483422904219","4957747124046912434"],["16348800504792752025","2380893463234945174","17810544578475205360","3667854144159748146"],["10193602512664076245","11911886936538974973","6489723789659123437","7596353160916018167"],["16717117780502563180","8154665694512607271","15726137604944305129","3807560941824963868"],["10348832872124339987","12125432854033604984","5504676609390384912","13214990314464413100"],["2638121833956743872","3064568982189364510","10107632089157117161","15691529220360500163"],["11798789379196796794","5636943937681156640","3680983356555545978","7195603393587455922"],["1265369673081243416","13951239768972501167","3114443297743569878","541177053337379829"],["10526101454538903304","5211596789505011872","11862554111339859747","7865850584889047681"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["8382160678772143791","5646954803573658759","1099082229535195301","4673426239196080781"],["8837993408129678116","15868461259415720007","17680640506478112618","2081452472699668027"],["2629229336803625823","7118766876160740769","13417038648459427123","2543824260918670156"],["12311754877842471357","9874166789191849776","1636831420622486833","6128182591456890824"],["4519171316693331505","13104635860118376913","537028847604983881","13894008013031926790"],["10733699156567047608","7090673498526464994","12501350367500802986","4000694277667948128"],["427871996544554623","6691747106489855214","1617477935656605329","15263566717886223190"],["13965804832535792751","2749521934517765810","11627930511317067492","16671507909172532080"],["8601471331887427147","10324475120753954378","8638421483972622441","4776743410659873900"],["15253594818846308697","4574027078528941930","3130237448443764718","3521943493262957768"],["11800392056231518956","14910251428593711028","14539317441146273659","13772275636985158040"],["12015065351899571049","11209300251107764601","7083357815251933517","13048690512911980751"],["5957372500811724146","15491018026768769020","1859925419648581574","2167827620861879295"],["11836778262823334623","3486520833702784010","13903693546449080290","12347821730461228913"],["976408255402963871","10391154938601194912","8089522551291878089","15147080784074376526"],["8280812836316470731","525459528857064349","1224234600473223565","11407072143640540358"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["1461534390516096584","4089528006137555216","5322040473455079858","4454019616119610950"],["3724186892234074392","10715480408451979012","4625549161869740033","9306990083516189058"],["1267696217815040416","13436222956857381605","1694398468977833139","4654665608394542933"],["14314208877258041418","9625749645922905818","2725859810575418956","12926609706560318169"],["2607661361020979737","2554299721324619598","14566480565298408771","12008023713386718722"],["12242103317560306190","12140143105217714616","10976586716740838985","17899930738794094044"],["3142251952509847606","15464274055232858140","7282341942568352575","895876866743193734"],["6041507285042882669","11990275381150745066","3173955429802290083","12603079817150246775"],["1117311425511491039","17780751440657198149","11779887376580851848","13290560916676644196"],["5259673714861987004","11020737574217283614","18357468253793533896","5975488174872619454"],["527947843061015771","1966597448824751440","253065401308596161","7439212496706669614"],["15048186307789334682","8245352357964376239","17852875772325955958","5870946966449391881"],["2888613486373276378","16925367086728442753","16431182449665372409","3057976860470098966"],["18227111296662266545","13506785159277849045","3146045382732828264","6234377357882133062"],["6595841642477281636","12299002353628461706","3999284933147074647","842762483325550889"],["2295625485825794318","8607687931973758502","9866631591926537178","5962316801069057777"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["870319262325435272","9106543094348387743","10882956180815875987","5579351028711563258"],["3799222738084838638","12053687715907917337","11687652360502519650","13399866876204947048"],["2912859456587091392","9494458858692694151","15427123474180862692","17726275105930142285"],["9542054756992381337","8022278457253331394","1247464466926168364","1072214080280264802"],["15665862483819867935","1910196816540124688","16557681448603112677","15720078891096097034"],["8253609429017853839","13484523578013817396","14102866383976186662","4578042247711752785"],["11415176533703525835","12548186372259458741","12740066663663999333","13731408937981439052"],["9348551797220069973","11251965769246959637","2175519148345765527","18430810239996020587"],["3570817568140634322","11349932887476754374","1866333766616878547","8913988454562944550"],["10401093041326742161","17732078759304083321","14961217264163722471","1867073661742090051"],["5656074488780384953","17239452390325533372","14704574557832523805","9581587849615704978"],["233936749703037540","8011853592027649380","277173798425372861","2559375125025065537"],["366419662561358185","10015589248852247660","4782794112878039450","4310240479764902514"],["11396317013495698252","16822786171480234151","1837468165041187475","80449943149855381"],["15341451037994247477","14318485947275727412","11528373332288582141","17694555396561992896"],["8671292656581937219","606088484593897193","9580416314639011041","2510868533830991207"],["2192928023062863610","16866694036386262182","17293519033221418220","3712372753953897681"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["2339387890584746876","6024430230856724171","456747305406245290","17948871904487572749"],["1944078227843562718","206819647636791867","10428000324982759331","9078550070633947823"],["11347982683157853126","9703494438703270185","13729497045493962522","17703312295943324424"],["3635287435941033229","4475808900749805467","3869377013239196618","6463348673103997218"],["18336869295807822447","2394333156846819050","8111195202990895758","6554504889802745972"],["1588499504568895961","5419404956461657046","16504557728269641145","6590236030763569850"],["2812366803442036655","12292069815546488401","16671674338005369612","5425038113363018462"],["1848100043199664000","18337827436779074467","14940284541161401984","12157486256520073418"],["4859033330686492175","16009087978467448688","8631885769462880296","8666585665582166642"],["5582679663410133891","4077575943709092159","2838555854529854535","18212900923921407281"],["15485240441278622112","14953982527547405661","15921082895436714162","5005322926509956189"],["5351185677086027908","15529307182518970242","5894902459184492745","3693560941531263390"],["12610581772506647711","3161773711451622047","832150289507002849","8037154069960974258"],["11207974022270202604","9161989558583895299","6605638310806213826","6419623511627585034"],["14229634131244634078","8499387728773253050","6742680990084762073","13105445553539953717"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["10465920908010749812","13459840936132138411","17783787640653015437","11912875784552348807"],["4168172936106099775","5380965899443332491","2375803550095622777","16726745280171227821"],["6094143304964919675","8435973802695454987","10642145105263483359","10052259576929738541"],["8375341579163409503","946611196223490701","1963894938450570290","9751474556927082425"],["14591754667884333915","10456715132541540543","1129640919715216385","2502921041785314708"],["12638998008256898152","2246357206382866627","6409001815241896217","15420426413136255713"],["17709925247837663359","9417176035000411796","1352466087855669050","15364315379694478318"],["15442462036130363974","8876972348964483308","5698107087265967200","14281130929681847841"],["4563437917249819513","14054043602350111395","11667460095050819315","4140020706473574549"],["9337045703578621524","11597774909912762655","12380481115423357522","3227135364717034318"],["17223174193823991114","10811478800640524891","17041019475049901810","1077081184260374211"],["13696019478995235388","10317238963954727395","6712010517297501698","17581964354067899958"],["7759946857238350168","13344334147068919915","15955759428259039719","4641288900373003736"],["11001784005184561078","7898011166358098383","11374527884404001423","13907525617231319002"],["14657465395149917743","8595275927125344028","13396825682857237851","6949152477309874846"],["71480934665987796","14923658959496530109","2716278954273736787","7178433557381053809"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["9891740066537491366","3014466079116063036","16864853644483294297","10240151221432093151"],["11034190722302798946","5546592502019798486","8160887203248836948","11937811366067177349"],["16530239293718833110","6675649493704947845","18159989596060212557","16010160272509561333"],["12167527046577013279","11438978173938608910","1664539817803104124","5097345687124699597"],["15746240529208435644","4627841400911773261","16813184380866065725","11551526571202091032"],["17303594461563526659","11677070971057120651","11642075442975408","540156473204913562"],["14548782345669340856","858375725752914283","12889949923293037768","12149980829952213825"],["8722946423154839646","7388295472464388436","18118126789791206713","13606556225542360797"],["15976382199821292998","8167472290254721197","18338131276647830082","16670069297739397532"],["4248713708726838352","14198897491428151643","16316497729537472156","8034356232351045816"],["9142922896198098512","188288891506568638","1831333216093797431","10872744257402591842"],["7220440654576212446","7746817504499139264","18296710326723973232","16377860864901291007"],["17909200417644115831","16049626557126864010","14953709265310154016","11112311437397033481"],["2437624690343502159","11309835629431718403","5520688360056434567","14041760041122251978"],["1326685953664694256","3109332314831955520","11392699433477899227","9725295333074540145"],["277638638648574701","9583542301685115269","12371050104027221794","11061520894606344142"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["3766150056967670120","1149587906510360340","1148165820531126501","10328624600837124511"],["14565240848380707084","16424244332118338782","2329849421253367797","8162365848498152873"],["9232841172111110965","8420629100837939481","14728429644895743118","16712605962524735289"],["5827872908029730453","6969986748670751990","13864110239843545554","10421628998823242557"],["8483193172551678337","14107062341348465544","12492106642682119309","11975770498207067018"],["3114506211604855842","13496387529489197824","16772073790713553550","14409858810121040440"],["3659355095006212001","9968493820564693754","16927293267805929518","13843399467504236841"],["16391365927677552061","10630248678745573073","14560285795077891794","11280723282171423690"],["16374184974491659470","14380617045438844531","7209802991766133829","9911799619520301948"],["11108103878449093270","12821345234803881768","17583636464375255266","12447489579758872244"],["10961585901743003475","4139162939239395807","14502397263472620672","15497177286661228809"],["9087709086209987409","15325428885259924180","13291440867800473967","3169184626532604129"],["2940155777156003353","7680129682812211304","2041778393540674689","6079161694568099944"],["17855238883771312742","1529784305523954141","17773837241700053256","1316408627920648816"],["8588415995626781298","8734196427847099814","5050072335024715544","10193630682321730731"],["8671292656581937219","606088484593897193","9580416314639011041","2510868533830991207"],["2192928023062863610","16866694036386262182","17293519033221418220","3712372753953897681"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["16782803654812030764","17477732154307077718","15667705657679689031","2593877709118618684"],["17130575501600309147","15149672225664134324","15657914582123836555","12679579267857882604"],["13132207245385538887","1824630210513003556","15436705652413052349","1693532020250544977"],["10423233377556627638","14766172269533069082","13567096303650512629","12353970873740186830"],["7728871740368387674","18318318583834860796","7238301291180456785","14793396118604453686"],["10265406843106622692","14975736216247028202","10195561119726353816","17963734447076570055"],["16457502215312947394","14307128355282840046","2340562791265393206","17846218752063015327"],["1175723071513492730","13635173483134939417","11939588209408273847","7878408018758913770"],["2688764222301865367","16600588657290259862","4832877809598601438","12729501341693335916"],["2939442315588063833","11793479796074525448","16206830948328336673","9391682688631984013"],["16291276320583397231","7589463479061656665","763690612899739922","8745248780512432181"],["1114688100666584564","12813433325447848265","3341475118447239259","13751703964735720424"],["16325369729625157368","17644035459953488930","12378311393689002625","2492237466687914400"],["2544056665464517544","2411414607359057611","8369679784364164707","12048492323617851104"],["5741448719481678020","2080804365454853498","8246410138661681207","11965280283095628572"],["14787007877581615636","15497199559521197543","15420379068093430234","12646210699290383443"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["1190806509990807081","11533509496032736676","12676904830439567210","11000582741510426994"],["8666559456593433664","9318514751815622012","2983740040160106572","12547896604033905948"],["3716590609284623995","8499707594345134617","1821200045121670842","17279208240057882658"],["3327367414936079198","7539581462218818968","13599894583065305171","7417847218805300871"],["13616298707852124504","5696277185604335165","13576452094236902760","8356891064064375405"],["3282443194583589038","3842680803812549166","5364222024217504910","10494320256073042214"],["7506705038956583258","10516306091557967058","17491282666842863482","10072514788527945224"],["562404348700942029","8469752657999924080","5326528468614648269","15341172000745319697"],["5389310638799015128","5293391164781657143","1470292585031234560","4002370867050463575"],["16924952928825505653","18342280069493082252","6983271383042117441","1868147014914647928"],["17487853971858754435","1826608735187587897","28256475887733495","11483771164460810500"],["7894352545218533499","14853291199039838679","12654066705693862837","3535873246008065244"],["13876899063176707811","1830339712787786534","8236887326470485670","8254538799480726136"],["6725788998800925038","15245475285825864864","13220173483521043186","7799072038566956613"],["10690422282318651577","149345473868599645","3800852117902814100","16999480973903374730"],["3038917912068403135","13310620530998927504","2673730055619194553","13721321182010067542"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["3354028150328613636","8133155779912862279","14258834292370160590","17601236992466538323"],["13276421600288662467","7596966716729940126","854683286414128574","16595464193916759649"],["9400662076838534989","9553191758749470556","14650653849206748957","6777297011635286068"],["12913258087825964707","14269951632699937137","14038276599711743547","16981116881385782469"],["3792261658315682904","8502983386412962933","829962832625837956","3026961699498730818"],["3975169699683667017","2671181895836750118","10334259944038253463","15643175903751146679"],["9831268352148860588","678572214245485470","908718525588782445","10593778782146828058"],["16360953486245124280","1819656966781323124","6206526703438235329","18399188811228091561"],["12376273064351582774","7952562766620030516","1571641773746622090","17778498992248848519"],["8331840778985128686","13377053119504276222","7326018873478589187","10039054549993379089"],["9756909034649946642","6477206575032900854","17041279049792489022","3518815991412632820"],["18058954448094336759","4545428758070247982","6543344989533542702","9958048587442431354"],["9071520607011518968","17639531854513162945","5885508653051986847","16795213169527515269"],["5379624921142009188","4118201108933018942","2911365268419707597","6154550372664049759"],["8012788336744037940","10473019609825172224","15283840956305007116","1731319719417331402"],["11477233345027020212","14832645080858559662","2867355695204893483","166496565302566572"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["17019709524656406515","18060501706441609780","8023811043840107","5763840834128095991"],["10089257526684128861","11211361524359951168","9182418890707671887","13242802672905810434"],["7665825052720027196","4101720397270081541","11150516535397760998","16018602948611146887"],["9798286797411888007","870812440201335678","12786689915173524970","9235252025870177972"],["448201427636596521","9386718018172011039","5621680290694939296","13968240562944050913"],["3969312511704805303","8665063277832967782","14948053690822436669","17976216149815120416"],["6383875127661890000","18436438021462322129","8193917962150799947","1064788501624978142"],["3962004436478377707","10053763683036218656","18308716754716277731","3193357020284875190"],["1207251241571834512","4366371474703938768","18417040551022538679","13468665217353412668"],["11774520079102195817","7707738845857178087","9491264815507897183","96541590713616100"],["8295195472186436428","15332871379816366539","10231698327120847680","9348257867218400432"],["906426135548537996","3013810662535262788","4521797905928638743","1136095157526065403"],["6921274125031229569","4860762750383575850","5992181962419199768","251161024664989166"],["18155842921315239731","6675968886433298327","3648475159210364473","17837163654854965185"],["4403802434878831881","5422227429683284445","9751218811148880421","14136944576102627412"],["7635239324268522224","3644193782740922068","3770420575850254882","8967097228445315688"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["7780164090844016053","3197049838174393819","16103563848853627693","10396226878467388494"],["13866009510259911783","15237466197684989219","4188921399719550383","12392113772085768688"],["1297468157432690322","9506734786895111058","5987961932122860887","3787857308188168015"],["15053840157178693943","8667721658512014620","6289044539372418752","17691516211577332670"],["3392857589090875240","348165243410233546","4768155634296465197","1581822008809558117"],["6621918348653520493","17261069458282060136","18294499814942468300","9377908605551503511"],["3022737160999901332","1864535143389952085","4306875278968365420","8716416661515248182"],["17194852040520371850","12363118185151176254","2150903044568431889","14376305416557654127"],["6563926991238358175","16269696833632351558","4742998231131725393","743898929789222267"],["8049939875143126282","8197239188928632826","15723858099674469055","8369497114020431091"],["6987411244842428481","14600544328677345553","1122778078415851557","892220770774258181"],["9613170371486575876","435329863654100012","15697538961631495374","2862760159756714816"],["12784673079514971632","6115918692925340828","8652488344423509681","8184477049779233898"],["3521872841605428972","9047840043272709150","3201299558376722894","15539753583346570860"],["15504457575091738281","15676410867711816187","16072986184677012431","13901222333501322658"],["71480934665987796","14923658959496530109","2716278954273736787","7178433557381053809"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["8221612253700325719","15303644841170581282","12447897689598382491","14697425834394066590"],["13843468901493043834","573634656254451851","18436964635827525574","5348137446304959778"],["16815039942059395206","1368434787136401793","888769048031609788","6978579719887414099"],["15845494992344184860","10313310644125551915","1315014687785440175","3106819153361805882"],["1424711707350081093","9918680236644566951","1007183998779616781","18062238837104291059"],["18181417894598184497","2986232337048513528","13164166128053541327","8783463039032516407"],["3574645380209802570","1693217620080608516","8900332389227258130","233562490135960531"],["1023006020389551379","13941806620851450665","17964210263935503856","11296488575550893445"],["2284448654331131291","1508118798706598263","2205472942907501556","13740780761221529585"],["12218387134801019303","17398906343397184512","16900464196410733266","17950102092061873102"],["12243677966025073884","1117034593803953269","6268967714481202872","4670381621231685253"],["14309652686392815199","5162923804120758564","6176758788851104109","1090093144550338004"],["12885221535114406084","15386471677844549416","10085508994320801900","15885398964006826155"],["10878811227917652293","6619078104383192358","15087730388383161881","6411636639306841480"],["10298092242833800046","3618355271443967055","2885151639013239879","6916777966157639616"],["1835391189247437086","14546475408653048693","7945598013241966860","12707689623850437143"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["11150292891898105328","3038941129019060218","14435183143476789926","4540961412500536172"],["10727486291657932543","7899710360387698390","14623370499190144309","8218399668225988660"],["13649663893534652998","9752151754256399410","16257650425957134674","5246594968983696030"],["11849790544200996455","471581118171108937","7679224991127406262","3159470353982540500"],["5441950796853289459","10314021349992057156","17182365101332510187","9405304210955140383"],["8938580540973051001","833649035071366012","11702814686014138885","12401743044357279461"],["9697905930298588124","3308032146475691536","7894417958366706484","5814151964766488169"],["12495922166168580315","1638682011737260964","17999788556922178501","2961040110640833799"],["6303112017195231419","18202216309889193749","2591432720246046773","16725603534530100917"],["11644978143006870082","17320354271963363941","9042569339123354044","2166059348932941941"],["15482565705903563187","6806785644701608601","12869902683424304902","5515355590852568036"],["11359428253809639385","17370450227981746460","4488973683192929478","17506593134858578727"],["12826962628672402644","73773197104894232","15005970356811188028","15861534221718502733"],["10077815352819429974","1289269653790977712","16570401684760160120","6404948422184701803"],["17387715544615760989","743897265308520935","1602365932922715952","13150001061730498685"],["16851441821542322631","15755284669326269373","2965024818679882961","13508627732479942279"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["9169377980218897745","16773085283760518990","8697436676502139328","3433416941447971779"],["16810417259957449938","9447628141349084519","17104831143743317350","17339354817496435761"],["11463184888142499365","11870491772735522962","39372386864677402","855463058543658110"],["10049233094180002476","3696280926897240724","5697947315305274252","1733777736232447922"],["10208938558891703454","15300602775783494472","12504289813352905812","8770325668723417282"],["14699739175625318965","634287074594731920","7353746143188668157","5519640498262175275"],["10444609375146669823","4449832566015210269","13159084469114162782","953087548598699125"],["15456266283146919231","16632149312028417353","8895799808499513541","723142694531533307"],["2611881838468485265","15306673548252542203","12641969488580136400","10654674983925526836"],["4131949935286366038","228521701243047367","10564193771618625850","10888351048451186825"],["7045405947850767658","13889716677437037889","13337472553309601957","3576873841953278773"],["16789037552063318178","5454011988302843175","15441306965024368409","17194256243901383338"],["5839257437079854080","8123105674088484438","3124237801695930648","14923768427908799246"],["13300364744000111854","10077841917041013644","12912639979234144816","17552612679448460832"],["6273897594145983808","3048017189743975810","3447251849551019225","8151067508856838492"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["87874626823467018","9013078872375286200","12627625534502583270","2633954122759763133"],["6364210745901156836","17738289307041133311","12920061004312530642","486019179132163329"],["18379609596110829321","11452541825481304180","13824707967650348768","17921472370729680828"],["12912755250006071168","11841599271184693675","17301436886521743734","15355435781718722037"],["6889692248393155577","380412456389922773","4359761693754101719","14276309850999090335"],["16920456174991644565","464879173040947761","4563789176076465652","6416028708404060085"],["3087166080422356079","7047952994190654986","2664247441691517873","14650873992062505896"],["10192457363976534850","14183284152961955623","7006943249753924621","14285700558999880397"],["6669926684957926861","2037166083862710892","279058415110755282","8215353130675736426"],["15541504976816568372","10161410671307033509","18046272643680589773","9371353129632148490"],["18348935026106950555","14900372859655176957","8673102266822551101","7169763842005477988"],["11921044498760055570","2225249648125012560","13119086825120596855","2080926845859873887"],["8363045786576898037","4947676552772976314","13274651054928267814","17748382575668547317"],["11252573289981114496","11220662612183556067","8538555163456517029","11045816089643375591"],["8790651809719863585","12665664382608069520","16450868780220168120","9790792431970747567"],["13165348161613917386","14267220877698647908","6367680899510308139","6588464893904805809"],["2192928023062863610","16866694036386262182","17293519033221418220","3712372753953897681"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["12905655937073562827","11674541616244947516","3270468183962805786","14048843732741881515"],["4429655646718985515","7811840718580337147","18232186479508252703","3459283011491047082"],["9438612952994694704","12537079065889657966","8048904397078932689","12060731345588642709"],["6792224927107377457","2609248611797210802","5458788394618418334","14128847588724817804"],["6680706276287362670","265409804376866518","10373993981451592156","10506063904045752692"],["17120671450402023354","4825916633181897044","10108641183757735240","15381036232819002179"],["15901705581662072444","6469649485275155781","5421609344703574433","7837771785928880226"],["432127746499245235","11033057182807840538","16209538735611956593","18304178155340298525"],["17890017205656729279","18250784220264038536","10970744254471189302","16438836652785274624"],["5052178743218188453","5699872308938640330","11482927722608980063","6348140872415401535"],["11760307174496084193","1416216721248285055","14903646804356086782","767107034418215302"],["15349387701032619957","3863348301082622517","16997441363159545552","2414755079751365474"],["4457070201000365296","2648656939269811682","10952919165823356884","468078083682691242"],["12754063013263229805","1671086844303678030","13653866830773686061","12587352829167713901"],["8213826642880230310","5380257643276080836","12312253082579889005","14220840311348412999"],["6055050752109810422","2788675667959777030","5974438939114923057","5513565242794582938"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["6526152278263992943","9027117145975908575","9552531719493440467","13628148226698997266"],["6266037051411974457","14496032543785487494","15511488884050482213","5355470210243896394"],["6253869477085637324","9085307425658072274","7884817141785899988","1596223195374746170"],["10407020227252753127","17583450385616312036","6385223880150176015","7937669897547368758"],["11741831667409189461","16251947520670862951","5852264803747514235","15765629374753459761"],["17186204883477526483","17073371748555803000","8288897174609494576","2079859354126961123"],["16223105095222638706","16000796377792642117","519848519267873872","13691644198665042950"],["7021512660930721983","18118694295894851226","15137555203047937076","5188334478507319992"],["14273758004594842417","5517542666378004409","3362558382642113099","3437673673201863118"],["1434735092935412414","13567198964714120315","5986847281347676172","18401231801750973380"],["14794513305576409995","10731332112283987975","3694488910795678770","16759284890320897096"],["10906777681489772942","11844047394093884034","12957664803413537953","748770587345428272"],["12826962628672402644","73773197104894232","15005970356811188028","15861534221718502733"],["10077815352819429974","1289269653790977712","16570401684760160120","6404948422184701803"],["17387715544615760989","743897265308520935","1602365932922715952","13150001061730498685"],["16851441821542322631","15755284669326269373","2965024818679882961","13508627732479942279"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["9750528783117174970","10629520165612878980","7855586397748775345","8437075770904361712"],["8182847156655089843","9663555220161612881","6233131493807841353","2095454422255130198"],["11364224742916488570","3456075587406006833","4890223840968839810","16208760656662787863"],["16818581265150774088","13070086305163794670","5957380781545845289","5818697327274142506"],["1364215188743339660","8091803030668331313","13162497418646257913","17887376384295311121"],["695674718233303948","13856811390362605052","4280764153094548667","10626751956633436016"],["1600693798801982359","13680886636447553433","18356461470506156025","17463064840808730269"],["5676669227414295997","3912165908500173384","15742263774545245139","13809435280809840157"],["1690236551966807261","14074560215261663985","13251582802481208570","10638997180797138248"],["43103174337891350","13538232882039984700","14858354979998982054","13061973863171530893"],["13075760295826685596","5075293931676198284","2338007899347911397","12224242388441604161"],["14323050427950377180","16433909342335974888","5731882963896426482","16287403088177221047"],["5134725990254210094","16533927263672883945","12352221862132297144","14126132099768639067"],["10425023106948491534","18059424443565676313","861048320453331784","9025578293050816261"],["2621458800350074889","5402288709920949641","18429361494662853401","10216419506251613701"],["277638638648574701","9583542301685115269","12371050104027221794","11061520894606344142"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["9261062686764178525","18266171154921390050","3746909828300347875","16509740430254801574"],["4683666904036595413","14366738658736600309","9709391645437127097","17805631420950237275"],["4088462763425327113","9137228033992422540","17976875067904490857","14305653721669497942"],["15383314755411421482","18271983491430064786","7311535366032860907","16962299993707822075"],["15880758448800968099","7034358264279315457","4639395045858226715","17763908217089376358"],["15927715337810798040","3906896020625716338","13633653063215497144","7273884444637927144"],["8342846879112208000","4885345498950578809","2420902137567558360","10032319803837391182"],["11425069229570270431","8734690403744185918","7609472708216706025","23471361295406554"],["11871516215489112406","7692560704523060698","6163603351834249148","1857603276414910303"],["11587326347923427110","11838591852494785257","11308968933372500915","16938632003846123677"],["16238899153911230058","9049635128241963950","13494275521738028975","13011565850086632811"],["4539994504960477200","1470206829465521307","6789571285364330194","8276722145386033299"],["12885221535114406084","15386471677844549416","10085508994320801900","15885398964006826155"],["10878811227917652293","6619078104383192358","15087730388383161881","6411636639306841480"],["10298092242833800046","3618355271443967055","2885151639013239879","6916777966157639616"],["1835391189247437086","14546475408653048693","7945598013241966860","12707689623850437143"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["3633742495049841973","1466758515042984818","11953872152076891228","9219739148870880608"],["4068526441755000002","4770425849820358983","13636999513834525407","825452653156882246"],["11826089349362280005","9891744776857384659","17495906704798922036","13320870621706287925"],["17567285190212586788","17045298835559249654","8842189263055634320","4786555560318881739"],["14659015243998380027","1182906147671813436","951521871447916983","16347403457410036766"],["15679851965108882712","15649456576348357189","5703530034893312366","18308939415818191457"],["17109073416428680581","10302414151918548736","6178788876288631011","5138340442182409955"],["15627595346371542235","5542655077179691251","1133161763857230109","18320028152013223355"],["7882343406825610943","15906714039357911151","9151277724681782874","14717742936457961992"],["7281385628907770270","9158633771837032388","16344927585816558848","1512253542071518298"],["527947843061015771","1966597448824751440","253065401308596161","7439212496706669614"],["15048186307789334682","8245352357964376239","17852875772325955958","5870946966449391881"],["2888613486373276378","16925367086728442753","16431182449665372409","3057976860470098966"],["18227111296662266545","13506785159277849045","3146045382732828264","6234377357882133062"],["6595841642477281636","12299002353628461706","3999284933147074647","842762483325550889"],["2295625485825794318","8607687931973758502","9866631591926537178","5962316801069057777"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["17333478601994007625","10425804048710669723","11115130764256557025","17907116013391751877"],["14026725796600593062","3672347892437880024","11837342875605182901","10649301443691967728"],["14305577252369290359","3359947122580023743","6776807459167342870","17397809930347224014"],["3215032955947577244","7254840615464514448","4553023151715733665","9307986943261768279"],["961797964619617464","16754702765289672919","8147572498790279975","11998625053414479974"],["6678707132087495765","13961515054834145076","3981115664894389336","15621564524676488051"],["7080565652998229259","13882856360243649497","1579280214599660914","845325895171889557"],["5304764792833904104","3990216207963313400","434670715373327706","8561710321851974787"],["10468697707473389789","2203944738153179204","8520878351248027866","3558625118276720267"],["8993800942858647722","1502526480949396560","14319202108965937006","10682931096910479630"],["8622038034679804540","13235881622140296811","5291768980190212896","2671646185814776593"],["11795025181481571363","17538808863072177110","2049334338084875294","4879232601769002414"],["674305716346683862","4474257366070021446","11595094077397661324","7228133143044955146"],["3653078621938644825","8265117845559842949","1666743035186547528","5628709764174838719"],["976408255402963871","10391154938601194912","8089522551291878089","15147080784074376526"],["8280812836316470731","525459528857064349","1224234600473223565","11407072143640540358"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13283407482387615218","16714835274666623497","4419705153367871312","9002777483430339762"],["5704474113094433581","734066846566062894","9318005169647703639","11597280104873790396"],["9968082162985337919","3994421779534662158","900636313292421659","18115678518562583639"],["1149151639913992652","7649490637446688079","3137401380609855843","10713928583688752936"],["11622014749363101369","17143952664605843344","1095704762916460085","15492975450267906808"],["13340787874792200702","16499503720309793127","13649634837341342021","4463113097395862482"],["1322200257612746358","3006807023372194173","15805204521458646833","13434000964321942800"],["366168482240021517","3465934805237897893","16461920494535112905","3867942339738301486"],["16967035914381323576","13331236987252130043","15256301528481756655","15860194243347211182"],["13116671357784509651","4558000456429970063","9922126048604860796","13445773021257118852"],["6957175989760700387","332548500980774500","14573877160064748612","2908565617958629799"],["113366078516227885","18047440724956888293","343478188487666403","10589083870953286416"],["13130644991337814790","2513557577211828224","2788799724917991078","12485740387770211602"],["15441411147548547675","8158161385996003379","8230576474624409076","12047447596173777149"],["13909570486439425283","16721948597343436598","10389351594605360728","11587248071745754468"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["10821661132794168570","3560558363816490212","15431169489197774132","13151632114010016839"],["6680997375509099459","18171621666629009427","6550216141456309594","1422088776679172166"],["15614148109574405720","9961758653544543615","9905660796544018702","10403982093131950853"],["17012881343136625107","17902744233828891614","15652684275901275596","5342324998440994946"],["2589087148381150186","2498314545282079726","8967887291855377073","2811048653501608"],["17191491842063529025","17735686525503197793","3322555586253522070","3238418636703809840"],["10041210117007284855","12698948989604315908","9314045199832895339","5455736837580480868"],["1729230421827431734","2332633816899804564","5935857687135621091","10106992978127781195"],["9009905199655000315","6489276187667899354","1399290950679452842","2971833725168850026"],["1418590076095430576","10332408877417684262","11893379809595100776","2771886936022029825"],["15689269013997486228","10310012787592378655","8400245153193575584","963873915347834132"],["1883351740928187064","14448691123556840922","10394761039854124178","2485541216723349619"],["2651399568188939475","1654417522444203259","7690649033830298969","17183909294062401832"],["8220363656022489196","646481585764585355","16404847132639860894","615716049575058259"],["17023476384112939739","6107927151800715753","12947464166475007782","15535328581370466572"],["1455852678660655299","13994024557906383740","7609078167324927474","12007540167498037278"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["15368734663513390082","328182567492312273","12015794265973470189","2841582274285143965"],["7001528295583573190","15282184040152569095","14164742209097501006","1732936418053743763"],["17125983516464971334","15012404111591163464","14104513748907754407","6527882330709479991"],["11536560424664365800","10030267398580923031","9782825791610130724","9381742123111456970"],["18350646952800370846","4701651781433473106","1185525801439786608","4975594003629653696"],["11221194167433493986","16627401525384977098","7783773502011293985","11316607662084057701"],["8552340865748283939","15319207329851218944","14413261359906855231","3318286297077281187"],["12311219604234112503","15701109700662655525","10720991599338715046","13189642049064796178"],["4287466456866143398","10357882710804294467","10576206991534887027","4586665600866714489"],["14782724512777674900","8465591922278932103","14211341812230863717","12729772297267688813"],["15722822395721747417","7012186260583573251","15002394104828987334","12430824654373908587"],["5349074849689189550","9964439176291992743","9232667452628372171","15363710587005073817"],["12610581772506647711","3161773711451622047","832150289507002849","8037154069960974258"],["11207974022270202604","9161989558583895299","6605638310806213826","6419623511627585034"],["14229634131244634078","8499387728773253050","6742680990084762073","13105445553539953717"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13227064246132082673","2490207842935562321","6310310045458239989","17290757734888338869"],["17304808008084718115","1711698681436579972","7360014570392462327","2743227336270355729"],["9507711628435223774","3544405471863454162","3433545036266709039","9824700979805638978"],["2845263506844917528","2151505662117974533","3432418831093162775","10116139676220840196"],["281869705676869008","11492187820875015499","6573049023886327165","7379342848691767708"],["2155615689135500941","11016289373627511727","8355229729617689375","9896021154214806013"],["2350938530380538198","4862400459381192730","12173779340119286110","8174993061714206945"],["290700972908809825","5765023578273602882","1738490500870641093","10612270376210832905"],["9158222217098331973","17887271349540987185","403996158046445468","15685366538631117146"],["16266044684471250776","16996481024313543128","2731220589468417409","1816939881927088924"],["2966290267126886376","6641277821403314734","188993624187553498","4826890183259205868"],["12589167775767390248","17418009434340241521","6581013339845853011","5786567611846206726"],["616019435958695216","12809201406005984177","16213718762904047560","11302567698338629165"],["3193780839993219740","13781297985233689887","1555158172301715190","7392653084267702541"],["16405715829491855810","7732539388454477131","14396121244139795826","7992206723690287884"],["14787007877581615636","15497199559521197543","15420379068093430234","12646210699290383443"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["4950028881888983388","4151160820541212627","12682636139584079668","3814794041876741758"],["15563544824910875062","2769518671236287496","2372321772106642319","1240469483160417572"],["7392819802295521513","18108638194420107555","15223478647284173609","14698092788028396699"],["2187846237971532469","17729470750809565966","4736234576420139878","1177800789624450045"],["7102774461107038085","4378447828682074620","226790755067506507","14882076316524215562"],["1788722815606118917","11367656308975120883","7601912513603540345","11016216009304656075"],["5935315238346676981","6182215457551079220","4758571053427470943","12574052540466808965"],["11178445914985551167","12657566604076558685","13089539565748515446","12221090779877655045"],["8901547977711060537","9678312917017804584","17562569420768939709","9883932037068464996"],["604822958591728922","12578420527240576206","10449967225613665963","7026120513754568853"],["7589722349182110149","17292980767879117475","5086921424888019022","4903324655948402723"],["4330034866660513750","16453994947255206393","6934034237145940889","2977812240795728435"],["13424950206271183572","4512384207812932516","14805699372263475413","17623313967443847908"],["18357219158907511956","14056652433716505309","2308884527086784324","16954001945687914790"],["15061623612188989427","12303888631045213480","12020358322015490093","4591718479463015269"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["15065848152384709665","14633790787869996576","5777584947477777784","2409086866612890056"],["11472485791042098570","1077562474214992733","14772766675283031761","1190467421416857834"],["174316389536079380","17396903021737422094","17839616330814684016","13892882042097508784"],["4600469287896275846","6631177408094776975","9609785802827976659","5651279822643167887"],["12144495507478131867","11432468029229022549","5598445348560526330","3615044038129565619"],["17033170085496630669","10626308179544450106","16740504706078571861","7478225207206061058"],["12306148466584609585","5016229314379339442","10541767038309291686","10424269695767406656"],["12023275740804647523","7642404356025614621","14980599353204334240","5484114319200014323"],["12157343166219228418","15876364402837760040","11043098945280863091","7387251043279080809"],["754871082233277604","5664976481925339842","9760559018945180981","10933386133267166594"],["6217753894273251906","7710580320978301291","18381927910143010573","14348196307593654779"],["15147262729467597464","1532911925283685197","11323177222480896268","890586623539080294"],["674305716346683862","4474257366070021446","11595094077397661324","7228133143044955146"],["3653078621938644825","8265117845559842949","1666743035186547528","5628709764174838719"],["976408255402963871","10391154938601194912","8089522551291878089","15147080784074376526"],["8280812836316470731","525459528857064349","1224234600473223565","11407072143640540358"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["16687816692415671795","9136214755571205251","7624758390285957719","13510458126517239881"],["10260732689657976059","9115543895309380119","10832086514917235555","8267822167928537036"],["7649506323442023929","10798609576769992912","17995952943424213221","11344393333936808645"],["10061935678904578859","18200498162395604986","14285050605042832867","7351769863557753865"],["6037601767326030519","3819244477568050847","13407799852233133035","6055774735089869684"],["9424642092403229972","16855638900781900607","12837738410154640740","5759446535414678324"],["13876112926047136148","11099255562620955590","15526751098370821082","12106484717754566349"],["774360596773036223","6914984451012402305","15486364787749576503","1455154190681104843"],["12822359279699438230","8618628689615672055","18189019157636085936","1464749631364401252"],["3562256536168839795","1542968749160728643","17457625183564344598","6520882937352455760"],["7478834775288872040","1051665885720694134","15351971709222954146","9217317760667764130"],["306130999522868624","12941912430045772465","2987683012446595591","16442530117519520070"],["11786315448129212032","3035343889629006208","4768716159201186494","4934127490284464195"],["8051491648220739911","14599405739318932056","7548604277935751366","5739206015836040516"],["4528639246955485152","14398983106869424822","17847916064117318989","11884908539958076483"],["869108967374166059","9944089751214829993","8737861381474453395","9573125049396863405"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["9819456880048552996","6529201134270977149","2269784569718129726","14449368668800752217"],["15191223334115361103","12432935665435355621","4180485340161920210","4526041523702948204"],["14003266376746087057","3139675583075869403","14730208168516064387","13042397733139217994"],["1293269658324876482","1692096656193425985","5063235152651327250","16411778764566158257"],["502967562537233021","828119042284485433","9476349460910806512","4794045956250695982"],["701325292688493565","13660325260543027136","11351153072670541751","2541782278804702157"],["16566181811276051988","13345905744176254959","4955523509119420164","17430557525761303382"],["8268679035642679320","12190414401830689388","11358598909222454883","17789484720324160089"],["10373082110113360772","7405110089873994321","15543573837372460987","12780596602752864442"],["11840974834796400020","798535935104635237","15812426758925140868","182062483456530694"],["2806548170152784270","1206251328455536526","10065052344136206441","6195283684377071369"],["10596525422537637737","14239096915962339816","6447641573004918875","17102307719374407671"],["1299235933934729249","3061514888828782750","3792423406529888588","17118081256009023027"],["14742592295314667531","6589510203222286038","8819353698679507883","18087951138962844136"],["9938238972068617592","6112878722822109711","4468555458028589451","12374528062718402100"],["4200266276446124860","7590776884214412270","17989643570963819261","10701083148865526682"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["4532963661998598580","17354393288343878208","5559258116665700975","12356830430720157157"],["9649669334785825517","7743228350344449346","14734230073129184672","8904823773244774070"],["15826410678136522019","9352370493433444183","4977465274462198135","14781173576171405179"],["16228157134191694215","13417586186949769918","8509520055895066046","17058159377095509381"],["1134693270119979268","15854147435852262317","16002996448684481897","1876817445156482910"],["17654679523125845564","16375910909769511882","3177267141383247652","13229852156823213052"],["5750402699209840968","17762051036661785009","16388128002786316682","6095386649672484796"],["12800504649737839257","815186341170200045","12752961242775192036","13388621471171963957"],["2193943273174617350","14211398340158820901","3871842318429589285","4252643948066909117"],["7588557870280387543","2490356480025527231","7804808990249633987","5354810038159171043"],["15914687729941614458","3900033050874141059","15091364413630778502","10294988738971383155"],["17448124577269387148","944697619364250945","9367058220859132553","2581700392426822963"],["2544787131364840579","9474179296014487704","15217655801632671340","11520143432103825621"],["6351248962139748756","18227826442727574670","1533870008153839618","14919756393816434555"],["13366699016221765548","2307384884043350452","10873909461142354262","8350243857836323342"],["3038917912068403135","13310620530998927504","2673730055619194553","13721321182010067542"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["7944279848349876190","18131982428533113794","5535320642318355738","7615846435731632649"],["17688103186919487286","8167058408890100612","10542279057364618056","14007394252749652207"],["12179954267819885167","6291523467817574158","13843871677011722425","15291723860222514726"],["11118699974064902195","17936634284329446690","8977979602065159239","2960590370233195649"],["11863293648511315231","10760471651124291494","779475827388779291","10975227882319643991"],["2617547281443935539","5473840276637872070","6230423501806373642","5671653746960901326"],["826878722637392702","10897051621562954828","16381688565680274276","18202155920578352026"],["4864379398151835791","15218745145377640165","11236067832422794028","10736688306091055577"],["15547271979977661524","1947059457557096884","3953255759525499698","6800001072019962737"],["17822762169905831882","17303553745110297492","6290383666961611535","7024239143201091379"],["6886429803868495117","1056304005806335142","14267909287279675026","9839182881686185880"],["5103821654517523636","13611392625113896246","192246773992950258","6562118561215591104"],["13102466164291675211","5138767873672545010","7199431549818800179","10132955071734637016"],["7789636084622083285","8574832038157876849","10844693058793200454","12824185995250924440"],["10711371731927521202","9664183635952067958","10208998599696435940","5952422119534306131"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["15733919820442740871","16347051480653742630","4065316834025710707","14167463649200188759"],["16922822007978158021","9879412438084472761","18353313754900499647","1647835511228720766"],["3715525896397688614","14297653187330364679","8362309097752251935","3948282025136508314"],["4649972539265194035","7823395002693056362","13372170788754651458","12567209236028891771"],["4930097817228055046","5504051624991437004","159079862908371289","8136701858442213388"],["15013878500736207876","11130850292105551704","8703932531927474034","12601171753988758304"],["6169707471379899812","11326531844640178814","9137910360594347041","14428939071433911160"],["13653031143516732513","17782370317900840606","11358773531530973975","7440763086058861696"],["6148415614000181081","4040236721192971849","13984772930222301866","14194421704323513267"],["10420462417828325045","5249139685101512750","15402908718320537247","6982923520518555942"],["12429012321096142098","10123855307849032296","16942448082403456665","3620662111211307794"],["4430150811610573458","115601104523628053","5684733944037834069","8186359526146707886"],["7759946857238350168","13344334147068919915","15955759428259039719","4641288900373003736"],["11001784005184561078","7898011166358098383","11374527884404001423","13907525617231319002"],["14657465395149917743","8595275927125344028","13396825682857237851","6949152477309874846"],["71480934665987796","14923658959496530109","2716278954273736787","7178433557381053809"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["3113407191774782754","4252752364044756195","400366103446953571","5041003811045292258"],["16727038375246342358","8817377728916452971","12249240273612310089","6688686898045812133"],["13025228392619634650","751995369368615894","10994891069169747044","6402948628856263806"],["3663660267944178450","7086352253692381589","17221608940100592897","3944591797200098098"],["13620561718541520095","14264378813912432076","16798439114832437318","18221493907626146620"],["10455743437284046709","3457457227998346778","16956253551987330316","15489175599124098716"],["17844300304961482372","14215683226187910232","11955900524079369986","4832745794059251622"],["15720716360696586800","8513940979895601668","11780243318666862506","13838124627098405390"],["1890779781265937922","12702140149959002240","16926738376817278497","17449477134683544036"],["734344950149151968","9372223312514909301","5700575537138812029","10968028928273479991"],["9097445037021659752","15208494934772480117","4918953780534058717","17084696572225430172"],["6778996964067675645","17796091061655521383","4892990319252640854","9293341232127297728"],["3101802853984272195","10011727808644904808","3331998842464449416","3145481415335733328"],["15305831683202690946","5587917291585781453","7057720729868361120","1591644146765274526"],["17244552608730262293","3147964563199372565","144566775667219345","2768859083255649648"],["10694538855342918323","7232999051568857037","17107091126648886142","6628092254097025151"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["142973161035782483","10524276189137804367","7282838753811231520","8270383035088778070"],["7982497924373588532","8422121566489926663","15016255755023495741","14554731380846492308"],["17244889573767697535","16525236215142370854","2531348502740308914","1737898025691085996"],["10052135048671275766","16010438487442824061","14833864895246363516","10260283196760955075"],["12228464898322570474","1143039173536101198","7465138585658227233","14621682339375536523"],["13636678437335749857","6098611488419380554","13293673156393663893","3149673202680997367"],["2656168560361729960","1816039894482198793","10260425211172160156","1005976612684562589"],["126891799011758769","2480610049355386843","3576307511064915222","8907755254769402506"],["3705034063321615072","8758378516360695204","5777374076280119414","16326230178608314779"],["3339505263677213560","18191308995671529440","2750177034862446379","12471977087259655554"],["9366423480996331700","15521218207284594416","12264672547704550273","7722028520215522306"],["4777136577704868462","5074591890248211796","7360070608078773054","7000000271234911034"],["17662534243497934513","4966420167965250180","16649036511322280397","10039828992266767865"],["1607880650467621523","3156029431679638950","11442924789189977217","1065829286576634220"],["14019962359667843573","6616760102606498110","12307073898498970612","6154910495703848867"],["7244760491117602573","1937002853230329580","12409734825103355521","13785445564269065019"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["531321370433934765","17563416403013870681","4488014208695010529","17700726682632790323"],["3717203051415937612","3318231154390837560","6770751284828051135","1957018328956067266"],["2054134274919027689","13449779715378796798","929238588510720890","7919045633934786060"],["7403025173860103760","15055703767881583295","11661620878776927052","12845976124876898416"],["5090148035729420504","4151469243730499539","6708958151970687079","1272008445514412275"],["9554291395229653990","1160011366445899716","1149269294519793254","11241504086029346819"],["17955467699102714606","17180646375640514826","13602904955914597991","16482201629000695359"],["12793520228435517144","18311404799612892692","7027491728347966531","13102554246191401133"],["9396577591409561139","8119429368578636938","3116612525999848301","6211181397018693649"],["2858929744645815963","13371579827832731033","6940338164502427657","7239559876294459797"],["14963725839279612639","11970236202047227237","10616590009524365987","11444359384739614213"],["142199618959918961","13271527363401280703","2672875705871767272","7457336579355408644"],["5134725990254210094","16533927263672883945","12352221862132297144","14126132099768639067"],["10425023106948491534","18059424443565676313","861048320453331784","9025578293050816261"],["2621458800350074889","5402288709920949641","18429361494662853401","10216419506251613701"],["277638638648574701","9583542301685115269","12371050104027221794","11061520894606344142"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["13907568728498861412","3598937548494933150","15749262864388646518","10678734692835457933"],["1395014773552218265","2478853220385646479","12985550157418401470","9778043299965165072"],["6827679872157507827","6966652097575064583","16801882392352780856","8171941779212271569"],["11146578870529701823","163098323277282171","9715166450964665295","13458176582268448036"],["7102462778621511284","5276626155048927001","1161308847434842020","13927393429577416472"],["13628368392682693914","13085340258327253731","13657547701030583365","17468078787112006473"],["2577896754582240639","12604892090318698811","15358754862391222360","2091273926149173092"],["14472445644361315311","14573007041049494433","4351704337368450295","15682262961655365918"],["3040987712977233495","14033024352796388685","17157748876326347669","16201369319906434875"],["8007885194584040269","4451944329411966890","3137433484622428307","1206065902796507157"],["12174912874862623041","12680675632311583758","517644331624153532","1447519360708105967"],["6568834440755094525","10481254450662630715","3015282040827709949","4379903410568831376"],["13351711094110605375","4168887648484890457","1689958722202198645","10232076400102437054"],["840828684883378857","7074175864527658410","12720674677546428654","3001297120665500809"],["4017457918523130055","8386664708080628570","4762382856846087138","16067088302796290927"],["1752821537224067282","12863968065974140385","14431030335751594862","12001583380482328221"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["16675965983514474556","5698530936139647362","418140377429491422","12652172432214763281"],["12777659386656218460","11902698221202101271","6155438488357663996","9804041491116608408"],["5144285492669172383","15240766679380845670","14732901754044618865","6607337699744912342"],["9856706806473448080","9214824762113296126","8819780487333894218","16591085250501080398"],["2562184127184784849","9082055074000897339","12037403592470234244","9576672672449389789"],["823831369661902503","7747896601518989833","3982970831897460951","3206220054467157129"],["2428322623615578811","3459638164634959279","16193698975581450086","15658268286851316348"],["3739812663270906251","12886715582834202509","4183788721743026984","8240345622342191433"],["16427680311803510076","18307900963059065313","4779204281335954119","13166106925188224830"],["11356171430502558405","252227618773566889","4232491973127281863","11190459899162979482"],["7517211502293589274","9844341505443620153","17416800789154488402","3527579588900741042"],["8944732705613134455","9271642521924241385","8551790244998445647","2930631498917592960"],["1762648999425254069","10486742687366872339","11055476050244755493","1262877747994943681"],["7289977229574998444","6533739941374505688","6501860018579467584","15293995651042805308"],["4001070594949267244","10674831702447771274","13890128037108786805","5207174775701770583"],["6055050752109810422","2788675667959777030","5974438939114923057","5513565242794582938"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["4460804327968994680","8992198733294033517","4026578025378907680","13444070363648148251"],["12072259214886234380","11344508571941324024","14536917799073923416","5058185798375207885"],["5165787465660253377","14823106046366381650","13022065965240426134","8932315564019518175"],["14244312973173073458","13794524683317883093","7622435187597356367","4043910335793422308"],["17639231996064913452","8153166772628922132","14420945033868520268","14400163111931306515"],["13460214315059810926","2256104322508624499","12245864626399909131","7361436292597846735"],["18283509400271878040","13876740491246274821","17686059551473161750","5078640582860744127"],["15543423500338090817","1041748983779701403","7700072916611587501","8492135638303568278"],["340862623143763364","12449199805440936250","10684140401162316517","5938501972098928695"],["33323012108511979","6729743357890820187","4501482909953924116","12512257195653795956"],["4135678806053433463","10652016017670094198","12034476927443639702","12191944823678839393"],["458157091911194802","6372025305245594289","8498254486315279472","4570580222364716095"],["17165742783771161874","16509809412134841048","3319280806863940604","16622185747350346192"],["9834398057682482569","2489227572762484461","3763983908711239507","399512117473279929"],["17597780936672004466","2636402624346807413","10167692533436607434","11986675106726543953"],["3811231592098720608","8448373105265692416","490653320868421865","12125837652211539100"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13987312102426849874","10689165284776246628","14477520086333619272","13343505606425568886"],["9887688580103131897","15812273019315303088","12030237904008406044","6046740960219925351"],["4338911859722489761","353647398498395868","13942086887814305707","13582575525604885945"],["14583636392638306524","4493713084680069182","13458833937272538759","17568251926912782038"],["18209533690224287623","9689469057848998894","13547039109331267403","10930758472152118563"],["8111139135647333155","4639704068515116335","4810351321550664823","1190011899390004616"],["1582160192697308557","7055050433318344542","1763764355775455252","11870248472684052810"],["16248930430445685870","17398566576618725956","18258164296453822172","9642281906672974927"],["2739847183742349939","5959188526078427349","3556615225476463192","10362599044825097430"],["2669048982693840714","1201575761155936275","12707556825934673350","779630990436461626"],["2743837606527573084","18249452688400610512","11010457991912109862","9624412137570472231"],["16062617775891640930","11105976845980988395","11101116253065157506","14600266379851099249"],["16907593148176561017","9032325109715077033","17616466173616834324","5617608375601696401"],["5664032825362675854","328326676606554374","11426795539119701937","975548821094841986"],["15061623612188989427","12303888631045213480","12020358322015490093","4591718479463015269"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["6963385149718834465","4418560442904765861","1628016002275300545","16020762292926641025"],["1475407451790750035","16940281996139740454","10540689266630109494","17017392840970790262"],["2298291729999006275","14865386240947175369","14468553462620980222","814497850992861286"],["8339226730774555744","1757165398218522418","10230978391087689274","231762070710505631"],["5798223732126553711","11876786728172523353","2420768628466110903","4432271373521758315"],["17986282657031307303","16383203525529205899","17540452552305383776","12736291855211643062"],["6680459924217311228","7702197729415459027","5413017822456331379","8448030839780252642"],["11162184235588958595","5350194957071900834","6207545645596732562","2851226238907081077"],["7495689260935960062","16977824643957469481","16345806792791483283","18031304784108075086"],["342756563718891298","2042097516724912025","8159327995800761325","16571383668791901835"],["4647694703228954638","6406702592262937381","16205439892498598104","4628086484441030101"],["3966255618629079723","8304599964349654386","15278817889879481261","538579585357058419"],["18378296970661470077","8802970596023452094","15731384201736013065","7527262116913567473"],["18100850188278979533","13287551510016938235","7982826813669001044","13636914298110566123"],["3355820509009783588","17922679970809594092","990834360260637878","15766998009886654877"],["11477233345027020212","14832645080858559662","2867355695204893483","166496565302566572"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]]],"finalPol":[["1718937651570301188","1961057079684197598","14193947112715583939"],["14126506297639479037","12473116708931339185","12356670561400235675"],["561611482427846488","14285422432535798437","17026461678499869339"],["5660991174157621053","15630873516026584185","3006769923003989948"],["18073295612649508019","10856912133927880714","9909525995315630943"],["14479825039351143227","9064177421422070974","4609679798399743057"],["6635333734834301690","8362821064304868578","12956900381599650134"],["3711395881249324341","4326116804656878363","9630318003813619216"],["11128336837301155927","15467027736077619474","1410415716470978954"],["5130572869514898941","5307383915005294176","15667038581736545577"],["3873053162780351898","12928155383770892893","5910587484231825064"],["15639359918532048179","3579511860179615963","9295372619483442563"],["9768330241096951975","10714177142963692077","8899799544131826049"],["8919671072571491552","8429843799320233642","5259019229064157673"],["9193097992373183334","2301851897246270120","15848660756274662682"],["2683425389213433311","11803771981925025123","10265934398763268235"],["2735930945865031387","8586713937578888844","2196538244212758397"],["15127767478239264965","8303525699238976287","15089856726239243128"],["9837046259021491973","7343465046845413024","14860371685876775307"],["13629763492919520078","2882467775939409476","5131865712203249169"],["3854981825159625974","5115816798028946947","15913139106046289990"],["1176764944035110210","10276884640136306880","9490898681572641417"],["10931281571939278138","7562040274240793066","17156097948687759559"],["11014323323735539438","3285141056638403644","13568852309518241672"],["11280784180334280302","9197478412073603093","5181875598492261036"],["16398275797712107683","9125735758979018321","1522533472537050740"],["6315017162134408028","8700667496351682060","16170541267321972085"],["15465529138768087824","16088888211784772263","17512962976063421234"],["9207477435598368965","4005403976288226351","815954550528020549"],["15407652424069165577","4389744647390626398","17188421052445028390"],["18211206854929603680","4599063235165486096","6492107321311910923"],["6490627960708311155","9279047839571133009","7965808912828931496"],["8260942437688567461","18327445716622954985","9418313492857643853"],["6371490112815237495","1036384314781374599","3261252595402248710"],["5664142618779743130","8651704967083509","3560000518612966454"],["17738599554070827981","5128188468613309196","14167179592271122173"],["4204052866472064286","10673727081316941567","13846443682999904581"],["8865594811939639627","12256880235078356356","4340364117334981707"],["11070471460343568926","6153268620238090417","9708333446702975747"],["6786787439114015142","15486398283481648759","149604245941861317"],["16036752756221952190","13592902512328587832","5504917355039954733"],["18130036552673790446","11248312790123983083","3980599996402012889"],["1240658046343267385","13591853542371013208","2388592089246331820"],["5288767525432036981","7205564609221597002","621147214934655052"],["17221538502456635364","12914479567162749857","17381327440352837834"],["6582012747332800259","11202303845059915195","10096451408253196882"],["10311346833760512606","18186782247208251064","3886287466902142190"],["11129923508586078742","12521569949324211775","5235539919246833883"],["15925328490270763214","945131101311683392","12661347157503665463"],["9003703704806086528","12759144826696535686","11407269215427178136"],["12370243701820020963","15089573522165314180","12775324529304950572"],["3791322702006366863","3734152216958794262","8404390419112346993"],["7439610746387763041","11156392254658683632","1470254492563825794"],["17485574312729238186","11665510731814130671","17868809767367628091"],["15729793381173582543","11921865953191969463","7758510490842365809"],["1273517866552876363","12734541470811548783","14318905298027051373"],["4399783671651268170","12894874770644305224","8190190360402544639"],["5645188226917039065","2272283183150734784","13919067957965460480"],["13178280468181605653","9024842137314643131","4512409854015284694"],["12719207534431395201","8276240538183173774","617856580623163882"],["1717509741082402215","15535722311974719297","8967844295171639595"],["17016445688289315522","13687285946100200326","8350645052672598118"],["7851009210963873243","3438193905311527317","3397391294788508291"],["9950051532329157026","11536043879912990986","16069326018970168143"]],"publics":["2212458527","1476847879","4253982365","3398176595","2356091737","2790636499","2729257256","1871232647","138119332","3181085576","1112727098","2719221653","580935041","2417456864","1066270799","302031188","1873","345","9","2212458527","1476847879","4253982365","3398176595","2356091737","2790636499","2729257256","1871232647","718160376","3583552966","4217387084","1804925119","3777111175","2160135270","145091898","2918779245","926997818","2291304450","3097553221","2761796246","2573282801","2985864328","1403923277","3237549865","1874"]} \ No newline at end of file diff --git a/test/vectors/proofs/1875.json b/test/vectors/proofs/1875.json new file mode 100644 index 00000000..cd413358 --- /dev/null +++ b/test/vectors/proofs/1875.json @@ -0,0 +1 @@ +{"root1":["15676326285758517546","9666787739553707077","1820755910234660806","2355453945286273137"],"root2":["4869072528223352863","6275850450145071959","8159689720148436485","8979985763136073723"],"root3":["9559500966164621904","3156173336744936541","1262839574181227259","12839484536571177205"],"root4":["319658850776570252","2858378020805198020","3885149666470452820","7583596018258086932"],"evals":[["14711620595363779395","16797486817052490609","3345809253706819365"],["7592112835400442960","6500168932915408100","10647155054006410481"],["14638097661015725172","2890507307094765124","1195162185964541123"],["8016356499807913120","8142015849795116536","14131170373873595826"],["7697560553841541925","1246674749317846729","8082287387440938753"],["493610743175498600","14515749267857385088","13256006550353212251"],["6436711835757900630","7333317494611453415","11055575408031652605"],["5870989259679692824","2656805425458635688","16714925134431714521"],["5294542481148818748","17860975726221686844","15389943774584879891"],["1670326444185494498","9555622105116618442","8649009766826665944"],["1900810645860677333","2872279854090055822","13661237105795886503"],["1053241671131980958","14571110088530785057","5998437372720172446"],["3592577306900746891","9000561864376228221","17238223378477129429"],["10169996076377673093","18427570837623575324","2549254544252131363"],["11661530960134568237","14083384840913913427","16575870315145988050"],["12922221341664337237","3401463493025979786","12961634641190852040"],["16578836538882831591","6302830965213471125","13439135910281812134"],["15914332975419717689","7417230282230277032","10346136771852705473"],["9024329393566390949","3394346459236722836","145709983617998615"],["4000562486496444127","10849543513091323496","15096802049504975917"],["13609131728229911166","14814895101939402907","9223928634272808184"],["991318458583794857","4782827179653945287","9490827170801710491"],["10171647758986605419","11130439945812601362","13069493456175138818"],["12331338025485533484","16489091903880581984","2324892489480183075"],["4461515770086374047","4929925728930170228","10673880066161044775"],["7324687044975723206","2566051277148886207","1161574446449420845"],["14793483067900415194","14639763205851835460","11447829983694629362"],["2483914678850509282","5100734854764743064","13312502216043008546"],["2456014341995411615","8134313965940155274","13454946207904600491"],["8214207972512289587","13393359060505101439","7281839496605397783"],["3631804806337697527","3470686592235619269","17240293146052705917"],["12104055755914916074","17438657632568712802","8885170393146012333"],["15421744600894050052","13626375536182765439","8835908675086823475"],["8243502931166511044","8052621777127351015","12235682149329385489"],["1606914543657911918","686979627688331461","9558957352034470282"],["16166307258608212333","8468473754910218051","14828206297601230841"],["13347904440577290994","8620207987404515990","4723690396086470043"],["7033926080449265897","10703191645619610692","13127296622121936521"],["15642766367372639566","4398494985975744575","15217489025781072346"],["16940610161919261438","4299370751514930272","6335302676694239478"],["9788108629742000992","12343201491640032967","1658382820739158267"],["9345318572192567021","7856822283536153024","17923300070658153910"],["329661272784533558","12431924030201166533","5884350115809976845"],["18155371386875300203","15662095685811481332","10486394064610290603"],["5869924852949547238","659816736070488133","4587562833797273442"],["9442110100708815310","14711728967963046676","29793480353972730"],["4901322254080376184","18266133806967870282","6218308820203571271"],["15505662997583655232","500349245032022747","10539193062213058343"],["5580988118105309297","2401701518777810243","5912352427886668476"],["6601560762995713458","3054818715541320459","1272657787873937122"],["16711874008280206592","14712578919050495356","292527295618983236"],["14320419705776610512","14992395117300060142","4032723172145859815"],["3647276681512278107","8286137949048546106","10251956415134306336"],["502713498685483649","8252049940177654270","2619415461066039715"],["13216007620017447179","15511230387708862443","9691601865680603449"],["3511588457686370692","5501264490403390990","9461009945065367719"],["4461455444483314882","1323178373502644613","3622206733752473046"],["7081965697760925804","16391376503711179970","11878305745657846681"],["4412249020463220067","17530600606860592978","11788590504306062280"],["4561221031984824483","1066553159243782620","1134860309627867417"],["5261500943857152409","9563334237971576895","14413540471263254807"],["8884502922475342909","10641929114682309804","7014779157787048441"],["3085277767057756915","3216011977451250835","5675154392288532706"],["16344218632391586521","13841521430811522707","6879155528125989913"],["8730667679608192562","618227527293458987","7158317505782159785"],["1992438723872647556","17391606582463712200","17580677532231450000"],["9789895459624384665","15695547097351838531","10297930555841580816"],["10466647337550647201","15387810099488169030","5464454316229183931"],["11435495475007494680","859755514919075694","12814146087696872787"],["13905870035332439806","8582990224428119062","17048422672973680983"],["10560014740752321182","2007898066800747035","7317465156671403813"],["1095687165330720055","1519467259627858380","7464077278659071804"],["134577618417313831","5567995565527581846","16073614221720480765"],["12068046661187013996","413527602508703769","7498035052574170421"],["12217184491725189403","5834687026930121371","13062070798819079220"],["17808868849576431739","16946218638938498987","5173430410118767440"],["9887400504068375761","17508935452578538370","9622590134354341000"],["8119204509942807884","14910610823091405752","13791699979000778149"],["8363998341424590117","9281858207480404561","2363835919972350988"],["5676298467284211276","4854151337900974475","6300033997145918685"],["3795975219326888388","12893973126866094617","14455983287656252116"],["10597159291182162454","13595274363738938878","4620279181957612920"],["14228375031886568582","1724317710218717050","16352293254061678529"],["11738041621515218960","11078981328944557599","4951811688683117842"],["18388920491552681899","1709984173396266212","17200562440600277246"],["8929039092149704673","226752991559265709","1426987293870590835"],["15081550972890598530","7491761509453556961","8969290604901832261"],["10112655109236009056","14031088575368163827","2674084423966500602"],["8790253447852383407","8347718671316560561","4451159662393949138"],["1439093656964836225","17498460840859639906","11297133300947865826"],["17425778662872240847","12366792994260365940","6043489888819449055"],["6228061468062043244","16494614056068342985","16040175160937991039"],["2507970777291158405","17320532607139113361","9758782292646933455"],["14258633003803065368","13877295756831930339","16872541070243168180"],["12303067100834827121","9452960958306964830","11173081282276383699"],["16325695827159195119","17020132027788358137","7271466454526010052"],["7156976617939165372","14158041757451261226","17905927098809762247"],["16995449290984436476","9705325898182345781","3352574412896797030"],["8187944597089245259","12064323956026343356","12538762152340656551"],["9173171265216764073","17440342042518688395","1678898078636719827"],["17927419145742529178","5307668073218611094","14006891697907431028"],["13051239962565324844","12563302809344255896","1710386580910017275"],["2193210234547772830","1257212069892053282","8860968596981763204"],["4043062429028471267","1618142822575878165","9918768962580901618"],["16109040207414407298","4310376884970024653","7682907054246304905"],["14013751172741532414","11195439177330870055","7035236883698840892"],["13981726474932540841","16617570815623743084","10772579722738667380"],["5859980191607299927","10246127710281841380","4933388991737570791"],["9846935375530348554","1147648615492825743","12463008170637716789"],["1098416135723469837","17318194890337642827","3598704149735044956"],["2902890163603789014","3600128887660674700","7528372593715693768"],["4099953708082702086","15672929674284013484","6298303009347774522"],["14757245111552766941","1594715134395095531","6214953301294088938"],["17230772369810106120","10781446452218510552","5616304946070578539"],["5596821114098020844","11997307663090241652","15889824214786809251"],["4521232098339783368","5752382946127824100","7053390314106194648"],["13853728745063935513","14584141716197402400","5590202196184152954"],["13591246348126401680","5330772912311236235","1429491497978786963"]],"s1_root":["7331103563905320557","7568227915832231716","18371529027832187014","10201013300974836480"],"s1_vals":[["17150019522304388260","12799059956413578605","4593893609739193908","742190089250840055","3422244151604355714","6404375188622296520","3440789393718286238","5376179926517544756","785318749719859836","11661737053156251599","10122241684982583184","13524441249227735866","5462816579784205908","17490036378868366985","2043328851190167402","11810430396282426273","9812044247170336644","3909923487643960256","8230287318802272897","4007996724283947256","11777574757711128055","3481197700971823353","1952787824268695063","18396478639885604477","17006457360147843057","5024203752183970964","9238336228930871032","9227153395809005273","7832875300365445812","16504158418183168678","13529817285500910386","6302789645352408596","4230282441373254087","6931485065395633688","16768761112980287629","10499343922612571247","11695525204979351834","16644413467633666111","4087613669171693639","6356250275280482660","16125492590900635558","12135976245317658984","13823832300435175155","4338343433048312421","10824567350506470399","13416577057455742676","6230404666417783657","15314578280437497170"],["14052618608645640782","4477968890662670664","1635141510472468604","4380127919237467290","16168725024814579547","606282155401525663","17368996441810705928","14408479973940618173","5273847129026898843","13786124668658951448","3055790940292165941","7836762222617261806","15476128614449631250","18161245998902787797","8088379730548100979","14793549338692917880","4516662788726288131","11874308333229986225","15864407905410169295","3242610760145397644","8756213625748035580","16884216314333395653","14826213409548961233","4415437330185901341","1362024751173802122","12337565227603402235","11310949951522638859","7933238869997149271","3953811185481644483","8114080525522584843","5497889189434218364","10012070853517022399","10427602735097512941","17039795162537986369","3899324769485085887","10613610712687062874","10573405725629206195","10547232211105727749","3836019422353474893","15083212827808154779","7729165132362097093","6571728643042341197","8760350819265462068","17608885762524617983","6616868808363510268","111394742443013942","1243807250355368463","8084007835422330571"],["13500813322144346716","6867265789633613358","4045325015537337058","14261921593089143741","14366900403701030314","61091998169384113","7859124317186638350","5236452447323820951","1242636202375283453","44528508346817494","16157635699950594475","7284348225128286671","8435521084085639507","15362922805457741323","983686246020687604","7950999020597632126","4859050205676614602","16575166079616344128","4350701120175156582","14768651842258992118","3369826561552089329","15079053534054579270","34339538683448332","12110287002160345920","1483812689598408415","11646870443989514969","16437705526378232252","15748326697136626807","18228125800118004366","10225981902969048596","3786102869544753517","3140734249788788804","5483105843675337567","9745288203312047495","17376987098896932340","665214661296602996","221517259053549923","623916321294045752","17723737047033267568","16963464787273882740","16562986568612357355","11847584779102385142","11261406736567558946","14173547330519532030","1839248045830690780","5104585800708470100","13870555494288806519","5833599822844050263"],["681780187509960055","5159230769858787465","1793967927626507910","14933203768027800970","8880274146729539986","15844447564282718680","9106981801007348835","2029218217364426904","5344227836997551965","12853470449803732006","15869255711159386522","15213453770758176704","6497492906297327405","13539821589922023681","13355640781198823044","7176625174296532592","1791556632623599486","18122726614674138385","9944545412979514541","2661776615635982487","3783516039574068998","16719955017107405572","12009956936482086726","17296410376604624500","14926059739219036305","5693230013028444718","10451543790472019205","9839532381608791627","4498484957217249754","5731020144997498220","8297198351822735973","12224119004728635736","8432106250068467560","2940821681316065062","5306758966861860843","13619143690996413758","9808848279284370904","252519423297463679","11970462982460294691","4225489165954393948","6282913986659844306","6527696581488280566","1209295379350599005","5717815243876764838","560776442382000089","1863871225288285279","7598976447622097794","16346087042128054144"],["9110481539657403989","6000464421204411148","4082518444589562029","17104300163337697967","5084895726435313572","17308060753309417404","5221258230131540198","15230143184850320004","9023740435284127575","2216346497143660385","85361589689748345","5603411766366104715","13516061097204334319","16174239249607734685","14934413931322780312","12510607559228986715","10312685526441267566","3494266163722315167","15457460166189007863","14143157349848011815","1340653199406709966","7192117257558025206","3659437984452785793","9593006625084058946","14011056026201779339","16539987508400486735","12175714695846472372","14763727056149294993","14229626371374451614","14748891685575136752","10300182996081293916","2541068437333201697","10999965048108759958","7500863968366779898","7440825507701495018","17236070723410905984","17542914504596888121","3217526762539152608","17568014324217078358","4933922370073079658","1888587921192509781","457708535546435971","7473938311887903300","5001689477103551046","13517455698093222758","14461763841861603543","12944206522484206354","2851771846472464314"],["3691020759723527687","14618668671358834893","15622293994446007568","13630477469483254686","7518200614473599609","16360095158358866950","6517415287428691417","15920115166808028950","2423050585296750884","15838172638120745081","533684713998420364","17650442802502712124","10332966151063898290","1924907452218003983","6402338203253788165","4542616208083514058","9404401791237974559","14755223158717697236","5188313651554570811","14228334816399709942","4286519346699466373","15553208302574805557","13768972004890734784","12681942248961183097","14347309370269297214","8069563770171024724","8609266049292086567","11972758211473323778","14405466559859441661","6687324481261564107","11737375551016888375","16740206194094746558","4123160449371733451","14921790572415966138","132088151810330284","2743820731077062329","14120185163401267700","13169408761969739875","9905835205059420509","14281510758462065218","16062319900439146113","14792025701227019970","8466116182769919151","6611791501824696054","7040619433931713264","1626331106462480674","2957052104477110416","16678955009761861374"],["3044567413145973044","5304839136556090159","6378914126094625204","4789361176440734095","11261810274641492765","5502443964474602405","1818540881883096319","2046156652693039562","8676482699287050724","2632587181584586505","3321706338586796114","1298664549957466720","1872666040326654627","9562860161814310288","11131752280399565566","5504577591796251269","4374214811639669578","15029437018866351024","14217632626765208863","5261207972074123332","5186335809806841980","10172986818691165239","5409530513720780716","8326034219866653432","1425170741128345101","10486766765485425726","13555706957818282007","5994486028704930082","1375356228194180544","11278389308565878122","10523429504279691657","14203648208755129221","9276326978861799058","4781924835385942024","18120228887281739308","1292801798526660977","4109347895239440826","18063788519122540429","17910000586289265474","12016715699679403705","6430420055592507760","4157064505032841166","16653245449870724593","212743254337935859","6788017075039976829","14023795728180943819","11439039906122511882","15768588982958387254"],["6018554868429294295","13772254726592473382","8243966999097102728","13644536206982547369","12446407304041651381","10506787841113212821","11235581237038911754","17551817463004094934","2994497495322274629","15851142838096674362","4263758773516333230","1249633548942746870","10537688127574390897","11043078756526676927","8206742977640233716","18034544337885579991","9422686694972896071","9988346045908947201","7726044678218008158","7257554240050723537","9257420408806636350","18213125746459415636","10092104635773746710","7252234181138400598","3181789129533233336","4178968493147948493","1049907749035412556","3483738397716382649","16759081919473622446","17580623189901059284","4032866719352907847","1090537693011102076","10920701450201922052","10231261553156544641","6268883624997477790","5890808221267022523","6266758019816092176","11644850227108924688","14870876326367947746","1405780164001273674","9937060961162565491","15520621445276592096","3764835385604474051","9188410472556074455","5676907903606611713","16226672341796110637","8037414861044161297","5285003840769010712"],["5272324252447206196","5149163753545990020","2964131760898922071","14626251161429626396","9171140299810867392","15435883838565684641","9374879095251833501","13300027635226115466","16445359544548794809","16853559713043688134","3829738135097719311","4545882585283806408","10188917269809006003","9766491436425962614","11331285453657520974","15746942970679763294","3224649441903917230","15298277207811284371","9551062267173442730","294842369778804874","14497177903703178030","8860555054590110112","2302382747260465738","9364056045163796415","878090794330018896","14244253004641689949","7611371656880517700","3222772106407365649","10141185289128022604","5655118472688922418","5359311204159930565","10092859424890396730","14826340797714998859","17304948558343988448","1144144358170202640","13644304193696714609","11049222022685887066","2644102510410879226","11654555217650753871","12047198147570844753","16671223659251422776","4812258728669562278","6853185948707210245","17980684406480987930","8892274819962432524","12368610248034432327","13410650959001995552","16578624819299917013"],["13072053691604241088","6637096556381340536","7717367115587580476","13442149545311451872","14989560495768356834","7201549502930378254","4712306133649816288","14141180939123746001","1076798105640314708","1912073401373979023","9166428973124490404","7510758825597158110","16395864685801008816","10747217335447582991","16524007462081133945","8591951322830261838","5851281226879120377","4356013136167361552","16413068038924529862","18125499139068798480","7858665750137070974","480516170154458961","5306295020031835457","13310807704612384834","11520413521077217909","8695742389706526365","5206178943902533551","12743111766970502715","6968760635034357467","13937961261066257744","14122811324655304789","8582108452016528542","2889936864501348286","944573616521077055","10191774137468671017","13926535747376524941","2001692447003901770","16015871126134699524","6161209778544200803","594636603527644660","505171164993210865","11793824840771517162","9632576060526444774","13510029642360521390","14501912466032622873","6799106845513303331","5245311248675519889","2074103807801103224"],["1657856647847297807","17673634030514743313","16728483507827238818","8656868996896917216","7507951983140088390","2303631822162370909","4742671015874933163","16005029051342554890","12447165144349695175","12673522223689757386","3897755529764113721","3049325891052524840","398476572632387047","12792990077714996760","8410580154521331472","16697890698260801257","11823944364651810540","8823993883182781193","16720459043268116162","3480094151532275248","17026363522075581933","4618761037861651257","10997623091857889021","14338609219567023012","2633436701721322387","257896839399177715","5823691557920784103","5843264841962721286","9861657472705530682","6176018579558625615","3552769847868930787","15226906159217150574","5431531094717924583","11195783691259110859","13541984108049979611","13462161696528256108","4248545630038723452","13239685773740473155","12212943415276544916","266411147381143638","7882916158616583221","17845579239105770557","16219713688134458150","8271817170893072815","7544903730247634600","5984865605760485954","11420728935249564816","7490315943939336189"],["9809105018538910004","1014384082726614797","18010212053006751549","16033344040065948302","17204837685976602911","7425225548679640943","2092154885583924683","8713465734287799692","14748926407493387530","6422055793957244319","5494724812450246845","10274182044769852458","5411327482775135298","12195576000050562881","5067531973258608197","9919045068435496711","12213106627015789885","18167915520311795748","14016397311102448661","3753088759808904593","8246567742987237328","13749893201719178163","14958583633946927169","13661203716600798116","5294253114402482928","17523998825240722113","5531735772030153762","5312553134292984675","3431775502762047614","1422863057779717861","18445672337555965542","14284215880898576889","14397999257798565281","4300958888494840324","12871522188304956909","2335643714505305677","2332050031680289053","4267037378573155520","2406205173695680380","8775973724252357817","9632208656110770702","3851605244064160854","4311476006892827501","2703324210448357083","12292556119711332320","7610839304562620026","4079479933802471424","17557170015213741614"],["4423255767762235857","2397416844164775464","3572133423108122157","11133425390484111797","5063667743408183575","6177997091717957989","8838427409722005240","7401269661468316356","5616718059492192244","5129965167225722525","16754673597807944839","7014181352350881404","12978568804127879259","3333826357000291465","11622514398985456305","17537700821403159361","13375634929106666244","11115734285891117910","7943670180187350968","8918854314195800301","8843882030480569978","12667466619550606116","12274938093940069502","11125052676395383911","3438989397908436692","2088259152614643314","12342157209734693778","14579872732493137224","2552434002149117929","543048592155818916","3351742752277973030","11095218506072083074","688066464083645470","7442174293882766260","12640454255101549411","10699714966775750791","3456790326554446216","7320114268835607478","9661285359977606086","11289858987651528074","8297594649860231073","8074260850454387770","12655834556369963243","11666786640565862922","8808332407893518271","7240943312660713095","9957776838006843079","4978407674839161267"],["7722361622476697599","6676929177199005628","11496297676638673862","15901805669717011343","16399445397994677231","3497815260223365645","10401975000269741020","16435434196570938167","10199144115297015621","16277812611409242864","3547727773280193878","14496807041092131233","8890116276181762290","12009644337397343782","11876014497994036652","5932769906908582707","14233403938568071300","689624176649415038","12403001244734858872","2775506994782347055","8374505005584423104","17103999384838682964","6950264808968860218","13398882002716908685","8620279804429279129","8217532696024521351","10262162938276785668","4902495467547077353","14402509542001423166","10277786563348095109","17770139481466191859","12763348388894671192","3058124660918436470","9941890770586725963","5314106258917089698","14742657879792169443","760473497119645963","15301604079309548397","18001392467621371604","18442519942737668831","4095827362106464548","12953738747647671126","7509333849778539457","5271906363049589899","10315377460837357497","17462868771291719783","14029350875299697465","9188916616015311209"],["2857583328018781222","11639835465694296217","2238155873261477336","6944043308597096809","11657358811550430116","2171919371909804822","8129571879910884972","10764974992199467347","1148863778910805337","15013609913003184828","3288389988032746903","11401002664583420892","7502571021420014689","14493069125242337575","17087181313214312236","6034654766907176816","4243292690806996077","12022721182981929462","7182134548696624753","271766616307884163","11448084736759676710","13414519479053780513","5935929464500070739","386432783013144149","4149602966019324133","10457526737185735056","1876110809562563662","10989348525031231049","14779174965843499898","6943435141902057442","5974086353908186737","8424131165934865676","4850549949767155951","127285797306942524","17899537340906522862","1720060551295940767","11040571193282679341","6560788102108120476","14708514393770575088","15028131826808336377","12191095874837145349","7643349366297157682","14766768698459606593","14117561043144220931","18037742398962943122","1837493085736088971","2818733587748047204","2592795678030607577"],["9267256417069430350","9295152191068818700","12827359325318175008","3343244582114423861","3696010386608840161","17382478474530886540","18326617565158370826","4895994693292662452","7070462532047461467","12282621430362883550","15020058467846025026","12623875726027628793","15372192241953830122","1567731764941939461","8031298708673500596","2322820021767523912","1827299428842089429","735806725493412466","12308801850230310324","12641066938895905035","13412724615123841826","12707142976577876376","16647273132452274623","17923511563223875020","17770125522709258701","18362832335988180659","17818624713966014603","1912366572540335251","9400012151039021821","9900081095474043248","15204726257056726509","12026382013738389365","3903763526136806852","6866134019598904148","7663483037296375913","3091484533249602998","6030925019546917479","717959379483089501","5429719888976445107","3083665190105100077","7279078891565028071","3974511581877781919","6426310567658407266","10743776375351280260","15235370505057443078","8103304825886001101","476644801460184330","2400979899571679909"],["13482506589513070137","13055427797682826037","13407806787023565546","9013201538418991104","192878576176652481","14787083514545039634","14573434157715271181","9754143418047951877","4403334427895382713","6704599495788429782","11190327809797128131","9908246275520922050","16051937175191566344","14272302449276317321","10000915571210226955","10852972391973033911","12218093616528768185","17787658551958219362","13168400267197681946","1116900026933274342","2350431084392873835","3293362626050638561","17713373967811910144","14385647852678832059","16869103938220395096","9550267914100408426","3242706638674665850","5873556472579780689","16138289553508922312","1862603228723689173","11187155536426570598","10960437884392718425","1150710897786948083","361277585930550815","991293909994225269","16304530422534898819","398422889925875919","15281584477150935582","4240060133970911601","7898535571326767324","16641791987497423155","9057485366536879383","8803509336985849213","7117330170172666638","3131249517695159124","8042516836509801021","6320332214187637592","7184289919905471387"],["2815593089917234481","12492827097475405192","12055825321467058204","4978830252874464226","5435758492902099920","3909568228461875464","15043926897858298009","12301513264743761083","7557785876269014710","13872377655438505574","2306538628182352327","9168625791251115672","17887393032455072790","2737765160997553732","1911246513130015270","3098690461904541179","227113002252853545","12784944433035060353","17536806148341374542","11252369793742047300","4921120897298123452","5517926943673666465","8773513916278421046","9593781407382142839","17681369788674433256","9884287434307473292","16667106774140496693","7982749728141076973","2794527673643285482","14306165161714791001","15756080587598925226","15409000370788692339","13152176092603519526","6506749467904300185","1752230507514710188","2771742105203117024","14683250899583252065","2827579244696626564","14739228969324322668","9923160090184972","17607490235779985487","9498178649882727064","14688133077721874568","15448757886817993312","2818268031045727569","2727102700861739450","5106635390996656004","17183089491354527003"],["4458368870338295600","217063151689098704","126415021979610477","2415530176525657570","11359513984468007955","15713423939202667728","8986328033431276588","2342086429135008853","16423637132653938138","9002053001445733584","9420014360392742892","2195111940184458777","12131128185921115061","12321942912590070312","8602381557806426260","13771135000143815259","2464908244304619187","10923575851761163624","14598945673930993109","5148455078737080853","10576226063642624553","18278191847058152313","3356997956830410636","4362058574862830499","13107802463593164047","2180746859133487754","13886381543350231106","12731532388305417292","779114212930003175","4849108843352026115","7298688099940584638","5109448458671646018","6968260415993782986","13031276821217390974","8380150499649802827","9097549668087877356","15996706530861792851","12801558791565007680","16656811617452077628","10876206777157249908","14732463143484061060","3809865444949631632","7795624477316857215","4476816273961744092","6679646666349693840","926612570951231162","8145409379468241542","7827367806570932973"],["14496995000808724679","4683843893951972728","10945460755532532320","3794889598121529399","9812581058411394036","2840602476232057902","14413109184378905353","5973683036352008135","9888065156040105191","14905227906113493183","11499483859913987253","7811615358081846134","16453505589650090171","12599128730542494319","9769196551222291176","16488945473754974109","17029343722425850048","5683740183811669090","15453993228341841633","1231714274140802989","10747869931229568489","11472452714055368447","8408731409250394765","6413343673753739203","4658592768789361980","10221641296723000249","2749985435712740677","10946671167290389687","7158139144578296959","584061998507218595","5571394208664505340","2858489686911371848","7601027150439510225","12880411739748985363","11570061028289412731","17095803632897193972","2735097987947411949","13965414288382015843","14618791826705440410","16770752153931635467","3753199008017622958","7115045266553564287","1672842251897771589","5364220113670053541","6388267072019238394","8820158759704551877","14422968942635524066","180798987978490709"],["13672111236813072634","17332360066694479816","7431046096364247442","13607298444771434408","8940998548033180146","15036535416182318455","15212206762852588282","18026259929214475871","3000964786116076638","17029793709507389957","5645234578875844634","16650335709804138854","8661090248068723816","11586377236739304122","8114195905529405510","4825090905334737405","10672563342771552530","11109299606890451155","5354760923558549075","5461272415510310119","1140510816499799946","14554662352672479186","1265997902650546868","9836869496105020042","7293817732055278286","3358043723959757963","634744127781210753","2203634842039479965","2059152554781281277","486646510677998856","15560254855165758687","16031116356242955128","1710764886522987901","12918403711579731805","10259538953638994069","14219628948151715349","10167710914267682426","4358212290834021359","3939552862642340033","2387420997696290226","11041954918638718404","14917595678172672800","12449311259769163494","8179638002753193132","9177270266187407798","4100431150960651150","14065494047470535120","16944519970630092578"],["629703431832504543","2318620777747836467","6415888250971617603","14976891140679647376","2812590810217493931","11678293103492911577","1388131828389494937","17984964354210822819","14393463492534747696","3789571688851977009","17307625400908873627","5282579468642149852","12969970007249172424","7246146064414687147","13952616924310211694","3115471021376532498","15221412837928840159","398069742120055193","12188454276565077606","10643537571306812433","4143066036956362712","7870875461461774678","10317368599926136045","15786350297728344948","4341429975652512225","18327404909095282358","7734145781175546363","16595150727949438763","9881633885193952650","732432694761750966","12619598889092728970","8831052799512906999","12031318437836877332","5873973213440900109","8201048929027043665","15447311326906974401","12090708501128657376","11268941052282504833","13861468398584053060","2489762538578583470","1111675219233707572","14938478262747182030","1387234402851827789","1189787086033407801","1040487463368450058","3099489443021875832","15357644809953805421","1353991800413176647"],["15209775132629404853","10855430716371476016","17535584072111480692","9179537475766421731","486126110815043049","14142833100872969870","11536007049189021631","15041727085144068935","2768338010867850483","1066854751204974949","2121168286301912968","6610270625788949117","7873908570725941974","11413350786953808704","995045858764658730","297757825003912642","18382312226412404929","9944443975413596470","9169966520748435140","3001973749050212103","2416850821971218236","10160815249084418990","3486998269272687894","18108652828491294696","7608461425735068386","13800794273174782392","7830099788459792199","8671248081964877564","17386666517184387775","2244503942309287650","10651897515925199385","6784594309542396925","7642528517078262904","9043023026134212182","16159329816214459286","9496323315522232922","16325325710293704478","13971654839779072945","11294193836095282902","1976964158717679525","3546896558669996172","1540181413894737369","14591325307554671548","17188870120890595477","2062825169938180157","13646668829525858777","6296323188010833080","14850444863955289602"],["11299009071402361195","6351927982801040105","9524145974696908777","244403123602375350","1604218670865966153","4348513817745001467","7121204110767837046","15795445984610572134","8463067641228775669","1428323012093745926","15537723508218297627","4848043687023099066","13259104403784767453","11019642556178426070","7358438119140550901","4233148452965893925","10663321108824915035","6219199920738458568","12675394453950506524","14365812634274234152","17562433898646735644","2084827785324149551","17654758265771474466","17480710742382774158","16750351113728084531","8141902241494668244","3756442844211182621","17047983828702739612","800617850550007764","11016240537880372548","15779372926416302848","5245392304960306156","18433965256205063878","11883814045385487346","932997006518341810","3323313599007614626","9963965173704639105","6457005241685718504","16826905369003751201","728014600382926365","3514918971401506177","5528228057569057604","3582111890055764487","13972309611605792791","9658181051784784789","9797643695517467326","5837717517154019013","9814157551744893623"],["18211993505908099680","8594881676736113838","3617102565331381335","17692528527181333476","16668194635115078520","11475446364096793913","4079945785731806448","13254104654527976093","13451943793408308424","10881553797409133762","1996103069283789761","8964421300405778678","12485810459116297081","5325949391588753926","3868662329287712182","16586980957751419686","13964256840556164052","11781917293346078973","15395261643094726894","3569592502459114085","7815218613670817562","16407277847799628924","11904475555616760492","12697314078606378873","2478772948966374431","781602039446610219","1817026832991176547","14942272492621151166","5678980358328765502","16063961313912819723","5650095528581154936","1222611979965670248","1275441715936867961","12795427443892307738","13931280426298688041","14290929540269700755","1944442494627625366","2662234311518770002","15929622370415558981","14110070528846966307","1880212160502493532","14595653492916329535","10018509941499873530","2742402930910617677","4839768540873675438","15901500519298496455","2949185221606621199","9164389292152602322"],["14894642686913050048","5294326231853530634","16658342638768983922","10461300872886543300","18129560064133007380","15297764079175450558","439754760353784787","6427169791714897273","7488146673932391578","9983473456990826650","4928440450203476121","7519701148234770530","12727821118663689759","4559083073593474463","3642576560236751039","6197496379292405175","2400022226498163703","18355099964061643796","5321508217809067514","15049930255099008340","16863360083093692062","8384943839927828788","9615838783158505834","14735044416503032269","18184396909757680242","2793613405335513041","6176442768663859638","8470419698164799008","6412551720079386641","141607347679752771","16540258419243267680","7340989544697135166","1434968441340539240","11796257050141131846","253781970450866109","8984506130892775827","2812259972845637136","17650403976262162596","80827561434104825","16059342965226004621","8599730355318838838","4833751326085937440","379154863134580438","15703088402421614044","12836281190420220996","4547026199127746160","17225479765609788005","16071826946067613767"],["10162661906520303996","4294554340952914874","12688478374086673981","4845790270763175276","8797552895069151347","7903128717122062265","17194566347206231839","15958301449900603139","3150453006249027349","13947028340439302645","8002269722683448009","13833907268998710460","17089946916404817561","9692738327781598598","16936282390143912713","14312201209637910236","712757904948182910","16432271324598162757","3897582291431844832","5593107218435078387","11879932523992172031","11385793686868669279","13488139547954136836","8949299405364786931","17427680072736970573","13300316059085548695","5037374540595507551","16653879577448926016","6545844673653258652","18029029004975526749","11423606991465609306","17938932225570809439","10519872688183712942","770857529905415840","8983128387183904952","12372568761936655789","9718253468948929469","8282201096596521484","6377762410984949157","6252083344009116441","8093876942256619704","12518515508702189771","10144243558186861806","4742907129050818936","13668698686820774799","4228103291516313815","7988905759176383553","9326220940628920127"],["5629160415023971391","5115184881753386881","6179533493383663846","15506871246349261343","753543612334953356","12414359687183612886","5330486715733011001","1566318249719930177","12927453402360177343","14233349871641886015","11994170965229289816","660776254290984965","17433871492548937559","7550920349173492569","4339692546654643138","9239801464147827287","14220301426875588519","4706604138124000143","11706366573942468718","7624767179866185341","13421619274213107280","5592600900405464360","14340795155891905334","669498237667101708","12238115308510913906","9720041350665211594","10497498107628996787","17969601472169641600","5379601757766884535","12949106314917905561","840584355643274207","4149802768509771093","13531864544412788348","9768474919966702773","17262055431287440237","5826393002193236775","4911422528212405778","10924991427694872603","11318339653629295261","3182380240319956835","11699280953883544551","2643679853858590465","8307074822160413345","174561275398607382","1375920945307109908","16056842382466563302","3402411761393816624","13589849328856034319"],["2163184480607188589","15305098272842784478","8046121409864137362","15361911836221518560","2350328896449112774","17720734446367856785","14299364908359123273","9489398203515664801","930192472614573295","3855585432396459292","14885619791528459716","2977929407235616893","5743687253573741864","17640735850195029571","4002792230336952967","17870087506465320546","3070745938780654293","6429762073109728236","10741268653822282084","13556554432844319481","10492014241627135381","11108056465627440285","1368703245165340620","8091223297633812888","14830942048017796479","6067393324446276803","16914751533570294863","11966091182240563516","9289075739914202317","100829979508825766","16467022962430033495","670147386867077014","5429252336781538943","6955222387773444260","15757424858453539966","7995059106517464203","9268611199280702574","7788230949139028517","13569049848011288724","11999297078973437357","14450636968365551363","16492057858879385513","15687882910219319291","16750858992856081757","14649368605852884642","8706875162252558109","4802668277389693028","14154885673879899167"],["15259655882196695379","1786567637924388898","12570462022064892820","4310471400051167471","5240974868012389325","6106653093992197957","7650359197381284272","12173701220126861452","4994977361684903390","18308249425741202352","9948899114237204529","8108019901212570335","13525387766370858984","10011745634485093999","16894315708831438718","13634972345488294538","11993443433797075931","9229767418257126666","606429663939656781","10364225868104793764","84156348719760999","10727194917724218199","3353063214198889754","11016035302146115476","11521537243603303898","6745127415995193721","6828058031343348048","206459372476600936","14565239833853814426","6132628912677399113","604890154328477423","10451630077339813522","12750035201990459518","7320121126507568927","12833100265680693441","12178396746739614610","12316474231278339991","16572500944485496500","7899044267803978586","15061334014646894181","12799465039846839226","14573941003090499388","14037144310142581107","3613844148188648356","1974395156687178738","17917610749178141962","521371186235009860","11786790555363508622"],["3682811340691103845","11084542938242088417","12027210738199039567","503625987503673319","1128852751709749902","7452575065658650721","15488463022013603715","12308361269796128448","18360154236644717028","16773942435996416879","11238834092260700021","17256148911298655232","4993487534285850837","3561809679382276752","7633203816681650896","16811632610738377958","8586923894507136170","377116084138671912","13247419158682172962","1738457621974746025","7644571410554594142","6836833874830922751","16531101384986479276","5973065761785304720","7126850086886779010","5290368379711910330","3005653674943312244","6924419579735806260","5606166225223243869","9401046374780081538","6262862762595377824","13405688360657802675","7400113383638836065","1508174176239942482","2639205707162118347","13191795894804637758","16734186294390474325","10841437627279957448","13121928210345146382","9472595113964240859","16876393858719560571","13740387917438631887","14010267682136921041","14829620357862366541","7756666339754713193","3110781917683296294","5527879786993618237","5673483153529521118"],["2801972532363563033","248852105182888408","16303996703482513000","16889919473819673289","10952875255810852049","1595929967498730142","4921406147472578624","13564054010651430045","1010275261034298773","1267573310060131258","11102000370774085461","5692853284649097736","8485754577953228833","582153912729908794","7588237898639642353","13318835068323655257","4339102098514249298","6754710954906409569","2441248241586750731","7387874984522837707","15845688359819993989","256464076159149731","9703676583934318473","3197726388363028071","11897869554149406092","15179476914391166279","497878583385748240","7775700245512019145","2796011434654290510","14679290890496388794","9468713178246182938","11139131155553287770","18003350049682776200","9210277361977471672","7357337639403739904","16129462531001284409","8104587867032092475","13028403150506026994","5776563584031654131","10214119006611173016","3731331294515225910","4128254625931996766","8909683840377052570","18164202344469033943","13962195766094268515","13818953749553312232","3687198577074554150","952147724639298714"],["17565536413104167349","9829160396339581796","17192746248996707749","317466905634904465","18289400557519901873","10486047352918435967","12312109674229744093","13566825705695241818","2132602238504029010","6142916821532084646","2283363905278821758","1595298355468390884","7655526158594930923","4753430242096847206","6182827653051839012","11070046444259050620","16158613809279849675","15610464426716783605","12587978009764033585","2615081529183271610","881442946840356948","2215096887885552903","15143045573565997474","8769725582004175339","14934373507984096014","7999152259184918990","11337468425750146116","9204000610783543852","17713140463026875475","18288890800631277515","8406413788770441231","10865303745475530372","17740192282308803761","15819559177092588876","7335784978228620688","17446131529231362260","11637895596955145467","9299008896686053518","3733743211078056482","18153152968736890656","3884473500271631840","10398042964607816064","11259729187518625603","8711999673617917629","2467337151278515777","6504463740699848306","2287986329830019335","1008110343876241770"],["15186115173202828584","7274706739666523413","9224850024889240273","15366554639179249341","15310514862290351356","5902516458705687505","4764927891251916167","7928329167245044082","18168704259293646353","16575849522576062261","7726506488103939170","6623166433269555963","6547780207152724116","14447350214014965195","12997251526039556065","1349893654865604388","4978740133809880127","18442205436542292795","9732075488874237802","16311613223423117115","5409073128780332346","9093207326226690284","13258875418627921133","970652572106689980","847457864600738149","6190194202033005779","3559931483056373942","6126677418563205881","17376405506785295570","3162270671093577826","4171017455602425433","17926596259557175711","15920953090882524856","16430922176469337217","3736804624792844119","13022060542924552611","9163190164062721869","14151187229518143199","9420987886904336496","15576588116445575814","10884454990225544224","6642073691921525625","2116300321418508415","12431290537589162089","12777969724210300914","9570906891996964891","955410047072257088","13991039242246452722"],["10106931966336149760","17269123187083317317","17654249627064325156","825948020750633985","16155793172634186209","10614343692089474035","12195941817077212262","13279564518103947986","7643773232272352547","6524145163931627265","14694203219192533291","7786491217291510590","14728784221921297282","16408394939768850436","256380985336978328","2949288849082857397","18187691748956110770","17894451743452296865","8598782480215471866","13448090700535737583","8811571542820660510","13449536445584696642","7558264964683986108","9305674249081998145","18302907549705527117","15787124993945407116","17732359959846436653","14396529391511833472","4679779460599800542","14332616628735260899","4373148469220730657","12966369631071409165","5895918514488644518","11664394248622107352","159888025360473187","14830457557053083567","5717880251411417886","1677300936999680154","4866188382129437004","3744437324359636806","5840135227144807570","10393943228761459152","17860456040903887316","8107524116974277124","15343806784617009099","1629941161293080890","7917219811691563029","5024537699078046664"],["14066707965133909908","18352714773723223347","7855187635543136397","5607976120868652469","5739338070057296863","12753521230381384879","13101533827333016395","9112845157350517515","18139929831396453461","5803242839295998127","16481424943960940939","14511611815437333005","9423703024450210502","5707253633496754455","12580066293537415796","8731166120110981267","5276336957283292247","694659521930996947","1223325465248870524","9329497933282678900","7215233084572650860","10440963499080337116","5567856848112586143","677071994421672721","3545453178609395079","3382388415295455878","16168903446286497112","17976247278226360210","6012855692399105031","28581634035031269","4629081212902943807","12104260962274730772","5795131373487431598","15216093139008965951","10778346520259973241","5605830348312345312","3533293249036850164","17099470659320208975","8432842681228881479","6564873496526727065","10011833039788647825","11541956461643731856","8591087561234288052","10391024956769827362","7253612731654350820","13348573701552401220","16891073904235310288","6114857602905055475"],["3423149301271483647","11382098137989681991","5484333948085255652","6855069308192740650","405200049092810684","6860249532731745476","17396084476147766651","5397233463456818633","1204054387656169126","13418096006091884981","8415726950772569289","13566371601387539542","7082845845549174373","2668934197671927224","881332035317071203","515523196883829257","1841333769256698273","7025314454769709508","7516662602303061965","4647253356551942114","3051622042391022132","8857713243473472527","17189075039105483495","15521949739365387461","4843857153405978739","12843059389532429154","2797706216049586189","6934080497460350319","17103378957006894520","6604200418176207646","3131071776817565450","6778880462351909221","8224215350329219066","14820602516663837059","15833796593766462898","15031199363511623719","14752163726120155989","6911413567908462700","15493617154761428952","10049876176533864850","8916710013286316767","9065860148277159392","3321917956783987907","10984788240451635201","6638224369154017073","7328665444806574482","14941241062614173824","4434154062206659523"],["14880098052800148667","168528653437631087","13034243590229668402","4999208530253274447","11822407895200351349","11899645087279022187","4032882045386913091","9698265256645341203","8576055646775803209","4551627113295658060","11051986839363598994","9509275606474362596","9594591625427540074","2371964298382997936","13631813015236732459","8610014456458230202","1556293836271908270","3810084416422717421","6298678452239825648","14444991063341496864","13225841349136949294","16642628734143520815","7697125259618734680","467509567800711231","10720600961182756716","9285289280547253742","8402602260739364139","13712193639615430242","2588814881487393200","1514613349541729172","8981695921952842005","10495357178301113742","6053403834738711337","10736307570749901629","7253402169326957666","18093963022346888499","4838305125374823928","9713535224799125087","18162140676669574554","3989089975007733176","17211713923447140098","15427713368977973125","2703339611584114907","2176708628464501327","7806565430954010971","5670591721525574272","12904801460455207979","15188211446238731360"],["484667646999739656","11275820112526093365","4715152697268112052","15343433037337281291","17644613339528405184","14553572978414549931","14501045849189911359","11257256233402921847","12227815365875054817","10163999210911550609","16069561370641916504","17326821371813281098","4539133583506630145","6470625497416799048","8989856730061847054","14134458313850754053","6220351442457793868","16757552922949226002","10104312396247569624","4330558329087235521","12045082413778726678","6088660364645126631","10256260539702506051","932934370103322640","6759610492000467598","9576559759647989433","2284208874759880450","12593242027307719476","5926413450902347723","17204514409105058673","12004231817503938128","18322969418533922720","718943022893415678","7825277324925060764","920394665391632595","9274893903691788044","13193285182246196994","14023406055286135220","8836021419000675528","8812721591119680317","5833969613458258668","12066615810407309355","9779055412282929291","1824759681503741888","151872411269854774","3058717275490675574","11833676114615848712","13505822035886768977"],["13517294038745609556","2558958584553316575","3826893372048096228","9880852219132606752","17537019291033832755","5193974349278396892","10057107792655744460","9014241123906723013","1986473078802795721","16702862294002096182","15765446332287189829","12245220152477317977","2082988512309840952","18220194806316855687","6335282095194063989","17744895711223303647","14975214751077670590","13010165135499566874","11632942286526249262","4449979765110289510","13842749809514033008","17856891722554091446","708588738792517795","1176491357589808530","8441155317728093453","8710215538624104660","1886710962675712487","12232943922057145179","16051770976160823511","16365515207359202734","8052312966764296738","1106555922587475909","6968614317871654289","2898377097941724715","5394522943655600705","4618971710797870358","7361804988976261408","4560930231925752374","6410996954559979962","18277703536386428708","7964844438931833618","8409823060132836889","15760026394091279954","13067335742775073245","6409471586270087560","6843460203439722993","7793110783902324470","17281875260680394432"],["11295725456250215382","16272420514357211244","5807782698482834910","9187665170195246799","16941534068041560395","5853994945310403353","16589653311675721249","15117992378632944054","13558609257794294815","2147982079131129233","14965078535079536056","18403293345134160604","10263614879229786075","8856846347314381856","5568222894300164897","17516943043991862790","2135973529714799067","5006036599602702595","1809854735539082774","2809489979089652066","8446034562736948586","10167984780690148426","16316196023734789811","7783651026675206971","14933192981589936273","17748520637944976894","651659245374887629","6644723947237173862","2151116988770464405","403302860126259530","5475503978023724751","3740889718978868302","14791704052374411855","8131743652789530368","5050808895956004215","17812626328251978868","14146744973661509500","1679017235052099466","11383119068743810340","14295228796155523702","5775882764608412771","16229229772436208917","2863482971206186439","2626974547740768229","17990366552957799009","9758900962386199534","202260621336075891","1525671054412416516"],["5294308130122066791","13924974995908700241","9492073319798401411","3992203927873233311","1652856992557081915","13851366796530857611","10588081682638974911","11717442836826328804","9289411374936191598","10748813300694537004","4362341516257917044","10123090072599220260","18420235337035137981","14218763364722433035","5455900681065567261","15900157223997896125","15000355174521013637","17657621559171669510","6312811408909737528","3881889988292332507","8902186137717577607","15400845752608785096","8176647602029696475","15809792427525695671","1725467514978499511","15146231066056170585","9080736072470439991","9236455452529200092","12121874904006423055","3653446082517837004","17963831138714310725","16404191182971113388","369259219684451123","14778746646243897329","13142286321340440771","2608638464778345142","16368385325929168202","18328133465437292395","727301918656609797","8906485058613177189","17157304986743490151","17406391592012941232","12493816375162978873","12251473293703935425","18028747354582098402","9603523116741525979","17383874445310168585","13292679815628014879"],["2749436468073846077","2337329820326707526","16883199102211219144","8820976636504573506","11897245587599549494","5723962710154354733","17286093932943488061","14628388619162686688","5549040059501356018","3819711761545819922","62971940546414497","3285385723240130653","279160122188447425","3756694164928926254","11364227989830781785","9900472155035025850","17515950998274884824","2540757011701538970","13810354868290748046","7503434764317176711","17381936572438727947","585398346983759043","17032217385029159513","13994463995938723274","12912176938818070344","17331525513784283802","14301100307171117753","7735989828774048777","13118341218224308052","2934827619641750747","9333349784019788561","9856218310909153453","5542269049254238644","16985911691930344338","2174353912688306911","16825950897263944787","13480598170268984592","12678153758225640756","17672240557571009033","6990977691730385101","9601578072930584831","13520981391896697295","15214497119984137053","3603455149723853850","17135405864974044979","7786319517624764530","868969081534272715","8655489184390126138"]],"s1_siblings":[[["3564662237888420141","6569658148878524778","15906591465445718497","5865728960428487647"],["12762517997981787532","14813643585008551215","8099894032185384025","11407124589539083857"],["2261698361691852200","8106604359508928196","9431577555692019585","1405872154869037857"],["7530512908852256090","42130671203508480","14005498864072506540","11941254637059774290"],["549648765300432332","9622824996582803684","8933888211369044309","687313920491621652"],["466700089440647900","1685241548182153625","15637329276365590000","2636643312581807069"],["7340464369518538064","12481367606426559966","7680215485343293418","4379470145105540954"],["1057512951575038861","9275849023261550220","16933732546445625619","384189890548892513"],["15191527533376341870","13384943217737061083","17359901386484512793","2283506459814656237"],["17788515659330513354","3170300838868073306","4507728047073792544","13106746248860803984"],["6442254089384366020","17660256276028112232","12714665913476978423","12199451168613290388"],["13570899077506326294","15997439921623267002","17838200109319575562","14515517177267094479"],["12735056100866632537","1414605911706313448","10825141439233317440","3660381512726153061"],["10077645057914391497","11420248024189096727","13170482471281583145","6237721680763478599"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["2368935300809893171","13346227690865571362","5768443715706397780","12961726721070165208"],["13895227031059825452","2088217257134001301","1322005402735469595","3804703036731640331"],["2033648372498691673","14241875372648404653","8476972270939532799","16840640129377571352"],["6699075646704013992","5703726327489906990","912837062490823483","3847339366160761768"],["5712826212167560045","12019493541000406521","11647283333418428219","5978395369933609600"],["1558951918980116147","16904608129555077565","14144667279320022993","2412538297750218190"],["3176689778495039920","9573121490044776906","1019787355891435227","1435476114491200833"],["6648435246918061157","6411919787167628481","7497231552329439012","15307697354368782400"],["1864815238263675181","14557063865452046193","6522261267526205368","12090008665307955257"],["477505429324706841","583124803088760885","10091378518347388275","7132362860140948695"],["15837668387584563938","4128345274116316951","14142968015542650030","9075340062719856060"],["13570899077506326294","15997439921623267002","17838200109319575562","14515517177267094479"],["12735056100866632537","1414605911706313448","10825141439233317440","3660381512726153061"],["10077645057914391497","11420248024189096727","13170482471281583145","6237721680763478599"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["13837363391585355151","9872936769531528838","5344009267151983806","3420990074950481390"],["12167881242482136008","17798665408644206910","15546552787959341215","7272733134346438922"],["3467049444469165066","11424740120600167795","1143666033686213378","17542344964396040871"],["7885649188252411479","5388894304799622212","8755341090024810918","11884527397226117324"],["14364299040417047574","89017241868230034","14459450282117664612","4492593641046349088"],["6172330995940327536","4404231682389577323","8172667892953283861","16468163277000321133"],["10469920252614950179","17108344569010460410","3138792351883367644","3828886551812852182"],["9016578306136190034","5304750921782290334","15310830459754257417","2533263040918107263"],["1539823019357908675","14400598472077948970","8745488923601679762","15890362481749424007"],["7816880213595124691","4153664006408731061","1153300972216526904","10168229084344967367"],["3275625450976664994","1374222746037921902","12472726198907405791","10044941327355823218"],["13562458069027756506","5643972669596615038","11536232487663636659","14302254980603381046"],["17435978886134530741","12330235002322576282","12827219469297137562","15690888294192769238"],["1811824655637624976","16833341538672961575","848841426380022811","10198627895541411343"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["10743185360717324376","17311412573417009761","1527390310143824049","11433093750390404622"],["15197927263766807782","6899467787993047506","17486808852434441555","12651353765410806674"],["595227807388309486","12284289936845717099","13020400679582588474","10260535946294276969"],["6798099912934817013","15522919468304255768","15555956506139481441","661365157331707981"],["8717706549468304561","7559977338698696282","476943209992831992","9711598038093924790"],["6725816218963408685","8838602701922326909","9845383031184947401","13791336496033744073"],["12491034413030237564","6857199236982247261","8726729773199395475","68036283245785730"],["3075134142959380838","17705801637613638909","9615589127812848635","10226930505329893577"],["10727598592994617617","1865839382542546017","8195836347371849459","2991875663681132318"],["17739251728134424417","16634784874154832951","10459889216808235924","14378598190044436774"],["7029064128286267229","4615017461657396416","14602378815103621924","31181790547432173"],["5201413756325841088","15147715519363113517","9812801431880779547","13019169983419140079"],["6317309707520040131","18096935055072083814","6188981308201916820","8722368834368438181"],["16814750925713244110","13700292391881604535","1839315569439043128","4073318884414635469"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["5844810279940005129","12627325001513915210","1897551176815136883","9536337047197928233"],["10754289803783549003","4831473864158050088","3807274095456125961","18127484210779306814"],["7900609562477627665","13017482045693702707","3377625815898872768","15622865057827832301"],["17589902254686636883","14135521595100296539","11076040527193988515","17251985545560101865"],["13890116607943968500","13572478063050623694","12208753045988654932","15974518810603813576"],["2797310034749108629","1005302132954238791","13190281160393222164","4828286394090644189"],["1905182750489321118","1103449235624482399","4037558810489638917","12842433870164090315"],["7661002584320578524","11036502410587917226","10301266727262929735","9523126393763770562"],["11472061786017760982","1424906093343643528","14504196600481627226","10999520836632437424"],["9450100512623640851","7719990293167692638","16991462827270810397","13337147308998047294"],["7362675386420225558","2027153536889453502","3619675231870858387","11031960149308664405"],["12999734736212049240","10970666897924708084","4899583084047930349","324202276380364510"],["1464823310624998168","8753877798188605173","335290486478492767","7840038309318801684"],["4953058126852612066","7295803764265265452","12461736607502107778","11675729511891865191"],["16640067403181303695","14472174971608030073","2474118070280163171","17822507386799416725"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["6523370004446995137","8595024771829997714","154025510941873125","9974346671486358988"],["14401608176348665770","13334209605688175695","223928116019639120","10327275903829715785"],["495749184474090074","12332017246563437312","12103867603814623246","9895734957830070471"],["11632988330376328420","7817546445545336207","14256585557577145053","8367245029284828007"],["9092803185969923560","4681386949256684060","4167181445968175850","8208172315622713824"],["16126251460002465913","2768823832758210224","10942594972806820561","13941035333207870469"],["9726694998321467086","4576628182252067509","2996858579881205626","2768587294801127882"],["12358009920277113863","14322295644547979190","5244756688107739169","6746982438602013085"],["10429616217395644136","6686014056574793574","4428888280392122716","9152367890481197925"],["7025427923332985094","12383690265709763076","13874944593044720168","2704620693987750205"],["560548034950071409","7850647799430218226","1035776491680274897","9593223202408341138"],["16917456223938136387","1851112327652786869","14229562692185400190","9086299023487228998"],["13189007039953456678","10984716809686908521","17383401267908126108","6547044914800604820"],["10970709633316323900","8159678560055369739","8282129636110019187","14269830541173418720"],["16640067403181303695","14472174971608030073","2474118070280163171","17822507386799416725"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["3084705468503079404","2019206883559875679","510679891382340538","18032819543658434993"],["4505228768335512530","15523563939054678363","11553193405352520756","10484939931941865764"],["6720501414656549150","1981306704629596213","795079976796077716","18432895862917483775"],["16018057414170857964","16374738235390827756","2460958453593413497","5380414895764961458"],["2008213124599383199","1929753896640258143","15345643626095522485","7349197657479666593"],["2971809157305279458","2986024046821927156","10015740017746632432","12558297470392301895"],["15952236299644731332","12178188180442400735","2056386154592941824","6429342913131929026"],["872072826750488306","11103843066067945209","3197666449266010585","5406144006617549734"],["14610075462128324390","15614091846416650632","1216881272667100960","13730582176198733141"],["1051947911110665620","13231457573693742111","2573609395568609300","8456028491059000064"],["7171848082554875116","1575577101895042011","10347520279648854709","17024864628018875231"],["14564460242311452273","6695772284228068201","2898724081849926780","7595874300408946886"],["13515833844507891394","5306501149665255233","2699831880699816893","7634508893722396887"],["16814750925713244110","13700292391881604535","1839315569439043128","4073318884414635469"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["2496215948333767501","16391082064275990368","6992277202494624649","17108542411347231107"],["2766735686949650867","3735335910623958046","2025878436382985623","3075453917837613485"],["4574911356928187327","17719372773050753868","11907064561783380290","7819314332462956906"],["7172841738341556086","12118584828525015724","16863236398112783388","7273671667629969048"],["2677696165760652158","13186541921585133870","596711510616822547","15344766740227529162"],["11277092033481403971","7292032842111598899","10857741876572567631","3129600899983170616"],["3535112138402061287","8443863925627893946","4348181636837127505","8558647972919026154"],["3514325573618940819","2551200074287962348","10322199081043574830","9940843003928359424"],["1440083292675770872","8200211444473850930","9453175598960530874","16533414165966649006"],["17842835707841993448","1701833707873922845","15998097676274914724","199142879787869779"],["12897848538318205270","8291298960316320311","8065043068799887587","1637318564363143537"],["6959253053608948108","7120693508157105414","5984186612652844727","17482746727839911714"],["12709498782981850848","2305165691020368146","15435115668487876570","13079692104673719884"],["1891574769011438453","16424880493379397662","6566751159246279847","12904178672186346126"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["6150471710170789860","445810244826862054","12439388357824773411","7592508301143474736"],["1975363472557684956","17746348660794353291","1452052567845978652","14859800548766868682"],["8451347215806562759","14394436299294825170","1892134640207154953","10673443366858405465"],["2470915599173074","1198647404907778169","9622688605833869051","6190998598451630898"],["6112800076014300444","6957373235146328212","8348346180039997162","1019044784240130504"],["8610776819824433936","1165127827708547685","1013691420026318350","14432977710957350349"],["14268248140687519516","8205158160455692160","11860434267086124353","17707513127831475179"],["16417958352384272696","4959691501209883434","2789304821528142955","11797794910023896569"],["5883815110081037238","356149206638970760","4180583823878684891","12203319776752357451"],["7538352260001768038","4505112419903418892","16619321597769253527","13718783081310829515"],["14461047757972191965","16103125521752699418","14496088487200678948","16523838837555545821"],["6023640265555948106","2824835068793374807","8815607896121578847","3848253307341552549"],["16821048464838221250","17792648823208471461","16726928346171546242","17399096040964381033"],["10162384008798365211","13707512293248066018","17170471677326792906","14326885123379947591"],["14084536773301275090","17289170455168664208","6224121771916681747","17177563915117926878"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["15128467868298164912","12789157829110620031","12296557268268421333","12721341416127407641"],["4528744872431999068","17368321862641321044","9242726835174200020","7441293820544859856"],["805706540658324515","2106433502721807108","1680370388943591190","15243739185263504647"],["9895637619928365467","7257476343147577228","14115164531528026954","12985821937271266397"],["10459015685089552057","4739615961278228919","8850763023883812241","5560276487724230501"],["16790933423515619823","11169439276141879794","7854601257114793983","16266078514637080778"],["3982872090198824093","5144446742110824613","6585983994654400366","16817665116485893472"],["12677796972915706778","6636160631833164717","3922965010154032309","2504426704098008334"],["9061139181614349267","12427702824885746824","4760200697110298216","14857461672979230666"],["10887191605536367696","2258350493365441005","14488506181852506448","7021293054212991716"],["9719678984733628693","18122999640204801117","9364929965975480655","3844806407630703689"],["14564460242311452273","6695772284228068201","2898724081849926780","7595874300408946886"],["13515833844507891394","5306501149665255233","2699831880699816893","7634508893722396887"],["16814750925713244110","13700292391881604535","1839315569439043128","4073318884414635469"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["13699969370213022408","18271825241979715177","6259689935037201014","1673543034912646370"],["11432909552580841535","7039656345664734191","8697278633085475165","10759943289458044071"],["15657928946386744101","16533320884550569066","2030140757945046008","12728216221449709008"],["223141017814505653","6561113911140559487","8606485659653045008","13755934217872071789"],["5092780923154742270","6651747870846689909","3962393660988810333","13664051192119463687"],["7215468949023803613","1629635824931038619","17831244785698997565","129791820126187526"],["3394041791052260198","12729120763631767479","11056676702292224025","2323051372237156376"],["11493011168844818642","13312898343374311264","8065511903055363473","13323184348798542602"],["17684480441809793273","11243672459674128208","1598288410510280582","3743161128340042353"],["5011145622566932199","2218127285473880550","860723775098208050","2106017838223449254"],["6442254089384366020","17660256276028112232","12714665913476978423","12199451168613290388"],["13570899077506326294","15997439921623267002","17838200109319575562","14515517177267094479"],["12735056100866632537","1414605911706313448","10825141439233317440","3660381512726153061"],["10077645057914391497","11420248024189096727","13170482471281583145","6237721680763478599"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["2047218543160155240","5651814293394180259","7229873458137936290","16870769795978252044"],["7184357940593145001","5172622186544056475","15601077311225972123","2249205506778908620"],["2876089123095625681","5487319792122765673","5305257560541101254","3104995513063574400"],["7580613893969164556","4253612071742727409","11656340852238011980","161975185868878753"],["2531415943595856011","13787884240739538608","13227706918049693257","5780723285464114499"],["1243831563573937646","3337883644450648566","15407279955768175394","11215227177967857779"],["15116088601386886680","2231635788267025083","1734683689725555798","8538612572615507107"],["12959020581509661071","9133368410454094461","10039640038030814208","4967054049826966141"],["3622027881709282558","12548525102136081828","7792189787616292044","13408314085767296999"],["14247557081993855198","14187046568318248160","10658139716781317005","5288977494613204690"],["3292628074275808652","88821636898827665","4782621870501846598","4022172257151334216"],["9483251031036668247","15602422010236077261","2654705160898952015","11581028194177742400"],["6990189063873260143","1384865335101916673","1018376322356738480","16968525084126447446"],["1891574769011438453","16424880493379397662","6566751159246279847","12904178672186346126"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["5381494737412195385","16486152947656554782","6558638629285396736","11154068106741234940"],["8602748096273000964","830752750625798326","16256269730028088108","7375242028097817230"],["13391352665487546420","1014234343197751851","1722027134589083675","12372554133926585063"],["12975733287777617070","9214986907439553417","63138254119969727","4100931163706791933"],["1231311224395201997","3230830122232701536","8694446940198230850","10574772096375086860"],["10749139480088950673","617734863320433020","7489638083592362442","1600812746074092695"],["12952604279626432375","8824312918024629123","196019131232412022","3801297580163355607"],["4262391689309120028","15809818259509478086","12274985090465989285","11701596251502206488"],["3656194455279213356","6440440018828438002","836503949575927614","1093130284474864189"],["477505429324706841","583124803088760885","10091378518347388275","7132362860140948695"],["15837668387584563938","4128345274116316951","14142968015542650030","9075340062719856060"],["13570899077506326294","15997439921623267002","17838200109319575562","14515517177267094479"],["12735056100866632537","1414605911706313448","10825141439233317440","3660381512726153061"],["10077645057914391497","11420248024189096727","13170482471281583145","6237721680763478599"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["11841465176813167806","7335247010058952480","1102062723895760039","4692849032015571359"],["17974038701359059544","2170818242009791064","15640407168209088298","9167096940159345412"],["17902105085111255752","4386985476526335660","16347627041262509759","233834171674564196"],["16929034686666107600","5607578430679547515","14959344605025732165","10913568953365164371"],["9586929347327709510","423912286676067165","4903620656112417485","5114082800990919586"],["6821631718689041857","9784915110773002196","5261404003627064151","4690291727378302884"],["3522305656757530637","5038875938163567500","4791307280984357556","16746344413239395296"],["10720856909715255254","14292272583919083060","5032396392082586980","5830013742061690057"],["15285589633422837879","3169248625510415416","15295887048236075235","4964079734828950048"],["14270212963224701594","17384359197623503079","5586259975974568189","1696273479090853437"],["4915580417317299132","10345100811857237149","2275212803764479056","8230508003018973007"],["687163321862166536","14587856358154676114","15494386223044171159","6745117883414371473"],["11016958552845519412","9170014972402103625","346118991068753163","15091789125536462514"],["10162384008798365211","13707512293248066018","17170471677326792906","14326885123379947591"],["14084536773301275090","17289170455168664208","6224121771916681747","17177563915117926878"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["9744046386233379723","18338898956358362835","12561701548470517477","12687863676792771413"],["3126035569825268403","9564565653753437698","13480499378852014177","4170952176988312011"],["11140798978982606900","5689205214036252678","1609075375097655452","15370580993687210753"],["546678883884982406","11335102666688691278","12221259137184140686","1164190384669904468"],["12032235070810728851","4678984226604215062","15904825897973239132","2643533386289369974"],["15958741425814804049","7644307524673360021","1800860681652202579","14407844579591553092"],["7044008942615442617","2950034353797616063","17373937039314261079","8477715893722762070"],["1485762682181088225","5507597346450069468","13859687207642393616","15396419719572708951"],["10985047333235095273","4237290865298427010","5526639065374320930","10239089318991583299"],["11379828611507729175","8696430704557520963","11415588431016077632","18176999622303322514"],["15837668387584563938","4128345274116316951","14142968015542650030","9075340062719856060"],["13570899077506326294","15997439921623267002","17838200109319575562","14515517177267094479"],["12735056100866632537","1414605911706313448","10825141439233317440","3660381512726153061"],["10077645057914391497","11420248024189096727","13170482471281583145","6237721680763478599"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["6492809346785410372","7802250389426074275","12198582495345672766","11643960764713794446"],["5656251212129771987","16601411988787722270","16123325794734714163","3153388231128805791"],["7401056234094202311","18049416734305699089","8235427198952309046","4751304807927402105"],["4754414250054442135","380424387811719184","17861261051710367963","5944660226849017553"],["17705122053113287268","9444444928627899014","14570412934374744462","8659578871010631613"],["3463982581378621057","1560131389629309302","17304062041059960830","15193368867223798716"],["5940921788941872562","6524510771488093819","12893303473324114204","1792016168218906034"],["8363352549621499621","12927107410242474395","6519354200585240987","437726819741469975"],["6097277661943216566","107453761362852862","13025110616449990756","2539799624437945928"],["11754040181751460989","15657213082270936394","15229595380994378525","11581093350711212670"],["15670499480342301824","14260116509079654179","3946091918719767445","8789860022605595946"],["16917456223938136387","1851112327652786869","14229562692185400190","9086299023487228998"],["13189007039953456678","10984716809686908521","17383401267908126108","6547044914800604820"],["10970709633316323900","8159678560055369739","8282129636110019187","14269830541173418720"],["16640067403181303695","14472174971608030073","2474118070280163171","17822507386799416725"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["13936986137616492191","11020865888100873802","18072642313695468677","6675644026423022839"],["1830031268245098904","16343857781603648218","3409721437878140980","1810806944045825418"],["896890334779190545","701523023994727471","14376912368418967347","8406540142831963694"],["15215232846126902859","16028199206651048488","907309754645929971","8263036705184104665"],["4450295488456151475","14699330267359663830","6791456422451346981","6643966487887925289"],["8047786690485874950","6417516767293778878","6737200319528826240","18326883810543523519"],["14783279285823752278","15438164762034974485","15300459571561002243","1837222394122918320"],["15369196167866752527","16790908880527437843","1995654791509413964","3750414118975722222"],["9950628086955888690","10005175587613260499","10247887321998711235","3465414586669551598"],["16198858460754860918","3788082320162963746","4777796065713695371","16918698950149396242"],["7029064128286267229","4615017461657396416","14602378815103621924","31181790547432173"],["5201413756325841088","15147715519363113517","9812801431880779547","13019169983419140079"],["6317309707520040131","18096935055072083814","6188981308201916820","8722368834368438181"],["16814750925713244110","13700292391881604535","1839315569439043128","4073318884414635469"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["15897825146600677665","5899420860069010351","3334188544325333739","13747919194005461391"],["11539396925536777967","16885942409581047251","2803638510700020797","6708532489722724416"],["5530791705090847832","302599035028008457","10454987605668556661","1343821225009182413"],["12433100028251100867","15383261601801027322","12901350362656588239","2507513648695454489"],["1632683823172670575","14200636934469507987","9088211109602932543","5367737953768279468"],["6737541768749459658","10192639636956216408","17620332151392148810","4042188530444269210"],["16836188104602952830","16734816227709029918","18357716697726703400","15500102257644016799"],["3502877912850103865","15435191312509304762","11188593824273267272","16716771150547037985"],["12580667817635169423","1385154178268623290","11225762770997269215","14571414610063304929"],["803849336471690812","8413742866932552357","6950985860573776650","12802422698272754482"],["16322088776123566614","12419704732401314971","7746256007767548951","8336678184862645004"],["9638184052047988825","4863622981014361335","8741869275619881719","5361433934038967857"],["17616375000206986353","12866156696581227865","8881991762661332974","7842875305926517481"],["17470792642311465008","16258592238846626400","4450550386083947702","16994282083524561667"],["14084536773301275090","17289170455168664208","6224121771916681747","17177563915117926878"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["4041485929926454875","10084300462790944877","39104863589546896","17588332041087332088"],["12185848940083904782","11429748319048105936","16504729673094425973","3103518809965236640"],["10758301388192802775","4233451843184710606","13896537602116417212","16836783395299820010"],["7216073320941158834","15804514325485381028","3696152902273525707","14634747310995448629"],["10684679212926493411","1512125811120150643","7094133132828055724","14238814520766063986"],["14992125093578607562","10208731679729987220","11825324985274422850","16590263949179547781"],["10776279329483403825","7675426254562056128","477564639048917293","1614917741898986046"],["3034650471025966568","1548199737490143417","1311005723279830923","5770082625843503086"],["8642722447664621473","4387695241231500165","13071038090544220954","15573383298132155058"],["8696679289639725443","17743788464200674941","11233135742294790663","1880871923168648472"],["2142920230752865895","8728257349107199058","14162634819116813271","13815730695523581420"],["5731844547597944589","1444877746814714735","7095451665087271142","14151947495233319795"],["10853690819347131097","10589331639879939525","8741333249839566710","6460765468145371914"],["1811824655637624976","16833341538672961575","848841426380022811","10198627895541411343"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["4785575227723017870","12702537198432645905","171565100065281391","6417743475756195110"],["480999796965082302","17513417762993988762","9254976015640097895","9688903016774219227"],["11296174124095580401","3551035443820778485","16971518588962474175","17694319250345340107"],["17014883327389758863","2912157009134668604","14461888501331361069","804024743872292666"],["10068977088034887405","11265395684044267681","9861766593295645435","12762644730794730114"],["7550531796295432934","9719863026768391521","6786145742760632132","5356986469823344180"],["2933340776572252625","12141146435256748345","4097771947138944914","8566923032466883793"],["3226023795905022842","6877808839035542185","4736145986932294365","11938061500952478839"],["13456669411531246956","15595623197818295423","7056893593486567389","5203619225513361336"],["11184143611316431061","5930781507928032585","8233532159224764652","182797759421026662"],["10026344317594794538","4987690669185789569","17766570003653696409","10335084881583950247"],["12999734736212049240","10970666897924708084","4899583084047930349","324202276380364510"],["1464823310624998168","8753877798188605173","335290486478492767","7840038309318801684"],["4953058126852612066","7295803764265265452","12461736607502107778","11675729511891865191"],["16640067403181303695","14472174971608030073","2474118070280163171","17822507386799416725"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["9710373186231011731","11000262604734504835","17455777277805401054","8000985930210517056"],["10117791497995207550","2260474929473726710","10730919628084092025","16392663287238747730"],["8733662007989635302","10925885005118380897","2784143244367902527","4337015086158344017"],["8069451062304239901","7903161323418190204","7898431196681324525","4121911984322242796"],["16777423186871735098","6138055101850923383","5466789038309038052","13196396041731953787"],["13670369202939850084","17709292236315412839","15678366307388971864","15918865773682798402"],["4621613431503779550","404591332960596891","12585159617361031299","15013499400675335080"],["10853373405930830382","4694146071129782098","14460974019167131116","856725170259778638"],["12546662471899366956","144412744368248434","8200681305317376521","5982576535526359198"],["4040090837604617657","10514371258765652609","10012843914416346282","11022932376936832614"],["10067538106797046949","1638858399657264713","13615205977968860024","11021648989991654965"],["11490566387456801492","2968610319396793138","11407791402120191166","13526956774145711233"],["11720180181345040725","5966000089327677831","16831025437926701286","8280157073382569013"],["17470792642311465008","16258592238846626400","4450550386083947702","16994282083524561667"],["14084536773301275090","17289170455168664208","6224121771916681747","17177563915117926878"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["11463335630811152197","5735109073549716303","4333093709536550869","3927154435221543474"],["14716515290272920894","15786611929111849027","9806698388788394759","8487885021187185584"],["12997177020734109313","9862319051227922628","8781564614607442311","14780020672030185176"],["17199475639934348662","14865013657249204857","8471708158522210704","7411690655727538654"],["2994044574340455362","10241199157594263660","2768753916725850146","14143876813681112377"],["7430681515268975539","15156869266624777041","17091712199128458691","11101992402956545706"],["11798714857473014153","203296103833010560","7809076728090904742","8231804276925451560"],["1535021279971618380","6043660011659280571","6370832652796943726","11883661440896869387"],["13832577425941260838","13580675232211564713","15865779692733288097","17496248454681115644"],["4561220643657293104","17586097775762852342","17320683853706389868","8356891355231762247"],["67065156677443757","16101853295270277106","4111147669517765950","7533101107561174363"],["10583445971647606243","1044903476189531209","9239295475529349236","6917588905958928736"],["10853690819347131097","10589331639879939525","8741333249839566710","6460765468145371914"],["1811824655637624976","16833341538672961575","848841426380022811","10198627895541411343"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["5392102046440120281","5534404519219360591","9425077110764749718","17747526216188493258"],["8260792769540706205","8321334951983246442","6571099418864370038","5149473754232002090"],["2880900662711768731","6278096501310821118","14485917977580262612","10269979123924390304"],["13256693452658358496","12293428646182482078","6664370712486162877","9308884189753622194"],["11276496531659407482","7784574672110156114","10110759070074489221","9687232168986644520"],["4753273382320541323","16694502639667262381","1820933666511809791","15020814927784302953"],["17720269465988967812","4887688520800786897","17291932127293590784","16959192117280754614"],["5625075327958546194","6581310389645798273","4997584805149062632","13581486268471546249"],["954603528114129225","14827363778010866625","15186847224929335660","10319151462615439021"],["9776022577046181602","6689774141205074125","18333806905869514967","3454291637488769526"],["15327299998965698843","7881300939985942070","16028422113551454218","472619646663397120"],["13562458069027756506","5643972669596615038","11536232487663636659","14302254980603381046"],["17435978886134530741","12330235002322576282","12827219469297137562","15690888294192769238"],["1811824655637624976","16833341538672961575","848841426380022811","10198627895541411343"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["6252511484571368370","16954928763241465025","6395578271315847748","2457061991145547971"],["1746137104126524717","4180559544410223525","14748513064122068465","16931853872857589659"],["15770400190341178292","12255421842254721266","7325176054082971003","4761388747983248206"],["4617865870240073593","14705765921948543946","9285556939436753259","7261348138080675297"],["11260802773471318501","7261529799382045175","12086540655743298977","3919409444369257376"],["8144968017146180766","11481966183171202410","17940410293534174105","8187646731777548016"],["13819565592274913329","7831052680238053248","3555105051694251733","16330134735317411748"],["9302926344556203192","10897387680397116851","7718015783725799100","2961638656279693507"],["13635240395353172066","5067916832022768297","17641083201450573969","13641064092878577588"],["3990232187052170267","15206724223661153304","10957739925216766972","8090595612224198735"],["12823369791518851641","11047895227585967538","12826065244149598943","13035412249664148945"],["940521472077434207","12211019348402060923","5988991057385074373","54397565741142240"],["16821048464838221250","17792648823208471461","16726928346171546242","17399096040964381033"],["10162384008798365211","13707512293248066018","17170471677326792906","14326885123379947591"],["14084536773301275090","17289170455168664208","6224121771916681747","17177563915117926878"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["535613722284044551","12746668299609497807","13882925912493634744","10931867819480573778"],["587624918088052352","10039668610421001045","9195730832392331581","5196769763825773795"],["7461132810859904814","5808453055946447094","9867854245003364436","6278202809256031591"],["4404109270098808169","6048459240143381071","7505581398740093249","17960651124975339251"],["1740386944558524955","10104612117254870649","12200090637119093505","2704689628713591785"],["5132103730892859833","25048685186314041","16630452818883931342","1114254360791780923"],["13363225652410655381","7527547871299895071","8903029360888776055","4662492504500488815"],["16351574634709019474","9816536228817876982","12747006951707938854","15104558154891739243"],["14575786309870534718","453747684164156060","6195962239033586406","10713338393653655128"],["7914871750893382121","7702899779020790081","283420818544166333","6279760522347972741"],["12897848538318205270","8291298960316320311","8065043068799887587","1637318564363143537"],["6959253053608948108","7120693508157105414","5984186612652844727","17482746727839911714"],["12709498782981850848","2305165691020368146","15435115668487876570","13079692104673719884"],["1891574769011438453","16424880493379397662","6566751159246279847","12904178672186346126"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["9670271256273929761","4912705555134069545","14346023995467064215","2072751890537042743"],["14535687112117169889","10761677421530238281","14237622305573872987","17374331115645063236"],["15574181707796178292","11256826766219767967","17351432502228964274","15887660773992515146"],["12968054708687335612","8704487834104522928","7909056990923690323","4347175595358904902"],["1632683823172670575","14200636934469507987","9088211109602932543","5367737953768279468"],["6737541768749459658","10192639636956216408","17620332151392148810","4042188530444269210"],["16836188104602952830","16734816227709029918","18357716697726703400","15500102257644016799"],["3502877912850103865","15435191312509304762","11188593824273267272","16716771150547037985"],["12580667817635169423","1385154178268623290","11225762770997269215","14571414610063304929"],["803849336471690812","8413742866932552357","6950985860573776650","12802422698272754482"],["16322088776123566614","12419704732401314971","7746256007767548951","8336678184862645004"],["9638184052047988825","4863622981014361335","8741869275619881719","5361433934038967857"],["17616375000206986353","12866156696581227865","8881991762661332974","7842875305926517481"],["17470792642311465008","16258592238846626400","4450550386083947702","16994282083524561667"],["14084536773301275090","17289170455168664208","6224121771916681747","17177563915117926878"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["4438932596835689003","3481760017298639665","5795173439414097023","18000788049411818667"],["16675553495283108510","9701262409635894398","17868842337911681715","14587662160675038494"],["18232916515310556645","17215457514861940931","17220693366151412763","9727578785646341115"],["15358377125984908968","17941961244253448271","7838164904046144708","1485640369821780086"],["6646900209484168958","3539886316700978766","15068905262445251044","17053893155147278088"],["6806662878638199230","4441522630407007706","5985045057240831011","8468509204973110888"],["7708390857201888203","10151697950119281784","12249495085089874150","17998450843333890219"],["16328272477786732459","1628088118967822171","3967532012350959545","6314725962573187001"],["5159957674635574833","498582856107812480","9994902076478528699","16395644525397620440"],["684177106734856396","7859398629172873409","8020757977004935558","13875865539659772933"],["14596897302015845331","1751512077175604259","15555875157706173484","7322244085287039393"],["14892554046586267599","6084622702472332716","9240652266569760732","18078846141940443721"],["4774361134414417720","7042298396723957395","11769508293301278173","17833228723708845865"],["4953058126852612066","7295803764265265452","12461736607502107778","11675729511891865191"],["16640067403181303695","14472174971608030073","2474118070280163171","17822507386799416725"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["2937415152478931155","8883725480972309290","14068493974149029179","1489796393766016803"],["1398402460083227496","15350612885598441578","12048895240828751127","17513376290333019852"],["10575693174704637011","424775981651643124","10606160482100907573","7296197824389326201"],["443638110679331064","8826368873490722966","6257550757512009870","16116479049334809362"],["9689407340810558171","244694114838804676","1858859263477077349","11715249754735067572"],["17298741263308474968","12271069683395194311","6798226430598984557","9661156567774798113"],["241391987118173966","4968001924850795190","7104553246104102942","8016458719786364001"],["12775269653506097494","2221420007726667051","17699629889631273596","7397202823805691749"],["15285589633422837879","3169248625510415416","15295887048236075235","4964079734828950048"],["14270212963224701594","17384359197623503079","5586259975974568189","1696273479090853437"],["4915580417317299132","10345100811857237149","2275212803764479056","8230508003018973007"],["687163321862166536","14587856358154676114","15494386223044171159","6745117883414371473"],["11016958552845519412","9170014972402103625","346118991068753163","15091789125536462514"],["10162384008798365211","13707512293248066018","17170471677326792906","14326885123379947591"],["14084536773301275090","17289170455168664208","6224121771916681747","17177563915117926878"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["12759567479159499700","11227054442779436314","10356010107837246801","5109518690563771291"],["6578007672255989823","10423814577917576165","15865270515339054836","17743118905743350082"],["6248512638677997104","7436301746482065990","9282119968998142121","2000780464127938387"],["1612425708333259029","1628211819332373793","11891731243673466419","7173897330446707385"],["7138081159348696947","3549955039111515342","33766556851601673","6792940431387410425"],["7731955193459139965","9257884375076866808","4773010351856473826","2166649317432882920"],["9943716196287943167","11121525249749668030","11723734522789826572","3221881733514831536"],["12497582035025915776","2693781156284710892","9743507872450399618","14772460983260969749"],["8591484882768303197","12738020886988194354","9887453530380000684","1325017868738719585"],["8718987336387026558","3888999187532934249","698038169644938577","13023850543398969834"],["67065156677443757","16101853295270277106","4111147669517765950","7533101107561174363"],["10583445971647606243","1044903476189531209","9239295475529349236","6917588905958928736"],["10853690819347131097","10589331639879939525","8741333249839566710","6460765468145371914"],["1811824655637624976","16833341538672961575","848841426380022811","10198627895541411343"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["6155128545730417572","13013675941396418601","4042039116405632810","8663221574377560846"],["88990010175767370","12618566146528603343","7648112256841870370","10605331393961909556"],["9748823375675178259","8799195015992685347","14890925473810046997","4160689576709228340"],["1383615759287950030","11333588624277239806","17778167957926733302","12459865658614121363"],["13625391809158062418","10190921783273799665","15986070136584896349","2959307975632597748"],["15619978715933210919","9698938489483139333","11720555582971036062","3010989466382088783"],["18434036926921528223","1310293816117454731","13240222225162784610","3557624583408003325"],["15120394793841549991","16349918203503054432","5000158779267742280","3998939487308482154"],["3622027881709282558","12548525102136081828","7792189787616292044","13408314085767296999"],["14247557081993855198","14187046568318248160","10658139716781317005","5288977494613204690"],["3292628074275808652","88821636898827665","4782621870501846598","4022172257151334216"],["9483251031036668247","15602422010236077261","2654705160898952015","11581028194177742400"],["6990189063873260143","1384865335101916673","1018376322356738480","16968525084126447446"],["1891574769011438453","16424880493379397662","6566751159246279847","12904178672186346126"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["7038278928187128809","1343013661213263528","7107950321909035928","10156444540423109363"],["15027065915593397556","4705031149512252929","15945526518288649624","4061536577339633577"],["17111992002361398564","8873017946722539346","4650725959141911363","12880011631828715937"],["15618750660465514801","17665623626284626526","13100042381715279211","15192417798981586601"],["12397676987157735263","10299961318539156950","366647871631428670","4288111197827513213"],["8288767281289982900","5762264267949032646","16493470435814214439","9132225201135770251"],["6064902732818292893","6846187360321746228","5926325504281672108","1367075327211658268"],["11390506267885347590","16686491358275294123","13817230602194804909","3736797868267728394"],["1591157833084694165","5337938567523293041","11231757653911536510","17732293903374355597"],["16655393136153635705","4120010549498065543","17504508625963091580","16088038838278248390"],["13264279024047009406","379826835015562852","2276850279831250101","261701875414316127"],["4387175602612837432","10187671097556206654","6723667126670412458","11524620150921500408"],["17435978886134530741","12330235002322576282","12827219469297137562","15690888294192769238"],["1811824655637624976","16833341538672961575","848841426380022811","10198627895541411343"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["6500679856401646168","9333037983424499863","17549959388569706686","14011275338262777475"],["12007982175442872839","11618268417073604652","6624561078695225113","8858296523053152720"],["12189055685340708909","15135176238418407801","16369301147008819733","12912557659770660801"],["12241216310204836158","3007220632499127863","9174728630256448152","6970329480165438664"],["13017338370856341392","8369381634504840896","10574947397590623232","15816684179615955315"],["3388302155620954186","8856610413123478305","6754681362745658469","13931937564749940086"],["14232933357502923828","7338047410047134183","16064353523790036443","11294582692710877168"],["5978092472996877791","3849351795946616448","14340727517938418916","4421307344772747763"],["4393995327541028062","1468471818797757344","517704302315860137","1912664172440156718"],["2562423781382704505","4901036576915546995","12306763682704900539","6860305119201431026"],["6382812631686390222","2709548792568406279","1974081535829572841","18439419697987848338"],["17204042412844408468","9087957949231350674","8420647590197096997","6028971666100511688"],["7383729560368131056","3103658916804795832","9742959999558584188","7827524671529116240"],["10970709633316323900","8159678560055369739","8282129636110019187","14269830541173418720"],["16640067403181303695","14472174971608030073","2474118070280163171","17822507386799416725"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["8391990799150373608","2613160331888690383","12439065465866295630","15988756302249283542"],["13444028510364250464","6853759275444435577","2806876604346679880","9723038316072952622"],["10661839471032588961","1753056350049364805","3222980708004363138","15145553280438430321"],["1787495589182631891","6997916235728513703","2704784564377292707","7402274636524731298"],["10494915440058371031","10185380352439882310","10385134736337890426","12630321097305293876"],["10791643989039898097","11106864010419803339","17599926652295176675","15090525965347934955"],["8174705826873377512","17556940397902105886","7235426457039213162","1257967780644396121"],["3355302665993091814","11324413324666669217","15556543395720805851","6782216396215307387"],["5540470266758443982","17268869520413013429","16814742761123591678","9736881963491446289"],["5335780644439512337","9964174009252762025","17022563372716985146","12831713430871735163"],["15670499480342301824","14260116509079654179","3946091918719767445","8789860022605595946"],["16917456223938136387","1851112327652786869","14229562692185400190","9086299023487228998"],["13189007039953456678","10984716809686908521","17383401267908126108","6547044914800604820"],["10970709633316323900","8159678560055369739","8282129636110019187","14269830541173418720"],["16640067403181303695","14472174971608030073","2474118070280163171","17822507386799416725"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["59793540349090089","16367074359805516914","2778682705327695144","13935723576916873826"],["15827991341116266359","11913435541152691900","12383951434024457295","7034219113296795490"],["17288210204711693888","45419659891531193","1636244775071589248","13621968669405727293"],["3417515115136377425","4931187607758643030","16730639730403077241","2121975560713955601"],["16355012152401992349","2991812326490528513","14215889155907260317","16146712557238308189"],["8877993469115037023","16649721881384833558","15939043584293368724","11611484273301813238"],["10203165633351904430","17187252539917568222","16084798390921026413","14947876010146405240"],["2837611645645917538","16803649248518897021","7233989901866643424","8294364169596581548"],["5017140830456764547","9460702593344362460","15054192566353473661","13243666060598347040"],["1051947911110665620","13231457573693742111","2573609395568609300","8456028491059000064"],["7171848082554875116","1575577101895042011","10347520279648854709","17024864628018875231"],["14564460242311452273","6695772284228068201","2898724081849926780","7595874300408946886"],["13515833844507891394","5306501149665255233","2699831880699816893","7634508893722396887"],["16814750925713244110","13700292391881604535","1839315569439043128","4073318884414635469"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["4057082917396396823","12578581123462316485","5323990313213432447","3430867513316686943"],["2020467963759834336","10604818880101186993","4012190622450794519","3816048384437371427"],["11481916827972467378","2693099728876632144","14701202691933378790","9329981384485770144"],["13423045633314053525","2476175980264255088","16504139935981423691","10255858157239932288"],["16159280705820203019","6664173254041740433","5953738422552990245","10298966274551577181"],["16239558581743347326","1749973043321274916","70639027046406157","16450692499940855375"],["3609461614870822127","15497164253198642416","15954468638477943634","879242738126897522"],["8438072410699723841","6531711089353425435","15001942053229017010","12112661029307580431"],["5320610099511817406","6456741056703967627","3385715478078531791","13562354034399052195"],["11663202338813928201","17988743867205495844","18215273790124381024","10833038200941739128"],["560548034950071409","7850647799430218226","1035776491680274897","9593223202408341138"],["16917456223938136387","1851112327652786869","14229562692185400190","9086299023487228998"],["13189007039953456678","10984716809686908521","17383401267908126108","6547044914800604820"],["10970709633316323900","8159678560055369739","8282129636110019187","14269830541173418720"],["16640067403181303695","14472174971608030073","2474118070280163171","17822507386799416725"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["14497074071670609599","13495480095854053807","12364388054324449723","12437215463241584574"],["562091297411824369","7524801317846352049","17074525169613872610","16219598885812563499"],["17769491292920221254","8871032475531861174","16447100538264246765","7382067826443243739"],["8559752047239716440","2901194371328467252","4998613091541450269","4705755959752230175"],["9072067525025641036","11366493435179980688","2024308284841754359","1926505537336815360"],["7246156210931349708","16948137928682895385","17238635334045577445","14325898284858503301"],["13549691282990249383","2937572549778486588","9496263521469312827","3746066959446965999"],["6488531400908576196","10325817465565679205","13725445784104940622","6482269653026180231"],["11902207907123499096","13728226766740882597","6652763536334107157","11769114015168026035"],["5047482822447351125","1283877595336208878","3758706478504536503","9570230801239614998"],["5254326848222186290","2772759222678972789","11395267464539469884","5789185030310527164"],["11595124850928246612","15465217147144759618","9678430238838924832","1270063953344350640"],["13515833844507891394","5306501149665255233","2699831880699816893","7634508893722396887"],["16814750925713244110","13700292391881604535","1839315569439043128","4073318884414635469"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["17242622804618146654","11856223346437903565","7874372934234963858","15138920062190943093"],["9623292396778958398","14420388137414460677","14731430961724512211","3354319649563082946"],["2155597944616006436","11163645033523124799","7033434355395933528","17970620280165033001"],["12915218870202933525","11167965047968766632","12408012411047271708","13231865660107697262"],["6530079297899362222","14216419201632704677","8172790313924270513","15643237581079764083"],["4109054242720328211","15672212433865752479","18323254842793914556","11421105747382992111"],["12711691422043145839","18346372121957178107","11354901534286515659","7748720733477437523"],["1476736272502829407","2335725446142933856","8339302780809897451","12365888728846424538"],["11268181004811734007","7599113571943584176","15934219010159433525","7874790707573198168"],["4020603886781667460","11719863914031779116","12609735109830155577","17105176718649673663"],["16791526851321282368","15410139309305229853","15633664960881807919","2053004041283804597"],["14226429896281324256","7730758135642866939","10375701058113287012","6350352908804300894"],["12735056100866632537","1414605911706313448","10825141439233317440","3660381512726153061"],["10077645057914391497","11420248024189096727","13170482471281583145","6237721680763478599"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["19827262359785497","17832057424049071355","6870588908544273087","15975121499750976789"],["6383048861563732175","12345652305899421483","15757851542014843342","5091908840315175210"],["6570312375876800835","5307165034249052959","427741520704564719","8327141340112947847"],["9067260604956209733","13351264699976186491","5029633617763702799","4234091102089134130"],["11977582376236362593","5525867658898748010","3504094539698271853","11701985615723920774"],["7310166930586658764","2839852222896617417","2443268817800662381","18266619467683592623"],["6445546429597980474","3757351778012138638","6362564126818858791","627264357889960248"],["3256922371031014880","14374645117565428068","1372256609178235217","11347025019569873434"],["13595840855963266399","17349155433621080227","4802857213143606857","9087669210217815377"],["8696679289639725443","17743788464200674941","11233135742294790663","1880871923168648472"],["2142920230752865895","8728257349107199058","14162634819116813271","13815730695523581420"],["5731844547597944589","1444877746814714735","7095451665087271142","14151947495233319795"],["10853690819347131097","10589331639879939525","8741333249839566710","6460765468145371914"],["1811824655637624976","16833341538672961575","848841426380022811","10198627895541411343"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["15093206781415131733","3513862803712279445","2349047746301832244","7086824274167486322"],["3937875672034510606","14479537613284478075","441073262429845788","14677063803031465967"],["15188667063226634803","2251495585150174001","7213626498417857806","16260690540370792291"],["1160395375610648936","4928754279769246156","5586301683740345567","6560877933227252068"],["7683232046492188299","18216711054612033317","8185556558045118680","3587730672862388126"],["3362884753951988862","14280967555363847021","901080273483367436","13823073190599157241"],["12719757052333458945","16768968165612032986","6406663609916069027","8096944195428766441"],["6488531400908576196","10325817465565679205","13725445784104940622","6482269653026180231"],["11902207907123499096","13728226766740882597","6652763536334107157","11769114015168026035"],["5047482822447351125","1283877595336208878","3758706478504536503","9570230801239614998"],["5254326848222186290","2772759222678972789","11395267464539469884","5789185030310527164"],["11595124850928246612","15465217147144759618","9678430238838924832","1270063953344350640"],["13515833844507891394","5306501149665255233","2699831880699816893","7634508893722396887"],["16814750925713244110","13700292391881604535","1839315569439043128","4073318884414635469"],["16683324719826104208","15341858223777298283","4679021012144477887","15144176625680342488"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["2197354519517268905","2399403811785340770","13202967329390724160","4987178470906144067"],["12559869907062392735","8216592897533931678","5452026913447039143","1243133825686413397"],["14540865856774619290","16105965434802346135","17605692514027131031","14073350405515149544"],["9701228586752450511","5581498774014855868","1063506830314637584","8867314873684111136"],["11260909509365931224","17182295289833971166","12810735569956290508","2360286982963280724"],["14016448630953559025","1136103346176180777","1679378733567779646","11438401159448718326"],["6425166914755806239","5512294073512662476","1025053537646502004","1086289772316272923"],["12102391290774018919","8148550022030441310","5236946739367623390","17063174357098970435"],["5715771772312023045","10673576048351321928","2177969653305853183","11161665295781821504"],["14763724567021824611","62450393307313562","17888299808769986108","1380969642171234777"],["13522742695293679570","9165714800824343990","1212465400183057322","9654404483766589497"],["7442325236977520646","5295970346746064946","5364899597644881120","10178107907525674392"],["4774361134414417720","7042298396723957395","11769508293301278173","17833228723708845865"],["4953058126852612066","7295803764265265452","12461736607502107778","11675729511891865191"],["16640067403181303695","14472174971608030073","2474118070280163171","17822507386799416725"],["13454520436580703352","12277097153061851821","13367078348708554900","15015800126705252445"]],[["12024275452806495612","15942455678555288787","1691015873339803443","1318986289811143855"],["16368730764014555322","2362181426581078349","6838387928507779632","15331026520113308824"],["3892289819319158136","13363570053179881759","14042385685443242981","18295895263211602844"],["9743991577472338078","10293028411399060298","1892953567985209918","10284617461469088057"],["17734355087702000536","2165278444405694329","7788903376635225121","9483130992898609913"],["2762862064063669557","12531603162681122269","14846074876677997640","554533389072942453"],["10573771300516445309","16166236514287900311","4447716465552381251","2456802208058875384"],["6002412636222191591","16080768588466752190","11704721762262229990","7970001990593425942"],["16790074606459040844","14978594809152101266","4936684595463909881","7826161839798318547"],["3054998384517616451","1197978108571505555","8171734081801278373","12768713151957691369"],["3292628074275808652","88821636898827665","4782621870501846598","4022172257151334216"],["9483251031036668247","15602422010236077261","2654705160898952015","11581028194177742400"],["6990189063873260143","1384865335101916673","1018376322356738480","16968525084126447446"],["1891574769011438453","16424880493379397662","6566751159246279847","12904178672186346126"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["2671978335399201363","16256336691095382381","18389049515482828668","17932449150384874220"],["5478088143772444619","16622944336753739298","13755821551030732728","4309242265799252751"],["16338836381157767852","7598234562083752358","12285120280450851473","5861693988913509465"],["7929736152482976341","5940923832760505444","3878668793796651066","12787596392052904279"],["136062765653476923","18415446263156792832","8963026016638349982","16360593374476956"],["17463290610940049884","10771461270363141441","14566432399141563297","15716709691280383467"],["826699339956508646","3311716116965170353","8084030340031773997","18261889800141348305"],["3543239528950959414","14765197851393245574","5919829898344255734","8594619936194732578"],["954603528114129225","14827363778010866625","15186847224929335660","10319151462615439021"],["9776022577046181602","6689774141205074125","18333806905869514967","3454291637488769526"],["15327299998965698843","7881300939985942070","16028422113551454218","472619646663397120"],["13562458069027756506","5643972669596615038","11536232487663636659","14302254980603381046"],["17435978886134530741","12330235002322576282","12827219469297137562","15690888294192769238"],["1811824655637624976","16833341538672961575","848841426380022811","10198627895541411343"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]],[["15174683266747149334","14643200189463064551","12053701692309294084","14909920063929628495"],["11073985008444975259","9212980975337009386","6186959318227299577","15457262859132704664"],["8430181217500415437","15638025665238654331","14960493459159236359","11660469611722800883"],["554386086737033023","8293452945145826997","9098695181415498595","13090429825029228681"],["15588390578721273615","4230141187560039422","9133841057818759691","6455195544214392529"],["17116461535872002474","4852760807082531116","14237535858307944326","16122872115197024993"],["10846008290068824085","17728459772458683183","4236024819982431185","2249021975239106009"],["14448235988588476168","15216484910722623990","9874383416233449283","997321012593161063"],["6823258361200802918","10794072746744637190","4919777093984982026","12066322360331029479"],["15008389964255137344","3726244501872458139","3406604771540498086","15907256860808972553"],["12688927924999599038","4163518468777884484","11933151339325773966","4956513933141965701"],["5731844547597944589","1444877746814714735","7095451665087271142","14151947495233319795"],["10853690819347131097","10589331639879939525","8741333249839566710","6460765468145371914"],["1811824655637624976","16833341538672961575","848841426380022811","10198627895541411343"],["1649417750696726806","8104044776282356779","124012106953380565","12891928746205199841"],["14327567820016190557","1114612421166656059","1255176451966200739","7275996879765504294"]]],"s2_root":["3377765056538135594","14474793199531239283","9975754698045416313","2853477182943887370"],"s2_vals":[["2746955691583813752","12162692389601932393","11489305566331439938","10781535836864310626","5146288556076480838","7085064689611902674","4167555382335637825","17614290997394734431","3571902861584530357","15792550808309716248","6168402769285500361","11895904718834970509","4335622819175293326","10581533989298792792","11740134910724394423","10803304197044969444","10575603404556105937","11849878093943238245","4047411988376817217","3584592207650445209","4263927126901582684","6440522226353247963","314702667652950100","2069914220620952198","2653724287402760056","7940439847083495754","7466407771543938230","6441060661643033935","5236099693931678846","6309687268586358232","15810215886515642039","10199057434911463402","14845329667801170126","14664305286683463765","17400611539647661026","18044214280721308619","4846827782426760215","3478049649342429995","9948016510938211075","15565315741538629234","9031569529711105192","7708676478097766008","18407535647886445699","5360030122569952770","10775465163466071539","16362901914202868675","13783280161346124640","11268846244266463724"],["4783501825707312274","14602526815092861229","3172708983961735443","9502298482091494627","1301610073174094141","9211448360756775146","17209024488080898184","2436715110382598256","8678342869535465308","12094323123694289951","17663915956106769472","5800931914061301827","13148229736427269918","17660964569536719089","8047678226498348855","10823337724716774943","13523875399615304562","4262112180496328479","18295686302178310103","5107616755396039639","18243701072231860635","11519329809539116003","7771496798205912526","503831469965268588","8398186722678134495","965944896343111434","16665284967363000103","715262863350893642","17082931608039643186","875400042347754667","15598655965093811307","7657447714508872621","7340306831947394198","1493523433534470112","13500759244081079377","8201175743454440704","14483940439023917698","3077751732545531024","6380166968087717546","7801170084459845048","8154902123570901029","375735434935982991","7717560734271505581","11481045305610404922","18109010706077654305","6366330220224068814","33302877482902425","18442375764276362672"],["18314965040474135504","1729379425024272942","8464253618991419233","13573507472668608591","1919645423977375967","1793585326031349440","10787713451881493160","9906583247454385150","7956630003465306330","3323961163018688923","3394296430365670847","11045981358595987726","15469533145532203912","13045064420389792985","12588679566175509652","18345274180579561934","12293970484149703105","5415946141826532128","6224268849660927192","14767857714562031140","4424222068829348062","1446067366556709436","899416082372645982","8938797599748190453","4498280882325674015","11514417038906093199","3407424611014690508","4543494436956921360","3654939120133859023","6449492031358864370","1945845218867878468","1282670280280577853","16030902564207095716","10164152534097929328","954241847077590587","1223642165594591513","4663650705520774148","982030128807528724","9501628604302976532","16620394843487608476","6810414282747606695","6953456313985286963","11149282495581742057","5332743831991875808","10974926689478730837","2262329585123018750","11114669605238531799","4199207121111226980"],["13949092358116251503","4416262770131342101","5977006363960230706","3182316041775982179","2169138197030123873","582960816898953881","9875680852427116885","10130957549047460735","1771491242770831786","17147855001071652422","1093663569199803659","4224446258252200153","816192081242253830","3080820086612862692","6469188472981601790","9432463010533332040","16903524799322119041","9485459129578503394","4788451747299267571","6242781975472955550","1626122086688075090","6295527258385466649","5016526871748310711","6138621587136181092","16942332155393723705","5416455851325295137","8187630675256879071","8145013347700827596","6228312978783825338","9976043132191952064","8294066663751587775","6815457287537359396","16186229188662614251","12936428284049229135","6305805506263689256","16531206656472636020","8031545145419048415","16698693444205189371","6616066812014195894","1595313782184995342","3693625020412649592","17202955266335207128","16911731086790384030","4747189529098618606","8367274752443435987","14812475844218078011","12171308331295138158","10715635825141334251"],["147805267138681642","696039690426769257","14680798355896461666","3589439294845150463","5627036934772027185","15482019359802498937","14096023708924227036","16524565496074994177","9525209740677455553","10597640398235259035","11484821956922046510","13780403772893440191","8256681635988802273","935911449686770820","11661289613392255527","13130812785638680461","16129339491554077185","3874090805899603638","9073246673011540375","4180874530339180017","1652999202848851198","3305467648798591617","13959080630286185306","12626892716239665858","707326897286326505","11353012060904290998","4117600810223638133","5083525836117000155","11375928865531490559","967832639208546382","6847314747188857430","6824320575400706817","2285642545479042136","17511947381811705654","993272783249994066","10940288697194157799","11199005247340712642","3861740626258620010","11578380945869658864","8281658590350457730","6669158756948869874","9079219434440973604","17201256201885321992","8376208577001796664","9161637273925121670","17762532687976384002","96608503633132645","13967836659867205339"],["10958634602909928023","1483200749582764924","8501959415676304939","3383282109508431731","1873536311484210965","250299244459494504","4740295277446251373","8065693881256109951","11348082132748585401","13333098386920970657","11092654324284336372","8976306881665676087","17153993232396292938","2624300771892984879","4916278825660130774","14951439123573404307","11855383798560649702","10153843485976158623","17172930604557752035","14196140184077407489","18029616098951198170","14859601760465058080","11125911430580405333","9391170754976799098","3655986853795327474","4513687173335449773","13057240577447339510","3130120117320724635","15410887764655926996","4051832019561672466","14698913146036030886","10343866722443901314","12926401021535035101","1793923248882285065","7511135371915326238","903634520971386014","16604534511548514241","2312436725115057764","9113518848456171550","1547936589194479471","10852847429997574201","11520004550473458322","2899148943784536904","18305916424143755700","8803845859522111676","13809781296582777399","435327062582748501","18161511140441980209"],["18343044791787528252","16266489755366594641","7236073338650933124","3766294697718772258","13909526144126665053","10702146770206475831","15818854148194357362","6475066186695845340","258116665435459624","7097993982601043759","10857951338981029754","991413460916019568","13666330441731840995","1449486351148179240","18089015085474854323","16986772607830352784","4966619030668362725","4794012160390655619","14106208924874622408","11632134758730261971","12125519758254056974","3052052945175234315","10410127949682981840","11284053935184464932","2040523918955554112","3347751265200115380","2780054235626821021","10979551684018852183","11491855616167351581","15228878910641359507","13575387143716272148","14352724759590880847","8221674823672123671","2162502264954040553","445808735713083584","4264839914710611452","2651970284265964747","16849563097104168452","5127126973980556889","9445184337784652690","13112744739175151509","4405022398410312391","8185998740192138164","15398298914280460157","1841574794813511110","6923285384622737350","289397491674206361","15744611073438912966"],["6091706474730654857","16101683807146169154","17816845603731800263","7403712635137582431","4888857223086523101","8524600154781490395","8529034284059623645","7858301677941017400","8019010975633971013","1944478526705200111","4432432295834882783","2633638053095119741","4136207460218877613","5178272927821073250","8575791576438539819","7381515323461351088","4590731247846713638","11027474188279230599","6335862699159076324","11038752539341319290","1044799715968684522","14971924778251318891","16188287594860512232","5956937811213997762","11608043364118251763","11599643650207789881","2717960398377737976","11753944031621657423","13250647729730481977","7450955064812955520","15179855945008480910","2024213261663336290","18182225332387529593","1487418236409473093","3844212100743695143","5115741799075007032","13855648478059965578","14591342143576895843","6004705669543154872","3978632847153903693","7642900168142187465","18342024265190599195","16791132838041826816","15546016486408075456","7329690075953869953","12099407576973062545","3595369743140518644","7471196096708948806"],["11531977353568459240","1733405847533163797","2461910458691065670","16692593024632535214","11770659746208596217","5529869603961586538","2748544834498920948","9825482424157078196","847444278941758035","3971223207525206698","6827345666612561363","41719337567459629","3217990534216670179","2051303021226327570","15754241951224757798","9245040490474319787","2365782315669641779","5812506054554100632","13327665363184977326","17807072003182393836","4760192600560451368","7396241370280300190","695666362670036944","5035089000970339403","2466589880240756585","2567428887723005006","6421751153072971353","18383761366502508989","3623062443099122096","9485828294558133718","16347862733621608225","4453797814977608461","554624203613619762","11773838718815796270","10694340371116076663","665806532997570592","1226917162255529752","130935829997611191","10173915005924993116","356508749578160776","1128437817483572911","14927433555186115660","11817889499487760293","4133778488874845970","13672514607634016196","5479940361999146173","15945719063578124961","7790303257002927387"],["3154918912730257894","12275870512906110319","13664312970330154510","1329531290029571445","7414029244435637676","16495980873340956967","8914101042492747610","8741718330212415582","14793881459231277150","12886707851808934804","13865953288126805433","15076208909613784402","11318831171629034669","14048731299738483214","14275669288140401511","3661424671104411039","1970633555509558834","12760430946313334878","17862151282005880355","5231640247069935238","8291665600430152442","7477548902099200280","15977459873813781114","11188221393820911163","16886261786506198547","12171537504151234287","11795182457260836829","8148776283764400386","13508346313218874783","6582325203829642385","4442154340755595259","8625939070002025575","12733818194990344172","12529191129441764562","2302139146919816606","1420278288254071426","7207857952493883686","13483559890060772871","9215079316005659664","15714074900279007088","14604158551047550441","4438853921515330141","13649705586486316012","16113285475192099925","1779098896131761169","13718604000696301401","12283315935808720129","17992803196911922630"],["10627009109444052327","16101968545786465585","9362836181979598178","15754978022776989513","13064599868771190631","16423803762844452122","3033609733146602102","2663237271986194062","17092231381020871676","913712032925462168","3999928012534757009","3151180307310366813","12262756503026292603","11504017868390952776","1757293430670085618","10877210689129777933","6842361008602776406","1475967221600071718","13816264476115737107","18386370572358494949","14220083888013009466","2852920104964664009","8848612196652801977","11449337738811202356","2933122948476865579","3325435506351451585","5716522946321626482","14740383056727208042","7488612638149470078","14975857012737696222","7797362281026494355","6804073085551627815","7627839991986679968","5334827322702878853","6767342943578288667","3817947345733051920","484672552841736483","15847360696558192573","4738632858596876267","12756590563245721670","4112052047635794214","6387079370438068330","12632474378818763696","16346983122336935513","15117355688559769744","17655535001179438407","9370439765949212467","2105030157560221565"],["15980494850035912987","16295061057946593126","10126928138414429508","14752940324470872488","7696151059559857779","9730737305889873839","9287669690972054953","17977517600142654247","918584214222962598","11280956912073329160","14950368802794707926","7414618255915941608","16862934551311632177","14118416418506636784","4689082429220084505","10640104579794222586","6261112323085921215","12054783369892123785","17246524834743929754","9646442386481558345","1589633500605585309","11183674715196805173","660042809998698747","1300898702833049067","13275934018887370774","1429975948919783798","16994685825207838725","3870423229519441696","13667730188404927131","12776594755083400511","16139275850780519786","16242044127509628177","4039801978387352082","11664009983737661058","7859464425307424907","2107595844728068606","11045812728683115431","11570384022874015345","3480529997074694324","5645873537639122495","6767285886405127318","7932083682353219872","13392844649897144481","668623693569333251","1191106464159148572","3821682340390620057","13936281771005817081","17210969370032663657"],["15116160119486927320","10709244526333746708","4528804748964932212","2752798154048107701","11089378938700673815","8204738109835332000","1363674642292644463","14393299279986097499","15808330332078609600","7351392394985471954","6075067086996711039","5093404015278517556","9529831454444036537","12325966827962595054","17794236750507124113","7421889477011648835","14008759053894848308","9903944844132666472","12786776352219437460","1315026152750585800","496416945368589402","4238277506054229210","2519192891860999118","11817470263566215101","13415024202894728505","15112778829523915800","3321997749036656341","6108974896754599995","4032257417123035754","11425348650823665455","1706249673912425265","12712213549133428918","2202681813614587133","16309485083994376557","7588497685253198571","17821628248448365091","15691659307060184153","14006010313343347873","9993477394239758746","11728947337397827716","10761597294293705220","15781038932358274528","12232527303184689113","12693293445184822231","10570355933306712077","14569203124791535103","12127024995260389365","12596076420265706262"],["519420274156302833","11578082299240044272","6933981299339082634","11548427028736783728","9011236511905553887","15613089710519821664","14498379347642487995","12467478772441378983","1672624113687227802","4131609032451871613","4522203557157494861","17502427030622515904","15213807480398614961","11025102636956203142","9358466697320451132","1517710687011784879","15551572697589508231","14065930186022766390","15466385210112230234","5217653926874931308","8044355584324836002","7246826782008066221","15357850833347535408","7112006312022641254","7475781298092060866","15647195073574572606","11265089544442233312","10157241495473292138","16951469329366314621","14229296812093847743","10347677759535440355","9078713655040513353","12526497984385456774","2050758497352724235","14459007829307552809","12352701992535765416","10506094059607133943","606127225532023444","16120332490467311282","12218668531550449008","12122866602790261301","6832973311235373107","4222777068022259130","9832445183271538834","11069625862130722016","14644297553478465824","16085536550509961670","12831269430209860861"],["11658711944099775523","5940009233074906530","14425620324619609591","569861891471058593","13946211186179333967","12349434893333386911","5144656577209463819","16163542771316470249","13529826619494328108","1134510359749138052","15701779683849317627","14547865545918013203","15482708824760248088","16624287840382321752","1885122475175285840","132039893921086322","1760349475103319030","12781076262526235347","16494284529411435293","14601831861391382525","1464795944198452849","15080092763168403638","7913409663057319461","11424732184093511708","11771996884234077500","17391627753143379025","10590944471922512900","10526063468729676141","2968132998435897690","17332346591818208698","8708132276861075294","7244864631801960049","16294991600642469900","16332024745619343419","3267311729842185090","12407386329557889797","6186150307353355268","10204928865388553747","12301356217819934368","12407041882885888358","11782895783632412858","12845739666957001674","4117761690634784454","526508220789366489","4045501295601560072","16929403881211946985","12106683114938478830","5725198474587604273"],["3909033735765794242","983756503861521557","17166327861283392385","6173319426253126140","9797590889113608177","14409913669728988293","16287798227068238234","3171326346780581910","4134018568772724358","9449026278801810926","10414829756692539412","3510158599700350003","10315566821180652229","1449810655568081728","2001803403646988822","16447716500220549784","9357339959849742945","10576312250513390906","13930810176659274172","9753919434472387804","14132887551537102711","16208315140846127780","2646453540029720867","5708551998155859838","10846220285580337889","11640118938476070243","16580915165363432309","14447365321844405974","7084181586933405252","13646297890553809752","15672477749004851425","11786269923072376246","10643912177241764932","9376535740212048393","18201622903720514145","14008189714586036567","17671628094602625148","7775515595783662092","1797173172353320661","9508855954630357088","14801056236045269152","2937390876845805074","689101781641759598","13740677519381769287","14613242779093911476","2503309474941154031","5880779344071372845","3564839471643273341"],["11964343008045751845","12932302245471162369","8302810803151167820","9781036664731337316","16324303080363392071","6084159120251363910","8631880529480435908","15141689116673526237","14580769283713333226","17256169725930895826","13059012102664336953","4144336487012314930","11881106985612586024","6306547596584143090","9368616072694359001","9757898326470639356","13319404693107119297","10748508873676191450","17071128807143357740","17141134417589536634","13414069013284391066","11038155504290418177","16746315126594768386","16702878217640714498","872488670744168011","6797984612755274831","871753648639130578","6592515897885935605","12837062973528781162","9054951462486810990","1828007756467530528","18013674323142460653","15038200576292197727","967643904503556444","13434231257808234370","5721691372524385078","6407911214711196961","1247530670296201424","17816806977267733930","8056532859582302168","7032719501604865029","17756177600886778576","6949759650598321502","1298780479536690811","1013293394684269030","5213586650303638803","17658327493235117880","8545378878611356152"],["13333125843239876310","13740996889572621276","11833031755562581657","4474949534279872219","7678375903778166919","5716852328896596998","14794677030678617219","13237953670378000934","6018060732954356907","12091623362461349330","10102356751560039844","3595870250625835822","4467438908004521601","4906871367582862560","9940483178010751971","4927068488857864336","11567533855122590028","18167686317014535190","8296765506185135733","2212965622498785873","14422729656503587280","14549295590469270402","7974483681991310340","9023452076909019593","734841643043534131","18148929257550707840","2176779762232978639","12324519267073018741","15324417565364560069","3426019576559072900","16317077599434024781","10284466380260143148","488611881711051659","3440533044248369277","884271419509027470","6529469707438420428","16710754684088522478","1196193639759857989","5541111754201505386","11051912502577773146","4033090064641817424","11716272657414856458","531804841383270447","14772994551472474088","5378426392987537954","4929974923583147997","13956254082128109192","8024617384959828141"],["15116160119486927320","10709244526333746708","4528804748964932212","2752798154048107701","11089378938700673815","8204738109835332000","1363674642292644463","14393299279986097499","15808330332078609600","7351392394985471954","6075067086996711039","5093404015278517556","9529831454444036537","12325966827962595054","17794236750507124113","7421889477011648835","14008759053894848308","9903944844132666472","12786776352219437460","1315026152750585800","496416945368589402","4238277506054229210","2519192891860999118","11817470263566215101","13415024202894728505","15112778829523915800","3321997749036656341","6108974896754599995","4032257417123035754","11425348650823665455","1706249673912425265","12712213549133428918","2202681813614587133","16309485083994376557","7588497685253198571","17821628248448365091","15691659307060184153","14006010313343347873","9993477394239758746","11728947337397827716","10761597294293705220","15781038932358274528","12232527303184689113","12693293445184822231","10570355933306712077","14569203124791535103","12127024995260389365","12596076420265706262"],["4200606623259635878","325531334215564648","6578011664782493580","6641694341317920349","4519525565285583281","5319505739706402762","4867637847104229844","7316437956681668667","13262979787964017220","3538096229770231516","6289792946328601392","5515359611695526918","1493082065158073899","15279704368428021019","4181216506877020927","5585906254018063137","17704677047305386053","18309007902658546790","3924332008723735596","15254192481519085616","12545433523275990634","17622908901493061501","7217043084857889795","8571957740834949475","16429270079433238759","17144733610015124126","17208849076914017344","1380885316519651947","15486561106941967109","17587179026472872389","2578972007095957557","11660765729946470275","10602646647309388756","5732583881140007006","8064768626804252932","856473745031548224","11470520459239885878","8795644319250885719","1940380326600670509","8872364461587111852","1187742510304346233","4738309496638033869","7822812346265451324","7297129811837786815","2883168960919472951","9374386046629176597","5067528258121018723","1502833092882834420"],["1747159091070671482","371926485913652873","13921895128513876965","4266837222441976663","4268406134141042942","7738462704757141614","2114584521090839302","15425828975517925347","5749096335653626551","18317341629141056009","11721952796411470276","12363916486436660761","6172689104685414308","9975644026454244040","14473684969199975993","3651180331981500294","255069027734809799","15283095172382525862","7597887794637405525","13936792784625637308","11751687344473841627","174646939321545783","9524965932491106608","8348622666497971499","16520933854636353991","11693118394459009368","10322586756790074187","15331845084427199566","2558191431740556433","8552836623589186308","6050372766037338132","6345337871534169353","13881370373407174314","7099906110800319565","11430209725940402877","5138098526915039188","1393302941900406777","8300098069224069099","11246936565106181446","7501276884726541266","17499552288605660428","12558720011805915465","13938142775403427818","12422307287415535407","866937589786589091","12039718946054927100","6491614376556780998","1683806442043544054"],["9626212954019634229","9530739697269553919","3595888155360500087","3942332328150524946","10012036543176468976","7569937841242241093","3195085271447957681","2968761504634627102","18084388220016988612","17529523234604910618","8025297628216771700","8705760695111270271","15462743054528728285","12196072473185664950","5344898410086809197","3334543180609027250","15343577887222519074","15088376453282460371","4039245750544709759","8472940038440345681","10545668446154374958","16063928478806690998","4105285520897185092","3109472975625031868","10689489486536706044","16682338556137812471","8383395196074230523","13411113275530350614","2769303965533389506","7134458100176500902","8015356219887468562","17495857510962709444","1274582741671642116","9429954398551112540","8454271628376142393","12912834692111222072","4454489910101902353","16646951503437685775","6600811277198374259","4623640436832251446","12701315005596591459","13293057371445236020","16785865535220204184","11451900475531093528","1921023358760847993","15799594499604382046","5465833412202780553","17301030572393170634"],["6546565669247916623","589107731313859013","2533050781230490102","12536610778894157173","8284642664771189990","2467969117461419188","3946117995091717515","3161843666216091206","5141270051955983294","12660694048217302042","17772204898956088326","9932359851492730779","9459115116714304471","3158434050849411638","1048567947981777834","5785188033515115203","10380701246577923509","15407968811864435404","18093098500071951107","15848435098308532834","11260761875795519715","15706118668600750122","17248180486641330079","14982317419214308685","17391052926794275185","18187867857391537857","9959729037031817673","2886762379351234006","3814487503837246182","3345102031509523185","10004706384975063627","13167938075866811091","4519653687461702256","6999286516291138479","16992107577241893035","11868649029408549704","10278672563684887438","14020186962288280916","5624011247848788400","1748518538769574994","11188451080495085008","886964822612224866","2943842204485794242","14212785561095999024","3211880544194990250","16513740596934498932","17398130436141902623","7687374120826978195"],["8919854437991185119","5954372543628400923","634241480879362936","16417382893625885513","13255135616853287054","1239694758053337685","15991148449819456586","12426921565341951248","5988480040254291495","14742266409320425831","3286747794917028747","2851306564614780874","3956495462543636328","12897409681020350073","1139199109730097284","6395760577556378727","13385700018566183784","3603205165568937268","13756268787967490014","4629379083838062276","7475952595732008073","1137967363953544041","18352557829571737567","10906888016803490544","5351292468022474031","8114716006712228634","4841435340321101207","12617239067356709305","13278765881290122868","264358509804976354","6524366030967347849","1494656289267853601","12114330773068526593","9599741446995244481","14170244653920683945","2890303538536651464","8732727613940200070","5817850468749674367","7412218976502055321","8373451725422637812","6826918874451008969","12455875160386076541","15901516017345715533","7798371116911434712","7607399769176383264","8911653214099592391","8358891534915931088","2191891971445701204"],["15511794993221744468","6556192133618149244","16677494578413940965","3947251803426403923","4393255438012076693","15774507180976774200","5365023134422142855","9607509597977996985","16190201324572438837","5889925815765624261","13294075301563387567","14840555658857369091","7136762201075847524","8566401356269621043","165602079977758001","14425008637443117218","10752554385044863616","6354358604942929412","2817861691326604064","2861512016240031531","10399270007787484557","7173815131567779073","11070329998479832144","16918155976777868143","13449845002214402320","9067724925498575600","5155580274127715843","9727799208130117030","12651879794446975688","17978251945836050534","3823807878951788180","13879155493949727047","14553420074491714378","12932869869678161762","1595659938610612966","15399246712072412969","3027202511828908136","14199013264967056438","16386871774125839492","7006629306326995279","15214211202453019898","709781920854806795","12933200433298489721","12652779110948168280","8670898182448544934","5638900746105981333","7355246507970801601","2575365243439107476"],["6940371538437425131","9596810157637754172","2156140219557324733","3024151145873505008","6200878537703145553","11948429180101836981","6238966422284910492","5543787152189870606","15963221966830889356","95738972078666257","9502001591685311980","11452031780383682488","7426731049026535818","16089631679718989925","15025212312734617606","13293002224889904843","8335923299086501671","12971833229201464567","9007955587493956063","5785406058190389012","14045186373420660673","10301725611792490400","13314625122225368374","5327937467508215472","6812148234403783131","1673702254234733979","6690053736426525010","5006126400520026825","13560780488772740215","10198773669158840819","4437822066660771473","8506484504428892775","6069937897718845208","17474260238452548833","10427686011806411325","9050690147507184532","12727037819015682429","6476795064579594392","13901769492074400994","5193443045109335561","3161875778990469846","2708560658641182980","729064682323127868","6969828905256922982","11043335080138993297","1681753825567219496","1588462862307870451","15288446888600635651"],["16536666191302251706","12373098626260162310","15328983431174965715","15712967368375086290","17677180237655830458","15681976883001760022","11117244718931233742","16925054955052052278","12493199088305547734","2847189232296490448","5409234656518997114","1399157852742019000","15468253137899661524","10838645014681966135","1053766422270507843","8873654310909050188","3026474114431876431","9835307625030751215","9947988259781089023","15711887364228736264","9687135682300710428","16916104870688417425","17858359804408338887","14332171512798340918","3064113193785415160","14394273342506911604","14998538624425625649","2484671814223550332","17187347536916274673","13234990290919946583","7029704552081524839","14259464721078954292","17958797158018937591","16191655826685144229","17152916152489708943","13259985292401799567","4412283121370353651","18437366184463365253","1954674429282211133","5175107085801246263","10883116647729859393","2817896721591730372","8703416458069666082","11328400199623555457","4528636713970958567","815258287166229321","4079595779089385750","10415244452850751195"],["17286101448375338080","2813289256466994253","9094297661495371267","11288139697340944786","7027344730323187370","6861935494913643919","9733944828363599185","12237715800250114303","13264442317465043814","204148835420690252","5345350324770629317","2742573912902975419","7684210528933303642","8028698808411417818","16203660206964309307","7790519796584294055","2076496326177116094","16253039620437151291","5817472578502037772","8955057495487173204","10179740327922259425","6073162333970953649","2077577283615609193","8880801641528829203","5814123303185913721","5301500744055590869","3794983511926958012","10803747376024814701","12903510389772761671","12762245614926180093","3795465202803664164","16497091111308291386","3474065535270403869","12247809728239305997","2821975869778828680","9804693962511701583","15706500184079889192","14001762954581318737","8307410012324057030","2247013195452650561","4614365654298610599","3219078166020819457","18080707392076349375","17011294858523878773","2195282186147869365","6500017956406454875","14926752827095908927","10795725254217638206"],["10317666999406345631","907976417566826830","18420788711159543726","4167431824241124717","520087273334506471","11547439363068253711","537881619947122895","15296134765458113403","13489853883126564952","5772765478400355125","11917962621396868951","15609769261519214822","4267275967774772261","17176049776445091691","18147375191974554535","2158661202998027792","2621325207462589322","5848948256233194122","10373338256259867142","1486328967783676680","12767452126987892932","11648568074118174687","5574198396899124214","11167182379994697073","3693990593193922711","14382918909239963292","13225826292248207869","1010875808225646855","7889790587480468949","4357107407460579354","6890281531998138642","17482276558583095921","5596563276033556586","10988935050211408405","2324559925366037474","2701437278372215608","13359211438366715673","15282354673391978588","14585545951535694266","6958070608721017813","3825666311261502709","12088250577487327311","3069721383334432594","13401050613649376595","5808939141657067362","11265287019689901987","16381507737153620848","17329659751308699318"],["12408633561412764448","9022733522557388950","14144931594887756914","1438000009389699591","7675297522958131086","1486820093211044427","6629478183383015177","1194562246206489695","16586753646413686702","13880418592394890483","154981294403722816","10245512375558707611","11148169776610859650","18242196862491840825","5596000040789210192","6523706772153166706","6783668864528224623","4799080922916145503","17933137086051017188","16526054043727330968","16541221161522064664","46644559007045195","9729212779791548787","7817245303006049592","5033589653514057700","8106006998863360449","7252001311331739010","15963891076151342283","279745725875962021","11361263236524073126","4640895077925766326","17370148187121511027","2649487777264364333","4599471587237133146","15951530760993820625","12312216880132142088","8875119259276612867","13830742328186432470","7754063205525178572","7675227393620763742","8381709612216264142","7432551945822831632","18138364990788154438","3835965669402593981","11278647501423337801","8081803593313041527","10871341883521574867","6876076919496605924"],["10326049544579948326","8964786935068645787","15722312071519047037","11769278899012489875","17810731569359811043","15263560425943801308","12544347273478855529","3260146178998962893","1661246849411783978","17861626962507408021","17248613584726664797","5356909795571122981","3615038423491451777","10937172498478050194","6853907630429107814","7431275976054089955","5652085362468590405","9084849024462244421","8022144906135945712","3007980780680715905","18029319587318276684","817515193818912745","251056321350689342","3051168722491006502","13749673197935851153","3122469622211320429","9455545577641983507","10630005665519750065","7432387281449044261","1711732166944453747","8913134195299660566","5414393423949490019","8232999327767249221","479655717285765878","5458289662855941414","9586225397182874492","14949886724183691618","13478580900684266625","10798238583742105987","7416600624159443510","13807870165049545505","4824828959852336022","4293181846930849550","6110615978930136863","7241354990305693923","14135774685950512203","11382081750415170983","4586270121974565694"],["8058000457605698455","11501679404173729873","8946144537605917683","1164698602335961454","5151186690805585054","3312547362684265544","9216227762360169240","9760390910004983359","9242249473400253369","2441996048009499578","8066678234088131392","4157877104039144493","14941843799990920467","12589991607777900723","12476205273873900388","17749810976544880228","5801440891446161391","3728606801201811870","16075859968471844642","6846577364264445840","11560178519907839147","636098232434377977","11240964127848777333","12881404662082325547","15370214712109130982","2057205189800859629","7176696914584584867","3642806767033956938","9621378256191960059","1553446515770022088","5850912635485613213","18307022066113224150","11546711992554172255","14305022955991730462","523434676927358218","1742178042812739652","18124221156665402847","4801244687209167370","10393360055714940694","4620065042407309751","2825705048019393674","11482692761466812649","7148780534536632968","15758869731124397763","9170347058376359882","17277159421870214184","6597890796803186709","2080069659565874645"],["10029455105816621936","6179358103201101144","3363977977377811038","11994050476896875020","4828829728349283433","6699285746052030769","16760597601241834846","1213943358045417210","5213507956869472728","901872825125887119","7682970165229160302","568828173746528779","15496731412969180099","2564235160939635235","8578162407045335256","13738791539943379960","5886492385538416118","9911733192996954849","16026057286921349124","18173052870938349680","18245209986298474491","14381436898451452003","9744198957532390404","14110792571329956199","5016840461542455326","15901853378816627539","18314191686578079076","2847861916347050078","16763156495329094360","16455090302011860350","11276246066128690412","17419479971332746712","15624909896034610549","11051160430054804107","13466276535515783183","4576270784304220450","8875258580089837573","1670243695872066139","8720816861128859552","15133681079432862057","3233921232963297108","14547673156229746646","13717631239591084000","7672972269997284074","17704851221352896464","17931064938325121589","8501860288427739792","118326851175253050"],["9686537859223934700","16408000558010773913","6044688723212966203","14610881626054388892","17852968456351525226","138886565532103703","9959254511943867354","8720549894666364596","16541649292294507228","6331580437397908372","4210868259114377393","1270622201549147677","4417853143775845489","8941578423057954381","8271325802474024715","11348833036176342135","11624993590063230071","16687065285102232515","2200773400754368050","4688255267070622375","10500534124322040555","1739515592640786306","13165961101899377333","11638105616842696051","14844608274387257118","16227173413344495349","16793904594185678404","15658426941028029072","2638630598571573232","10222251834897533356","10980564756073985580","16053581262022181821","9695820008025493086","2008925192555490546","2009855990415994104","10789396500422975451","1095961105091115026","16995066958486837455","629538996403477334","5030260248123957125","2248020783551662441","12503875693841521656","9206754295786762164","5394204923900927818","6207324286835360081","14310690579680387477","3416859206272815815","8177569483043676174"],["4385525990575689688","12570956709753933557","13920604936627678688","17932628588655410604","16189678866645681930","4613058386632621435","7812865512776099555","10533052780073104448","8255575812195326406","10664580738922476877","6381483016544271064","10079965040941886549","1188464529971699172","948950541682814873","5879358103593880827","273370787057595279","2886125726143270117","7188946201550480699","717579167894055049","2882706420717472460","3551336991163288325","2527719031625877156","11916337258639153463","3070605717461007654","10839718872166432642","6229748056454010525","1382542276382184972","17618156978238157878","538033404236321086","8678166302744860842","2591836742187512082","7912353141726517504","7632550889981511440","4601968700745183917","4744167640857000099","2367605887592299054","5320804475004394128","6512401249686399722","18424473519586375067","16852568144215539452","7679618884753006391","1701644193120919822","9192348456386754105","13479140930843158167","2151888317698182099","5722455279304709498","6390565093141099351","5536958236038287490"],["1411445647463150730","1283045830198789341","18240201035587308662","14292661435379534320","1026220700344154531","7024164207279289801","7150371709375717934","11085458415609536670","16765022033572433433","10988114793803146637","1324975962729161911","16886312765057880686","4870133759172006225","10106033515952629113","5664560387135958241","11688010181849847565","15658962010740012485","9155199412362403967","2843174030786435729","17569481199829964349","12138570767783925784","167972633045492866","17419711996226679140","4352011033778111362","14600418064901239931","14050607814772446010","13358773753680167789","15132062244346932337","3944374745056733241","2838227570223280459","6812329724631366311","5080740284657212169","14717438470818116829","9145259733022805762","7338033293835161785","14735175821197374405","6064560918321843933","7709778421286649675","2355886044749196281","10331516189390198009","7414632105506262595","5628233939421208878","8863014964747208092","8848190796501912008","17988687400669783233","6256229801085056283","14909834802592731877","4480921260757535201"],["10247888253591401293","2724234797006240420","15234143956078148839","8699601150561681027","8501652117025945876","4477406435767254515","9056680747179462048","11326524014323233048","7124096652452140923","7688997662708372096","1891817646341873857","5771372494113915635","4358658587866602019","2918939086087762895","2304542095018959352","14721378788667435864","9383721746968536880","3415631630173959185","10836713492439311632","16101788728802704764","5163904039200401464","2854379403630061075","10637772264850838658","6451808570809027494","442856838893528325","531361358145197287","15454330691125521200","14942835407699176423","12318892868137625723","14776843512442738504","6020187578389858172","5997418316284667435","17378828484490143290","8018154735200212150","8929960063312189216","3299962253014023198","9814174479285169627","14046351920886267902","16209695177226164317","17841996599209642928","9213531266574687289","15675415138236079187","879621296818346388","5529565940400243329","3042355181869265077","17968964669626181241","502898561278931725","10599858372619948978"],["15451674327590404082","5232899836904687685","12366905917457975902","5355334686735006360","1453480920560449189","15996844297144703722","5900868962866918006","3506972287348672617","8496665213345997711","12539525926603200788","5005333025988654654","7036594991563765338","15822861287342870954","1375192435612229218","1529664179233348935","1068462416956118673","7673461038110455097","12120879844991570408","12306769019534988125","10451916109566260705","1804432874852899663","14235727385365950068","2478432887557146091","8938113666699359544","2452271125942001094","17449821023825987278","11641861093525427898","15344094224912262387","6740500643545466189","14977237966888822160","5878117405793599389","17420815906981953566","57790738323272684","6532875774600879503","8433952038095311738","15539727175910408518","5748877573651102488","10809118568334021630","8115952184728226148","10994479318876376517","4111921355159861909","11099473456028829208","16353660832035753619","8849797729276740325","5687603033812835658","858189012452570952","6562677776702594106","13715385700995005116"],["15974363340447999214","16611860467316779401","2837356811966739131","4529594748091718317","10535433769917715014","455449396313055539","13992924234548020374","17085425245779341794","4268819946007714676","4481245682379032159","6842932555311379329","18326305247304350458","14784847936413076866","17552192070148538076","8614734775122956541","5843145510297276373","18415695609109160912","18009030587648247066","11658856632524970506","1698835240120384584","1955442190791176289","17980199721662042082","12939810719860754016","14331725432432850913","11166884914594764103","11740869629661969248","14509736269403500051","16398979514729296528","12125577264370928417","9135445798089098429","4792950346652993938","13784030821178027682","2456593829506352736","2142265356849750356","18226422962642890432","2297127349033661856","13928370697268242391","374355187199156153","16747743923246923380","3571830084893609303","18138249792140714919","11433197661136008051","15442477100290544092","8559600188950886770","14693707846979503133","14338574733090297174","5324175113423927345","6489353659196097759"],["17014783467304916455","1338892093947868398","16967687566734492834","15553174749615393981","16312560449562437558","7381605596493004697","7926507289902847622","1547725411536247905","2678918533057261269","16851833940670587563","1418670363690177445","7114237458871237450","16938140351126176678","4824103331517222149","6185250494103158234","10296252076416032717","11727684578981128501","8016291488022913144","4112256731517229372","12075273173015073076","7893838628031142045","11083577831473253804","15580030412651103737","5043990974279945347","3793265017515677850","17434196383521817375","9697308825390902234","17026050566317442332","1654233602728473060","7750295951169311074","14372656101084705123","18042412927101533807","14501933440311931344","13766484758370588418","15571220291984024022","12473879346247497423","6532041647452936552","10740027030669558282","6497524936221337055","5250297951973097709","13642487277259055857","6410743826038844279","11995701585172806587","18245297064203656782","17376301899532346349","13075603422828389795","11993472603712031237","10211619747013793272"],["2049936650273976581","8975237828703571742","18151323000587844295","11087221907192616745","15093869808582260620","7047048161702645085","2618845142473469255","1692902068510543053","7866579448153402116","18062614879098165709","12719894715525779526","17170762606789387908","4829654133107597801","2955989184476185299","303131589987909654","7399651681554180167","14577523261190646054","14883774752089302589","14262880880819756484","9748205490876272136","16170995994456944857","8199306748386160696","12833187846424902101","13118378164567317056","16064637849053129108","17426002519062781771","690033704085520560","7310882521238379134","604645793033620644","13004833211307918374","12244981270670980639","8789486703011849147","12846792124963377879","919178291707964503","2682169033347762511","13914323346119281086","4382617866482478926","3184877798407571377","15761374384659451165","14349963734032654127","17497309709137943417","8795541967634464698","13569796613136023478","15511703896109406538","8051470569121786175","11906828658895649565","1548968385664202213","448365123498815640"],["13119803479961052711","15072201149926656677","9424337797082809029","118537983038844552","1807059058129958328","4985225447638636934","6888483849787621171","3958004496875816856","4166576607423583775","15411708754877167208","3265850882072058407","13872783503919448670","6637916295987014397","6413385977969577095","12448378071948737580","1283853724127549003","2863841624261256011","14065108136188952739","11998850349344757890","11660194808439975719","549003346972296065","15938918079624259954","4757590481864332944","6741228864229236740","6855321561591749036","9871781166342057264","11819776229685013703","62284058961171467","11134862829648799325","6294072896519004132","2311845905131955243","2563047842237360564","6473660757092214085","3607883285959004960","17165492100073697386","14811284880368305825","170417267774608980","3271166325994402212","10077856400724567337","11153605746880600099","2873263583632570571","8919320408752968346","17114541119615063546","10104764350499475624","4401484242754025841","11392473239955894063","12525591392470788724","3173268749823465240"],["11947090222101512058","12739199578080707429","2350792778494365406","3852292657874704111","17227288152664391208","11463609837877827949","12730549210217500316","9431977545441791847","7827486603804440744","17560757026689696513","13750863950637135118","8801753848831689724","12311679007170950598","1441482523043884213","123631376070976115","1146572617547758384","11561409225676547623","16325676675858117444","16414953138119702072","16947182933728540693","9975970455019800096","17704954854312702279","6099755807338803083","8123737174726894734","7582803708862763661","117316048010236243","11196313462872284082","10968484137348639837","3958030213450282383","14833307554387987625","6892881333823288984","8787341230115375754","14688486574947343315","7911915996392092780","5098309595971221718","6115842966482127646","9930253888104001338","7211729593252054035","5760146896339523010","16408787969214843910","12086257044451181824","13845811004925859490","5889771863398526636","13723169605182494448","14431897186556087959","16361516440644870624","10256840756191619826","14681934252178427198"]],"s2_siblings":[[["14218617876502353209","10991999834710115849","12880025046735367237","16773820471366684093"],["10959544082922576281","2143477252585386853","17277187559051042681","7225844824889643135"],["7024700004194929875","2245269085057877619","17563982450028016131","3741170684719465479"],["12491928227021381225","913647602259285903","12046206252223272175","10928897886059293906"],["17541932762183099783","17328371304158616342","8128664717085430","8832725136283236562"],["16919061108836787392","13154622927583793164","8659375234418825005","4004451713947636989"],["4704859182546042303","11575421454144529106","8400063402642708015","4829446761090773094"],["15927707776219288770","8095753841496492100","15313695352144817049","2478834161428235015"],["1501132641943616506","8701478084226483576","10126491443517850611","154609797757730359"],["8688572171028210064","61842773550796723","9738081474837998524","11782359298569115349"],["8906685377976631317","10581596787684950696","4707708390858761816","2737016069631924749"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["5836862831917157446","1267748290021058778","11765037422158712615","12876248780092530741"],["12813955440571830690","4615980229708997942","14568927032758471679","17777560700308871449"],["5796206712071756276","13989840445199143698","13866615107780780857","6316335059922156377"],["14132604220465970818","4382345163751229698","14652479639414871332","14599310041289070153"],["18431527303455713640","4199479747030540645","4671895615396407878","11579558252634883067"],["11997526460597899266","2584094724554976496","3254645320021807555","5199556473118693535"],["6989781760667296982","7415585679874637875","5340310616216514357","14188950549791811307"],["13351799094156567287","7538648782631705758","16094414976417283908","16451990646457896203"],["13419155323203036207","6906500701861707217","3920120839500688381","8675149252627902193"],["17222240632314183672","4413340497013020291","6539901519265704187","4315088131402532784"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["267179999641432385","993625901020521808","2952005646123875618","4629297300724965859"],["4716362958611200996","5099011571401670498","11360905359736875502","5259827605782250541"],["15551822038613586347","13715636113232922557","9953802350840410119","1820499716714735292"],["16729203895104325249","10466122275198766146","6699042329698735701","9090894945983773616"],["14023749132740158097","11570509791886666224","2545092722776073649","8962428359761085266"],["15671828532345538663","15149171966471810413","9462835410254865013","16908069334927977649"],["9006730979762770645","8745892487600920379","3857320653613429695","16439148270947845226"],["10397218116542740546","15793739480381350745","9440062231644159772","7166443199719373683"],["9742677551990310035","13691136844352434203","6920120750487262336","10780359147299257755"],["12854008147431354060","11959617161634274261","11493638093362647391","10772819174876528698"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["8591692161124179039","9712250582055374240","8529028391377763416","3291697415638193602"],["4444831597808083417","12726729452816447441","3998883452133793692","9820827728643817836"],["6263870609169614045","11743642370775889308","14710750091376837049","3034928359602336895"],["17706871735984782041","9980174062746084438","5863358448800132353","6187791085148231282"],["17567731413261016830","7318023792345151851","11928801034828268102","3069697963555881471"],["5418691966517402025","9428583832531521750","4764076885779162614","1545216961582215092"],["5771964782781776697","11577307278860820785","15268980499386611498","13794304182223209735"],["16774786783452099955","16447730130787947680","14950609409150714013","16452997977857807874"],["7292556429307430794","17526609434669819863","7594783303677528067","14627565367892527528"],["2265710789398660733","12856900927844631337","8414597425013370055","6379898085273522204"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["13354137665895164238","1382750720370606854","12697421908911053056","18189821028548412136"],["5902355582848465875","7625658092207746361","11017013631367600582","17382805139004563019"],["2074056707878982468","8763238012300499054","7924172731193242921","612787524861938940"],["9866404248345002366","18292446626696543829","15810878093326172514","7644734335166807138"],["10734764116597299866","15110835431561378918","16487855028369997436","4854087193937224359"],["14923302614788480557","6758041466434819472","7005080728657265475","8257227510749814415"],["7178180757741952069","7597567562513614721","6697643668717131191","3003886549052667359"],["8105311189459601592","8830825446983234063","8612371428814685256","5850841534568323324"],["415718864374148963","5445236045356232825","14361538494832672464","18013448825881532190"],["4751102133312042569","9076206512214870728","8199563597597666919","16682599585765073681"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["15537191354597452684","10459414825098890505","13422043976936811771","1336434097341153712"],["8305000233108201287","10005760313660888097","18353729607493062529","11711739437514759295"],["11105959664288915129","11214178784780208871","7454057253413107823","10682579565667704585"],["8343163014343791737","8805608774221644627","6629757215874704828","3986318184077553430"],["12479022280091959442","6066282401907673754","10533930541823557475","16049725483377859203"],["1430397742385381121","8755472471191699378","10491671148116840863","18061211597433215490"],["595513294082282754","2086099059924457104","17479516086880360585","12883503908144655071"],["10397218116542740546","15793739480381350745","9440062231644159772","7166443199719373683"],["9742677551990310035","13691136844352434203","6920120750487262336","10780359147299257755"],["12854008147431354060","11959617161634274261","11493638093362647391","10772819174876528698"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["450239363809838380","2826366069094519197","14505183858909229428","7762731878963937893"],["7265513258416276134","4622850964342825052","12697195310146024904","12028121876621886199"],["13950311749302080229","2620735100099930779","6729931088356221133","12419663410248739624"],["7035471593011447115","3851629245539251224","211957812976702349","10584777602099439164"],["7214711873359150588","10258387633422797424","8291067385281328719","7183092799277529332"],["9430240747071080337","3911358345966320620","9881211234323185183","2753856109632506934"],["798539575730341017","18385801952092803652","2420582649418287409","9153133445134601145"],["18438573081034673992","7148473462473052855","16966218367866900254","542361867401631958"],["415718864374148963","5445236045356232825","14361538494832672464","18013448825881532190"],["4751102133312042569","9076206512214870728","8199563597597666919","16682599585765073681"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["3660287166951800459","1305283694370234344","2332683559214790739","15829764654175082199"],["6314529929237075649","5413648903754555773","3898191015074101576","9309983873820279777"],["671743164747909724","11599068460063561342","9911517335789945275","5588746506438505248"],["4942671163392383208","58294913524909704","3355728793828366194","12608982905607214364"],["872731380359230632","5525826770636249099","8599375204907912037","3318902624042244118"],["13852808844205396598","4385537708421253918","1860917379162971508","10836897185744782325"],["14141044472520338722","4860439567464544884","17267036348063181979","11153491330289235886"],["5429245769824391149","830269509387106810","8405998520728801184","13778757291966115544"],["1501132641943616506","8701478084226483576","10126491443517850611","154609797757730359"],["8688572171028210064","61842773550796723","9738081474837998524","11782359298569115349"],["8906685377976631317","10581596787684950696","4707708390858761816","2737016069631924749"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["372763083946939038","16006538069833667253","1493604313227131847","12846423493799171070"],["4179418693507512398","430437473987024177","9048004607551688729","1402850171906234535"],["2789282141617496483","6847974750525455727","888707333188351928","17051808913127843851"],["3636853667159735774","14482498543700985994","12926686067019089916","2928322255601827107"],["9710104471087308394","7706454909435810640","1971420722888831696","808355370586493948"],["16956176112760045991","9324040165420911873","350930695184432872","10572256898848019109"],["2900392884809899586","9102847437050355266","7633943767559310699","8058869725958230048"],["13119589886480792766","6075450447484292347","9056975055326207395","9593977932008026058"],["3552773948731441551","8937823378572711923","9468660286783356166","280845210866206566"],["17838438300042997022","12778454215551578223","6665224392839607001","7894366696031093682"],["8906685377976631317","10581596787684950696","4707708390858761816","2737016069631924749"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["8803966957460596798","15569380496968161626","6847969281151186692","18352357481991265647"],["13425324768717131104","4241054846037220358","1910224608880980648","6001997664194673181"],["9641844503492431320","6166560307050479821","4967747150632852305","4704087950629872554"],["3178569986704540686","15187649299077852832","15535620486555123823","3528375526030036155"],["17317381639416819709","7155536765539529031","13412034597231136974","1642602168849565576"],["12211345947763773480","16853165674310191620","5409059099382834626","11374733951444037432"],["10868642288473661176","14682435630696663325","1992035339992313744","12413782541340732897"],["7515918115378726738","15214257429962997827","13736965755278838845","16107716737666656964"],["585890144570812619","3731044775912405707","18321048579806919104","16076382575742729443"],["10280959959992711571","6987187246978120579","2850958736996786141","16670547223366650605"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["13396839140003614196","11696066642959470514","7807704585681413751","14470816311267602368"],["4668577991099544836","586809552590070131","9174664072477673882","13966010350828121641"],["4953838109472228360","9283871353130212901","16117920705167768824","7450744715757157759"],["1832793663749865452","90910807583760359","16379911112133958185","17146752545382684396"],["2260896319425897297","9805854912780637153","3780648592070788444","13859527326507205783"],["1309243091255773924","153081364063208392","11544905558651893360","2210590861379028462"],["2804397068825424313","1694192530259011670","14594644732372880164","9858905986408138915"],["13628538514106896961","15458625855350621985","3811252676592297694","101541793024146272"],["9146140194313605233","4105187701109988318","8913650325393669707","7069662210154098243"],["17838438300042997022","12778454215551578223","6665224392839607001","7894366696031093682"],["8906685377976631317","10581596787684950696","4707708390858761816","2737016069631924749"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["15256869841370779865","967829210113181528","3194930754717184753","15445723200316326664"],["4652502685089482517","1744189090780087632","11628150714325966480","18423413496174510182"],["9464846944341384454","18039111554816899140","16459581402081867889","11830472479441377740"],["12919302326745747732","6514923664777271282","16169769168571307052","15139054060384826336"],["9688650246959902933","7435240621762278185","7749241250465201086","2123652251536629665"],["7196175315900966371","14270412608384140511","16978093538745904648","3453612359949302425"],["10129693070102920508","11473654047066782747","1423976373521975805","8028790310781636825"],["2448686339900984069","7293364300059951386","11624415773450106903","11819123087807663624"],["7292556429307430794","17526609434669819863","7594783303677528067","14627565367892527528"],["2265710789398660733","12856900927844631337","8414597425013370055","6379898085273522204"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["5494155988003477139","1736000305819231140","15447487624743163903","17107456256698641925"],["4323070510360753141","8803303559691254156","10175267645002072674","4023027920186736821"],["6126041731188404455","982122920595817502","13986733919315038735","15535701755685793064"],["7308094797936986326","17235665715659972431","672043449249301534","11825794500039420410"],["11650788410125874518","12884514195965353799","6454239247573917879","16019667926578012241"],["9674494283822678247","10950226100753537106","4134980597847327808","4377236783250511578"],["479830733522793784","9965121373843412946","16899416211181246026","7084568479355851616"],["5475153066554391014","7400284909932795817","9063062804422428494","4143070264008707972"],["4230578173563426601","5148505804279673204","18437011718516706230","10477226435529216326"],["17222240632314183672","4413340497013020291","6539901519265704187","4315088131402532784"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["11998768585908919987","9987318194600920503","7468481186355729898","17141039487355459066"],["15017761999429454935","7279629345307384423","16769890894647822385","6965757840062013388"],["2384223630463487004","859143179833277358","11819086246120072177","13783486146675871552"],["3678640831443324445","17491337749724706307","17176264597819435138","4433880887727223697"],["12930604217077545802","15488593168092038475","16352893789903163980","4787849283329122258"],["13759988081832395273","6642682396743899645","16972962569025433028","11983632194175454522"],["13100159336576688050","1550303172629993781","12458899802216919788","9327455110557631819"],["4211654576803870803","17586932045014088425","1460801839849889669","7396753749963276990"],["11277240418565044825","12873628777658747399","5665133248049916909","17676375044244260494"],["12854008147431354060","11959617161634274261","11493638093362647391","10772819174876528698"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["4930266723115266614","6101804238339685279","14423223818669883278","13586217572883834970"],["1035631210259117618","3248438871276377060","1841771194045538222","15087441359005367261"],["10643546993792023594","13327356765835535787","16163767945498722602","17834423658867329641"],["4788586671757768145","9882356748909994976","8737664597313163875","2650916060970770182"],["14913645312500426156","11140127895303575654","13123899354326298320","6653718217828094496"],["9723052832202990067","12314471100360254792","17322220774990663475","10709580624358014875"],["6742406290069719527","3637319286218614038","17343829378515059266","16386675098947703084"],["16774786783452099955","16447730130787947680","14950609409150714013","16452997977857807874"],["7292556429307430794","17526609434669819863","7594783303677528067","14627565367892527528"],["2265710789398660733","12856900927844631337","8414597425013370055","6379898085273522204"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["1081963135017175116","8928122934845259652","17854554812280933383","6854478316050749058"],["15075136968597459474","4462635478501968464","8914290458004571012","13242591047148883697"],["1414616149163115448","14584401580214967628","10565454007466607865","16830979327474302528"],["12054615739314360680","17873758654467417583","12384779831584235252","12678213830296974027"],["11296684937645348777","12820737277311272105","8199980632951782809","8050335400524620861"],["377518707171056986","7235940612671178169","14657011607570455143","9052108751158271575"],["8957486177524643113","5390448046426882387","4386003115261262557","1623794302283502322"],["4724715327660427561","1102698415000766623","2841369706264153970","8118989575982098160"],["10281982775577633775","11831078144798746499","14164484462703961097","1524261889747644556"],["290960761290563818","15028400429184141364","9274843551925230431","12439393625229606147"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["4170799898440141043","4954888481871912933","4756127094521416544","1506255888375138937"],["5385915010736174352","1654663552505820512","12521931176924096606","16964471511110269048"],["13581339071860965581","9281388557338238217","7897975671765588445","11649781098825074864"],["8466459281739959321","7237233468352663899","11340412668135172130","16614259406128279206"],["2108938345979940896","12379852693175263667","3391684597861903118","1078213266252511695"],["3155012557540131045","7673836948134480715","6046159054337693852","1560411248566114629"],["479830733522793784","9965121373843412946","16899416211181246026","7084568479355851616"],["5475153066554391014","7400284909932795817","9063062804422428494","4143070264008707972"],["4230578173563426601","5148505804279673204","18437011718516706230","10477226435529216326"],["17222240632314183672","4413340497013020291","6539901519265704187","4315088131402532784"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["17549688202608425342","12414041354230953232","16027280428475556087","5891991774672134301"],["11477683764673104393","9132512038706939984","4490077946709447928","2214494993405630856"],["10104569914840312664","3114470837466718635","10065711398427534377","393100238213656846"],["9696807299800961098","18322874460417614983","11682164599472241298","52774760617219394"],["6833253510994121740","1465654538182577618","14870706607169073564","14807202381348011196"],["2804427986977753660","1455646040611096255","5061826994073419584","7028549582867359796"],["11593220272949717483","9303232089601295943","7627827193987487268","5180350582354347136"],["10829916113676503520","10449828368318500061","10543582518238104980","12300061532695218953"],["7706331951961227349","8114762984776069284","6924824567548986681","7818259811947616791"],["4751102133312042569","9076206512214870728","8199563597597666919","16682599585765073681"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["5494155988003477139","1736000305819231140","15447487624743163903","17107456256698641925"],["4323070510360753141","8803303559691254156","10175267645002072674","4023027920186736821"],["6126041731188404455","982122920595817502","13986733919315038735","15535701755685793064"],["7308094797936986326","17235665715659972431","672043449249301534","11825794500039420410"],["11650788410125874518","12884514195965353799","6454239247573917879","16019667926578012241"],["9674494283822678247","10950226100753537106","4134980597847327808","4377236783250511578"],["479830733522793784","9965121373843412946","16899416211181246026","7084568479355851616"],["5475153066554391014","7400284909932795817","9063062804422428494","4143070264008707972"],["4230578173563426601","5148505804279673204","18437011718516706230","10477226435529216326"],["17222240632314183672","4413340497013020291","6539901519265704187","4315088131402532784"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["6219523484686010375","4551881960932348527","3710941646499819992","13712759027150052022"],["15414577367213851259","5759236353584654457","11161316493511851564","3194242067387505357"],["2537666717500507981","13038419693006765716","5607803257453822662","7604947036496483390"],["2231930175502748613","939013443003960709","17633424488671755215","6451244690895790391"],["9928580717286896997","7416381148277893938","17667833941052519256","17872711759572908569"],["10386295349697838553","5126234982499603344","3897508268103952439","1405858442269680470"],["3166704115959880969","3966450801083741068","15257837942252623365","2667535775077460490"],["9768195684109140286","2628825541478772801","9186996250614951446","15590002217082258945"],["2904005391667623777","5476493486049709822","9145017417815705829","13638718656792991844"],["10280959959992711571","6987187246978120579","2850958736996786141","16670547223366650605"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["8571584422123492629","14228888976626953808","2507368225185637499","6573932634283116731"],["1234160623950733481","3207987973957164489","898459337132729091","1432050400882040462"],["11091237880303044039","5236574021539035955","3562454745188328349","14610053985106451239"],["912632252591766065","4415736177390482788","15862483005476191603","18095525209483516547"],["18297626690786790650","16398493537684677758","13986659525786792400","8418292088142775443"],["13457162133072768090","937560425010153563","5343295702071108795","7095371304058499487"],["798539575730341017","18385801952092803652","2420582649418287409","9153133445134601145"],["18438573081034673992","7148473462473052855","16966218367866900254","542361867401631958"],["415718864374148963","5445236045356232825","14361538494832672464","18013448825881532190"],["4751102133312042569","9076206512214870728","8199563597597666919","16682599585765073681"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["11049356514630756089","1065247241647938824","1912557496261748746","1596977716887146705"],["2583839624405252860","18340561268417867320","2568055886484053661","7563245859273193750"],["5902602023453095420","960090894660557098","8168924878413270575","12005207498244071968"],["2507072952660385174","11336431074741033284","6875498577326556887","14130676064473849915"],["11109656538677009808","16260498894054065193","9312021755646733476","9757570806822660041"],["10386295349697838553","5126234982499603344","3897508268103952439","1405858442269680470"],["3166704115959880969","3966450801083741068","15257837942252623365","2667535775077460490"],["9768195684109140286","2628825541478772801","9186996250614951446","15590002217082258945"],["2904005391667623777","5476493486049709822","9145017417815705829","13638718656792991844"],["10280959959992711571","6987187246978120579","2850958736996786141","16670547223366650605"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["13123327517313974814","11340217643795899801","7227793909542459182","1669191035773478978"],["593985509946373199","4711274002678618907","15772579425274398983","5438375444655920909"],["5102563694941387247","1539308198459204764","13492006216161264793","7965447504919053602"],["3287755282145851039","5684670753361811110","17317138005750606294","17230633201145133128"],["14042844182021492714","9117757187035830158","3910406472251791661","14742350206608268687"],["3534376117810114260","883608922655525728","1110909228101913190","8799410069751464059"],["10661078682466880900","17858517357786301303","13680673624078617628","2983103624831392995"],["15833669600168922073","2093117077125649624","17288003101267694889","8369026509673695239"],["585890144570812619","3731044775912405707","18321048579806919104","16076382575742729443"],["10280959959992711571","6987187246978120579","2850958736996786141","16670547223366650605"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["1395871820727512805","8139960728114159732","5378091868674963821","2203121228531708143"],["13175242170695709732","13980516634237946910","16299059075612676942","7770092894269856079"],["13518828429567023004","2396764560612733637","1743971583710028701","14895273918071322037"],["16534569338636857819","3401088336315154655","6791673912526547215","7543560994008663357"],["5407881726493919204","5814375548093456780","12112522674636243908","16405536193514709076"],["8726792666872359794","10198691358610698113","2347219991068517822","13623445738209783268"],["8010867973415842775","14029413595992782503","13468339474416005072","6565174680238200194"],["11238600086070312654","5725860909932159586","11009447500573241344","5710910060488552283"],["2904005391667623777","5476493486049709822","9145017417815705829","13638718656792991844"],["10280959959992711571","6987187246978120579","2850958736996786141","16670547223366650605"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["9160409797260590806","1503489815665433081","16741634504362100196","10684214388082859191"],["16612209822801281068","2346971947284611285","13128172697030744378","12881968029719141648"],["11192602677143055167","6644030507901711543","5754873385422832968","7631568639072525320"],["2428658169229877541","1702522006707746817","15385314015280383015","5994291990825460081"],["17637150119683189929","2376226736661216429","4577951895859112111","16691237375423934734"],["2406101204753861004","13468809374341979091","15548918754785320682","713035827568948890"],["4740263578001376710","570375255908752154","1733795810069797426","11189922056817913806"],["17557767020160752667","16793439528086391409","969741655797080504","8664323846951072697"],["3552773948731441551","8937823378572711923","9468660286783356166","280845210866206566"],["17838438300042997022","12778454215551578223","6665224392839607001","7894366696031093682"],["8906685377976631317","10581596787684950696","4707708390858761816","2737016069631924749"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["2039653424491074400","3478799106591043053","12031614634244142637","2952736718164802596"],["16625163946196784619","7700058792145927133","10061174058759942108","9689995659469830647"],["2182521361438662685","17926903339170998868","9818749908429669848","8090476844429897525"],["9058401974202548358","4770036113688069421","16674393033172511696","12401149319088649203"],["6833253510994121740","1465654538182577618","14870706607169073564","14807202381348011196"],["2804427986977753660","1455646040611096255","5061826994073419584","7028549582867359796"],["11593220272949717483","9303232089601295943","7627827193987487268","5180350582354347136"],["10829916113676503520","10449828368318500061","10543582518238104980","12300061532695218953"],["7706331951961227349","8114762984776069284","6924824567548986681","7818259811947616791"],["4751102133312042569","9076206512214870728","8199563597597666919","16682599585765073681"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["16441981851563858195","1800234209098152854","16521044840917260007","16123737157674336207"],["10666665449733764743","8840880150269563009","10751705751566641973","6785448245291207175"],["9683632976651837889","14746785283229394423","17857355223072306178","16231878226370363157"],["12269279522725889528","17260881604524403219","11931083152283351576","9454011121662177889"],["444496789884482952","2583165975234450737","17709292677566107042","40601723924157510"],["10622169803945099666","3445007485239638241","16971179025234664539","11841654372406488500"],["15154375506831384125","2129444599120763612","2012713748901764452","13394973549829532583"],["1950000841171661109","7945083744004298790","11440822525025682129","17588851896156096590"],["10803587447532030412","14536853780171097165","217913321299250289","13007044524871042816"],["2265710789398660733","12856900927844631337","8414597425013370055","6379898085273522204"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["16090111596090502979","8673461488796272620","4368088948168782665","6709824208516114924"],["16320682101062339950","535895432389531933","3159783323375674080","4264774015651927628"],["13415029254866408514","1951684009316804762","9492328689175242562","13405650064969168734"],["3628993584821918114","16250240813539106126","237484344043238135","2156843576077345948"],["15606858352878705904","1671373833646265993","9086640410086517648","2705584599509078231"],["9122007596707352478","974152117334607834","14263912218046262863","1384567094612829170"],["9728088239371738257","11006843551529322612","12922862230454143862","10525132188194904548"],["697032018687537973","9508328946701711223","8767861288512671468","3451374784317394946"],["11277240418565044825","12873628777658747399","5665133248049916909","17676375044244260494"],["12854008147431354060","11959617161634274261","11493638093362647391","10772819174876528698"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["8576083775276012436","9394153677578979748","3206228818743526563","14471027127113932105"],["12726442457133386595","506674409136732113","10367393926858399554","2370938093151551518"],["587571089039596672","10937283998828531359","16858917623261892305","8603367454967023509"],["15188261392980341072","2310363663481599526","9110031707569824980","16787172815468565360"],["18118368396596280664","4908474980482732792","5163690984473592239","11526028578782106939"],["9469429622997806230","18426469968095897754","5995063130470345195","9768614089341948340"],["5054527435500335613","16182749092052765633","3130186079895117981","17752008706623866579"],["14853899765755114784","5681345559339769320","10244257725176848126","17650287243925724165"],["2009159544327498183","8745788978530918519","6761719346991666925","14162495808693055795"],["290960761290563818","15028400429184141364","9274843551925230431","12439393625229606147"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["7126069183661999831","17517281752158219002","7634872210386584348","9209862435025563077"],["10972120948799887599","17190691753672701922","10271286927631592830","15424201368984170494"],["12759237496892832201","11991605075797896831","8227194539236458180","1997577545931384023"],["5438027681515256108","8647201100717887521","14261940464360332666","14923225514467966583"],["12305723298982947353","7521509141830917900","7093838126648145129","13595793278201262774"],["6603918052256643122","11289149503252934323","15999087041087877807","5077337837611775649"],["5771964782781776697","11577307278860820785","15268980499386611498","13794304182223209735"],["16774786783452099955","16447730130787947680","14950609409150714013","16452997977857807874"],["7292556429307430794","17526609434669819863","7594783303677528067","14627565367892527528"],["2265710789398660733","12856900927844631337","8414597425013370055","6379898085273522204"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["11954418707379663119","13968269409792799920","1671426884893007394","3184063160319007815"],["17504323940859988184","10788533226972530107","2855638507541360392","8816609403154821413"],["13527912457929762997","8290729580629863855","18409411078254960225","1176250363942302574"],["1379171142938669813","6184649407843609945","14859694714471508753","13689411277161857899"],["3008991607122913","5879511949930229511","4044283710811363646","1629272214854231755"],["2263495546144407985","4524696460760713543","1462785310492140964","9749821818874609045"],["14112424334085822068","11091133240964879470","9743143984726694590","7958079691667095668"],["13628538514106896961","15458625855350621985","3811252676592297694","101541793024146272"],["9146140194313605233","4105187701109988318","8913650325393669707","7069662210154098243"],["17838438300042997022","12778454215551578223","6665224392839607001","7894366696031093682"],["8906685377976631317","10581596787684950696","4707708390858761816","2737016069631924749"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["12309964907754871086","7011708494695391702","289072257418642614","4719932790270507783"],["7265513258416276134","4622850964342825052","12697195310146024904","12028121876621886199"],["13950311749302080229","2620735100099930779","6729931088356221133","12419663410248739624"],["7035471593011447115","3851629245539251224","211957812976702349","10584777602099439164"],["7214711873359150588","10258387633422797424","8291067385281328719","7183092799277529332"],["9430240747071080337","3911358345966320620","9881211234323185183","2753856109632506934"],["798539575730341017","18385801952092803652","2420582649418287409","9153133445134601145"],["18438573081034673992","7148473462473052855","16966218367866900254","542361867401631958"],["415718864374148963","5445236045356232825","14361538494832672464","18013448825881532190"],["4751102133312042569","9076206512214870728","8199563597597666919","16682599585765073681"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["6658516796145723195","15699467543133010033","7823417691998647940","936876557133117155"],["10900634403549653319","17472211883956424290","4188175692170973174","7304624045132576164"],["6995488689238021966","6831106044754490498","5468372332869150947","5316504875280882379"],["13248674416982583452","17951933612205546807","13429097839698326981","14441680806115474418"],["9928580717286896997","7416381148277893938","17667833941052519256","17872711759572908569"],["10386295349697838553","5126234982499603344","3897508268103952439","1405858442269680470"],["3166704115959880969","3966450801083741068","15257837942252623365","2667535775077460490"],["9768195684109140286","2628825541478772801","9186996250614951446","15590002217082258945"],["2904005391667623777","5476493486049709822","9145017417815705829","13638718656792991844"],["10280959959992711571","6987187246978120579","2850958736996786141","16670547223366650605"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["17573235576442174733","16244254281742536548","16395455717079000300","18133946361086280331"],["13473308379988253282","1161288053411532085","11216108811446208439","13567314139157267457"],["15503060199472544090","12676065401254062182","3583377567457010860","11624451535520305772"],["15969669123393050317","14328605010977979041","15027952911787585077","2413799108078481544"],["11321179280152218486","14163797582212599136","7287787284169706277","9323663103322105664"],["563542425146529963","816034621992559410","12424565199155249252","13048408710308000252"],["17615282907764963606","13207233634889607632","14877651399984905481","11681075406574838214"],["12437773393578291416","3359314211356070962","11183628867121306556","4161599600436812605"],["7706331951961227349","8114762984776069284","6924824567548986681","7818259811947616791"],["4751102133312042569","9076206512214870728","8199563597597666919","16682599585765073681"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["3299625784943337430","17981558483113552443","4868266935723819171","2044828202740411708"],["2463672644902213921","17727659193364201967","17021714775919926764","10530392346494042831"],["2376707458988788891","16010904230462185572","15890151115086705582","14942416886516500535"],["10290858139617499510","6605040409579249040","11133344541253640100","6893222859386615535"],["11751317247890962330","15110741085961967750","8926652567899707488","5304246222512205659"],["9713812040339122948","13246407819612438084","14222632760949698239","5397097706349383505"],["5617594130261867909","12158545607400636376","11642629574447426433","14938462194430543499"],["12437773393578291416","3359314211356070962","11183628867121306556","4161599600436812605"],["7706331951961227349","8114762984776069284","6924824567548986681","7818259811947616791"],["4751102133312042569","9076206512214870728","8199563597597666919","16682599585765073681"],["7171261238354953299","3199043663892088782","4188388937588474178","8355847024443120288"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["13869592356801192275","13562990058056237036","8532380645429919876","5673348366334870192"],["12631796756081138507","7468441148650018593","4406830814291150015","8687185449000569490"],["18221894962099214051","17688395750665683658","8293656088556994463","3594684490550887758"],["7667143891668006011","8557794289261417660","18111590711362475161","14778175862677324687"],["7962866860419969546","9414972687048521023","10619717814386071894","4746483935448059968"],["12190915680564662915","636436164682652576","12874530212525238436","15515361376549190073"],["2409804783207921893","2553127937691959654","18158849061599668899","8783382494568411976"],["1950000841171661109","7945083744004298790","11440822525025682129","17588851896156096590"],["10803587447532030412","14536853780171097165","217913321299250289","13007044524871042816"],["2265710789398660733","12856900927844631337","8414597425013370055","6379898085273522204"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["3908267600292784422","5912017529730644989","1010891470186801061","16856439795388969051"],["13551535550764463190","15142229435630004864","16256316178050972409","14065400601505589769"],["13158054227301865139","18154113064784556910","2877409399594128967","4420192299117606417"],["9792953372464982119","6683440059148278569","1551747299505180074","7883925270402393906"],["6303695806740802834","904439196758999123","4392907139730213111","7512768970893205134"],["4895319337252039161","12138693594434429238","16690925156772763190","16799493434544839997"],["5117547297792242352","15296424462840098862","13848999994419530416","2557742939252178900"],["7515918115378726738","15214257429962997827","13736965755278838845","16107716737666656964"],["585890144570812619","3731044775912405707","18321048579806919104","16076382575742729443"],["10280959959992711571","6987187246978120579","2850958736996786141","16670547223366650605"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["13838247911300143958","15760868888766167683","14235141811568307359","8750153109646486392"],["1583395141533808095","8693084397054137243","2570431394403467636","13502823959513829141"],["11588852700013729563","6885658555933123642","6872072151028596968","8364172691697799637"],["9453589117761070176","2422910080400239629","14647916163123097556","18372653167727644298"],["18431527303455713640","4199479747030540645","4671895615396407878","11579558252634883067"],["11997526460597899266","2584094724554976496","3254645320021807555","5199556473118693535"],["6989781760667296982","7415585679874637875","5340310616216514357","14188950549791811307"],["13351799094156567287","7538648782631705758","16094414976417283908","16451990646457896203"],["13419155323203036207","6906500701861707217","3920120839500688381","8675149252627902193"],["17222240632314183672","4413340497013020291","6539901519265704187","4315088131402532784"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["14641568800732693924","22066305502400746","15133803784125818186","10522711815909424356"],["13040625148454314631","581955491797678854","17996328862840415159","16948334432300805530"],["11189969274863177505","4742161921646716910","16415000425782726029","2914134906143363850"],["7332959879479850977","6602298929734417934","3594488353770685248","1793092737356299274"],["10870694610450159870","10744131186281379191","15894361789283714516","3824464745954428925"],["11958795692663173456","12747032094899906941","8049951990942634347","4136823064948218896"],["15154375506831384125","2129444599120763612","2012713748901764452","13394973549829532583"],["1950000841171661109","7945083744004298790","11440822525025682129","17588851896156096590"],["10803587447532030412","14536853780171097165","217913321299250289","13007044524871042816"],["2265710789398660733","12856900927844631337","8414597425013370055","6379898085273522204"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["14110229222444255529","6907107679852378403","11230305662664336739","11178472963425805762"],["5873419348567216378","16246112379714683465","11019904633281244399","10378321746018932318"],["7541214546039651240","9358001699874780995","1566418317290150196","10036046959330602003"],["10532769276873382537","15097532225914527112","6790885076858292469","6803612946495645594"],["6998308487958468393","3148895437576306902","4845528807209503508","17006349853735470202"],["4895319337252039161","12138693594434429238","16690925156772763190","16799493434544839997"],["5117547297792242352","15296424462840098862","13848999994419530416","2557742939252178900"],["7515918115378726738","15214257429962997827","13736965755278838845","16107716737666656964"],["585890144570812619","3731044775912405707","18321048579806919104","16076382575742729443"],["10280959959992711571","6987187246978120579","2850958736996786141","16670547223366650605"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["301147889203792294","1328743881502616171","15833326376329462398","7906344388079142945"],["3732512455855969795","77802008918294910","18248582545179601654","7668009187607215116"],["11535831046414914872","9927749427600033865","4007562924254430800","1893486344586457951"],["17373154700662472362","16048324581047901674","3374940463797142889","2561897430903637551"],["16192048575245025336","3289191154993270170","16431884547507130329","7896328427582607783"],["7595530581682724314","17882580585912035475","7628538207850548665","15162234406301316004"],["15588043911245362625","11458616601345911902","10594826082220766491","14677591707503486096"],["12021473783948993473","7098237670189995189","13225287830524189702","16707904618695030045"],["13419155323203036207","6906500701861707217","3920120839500688381","8675149252627902193"],["17222240632314183672","4413340497013020291","6539901519265704187","4315088131402532784"],["6852571204290828935","13555834281217569101","5561397494090075488","5813059804479180571"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]],[["12757142317397606002","4049080731480440575","483143675204152461","13423529996808130833"],["1143377697975006792","14087111245197523868","13554559180604755073","17527241820394101573"],["5862714107145421357","16822417145604360347","8529653811358271457","3566677579622915921"],["13684970607495686613","14425617149755689157","7666689654343965663","13585127604063959337"],["13053169580770920279","16030334702876077423","10074887294651125961","17603981058668820078"],["1125290890664433142","12315030563607886837","9735668151395134097","15435279935967613975"],["5117547297792242352","15296424462840098862","13848999994419530416","2557742939252178900"],["7515918115378726738","15214257429962997827","13736965755278838845","16107716737666656964"],["585890144570812619","3731044775912405707","18321048579806919104","16076382575742729443"],["10280959959992711571","6987187246978120579","2850958736996786141","16670547223366650605"],["8765752322219797954","8291758099373359959","11514813683743299157","14109735724532353584"],["3505421590893209874","9648346577233319332","11672365470336405888","651174896021473509"]],[["17380293968939861485","6612700396693749748","1968239026116629550","3379074704942436798"],["3217041603397531429","4756604971600038780","4509082589782664611","8228343898165376165"],["18430415054082140448","11314258250516633381","13107314853978896554","13497918007297130429"],["14167236481330203463","947674962142963804","3919062762081270036","1777961885226179956"],["4738394782825007306","7548387423723526949","2012545705471984140","1128877852114209918"],["13652584555272882881","11976826385774319559","3442544982892532846","15236701138511486281"],["15697893401174751348","5916182269145311377","3879932163740327682","2942135826651486820"],["13119589886480792766","6075450447484292347","9056975055326207395","9593977932008026058"],["3552773948731441551","8937823378572711923","9468660286783356166","280845210866206566"],["17838438300042997022","12778454215551578223","6665224392839607001","7894366696031093682"],["8906685377976631317","10581596787684950696","4707708390858761816","2737016069631924749"],["6540161641731656931","82233121492537564","9498553982637210077","7726873003594350441"]]],"s3_root":["3355630745720034997","8214143438975901243","5324712126198771509","12916510713599442514"],"s3_vals":[["8525384990076027127","9935196116005862537","14766435416729801275","17110788500606863122","11206064260857836885","14251030016039596731","583558445001347834","1317775385519497091","10050596171901816732","112826008271679212","15220538733196721753","9594065577640371841","8383951990055618121","4429472822443705379","14679963405394450633","9334962913684515625","7607285954256048555","15405791806713608376","16906593071817650792","13050636750217566108","17948356461528908878","5425918954152106118","5833651856412482962","2537078476287645460"],["17243627264470274253","16414251271909444045","8622951759212244673","6288812517245878978","15854391025551889935","9391857295576017558","6584126985660427148","2309387581014235669","6831650744057430319","4055319595554989719","17258301301655511853","10463293173450749602","25644805476565325","15772651425900240820","11208758964993260301","6308479804721695131","11531559150885802680","3087920544869977040","3781817078663349362","13671252802617190234","10345097006546234158","8726233631096695055","7547835968324388146","15319510430477754701"],["350793747322582306","8034095900842662372","9715707823745138838","5865750961001545670","15987540699023090093","10600572186332784834","13801484674676580244","10374609397619922567","10670933169475631528","8298045570712816026","16680276219115661816","18374547902165496706","5053663403515525387","11157013536645685798","8690811211653522353","5240817542857970711","18123760435433855645","14154608259150958492","14410523992106337171","6928414099471856252","13404474957896459827","7311614260951611750","13661586923188958894","657907846048712623"],["6015699909721962438","6897021330146422594","14590959686792689364","1951673011284879789","15364241252623580965","3547982886003906463","8237879435888689209","3731226542074162675","4076945732687224632","11175545304119008801","4105643915139063912","16963014831928607973","6019439746909253809","7461105644049903078","15303425545496964788","13406715326747737595","3527554868827835296","1826121130527194751","11394341436284558693","12681904219351688448","1386302105746480525","4312906566268312915","1813304978287848366","11693686258578010370"],["18063754059201292192","5411779860920385106","2998893502308553031","14795954369642468975","6876936694555418086","16145857371855613187","6682358224445151653","2153220193574752635","2375729658116124803","17174817107770333619","16255092870730503255","6666584396210092767","12483618750637377585","14218223825757731125","16575535301067399559","4934253168164874107","5582697314703632336","3550186170774948066","9384908612925314293","13401582126573182122","1909337995763142457","691436444280164585","6949030799883766926","11637118532259557944"],["13941937254771644770","14727876481025134670","273500399144365588","11549077864369560353","1285861512918491459","11438812281135458209","16204025560403697460","6776465910294302844","6235239132253967589","14806448645967426829","13649655690470652059","7386760972764568879","1578036601607481112","10223727013314599759","6968030964588992380","8454905943163278143","2713468512256647318","2298359999516253464","9831623650015975883","8635240476851052572","5165122762458424480","16348707368817400750","1791074762858631174","1871996863789584922"],["755542356353343489","8912107157023073232","13765859304351637590","5716055355102988312","14945008582884378704","11554088800581995014","16303228664300959646","10007806080148861526","851008291731308828","5737087977920937209","6256199154038717921","2254544032785102544","10973146191116719049","8489072818726266637","2253025818964079483","7153303364799046061","14103708923098586704","4396633776679033624","3354770787655398849","17224323059068301432","6953481782447233215","16795575737074579973","3293750703357688880","5081155971263844793"],["13511078574863561414","5934707614290682511","11187585099787537451","18019445317957443357","10129467461973170114","11160659335389830736","3273745601247545660","6376060478653169743","4348581159567921624","17349159407007286628","13259171338044417250","8976787646634429122","17167002781493927306","16634551239548916633","7997588049002032795","15621874132375047021","4936976642667537666","8040066614227323172","738515601192937615","12694737324676905705","16932704871625573926","14612876219418317023","13321485551169893473","12271467614928695566"],["11016376261770285197","3019831217727468455","9354810755682978568","13913729273025528867","11832109251343268823","10385691125414931564","16919304310361608679","10720769188927198275","12729774539207300666","3804324579542701950","13562617809721381090","14692732228988302968","3560627718563024687","16454996036741679773","6039272829518411341","1437799197188176212","17000301521289998103","3986157811084702412","18311831788704691975","3117043323800874653","17974901354390590756","494390727009220318","16935300164649230259","17788966570284465131"],["9964745123849153454","2652226929287731923","5308507062469658449","3252023413455048549","9498965333838160269","4518441169688055783","1193436147344808663","6130926102983508111","10307133825725176366","18217363256731487011","17987726135988029036","2075863956261036842","2207128864685086822","11668338383723265371","3884907893300284928","15825961885901526785","3560713060763543514","14944845922826550616","5175329799063878146","270384460538846226","6819969683398411805","14171759859311812101","2045438531112989617","3751557947309861756"],["18063754059201292192","5411779860920385106","2998893502308553031","14795954369642468975","6876936694555418086","16145857371855613187","6682358224445151653","2153220193574752635","2375729658116124803","17174817107770333619","16255092870730503255","6666584396210092767","12483618750637377585","14218223825757731125","16575535301067399559","4934253168164874107","5582697314703632336","3550186170774948066","9384908612925314293","13401582126573182122","1909337995763142457","691436444280164585","6949030799883766926","11637118532259557944"],["2223013917958243033","17161149980699742870","12683519357693477966","4313662975831675812","7266448382686701131","13377588600108565013","1156399845676451604","231936117971210590","13353183178325405481","10390658857589345191","17095746790700025255","1667543080682910359","14851755226658207843","14186221444715783924","13105884336923571083","2643266136906980630","11828428711674188168","18203993519530339059","14091495152477895792","702179517076629470","7838200462445948729","12978641377282144402","6753215181061278840","6179673718996771442"],["18148154485416749424","15240965147157692039","11929356163158809066","7433188015660925386","18386464482233657266","17050183215117778889","4963114552190321849","15799474062675382564","11299316077541082582","18002364823687112565","13613385073438488193","10249163177524369824","12380290393986704569","8635607639807537145","13290532002185229064","4681518876100932273","4805742698864393959","16829410317374562601","10447484412355947308","1145435092415623683","17725270868549905346","12745544573247325863","18357528254268600136","10549649622571554533"],["16585197824872378644","9904129417051801677","499244191415919844","16367480274240342715","787437741369403667","4580320260192623010","6227201379133882829","7461909475290271306","18027091761199830758","17014401496555450606","1556559802224155334","10169284524013584983","10134428097834264869","10956501049728800437","8203054848768266108","7965463240679216260","2379666542918824283","12199158358460229903","11749693515076177814","4029224554760271606","8418365998540329636","5994619692020261084","15420215604215404414","243655185923931766"],["15992745939171153281","680634397398188529","16174456115458988990","664369303109756292","13764815170345826723","11472692387628054379","16097086644133049007","15273155716716286931","6186525854279474592","779802288513228893","11658764316099704175","12128225446840858958","1632930215026147235","7467986097806432119","15266864382561038561","1021460749889222100","3694171893024973279","8943733363431501196","8880584397244239212","1465702260870459975","8250039598688416050","426502995866287613","8974399881983292977","8903612203285343924"],["6024781843173211828","7417598351476102978","7948548984619215952","9094833090288935978","14492446811516595968","4961426170635670587","16195758234645308142","14338360424901147658","994315554400764470","1346164255488899859","1805756875875379297","16160124463412362832","367791649857075929","7939126045121399888","18120528756869369071","13274051418325846662","5534914896821900432","5326614093324432446","14625563867600501430","4571552140579088769","1450531801315899541","16641851274400398260","6441816705239191868","6198624495959689816"],["11354778476905402557","6596250748032030540","1275934061207850936","5967263577760262382","13001715295108780418","671385339288190368","13781266863712932026","1007604138291197269","3293173078757805360","17330266953161127297","2116904355616338124","6681311917244979399","12813697708417370023","17784180960074271633","1124368302844609584","4158686955599283216","12275672084816902243","11739056212929072923","186364766115564733","5491680553782327061","11185110642730760792","11870653261391763174","12587796015393746813","15165337479173997815"],["17866457023231813353","8775950332607509351","11444358055159870878","16384484323098188291","14138050009500246925","15504725435334807351","16396674251393222459","6369787479556579607","14075981585588264020","2992367361186198417","10624004320071677481","5568001500833007619","11411137131117210420","16131674673500879535","5657884040327775040","12952098887817589781","15154241832033675655","10939827867827651804","12310571597937166891","4191707533110043791","11156574953938288272","8732162574113517234","17443592024942603850","9862146200477721955"],["18148154485416749424","15240965147157692039","11929356163158809066","7433188015660925386","18386464482233657266","17050183215117778889","4963114552190321849","15799474062675382564","11299316077541082582","18002364823687112565","13613385073438488193","10249163177524369824","12380290393986704569","8635607639807537145","13290532002185229064","4681518876100932273","4805742698864393959","16829410317374562601","10447484412355947308","1145435092415623683","17725270868549905346","12745544573247325863","18357528254268600136","10549649622571554533"],["9212666891428427161","11586641534836892071","2367719249860052349","2933351673070870209","2499618987842542339","2774268950769651340","8467349821089791677","6876467098695235919","18367523786660985211","12577876795879879249","2394790168056125473","14419009384211121769","13977190895330875973","17567435495440282589","12412119578394112773","2665784052757585855","517178690391120278","9259600401038500470","10633297873052690933","15038987921572310595","15774022914485189467","5471147142863729937","9453285466705956564","7023943307101271632"],["6323601436538468096","8415519568262021543","18126434416711357052","3149855405976484597","2358629949364423074","7621027509766287585","12373666481733959624","2841619108756937301","14538052701494035436","7738498247566241003","1983984272625416506","15214301038818064970","18363164166960101105","10916627646540498444","13689678788552418468","6603671419824126510","10506742951362973764","7350458713237321607","2851080591094148041","15574114422195254799","16685116638439021556","14918032859517067881","15600534235674448766","708184579425531239"],["8179214069982839765","4120720031180299355","341414308327530401","8867329344134247874","4211277792685474805","8227185524726599270","12608740139924352109","727330754187191820","7741989812145373576","1520292557512079303","4545883974198924350","3130081670368809418","14511320525300280728","14505116232429925580","5039461126206013370","4658903778959484695","4431160500721278359","13613945395604226223","15441161288597882694","12561548863628095349","5571632928853817996","16159702247485428337","11453597122305164601","3229937658702019583"],["13174069482607321278","10402280919410404719","12589559440416278490","9901046270050625463","13157319362103105266","5244171318340014684","10190627754492382552","269536872851756278","17162947261489662365","14948889511679913013","11119405848372798636","14490383545267946547","17626692637507728946","16440186524947791545","8737523917695928343","5534947460913507758","3513668900995831692","17433888925817905141","13540638556898849762","4237898091352404739","15712300889809382646","5642730849344047791","7712370135654210905","10947982189322487146"],["11013406334102198057","11851107344862241368","13972425753510313150","2332784306738497986","127468341945499039","15986001872844724687","1220476813483938245","1543458425904686442","9858684036445482703","7489450537196966803","16082121625443397794","5135615053826895330","12653409261059979811","15802506039579093020","3761340352350947401","4603448887042807349","13041860230643072651","15947443736156272323","8089573013022330931","13784003293664657188","17531070220526014999","15973880454701784445","7439572078190836033","12601575772721977061"],["10173796136882184718","3628541606037826819","7020349117718648739","6171666546369036295","3956195708688047257","13438374154476824715","8347214464872937656","6663726978962415914","1616565831240703020","493555749566051014","4207730437736615157","11123349649482812774","3288957946709412476","11094420471567809841","8596772107438639636","658700448407758476","18163941470547887474","14053270292729932985","12546113505472592070","12763853480128677574","6493500653468504046","10154157458354757705","10035362737747579727","14322383235449099841"],["9731298955257582725","13224071540710583673","2543231950702308994","17965692566336570034","16870281268662178535","6203102295969751911","8613381016279812852","185573936439560704","2262642852049065580","3279509929087513001","13788169689191302847","10683362620003474021","15164631124984953673","9702757027338750459","7790745305161795515","10756129890715857533","1484312180043478876","4053247130503782521","15661664708671187939","1062498500371968259","2842032195430980509","4609599674607470522","15809580595520545582","10724955664469581356"],["15667471023628051631","12751571085219182983","3567371697127236296","3222466699189587687","1878820594348533032","7157765737944372703","1749239464009794143","8029638877608191665","5535397220010110250","11431690572233193401","565439889841952265","2536287288020465577","544935558925212451","17904690274844847343","14594882216689618072","14915326382760647270","1360092690816985084","5099869189247153667","16745789621975398174","3310227261934430665","13205401304096158851","11463672804804615104","16550144823501142127","13473076448761104542"],["9392912084043488802","12586646831978477892","17214441207310236826","7505280151203630647","8754970874841066586","13464565659260728834","7829116897042745175","9841339151495724574","944747602987204866","17858405125254879014","6324871257315780650","14342306369256420422","1919924332452225205","5410046111316349254","9890066682971420656","7183197081331585885","15469443944192479762","13856174658750339855","290336066908772295","1907031814975303439","12910072045459718917","14151829109431781753","12335090325354016761","12461596268738702048"],["9978510756972916794","1450158403167883183","363837928217375566","10940673681172336214","11446683725951018695","5814722654763213706","9964225953869823686","8298535906343291057","14623484305220732676","6843050473229733930","13364045344108394661","17627003492131934307","17368575443679738200","16422502038958034731","7015426561934343115","16815370889319339373","3692478350107061232","14764652280656170987","13035549558408866022","14784984001819538297","10505680542185722347","12540363427381749819","10358572370733109566","13530743483288447042"],["17730307875085674200","7000344347181994757","12186338427215164490","668099025473120598","13246286500010550268","16276675145520293577","17275928341301693537","7505958143997164914","2548757991827179034","36146841467002776","600351588968101102","15897317709785541788","7145460030630359724","6259874700717517847","14378456721263344476","2373953719872179770","4850561562825899108","2248222819213742271","3691011314260991208","6751606330361928253","9353694942881517528","15188737328524340125","2884509690966842715","4985683948260181167"],["15895514155182722856","9654587414937218411","2635275717665821531","1652692927256530059","14528265598027613917","14999122030888183057","11764554230197986945","8772361283781492127","4504195563960501198","11800145698211966376","16199454012479132470","15936718220500099193","17455909769521240417","10640936971754365155","5264612173212547853","15466141962203218600","15264076629566402567","13274294318594353349","7188136536791297193","8931241202032328773","17142191617287266299","5863047655548135623","1467946575422406611","14215305702776682195"],["2056999963127098198","17188164046388296437","5865911590534477563","15676252799204451319","11045355807968602145","2023383671509427040","3246946015592730746","4136968073761035586","3631000417215705484","12674715374960041973","10900961732317402226","7380148279516873247","8220250517129530032","8765253458897047966","17515828028475465720","6010892493072992893","5575174957890183912","2193322409094951867","3553159236717774623","10648895027536627434","10000152300361738744","8043964016520178239","3486503308599202287","6822823431955090548"],["6406456830043103703","911951732047491177","4070808584919893147","17877001703470812411","1540842138973871027","9654811946835201341","7571049408038833862","14523776099330023184","13592342317709505408","6126557595616589724","12814716289687206876","637165900766838698","16468830172680722366","6839121416834373446","2744086763572577783","11775730833650377851","8529743676790198978","626251878314202701","16082758078102027364","7655337978170426720","7039865052011535705","15435456243852631982","7865229609275949940","14087174913205404357"],["5112258512180456613","6256187575319735891","3406023234368525406","1972145404870155066","5530695203753861014","4810527875240379956","5024396178719366702","9565069939537495962","1337233255822697156","11114413831075945852","16838297335581636780","12512594075976988883","17110881032112701537","8975415054200350525","9499809936933850442","8489629614097788753","4500410170460455672","12178850750846890980","1429148375445215340","13135224391300685927","14301847840802202177","13730620529803525165","1864422761883536084","8779030114482904461"],["3441381401670329988","17615274607089664657","16646132746641705359","18118742437899037015","11041390928168505785","1418581614020704437","8045283299841832954","2518450264126588072","2483947781590964509","15489882893684329110","7511956584393495874","14374343091785871233","7850854807392129165","9529820454705005178","10297799272877532162","13406326877993077475","10707310184223722481","18148019685436616327","16828449949713304403","6492094386647959583","4445596730648302626","986983645381174485","11402145408953830221","11268030191481248142"],["8127234753891839124","16466900999676911272","11190355933470997788","13209314236911969543","6072924092337316596","11064279013375384497","11027164577749028408","14690448502092973620","4331130410141921983","7656979432127986106","7749058101610948944","4234040349929507147","1497552015530247384","10894223995220014975","13007809761624990996","9970826611226279087","2613150743700182124","13829457018806867545","4707549911401634025","17771563980814425043","4911171952676594257","7711074012000268659","15224008666793860814","2561452443248131461"],["6015699909721962438","6897021330146422594","14590959686792689364","1951673011284879789","15364241252623580965","3547982886003906463","8237879435888689209","3731226542074162675","4076945732687224632","11175545304119008801","4105643915139063912","16963014831928607973","6019439746909253809","7461105644049903078","15303425545496964788","13406715326747737595","3527554868827835296","1826121130527194751","11394341436284558693","12681904219351688448","1386302105746480525","4312906566268312915","1813304978287848366","11693686258578010370"],["7020743634211581034","8511375125946950834","1355694269100404745","17124763161363673868","11479055865485465232","10049747614894874250","5844565324214411213","15878927999066440594","8787808871654386822","9085180971818173263","4137212381161552576","4463108099689130315","12115214628792153899","13256532257813257939","13718116115185486943","15102203186894556781","12164630285591507940","8774842206804830531","14863298134654858532","12372901067736954139","8029464802336024965","6668314775034125475","2574530800975994685","18249028393053694690"],["2580202928704172308","8915435848878843521","3074211912538024886","10264104038831696830","4098880222585191715","11150585191894896508","442469254687370120","10491023656715882575","1984669169203639293","12750434720762999819","7889404682149861538","667190673222215059","1611198259474335098","9490378306037822506","16825825899313632514","10030772547808840773","13860528089679951959","446736090897717360","13471684539521047588","16176775074184205380","3976393771322649576","17189777048007636896","11491831868406172458","7336612031576690903"],["11354778476905402557","6596250748032030540","1275934061207850936","5967263577760262382","13001715295108780418","671385339288190368","13781266863712932026","1007604138291197269","3293173078757805360","17330266953161127297","2116904355616338124","6681311917244979399","12813697708417370023","17784180960074271633","1124368302844609584","4158686955599283216","12275672084816902243","11739056212929072923","186364766115564733","5491680553782327061","11185110642730760792","11870653261391763174","12587796015393746813","15165337479173997815"],["14113197914880880416","2460867765916099705","11753313065078395377","1200177292815168887","10201024248037000509","5212603386820652308","12281257479073229583","3587782282211970907","10288133503564618137","8851635357023063440","11086774579967602775","41576583541505594","2031691935588541002","11870051074969833857","3895907603625173801","2720696854898892447","368696806584040939","11730840394661638081","1574227764436104280","6679959571779813284","16892966151049663024","10827523445224814890","8109307216708150365","17349186557299316200"],["17730307875085674200","7000344347181994757","12186338427215164490","668099025473120598","13246286500010550268","16276675145520293577","17275928341301693537","7505958143997164914","2548757991827179034","36146841467002776","600351588968101102","15897317709785541788","7145460030630359724","6259874700717517847","14378456721263344476","2373953719872179770","4850561562825899108","2248222819213742271","3691011314260991208","6751606330361928253","9353694942881517528","15188737328524340125","2884509690966842715","4985683948260181167"],["13002080969217386799","16006223504215158096","10615985785402054870","12516013772524699300","18314292907174044245","1996551481867553561","8604955881007194642","17575178233930955876","5300419247721369462","13843498679563110903","15409257633715997406","337177599554693424","5089929541464295684","14527688971327020572","2629055779774944311","1134915389601027664","7552681984544238680","10050754484968177350","9178417551355594296","9315529035411749297","17573687351336978713","16003489809527198547","16110196957041509668","17715517964152255722"]],"s3_siblings":[[["6167365977648667013","14135438020276198519","18313448694757984636","13836523148565679017"],["6376398787884052532","5900885338688765518","18180747056281931933","1325619189252654783"],["6557679270612711496","10500097973349650863","4324392497728049571","1360263000227138084"],["17860690319788302688","2541241000620420303","12226565500601334085","112505411606310631"],["2929015591324091326","6510107472799233239","9745440160806497459","6748166469038244512"],["8338221563244454481","8222668179331468492","7508349142490990949","10677808134802814355"],["6321708593024961186","16785697823964703724","5429431442945509898","7788282869377763567"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["6858319139339435115","11063509374886527982","11884428663915733373","4503687043856806920"],["13525480362980390910","2925138811858227625","12050796322400640784","8736686599346441449"],["14075433482672823879","6114533939734147584","1394140752103239197","540169833565237001"],["14186397855230729258","18298661672076243888","12250048107099984142","15405397061165450030"],["13943631684312227007","6467195029907343473","12016088457804450566","18351256409273101746"],["15572822448956117102","17072592796682787975","17355963814799389332","16877417834197761253"],["17223600605732542238","3640342207096535861","17240029803654911197","14835642525774251052"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["867562731751203963","4352847697640679338","11175725726847330244","15626228907247578267"],["3047773164360118011","4503831073121949520","13383662081753871865","2497262494365584912"],["11945424761847772342","6575282879484670108","16623340631338751447","3253314912957366600"],["5561578506476997531","12871413163056962502","704563797973387087","4953668338188867977"],["2416119298824922335","2661650006136837745","1703345042748242435","12950358512033754785"],["7190071520355329725","7216681821073045812","578116795317171200","840824952666920172"],["6321708593024961186","16785697823964703724","5429431442945509898","7788282869377763567"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["624991164132383735","7805645045925752159","16450394876513765505","13814400107968350176"],["8077581782687569779","1176469924084543672","3140006068231877815","13270116754357127503"],["9419730784521192394","12075313111039752690","4046126463378447547","8219220489184827424"],["11421685856689081190","15541312402300035639","15226095624781235149","6079782473935731774"],["5179957729649507593","2453424338900384874","4830508152543594444","1820096142654565412"],["9249212666735129222","2454643752411302385","6146811306949783261","1440024818909683730"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["17827732615058710862","3066223439279085034","4882954938050706241","1561611004651310323"],["15929236477018387328","6881422370840830758","5341696043071013433","17135763192973649116"],["12062276303366027034","2683514755744928497","1861516482436632234","14435652110081273304"],["7335924120161957413","2657307174616343506","9534068712183568386","4846380284278880808"],["10816880380213728862","11091276291097941075","7927380261022403065","5793667957734914382"],["4511157045404822173","4017592232503034984","13029592400379207815","4341193107425427646"],["15234223009143050911","12411230124592704819","13641194701327274212","13679211474338750294"],["15149827716094067657","1605467617063865730","11680004012410276942","9661883947885607610"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["100114910979683068","12431666649551696277","7370397125095695454","17693444350820376006"],["6717567676719709615","9650033539981959024","9619702584738290052","7941927936429617785"],["17271175114246258864","6179742205102369880","8301262255880801832","9738660570813670685"],["2013312832047214226","6784841140759267638","3295852120540214658","6250551490172079027"],["2208274644637447833","4433706594741570633","12749576630651947538","5175886613466893167"],["12026056435371063098","12433348622713199243","5229369908558982974","7239880318503100525"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["16477073382790815114","16554662307411473509","777246364597779908","13650553544373773356"],["10494875252879464475","1577667149001875006","15076920934169204242","15176975417330605439"],["13728046436879107296","10653218350040706006","9165249818047058445","5682474816073148581"],["5406657698789980349","17954590042999725103","1810344375805738376","16298831765887372592"],["1073508378881161214","8728495986248371123","719678955181944717","7907732358622266688"],["17145294983281807650","16686620969310588820","18426338075430687644","14236751298991758607"],["2686590450879457694","9746387469826392866","7776509026635156390","7182789080338222996"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["11170718980646251400","16884387780136657432","12946143414441042830","13247353246868282304"],["3575236736216227716","3075338315336133561","17537865457862657705","16862820514770009294"],["5725249593217789928","4705867079658613976","15231134071956223943","64941998065624424"],["1567898007696101951","16908215944177016730","5840574799692432065","8290199195145000213"],["14233187741554549905","521306097847343761","14470687906423227457","9450486047493717954"],["6167523451248415387","14371649627493386041","6566146494460534662","13975892330125409613"],["12702872575297829273","12194088120827497780","6472904596993214147","10302497630746011392"],["15010140449325267006","431680755683588990","11429954640078369779","7071238037657815805"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["2980508372973017115","5310595190625122673","9876324124185717944","14226502230194554122"],["3365047900707466812","8917347301800603399","1117197230277331363","14987171781067764087"],["9252362847583368022","2027862849696671080","8333508729737741539","5075678248076269735"],["13912639222729039823","11779169782844405537","5380985947251852343","16924647482025445104"],["8318442849846369603","7161996713111527674","10885996905314180612","6569867422254823250"],["9249212666735129222","2454643752411302385","6146811306949783261","1440024818909683730"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["15875528647172388343","17934484563263196504","15638394651225104590","298535048474896807"],["4360542658461381132","14157701206043797687","17508491308162339621","11284986088163283207"],["9419439780636431418","6440985370311237825","17529313663818735739","1818602831364158846"],["7600131890669703891","1897708497719755349","15209068607737143011","8909634152213629518"],["10319826559236665296","7161779933663375510","15225049657775341858","12185068647266240212"],["8338221563244454481","8222668179331468492","7508349142490990949","10677808134802814355"],["6321708593024961186","16785697823964703724","5429431442945509898","7788282869377763567"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["17827732615058710862","3066223439279085034","4882954938050706241","1561611004651310323"],["15929236477018387328","6881422370840830758","5341696043071013433","17135763192973649116"],["12062276303366027034","2683514755744928497","1861516482436632234","14435652110081273304"],["7335924120161957413","2657307174616343506","9534068712183568386","4846380284278880808"],["10816880380213728862","11091276291097941075","7927380261022403065","5793667957734914382"],["4511157045404822173","4017592232503034984","13029592400379207815","4341193107425427646"],["15234223009143050911","12411230124592704819","13641194701327274212","13679211474338750294"],["15149827716094067657","1605467617063865730","11680004012410276942","9661883947885607610"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["11168664574371325857","14168096515335129813","5712169936185174146","18187050073322074843"],["15102851860810982606","3926308392907833705","9081989344918353285","10118770907603694099"],["9724791995196940813","12717684563212876180","4119626973511656986","3550199055151302130"],["13476288430807152189","2983081600573640481","2824157411813745658","14682952682473220722"],["14277698486812611636","7960820973155854553","10637368234430576651","2210138642566848377"],["14502487935848404137","1030504790223452901","1247594049209923220","16648148136378193347"],["9278042485893595103","14052694131353974248","10153105788618880479","1927999272698742603"],["15010140449325267006","431680755683588990","11429954640078369779","7071238037657815805"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["17256543928297016519","16578635449463266177","13345796974545464711","14747083886079998803"],["2314391786283711066","6107853706243421188","11135216157747685410","9407404463208437238"],["6449764060822662730","12242923938849635600","5198325124269929634","14128963282614671493"],["5334549327329789643","16399873623171410007","6473294912738444016","167210560147262797"],["2208274644637447833","4433706594741570633","12749576630651947538","5175886613466893167"],["12026056435371063098","12433348622713199243","5229369908558982974","7239880318503100525"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["4329771029825968610","5069320518333280818","5752733068206412868","11340531288603831141"],["761784106771476969","16969248327793528642","16013720925234214416","2609798670544311840"],["15647475887469973984","13598328302382728641","11708103228449995372","3065989740565676313"],["16334422986018550845","1812799675892425256","5892325206341414841","8985663070587011196"],["10162713924785280889","11880716495966630715","8041977008055085943","16517933593252641644"],["17145294983281807650","16686620969310588820","18426338075430687644","14236751298991758607"],["2686590450879457694","9746387469826392866","7776509026635156390","7182789080338222996"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["9008073031336458832","1812786802016916713","5668725772443868936","15449223584271926205"],["13936051288747727730","13725534034100048940","14243131845230036372","5045084991875000490"],["14786763417088581715","1327100439825106058","17921310136909995264","3883056552276526788"],["3874218144616345763","6507409652857962880","16568631041267793258","5009980046396464765"],["7168685738199802674","11595207058689003374","6691270431491486566","252871935701601892"],["7190071520355329725","7216681821073045812","578116795317171200","840824952666920172"],["6321708593024961186","16785697823964703724","5429431442945509898","7788282869377763567"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["15468321868531472754","4197719688117206536","1923872529956921538","559762293093475567"],["7134084035293001049","11189579083078608727","8855444373903928763","15924180850024090446"],["18195439356619008968","16761584747432797844","7208380528821637561","123179507070785087"],["15897076952987175202","1329122383945556631","16099432778968958934","8745670434998781631"],["16102390188603839102","12124324299242646882","16973289556199819262","16386900418222548652"],["10270108430395969103","6566383121252332463","16809542265292111640","1949623420750890211"],["17223600605732542238","3640342207096535861","17240029803654911197","14835642525774251052"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["5142286526886601235","528280064989304402","7585110403687408862","6082824889582862200"],["18114540001730866226","6545853384249100012","15466006095819698589","14141600506985295336"],["11645935261671401754","4849786581528849789","6228559779629826169","362354772199550382"],["13665653816322258658","1638647030955336046","14079002257316130045","16240192374288618029"],["8318442849846369603","7161996713111527674","10885996905314180612","6569867422254823250"],["9249212666735129222","2454643752411302385","6146811306949783261","1440024818909683730"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["11250732302917628653","3534651796065534820","2508140284078499835","8990880136662008164"],["2583531031983099531","9181651238590576923","6772395985388563308","1050820528487893634"],["1074845645912841279","5023314531632809683","5468575450828357848","457712884687623905"],["15394394128329366571","3083297132283735546","15718070394473148750","16266561070135619940"],["6750518213456545843","12878966034121443110","15200340833196782358","9333193854306575065"],["17025598794121800137","5512274990012234392","5554884404572950092","3328945296118555098"],["12702872575297829273","12194088120827497780","6472904596993214147","10302497630746011392"],["15010140449325267006","431680755683588990","11429954640078369779","7071238037657815805"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["17256543928297016519","16578635449463266177","13345796974545464711","14747083886079998803"],["2314391786283711066","6107853706243421188","11135216157747685410","9407404463208437238"],["6449764060822662730","12242923938849635600","5198325124269929634","14128963282614671493"],["5334549327329789643","16399873623171410007","6473294912738444016","167210560147262797"],["2208274644637447833","4433706594741570633","12749576630651947538","5175886613466893167"],["12026056435371063098","12433348622713199243","5229369908558982974","7239880318503100525"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["12004809519040504778","17837347775168588036","17725664404509161642","3564460017376825425"],["10946183178523528609","16983083471322773811","5349161810135450729","7717086821505216247"],["7559969361228744182","3360807721591992849","1875518391252765611","2000173127800776081"],["10008984785393610946","3783119333140441357","16949339130103147831","6268902863338296495"],["2731419773192746732","18014678846957693104","5692871777347215078","1409929078514420814"],["5245334762383665022","5850071544985358649","12576575155122292964","6845219173953234728"],["2686590450879457694","9746387469826392866","7776509026635156390","7182789080338222996"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["4631327902513289270","14721531657941060543","16155280445036745286","1394355430547857215"],["13921369643206075234","9179496173109539473","15896734651354727567","12548194858670866002"],["7559969361228744182","3360807721591992849","1875518391252765611","2000173127800776081"],["10008984785393610946","3783119333140441357","16949339130103147831","6268902863338296495"],["2731419773192746732","18014678846957693104","5692871777347215078","1409929078514420814"],["5245334762383665022","5850071544985358649","12576575155122292964","6845219173953234728"],["2686590450879457694","9746387469826392866","7776509026635156390","7182789080338222996"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["11264688466593119350","9199129099074860272","1422868195095659722","604119681010254649"],["7388755617308911119","5035654645865205946","6299705007503961040","16430523909517147856"],["7224092802037275653","14835852109157689629","15531491110356404655","17422601915438512671"],["16449359444683478728","8507289749542632681","3864714939440828761","11073073692721018755"],["12566763384649006572","9257652099277784387","4670920198496173121","4725871552730667916"],["5245334762383665022","5850071544985358649","12576575155122292964","6845219173953234728"],["2686590450879457694","9746387469826392866","7776509026635156390","7182789080338222996"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["8984061127824421799","18142489798336530859","9044743726180506089","10909192615808688552"],["2568765647848896533","11026926838313647163","8207255135489343215","794614087154643066"],["3779404410061065189","10415994888875203232","17128112981094984595","11511016966653067209"],["13486873878327561928","17378056602414738180","7111296786118854227","10806633209192018295"],["11538186850163219175","7014276111491186165","5322418895491661424","396741506244533142"],["12544431679597829874","18062031173701773681","574626163762363619","4476202876674944730"],["9278042485893595103","14052694131353974248","10153105788618880479","1927999272698742603"],["15010140449325267006","431680755683588990","11429954640078369779","7071238037657815805"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["139542822169007487","164801988548836717","10429810678102537151","7984287504429759007"],["9486068061905955795","6006231527798428673","4510704063180533348","428091836944275532"],["5900065405121641861","13997624842638098787","14383203667841698648","13488887291970893753"],["4702981366788192361","7313734415615191030","11059836998704245536","18169631456548395933"],["10678165895611525828","6770344320627432274","1764622166232359657","7240588240769816890"],["3166973762832899892","11002619076733862972","1532938869117933366","5565232236021368374"],["15234223009143050911","12411230124592704819","13641194701327274212","13679211474338750294"],["15149827716094067657","1605467617063865730","11680004012410276942","9661883947885607610"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["18351258858538436191","9670014675338162534","5889743020881005873","14021752081926315710"],["13053660850024194498","17606474063257789607","4700050168657054794","2965685173486958406"],["4003242333237819366","9618190634689488149","16136227638734642590","11901340136290921277"],["12333999762595418098","5520777941292793674","9326787403609408408","9866674587331439848"],["10763021183290408778","13980741586898835190","8290211802243299280","12958073300628603234"],["14502487935848404137","1030504790223452901","1247594049209923220","16648148136378193347"],["9278042485893595103","14052694131353974248","10153105788618880479","1927999272698742603"],["15010140449325267006","431680755683588990","11429954640078369779","7071238037657815805"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["8703045341590062060","10392773306636883644","10588523235132084742","3122438754195397625"],["12128036357136422907","6535151113341686450","14940295977358399546","17028610847388389535"],["2358458307293291181","2813954008083021815","2907916788344603014","17019385537156845914"],["13512289263524756762","13227037717887859784","15939109965495732709","6452233373482153938"],["6750518213456545843","12878966034121443110","15200340833196782358","9333193854306575065"],["17025598794121800137","5512274990012234392","5554884404572950092","3328945296118555098"],["12702872575297829273","12194088120827497780","6472904596993214147","10302497630746011392"],["15010140449325267006","431680755683588990","11429954640078369779","7071238037657815805"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["800314738212488781","14308371125360718165","11620479520105126168","7310836524731597108"],["17572408158175472640","17637317829142126381","9698626302461024198","15532612192963953646"],["11818067691157548278","11522624523968739565","7102922945971651692","14920919191721323481"],["14186397855230729258","18298661672076243888","12250048107099984142","15405397061165450030"],["13943631684312227007","6467195029907343473","12016088457804450566","18351256409273101746"],["15572822448956117102","17072592796682787975","17355963814799389332","16877417834197761253"],["17223600605732542238","3640342207096535861","17240029803654911197","14835642525774251052"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["8596655044333045852","867305250939156744","14143908233079881926","1823424401630973288"],["17063288002550358116","9778269668126972981","8563181592188336159","7610537841072354630"],["10086755781416194669","17212399378232602490","15187470402182071936","5528310099244283909"],["7825396664899441749","327726487617253076","12464397500976447920","6434691674302908788"],["9826547499111577020","8756184535083561169","10195058293909902932","4804155053370036340"],["16802047957676991102","13523660616730925140","2101215188248818778","8258686258115937477"],["10928115732834570534","17178483213474583626","12575322908207782640","12621693355355322478"],["15149827716094067657","1605467617063865730","11680004012410276942","9661883947885607610"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["10953965340896198246","6227558625227606088","5160135510678029179","8935234473633888728"],["3362399390386821971","7560444973347072882","561149194733385824","5001014352091212220"],["120517262427722722","8516288905750514393","4101821685007174898","11605985895813352176"],["13289961847301545718","10822201649221827453","11435813984660979580","16928873386964367948"],["10877637494306330948","5561150420996674310","9240065928986443840","10527154581407130079"],["17025598794121800137","5512274990012234392","5554884404572950092","3328945296118555098"],["12702872575297829273","12194088120827497780","6472904596993214147","10302497630746011392"],["15010140449325267006","431680755683588990","11429954640078369779","7071238037657815805"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["14389827351558698328","10797063835515266163","4414039004136572876","10248710936339321827"],["10767745654503764069","5648690965078273094","389658252052318992","7057240004822083049"],["10738832830161227581","992888670764153264","2613005942327504249","3249052154177606795"],["5334549327329789643","16399873623171410007","6473294912738444016","167210560147262797"],["2208274644637447833","4433706594741570633","12749576630651947538","5175886613466893167"],["12026056435371063098","12433348622713199243","5229369908558982974","7239880318503100525"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["11716136477385210990","3886538524648399005","15114681760604780698","15853395989505580619"],["7351623043972631102","6853197282382258968","6627067923099346985","12327443110193155234"],["16993512568242693094","12325722312765534066","7648381799576592755","7770296982368461363"],["11441636702873769390","6459829584897425715","5633521338514902538","957282752219446884"],["6755363040404562197","9235498177189456290","12611897780983057423","13126486956092333588"],["14847452920249935095","1825947248449560819","8844505114681655780","2630098594046563780"],["10928115732834570534","17178483213474583626","12575322908207782640","12621693355355322478"],["15149827716094067657","1605467617063865730","11680004012410276942","9661883947885607610"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["17438518016157619155","359555005440943192","9922224577592198891","6739471443658746796"],["10494875252879464475","1577667149001875006","15076920934169204242","15176975417330605439"],["13728046436879107296","10653218350040706006","9165249818047058445","5682474816073148581"],["5406657698789980349","17954590042999725103","1810344375805738376","16298831765887372592"],["1073508378881161214","8728495986248371123","719678955181944717","7907732358622266688"],["17145294983281807650","16686620969310588820","18426338075430687644","14236751298991758607"],["2686590450879457694","9746387469826392866","7776509026635156390","7182789080338222996"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["9841292495337777397","105841167560986718","8290816823543480778","1525563543665170588"],["13977744589087758570","4648648162583647896","745285781246992345","9055562776013949965"],["12944226454772183164","3681113112814589573","12815273342558898160","4162754509408695409"],["3754816498745812066","14134150561917324121","2029391120471664118","10089422504537497347"],["2731419773192746732","18014678846957693104","5692871777347215078","1409929078514420814"],["5245334762383665022","5850071544985358649","12576575155122292964","6845219173953234728"],["2686590450879457694","9746387469826392866","7776509026635156390","7182789080338222996"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["2659077543737509096","10221501331270817262","18403809691194675939","8282400468043841385"],["8957836209173480098","15866921782014868160","3992186196450134221","270164716187286363"],["11645935261671401754","4849786581528849789","6228559779629826169","362354772199550382"],["13665653816322258658","1638647030955336046","14079002257316130045","16240192374288618029"],["8318442849846369603","7161996713111527674","10885996905314180612","6569867422254823250"],["9249212666735129222","2454643752411302385","6146811306949783261","1440024818909683730"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["9538861888735928463","11223640966843531590","12009850577381965183","3160077636842542206"],["18254901974568109226","4960953386725589065","4388640482343165882","8923574669951220524"],["18300742112958555088","2492634145804480512","3324449850187304679","5655348133254308184"],["4034154496592849074","8187854285701181630","1570335543690743067","606537147995351580"],["2929015591324091326","6510107472799233239","9745440160806497459","6748166469038244512"],["8338221563244454481","8222668179331468492","7508349142490990949","10677808134802814355"],["6321708593024961186","16785697823964703724","5429431442945509898","7788282869377763567"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["11736218568157068645","9972260102019140532","7470567991938085029","15569606146910533553"],["11244284309772695949","10226643535480421150","11947899165116601981","1083596141279189590"],["7755304806514745172","12188712714962280612","15791491490389336914","9498288921106641583"],["2611561658319725241","15904559375189765144","17786577315480524712","2906879895672106677"],["1073508378881161214","8728495986248371123","719678955181944717","7907732358622266688"],["17145294983281807650","16686620969310588820","18426338075430687644","14236751298991758607"],["2686590450879457694","9746387469826392866","7776509026635156390","7182789080338222996"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["624991164132383735","7805645045925752159","16450394876513765505","13814400107968350176"],["8077581782687569779","1176469924084543672","3140006068231877815","13270116754357127503"],["9419730784521192394","12075313111039752690","4046126463378447547","8219220489184827424"],["11421685856689081190","15541312402300035639","15226095624781235149","6079782473935731774"],["5179957729649507593","2453424338900384874","4830508152543594444","1820096142654565412"],["9249212666735129222","2454643752411302385","6146811306949783261","1440024818909683730"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["16939097379619885139","7184455248075727430","732122653918678224","12606238320579212541"],["2870810107423935360","10896240819493624439","16602102318393379188","11481694829867858680"],["1531851871000471512","2874163907422745723","6367010070362051480","1863321157182505704"],["4846640329926603638","7751404226577080633","10730291227196485765","17432662299503088721"],["13943631684312227007","6467195029907343473","12016088457804450566","18351256409273101746"],["15572822448956117102","17072592796682787975","17355963814799389332","16877417834197761253"],["17223600605732542238","3640342207096535861","17240029803654911197","14835642525774251052"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["3958333436367760850","424863179075535896","12154330790524360967","13095074511326637553"],["11434764774495799896","13920164295478771903","17681228315987081205","13119378401582527855"],["2147325171991936525","15254776770737687690","7459522299761746964","10203326455884900394"],["8791874014733267881","5081345940994382209","11113054232648220034","11317767023839292092"],["14089683148209487043","1534416850179629413","15805819686777727291","3319512668017283576"],["10270108430395969103","6566383121252332463","16809542265292111640","1949623420750890211"],["17223600605732542238","3640342207096535861","17240029803654911197","14835642525774251052"],["5750450564932881814","3919437878141086767","8057347316886252176","13262133133136164842"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["5142286526886601235","528280064989304402","7585110403687408862","6082824889582862200"],["18114540001730866226","6545853384249100012","15466006095819698589","14141600506985295336"],["11645935261671401754","4849786581528849789","6228559779629826169","362354772199550382"],["13665653816322258658","1638647030955336046","14079002257316130045","16240192374288618029"],["8318442849846369603","7161996713111527674","10885996905314180612","6569867422254823250"],["9249212666735129222","2454643752411302385","6146811306949783261","1440024818909683730"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["3881001894388568604","18221482202705692703","6595905867459690131","13711536341631602378"],["866464396668593844","10965770537550335149","5068479531053073446","10531395222490979803"],["9718401533686692079","11406582290241804082","11642446054502871959","12891094273167823005"],["12432158371136174467","15354933002312437761","10183810655114693516","7591964114599879623"],["6755363040404562197","9235498177189456290","12611897780983057423","13126486956092333588"],["14847452920249935095","1825947248449560819","8844505114681655780","2630098594046563780"],["10928115732834570534","17178483213474583626","12575322908207782640","12621693355355322478"],["15149827716094067657","1605467617063865730","11680004012410276942","9661883947885607610"],["6782591116257055794","2298188600596399423","7827366390768248946","12605755805489338489"]],[["14389827351558698328","10797063835515266163","4414039004136572876","10248710936339321827"],["10767745654503764069","5648690965078273094","389658252052318992","7057240004822083049"],["10738832830161227581","992888670764153264","2613005942327504249","3249052154177606795"],["5334549327329789643","16399873623171410007","6473294912738444016","167210560147262797"],["2208274644637447833","4433706594741570633","12749576630651947538","5175886613466893167"],["12026056435371063098","12433348622713199243","5229369908558982974","7239880318503100525"],["7914633140715670090","17292138999057934704","2035710431754152295","12488587643398616239"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]],[["6224919504070699877","894011275758980923","12362500859733289446","3659316537202341971"],["9217365672818800984","6848910694659807108","17467992525716833719","14142167141747778028"],["6788545387759182907","14254606233406452117","14385081450535271119","1083841386547830041"],["4034154496592849074","8187854285701181630","1570335543690743067","606537147995351580"],["2929015591324091326","6510107472799233239","9745440160806497459","6748166469038244512"],["8338221563244454481","8222668179331468492","7508349142490990949","10677808134802814355"],["6321708593024961186","16785697823964703724","5429431442945509898","7788282869377763567"],["13573970147084939731","8139509956151549547","14046959717936943759","3092304906465752634"],["8530604299236914660","4283577050007784782","9991236593908324271","1047102578942057513"]]],"s4_root":["10587376466977121810","15578383481695784114","8981274146019501430","10520154927429109559"],"s4_vals":[["477448321916015098","10321352787517119249","14728087074423198699","5828059611451019205","4755898030235928207","17720562636299242247","14091733599744392261","6108502315557807272","8554185251494262245","4883647598743272775","8980132045195755423","17795707549575306426","14340431042224693889","13703604022519484724","10456831375799868402","17009342183523056065","12889610767357529463","9076354044979331610","10497810210459531440","6354804310436742537","10661557297777370070","7765809839198150586","3453979561757369846","3365618405988593723"],["16827335798207230637","13857653284598942881","3409959179865883814","12860484739839927227","9159030701049212067","4753080312487865579","13176886459835240991","6500756462358395600","14380003425490032510","8175355631005610585","15618678089744309834","3282578517578521628","9512767910753678904","15411996129579695167","5699953755956370155","10095086458280753576","9033643573016959503","10526417390241695588","2001230697472727924","14186376594852787662","13598341322859665823","4782744752351293741","17248205979603899067","7088834381603847245"],["3711367610951100143","8380246210255974481","13026651778177016707","1880121005946088233","16850654165333644304","12641390800809051199","769447258792269816","5157263098302854379","1010952176828778812","2149842560352001147","1522334787678180498","9526400826873783918","3865590987076408284","4414833642973470433","13578870260564009252","6017572914959067224","3734733392639096965","7263797616194283519","13671110588202602696","10492879526208508329","11463009018035168416","18300593383039986405","6457190232070676318","11285428927408459029"],["477448321916015098","10321352787517119249","14728087074423198699","5828059611451019205","4755898030235928207","17720562636299242247","14091733599744392261","6108502315557807272","8554185251494262245","4883647598743272775","8980132045195755423","17795707549575306426","14340431042224693889","13703604022519484724","10456831375799868402","17009342183523056065","12889610767357529463","9076354044979331610","10497810210459531440","6354804310436742537","10661557297777370070","7765809839198150586","3453979561757369846","3365618405988593723"],["16348822719653166334","16210497429414835196","4836236602300868385","15578962473718961512","8573809662045131981","10144827998560642934","6525712502693586350","14588238389717334832","8694307076648422829","394443788233008670","15601388666423692137","16269875525871398831","16882811005855915780","2251383742813275503","10427594350432277067","2900139775071247318","6436053194568737423","8243974396906145878","13694686091849368082","11471341370732767578","1016423819660123439","1255320387167946668","11316901785429077062","12290548751407851321"],["13496472463734140588","12619798012090624898","1370035250237435545","1529620663366274003","5210415751058045679","8514944023607050369","10787571678761725412","2252208997415127946","12415316224620706362","4266866770400184187","4249290467533514273","3194178825505810943","4222256686544254547","14965306483939474143","13529223609597333883","18302950604090869479","13627238174543871256","12831547697321903466","7917469237577930269","14764110869743496779","2395755165364479207","7775425921508812279","17627914587640787383","17214194531357819395"],["13993872038934567795","13112177937706044775","12599473659746165842","2227770507749944503","3409340337742550312","6710371342677101209","14481075369425768501","4048161962201603110","10844838548207552120","10708808493329354671","13185349264578091949","3782955869671508264","16997112801223250404","12679336070923740132","17128982375049234677","17045538589456450326","18223117324364417141","1186838714134647230","11751337960769562696","4093007139236718176","14124993157995092033","8389775262038711655","852193233583536019","1248005490982724658"],["3778430050039977037","16447986483905165033","4486973262462103480","2819632921306101975","3652031649201790703","8946577561964053334","12310965729671640359","3549284040848377546","10093912244790470115","7859799634313470236","9141538792026668322","2546556354604057211","18438545143663397736","11890697914492066676","16513574093539631626","2954764287893211972","13374708443391973151","16533679686655002337","11386588071153164456","14224222941322837850","15760187605600817677","12462372488102174707","13291156089575956816","12097572830414577328"],["13171247308532697226","13510585642491273809","10158413989140369474","7164858204772469280","4945390329448061203","13715661260739885766","11875289048812998366","9984467719452398638","9124810386974389032","438959641448049487","12069668333300418169","2844492346523416219","11913295144905227745","5964838590800776028","8629232835016313455","6955423274320418939","16424887623868758876","10181622914070151056","5231406817780090223","16645353719678380007","2197837364728863333","11254671246404040368","16820698246269084973","17713204233478316623"],["13607211887233839845","10410263267275719415","7687079736075013794","10763712991528860916","17845902481993406688","15960039445487359707","3607004967430375869","476734701168036487","14656201765251473200","10296335084268970017","14600122339641912888","8029950639965205820","2293655901988013448","12712881893790685447","5907424566252981260","4599796391923134684","16908235808665445330","11743916629277025658","13938519303833952341","15232491385360369718","1093069032764403331","9296291777865427497","2253178000401308833","17038565523401481074"],["16348822719653166334","16210497429414835196","4836236602300868385","15578962473718961512","8573809662045131981","10144827998560642934","6525712502693586350","14588238389717334832","8694307076648422829","394443788233008670","15601388666423692137","16269875525871398831","16882811005855915780","2251383742813275503","10427594350432277067","2900139775071247318","6436053194568737423","8243974396906145878","13694686091849368082","11471341370732767578","1016423819660123439","1255320387167946668","11316901785429077062","12290548751407851321"],["1091654192443650992","4889048053094415065","5457538547405863260","5958532922360902468","1867366052061481844","8888363891030113549","7663043972548546821","5545038656590743435","4407945010010771877","7270955413991035891","7425427600577323236","13001336351207918882","12812591894017099452","9489197129321038147","6025168481774351542","867029677481524981","5392396763357277175","2109926151457441761","15259614945697845632","1887813445042352927","9019681792090157872","15290723811094659093","8126858649936821757","5938037720632028114"],["6494194583263564580","7036628320931765037","13704938033220592933","15185244355106909423","14647938671494077550","11953269762052327943","17166041999859049569","5414994714039069327","5883457819788143316","10861341629447539585","10451159543265131495","775411876181074329","1987460268664061576","17329384921405296232","3455799035724378675","4991053220253360736","7051288456615307092","13933276770472885445","6303935919112092015","3175869630320112889","17826623464250291454","5981724360854757193","4123721416570965492","2327484253663572170"],["2000474647717049032","517198799717173840","13819897663232647941","2799031166900718482","16899554506725975541","55335543353201125","2917709799019382513","15932916519049048890","2396977031716661900","6603969725675079103","13634841930586463892","10245740932366212175","13366478525967253632","16355953860821886463","8434918319865573305","4115032054877436808","10340879695188258707","10635629391663422220","18111780667947899217","5117682453206673037","5288308313679248496","15949218603456419330","8112929840220473286","9964522013946086300"],["12456759214611726345","14096125721933249256","10568435302611297164","15788205538024107377","11543507087158706282","8748022161490271879","7864777942927065020","17750201197144703689","16578652548989251278","10437917223824009159","13054989548648813515","8461651184282127790","17699965365085076021","4571332516275098689","9966829707318528558","8598916712728788659","3720470517611334758","11714094928054512927","9505050105088954467","10760776389512612774","14310621546267173074","1937784151515752934","13235336531031042730","9825632017658679368"],["6854049628019269867","7735453491607205230","7440337705958787125","15933756366263825934","3957129298836496912","11240706871749853213","13028816405348045576","1376737816893841235","10038756913063116800","2340640736916155009","1718396802714374409","18004837633238746514","2128641670330404993","17227509336525324934","2935586349027129525","4531190660005877010","2489260942484588533","10964859740242255845","12030409533597646578","8861841450630934210","3628830618681346916","7530958484460111518","13562482939450162429","9710112738525114349"],["17186777124274867041","7904775603489746416","16050054660715303493","10745889710325572050","14118722325846154585","587401916119732323","4987509899871076859","853725969483673118","3168695825208040607","14988056307103010052","14163491613333820052","1661599323504833597","2967623048894640044","10068246483433261004","3743111459093840153","18161380853892178518","9088587321111431218","2762213363684091750","17131184647278329175","15062705589522647314","11423256097233140063","11748363551187671197","1426628330417625316","2997349547403497849"],["5301950304344288966","13268059932596763103","8643142432381243361","11267453650199740362","13617505405987025451","16100973153326058836","4120133281661081922","2582561272158422042","11748191122079037245","3793964389336210459","15794695079289936086","3043280726646064349","8072609967929982920","17936380049602613650","1714172282208533403","3395364822976762461","1567228844048715260","5164460996902173012","4159022719138361858","14433534509949629717","2058747527094450532","8258028152240535897","4758848670935128106","1448070603171990381"],["6494194583263564580","7036628320931765037","13704938033220592933","15185244355106909423","14647938671494077550","11953269762052327943","17166041999859049569","5414994714039069327","5883457819788143316","10861341629447539585","10451159543265131495","775411876181074329","1987460268664061576","17329384921405296232","3455799035724378675","4991053220253360736","7051288456615307092","13933276770472885445","6303935919112092015","3175869630320112889","17826623464250291454","5981724360854757193","4123721416570965492","2327484253663572170"],["13171247308532697226","13510585642491273809","10158413989140369474","7164858204772469280","4945390329448061203","13715661260739885766","11875289048812998366","9984467719452398638","9124810386974389032","438959641448049487","12069668333300418169","2844492346523416219","11913295144905227745","5964838590800776028","8629232835016313455","6955423274320418939","16424887623868758876","10181622914070151056","5231406817780090223","16645353719678380007","2197837364728863333","11254671246404040368","16820698246269084973","17713204233478316623"],["7419895284610940019","1125529119015853795","17440793269374279771","14925950858474381058","1776440261374761615","7703331544011672833","15296775368817852913","15972680356088085393","8184623513014538622","9232220235377945703","8267171128925958816","6214299582996321575","12492726304800435017","8560598629902916048","10849150287126670723","5249096137426709156","18388265421478041831","1292925667631514349","17359884566874178205","3166139041552430566","9213273975467879745","12992938544643820559","8067904042099415753","16068735186585671756"],["13106006989743361300","1628661247364520303","67108151214518951","449792867962152774","15189000028548023555","6944854755293349909","8785850089195407323","9605317477032215972","10402312867261744224","11463370476677483270","7275072111265595271","3507880207021772773","18041334374536477748","11753762836149717599","14230340471289269810","17885603301406500697","14164318972619548449","4548826536122442033","17865101687807359516","12597673253732015632","825649057184611956","13804419352245354343","14381535847906989142","5516599282869633684"],["18406838106531907981","9846141622548730067","16867543618656691988","15970241968329933616","9117970721004551648","9762190235212502265","7531221195240673362","7199012622042715240","10570005858568533170","8543729676160413231","9502826456603481479","2896527006283607523","17093093981464014263","2473541053420029389","5038080183697150107","14610892151504569936","13118648306091460128","363047018783371723","4210380417381450794","8871737429649636608","9981375933049415001","2309365490784512686","11864149826116002263","15190274132580229559"],["15884240086765078960","5626793732502349209","17990500742425231424","4364653734520364185","2814034608491775050","1587872085842477228","6686146806717046748","4445461719962704212","4728054815113143337","12875314582512138010","3182158279695038761","11400343685646901141","4667016612988118290","633824347620169955","4168313455246232959","10476868303186793724","5892247745353693901","1279146461430313572","5533627473032033662","7896220226102497066","15082624021882648262","13604111461781152061","12292600311545330768","9753048544032007172"],["15694087546738317973","11795195857392442794","10776063213780501878","2957073156350953566","13389185819084805876","4794927981995494131","4978506114087935140","14881074152835624721","15880420558392467763","10055260115643086972","14801363918740489742","15907815181221946267","9756588943080195440","1714080972618937196","2826544254035566752","3537084762273210180","8768768761582842643","17192095556947613150","16553656458325408051","1700614030677925897","9326626699722281915","3936239467187766697","17509673517476667270","2572412732917289464"],["13607211887233839845","10410263267275719415","7687079736075013794","10763712991528860916","17845902481993406688","15960039445487359707","3607004967430375869","476734701168036487","14656201765251473200","10296335084268970017","14600122339641912888","8029950639965205820","2293655901988013448","12712881893790685447","5907424566252981260","4599796391923134684","16908235808665445330","11743916629277025658","13938519303833952341","15232491385360369718","1093069032764403331","9296291777865427497","2253178000401308833","17038565523401481074"],["16484612707741519816","13251074590144606806","2043946869989143497","9275107642878775590","3091800382460949983","8037912211081121864","15494150828810076539","6435800591174758600","10316805053702689337","18211138235309082246","7870939568180630175","16518132183979737183","11104746173607866481","11413081452754699870","8995993843074434417","4133346101732564941","3457515318114518508","12405561800273516927","2236135135108269636","1415840847173953060","11477982982332927132","8731639891146711465","8389414709064443460","12923083483756740856"],["16484612707741519816","13251074590144606806","2043946869989143497","9275107642878775590","3091800382460949983","8037912211081121864","15494150828810076539","6435800591174758600","10316805053702689337","18211138235309082246","7870939568180630175","16518132183979737183","11104746173607866481","11413081452754699870","8995993843074434417","4133346101732564941","3457515318114518508","12405561800273516927","2236135135108269636","1415840847173953060","11477982982332927132","8731639891146711465","8389414709064443460","12923083483756740856"],["8909156458189863875","7577128910595005830","13856071345830096510","17746259986359761080","10022190339037802136","3670102684091271887","5802040592693093227","9533971626022282770","16811880047508726040","2333633794224551673","12586976887263628912","17919177126842882905","13577334070923191901","1917466500098724049","18045783846255522377","9995890221571513507","2728420598002394058","17561236406911174694","2014351227906685099","13740603957945408125","5768743017983232567","6110447757164962186","7580132342926669689","454047978481270469"],["16484612707741519816","13251074590144606806","2043946869989143497","9275107642878775590","3091800382460949983","8037912211081121864","15494150828810076539","6435800591174758600","10316805053702689337","18211138235309082246","7870939568180630175","16518132183979737183","11104746173607866481","11413081452754699870","8995993843074434417","4133346101732564941","3457515318114518508","12405561800273516927","2236135135108269636","1415840847173953060","11477982982332927132","8731639891146711465","8389414709064443460","12923083483756740856"],["18406838106531907981","9846141622548730067","16867543618656691988","15970241968329933616","9117970721004551648","9762190235212502265","7531221195240673362","7199012622042715240","10570005858568533170","8543729676160413231","9502826456603481479","2896527006283607523","17093093981464014263","2473541053420029389","5038080183697150107","14610892151504569936","13118648306091460128","363047018783371723","4210380417381450794","8871737429649636608","9981375933049415001","2309365490784512686","11864149826116002263","15190274132580229559"],["14984824449632501845","16746181190454908721","13489227441386535976","11885299368231318524","12318432119929267403","3188468459669842369","3696427287854151151","13359141574286546071","710254431132507384","18244640169765814852","4538554524485207443","10860697879537977563","3817369934656826571","7494711755399481534","10492201627984604258","11437492199998115605","3411714322818470461","10811552647400530806","3352430781567582779","16881089696622661223","13286616068731308688","12290332026023493031","8578224964662763727","10684035355697594353"],["7578107712909684059","10102726089917940029","18098134737018760580","6014118894821755109","17808236453485955759","3923511737285560656","14377276680881186732","15877798910294971680","5130012102351166088","4838583216335744128","13856298209089114430","10621608821339535937","12367317063015851891","9213784864314070527","7602476561925963227","249457928572013107","16893835055770710251","8957336512774816586","2832413231017810582","4881303266127270384","5596169461671429750","3011938795026819581","4007068242746632595","3008581521531040995"],["18406838106531907981","9846141622548730067","16867543618656691988","15970241968329933616","9117970721004551648","9762190235212502265","7531221195240673362","7199012622042715240","10570005858568533170","8543729676160413231","9502826456603481479","2896527006283607523","17093093981464014263","2473541053420029389","5038080183697150107","14610892151504569936","13118648306091460128","363047018783371723","4210380417381450794","8871737429649636608","9981375933049415001","2309365490784512686","11864149826116002263","15190274132580229559"],["4754720036751166173","1174426627318674608","10712287925782189451","18275098684921597464","6587705914446794117","3218678696439344172","15394945077883391385","6603990126934962545","2997229591927289480","15990160636006022959","2283744475942383595","17234925028668601151","11462208918804656807","17833039290932754539","8693351547480203668","5258110518019316585","13368354291210766825","17161715314209213368","16059019569146590723","12262273496471486524","16243709591235603703","18228809510475645016","6858288872006003194","15562689640784108109"],["13108311977900284225","12217992750871336954","16270488176703729524","7993238309720433946","14421567370397969287","11380350448262294918","12771931599931422964","6029400109864433601","8208921639951785415","14934131080843291097","5469070411545343513","12989845678596329287","8925739075080952318","18141989431750010673","14718739300582925188","10772054673364917813","7119691536421732309","13810916791665222198","15655525812043371561","1952537354372472272","8778617947522553924","14210395005901745538","16974485767637945420","18052869767198659391"],["477448321916015098","10321352787517119249","14728087074423198699","5828059611451019205","4755898030235928207","17720562636299242247","14091733599744392261","6108502315557807272","8554185251494262245","4883647598743272775","8980132045195755423","17795707549575306426","14340431042224693889","13703604022519484724","10456831375799868402","17009342183523056065","12889610767357529463","9076354044979331610","10497810210459531440","6354804310436742537","10661557297777370070","7765809839198150586","3453979561757369846","3365618405988593723"],["1091654192443650992","4889048053094415065","5457538547405863260","5958532922360902468","1867366052061481844","8888363891030113549","7663043972548546821","5545038656590743435","4407945010010771877","7270955413991035891","7425427600577323236","13001336351207918882","12812591894017099452","9489197129321038147","6025168481774351542","867029677481524981","5392396763357277175","2109926151457441761","15259614945697845632","1887813445042352927","9019681792090157872","15290723811094659093","8126858649936821757","5938037720632028114"],["14323262153801970030","14191060187930935740","1872136674887603416","3539023168113052239","10774358960506761642","725762390653704677","5671553612443035291","15169339806589981162","15897147916183350189","14822534060167446475","15627510402050563655","15519447003377505698","5686473655573903951","7027736461216550841","13048199186540888507","14103844169120251435","11288949281257895042","16997130403932794581","17939109754886102083","15170871904470556688","9794150507761587847","9686763115409572572","7858379700008467990","14868262191741271960"],["17186777124274867041","7904775603489746416","16050054660715303493","10745889710325572050","14118722325846154585","587401916119732323","4987509899871076859","853725969483673118","3168695825208040607","14988056307103010052","14163491613333820052","1661599323504833597","2967623048894640044","10068246483433261004","3743111459093840153","18161380853892178518","9088587321111431218","2762213363684091750","17131184647278329175","15062705589522647314","11423256097233140063","11748363551187671197","1426628330417625316","2997349547403497849"],["13171247308532697226","13510585642491273809","10158413989140369474","7164858204772469280","4945390329448061203","13715661260739885766","11875289048812998366","9984467719452398638","9124810386974389032","438959641448049487","12069668333300418169","2844492346523416219","11913295144905227745","5964838590800776028","8629232835016313455","6955423274320418939","16424887623868758876","10181622914070151056","5231406817780090223","16645353719678380007","2197837364728863333","11254671246404040368","16820698246269084973","17713204233478316623"],["16484612707741519816","13251074590144606806","2043946869989143497","9275107642878775590","3091800382460949983","8037912211081121864","15494150828810076539","6435800591174758600","10316805053702689337","18211138235309082246","7870939568180630175","16518132183979737183","11104746173607866481","11413081452754699870","8995993843074434417","4133346101732564941","3457515318114518508","12405561800273516927","2236135135108269636","1415840847173953060","11477982982332927132","8731639891146711465","8389414709064443460","12923083483756740856"],["13106006989743361300","1628661247364520303","67108151214518951","449792867962152774","15189000028548023555","6944854755293349909","8785850089195407323","9605317477032215972","10402312867261744224","11463370476677483270","7275072111265595271","3507880207021772773","18041334374536477748","11753762836149717599","14230340471289269810","17885603301406500697","14164318972619548449","4548826536122442033","17865101687807359516","12597673253732015632","825649057184611956","13804419352245354343","14381535847906989142","5516599282869633684"]],"s4_siblings":[[["2806693439497174775","10482697767540209929","12838747090710712677","11384084700536354696"],["14848936946960248210","9614328459429666256","3197554780837144039","3582520101561773434"],["14406374729003645478","13078966618295850301","6345022841965679673","16803988207438890704"],["10187214702671825267","3979736205317870657","10816713584411687937","16673307693550541065"],["7712651421805616229","4807867268189406565","15265171670898730225","9942635488672717333"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["8456243199231538445","12119375839340969351","7438692950599465783","15684794056429316832"],["16832965515347509598","4374577884681237630","2613770731935448658","14039609431634098299"],["15959761332887322179","6454496587860966913","4793888046306866767","13352247137392841465"],["14766594115938153599","5544363684166127067","14409173803427002988","810813505462817268"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["1217759201892258491","18391005717669022965","5616107994987550830","4423173300847608527"],["13364771874892766437","12448740682516632561","6084232135515036245","3960202690056774241"],["4355289759296803178","5438694546266246430","12523787210874738226","1188626747001141588"],["13066069811621511046","14246697186700617961","17115216445221008740","8603496563069691181"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["2806693439497174775","10482697767540209929","12838747090710712677","11384084700536354696"],["14848936946960248210","9614328459429666256","3197554780837144039","3582520101561773434"],["14406374729003645478","13078966618295850301","6345022841965679673","16803988207438890704"],["10187214702671825267","3979736205317870657","10816713584411687937","16673307693550541065"],["7712651421805616229","4807867268189406565","15265171670898730225","9942635488672717333"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["10870434788255086364","8004869072601924277","7906999363689315120","10832566637718441036"],["13174201559404056510","893246023663576746","277096380229974650","9658609763641808606"],["10701759399585551061","1097344736890901385","16770517355629714543","11660548811087879623"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["15716776625065927879","9504149512377088506","11212064031518464295","588890088480620086"],["16525900747221531120","11692441394082544652","3951814315222107700","5130504859015231940"],["4355289759296803178","5438694546266246430","12523787210874738226","1188626747001141588"],["13066069811621511046","14246697186700617961","17115216445221008740","8603496563069691181"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["1204546228692686645","16413184784965526840","3523575460936183909","2528936392416725665"],["11137937266501759934","16116184208710321131","10202361924200090321","4068417810744249249"],["8201142345405531180","3558755199532121853","6208389429693150792","9775760233749588500"],["8406664941740186695","13634561001533943157","14169568530812329751","7336394116054932400"],["2858244403134779373","18335954520593238995","17249919749844096821","6966066220948056565"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["17117360644713358120","12152769236324995335","12328369943018681878","5059427643903628447"],["8297303312718698673","2343322662788424345","5499623163183646692","12813341874138883543"],["18207786942402543496","11482746517719765179","15920297431590012822","15012126668985048596"],["8406664941740186695","13634561001533943157","14169568530812329751","7336394116054932400"],["2858244403134779373","18335954520593238995","17249919749844096821","6966066220948056565"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["10936060772017514550","2770970213559657767","2799756583957504701","8459951379521523104"],["7127575800095792113","13903167498128584707","3875428133537943911","14968878593252317103"],["12831149940295900024","11653901554117553202","11938236564087258998","1824778267016654959"],["10018808017239375145","8400620208219141551","7985129475407187987","18146051705412383027"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["14584701247309870592","3656681076351261147","1341247789514395792","606512888041413685"],["13174201559404056510","893246023663576746","277096380229974650","9658609763641808606"],["10701759399585551061","1097344736890901385","16770517355629714543","11660548811087879623"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["10870434788255086364","8004869072601924277","7906999363689315120","10832566637718441036"],["13174201559404056510","893246023663576746","277096380229974650","9658609763641808606"],["10701759399585551061","1097344736890901385","16770517355629714543","11660548811087879623"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["8120207351603538060","11614186492892880241","4259724157679575113","6292903361664827431"],["14248055866928590638","6597135052246695195","2871928305078378814","8552042424504944863"],["18332858249079807570","11973385416344914453","6215366617662236644","1731221674266015084"],["13066069811621511046","14246697186700617961","17115216445221008740","8603496563069691181"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["9629322293674192918","1813164151190781096","17466920009912917760","3374867695386499313"],["16832965515347509598","4374577884681237630","2613770731935448658","14039609431634098299"],["15959761332887322179","6454496587860966913","4793888046306866767","13352247137392841465"],["14766594115938153599","5544363684166127067","14409173803427002988","810813505462817268"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["2338560659436869034","5337011179965521048","9798339434847195935","9168823200277528429"],["10198168327837735731","2225093404239513585","1539268004488804180","13002363311857150368"],["6362411094470116271","14179782077191501407","3497738782864524189","17356039884468602308"],["14766594115938153599","5544363684166127067","14409173803427002988","810813505462817268"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["9149731130280252391","1491629934983812880","6140830449080257632","12614589502557323301"],["16673833546168151129","12140497405943697718","6586465129622843913","14909582171621121417"],["18207786942402543496","11482746517719765179","15920297431590012822","15012126668985048596"],["8406664941740186695","13634561001533943157","14169568530812329751","7336394116054932400"],["2858244403134779373","18335954520593238995","17249919749844096821","6966066220948056565"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["159972260088425673","13062235649338081457","6159648796673354532","15646052015807642095"],["17023720183911249709","5919885393092751078","7625674672979676436","14391452432104139422"],["4164365146572729659","7898501946926704614","11303252860828377275","7745074597288080932"],["10018808017239375145","8400620208219141551","7985129475407187987","18146051705412383027"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["4039754728545645409","10243996189264028038","17014756763768953221","17513190502135233807"],["6552943303318324833","11681401828715486888","10705274972128860571","4306747567693262407"],["4965852245094425540","11776821989112125579","5201636346993683978","2491214977901857494"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["13311165801526865071","12195942327772805475","5642442526438615295","14784754638894735647"],["17023720183911249709","5919885393092751078","7625674672979676436","14391452432104139422"],["4164365146572729659","7898501946926704614","11303252860828377275","7745074597288080932"],["10018808017239375145","8400620208219141551","7985129475407187987","18146051705412383027"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["9629322293674192918","1813164151190781096","17466920009912917760","3374867695386499313"],["16832965515347509598","4374577884681237630","2613770731935448658","14039609431634098299"],["15959761332887322179","6454496587860966913","4793888046306866767","13352247137392841465"],["14766594115938153599","5544363684166127067","14409173803427002988","810813505462817268"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["10936060772017514550","2770970213559657767","2799756583957504701","8459951379521523104"],["7127575800095792113","13903167498128584707","3875428133537943911","14968878593252317103"],["12831149940295900024","11653901554117553202","11938236564087258998","1824778267016654959"],["10018808017239375145","8400620208219141551","7985129475407187987","18146051705412383027"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["7448931471067440841","14541496501133417220","9821995968243876689","7394667422333769658"],["451640795396274022","15527712304160007031","11733057313552183263","2211206770893822780"],["12831149940295900024","11653901554117553202","11938236564087258998","1824778267016654959"],["10018808017239375145","8400620208219141551","7985129475407187987","18146051705412383027"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["2956985948356325278","8208838405840844202","9866104300542973845","6132826203093400475"],["18417973568503148312","15059935358659649667","5705531898419650094","15550946047117552871"],["2633052600775348914","891790804548012999","6729459853673734571","16438657469159169346"],["2154995218249210562","7513813018352435497","1292005776098805833","4641793373628932544"],["7712651421805616229","4807867268189406565","15265171670898730225","9942635488672717333"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["2896084174588709709","10058375561520550013","15429600619927631675","17616864804683762084"],["13790836893526407705","9459265806565840838","9566635913586095361","16021967199728042571"],["4965852245094425540","11776821989112125579","5201636346993683978","2491214977901857494"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["14680387979180120789","4316953047216689082","418298429361504852","9076289662112803638"],["9037581100651494136","4411331419708300863","15845934383379367162","13719815754707677709"],["15959761332887322179","6454496587860966913","4793888046306866767","13352247137392841465"],["14766594115938153599","5544363684166127067","14409173803427002988","810813505462817268"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["7851748333617688521","778860754710244965","13344546139296150060","4114471216495489186"],["2571989302584982946","7219670866098482770","12088318919418533369","3849342417764674069"],["13111510992970540938","13771959212587814849","13788678690615701572","5118084027497842112"],["2791450641522200086","3739130000764638237","13905089768311966805","2829171188030802388"],["2858244403134779373","18335954520593238995","17249919749844096821","6966066220948056565"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["14584701247309870592","3656681076351261147","1341247789514395792","606512888041413685"],["13174201559404056510","893246023663576746","277096380229974650","9658609763641808606"],["10701759399585551061","1097344736890901385","16770517355629714543","11660548811087879623"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["11941518476222115235","11537409172329435905","4362321065784755663","2438254464561019932"],["10198168327837735731","2225093404239513585","1539268004488804180","13002363311857150368"],["6362411094470116271","14179782077191501407","3497738782864524189","17356039884468602308"],["14766594115938153599","5544363684166127067","14409173803427002988","810813505462817268"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["11941518476222115235","11537409172329435905","4362321065784755663","2438254464561019932"],["10198168327837735731","2225093404239513585","1539268004488804180","13002363311857150368"],["6362411094470116271","14179782077191501407","3497738782864524189","17356039884468602308"],["14766594115938153599","5544363684166127067","14409173803427002988","810813505462817268"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["9744868562476184745","1133253342259418010","2311564922044116396","481336376246640612"],["5323609909957181252","13417801697348647298","15962878238958802547","1415487472824505423"],["14406374729003645478","13078966618295850301","6345022841965679673","16803988207438890704"],["10187214702671825267","3979736205317870657","10816713584411687937","16673307693550541065"],["7712651421805616229","4807867268189406565","15265171670898730225","9942635488672717333"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["11941518476222115235","11537409172329435905","4362321065784755663","2438254464561019932"],["10198168327837735731","2225093404239513585","1539268004488804180","13002363311857150368"],["6362411094470116271","14179782077191501407","3497738782864524189","17356039884468602308"],["14766594115938153599","5544363684166127067","14409173803427002988","810813505462817268"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["2896084174588709709","10058375561520550013","15429600619927631675","17616864804683762084"],["13790836893526407705","9459265806565840838","9566635913586095361","16021967199728042571"],["4965852245094425540","11776821989112125579","5201636346993683978","2491214977901857494"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["6374181885039284894","17608089564572610201","87040716058478192","1623994524440850605"],["11137937266501759934","16116184208710321131","10202361924200090321","4068417810744249249"],["8201142345405531180","3558755199532121853","6208389429693150792","9775760233749588500"],["8406664941740186695","13634561001533943157","14169568530812329751","7336394116054932400"],["2858244403134779373","18335954520593238995","17249919749844096821","6966066220948056565"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["6384053590254640076","15834093480388424516","6411970086099479274","12880127225878304110"],["17057280841308701405","16647159356525766248","3482360536367216886","9954320507354677111"],["10701759399585551061","1097344736890901385","16770517355629714543","11660548811087879623"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["2896084174588709709","10058375561520550013","15429600619927631675","17616864804683762084"],["13790836893526407705","9459265806565840838","9566635913586095361","16021967199728042571"],["4965852245094425540","11776821989112125579","5201636346993683978","2491214977901857494"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["16598220940405881172","640359560630792525","6718352245977339697","17972361630604700628"],["5705819212225566251","780809910930425889","18404382266999583652","16845129561976079292"],["9827010638186598711","16183018584548840109","16289875395913396398","1145032257422187440"],["2154995218249210562","7513813018352435497","1292005776098805833","4641793373628932544"],["7712651421805616229","4807867268189406565","15265171670898730225","9942635488672717333"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["17577239658499932317","9471660470806176383","13058892212156830648","4932376107104000494"],["9658397087445122830","7768819753638385795","13938072826032219848","1960397103261648784"],["11111954252909388327","5521341739812844258","15782107559943955794","1955150898843297856"],["2791450641522200086","3739130000764638237","13905089768311966805","2829171188030802388"],["2858244403134779373","18335954520593238995","17249919749844096821","6966066220948056565"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["2806693439497174775","10482697767540209929","12838747090710712677","11384084700536354696"],["14848936946960248210","9614328459429666256","3197554780837144039","3582520101561773434"],["14406374729003645478","13078966618295850301","6345022841965679673","16803988207438890704"],["10187214702671825267","3979736205317870657","10816713584411687937","16673307693550541065"],["7712651421805616229","4807867268189406565","15265171670898730225","9942635488672717333"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["8120207351603538060","11614186492892880241","4259724157679575113","6292903361664827431"],["14248055866928590638","6597135052246695195","2871928305078378814","8552042424504944863"],["18332858249079807570","11973385416344914453","6215366617662236644","1731221674266015084"],["13066069811621511046","14246697186700617961","17115216445221008740","8603496563069691181"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["4031626323992660848","1152762415693951315","9602217917751375614","9556363880242080219"],["14848936946960248210","9614328459429666256","3197554780837144039","3582520101561773434"],["14406374729003645478","13078966618295850301","6345022841965679673","16803988207438890704"],["10187214702671825267","3979736205317870657","10816713584411687937","16673307693550541065"],["7712651421805616229","4807867268189406565","15265171670898730225","9942635488672717333"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["4039754728545645409","10243996189264028038","17014756763768953221","17513190502135233807"],["6552943303318324833","11681401828715486888","10705274972128860571","4306747567693262407"],["4965852245094425540","11776821989112125579","5201636346993683978","2491214977901857494"],["10884218190723826905","13058998000731380644","10488948739454378351","8390473617305762214"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["10936060772017514550","2770970213559657767","2799756583957504701","8459951379521523104"],["7127575800095792113","13903167498128584707","3875428133537943911","14968878593252317103"],["12831149940295900024","11653901554117553202","11938236564087258998","1824778267016654959"],["10018808017239375145","8400620208219141551","7985129475407187987","18146051705412383027"],["11276759211926953750","918108793108488320","8846560412171775067","17776853934699178261"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]],[["11941518476222115235","11537409172329435905","4362321065784755663","2438254464561019932"],["10198168327837735731","2225093404239513585","1539268004488804180","13002363311857150368"],["6362411094470116271","14179782077191501407","3497738782864524189","17356039884468602308"],["14766594115938153599","5544363684166127067","14409173803427002988","810813505462817268"],["2070614747619823419","12523448198366821970","17065410501502675619","10323112112112879754"],["13614513592266537038","10218261903946985838","6466170725451608701","14463611244012930202"]],[["2956985948356325278","8208838405840844202","9866104300542973845","6132826203093400475"],["18417973568503148312","15059935358659649667","5705531898419650094","15550946047117552871"],["2633052600775348914","891790804548012999","6729459853673734571","16438657469159169346"],["2154995218249210562","7513813018352435497","1292005776098805833","4641793373628932544"],["7712651421805616229","4807867268189406565","15265171670898730225","9942635488672717333"],["1764458885294021300","4506617437930551856","16870285788269217481","2127330111095071019"]]],"s0_vals1":[["8514563072962350943","2551991616793822147","5972278764998578430","6478176082142527002","7378952833943995393","12724320155358926493","17568715844471153747","4376013329254797594","16710660673693563691","18406444981738218587","4410150091273792490","1362206622000093014","1432519568119368485","17443461347215745255","15297502032152157200","18329575083444303912","16833886319476260613","4772098785282352029"],["953357350112447824","12992295940468654638","11954845256841252673","16854809489473819636","7488371070622911971","5071828561166591394","18095618434471861160","8907298959092757723","9077436602919486676","13504244360606639975","11989644139863840678","17890323430121373122","11750464796608995067","7261661767005578411","5348225681640196996","17065739403807528351","16733989780102513704","10627080582859651589"],["9195899854890648947","17637853675846841267","12005428049130650583","2552872957492833724","11285037653324477100","2549897011339640573","7810615824872005244","17583875444088761186","13786724777139054531","3915313634451356384","1596512654911407633","355717012914935656","114474262983716395","18142167869470707938","11613543763857298040","4586717731541747184","12145089275561724526","5408517443096094287"],["964374530913545416","16932336480161943263","1632720031721927363","502821792342127763","6745838193817781774","1146626755204010183","16213730331898085039","10653660120765641551","4823489494601701335","4318237376323993764","5401123024625056209","6736630039877607775","6783032459237249285","7976200086809759476","7626903003299284338","9750247490427820826","5617311024869362933","13396866298633368859"],["12717415704934797840","6428810956143622648","14982609959544507137","8626788673478338957","12992901767630416794","1488877663406807663","17767824980037080797","7518807966522164244","9792012723532630119","1028382939519724136","17716537832879442558","167583787889144665","2479795145619366952","3128907306538455853","1151087527467540830","12479165649090512019","10884966650308526111","6113365993645063373"],["6735969477262339314","10560983737298498867","14508363374779864282","15979188874956426117","3694050876068292254","11566249139493933222","18235861692121390840","6358547431935167201","3979824086666121587","5417736035930889144","17343429497019449942","11254681864300947744","1013119948288410631","14845495538959342565","17098422937484447586","10218914543997256439","12322021755415729762","15391025995402600993"],["5707870945705839158","16610592559612599040","12280119575790984161","15164673861643938645","8372165144334269818","5061807931130719787","2229674519740460364","18224165759743515224","9794797123004758926","346258011587190558","3753631799240395047","5005635552619029541","5537025147809585503","14451537942294704546","4618492119156970785","1570083455269030173","2438733999391070365","1092482719837287095"],["12701782495448510500","17009951055762877076","12231586305925740584","14277342616286294892","2853645601330042452","13641966663002669486","119478295304096645","352998077820160540","533351223763430551","250457235329870874","4898598615567350803","7393468174520946780","16803762037820682899","4632520268111795048","12551521287723017173","16099375508503879030","7601577367001477834","7833738647359428190"],["11222808946521664564","1651921309103526122","10703959444108116539","2723330754851432845","15307220881801136829","4625342149523678495","4765280888495345306","2142070038268063767","2703222425472576305","5230798093546056288","16174693813701537212","370454046368664966","7125476102641316831","5977996589109206213","6591100314660167599","2662744306039458255","14283215950443141189","1667162261290803463"],["18433514264838226557","3163532504813464668","343289047431742201","12347064129524302929","8808622387780174698","15933081497806982171","5928828901111113963","7334289511785368794","10018087660235194666","7099253435826736795","8888648447621723953","1146465837143977903","11162625478638894506","3313113521739548812","665934347003415542","2465865451195777089","16109436728356177324","17305986581421886188"],["3402676877698113254","14002739571044283001","227883089918314398","71632372765929468","6213803594836706561","16137957412124546647","5877729103345428161","10706497167225897962","5402008812868586436","10680243147882410785","12697165212934870137","6052872982256665831","4368587749403404231","5476498006173516898","16096536621453502390","58267248865324578","5248389002181632332","10846179700791248098"],["5460988150313069849","8367199330255851574","9781990815659809276","11544245649328374337","11265639273132173175","17039393547162474461","1926800490466246162","7452136788925090356","178616878707289425","16969968402287477486","16495373875605191531","8931978514997395316","11713758741328468627","5353877385245117693","6050937813351511057","9483275665973180494","1360990704427240742","11739663509324826509"],["11564424968548884088","14873241783325643141","1387275370513736682","10022762807511605251","15363944205242303329","10962299393322660130","7376865945855221142","8936882193383587888","12791914472822282475","18388646886206577370","9458322169816885168","17732825243847323119","1594605944570211744","13826983022293895037","7414507979596893910","1736273213073175489","15635853902052777854","2016186805963427667"],["465817614083923948","9459616760337385563","13919414260643071212","17233245331476012711","10989250544003582453","12842451225838757197","8796977732781032401","1319933227613382096","5859123166335710374","11963196202013555095","12256224160282752705","10487154625847995315","12469806666376615119","5462922676940904613","16320841517244551","12830034018828615273","13474959820710275838","3554596836635825177"],["10426450832383987237","9861682437323936399","14952881441233801666","3941126676630094399","1446269528881824680","12909795243445396748","10215124271826315925","16493216963318627074","17003700407200379943","7839592801029990174","5930537740801205887","10053349135524416894","14469648666446081429","12143460540163014092","1928100859138873462","6444527912086168157","9193135586735460669","1214754505418056716"],["3442239276642101907","6511129031444988930","13008655418177309375","9881459300844847294","3033731654369400187","7276968228609542795","17887433483160850833","10110179083835020665","11987716165926549278","7718332413859806994","131486481476342342","5232269483470768254","15567376469658670463","16451233703973816974","483152075169971064","5548511946002443106","9630420994281679775","982710722159285193"],["6151977251743490597","1380175896919534080","13342233185106793743","255102101528553159","16644067960087526844","7272944689409880515","12679917283359462055","12244496151658685831","17003572203422517595","11436058798184092866","9624243482323192433","6558286959746445520","4332144457570015689","14308823245220651122","16624099096598568511","12514541947526605050","707443388198700772","9236039955975839315"],["4591157019232161807","4760715367130981596","5611092941459430561","1965274528371721376","16267927414767911156","12710442289371622984","1872230958914009539","5791448663445267779","18058419725806416709","17521256843984961156","11847562163347715573","12394470143770394781","13379484411486259788","3590619380925964536","17939327425418623905","16375030577205412350","1094375312350926155","8316227522599128554"],["12244224056215241727","11811644307077925761","13315648971536048292","6103945172984046663","10942105140091647680","15932207274586140949","868453619362037587","898675050181446340","7642803461571778808","5348425300769346114","13741553351752268808","15904731116000393023","11589324301495823739","9648424630354057461","5191644825449606943","11655191510577231299","11089569716361192956","7852786098779346609"],["12481517973001406610","11335262923648800465","8671044886962671549","18241817224356960122","13145635261493682746","4145396271519881023","17147902166199979888","5522234379644037468","3251625626760157194","18352698235036669837","6845445819793875365","6864187679124651624","9706181776277471787","1284079067330845912","15510405606321372141","18130679187665031093","15371539315484721293","16621487555274141301"],["228561205908397078","8042196564305793993","16940011146710250640","2806405965641067752","15544535764568943881","3993887596861836676","12629725609738906458","8123640443762813310","14753491148659295444","4659076364732758238","15221959915085676809","1935638618906807336","16953887192496359823","6744410746797525193","5253536270695382507","7193479400549288360","12207601460115445651","13823539865175377888"],["16635316479306450132","4493682287520159643","7431755723316841309","924370346376829714","15482724852148427343","14282136179006106510","8064867057342282811","10444669271543033574","9685062182045976628","11919371850035758859","14455803607191001119","7267923080864077950","9553826100761778014","7680945274430066453","17677351353660981096","8273098385090504202","8000548686093959336","1391394027225581129"],["9226785318111049018","17986194936024044058","13590853392880328988","15881747249025390585","6481721688822506738","13235120092579940296","17056704903857674618","13107708628183821331","13142043318994435607","12472386110997885218","17840239761970426661","10379948867829274277","5044056123774613306","3548393724761280692","17839635241265748087","17658811704762766204","2339227483782212682","1775023214848062277"],["9644161748912740781","8859335056530454862","3274094062242135989","17147155168754655155","1255459987436944979","496627852073809987","16123311644496414219","13178866219219734032","15893939802188510518","14057927806357613829","11763711817861310720","10513207951720646309","251136443749182730","4914469714844216205","15281860645035960680","5706938742329661804","418326620828907614","3769360485524797587"],["3187553593002865939","7414705013829981770","604963345772328928","12284555196146928455","1421774915597268621","15819935171865691898","17932578569579634266","12341570768467072900","4094960516713585291","8880839921962810300","16542701204135435240","6813367696241761863","13946519674694154737","3393416438690005065","6941396945381310415","8931973347849837761","10714011584211289203","15966122402425275074"],["6756904280968296458","6986465368543551908","4455974481643476497","5956917654348498779","7957945484587278534","8117399080968698596","14364705035470368845","9210447799968469358","16095150698589029199","14463565752133426804","2620249065501752864","16156721854620643807","13839127313906658902","4691152282543283272","4621717428256292004","1076053930675477636","18555720808924378","11562085668084328576"],["4017960852355636936","933186812113967039","10023141500089209463","14826195638416719484","13284655120274305228","13899137115321842840","8405071736552674745","9956276780649470238","10656273837672084949","3977224174265807573","17176085670590792819","7259772959758395600","4164646145959852776","6265228449068066970","15366679289198721670","12118134163936910552","3759807066630010545","12451018390880659484"],["8914026648508971338","9032719652691809826","5920175550297849037","4064059737005859502","49314962914920183","6934059862441125752","14721759252565752383","18242696990546885553","5762320926170817911","16714869613777682582","17352259998926063786","17155027304039914885","5174797909969647390","5875439812928442580","1116568458440841147","17598254883936348419","2391973311500751523","17501533586456444354"],["5920860282826316443","11628162648065584952","8847330440056108960","8935403484682906294","16441000001677639000","1214462082290828795","3058138876701117088","17714680701771611822","4355877020338914975","15226994900620004618","5585643776662734563","12034985955870091041","7622416400896315810","1018360993018713642","5248800369009859561","4091408329475404857","14233928250923265478","7273356324107409897"],["1564623079483762332","14760835695823923640","858797022665848978","7184487921101820190","8305226277949830938","15181985270871793419","9844233558578536665","7098755574799730416","6000044540428327330","9555369046690072242","986083776168776144","2117421584208784471","8420574071730478761","1266742803952256909","6040920354758666790","11720236240651354190","2588105653677137477","15444698073977270912"],["14102879914984456367","15510289511743572084","11062062171856571014","12130304758669107546","1785431576026992573","15876105586284265541","1364212771773666260","16786218052797555095","10826196582726598151","1524843075584889514","1921763352810225430","11879467279889217425","3925441415971124796","6942100395284264574","16960886193983649258","7154375804987718325","94363581325366582","10245864519479801825"],["391967426285943089","14206369335142622032","6426172599370655831","7446620469768247118","14248768634597808750","2231305370346536062","9480756594252359925","6116287037988911864","16845906640248401208","12981330247518821568","15799269899459593431","420734459949889711","18019943230222259681","1397031560048069523","1923938589459439215","5008703626830215921","7110834179710644182","16154524733396240806"],["4209322126166550931","7013753158750023731","17364612249470617649","12820353569939274354","2357812089606583858","8308551393549908995","16817300159379161844","10398807207818560323","12899903621743432651","751355282859977758","606006627262704993","14214204610471838266","4163907543552750904","4278220306861826877","13050462344327655643","17674030979692654033","5275970534026571454","391150848338292354"],["9865709030013581801","6993786042965207462","4147097535395495956","6462305492423838122","10663159640779788113","17798277075783598556","17267613066371000650","5483152229671263279","2191708638138163510","9978448063315945177","15924347491807868249","8470492484577401536","636762342923567359","5705075954092893854","11467031102253926471","16409379916186713674","13782839291843294005","14930640420711405211"],["17592294930034363008","310035301648850855","14495818655217765967","12820499381556297757","2448077736258816767","4235410549752603483","5230715107116477221","2669782334230824848","54155910672617944","7992654764816438325","9795125485214470065","3715496041109265753","10548645107696027964","2199333556977309","7859066544669763471","6576816513143174508","14219025715019064264","7069070865400672069"],["2363928562885782307","16956144353887678668","5679925778707765185","3199202712172814670","8371723077596216499","8371110058300248072","3268350469756159433","4426480443870873717","13699973549755003841","2256852159290479605","3110791826226602755","7083905448226371008","13839431000946306234","3094163306376905115","8745212054033762889","11383250191109740823","12812874727129551096","15572824156509729874"],["17801459746044025347","8721711058560891085","8937032908197803698","6826762610150643645","2778749526773638934","12989501092459323433","5876342412762812718","2371489251052390952","2279893502766480110","1502110026471827678","4407134297015804395","7690537982598236192","760527452296084240","6212871313714006910","16065508252118663307","7762005742943782029","7862507783279146489","1598174509878759372"],["6960564327848730296","17830571489850765357","255339077742409039","5336557333529919757","18042291481490285327","10240953578828714062","4301636748297321057","9270558478775734887","10222577426742788708","14059943287392135440","9332058014532718158","2937766181269185174","9137720676787117413","3578381982691110065","11665774804335201236","10826676629915673312","8100531581628353838","2325265823986370033"],["6739177588211933478","1266644094026061855","4253497007018418338","5068352158084432683","10366764535397336661","18212494615375019560","2912943131427359251","17451237868105107438","12544140603336724387","7524405067296754256","14130612477210903582","13717926934237476886","7655204582551338934","937653223679730792","18178058511506480887","3125976358538623634","5520688609679340942","13700236012886790737"],["6807422124507122634","7154753094051220290","938761391135491731","3363371958915773824","14346525087993257526","8380567616708337968","1543396631324015641","12566651786973055036","13506632354585125640","17772715293631057203","15150636996632353837","10729617487050809659","9556800344749330343","14479293522416578954","15318986039691348044","5926973011426626962","18197247869351781630","7580995040727056886"],["3673336040900287230","2197797185154158527","10092006938326258944","16604978688977981314","12218528688333193791","2629500776351072157","7058854625884424571","18070775971348707609","12182471421667290836","15682766440523997653","8256562664390825315","15796253378123617761","10021600999800003650","14498216534676990568","1742060672805629180","14734519742682156942","13027978675425592360","8158782920962516843"],["1674164213591766591","6210641210337932354","1050962154127694036","2259802311640104273","12592135848286804243","15420330864542733570","15807098879790725846","2995722675041415601","1658076010436071029","16268312406591719775","9704225567480452934","2858404167090238484","11517790782169413808","13032866109579629124","6991911354773774073","479411725211499361","6232781220004703071","4324730767583822185"],["8045103168721293021","10383950556074455328","14291781486449034403","6077593895875961638","13444795464357614218","5496428755994106757","15586877591162445918","4811593730674837558","14079557371123046199","555726093940817514","13430680033885314571","4670087853729107508","14570841725365551600","993028395711363571","14604916825963915587","1802785713115665603","4694572938572054717","11415181838508798374"]],"s0_vals3":[["9084680192565384891","8286991336021900361","18121895792061708977","5257318687546253147","12943581211586605732","11159740683249495794","9940581648749449403","18242801454108344616","14621913904330584426","5658258642873757239","11572682230215525765","15305490714740792511","4719134246393889028","14903108131596945975","2324391601967046028","18296875880848670163","9804485833989080042","12875098534150484011","13732625882502643155","14148380371515432583","16661024424700201162","8221733240357396749","8193921072488583723","2045892033001276095","9873117552657277013","9074604823382955135","7688349947235191356","15728558199863920901","7768228429916516993","12417232352268292310","1865696692360299994","15324084710652850392","7308129142894877001","4031748722439333434","542921313575301472","10442316515785795659","15479380654056868610","1009570665038389155","13757687035358766587"],["15859356238316793753","6779224448335232154","12999792948767233443","17725138090114542553","800787758746248722","1948865133216403881","15977976243471144428","2794504426671169019","2598257735850330091","12249038327199318945","18200087291515236625","2135606543917929603","1180213779693844872","1643106641329483875","9683390501146168263","5419317382994266125","14559993351199578339","5392504868873636205","5663676422825280721","15230545750038617419","9419390146868596783","1052566221080763905","405200351941355254","1390357727849578105","13785922362681917803","5281687709700272540","13558138037382996486","8452303813396424474","1002637510086204436","16310732676516482897","8028680759265535531","1875713024103105386","17860366297367594413","1072364568097636208","16092740369213051523","14887606270894753781","13053738877025542629","12601622120135747345","819485589810884981"],["3721157133296832207","8776699264692972557","3006103544319974162","15315008460988991697","16691088942092138782","5051913448224554605","15613808675614247099","3249766286270172331","1704156563176112324","13026983340926423766","11624496721786282597","486735476769888662","18420191942072802038","4119927520774854702","14968959301334762950","11721510875059280958","4870551097662080346","8534835510016731777","7407006809178718220","11479794525711575284","18292842298186577181","9100915405876113076","7344823922057678362","8081420430691255097","2421398557368760885","8560862255863988618","252495369182052440","9078137993204977102","3282938680574837754","7929489016742799883","10180807385630491038","5085438765293555641","12712047005021033599","5291903307802327617","8880891836520136659","7098070976654056518","171333932718599692","2391562234960502125","2538749693462897877"],["5132254580653287809","18284208943331272798","17002174203931497135","11738028634092710896","15841310610730068166","6867350698391046572","8415686811319364272","4021600515377110316","17313574432655214931","18185503238325111262","328149067602947296","15619068875603626563","14254374150140528429","14137151834275685013","7988129639983705716","17386363306970886251","4859507690154065642","4378602534949033081","15408435723644219399","6420787042427926166","14328912253386701482","7830864211618258054","13666267501465658212","426787959912217656","10805327860653211560","9788034811676249658","11704913581645042610","8862720169201159842","15359568895485476372","3808154803373879240","10454029340301550956","15422237849836637534","17393773618827884620","4026301796411849637","14456759072148287829","497401191274021340","10279991228294997042","5235173091007024458","8480609660816746406"],["6565468476018597222","17572913210467791844","10038514510090202670","6377082682324156120","3923345703762805015","5432378056566885483","13985353524706603016","16806741299218907902","5905320640326914388","10674787073734372033","4888360204077011191","10170084832732628420","9934179680015456147","12781622907320586724","1809567718483059967","8368267494986517452","18114893519004779307","11009580895031781288","5706319704958012913","5291600542334748441","15532432740756273348","13844842460281537921","5876827780314017912","14059879986145516405","17375367355713418181","352303055833045876","14081530970100458852","8428321882910719357","1836312307421289653","10365148580092376831","10654607062771847969","15293470209447287613","261239372888838235","2444859230333155085","7492087068205755187","4890482062137116415","18058614750716588738","5104268386396307105","1225439119010810948"],["2946537872225750276","5466083806712512708","6069157908696579055","12459955456950775200","1522590837237378853","7876907775547057654","5734141524119684720","15206986952879056691","269889058653083321","3867508704165013761","14696004056851931527","7454926492360109743","12384113717776808523","5934000483479191831","16946312578675220924","1975216354094001783","1819383615778940239","961600517265406879","10217159142815136654","13968127523514552750","12833678416043321850","16074442512259247843","3094701394276887716","15566230298145313902","3311576153852200126","5577354320920425694","7466510121073826941","5764422700487415739","17278003595789459380","9232871641765356552","17469116014199063252","3643231566450782235","5023177884558989625","14790813770228790399","9732371817946052868","12534610087424810740","7168161389855382148","18422308265522775545","5306358905863383906"],["12397497407517550255","3829683077534133716","10770404670720724998","12662858369856533879","13118875685629570549","10057718947359216409","1281593956157349662","14538366935785354731","9924783318437006989","17017354678213019069","7401520936717467089","9328104910962638301","4549527410173397519","17859502672173150110","5762663046256512382","14425730291825091851","8357043508014551608","16951508426068735872","2117432748920663912","429186418929529981","12787777795351811098","17631640028952840721","11235692725765624661","13457854237651497891","3887535348741861798","6398777913750090940","13126269127128517977","8917862882711493956","2697544794094959156","8906855025805735488","6216892122004180223","3352239927798205648","1112787708133033686","4140707163040526235","13399875912955569090","13779832094835409634","7539764975191358313","17649270257055600440","5391234379685759181"],["17816930249280645276","10279521425308125065","10541880755639661796","1087034532830761826","12127084622933979697","6306675631292429283","8986750726315535444","12021797677176315999","10086381680129555088","15523015085339590973","9131215774370788896","11615054955621612203","14071007605966930426","13309214902729261582","13119564809889637464","1753548077538238666","8601016860566894548","2834397937436666516","14636723532974928799","3723592419102335055","15332164768752733343","3207201109726795906","1748576118445696759","3549690250211195723","11603336531904218518","5130972682686416342","1651810302540112161","2741084767254089353","14494773539530532351","15563091797031275959","15276196471393048626","1574802890242803448","11105636185849888961","4408408366936953973","794231441264739469","7959967940030610476","3828253878034576464","6534006740160032896","13769253121573823574"],["8165791768126582244","6244220601938763322","12216512812601610748","5701883993566510361","17885170679748956821","15971633199263767229","3931423886289762090","13839291736018883761","4295455289126785094","2926835433834789291","14549820677963057056","2454348635020725675","1429506887951089818","17208259492486933591","17951447347853590233","12879030689941195122","4643109206734578374","9369159219548909609","7675056482018746017","14394723444741732647","3353248216883679654","7096226043112798271","9030561907717050315","11225814453433733998","11216841410276964763","5977642814270181405","16461121241640822956","9353181139954212273","6403487542549651177","12833534774870339536","16904618144709360681","5125397371799748033","16253208139260647797","2862414942184858438","16681896554350523963","9881448276782438675","6279303799169093761","7359149901781544528","13314647453453067395"],["15813937027635520448","4991743288114764788","10969373954505941377","6979919552007953755","7636513710560448251","12853879961901337998","17037297754864139148","8100439219045115925","6124568407521541196","80566530758797195","3130328071338805566","4250118298017024473","2108480307033008583","11936434694121544491","11311447630533236805","10916639271890439853","1866209417412932834","1820381546332131910","10187769258087834772","1434831177938004641","14031168360852673615","10804725741592822179","7832995270434450447","15432555339618470577","16649149464998848371","10655264280469025147","5907571763533111284","6291193415163098909","125308457237082378","11440833787865051487","2280953270710347629","6894084425315349215","12725083142883312081","7301617689226168485","15692730454969027145","14794097306098900761","5844987636888167248","13709068317465137445","772731744756699956"],["8476165360659848060","10001009618176855659","15445365493199570824","8062469117687166255","9174318312403619676","2719341899517287631","13104108381767315598","4922004133050732664","10938950300656437142","669606606921761906","3993076348692244472","15193534590463471475","2312445280378013014","13841771467599796336","15553495808164932586","12730930226077755908","6978515655973517471","6086407840301624879","13995246155277367147","3691563062667277462","10955991910820655605","5535436381625104914","5380233108555907519","15070384321051724507","7372499940477570948","2936520581451564388","14522992998721097764","4051813459827485646","10624849829730768347","7006631197258100264","12672342661567666396","11680437403888294610","2490183139031250608","124254567975198350","8088277545148525481","4281652054510808258","7560309624436833210","11482939540106806042","13903688807373240691"],["18176338750503112810","263439099577027354","16010310297430100777","15841218797489610179","15659519979989702990","17620876996665586463","3770169278385923598","9321318888897563670","16578627594672220359","7096123159258580632","11921154737670502731","14785900514862830575","8799478367563576500","200183084528457026","12471127556724614667","15828244446090925520","11253668180353858252","8399126711398204282","3211152272287502235","15044812433773911164","7480626404902267577","12598777289932409337","11692096923097493857","14273101981185313825","15973082210843339887","8029364357960813044","7788918945343090948","15457186732798914855","12418402170265907021","3459298640105238641","10317518581947496092","9688540008876080442","2557059749863847450","9351469432963682355","1876291268337407948","4183846235185661058","15103929025135817082","3910866064284853339","3786544020985409400"],["9667885393609735866","669135420770009186","2170849277268855529","10246910073312852639","14329576507456523036","7908765797730258879","3199627643378385162","5337001888777894980","13083399377673035090","10550686340094863134","12121793758034711657","16674037029977328220","381980889281202337","3296063907487578176","16057182827687152396","14885233619647229269","17402208833622814036","13853486253527438824","7380867128150384216","5146297815780070358","16492567385922305661","15632509366747118567","13986230900250005991","5395562316854430286","5556625465781787806","5057230273993825903","4947346326655067098","8731092749098132943","3825878270002830382","4989752466228645152","5816094094762917342","15755413952754966768","4569607164744751008","12756879458023738139","11718960684160002074","103076550600934296","2021574668999539329","1985524501664453910","13298084091605021897"],["8600320002184043757","9110148434247386198","3650383313610680991","3424230766686528107","7979926290880249608","8886956127288880317","590319577789718588","2296108565261002905","16407602589216702760","11495414399527431067","4610426137455108","5352025737511085408","14645710404334604029","2317920143784906211","15819165300739325673","4512186047734319754","10783568430056918547","8472137784898274684","6073236646156812323","7561769732265309354","9620743032511664885","11423646843085867280","14448997592133600161","4339186900604456596","7843191611709228544","8884426433170864395","4599529406015802288","8910673877147087314","16782163396563253552","2623979904095658145","13872428558112182038","5992832859326865317","2671202076653413733","8411503443328104179","17349309874388116821","5270634691726413246","9696466669137374776","3857864481768222560","14473026009718131298"],["3290700306269947727","15782538100391755410","6043645350565583492","13917422658691310003","5365043111661130174","14434409635001612906","12860210357401600044","4354609005125827046","4579841086467925430","4250128775375283301","10340478224156611297","6696948919442240824","17452319080507232436","1557825637976874777","13978394626312456094","333277402633898408","14688666724903548343","8808778003299108076","3851705213684374959","1636906699204452821","1551746526407580050","10185684329438836460","9000976569662780422","5125747049992724526","6165210692628430033","7641009883517031503","4423635890405499070","3177428828106094482","9955824323108416776","2509759159893882583","10976094237476782451","12218361592715879283","2884218960449315234","11892660832210459848","14080447205623267306","10701703333123824666","3672908783456430749","18336032175329230211","6033180974628794790"],["14748714785460858910","8072324799494900690","17389296428160609416","3911250790575411665","7995485649133112605","1623733803875741902","10976317995148856947","16682335916724882972","7133213890943908117","14461929898945566425","7931209177038170576","12610326676404225571","12958261390250412916","5815245669169002244","4073072079091523931","9277980477934639597","4220495676374349293","13785600982896674530","5902875394295371232","7194112092436315521","12602264342219769184","2656260130532875140","10805656180177184709","2352687454405878220","8975469132457528602","7594385318200699971","3434347477132082714","9311672184739373026","14132797067823995700","10058322528774284646","400769651580189812","4046367280846141373","655162412281559325","11364375899862398766","17387267445531156925","13264550999907502322","13505486996940179630","15167786833799006773","6982512991000820772"],["2915972502740581385","5416866201837512801","13436038245052201360","16315371412050694507","14401330055320316435","11448242234374713247","3015716914765398645","4307185195038804654","1411276161725932046","10214583236860545092","7812484438989310476","1734010755860145895","1330354244511225905","17654244373548128022","18117381514780647576","13286119897074187105","2711464182765432861","9899549638308848918","3900006217006835011","10119599757868994277","1671640175092590880","15425809326114229966","5056292079207191323","4820284919304227835","112907527693798380","6933481473901304089","14487894504933403521","15146371880936021355","2245833338079177078","387739974912492497","9827273797857027237","4672215372072700862","3599102948235711202","15394231363804087655","1238849902612508273","11391562193231582297","10471912340736392417","18108950846468816943","14294360518481136785"],["7987559020809493554","17983340905177618000","14153432696968659143","5114959976082749715","1340010448204058312","14783599557634099040","5784463736205633594","9461209013235759662","11227431534224365994","7163351872071117907","3704169485092108452","1441384570566762738","12180333455512965002","4658836497527098273","2340297702279149761","5013506867443439431","10751959584013535151","13049458948844413797","2567941284059236337","17370404420391162865","13389629344669407490","1351806261618128632","18000171087958942314","4185687647875003428","7741153166088276222","15115929180519973791","10358392739454805289","4396807577465651231","11058051781723040207","16864629846666466661","10599216660261127267","7771984786505660926","2894452830403695601","15172995328113529164","6979508613597606600","6815195475301892566","12657178918431914281","1446754635632502469","6476868964871129259"],["17853404653626718661","7222880960026047618","3597819818091684964","8909372895987297112","6810020614827605422","16805773503385968115","4647621211152427683","5386724493637000521","13744119881971270859","7696801054339462770","17789612397461492758","13867462331535054281","14458373659350465175","6014659348756120760","194244468911599632","12658485039910376972","11950202304071760026","9707182354652443022","61880080454886106","16240933737246075176","10954344282022435270","13360199851973668594","1007053156729565315","1397101303970107058","6877676133218166406","1715158894685765012","17379982385443691982","2309347513261476567","9467029133635756981","7655217594861971260","8025157738277394718","15137643367218934651","16587019411877904656","2798397143041691433","14367002850254476561","10927233289684147277","18053030750252748597","3769051783369489642","2504160469795950313"],["15163201262029933089","11842294684156782197","11029853838255601699","3206916542185256978","9680373054227570702","361831885200234204","14257610894508016310","2055715912335705703","5326496224963037367","7281926768385718909","3677815695599190068","3646347587177900760","12255583607552645246","11943222698829329428","13117459955681869154","8179993886415525600","2473629739669983503","13695043402090643637","2781372488179123181","13148905322863342714","6689516412153604655","5347953837752050011","1734238741493985310","18429228148806919486","9276445404454771404","11619531049567315746","12151221537800624464","1860453308709003888","6852333266085567404","6028104398716759241","4849512596596804350","897143787238835924","3213862752319658585","10271748212627030631","13049103312934847081","15784621006102215573","14559460532025441421","13315450945990430175","10318343095594127135"],["4445173687462156615","8560347667371195616","5238503395079062085","5600348277504334696","1723691163894777055","15986922962211737988","17239418066466585013","8432414217730894739","18402165070878593219","12698332223632052837","6205004681907313583","14111987913690116745","15954514615475587947","9875759802071662320","8519093913872188780","16839923416933483131","17816939819084821962","12275752878580474558","758482681327794297","11291804746974147902","10968113584241829220","13796971359592409673","2565579644417595351","7162450151179334513","1344129920511764551","11664125630306133873","17784724227423780593","1595615528806414009","4902885486266110112","2156619323735736661","9742030786568202523","13746257242174305240","11510166688768857200","15011016049327544111","15988124122860982948","9023299811270555317","3384402565545189905","11001642815261357461","14847146291351254575"],["8392143305140801571","13454909711015452571","14401073478754181346","4503149356987981287","16529758645633119455","9983003689989915115","12529382784037759792","12323874300759449538","17965427501576363964","11193558549629114243","15932940156369725306","7395056610472821270","10832401310109668550","16536534392315130145","8545217617339873761","16081308151935680689","13168779271703307295","9965575926362731259","7705719705441767728","5097397003700537189","7368147511572003216","2485848272762737546","15797880011877367691","12409987378974910510","10806538373895501231","7729084702995865803","4608995619330744865","3758549238749054613","10721144682184754678","7539652478330955600","3877533814504001303","6265315975367299574","12502844861661895075","17205355029379693275","10574949113644227127","13143000711839050856","2449343982136207715","2608400947301203284","16954485955391866243"],["4775315208759606528","2024584376713627455","5974738500148897982","3345872084190921519","6065629012670300073","17709705999119468158","10970929870569401965","5345127040182611544","5792119762109957925","6554558807871891610","11140038660616615435","2141822663967415174","3221380323708266944","789992995642376485","6263177152327649304","12946619174215079869","718914023202668703","14652014617068680856","809512843590029570","15153306743779666761","2033607847343516548","5937380372679241814","690960747813556143","4315334149502673336","9069442385079978967","12194138036177059935","8094700016777983423","1262655452181175524","8533486198680644161","4131799532958591988","7411399365112068900","10287527532230429858","89486758549984005","18341492827927864872","8400993566302252034","6296844215579699302","5606630047019114551","11857681252688202612","18315708713958098142"],["18248780238772021981","12968093549507833040","2938449331782820456","9489681226640363982","7532880748327518330","12626906564000314380","6266635101143015930","18300899204998301771","18099268441638524815","859147299304022775","9325296224312315783","4387569948505511599","7517354596592535025","3851045924752975096","11567736169381766686","12416559864894696592","8038524032960546114","4445710329757351111","17052343881509035170","2599777963177923699","108936939260137599","2791869657180534560","12702580443715919712","1145235663618726908","17323204156290662277","13183278400867190689","13965289211332475108","721545074224534915","9243526860681152903","15264597774739526730","2571656554409737545","6523505140765086330","3651947155647076690","13671073308289386771","13461568534884540667","3671745776939974315","17092424977865588164","9479129090861929148","8323199293790883993"],["7014096971288080687","13762025781479465010","10212193418569070291","15794937498168896522","760151440895898597","1024548744101457742","6136589668550766928","2156168610728138588","14182851038991319602","13597109928341307390","5361314907715062363","6657968799158317964","15598339726909011237","6795741134049554422","5314524830421374597","9098306369189891873","5016002993394072543","9103451361224964201","16160670559312265218","14037973276690569793","4641386970541063638","12503807309108231780","7262148953852563142","4508938232545697439","11896247046146586403","2404688348713512076","224620955214206866","13733425571253955129","12593605221245664403","11587181187420999750","10794862101416061989","1208545726362411650","15611266455323608389","669188790891393429","3132677309618863208","15643980938634087769","16165352168085725000","12260455519528801437","14155884548645415384"],["7316591637563476960","6173327271357510114","2693229788631420467","10560264931490288060","14942011556925831548","982437609938706723","6525170450854430463","6029277827091086033","12650549006286676593","4709302815370753890","14529608439258468050","17671444515264247434","6155229617536643590","3909480066605455395","18225082866358941644","11890921709700439457","4455021777668761194","5901429314348482630","18010067937127480714","8280930748403201330","2475966687870522066","15169270195239799338","16425071649404018077","7696745893379914054","12987966285118603808","12726092992726536580","17800045557094736283","6550106527172014571","10652064301008499640","11911195103216183844","12329666449094232830","4800300926599084715","8346109824902413917","10267285736664300762","14802388528863415900","11176928633479495698","3541316093851454174","12268564476456561977","9929518279995850497"],["15042373789751289082","17675597072838838996","14267595884451318435","10805393972945043243","1541098978882770703","8179236037796972819","15311113721257252932","3006283048273798804","12696944829591281296","10555203206551199332","14411527229738356598","12656419371000239847","5736386761118175383","4729212707498811584","4975784939778466383","18254013601514264990","8819562256764279358","4936373314173961727","5666872634734093400","11477409840626779635","10747356919987704940","5165702438963547487","14853548566179311732","5592026161584813702","15919664387222840531","17756891660601992896","18099526573956379749","2043630353228595778","8718007768482601548","12880454411243878758","16180903914715360409","2401087736221921821","16742237562730176777","16073994965694348730","10174025056794486107","10755187419430976990","17578493999193957821","14172301687928481364","3902664810634391433"],["3540909649486520260","17316426690439042672","6328032734876027592","1063699906103354709","3167943569561577436","9576516438129325614","4726322932728123806","8037304942652830501","11787609452630587360","11156943203474798682","10213740070530108621","2918144814983480245","14063032388569353949","8322805067649150827","505441894091791756","7150957168307069544","10979107122640668281","2978673483401405089","8429478589937711711","8329918855276877380","13566685113130929930","7490662152661016475","8549866129965177944","15456654490446608106","7412557496401922351","12717003513683680234","14803697529997436421","1039459087432958614","15258486899291431799","13836325314832298110","11288218997664180554","694768628124824282","3583992865754112747","14231398713373270984","15246843683327274468","3489335458112474781","17860709103975329810","15264309400754819472","8075410446780861166"],["3662049422721159394","14363028482106050399","14248173713024995888","18006450052280778065","12813531693813076286","9441839280991756629","5733789998215370927","17133002030722351225","55234488964531533","10634493847920163788","12980472154217050900","2839943470515713147","7587225269978533227","15430079252207651267","8589302658118053349","8338141170551045030","9825251037538446817","4206705213422865410","16814950315044174915","18189440454708512261","17951306773608221859","3925883021020354026","17868729669413387094","7171909423267139268","9907138082906067741","6241821971335383469","17771462186176748509","13550221066830321475","11279831252179525246","3978889114384055213","6918652010464582732","18024504867390958363","11869882556711898449","15272501394424956933","8020711644408736225","1422947855207356459","8876920760095388824","1517551564988176509","1472474550755360605"],["264661834488800222","3541024506776849930","7149023638102486729","14643958662689045736","7881173837929268511","4688837281353076143","1142252180408715544","16766307059390879877","6894514501557978190","10009212074074127162","5020832595011479962","1037712590912012977","10790061567159754231","3676190685201824571","14612742676189643040","10876095442600544639","7824172354165196647","933178469692080233","11703582851002865364","12123439017441033054","15791834452456174301","16405312838382183772","12201589673174102740","17963393135954990548","16523114145563126402","7359971507221785373","300109460058902887","9080467698970368507","3049465716738234891","14312295116521569154","8332446492628338109","17984035525579163206","13718222235567576129","3337121212956857963","17753518650208119979","12107329264130231995","3642461052823662836","16399571220252234326","13531876303413099712"],["3220602160249743827","15467339214470804223","7477062705030099333","14972303867919720215","6896699953898628381","2451757428714941989","16828175531003394838","18038005101476131264","1803596791258371845","9347601777622229105","16487013189737817599","12916417800558735551","11580492403106903399","16868986617887728980","2163081740610844913","17910760638863988962","1638823010710644032","18373186167807625061","15106034243127555375","9560391113341359024","10738235849824459254","1713981672821139895","8519206198109966180","2384992632201778412","13233330372894592985","6826386745507682826","4711641746593672860","75316371370163335","14728738065088317632","15136385137981200568","15079392203004143897","14502553224808139343","10861932706550392054","4001170121561076347","1842951486004015214","12679108582777773199","12177842489542439113","6123115413756051324","16702647025643112638"],["2772212075815862542","10470006353521580734","3923984081117739239","17728035456627009890","13771846478237105354","1230793839441883647","12418435581928905596","16551407425109586959","3436236457741765248","3573550308589458133","2749189299321477161","15050450891478469018","9800654932230273861","17252185270675639498","2191571096794139298","3713998733490396247","5965027616556853874","12032187867334462136","8296513355161342540","387799043857392490","16906738283973904909","6702941362567159785","4010549480473002224","1813816231099579432","4045744530492766672","8932075192845714851","18242599422246165251","3236424192765727848","12662110243396348769","7530866884357035498","7694506238792875314","65246774580747285","8865829840973561205","13553067267948018519","7834292805028543210","16604745906052100594","2104095561488893952","14791392515277695432","15284941083970541888"],["13394397741435856467","16089451983297116631","6488092164541388826","12594199657296922988","9627071539173458835","8130506112870615132","18214259699878444618","7967111046172188206","4019480902751742329","1966467313454700331","16021512432879036025","17100022354863120684","11656380688544397543","1431505795219074520","6260862296987946971","12857829700570298532","2399780563389486144","3773543763980459964","12406345800424539658","6861820222462408672","17892781686194257280","13113479384182786353","9723272914043817623","7014606248389285221","4403263532206573290","17590777718180579114","2005728392235775656","898268503986651069","15430719341681977293","18242882110967242289","13248243320773882857","1213891618505277984","17407797691855173290","3617088457001118581","11298975650344130073","12193993781483713660","6989318661561922228","4713243297246147471","17037616304521247261"],["16157046620549021591","9723025461517733266","8135022054521823351","12636771315564811872","16446506005396313946","12908759971930138312","12314091335255105083","4368703175356294909","3075233020078773374","4009188825936394771","6175322327521165193","9154698254050756433","464559101202722944","217928630397882206","16909324779255477603","9905848233741827370","8920642630841150051","7627244848060401133","1904111767480120858","16486089924327461962","5149446314808334855","1758176967505701618","7817090546755335287","12439152446588132932","1911515222341704053","459500541045844809","964889348921517179","8341309361661160768","11433734643953717622","5624189329973973201","2179723835209586876","9920125073637561397","8513977268806224969","14248830290046941910","5787068849608152272","2366523032754662452","4542198957020342418","16785903766143631612","9475189643014022628"],["1431300540342758288","8563903347688627717","4522661508247739313","7726905536459618945","8394209005891124100","18028322169872795197","3070581259117781460","12486651383109072225","14576902745989943769","2907305447572957373","1700327641312967308","14453789634636563845","16959193806561751689","7766098125254440451","6113584151900664621","5577403714112927258","7835663827602336956","18145683631394316935","8260237810478291410","3112810138255446609","5486487301906915024","17487800885586551745","14319559348062251094","185910673738491186","16477178079288644839","12838808978011977438","7162755563940240029","14909371941876547703","18031667759853459724","2165450629089678407","5608002245029298599","2084690997963507360","5642799300664234688","255943205924290009","15970682218759440109","402688821044873248","17017968706642691194","1354210684152590316","614800705050352009"],["15001749300737810694","16658057992938913682","5925437464833028998","2531575142298107704","149850023449816131","1349226194617871952","8306281657914374976","11118475203054537834","8157505865633503644","4961682700050469062","2000423210829162842","7642902232460757367","1576515955789509918","1334643374589614411","13846787906931404190","15767950845209799168","17606104477951739725","6830286418605096660","16758424269946299861","60762178507309840","412401145723019837","16947763482342294465","17257343881564090602","10189007040513064948","867353160964829760","11901713136072006317","15271550308077845483","16889711542001156891","15496448069063401024","11374153207316274865","3567983013203689372","6154194489127117555","16499413136877503117","3120830381619185043","2091170533409138729","4019618848200303069","15256355428822939978","15195175286056199996","14582090035621552460"],["5557449326771598904","9028209176256694428","8619094829974621720","1488588220741163531","12761753993332873302","12591116098043950490","3001578855772328433","12703481085176142375","9903838325468765145","1828035272735404441","14126157710661089670","18233861329034242183","607256152808617764","18016764941488147542","2797281464584026463","785746741336160658","11954897700513532304","8010102977656006777","10454394453025280279","4376974655338377601","9042097210285107122","9913791073878870103","14130510421391643718","7945048513375062944","12245811872471407843","14814357710456427290","14012476960886778380","10878514136242928899","5621720574047963291","13474214189558169039","17604964054608395536","15855384293904584415","15981714436946740477","12572938433098632295","6263711249847389856","8738660509780852576","8011727519820718503","18171086847148917374","1992983860314921535"],["1203482811675873974","16252463305222874365","3823854387159942701","2123469122380917871","15245522607964291287","7227728584843891741","12579325018652560327","17203743634052567060","11117410816810667032","18238539647686284038","5274627429446968734","2403224990974576715","9500123515089998506","15276707091255590071","9915435595862155768","11258850094216667326","12942310454366457784","9655074354769831897","3962257026922115089","15859504577258344930","855578243961672011","12145312381984372975","13404031198070586300","8553513129285894515","12693715664265163002","14759006836680888967","13814478949368169728","13044492104714589361","11919888977967666687","12862904422190783665","5040743353916468232","16234586940214432803","11779181613534326938","11408164871339778853","15617546670278891069","8028302529816549464","14985745984865603674","17857961046980956646","4684367004603644543"],["15379711625075604425","5789481240096700216","6364117321063342650","2826608497283985007","4042742188993078421","794648810231444019","14151932928169697021","12534537578288214772","13690128420430797249","12983369090210785964","4138498444027329054","16461769140059507730","10232688215794277506","15541564335384982428","5702935098610387880","216716761566249988","13493373758770155876","783558275828071736","15552146779668568531","7829150970892542641","2026017316460025007","13850153622495390662","4155831355910784126","3891125901968208731","4622932349786252032","3637767054760461883","3424932994967168457","13731349769030088548","16645253253023255373","17084249681995019079","240217121821900489","3774881814579764119","10962954630821336744","15961312725157260462","18266517396902110070","8922486495529210251","3836860371545521505","2560772175959251072","7803254402481678000"],["10509180166969692791","8245708857897106245","6041999860531156557","15508250312964232144","12332635447148446652","12373112327085529160","11092358901211741970","4768911436199745902","4999733769793446873","5811479398604637263","16069148548568079908","2058339906706021626","15503918264933828665","1402255598717952075","4277823991652302040","5363933125474816761","1040180018348895148","6138078221802385679","10260607819044500069","16481934843209211842","9682572956938730612","12571252176013115034","3527456804155141679","5349809104275393822","17035219530955563788","775089280923399167","11119056055717909996","17653000735459699567","8680211960427688538","968574827451582919","9301438401268739976","10492908965956128056","489343485775465041","12834047320293067683","3292890478333237417","15977023446307917536","877952270865727568","6899790375940945986","17587938951322000042"],["7485951181071558215","10634091511708726281","5513492133200155322","7461113235808851031","13555389188573242820","17946096945811045586","4662371780593185892","6666787137406587732","15197274914046878804","14100214252384823117","11447417797588915474","15388137980932482695","3276099689322923588","12138476962957300945","3887159480099472227","6381565460449181080","11805050423039185844","12170388226291483113","14198691388328789459","2043069584880678294","13305524641430431555","10038362639118679004","12803973527637771063","9035407265624737164","16267412149203687475","9865142358183859472","8473748094078551931","10316454113821201675","16171440841602285402","16990168239287190717","9958593603957731360","9711902294195872967","434685603094519127","14420019147014761780","6979779205257523219","12211728340191805209","9947449783943743928","7725146191592999496","1625067840018423670"],["7865681706263622956","5723126919168216353","85337516084511131","8265976499034087814","10552377978439031152","170177260887904712","17995458977285447089","2956119504741576612","8157003779828401559","17284577387199869749","11217502156703866178","14965098730155142612","16104149696912310794","13665560385995621663","10499279630939161450","16166647355835168413","7328608225646023210","1349291957666595192","16228132364359368903","10842071908310203128","6391613884786427579","16711762345632849086","7130164866876433011","3293554999612619167","4401435598730341541","4744895377815494719","7664380706695190924","1756389834833827874","4531535514467130136","918609780744567268","10060952462137389405","8343309881895809168","16289769598036445400","15875951382604661781","9125615792268874983","5060494893556806953","15439536101515884972","18155121500156778770","14345055408943244450"],["10849473791215441284","16477187236520694052","10948267429377442459","7050527369557036393","7371271367087301675","16826254710597286728","17068128151653785367","13702476708854689964","1539492981265807142","11591484256064630393","3475179035442580708","868052953138715892","8966529695368993709","17574281160561934639","11279031430149121178","13862819893359985853","13882680955959654375","9887238797330799118","6656322234621002644","15111609469683179534","4587618075075627385","10474681891822858499","9520585252096664865","14146274902259592272","7239314908633457321","11073420626083994262","5344582838339772097","5410294143545490666","10045358102950226274","14011658535994489731","7058836277092798151","12054968852931699642","8922611593481131734","8628151517247058796","6071924797923200197","7493893065150642694","2641431204941089205","3548005592918056534","4901548112504853421"]],"s0_vals4":[["7787197955984269953","2524980958209148368","15631633734291493117","11945970511004661949","1053030190499199526","2653912951186260382","15278398844756771744","16802492522799130254","9947869554849416018","4474672166466209257","461277836470027406","1540158249049333910","12142750087439630125","15033975349309700899","11697209310921268199","12197164633017127514","9248316645889130155","14785840888145119826","8221821274787713850","7689167495098996104","6378469571396194382"],["15129033921531589140","7031444798061552611","5921657589436161235","5385425693725934883","59703161570376016","9852186400784057237","13702377428987280545","2476516985025976123","15108001506169859085","14465017950713271241","13290263921695437451","154842410274588377","14545758799741560786","1102258340905808755","10755222583102462251","208937470046622565","2930796879422014409","7240031391134723605","16198854613773392535","3125726118523398154","6219595124443719609"],["13326257379865269757","15288975663199122844","13051850505797300227","18327796798115506735","17782397059896428681","12476836544268488919","701967015096484072","2061542465201682223","17081717406173300148","16838334742178412242","992568156934192031","17675289198988976031","15238026739519891346","10691587473804911253","6040134879472778928","14097104420515326552","7072243988385160609","6271949447708638307","14844607762649701726","7346898147037072648","14262239891966552390"],["16921524232940629046","6575820960969570573","7638957146298395448","6288443881152420296","12804495177157235537","520231285906946701","10375053136768700732","14594579900986594426","13824884655114547482","6385994708720339451","1904921561465347104","16435012723314116471","7072428141435813731","6053009267214668249","9000819593634825383","16757025116540892509","16989259141105061680","16577447873931742761","7833681437850518652","16479192464473814691","3787404947278599054"],["12388905278751672120","7465938077119904570","12082093415157275758","18009549989402015325","10130319703841302447","12341067815152163496","13969534428575608697","17924984553253679960","8002222564752531839","3578497602459633035","9464736240881306567","5940006833737969111","10661875873425848705","10537881049133656476","16561626447254444044","7248160761410258388","13701119008508737270","13729581787373259293","2631022822077822806","15909295591715546761","2618573256810405011"],["5315602101766442722","2370306830435485381","16486030552113865973","11542184329253334257","14147171283899427887","7108530670345024687","8032854674147079678","13877143363642345715","1519459869330133167","16877185906477898059","16809803787724398522","10730730871657514725","6418313411719729453","11366781336531491486","15471253281441614688","2574414426875480008","16795067222051349356","12457593127306399865","246811455138335672","14551317905468173209","2715657535082712055"],["9781233956879860672","5318928330095456791","10180940712749443333","18263756751749103611","16157184119277585549","9554418498684687053","5333361719710766305","10647834524422195265","2014063618244745659","14437450077254776471","15640778092435672435","3886327645120646349","18063196620924751615","7110696388518326630","15247348351737979865","13203439269320350120","967074351727760684","11534430408902537605","17358930127513090569","12437581466620258790","15696965524615827283"],["16121900388037197130","7550139669900625268","7186839820433290803","4729307745164898841","6171143229973108374","414908071644582445","13876752969635011698","10087601953691705871","17975185544075089366","3120156100125121736","9660740043993635911","13233599007791346951","13843614250700301363","14207644656327143495","12781696927332251759","15077602416432749723","6072967514235081435","7022093302341918470","7285114176636170933","2889479624767994511","17322182594607992800"],["9104102545505971776","17254991330883516234","9669620317144521302","6623898813432000992","6471206952744375","12587635883866942872","12514972505705696039","8803576058491148983","15979356379315327208","3720329372687943546","15146876014172301543","6316014985374064531","3248231852824006921","13425037755200524550","8127079970469677758","12732624976352944775","3048622561656655101","6201844670738814338","6808274663936739184","10303441026254294088","3268307884546027004"],["13598735475417508591","4211589648852506908","3631617716648385116","2663967974612674037","872839520612796944","9942805014729301959","3641439928296341227","808739049390172258","9971159907997381252","10370835010291790831","4804860635606097664","8040179710464183975","3971282540842739104","9188189792561013177","11925912000497919397","9129521353120218392","9950317102387007580","11980130344738976293","11877638752181979202","5307664681105419967","1716062673340294180"],["14662871829848515028","2217085930740002331","4622212864109784189","10549781761507697901","10787980785097368242","11528726411697435843","2496650028487138038","15797616149410002229","9448879627380695975","7788254359815187561","13784969861636819914","14883471689602286018","7029503821735008422","3078902240420598197","15585541068000306461","2109220246670750548","7501524264919043279","4724168817388012679","9893807321208177243","12347203462161615724","2654785328414988326"],["5148142582147319025","11607783513839463235","13927091327379784819","3990484988026078547","452270634296519606","3147461111123410461","10485491216028399154","8047656290336830487","11609667131596434121","182697956834608540","3960537565446840053","14357245029839464831","13355192354975467348","7605215222134087213","14145033864489647034","4292139986415504807","6690593633518733468","5616629839327879451","8438571428912594146","17514179139230558833","7524944475077900935"],["3231575520957508571","15286981741024006015","11442930487024534753","2514340657373457661","7753890906401123532","6279047776902176964","7295455248898317884","3990025791471698854","5199555536428049351","1589519841079741477","14492839986462431358","738274962169209724","1152862225919267054","5090914122154019833","7227823056063632662","1371890479254633447","15824618960801766719","2279196037421451461","16986181042358038991","15838110922430926795","8957519168986424694"],["64247449133944367","8003249909258799133","10183346893067766610","11905406179968381782","17426400566846632521","6352914967422009708","5235482696586931570","1758003775910380304","2678858460030039664","9503465871254030012","9331426540597541056","9026563779218983656","4210064938039667322","15086934722608420082","17284412992004256988","2517401206493107759","3743389486652056859","11320414968219012866","8679586901932239100","9266570136781699105","6694406528101747410"],["6520107762651570318","9399426714891481231","463424202463707929","12127568638422872763","17329927542546795078","819506760358221015","11495986687205616578","12715710805207626543","15352101416880130676","9140438544402310438","17453540373501089043","17131038907417279617","10768892045900864125","4115914760469158797","4584340801785903480","12184456900961688720","16720472367183613990","7390032183677564396","15306256153488993217","17977758918231595653","9782714336432308072"],["16168677098797576281","12934331733762755463","4889133787779721756","15964463493085078179","11716033497008333925","12241670369940016056","518472051156109615","13904269404330359342","12097244737675295739","1185431915802516766","2426089522403659378","9510190421143627560","16086520669124045630","1508289407684061771","6555167127231790215","11940255316847474061","17817829366451253070","7727008282600453993","17324136189993816476","16749807338543020942","10620151871924663945"],["13898076954944376433","376574593848465869","18275383474670853333","8467750473771771454","2576776302005271391","13949095232924096367","3818421455332293233","6484497536192617738","1237420300842524865","9594861833260885418","12096936750112591908","16815062344707676354","6655905499298566556","17916458460438981818","1384768690350697324","18017524685802370949","7337761749247323913","4763393400651316025","3529436989546805068","9202695433804790503","4501378463728082317"],["9344308789450886108","14247779148369314709","10044979591207934924","7383883344703906300","10680594070647854305","14313846906873411649","17320968822499305629","16584266297392226013","8797001629569896085","16167184540902856657","12281184282147220182","14219227810884809159","17932970341981843366","10278492640389219090","1315974183245837397","18101769565665891974","10318031044506328833","8208704571495094367","7260573764548093074","15073684515481140173","4833377947901698661"],["18141147733863024298","102694339683440588","6428119355020331254","127262732461289724","17925171975877957035","17960820273801183271","18141074715330309580","8279208310854282780","8027024677701787013","4860246937439666608","15286064174746507953","13222230250889996292","17924188120299877056","7185749523493590774","5745806895567443325","8263509711065942591","15019575313687890442","5834534042710532716","10046675140457675189","1147692594962313513","10771842115493707658"],["405211272457457117","8025014407881434439","8223272774416884236","7056040913517529934","13993758993531648456","8436159808692374517","14349398066708800642","7593258718621714372","9305299822248367185","18005213323383736919","17734178149348315712","474748924213722564","15093981636251732191","10971302736174634800","16494900431132569932","13965749215580353329","13643573387449071139","18339657428176059330","2931462551811408719","9007553500275931286","17711664351953565330"],["16775015973615720425","13180598077974698188","2062565974324986973","3396403628143580963","9803027987135768572","14844625697421914613","4314812227127506700","1013077709798956605","3301714924869811569","13434136952871509728","1499214761879827878","7655192311788665742","14212170566048084086","11623473389323287119","13209466577563752007","5107572717430898647","13969298464565521718","8930569038660661687","6833021643492698233","642552532511650215","5096481864566748508"],["8818031674511200223","2015844944066446320","844784466179775248","12248640703569759742","7526342295281055822","7457133766894452342","902058040041816327","12704045402478194441","6275780316154220278","15667215097378319160","3526932208455962498","6748866942448508012","14576042785716432734","4892833530445740513","6678739932531946274","1469663462391634146","12191784730342400715","4532008935705600696","14349090851491484821","2670436350629205236","6595569805592673857"],["14243570643094984899","17222356741448180843","6843499759337761218","2750819663819925711","14803904727437210179","6410284866643557885","9960356151477933834","6005062294551066954","13874291069721526371","1522114825621943798","17477090979689586769","5537710345909557702","16184773221194242614","12216606119241850650","10740448548449464059","4251501189698205122","6468639928396806992","18057521965050860776","3928927799547498073","12705822525942791943","6115418415838854555"],["10037285825823863243","4957871047066424863","10426681402862947421","4856891242312965659","2035488652987934064","3710800259845473773","2816572963609467975","677339423049960851","15843411327961349971","15774785610287999241","4647524547255340700","4144997880955814750","15369179420541655242","7975178212168061160","7570455653547906354","10206544804772089187","4568652706838356426","5379715390877761657","10128249267604297744","9324135809431474441","15448918938397783807"],["8636657646749605195","8771901452872670228","14857849372827127336","731052948078303505","5333271243907669343","11957522338354197139","18157933889449013858","3270356178887704423","11813312586746955341","2632251837675442206","1729935930903239287","15625552181000606892","2157321043174375141","1940241057757855034","18370753884991859586","3483709145775683038","774346911118677550","610842138053224233","17834754831621368159","4719528354501480419","8891288674180492004"],["13161951836975682434","9167038683836336503","5154929769109981178","15597682511054826282","10626888492882319740","15449272936203836637","5597665648332189054","3603662744634035858","2620675476786849574","8372941809979024485","6433246676641230250","11679078776161941229","5527773715520974628","6638006286411827694","5993254118339520897","12056693455695010226","5346978451748389467","14154271324605496463","17035697306344932555","7261079585492233926","4280570376202292374"],["1856212947342410309","9200539296547254260","1913336567187036026","15152610482388067602","825608525907812620","14224545909674320787","792669881581522006","11708829096221779502","3592495386267626966","4680705314645321147","2197425160670696629","6981854581577020410","10904361350874073038","5002909158579100723","17664568891855592537","16011672110712196011","7889759263297619444","6849170114739949711","932576589899435363","13462884340822354197","11479949553187944402"],["9879871814304747206","12275509925483435120","4042804224024203640","7625498576135550053","8635359953793965364","16702023209110118237","5921752300220823063","32749785816104810","18400627808724840592","3811145635439797392","6697913055699844725","9602380350506035055","2467747446979626452","1896850405658406554","10187850630068917531","14453857840382381851","18072759425856553134","4403426070868448182","4016326248171262693","10348031741004843677","17410963743509681509"],["8802348902930819432","4478122178315131658","3661755251387219456","11917348048187658400","1850295720468078824","97999786832895145","12220343242454927125","8180427661527754867","11900871577897154651","14756894189878052918","3349939518806051582","17157498721969752020","7931375801892736926","8609274721151763256","4434677531660895759","1870313186011322399","12817052634092268275","9089484811152124535","8469680247871322570","5240608697097246071","14369119601671213394"],["11681262510867029614","2571435909901204914","5148604236408166716","17445746245553348771","11301197200124276344","6194610853004218922","6465336274753853919","2355888889629641677","4718272031295275860","13459363055655058781","7877523631274985726","13241262659751776292","9844784291442721074","11937940479878636069","1867507398993058551","2211817201289900656","12843670028400381166","1115570460630100138","4689426311347694378","9263038077189781153","16809238052657334602"],["16390197931713264231","12886237448714828432","4828312957367959518","5352497351527790997","3350548141529633098","4818762318011703498","479352523999540712","11888038082479302576","3815347986404981392","6331278287438729131","13982641143753658333","9922041467223175873","6206928302779942926","15681871217209131963","9309435687315151775","202625612244989906","8488533221210759294","2607596513690045596","8195774708429477882","18325255414286082348","4582160025424570201"],["5774146682676506349","485569936023895097","1576294824046378624","4486102244937413818","4454805061263791894","1732543327734722761","15016100105458326678","4737008017608685731","16428478320474533762","10558000299889146352","12805053997589972489","1378373339569128054","15362648077908399746","14802847486515190620","2053972965449705852","8412012701001746222","9391492458111628307","68279677473145030","3855823807616482564","7461086152664700750","653814640926849647"],["4825140620075053511","3184096405126682512","14699580694188439813","2441487476890003750","1397552568758617077","7355144246115267140","7036376340594440874","16654479335719145135","12273552992853531817","277319929484142557","7069567947333129506","8871143247881589390","11063137328461568511","12007812570280791445","6639471653461870561","6438449563682689753","4795297768978360680","9270409890750156123","11118313594186994621","2220355665603169825","16364347187971409346"],["3197643016613741518","17814656829167887532","13559469627755366501","3220388512926081314","10480279190553163647","12928282435661099959","1643189489900345211","1595837804440148260","9715155363569224071","5336599482822907829","18302294019759111468","14475837230869899492","12763729471251888670","10521242202935379773","17767379875583274069","3664494252968121215","2015957570149383543","6761162204847538680","7492131028166909186","12963248741270665785","6640932968910194294"],["7463866115796954521","7867213456803262209","16216508943595346629","18233615096475682546","15239779809147748228","12460067310213053318","15937613707493841389","8151438446626311589","4629750410311218193","2343075336780903717","5894514247198506075","10783996532300233878","11496620781847816584","2132917398162780439","16861065243431376997","6519013364180069538","10363271395990580387","2928815949096379662","8850363555793382261","5443214915231266999","10987244733322066283"],["13987183695740982868","13588381444313383869","656959341056014369","11198785629634438988","17806635955635731502","1219640849982720745","9000935727377482226","8029812144193065685","14056091839822548492","4176507573759681242","4359687016299960742","12618139450244048358","15925431946139809255","11268815151608912869","8549371732849967328","9345790429276018104","16253834626425615110","9017897850622422659","11587932859633626981","6843395732355012017","6076381884170177746"],["11811497889536629566","18355175932002182593","13074559424824340483","13978893032372464137","6529940254568928412","13432284491474827711","18029669794817586319","2908414609831231193","5988710599999905285","17918853161170381894","15015769556416863360","4236186753992530192","1891471216153936094","8597391278643072397","3263588399345867799","413644523403182303","6454740659637794231","9971708405861251897","3607945137484956737","15107068697344317983","15835388511461236410"],["17571385641482173989","16507368528020632512","8997959918733975146","11253573604577170059","13340604996905035588","83375858422421922","14661049168619056573","3215307272631966562","1147257768153269119","16774851327545448484","7611495261317016722","2209281004220939091","11616938834525321276","7404253798175946724","1252873996945249479","12902264999276842193","17134154290888647879","1652887718446371979","12550852469912001725","15079313326442385476","4163339683017144038"],["14961275145580613038","795126524682367575","8111538484667601367","15482200155119121864","13553375679213271170","3300028690557185982","9056891385169869271","2789526579299822227","8279390311298401934","12493238231378275019","18256738016729502178","601774985208791743","11921262295803841446","3877296017470645690","5853837686340342114","10868715545735005846","11753530548833366514","13463912466837028264","1496727064713171502","14852145911396327512","10557831853092169395"],["1068758011456452558","2877753818601813339","5522485970510217969","16303829390116925346","8032187283771467112","15570119868379393240","13864331375415094668","2753333230594461433","16210418047249187545","500189315937766195","3685498660677284532","1672374276556656701","3903990242783315313","14279587072191112774","15185356697459394925","11324742334293259028","17481668887324342682","6805577764968502301","8284722806718336184","2822855490346884950","5969570682182540665"],["5879929250830146659","15742418757354837042","16644344282323470468","11664253033855422901","1203456892816230878","15623047023014505347","2968207918061714737","2720188681852135416","3105638491359090720","12460331076846864125","3978101571680591525","13938089444549154635","14206995206994941559","11736839026664129068","7924060067166161963","11319259756328486848","13372133437225341083","7124335397782062234","5742942574518247869","14210225327471968466","4520950649604117632"],["16186597276845312334","7855595466167240780","6433866786868538173","18070508485619987218","5172479459271654853","14136468250962550989","3054582194859534492","8007982879286814032","4028980506254689314","1589524225885783226","11142084090618217936","10219081312058857385","13885417551851305046","13406530516349158020","17098535021856343289","2927234167920605645","9577698504676446994","14847265022215281327","2588584779678361007","18433857963276718388","13582039250433940280"],["11014965769115276192","13136780366753037033","17686630372858901122","1834938519729384780","13005598791033781550","6358780185479957914","14126792548186931935","773552984707479610","8616625572563220096","13840896173840624313","14103085434303029090","12829526245584412527","107633128988790175","7446773790204152160","13479640883969542834","6998770931679201158","10122161479832009523","2625009260849749233","11306001177561901998","8139064283511572628","17248096073570938674"]],"s0_valsC":[["15702620182039109022","17330792659061999405","17524072125910300468","6248469256763591023","15670907053133972681","10550512022418644504","15004146957552169449","10908643034220587884","13445645051821774655","4066654021358999811","18026101038030874690","14255617589099293498","10275415160998775535","10479571774531718005","4350748833296258655","4012105225442821898","7435495071613978883","780073898568327037","1167443679091055059","6270812398004313802","4673552312795228727","15244208398343677735","124419463292408807","8926409644971249798","889865361508758606","7152558217215804175","12056952113723610547","12194383470289224473","4562422911304627554","8260148227618377672","15801369347868255680","5098435259520077265","14631536277635478899","16561650178547396584","16143563902547562873","12075224371726307860","9704643345948154231","5021436674843343010","11072510295862709169","0","4335058562581236993","18398193470455182711","8652112859618148417","4769752043798938577","9390048932419927657","1173269561849459595","8749742198268765328","6742910050429602239","12310152720905155077","14194677656082368661","13314591829762727145","17911309948701459520"],["6749425968889937423","8377540835449843158","12480785808150980167","16383428766441312031","14128016249499406443","2036318340099303304","17039075953944501056","1574731547460670253","8517843418600739396","8097225598675668815","14056783944365634728","471936227146313377","2693030083057883226","9855810344703816732","13285024538348490663","4092008549893293599","209678088401622123","11237177686228534076","13301584046085045294","7704752116865494544","10247257915775443438","7279481826011568219","16239993679695461596","15330542587139921449","13707554399280655177","6653962536920350516","12836869836657187946","16784144946927361027","12683035586559380972","13476427237223495663","4700692705744900161","6482070477194660066","3234815399463092247","16447544063776416662","490344973596560313","8166829274750795501","5168176523212764575","2596206234191466012","6649245601888140490","0","703140490921567440","8727179718171255070","9088183388625123599","2058279537568663244","17535281306153228267","15367779381416506264","12329584692632539719","818849429590366543","11832685724253720821","7687494802561988140","15350375628048937764","7611432931178985626"],["17097824045566734026","6216189099936284735","17753219211756305389","3224616880058321773","1920438415271389949","15873952989700318539","6808338704572387722","4943378859071966051","10767413855119070154","15155739621645701678","478346487524596694","16368660417197235964","14867338171497386538","14224017119784869056","14695125031233578917","2345566864732887844","9579215725722292252","16072450318297524917","3651085762506345337","6669617118448238351","18117159717712780397","8539148413948651160","12041621455266253974","4682010618796928122","16193401486914925917","506063981152960599","17771066067494854462","9360878691927223186","10303511711491952809","10438337744973628558","14495636272867981234","3447213858527544601","13072218788736392689","8898622102189128021","12769778658157769879","1090067333524220276","12867846576021893705","38552840106966238","4139477301931841626","0","13528492683705113367","6933263318669119530","15188992265915860473","6608623751320923733","8307545127979070275","18431111554550690770","8294649256297369209","12437910739590699788","6064661892548946905","11741998454673799837","11460474963895193253","5358770842067302276"],["12454731255210581543","1672245476658923836","671617662994501964","8921950175782723256","16592900468527156261","2915571499192147989","13530490410649853204","163314883728303770","15073577841055524051","2792653724417255578","853589040553252294","13331481780766909817","3618967709894635609","6533272017904733591","15066308884085357214","12737193415563060462","8256245963827854391","2841182215787667584","17614041907822296785","4320959133920125091","1422255553030390633","7376110198293885176","15279273033507205153","3934269478990154296","8758905846477029418","5438326161582576163","11255329787355500411","11781428730075941459","2807423590571917446","17992817967635197806","5574085982792138857","2803664986558212111","2075008334952279059","17267731597404630043","15911633193377122787","5449283050321522218","17878670442291045319","18057627163019046959","17577056169015635023","0","1897703036001629242","2652067836812112790","149570642422752395","3775274400362354270","4640495237914816722","3490008319973348083","2018542245526960260","9205705717069008242","14561843499268837343","14888142283484155375","12973198605720301777","1656257872426276857"],["18224266731355973940","229245235870779926","17015597828770830433","17294112191571133654","14882903136057741866","14743742440381860355","4981758995203984756","176504196220661537","5571023663014771558","16258639231409865727","13172257095228257180","4064541258081870218","15284594941800361809","11005112345818034428","16867637079641143024","4729898437972509161","8334731520530663700","1907554485934914503","9057069191632503055","2566840850066567390","11618588670543331018","7087033066538719751","18265227795805076130","4309576887825077862","15086154256151883963","2992765179152254307","18128440050002554858","8923784514429430965","6344949302204720178","4328263596035103388","12758558735312642378","8070051524173743686","13229779221736017964","10733413312636597437","878826192961894725","17882718387224743574","16480147450636259088","18060749563894945048","3447971450288091488","0","2087785813771977336","12030207018549494152","6613606269283541896","16001917316963045671","3387698842407032756","14955488497796636204","8353100780653004020","12582018679343436038","8785873811494809257","12830270641540004593","2326701165364889238","241627287695336933"],["16983962628728784547","10255195159564263434","6215537346385167844","10778464742387466809","16500377586634475107","4285405875040590609","2107429142450156404","10916226090436216810","3296296533172790929","14967547255376512720","17232095643964091881","8441889688517040593","926939907509722653","10218236259252146653","4055185019027769704","7888915207484086705","2280799521211157251","7742780205255745981","2079737443730855397","14015244552015729129","8580209990289622853","17379116923298050913","2117033916230408449","10578705507796099203","13997438807301714701","9312481998484228521","3693578710173845486","10838713867332577679","13106127264200336574","11961343483785234505","5199298840337952952","14206301138229805453","1554116485051943600","2240948473705726859","13964416829426829133","5556997588964822843","1079840138257993092","435973989932367595","7948493675665977944","0","8697441570608815823","9790775978145962029","16401045917430853843","12305494398881531672","13601697767729875730","6411792720879381487","16120129526823797102","10759814321749049871","8143849805490572598","10294048429062254975","4911486060566400273","12650382738011277872"],["7252213153616040285","6004589812072859930","1184152130431874194","16461037784313455695","5018726194157391500","15780565449244170587","702913677885351747","15849336940222634943","4201546264004881943","5180203806110429161","3542700419853766116","12362627144034832493","17271769296638882505","9660620447361566708","14289896400539778830","14720905198335253793","15561477539219446146","5938564521618599521","17948886407259612481","11964405146168424937","3435266128397891703","13545425374530605704","14279549228328366518","1880074087785832281","14899512191659336043","18169539077023486380","17432241164069225682","17996228414873433566","6911389051540578654","8748154819944112420","12638321607618260261","6961260707398995370","832806475788398705","6207211325520429624","17053444153886181268","8555843555715801035","4988063356357731149","1069689558459000862","4770215105778318393","0","4389412744500566714","16968844405136741593","6415429791273410945","9788929356771661112","9799893488513917955","8347774303299186430","16706842934656005241","9539262155484335213","14853018530347749524","18235364361941655319","16853118609310380772","11568867470110338440"],["7702665124680439560","11416576761065389707","14442665940490881850","13813886301544328014","1541393128895745983","11987075984164320157","11788728064103227317","15611074134197714853","16016091867104515696","7042585325104405144","15374295954862993022","6361900450877590357","8688400522493262067","1151516991554930440","18220294084788269909","18150061024886975314","3947058283529005067","3450032734686750634","80452137578837747","13239657282797902583","698241743695026636","1751709905265556384","17153237161283170466","2941409911127126144","994818834059455272","15217632971512317514","3047529676015900095","13835703074031984043","15398455339441636424","3765443065204873476","7069475462573423561","10657612798043336208","7167813674399523371","1672350045680189810","3734741323689921195","8951410442163898515","6570815729250308893","7886812215571302790","2794299633249398721","0","14040186662811478977","5729480173505495858","14833002757866265943","892383895250025235","7350290080570568553","369769681394968561","2549457729205935209","122644257500320648","9556054857085461644","8100869828216232040","43358201137567284","80487269960366217"],["6898209548128528953","10721021710188480249","10081825304281191687","11371748516309227725","12177888827538089263","17107129894889208682","2999739956328643108","13737201408660164489","13058562361906035851","7248117657518297047","7409090041929267853","553705334993274336","1319782188649862379","3692933443342280224","1597233676665597909","16324095047536357135","2103162645441198208","10651748222646650712","17362384517402796774","6608229839240977328","11519162249992145298","1689964204744013106","8213910461918524363","8824918352106996027","17209785332674135584","12990456669678697312","14510199361531363688","112159855448344627","7297796139773555189","16054396414323027761","693854043013103365","3472665830192365662","15215779496517800258","5695763410927085045","15851877574321533450","4062283589020748811","2313869031519219924","9293480833176010533","3377102855621694309","0","14098924432584063532","5692433753726326617","11078994024321815429","241887935301416923","9486898014208921848","2075648291647807857","15701106788777788638","5779930785232655752","15403215497422395660","17096666801723042401","7014983926258511281","1767090678839106032"],["9432721857435953309","15473900052944078979","5275988708570944692","6205517582408481020","11305533858612899358","5318585555886935277","8750021155804672582","9294309251037209197","10767142335369152552","12608345072111857982","13312609752967975496","969599283334941952","687733613032766978","9132141901174937722","163400066553233412","18182715862518099610","12248135598804889228","3451518449713499278","4869560688359119971","4745476654663278191","6571049756260462510","6760008418329591282","6568030983353893255","17961438406866620577","15695482957058950654","1091681316148225402","2404829578149074446","15036334042116766474","11204251556868237270","4713543972817327491","3083793790096071609","2295195459391559583","11557076883366096613","15062173901907832730","489104446148831383","8348695660108099619","34475043868420414","13672987166027193200","7917681801631888604","0","17473806519173498831","12375785929427911169","1074037735659630102","10690378165313169191","7979286002177122837","6066446132184605743","1947112311079509071","16407662873322027392","16799960997631009342","11637691453825671124","7094552936238270251","13000241134606406977"],["4079496977885016937","12092351022748085323","17383268510310976893","9196779509954879456","6278437482453649478","11282432679525971962","1891751767267137735","15578581258982152474","12284113987901514512","440105002042809928","15878324898058821869","10976027403927629430","18240950424140531440","7653109381121756924","5502695419892744380","6005282560562733749","3576668782980073227","3935827010036593456","13684931199094927746","8958247726560072161","11069442023032620884","16495788155853797297","1106280861249633072","16526179455948523216","2656273474948588498","155932566309796393","5336394745833246998","7161941814193692701","3011261139111694839","3478638371766755555","8162988360439567219","6609458744402906100","10126394095321707580","3580011372111099551","1527238485282624896","10568801214734113334","10903530566539191150","14867477022876742696","5772101364314056065","0","17639474207375739074","4303580784903403095","14923602252692596925","12825815651194646707","7605852183288875242","182158871932414572","10784416966725891938","8789783487138072047","5272515914371558559","17055290836144868944","3297408989671704973","13043590231337487651"],["15673922149494480773","13394419415342457749","4730295333220612964","788743438487552617","1773309713495264790","18145897871230766087","547396597671706106","14140742944589330341","12760335084861114367","13733394293007064425","16877842280182613006","1427243356115032300","909606224901357310","817392133888806713","8280255465348545152","5397018540478598839","4427803898825031489","969456790611255856","16014442918486562391","4178118894505033643","3553907905297800832","3851656560339802849","8398116113651793798","14343772510980334810","11455858983084398304","17422602553326816604","6375855138281286172","18218137415955595038","10449434401669919981","5299398443035556064","1706704746987698649","4418065523956980948","2183187839348644481","10601108600062872411","17519573910083523759","10305618326240240419","14228370911292131027","14213412184258948698","8414570801231506184","0","11810784107299258928","8225038026139955884","4420586389411496457","11874883003601488518","12573213215079364660","12980635065600054004","54441139626472274","11166912137771944209","3576003699973559995","646608432864243271","15942138474042632256","11094337203217288749"],["16761268383909345706","10256157420042731926","5301570225614885037","5213750061689132061","10705041201354499122","3218228121658782266","17877306298944369762","6716780204051236867","11157922608435638801","10382431773690495553","4840297325750034311","5360939134514489503","9460023705780066194","1592023571666849509","3214551912952745935","5315065960180539421","17715511059709774552","15925716000015175316","1362410073971640382","14116652690147139882","11790244625308011697","10663885560117981221","6846994664189290003","4431090513083248050","12891909453654897049","17764032699289270976","8034183600725146283","17478661967995131014","15743721733075111754","5051146074286347123","10454688033341235247","12025899193808258878","4775330898394254190","15726294500196532389","13204166539662512487","12898370925758571404","3583109402771360541","10837570650878280885","370012403859166232","0","14356951046668527303","10903127686273258285","11727025736343612246","18183380568706055475","10380132538358837281","6986259479896464271","8799296722291898752","17464757611677750854","6694941972949355014","17717589783377527024","10543136887328513851","9742717950263930865"],["16552395221752386622","4237063550192319438","14560338748736687129","7908003756489778849","3318767571061703925","12158959147381202649","3832826174624239067","11708142226639165150","14529625073942468184","11979364605412851496","11184268599161730389","1882558970107334645","15299576385727843839","1997610304357689625","15196344805030924866","3038376434084143240","6511237114761238720","9215952246920081086","11391237851057025225","17287722345236467019","7249797955658860217","5569089636213174692","12374288448312307123","13515672935728073597","977883301817390854","6156243864204101561","5306701266427059678","17332259177916057834","6645708367978583976","5785818906369843444","12387478337454367481","1935733417466784972","9025013745538166978","11253094141970333381","7106279537994410768","12394187316967480621","3525308348752246405","3535464145281201140","10159947655397912313","0","11774848582225301651","11995664844952392149","8476851078955429320","5900854494437559300","16511903859639531150","14965151269436920744","15657361852993453191","6759548100868309025","8604889742932382565","3624093471245847681","7114068365271683997","4920113092841109509"],["9572177330610994899","2556412907512191813","2744772238272546654","4555492066603137240","5422689047118907263","14569166049608084188","4410587761305987701","17021486324085174010","17338565021199174861","2565988502982135848","10592144453694557643","6659614767683816610","16526418009178344704","10352235812801548232","588961468567779495","9481228894884026528","7282018091129861264","13252916533115244841","7102225029039005809","6844427578928462912","17844713927585022971","4847142842778488392","12318786038309185968","6844303388673513288","1408074996627528398","4470978182578235763","5595808601824247912","10803744965691706873","10069233204989629824","15719683055057321519","17618809955077809743","8979748608705226037","8611287728934564220","6099874091517836842","1579340738849181326","3245405423280779777","15090353618854364597","18157065766419856162","16748137760197563452","0","9782632959041931007","1109606715484823194","10681612629667669256","14062893997341503184","16938733498325722657","12363712188778038393","3235276326182977204","15164102256887293012","1017373944446544027","3655907967110708729","3915203695729802144","6565331696593663332"],["11105320697488672540","3915556382711326114","16438987248844669386","2184412396404800918","16906304610570124843","2400930625692015545","16270542712190511756","10622612434574949699","13658842769464033180","12622433213685529233","13544586842531409186","8988548670603796486","5122249016722471365","15057301429945044399","18440662885636865335","13283395019513674740","13816461095214005433","11696225727660381639","10171761606313658715","12704695814573763252","10160667385599433895","3460963916872797953","18416671219658503891","13715375526069707796","13652773616118905291","12376554764032561789","8001821066465411517","3946612893565748102","17007536799746831513","11686575312879004906","17759472604369893344","8003449158639194156","15447931831602069521","5568595736969898567","1199755486973994206","16532682016202408859","16584361137279003986","18439784801397672952","4731192352413690058","0","6942410015652884863","16569121510387463364","12988219206040953442","13387362406017594556","127872918429420525","13819878898135210933","5244305612564605245","7049375012928327995","17972992815111739770","2264373055263307187","13558489545965714811","17764502949957226912"],["15479281204595847394","9585626661071328374","9461951013418822136","17499434253033492357","4991768345329901522","656605592071542299","6198712668029360738","7807748901586681559","11654535359527229463","10903527616992850442","15006330778299387337","4609019976879431366","10656087064534412073","10201777835889099608","1892719716491953808","2868525400055470920","1019491220057978679","6139356810240243903","6767393192522160038","15983265655918699361","13199100387734324747","14588231212487939404","1903536289940780971","13066468006687399914","904280415979003648","9847194544998680893","5873910243592940030","10071725038351678029","7763840478184782443","1889658221153890058","6930372943130685738","4339155162631244889","3809871062104223085","5480418848872914727","7328094476296644337","13917684932677228603","17937405969908477198","8349098624432535034","8340858899705988914","0","4562234519322352955","3340540821544304615","8001697657513042741","14879683965618031429","15552667800190335847","22323256258264645","12568682858404504996","12575972460901377238","5084953304392563954","3070808735470076880","15496905082137256316","12491298723936993217"],["5135181597718575088","9375920794928473265","9865619667439271817","421312850006794571","11605030355447540564","18425642362823810809","10806314069798646222","13153456116549448720","9960286540749552080","7833247574958426480","10953152297892822072","8148988400138996303","18444235599482160020","9043341371897919454","8650699190450047885","16934846636697144887","10478195098196258957","11100070636856842766","15302359090508938517","11064499707194549488","6236851181144487420","5666347969521688516","6791801197331977208","9589947385478612720","7446722048112252705","4330418231505474100","5736289428213895413","7913319964671542139","7020663555686066820","8743624819054111584","6519557732832506394","7694094740999310308","8441326644173168349","9085576344543745100","1796439926804973859","3742674552792351413","5502662594162970013","9538826754408120069","12679573646023998816","0","16992287192119378085","14135269461072371844","1060033591756637001","4375185482591933019","7863296748046356649","8425115099615894445","10200024308930551650","6945529361756723932","1917578097746054864","5225678989816166147","7766792425186317908","14141131533794353983"],["13314570748251953583","12329791721882668566","12455563789576880452","13942162416997815563","554248623730641879","18378540624059279643","9358866181157558201","17322733012403725167","16538393655718634285","1426378920294009491","9084360441880012532","10890717758361418055","6750394789240697471","12205011099554515645","3345949188489432408","12461606172887026240","6979406842027264277","13450972903020492551","6418764956275011916","4786853065473941680","4481027154832623689","7656875005618130005","6926862970989200653","2489124391331356052","16649029234716335824","11741055098858319513","11660203209565829503","9623097280565946564","6334972155663830544","1805869232332965004","2074372071987209814","4039848807715619791","5574334591379454525","2502998035334631888","16668558711229177789","17698728815206631642","555166607170461661","16674660576414543530","13317452269609928452","0","6221204967273441946","17835603720671817932","7128841514176189457","14535222858730886317","17713362815891809540","6082400758228639738","8446167899185396636","12199538677198059833","17389701195146397641","11011126070560208336","11644907901376605568","13134133920019024841"],["4951510546827340512","11678818676054225670","16669210325416584686","2949084643607886487","1665354779688454743","16209687622771974207","10433064842775834563","17891171477987468568","5765396053050949185","10991789569777019999","17149646537825792835","5857186161446152386","2348289777219953518","17873067263615497564","11001934310206900076","8119710931130215645","122752362055370803","6828952532582221738","14589772519796996736","8880048918308813642","1200889178217506893","5835950504192004444","13371461244798307613","13009771541920700425","8873874466303347247","6410020516819066881","598786231199658744","2647211352445934576","11169934844515539457","6712122700773918641","16180340893438228016","9872452197248937176","18161974080219316237","8362736693495324216","4865584632242036053","1486988739176109104","15119990174342013390","17352329236506251502","18113547113981728620","0","7969956707627433411","227925104072435640","13586264235471495598","3664778685466580081","11899707409731276979","14940960462186183090","12265436416455289066","13577450338698151283","6948899636575900597","18194278416915992825","5722984223095818209","6890358286465790361"],["12081459889346150915","17679383474018412294","11514650717846698557","17018457369509494137","12695224644174670981","3002061154752670704","11082315969494058296","8815252082896468523","14288954136533508342","9062586185406000042","3070986784774728114","13649790615007536325","5100712736109228619","11767056558665697977","8429763604433572237","14247028672926246100","589261545695945505","4168716116033449707","5125185021983829922","10640923391232191218","5063450347698608229","2775805449119836103","5497080612967087324","8439741910537779062","11057703267927311059","2016380097519022435","17098917735785528975","6676746483021932817","4099415022368346808","240249538329090205","14959046634800956268","13929479033139086004","13031296981177324022","7954048572198226113","1446746058090930358","3533360916923626329","1310535115782163259","13255984964658842736","13653851626837173798","0","16951762599927395720","15870402316541062002","12098143447359154166","12057656325351005528","10301324961590314936","9895714635258379547","882432219015041029","14153997494138945040","11516753610282325184","11160787837015640954","9561758742244522980","10680198917619635586"],["9324298436828924815","1936753264153199604","2787885255230973944","8987483482626200329","16582926324098390828","16503394738446707110","6165879592983590765","15114892960244977825","9065693680947484489","7925227330531867401","4883846426409474866","9341751924848211031","8853113590639902989","6316946637107061971","9828071647356460914","6039611451870861426","16722198166887255955","10761965077800982407","17277587078409951794","9674474470908102088","15719836944961041446","1136376379212724021","781084133574633288","4180150780160722866","534667386022731254","13242320323038583958","7163337600013525852","15913815337224722431","3297880835935407059","5059940156387902893","18252252917764484566","18024016727874453664","15569549343942393074","11947860671016244234","7147524163025325820","10959604140931782101","3419872693391864284","17653891392669634052","16895940174770840531","0","16952495811081636884","15674620244950882989","2547641261582401642","18425273652477353386","16590076103119602160","14139865888080073680","14749771257287069199","1947232400868828062","18014228267006043987","17610152714543906883","7336347986109108548","3033083168816717154"],["16839187840889426896","6929921163585214430","12236691663338097650","3169828654340026602","1466595493003058372","7662977059543820154","9763161845878220878","17201401548842073254","5372321147607808790","2139178606430229788","5220199226335690291","1168231711165741094","9410196207205090238","15610263820994784157","4365289114953276715","17336185516134286485","12342022494117080403","6946540580995155846","1986186918685790863","15745011999879228956","11592119963616514362","14801151170981461714","12084833524467118983","13440702740306480453","9058845487049651153","6940588663066713654","16904645840673210428","5603051881349945996","2977669404314702698","10336779547722753227","10359392406572829664","12216159931667879784","14746576281711448565","14138137067499558713","1141541563989166798","2883775176714740346","10044865055033876338","16480381397844719","14212449253258086895","0","1118410791326885542","2040735710993907977","8753524235263269393","12761971501607744075","13681064892459134071","15450952848366566520","11638329514533626364","11698285031354042773","6579326122367770362","18283871739457418168","4786198652417315308","1173537211722217365"],["6354237405630370539","2513304945917828563","12822962413992867416","5233693309142522207","15676417446337710226","6357394933258465815","14888617568176554967","3309470884631070663","5328637894111977819","15038760805831964528","337025937686326390","9451634912315783621","4931360485973034400","17027171488408194156","11369779922952259641","16988972939822673786","7637592389360120260","9237807565317340279","7780974602973982893","9288837283229824207","7404154552699824679","15968734280251201581","8033684462647353271","8306603418506649822","3298353049690390804","10499330278583043492","9647312505596655831","4304912171717423349","13700292068297434273","9073448813740817738","2185419342108649118","841959189674662545","11860530101505928845","2002915379930561337","13413530199444431654","10717498168449289231","11723635525954074457","17727038737862023848","16792814527856299578","0","15210915998943556696","18044121343466010117","14601473761032866741","16373237331988639464","5911266808195912334","7573593079855147606","10962691013361941926","4092439267652867773","1903312040708797186","3944544301055381433","1706517772621912577","3733140079536997045"],["10118208028259111532","235896041166154450","15072995411336130551","11981714772966204751","1591249541000395650","12616463038891790169","8361654728265048592","7895803206341357166","14847228281844111563","7162323685369069290","259047267998129965","7430863018011396158","8212014662849418090","17645944979413676561","7760389104586260062","422837969050536420","17421662410140023368","15577727307177441","5104781526122382849","15642538386978162778","7568336829487055054","13268959997448271741","5788223069119156288","15003827684107311196","12039511813724020113","4356183984721646266","8505481681213110853","1076521521768236426","2879520616446308164","903612412740592594","8279774955738959808","1955529996491718036","119557435526800032","13765174454660302141","10152430921959710491","12407681140137677898","8211257461948608379","5847914591535805184","1912447619283241943","0","16642813750004325168","11200999246520239239","4768550022271035052","6966123412751636364","505444282189207884","11892550858809340773","14314456111633312668","8183174931608850462","11903002232638239861","8939267853332776645","11588995503468241663","5930038809013625399"],["4154119578664361724","4722919089480317994","1239838680663298459","12615883619920642789","282917190527462635","9965610957154286170","18124760457489369589","5744148249947383765","771138073049585128","12375360260006631202","5583687737474712098","16759856156266562533","17091997448357431422","11271753916744957424","12779473034070873782","14880108236424437637","12689506581645445405","6138224015231115325","15250863088495511189","4606882565641399468","14225103238485302958","793830691510761246","16786094237739747330","14615389615854855151","14745674056391838436","639742296088697923","11713107579426948404","15128187696777608188","9414024286701777178","12455073449248064778","12310388382110082344","8190710334805580303","13700020514214463921","11920623302892357985","15083117192063435203","15243075778500838198","12852646994383282095","5150634919101891129","1175939231406271613","0","9632980378876394225","1818398259876935060","7530647992210001116","15687308099581687315","4431079740596520832","6762637389252176357","2848297161650045604","10154018576731643788","4447196113510346304","14005508988298834825","18393767974761638204","3985255426143818093"],["12008483460534155412","9674300674533146674","8083852191874978456","819268408316169014","8521166458614649259","16942851454441901674","9833186807538617726","18410229978040794484","3240757191707754123","15910082965038092550","10195576144287712586","13620819813119555063","12864282880311597824","12324321822183189511","1064756727590987854","9621989446390154061","9492097841225854227","12868158635320379448","9876934265632661516","7533788357471820189","2263722410269211415","1398213571376504681","11364284094933928660","18307980249403588179","11392889312576433513","912127751248635954","5918323903260556083","7563308887122867066","5014982848859684774","12356976574210308709","1688464849666167516","8135881216896701806","18234321181611074267","17884381273944181753","12569216543193538061","16961847875896333473","3305764644474738623","1175002360915828920","3217759848674520200","0","8206060392681687655","14169623998792632990","11592952764061562505","4630733211597080653","3686063493216256142","1522601545852083439","10777255302803790773","17118872206726964962","12799432882028951810","17528498953649452535","14440174330401184096","5068178209502916992"],["15550354329512640739","10184244423996090728","15903438064681553049","14042827907406509583","3374190913976242886","3105398140020073294","8860969555563957878","17698274455544108732","14643307435227959896","4808391754454690030","16339123122533045081","10358693455550066962","12304751003995887890","9869058768199243157","2385693278379728346","10035628690105344780","13553082484266207212","10945958561887844020","12771751185563106353","8205025661042379501","10986175813285937422","15185249396329680185","2397513167874166447","11035860064498596074","18118053180368171058","1824814252728580236","57975717664637127","6468998122235179919","8700212128229808461","11698162224806429466","5001854658584246132","18283732103093827560","6527051161182221568","12802405103075975424","7485332322709829565","5890140696903849194","1568557013304417368","15826247697818870635","12686222071878290665","0","3936828256031696561","15006350078844630374","13032297717778108442","16108273003037530015","12523838991151005054","1051656324238140871","12163647832818003979","17104801482089952144","17183057840468930283","1221588309428094403","9045632109376501239","14516843080233731206"],["11854888864039887745","17139110800259040666","9926178878782287297","83669650301604296","18230664616954362800","11528042539820687738","11429161422437168948","15863798305967433960","419264587308503896","12917643517155858983","15700035809956229630","13527755356081475820","2032076010113456845","3915911709762147013","12860808311839594419","4534251738844613390","4167283838530093646","15509241145722889938","3760676683200782252","13709770374615617650","5898222991161135069","674040959911811911","11056917382817412828","11421019162641115273","14137004661075963749","4263426408846260237","15052144806624968973","15433624835362757936","12943565820936245437","7139287582124592657","2648189221993598516","5608619752928790147","9427036236815318590","18112582220102953853","2021481786893048390","6427733914802256205","8184021105106826613","267747561435068032","2311662136451849458","0","15372867200591058929","16969852019534439719","9659331193437241431","7579018895472577396","7749357909824496063","1475148099107680177","12795857747840271038","15850605222506206699","4701925841514348241","10711795623306434094","18058048574418419320","8567034431056694956"],["17375931533504693196","11541263802997402050","14099729664002106600","16081074808761251542","3435983137811362184","15373331349462123294","558232583863343978","3217959607735286687","6843075221247574992","3310080767873470040","10448858050113283909","7678435322739661678","536186811645507440","11416613493301405383","1056430678530122259","9660705453147269611","5347891104613059585","2953925575472621220","5111058578138412281","14928311460440094538","13054751890362594409","13893973741058349206","2101909084928299928","6102008211382967460","2539131017178439411","969511500830300691","12139161366331815070","462501811423568097","7779028862695515093","9522920907855818290","306580206795210661","7494169178945571397","5295031624310358695","15412401407378899484","7600685392934043207","4642885215525148301","3866023715215206206","16364564752441597331","12821748456095355517","0","1639306787525643704","3347423625678284865","11591052188124768321","3347691122981640693","18274132640174840572","14639613634352274229","8597994967317254735","5224288737675854974","7065293620351498066","5694896529848401522","11645513151309444674","1939038314224741379"],["1924523430472087175","13051848380039683300","17876605294128910240","11337104562503369566","6708656717215436235","6953059794530554705","13160323215218163511","17962456199016478517","7728355896357857170","17613028496668689395","7263831272466162769","14252607504532958757","3632683506816060074","9331656142321645266","10898342926910039936","1868953009873037160","15063580765394550308","3985503835657816966","6872055076260184402","16651853916350268128","15259462565095050756","16576094435677045011","5506805526096869030","12520071595130865565","11385338973730774335","6377189823275546680","4552193038979138796","3696776989302571590","13448812340160003027","1937298024087184596","425004918596405245","2728433530929687456","3468277110197548067","2830687999851977659","5213985812444044932","11800614556910395992","13273273129111537268","15756666379955202931","13768454531380882931","0","15074441537382122027","10743506209446484482","4213737394678752225","2624169450433822068","9854235134221503132","9406577015423773377","1411232231047965458","1291309270966964639","4235656206631592183","12763666216584060870","10955136182637874234","5016103106090787711"],["550285009816768184","11114380576185489564","9873116804083748777","6147063560830836341","4233276038664579666","17905805923104499799","13316845798654423800","3171442343755628965","16691499666470605734","11243419967626989140","7448429398597200014","12453332648211298044","13493958771952332499","11231305657629847889","3173814368904382677","13866821708621241712","621794441336102905","15750948262224735236","8556492424790367209","10286614113444356166","4988313985314042741","14731235221672339541","11914134342642597940","10047893333332464906","230449196339903347","1657988538716224334","6890180759558819474","6139089200051675983","16623625215692203623","5473813164045376295","1800572881060932767","4907455462237166306","1981080519942170416","6079520533990537012","7911279610191566834","808316882498012559","4290920858884889594","17189643372731041460","16388676530477709057","0","2795347028395000634","11873122807002946047","15259431995408058383","1404117955367927717","6042265850431271008","16693370780210619732","8373511936699443345","6015348845200512175","1348109766531510592","15066392434413950880","4487915742389990453","886246222089599957"],["4656248953901800968","11080877648989971266","6048681763404428255","12213720139415708226","11316223280543504890","13058304900010083477","15088971537786467446","6873213425829834382","17156306430456600314","1467961816235903995","9896713561078696898","8146938721658385784","7952059720982433076","2189513520869512854","9042204583161744612","12871473662891542074","12103178550460835196","1104389810935681045","584928233702092497","7999404566641744980","1121972354693340521","4441911400326144793","3942730084271724767","106720954547949654","9036949453479199826","704921682461287682","17489604319223802977","15112977476373141726","11241507982222363254","5433208831172660196","18270184321084739668","9710563794179844668","10412257597650062986","17774554103788308344","6516699905205168615","7122645578730661316","13876742317890683746","9909265124200752381","2156874134505958372","0","13872166225394264347","11969276324334628349","8934059497696588511","7277895468568872553","977135729714533278","3622163412626274361","8117597596087707013","293818484137979912","4519837689681261745","3083896202444562332","6992790129627186439","3327017574087602732"],["8616558645625411150","9369593346964130915","9689025613352872893","16557674631837394947","13096370882414466198","9681120252632265784","8313799186849645912","3612447178231219485","4443706135843157676","6744669893721250215","11340762617245698338","1699646483494308507","16140726279866708004","16799397370493324700","16085248029853949930","13738811518187462296","3592829908940632184","1040759886622420942","3649945607220530003","5455641691926095174","11063736951683252205","14612101417996103190","15828811871369531519","15744310696832855523","8982493155518350731","15121107342985374439","11718660309858883263","7455045691399724380","11857629607852249443","8272512074471718087","14911013934601949724","12347876413443228293","8208851672955503395","9791321060654606526","18163432255434174204","6175481314408768162","14740398038366659358","1349253421432793482","840670016438640244","0","12036732201470513659","7637308689048039980","14912173372428583570","304582336621083434","782342785063432750","6798354624628212533","3050882012891009156","15771104985014518097","2075688898460070620","7073727393687056990","8976808037922174207","17775775159360277578"],["1711299561304677889","16209449787380646268","14941288319433449562","11736643921496958953","790291151805459569","15484442637058067361","4676306858711502285","17122175188700564748","8874511753915512846","7954993708221634967","13348122340109154043","8607418237203447279","5637350063832887872","10820233267867480309","4165916505257986415","1667287435822933986","6046480350340930057","9848299162044649593","2550523679358270212","12228419087723953838","12076089403088923408","622333043334879623","12752993327017246974","8432227835087556050","18217697303273643744","13163084712956356650","1170688511356286168","12717658635959839565","13933040640076064352","9223234784566996502","15646618030979784186","4206614133604692616","9092785336884310649","7073387629713958599","2922842457480768581","4731037796908481065","391617963182857542","5300341316309373671","2809986594584129987","0","18054078031483553433","6900183191943799501","6160778032243652241","17810502487702281674","17699214762350923388","6814489426529337342","12005983793234752623","17562095553559312959","5507915142789105856","2530492931814080638","1369980592767664399","10127437536619000128"],["13252973858564012951","3849355400952634951","7033713245435738926","383531132868857658","16256449369757800586","838349029824351629","12960386691332760021","6648979580020182897","11249704056027025500","12292223213705301380","17784940208648734730","11757494510623963760","12872008627492228663","4972373580079411634","2728859845041484661","15712806494340190943","2386017560816381863","17378568604889274404","16150724713763000700","18336363711402327170","5765896631078197985","15400071460878347387","9319305341097299190","17450799514470537867","17631548451475582512","17446930392061055199","8390602499524089059","5064167781101977936","16434461852281283822","18412493179069870544","1820083580402277075","10157693110618011486","11815624225675818627","14673309408930491923","6147280500557047856","13195961567008391749","1758180551806713165","4828751975974399513","13266433961997324949","0","9854252643472959361","17557302834902786574","4076549358917289113","13322463771628655428","8627925528699693974","228461770278637345","17610784610696409193","7281890832691574642","13994138413958986342","12005633276947115209","6961531292326154475","1566763051460216709"],["10869074504895337431","14010815441368990735","346638087306610107","10332242442432739085","8071426192088830411","11868706512090089796","27817314762396822","11913766168505410168","7710319109232303285","4507229717423680828","11818336856388270460","16565768263916791937","2740312582724814818","10870800145952751434","6356042757588058594","16905004302138671462","6452709791704805760","9006123672284234837","8284922310134674039","7562545114869892894","5224000377179604946","9100503193037430065","9492554799895244381","4461658885197188240","12773912744006547726","7188626738693516460","6758028094087874641","1467596253137652172","6552848589348884479","7481984990510806520","1760024276774585238","11849337098094883273","18298406310728453715","13223120258995692745","6960637248282436156","12455778520426724181","9063587979797465615","5307906168961154234","18026283803985134777","0","17647750896179776840","13269355663088854543","4240259101927055556","12154796596315338544","14721455554303577918","3261017144489325384","16243762910529265921","6590163921292143917","10058325761088643701","9791797213026710805","5453846235488731097","7815808881896369280"],["16968422343103967268","4404906956394396134","7097469920755766329","8201532050851490891","15012061246553129478","5048711115330776887","12376784574764055619","12724310407461075552","5338139846859200019","15077478166611440582","827136203259462384","10704900830317486391","3875594300302057995","8828201477159306275","9266872614656813404","348251997388678292","11419919736420157557","5740406909901988858","13285523257585102315","9889279520348362497","6876601118567796715","3903577993978743337","17671074697834433738","12494890241920833960","3397434951067383864","12675903671157710451","9965462533329029043","5373026443366512200","12639468883272642000","5745102998048076122","9342665737291893782","11156491795564989400","14124084027609493062","2774731627092541974","6075665055968672445","12946698883720960845","15824204528654475901","16268389164459003662","4440419471619331640","0","12453188741337369704","16189153491387446495","12451147568071226606","5593492552585388156","8139582374968671742","15494830927655679729","656420200718091248","7621612267285116291","14072746559130115855","2327280207292732589","9821247166981475542","16164158395628327705"],["5833250614329651325","15607503744025581133","5354776152405187377","4674583597635773617","5201998914449115178","17742788721845730759","1964697112723218727","14060497680920125517","4841580345374773214","2860947684137371017","4132264594720088791","17893226488446445667","365600986906837406","12667279762477203854","12358065138626815418","9396179472680878856","18341925507975400353","17730661984589615924","12438006720320147374","8323352509869735394","7848931824650854664","10494677975768753829","12092812033256327307","10109825651304287470","5209957681424922982","11072451805387922986","11798414876127580736","7199216359100700472","14664151690236936398","7709934562897423350","16362107922472432227","8354570078533367447","18092128562413506460","6657132891505430617","14897249911213176051","18086892338797399681","12155851186144231172","18182774274538693583","17442378516296625812","0","14145039435480073461","3145780018522053891","8097773815379093651","5428916349053564444","986417661160424660","8605425294529182172","3148657838947132683","12725715600807473231","10742314625751152424","17342807289842105629","17315932855275675167","1115493614892993910"],["18411805362544169859","10914875166450048305","6154429211064991351","17596876254897931494","4207849560234090783","18104376230387552497","11273144180497614934","14811084636552668175","17962294468824448529","2527243960985621004","12557649299288634537","9260539824920550195","7903729881482135187","6927689974832555294","5209422552017895800","11396178438925542520","9545229065270573820","6746326272839673490","1893051942211630645","9674316796311680361","13385170227316420731","12347714727184333838","12722111852568697822","7592612631864369405","3562481870365120016","8175833931636450854","535147390543021484","7221246344661280279","1592823827245474719","1394658343706704786","7410448728507731873","16033601822982804762","596633066301841371","8356577520039908373","1860444583563509121","4125745458730712756","4753374857227403953","12451981302280608417","16849115299148605233","0","7161213056991478257","2018715237966842062","6170470330814261312","5291368468113850703","18102170463574954386","6856628669875032887","11224048481506200954","6635439132798604484","3290760684010966194","13528219409969348316","15795297665006365550","7480350491084446981"],["16451070998479623192","1570795985328120488","7849553323080550899","12836589867621333771","8249185573307092696","13210559171244409660","10346789859749299108","135329549729871592","14600411655463412622","12878368213025639841","7006854380972936834","1990016970972067231","8139691293637264810","2813415206342922406","9555750891180610919","5506900449977684647","3908687595795786063","4214320417242269429","1958583897314360530","5608748373687149764","16826830567270919890","1991570151803545981","13762672839255280691","2337528526758895662","11158546832893803894","9583229680599307162","16861461520887622812","12556216245082801055","13692911280368824044","8222835779361203425","7194421212822937418","14445248540846378958","5358721300442875102","12682747781263179176","1296733089417754288","13059502273284796446","6168827630446793965","8009176003096305847","4943581873606095846","0","16127615725210529207","18067999996570974311","4962843269043430352","10177033757808099087","5519498123086774865","6290361633022726423","5282804700703852028","2135645182751920511","6435950566669622602","11972992060005337661","5999158082340726281","5148034716394877599"],["16083515931633113063","1028133464780032710","14091846020904325703","5504160705968994256","1327539367269439441","5414313901076177658","18255703841951164408","5642491541028734192","11482965718061428828","10797704126379178522","11668544685884305927","10204639719368716146","14285896299589142998","3034764798790510771","12317669316786951707","12144739560672259145","4505033699406740185","9957108558730515743","8923742668784023025","13038493227120536425","11560315893422209985","6040120359445727886","9684421234284366996","3518033600700650157","12415396607995068002","4355573660889129371","7905308675908849315","8836236719758860838","14356397070832733027","4281605371223644278","3880367127578384360","9396463616956176105","18147604081853024722","12228668603837218496","6567586403275408752","1448211442492793065","3717907947639855671","2698594089304100222","5552853975292128136","0","15281491855436783101","13445219366205315650","11428374742967180565","6943020645571511191","2770626486246196313","6330801635279559564","4162049159708647070","15558908252856296487","12256884984627899373","660400806788280225","10142287943889436404","4199460082044309587"],["584995058131826754","14927020026238779553","13878036086639031743","12370378218646166316","3758203048219609351","5544500146642115448","2166776135643535328","14401724952630909089","8171091549961969135","13924956853246494605","18364937210406875114","14358086240933862359","10024102814024564306","7177852151315811711","10121497421044375080","3865654619431701475","3327167764179892360","1682405005613562424","13661629202909289223","11979032235701123453","4287614818509639654","4894731396119984197","8821927497463400028","5815552679653154789","1109968906549576735","648990805457782910","15401674628343431415","12922730898378995037","5659511300271313674","3402910156338758951","5248235719514056966","11109971342890548595","14189947501974479032","15632278901169086152","12138761775331789177","3381397969934951346","11721507445326587716","5751150940192905330","4668831269498066673","0","10341748375203360725","8940836684645350495","4679885788900238244","4512189361394695156","12436310702565489424","6185183289185772565","11905026323775125530","10715502101976976948","7421865222164001765","17136191541391877110","13732127203980636491","6943286429654499260"]],"s0_siblings1":[[["5849987302632407961","10574107983781857705","9178433588309654352","15727320589131088983"],["6207372726548695605","9514794124349929484","17537083129522750025","17981894402814991245"],["9170351948802155640","11403149233733098135","2400314001366370252","3326031687821030272"],["6620041267628578785","18312058551125659170","6646554887599859160","5300375323037715508"],["15724135958308279052","5652897011161625101","13651100987534720303","9710833816283367949"],["17688816350780188071","11170863380642521956","8817261332738619980","5643356055356172369"],["3554667833955766576","3973381039250754695","12301085223090386570","30263338957182064"],["11491180037388951182","10321959747767225442","16601676625672400972","10891574317581602077"],["16283345811894952505","6355964239521559830","15235251678918536976","6452208121980304135"],["4749824801326042194","15231476271135744534","16941921809118213632","4323569357668135087"],["11285039122606410677","10397838259161509209","890407396246153321","7203221622910708470"],["13729733744391038267","5092035527316824843","8385437247262440549","17477398844524731909"],["8856778576178066786","9198129642556061121","8407803305161831326","11817910472225847856"],["5434431200745911265","14691064942168792158","17609026985649820365","10805776823555329737"],["337231402804714580","8077979257305471246","14329374354536882637","14800577351050338608"],["15466506100176618329","16333582735583284834","12809660860274511692","3471388675496781245"],["12977729802668480281","15789287165315125033","1297870227457331409","8321730014392144495"],["16864342202106395729","13092953743114516773","5785668935358111656","16693285804382929832"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["11466352152060473518","10023533136493311296","21063230416608534","13046265585805006829"],["10674933097137427550","14949138175924769788","10598055568378919668","18444379777475385909"],["17677034805747291880","6401470634068553058","5212973222798700361","14274260493562527823"],["7878546914018330413","3694610340223180950","15489563691628422600","10775419765686577133"],["15764210780236030173","7863028811663965506","6692323133408062344","1876351691073986403"],["854948200322836017","17461467067257625229","16926167914150774119","2708065431485109018"],["16968977357287317072","7196173690021156438","194600291646956289","16579532933348380367"],["3476168960868735025","12453994646315068455","15489179585528550813","4372725238471980694"],["12501370035257524211","1296522615371427673","17383054482939814653","8421494290041357871"],["6438204798982750912","2337029891099766883","2152478610920246430","14859136972180907047"],["12259246335866754983","13110208374358492485","16430350430255549808","12371826743525088236"],["9781107286502465429","15443378771184858857","4487905167315773918","8703803392724447530"],["6805838477820812703","9015340213684753620","5627788950520119399","5255313018244179449"],["17922695324684403395","1029034950176204458","9207119609117971060","5371010773051644786"],["11468860502648533536","558409823859936273","16707113959132661469","8817456508950544454"],["14374386733718419415","18020737325054730450","14448183990729416736","16465653702714677985"],["14062430659433888013","5522528290827087302","5863963040541568986","13894972243137872001"],["17108932367942582939","12630775932771425354","2515291940317901405","11389748248235572085"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["2991440266825360944","2703901793600697983","6777389622703801542","11571397798402306625"],["9416778334681769803","5642555633151012906","2446155518566014320","5845531451504089729"],["17667907496081756578","13089653218785870504","9799281615796496217","17961397429062795403"],["15464844477824610578","9395760647376806290","10106223961613416110","4080733498395081660"],["847085994151873731","6346412879497190530","8757595181651657989","820453625551005414"],["2404653456095811821","2324782090035688578","10006886689707351589","13763088476695623758"],["4208248367405319878","7799304034792335611","11488402886738202455","1884050669306952816"],["2848292543014086862","2652361089642627001","16592180381625824042","16831640016954900240"],["2357141692530046338","5641560144814580627","11222657159566787300","9957964028830066309"],["6223058883798043937","14528450638856404206","13970137252836670047","16947910400214344204"],["1660601632453622649","7469081008947517863","7105477867233388446","2628172879237129367"],["15325474182301232384","6305269873156725727","10899323508879457451","6771880410094001333"],["12121165381298070111","14069298456144568305","5554435510544120947","5366177477521541606"],["9941608078321540348","315291352225227577","11891974849187428701","7026830405705518624"],["3144864878947046495","8017205375453447667","11618457262776790640","9848720507540638290"],["8767523785348792204","5598778600569347151","18358333157443238091","7059169177643110736"],["6613542684918552882","12782018457752684409","15781838747618175306","15601220492502607326"],["11456419350200144067","15181358887973993757","8956386547615247379","12519927715702197076"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["17410545171092072939","7336790467389388118","11500054853271979738","6371775562225371990"],["2748343236071165032","4018925903092019752","8290448760114091775","15285387190848402218"],["11819528325100609855","15566995118729128756","2702568114461705110","3107164780248788859"],["6276620811253091780","5392304447113609843","9256979921375387179","11162581650716130253"],["9028209830693515994","7047572745333820748","14912089290572791426","1901480927727252517"],["18106475782549892841","16106676697248414212","2502903382347025083","13435450945251411387"],["15624352599893120830","5651166493741057799","5881622258378320985","15733314761060858965"],["11251356452555078206","4772385733842825005","779485453315392122","8251065933139309091"],["2286812139339717185","3846485852345413356","8209518017277934130","12406067185286838070"],["1073785180896031617","11578139521107929552","2103468064210432410","6146340901940742758"],["17882669189201470080","9789934273847865891","12358876763943494377","5182803590945391610"],["1149458875575236171","7170053289584636283","15261499292491851728","8420132601036823839"],["11863143741033584524","4768624362389324340","2849041566387948331","10207273342396780842"],["8260496034805680859","830444215330321140","12189450399653535279","13111675295632494355"],["4776952290236328360","10109508940811854477","5988118501346490555","5042090177075083904"],["10025625218821946163","14574479202928903545","12883074517464299776","13309413125148105760"],["7552740708400882271","7191043301043769509","2138972750611310384","12970676103004067941"],["762254802277811909","11361379650952294341","18423126383407357566","6159456941787920072"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["9315542337835790793","1359984454977339421","227762367084659198","11365253646179233312"],["1137740876284736409","16956010888536665168","8029164493577109284","9056121527215034895"],["12959933546883092289","5892632918029150836","8737408903619352812","1983650921861064832"],["5822829003992084694","6024592570034878776","7172430166460151069","781905860671055810"],["16593506106901127339","17742975761244175971","7470487015568040262","1516402520566813909"],["13344609210602779786","3200931796821040025","4856471258943369263","286176856471419481"],["17887743428399719410","13804228845910896373","4601756750996900108","5942534485250556889"],["16073819334620666800","13433692018118700181","14344615682693601126","13315261597042095037"],["2086416536138560490","12340416374961113842","9198444995490496174","7166520052057014220"],["14755022724252881235","16456782565385269011","16160143323135894708","7893146568075830975"],["7120515917914765006","3779043980580173247","1471498906108208755","12330213776502628881"],["5021753058706310725","16769432485818816507","7807220853355858062","14678185421176046022"],["13425416704587880523","6914246407933516944","9646705632351659123","5420234589336734292"],["1569831351878387586","10059601603796995991","11007636982210804855","10248939587472811265"],["3909043352410885293","7547713173562574967","14916850834687627509","9577180255387137221"],["397825347336616561","7367525089790876320","16519025385035842950","3157670171745751840"],["14062430659433888013","5522528290827087302","5863963040541568986","13894972243137872001"],["17108932367942582939","12630775932771425354","2515291940317901405","11389748248235572085"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["11794055446609226975","15879714275081294320","1524174731439842442","15519273340013824867"],["5369009409729569303","7357046428997798297","5467773927774884958","12738094265393693326"],["12412734010146165151","5751118465755893238","8123959637991762681","5713953792302611108"],["12120655444702859754","2361403680488065751","6932282259583473002","9984717903723504217"],["8284962645021395362","9126024035075442841","12418634739432829183","16885955356858033738"],["5578941927145327775","8979894490613222881","11712437316492917733","10301857760336368282"],["12060718951202749750","10125472669647970778","10564328456632729570","847345814642542303"],["1217451440758252522","18204387878730740157","2812672072708264327","7443454958963906187"],["5395907766849593909","7879822402311210811","10429561653196482638","5810155962852448686"],["10005900687544384472","13817787069070847942","12341894094440792297","14023465125877053640"],["16724339922962799885","10933865036807184026","1634000986873264409","11141505176135657386"],["16340464369602334732","3843261027077362565","262148384769879516","12820111870384066510"],["4677128640810856281","13401311382243351053","3800296501251092439","6812388422146138770"],["16777439662589773420","15588589766224233426","17668266376017351124","12559457047740186306"],["4774131764022080356","18065517031388918313","17211350687996591998","4223573692068681373"],["17583566877458762825","1555282204926497381","8257908802377156680","3606273031852838090"],["4861646964739341654","16305188198552134191","9968181303840145699","16213847495521612154"],["1549469353783065951","7189012296574114131","11961480880934683781","8719484788711332339"],["8347557174667491875","14639421517199848165","12089877978472413413","7613184640890046495"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["7796887661346477445","10627441508042861115","13435536780476126516","10915898303964222593"],["10908850610453744740","7909261075492700481","5101627635645372140","13955754417122250940"],["3714649518248418746","11080638800812528811","13955401509457574302","12219876152662682887"],["12252918203796167440","5142009939864342906","13185996880669693529","9995206440171534409"],["12163189211997167025","16614858345386285993","11021731254157852523","15526799190137344313"],["15818353383883389334","5266896998759614319","17120139499610615638","3698824852768714888"],["4805626178686285569","8650468386067852438","7255405727690555130","12888227206253766385"],["14491718064996944530","2710049689696911352","18436380788272440763","6969082948063331790"],["2795411443985160718","5994246634952212930","8689867462366183581","4550998829576722948"],["11518972645376312942","2998530719953473643","3076148027101159274","14132531687003969649"],["1802653950670998246","4342722297664795530","3637768394406087934","7050731855252044441"],["16180897543266037795","13396621932361881982","3339997247873844487","1989117915830851120"],["14992480700416304454","30172259732725553","16135312646423410825","12172047445380205264"],["3490446452297951994","15249230142823947552","15668169834325607508","13867387121201813212"],["17115636996181027966","11950659019092232385","13315728637100652795","4481753269208896748"],["2473892335782060992","2841240534595958593","16211107949107842421","13830914405494452440"],["4228022637372650736","341725962158541930","6264109493952819459","4411875945531224794"],["11456419350200144067","15181358887973993757","8956386547615247379","12519927715702197076"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["14957031611645762623","16899032309892097917","16100106716965768564","9701466980512291837"],["11500720442805154185","6732308380747078977","11051054585780609395","2212667963078220415"],["1809692481744591509","10150193869288219215","480162266489612963","17780113542334895443"],["12003492172201165072","3171655029838784363","1113974451908580045","10659284165281360318"],["11795098365900250815","8751978568510883871","4403277667198558465","12338463076035626445"],["5655302931325576455","1309489879684218342","11560831505278086614","6758612723703201775"],["4535453010260355979","6174510663391028627","17656655519181262741","13313679670242209395"],["13966743750091998198","4331916428465646824","2655682258845774576","7775177162571235303"],["14005001213038355731","6873130121457236430","12949937120639139383","4004218373591165395"],["14561923945526055407","8323757984357228842","8616029077629501273","9756585588787107283"],["11256676006721138768","18143894424205012812","15433522326904137362","11685071078623632678"],["17807948853786632294","16221637209352123965","9398944435745538247","3717082984257533337"],["16352389587542266605","7080709529846292077","17897888755785911546","13737017267305056617"],["4865283411586672555","832580763555426044","8775235019065852529","13009714937403168079"],["8378018639277093956","120113403793188653","12609251952961590262","9155810507531273087"],["10025625218821946163","14574479202928903545","12883074517464299776","13309413125148105760"],["7552740708400882271","7191043301043769509","2138972750611310384","12970676103004067941"],["762254802277811909","11361379650952294341","18423126383407357566","6159456941787920072"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["15430537414990053767","90415953590497686","3909172567401269892","16367121051221969082"],["10974944193012504487","1123309507215171674","11729222965722757804","16433589760922562692"],["10749844945376088795","9100702294675352646","5327466408076262516","16076383630357099018"],["15131514250881268655","4317460995619781659","16145538436299595019","12252500961914201206"],["3269026868560666023","8020985671490684412","10028930488646182378","4783051250724476015"],["3349025460040190588","14555595737953004127","11628479419320503702","15918430406906049083"],["6588149930477309164","6175684601522486724","8718886457584681475","3009412627522627322"],["8058846240460033420","16637941316271715389","6687631351347800559","54725589693844638"],["16652376211180815799","4223425705510684634","9088886139021558874","6861827257537214009"],["27884390917087842","5952879954792149304","6655986421919608933","15039512580125017831"],["2865093355815889750","11931627835078725263","8296313296487168837","13684468397395192285"],["8632888321218754918","15578555662050851584","3120879465877228544","3293119072560709382"],["17370313381837907441","7236945916422705276","9326718965365456462","3955024534582766895"],["14250374951956406478","3504065845733421136","14161909956186591484","4877729167818231134"],["2929797630176655634","9577032510767030767","13304260716752994269","2674721576096959814"],["17583566877458762825","1555282204926497381","8257908802377156680","3606273031852838090"],["4861646964739341654","16305188198552134191","9968181303840145699","16213847495521612154"],["1549469353783065951","7189012296574114131","11961480880934683781","8719484788711332339"],["8347557174667491875","14639421517199848165","12089877978472413413","7613184640890046495"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["3205444124614605883","4163490350375900896","11603380769819771590","3635103437494529180"],["12750137053843873047","16220159227713791311","6481191443238480882","471043254762215356"],["14266413164529107069","11717977940235226231","5085588371431110928","16615387225444335885"],["7819807969453289173","14562819111948147727","1326478322193322363","13962851647830408270"],["7230792271899437826","12059313061324732520","17297694817364108886","15029968023669459854"],["640253774691567348","639667972558034601","2653528692708972743","1155168110040358262"],["1852316886506718499","10843092784949114665","13301991649725303915","4278270256735686534"],["15132842592152565668","13774636709685622120","9104582012509861061","12017453456735625106"],["780430380385703832","8468246823377921596","10177121038677458220","9548102025861370236"],["5749424644998425385","7973795222831120101","4164462060442571456","10397330489630069537"],["2377942416716443923","6002153381326284171","17787310346016111000","16421496843631413954"],["8588489090910664271","1727176103989741297","14788775206727055861","16073344545756125177"],["4398255786087200976","12580622001619258773","1262722436961461821","6716851057739810560"],["14196808000107003228","281112722703908405","1334202788797422133","1732704947102240020"],["337231402804714580","8077979257305471246","14329374354536882637","14800577351050338608"],["15466506100176618329","16333582735583284834","12809660860274511692","3471388675496781245"],["12977729802668480281","15789287165315125033","1297870227457331409","8321730014392144495"],["16864342202106395729","13092953743114516773","5785668935358111656","16693285804382929832"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["2009987151148895367","6417266369741682600","8059710151525814971","4666666650982206416"],["17350380437939161089","14365941500697877898","9915809860341215618","17450083290535546055"],["15948753186642945384","9572799819961028485","15182531986833351983","6400841145065574284"],["14100694900245871578","17816941633673407567","11726061522030726519","4087513716621286143"],["12125433328309241443","15451414409407532723","11217225524148369150","6254458777969311005"],["12063525419482179907","14967735266714525530","15865053089854765022","18381979943833305863"],["819199565237921914","9226888213388691410","9634629056171596041","7942126228965128502"],["18329022900515969114","4566605235790157863","3657081685108449884","9552665887815164519"],["14735605366252326327","4956391839938363558","5808679145822613666","2371449803433637449"],["2222468476476485550","8387582678157854665","2267730487872833960","10139295906132895611"],["1743899693957579318","15073964571123527440","12747488137940514609","3676795404184587112"],["15013616349202650556","16974866313315950530","15656961528398679566","6712897762866836839"],["2616868745833268370","12791828544841853681","14966161364631449343","1284314293559691943"],["4918568848442025087","11613734088719353122","14107152351688198668","1897197906154150077"],["16319889213563705796","1275791986758639837","16031387121196185986","5526435269924814302"],["12854466938036569085","9728185240496554278","11839857732077693737","2283369078074683049"],["9225396805686849885","10398458455625183710","1744184007432034284","5855328539120297720"],["17108932367942582939","12630775932771425354","2515291940317901405","11389748248235572085"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["18081856332781468128","16116151765096056227","17838278996887516966","1297708584252441767"],["12470348677350382123","18228529788224798581","11805472116118553524","16370618207438914264"],["9902977621350648743","8712564848247168287","978323058704153443","7912792391499986008"],["17552908335119338240","10852657572780337235","7963561542852862414","14538254448068206052"],["13035984189991445709","13057948048053880160","12105703251926608089","12510050434196489064"],["1928725686981309403","11758300049459138959","4797242204314533355","2410076254195735490"],["14071409724772845517","18014923073863209729","11860273496242333912","7692703353035509395"],["10912457751705619596","4796471718547287343","8069602131397845903","1696384557156446015"],["12194178582286250528","13857570831751834073","12190733252540404195","1268151292548103650"],["3870508142281043847","10776855045204966572","8185565576945115452","9987482511148156070"],["7546633403237053211","11578419216893270681","10458066808598761893","17905689877854055291"],["6037883172132130084","5007954885161165718","6981223830505855203","11914673449551974318"],["6302867530766197596","11849153120385669432","13973621849913237553","8323511474780432656"],["7454314959750931386","10675579956050785299","13822577139988163836","6780326910418355133"],["15959586580149894650","7988833379795685811","11164186085239906609","8141994625172623049"],["3695386438571720081","3317110980338398","14565869014047029194","2861682365321626606"],["17087153182849626466","12648122813784223938","13416876185464455786","15082891524507781878"],["11253428785033717569","4227158973041569440","2691287919757515700","15960244455292365222"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["16593336842842996846","14757479822023020679","249264174058172867","848938369101534994"],["4517751120752614118","1678077879202372336","10881637827715900855","18317778656455259689"],["16213423183526350160","10322742203767546291","10403046398281369908","16672581489755819327"],["2699803091679163134","9047721872975730642","4217200196953970060","7734672602195084053"],["11736677601496015833","8914771912185522872","16570532473320570657","11327230686986185849"],["10475026441857584938","8676955460045263299","2007067356555819149","7333793940913286613"],["3804524464808091672","10526733407891443905","13286192584370073316","14596659460170575607"],["4967279571612533847","13565673258035076226","12835509438818220997","15287338010497916082"],["15304343222141093325","11577184531808945600","1826974872631256516","9874582812442677686"],["10205767556357355055","13211420988925862929","12258222104774089314","17511796730050982941"],["13881283801692026136","12613824406553078215","14652512614752349502","1382104266159031553"],["12403186976538682778","590106594145865957","8023060361294231169","6522257333113068253"],["3690534510361734793","390058197799267534","4597812022600723883","16328614081430356120"],["14950552327723068052","8460332957828985378","13828729469657839190","11434887088847521694"],["4346167682217024384","11103211112210444693","12611210211182789402","13573324901571004145"],["4964839460231068856","2073467843344892254","5071225702843711513","13904964878619496109"],["18256340808865553880","4200261866268616986","2222254195723066725","10463813059253495996"],["13572227330181043956","6092623002295078591","4829551674333368239","4073493262111743321"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["10879287555172119316","3126967443956311323","7414184068916971062","5555484103889042563"],["9408133242258759337","2374923279034275269","12560155002271588294","2802222781476090943"],["4638597679725812400","1281959915665464003","12145016401821991982","14676834825229983881"],["6537894551722048106","14667055928986502887","10701588705373568494","6503974458544248693"],["9127661396994355738","18093434684302873548","13751470879372875715","8767377247151233400"],["11340640557478469401","1278265943542272329","4190367564453896544","1148691745218245411"],["5769687523980929547","16578573901630605450","2449331638508334317","6356705223001435897"],["3899453695523863138","2654308089530369015","17603504764174363061","8581233190448076560"],["9471557250375562139","17875450176013971963","3523479707237969757","17169531915619216012"],["9982246155123020553","9274272291152712933","14688784960027368523","15998694974079030694"],["4067590704104454746","13732184055999171733","11275403880412774697","5481772486707355569"],["12316921908448568120","11636631701552886442","256859540061442563","15541228612114591958"],["18071702249862793722","13842740157962406995","9160092731093782510","5463424211530601286"],["16014514742374407935","9460381328102547182","2217271892221897982","11400543353121814092"],["18322601209038578393","312350743942143065","12881047739204960641","16421891347449888457"],["4182376870723220064","5059562457166899597","10819323515059761533","17142507154334581284"],["12385945800242325426","1961282769854904772","16388184815376158948","5605988979056145192"],["565122533971490017","4235103274748865773","13159161612572156854","16237410742108422002"],["8347557174667491875","14639421517199848165","12089877978472413413","7613184640890046495"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["9277505214947695026","15152437835875999833","17631269639675819848","9742008799285588486"],["5676962877905041046","17924727090948277406","3459183142553391700","10634710729136632608"],["3994855497464420289","14771630727611043627","4839964732892859416","5335292656632612749"],["14643962022796017405","6811486787657617823","4708166605936383524","12494554128359665457"],["17921570182226466687","7329890848151687993","4760308212287936467","18225036101716398121"],["16039994012670694146","8454538434209237866","12238952875357182970","16176866981375745166"],["1213478928155842112","11947890426049947352","1359620754352229884","2123942055119452965"],["4358898541072284223","8512483786557577256","11461129167436288030","918727469406188013"],["15781048042039419213","9831694651748422794","7326116041782939272","5931519793219651345"],["13042181244672686417","8803001282621192622","13350384308244330196","3507074002927358960"],["8369961309027059246","5884191362258900545","13442260259238188100","5950043606383967043"],["7519481659223479657","2974749072669826480","2958628150360468807","4858332739755017450"],["15864546901387121167","16798913033871577026","14283476138171470201","421553301353905202"],["8485655014943423736","341639088163777788","1015906229095524338","5217314277435751440"],["2008312629781362291","2079912506263368218","7779479485078638963","18307266359127520469"],["8767523785348792204","5598778600569347151","18358333157443238091","7059169177643110736"],["6613542684918552882","12782018457752684409","15781838747618175306","15601220492502607326"],["11456419350200144067","15181358887973993757","8956386547615247379","12519927715702197076"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["1027077000775047086","1749656827369470124","12552575468446409192","12324675365471362011"],["7133083897131886155","14180186082192034288","15916080413881358779","17942526263717160818"],["5249678291057124923","17674176154769939952","2741987395295624984","8757071584432379221"],["3408845603601649126","6728759982639255039","4141245642101686965","15558675987101080171"],["6191534400553086971","13130449283341206010","17620558437200340333","13761773597825413421"],["11020320975587584748","10616386784832157038","11629525764694409249","13803850569470372494"],["13917871679338721976","6532605633083010320","15141815186880005152","9648339847796861149"],["16391386635502072184","16641996607283287835","15012451743449238172","7377945619847488815"],["13068777970562433311","12920003317748868768","15983312298456184516","7055916599688256979"],["8814158091452735353","12956361788906106253","9928049947879729069","12553706678230705444"],["12047864698582361857","11973797906955843116","12303784975032932977","4207215501117643806"],["12825356267919745229","318849779686018870","17202191590797347308","8578952366362707438"],["6379207568996633356","10119536085446038935","2040717047777448962","9674006601237106734"],["13435066375951758412","9166627143972939171","14000021468286555147","3282657660105909723"],["15668512699283874498","8320137065514125209","7164022505523911420","13843625839729429087"],["15840062747711695336","813847247881390498","11818804784547924683","9457966751374393439"],["10494145765791441388","2751035731465120565","8148716976135517970","13406622013179257504"],["13572227330181043956","6092623002295078591","4829551674333368239","4073493262111743321"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["2463069806570380112","12467907632282869119","15190717599440112248","7109571283537746408"],["2445696396122052106","10788830172793285749","3764226449799441812","13461490375143442369"],["12251672907226829686","2752759338264024336","7450724912340244193","10248221517774164836"],["13242393136639927150","2099382987184227304","4343973378749443677","15095788622030001468"],["16685671766308071283","9789948860204363341","16953985487721906273","2080280078830846633"],["610630113649914517","10803316683310911397","18072623193119837808","217646101008318664"],["58077601120950986","6998744235056983550","6576400326444981793","13960583556698759089"],["10800964028934808703","7077544498742297266","3131263124430412621","2211011926872833194"],["13340477809484420652","5071799112189439938","12621227622552507188","82473148324796767"],["14199335326706715864","12183223591566805085","7798617366395931009","724515078383887027"],["13058621937464423635","12701711759659376448","5308214960768521376","10443037801379606202"],["10164076300536228280","12389711153546902582","9384343935334658656","2058312714659136791"],["6918051207202109929","12659918710967957892","17859774955754678121","16220458782419161589"],["1549289942488180048","14144145751706775305","5852672854096080105","12905949226008643649"],["15645525063336485498","270512916060278011","2074960497306945939","13840767559654263603"],["3695386438571720081","3317110980338398","14565869014047029194","2861682365321626606"],["17087153182849626466","12648122813784223938","13416876185464455786","15082891524507781878"],["11253428785033717569","4227158973041569440","2691287919757515700","15960244455292365222"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["13865432697255186447","1001436723416683250","4402715554177254188","3373074789805057695"],["3042513541134093779","14962591044676153141","16614332135025785660","17979332743575570746"],["8091313793780379071","5497914051790322237","2786262175868565905","7924692630442633839"],["1021364657497938541","8541879373722851717","11983852522209486159","12356163085260473155"],["4317575233539864520","2662097493635386699","16059007846367535222","12242574418978198997"],["6723102486806214680","4647717847969453472","10382383911468381393","17810552934376232619"],["17780804220525282451","17122419439979573720","7702952935472971928","2887552922706126853"],["12252834277252661402","5381220387823119003","13869745526131721593","2976035532359261642"],["6640813103230968151","6968712481542884301","8248896059592635615","12241857379897531031"],["1836427633008043809","15734277807482827130","12107286886029891771","15379883077371222981"],["6529597851314690500","900188817491721206","11860628417303325027","5845843536466435081"],["10014704491485643151","11556618304458065734","9487323382048366275","18145958617882263379"],["7149436036235201174","16069222831040863802","843756521108667828","4568398255661581666"],["10413533839883911395","4607417020004942255","11597312537010934933","14709832415895832342"],["14281875912112096479","2647190580407288825","14146632333159881294","8890989937734846659"],["5883903633930294514","16490187742743982297","10460708541197623599","12042994470600316883"],["4228022637372650736","341725962158541930","6264109493952819459","4411875945531224794"],["11456419350200144067","15181358887973993757","8956386547615247379","12519927715702197076"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["10537651379785750780","1005087175673496084","8885349704248472670","9048079159720170991"],["14324052968450086321","4727066812675085115","616784695773361354","13926502120478398314"],["9535962919935659795","5627843438252754203","17659655827145683090","1359142957280518282"],["12539180593841773186","4341552578996111546","17817558555688031512","9203204253781144648"],["4783090959033530701","9379635780949510694","15153833540386087154","6762163713360529524"],["7838280491324209588","11451954561326718444","16254732270754254090","2283251577457006280"],["9007776436896178860","6666393630576554211","3617941492656417366","10390363204570552009"],["11951546965644749758","13653479656921578006","1222581319094161879","10595817077848837711"],["17401558534521082703","10447440465438075731","17989293559796555053","4310761728821405292"],["5474104534864630176","11417659053679058632","821155898618913522","10948154347993972120"],["9750251394648061048","17515821186260067275","5920540637961336115","16260537109905007496"],["13053270148987997108","14378204454382767627","3378426093909840141","7995637152340018726"],["8921232114006212233","1210509336754664455","4296499104312611888","16304488152053143054"],["9617156710658486335","10226321120557863127","9276814445278174936","15365673040060161101"],["16616579839096542895","16277935599671854845","16944468327848853280","7161378157187274778"],["9894768535155028462","15931265506055546040","14730485363271668832","1257883364967002909"],["14072188326812241047","11789987125760390028","14210059615020870687","2533934908790154307"],["762254802277811909","11361379650952294341","18423126383407357566","6159456941787920072"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["7166995797890480753","17798946447796128810","10857445249525844198","9709331363979701322"],["14567635348316386354","2200218993850583387","9875028951772655520","18294284520124679588"],["6160224595931447597","14545556326545490102","9891986541336330681","14749003021284036961"],["18157339139238798793","14329320705434078746","11327906336244508141","17109426154786806101"],["10909603241490471120","1393964681909067464","13711691976749768391","12963798147719842094"],["3427985635559930314","16612004493391426715","11234806926490476876","7682175193135229999"],["12307629658282799942","7358738036020038189","6603949599554541446","10521697160469895806"],["15915461290858150210","18413615823217536598","7821421402024575322","13981074467588871403"],["13435548226768269762","3270152849566554105","1876806057322124849","13708117415152259285"],["10973660531602305712","13761722855055959922","271452618489465119","331634749114402330"],["12249373797478855714","7435588499188215225","2637259265804002768","7221623191082695277"],["12053874439444112461","7290815998244324134","8448139111411905622","13266106365307466790"],["17021446894180208157","7260837783903995193","16268144328918637134","15812001395053568667"],["3031512668176267105","7718741038166405312","11179365295142404800","12331882603623350329"],["15668512699283874498","8320137065514125209","7164022505523911420","13843625839729429087"],["15840062747711695336","813847247881390498","11818804784547924683","9457966751374393439"],["10494145765791441388","2751035731465120565","8148716976135517970","13406622013179257504"],["13572227330181043956","6092623002295078591","4829551674333368239","4073493262111743321"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["1797547945504223268","8030527385083120265","17386769550155572543","3897960704643631205"],["5855966456058395567","14655146915550702331","14505740831088220765","8187949479371995879"],["6341504398782808032","7531271902595182332","9269168332526040088","17239255509664324796"],["16532990517550512643","12510276413831492151","3952942584609902835","6357289961243057721"],["15541456373026321368","17617443622637401831","13581418310615926541","15349057921164119841"],["3227936001468861988","7872742033068517121","11442923308654215352","2267847189799351007"],["11875960224892602471","10600635054401370202","7869368383612386107","2048420206935595879"],["11123648955954684399","8143128657660306240","18148709763997395325","6888102649243962177"],["11499304517759374089","2375721142704863782","14853996904676729211","4329954866262867070"],["6825659501131976005","2158180195385213269","4940863531702931130","5628296237217110019"],["18285729250996857490","12022008889396413878","5199489602587618444","15447381209191974847"],["4202797874747638568","13063250146708290328","13838673097311955687","11323988525738286446"],["2327717609086115809","16132417282323440072","4908134100929971477","6935122550645373193"],["8159786510860462017","6806560196799897510","14618268195444135738","163942369403709029"],["18322601209038578393","312350743942143065","12881047739204960641","16421891347449888457"],["4182376870723220064","5059562457166899597","10819323515059761533","17142507154334581284"],["12385945800242325426","1961282769854904772","16388184815376158948","5605988979056145192"],["565122533971490017","4235103274748865773","13159161612572156854","16237410742108422002"],["8347557174667491875","14639421517199848165","12089877978472413413","7613184640890046495"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["3682639937538829481","9794571100938205564","995722211718998673","14214516014525938566"],["11448761144407914995","9341486319346875015","18175709528339402601","6265037277824448492"],["3065890426698594821","11652776281099765647","13964551206184417998","14299611053539640553"],["390676824771834642","14363844497865753319","9482575395725922136","16108403892312260664"],["7937358160909810563","11802363560832827702","12329664824291810310","16596712358538693397"],["5038848610533738929","1894610551330693534","14391571468366311594","9200288958689549961"],["14921839979501058656","5336516933919798285","6074441401956766276","18410161211474055355"],["17103366073640102108","15338481899717383473","9362322239069441787","7301805351126619232"],["8151204065337046847","18132201549444046950","6141558973406397438","11527113845781922156"],["9059940877078586867","5730877053418784370","13125222548157445795","2885846175925130149"],["11942920265973088151","18324354628156300669","14093694688924458138","15917270341505036751"],["14839422102272999474","6104370856029809054","10256885737954431936","1036994287260051684"],["6712522904502155473","11990984739143034362","2212950008728313965","16617162954469834673"],["14580925988121393823","887325680889690324","212473980175225050","2208780795052058072"],["7617797778316581612","4502357526388958559","11853494115769192507","10613989641107425541"],["12854466938036569085","9728185240496554278","11839857732077693737","2283369078074683049"],["9225396805686849885","10398458455625183710","1744184007432034284","5855328539120297720"],["17108932367942582939","12630775932771425354","2515291940317901405","11389748248235572085"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["17330776328116792946","331067223203847065","857655833718527735","14642446460928861381"],["16491197006738186871","10059420924470402941","3119460219765168868","3552898349015613814"],["8613767927044642445","8470596197818455803","6695727035240507088","14850594087734506542"],["3010339634189650335","11719741603375675566","6430848660337024149","14952096211640555442"],["14426862421887538896","94832425880577402","12557539611556237309","8274428041080694712"],["2463869530170013338","667379757441951196","8826977427092298169","3245252714027458215"],["14318085213763163418","15223977753925909039","18083602683786172029","5844881574709370880"],["17959305055459992946","9389446650557171325","539691660117276670","8144149191405911473"],["14561782702060720296","1382392588753643318","16560972558306101204","6017969315498948125"],["14926930448847727121","13741441989191470466","13724591305187295907","17253778031625834021"],["9397282864620463800","7624664033130459973","1465180756812129836","6010421051704168021"],["17912400898250128546","1430951085655070774","13266819980305352206","13290988933457778384"],["12494906546520887520","9416912577354388824","17619360263233112832","585336399102000524"],["776406439720276876","11213001291088264608","3255320060620312019","11642815426201888929"],["694341547925990959","3820830533207003457","3621243553457073343","8849382073792053448"],["11796773362066167103","12131869951475635890","1128991493321852172","1384330240035086690"],["2980697359751702147","10631712166584897101","17046641178692520228","15696899171386929489"],["565122533971490017","4235103274748865773","13159161612572156854","16237410742108422002"],["8347557174667491875","14639421517199848165","12089877978472413413","7613184640890046495"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["2660777187289178780","2026563217872972632","5304655522987669621","15010137823855596896"],["11077038241633759074","11964247664531648106","14512840243502358635","2344402579408741273"],["2208297042867413156","11599160337088062298","9804669953562815985","8349142503091876709"],["11835581559209505459","5905656814125110811","13486884079471563131","13644661324056388536"],["6016018532471506930","17484473441407410845","12029369629322179558","2806148516784471884"],["789921356751279734","11610458205665351783","9737305965951556482","7376487492445671652"],["14621778005901446730","2434712934656351003","6200824466320814845","14053409673310000201"],["11008251526712088476","2049474691927495231","18239519611786387087","13656005898674665095"],["2511324356132839601","6451356658983965298","7966781360688389613","10157083079547869131"],["1396642686172912764","4989892876092716328","7912319107615975957","16496549695081470183"],["9018381112446957693","18039044622438322091","13738450851622550349","17779112336797648029"],["3321890748651807563","8702976472243485449","8607831309948489815","8221005474711001770"],["11377974087366711048","1887930530754598490","13539114993808043493","7396748110150294756"],["5022489382125448919","7685127233615395422","5031720465961497227","16209118068407573712"],["15442292942958759240","18397885982945291846","313330931707860627","6163362073727341901"],["1935464522453563685","928177719475653274","12831384741009644234","11206485324026792571"],["18256340808865553880","4200261866268616986","2222254195723066725","10463813059253495996"],["13572227330181043956","6092623002295078591","4829551674333368239","4073493262111743321"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["16807653052721528068","14308179001215970483","10575563261318519108","8328455195513989011"],["3717708937221171221","15182926204114570028","15254948583313889491","10667861991428378809"],["1841329073676212332","12725937897663520574","14516654114104957243","16374512920705782638"],["8994165530613147690","17381654984943923197","1046886097312569773","11444476588177551730"],["5288186953843984774","1020377956517184226","6771419355755273984","14444734803968494945"],["14344067045118814093","8884133295600813184","14850979940239889624","18233316260405021562"],["224915966619314310","101712718606954641","10206140603409939358","4031446698515231887"],["8504765457915864954","9551152984004507273","16552046614839123875","12428367113698660731"],["18219404286124650380","8496947974282768325","1755363151339959405","6199445861810190033"],["3887672786794755012","1717337080742222317","17505669288978282011","9572055775901776453"],["7042456011347541350","1418414946653272974","13042273020608437516","5661516948016417526"],["14585152905708972532","16800993768087826530","17579018889267055911","5545201950120323826"],["8118687035436984694","17279640437102396156","16844627974226027199","4334221255021646501"],["4080283396805102670","15547088609423193306","7814784039225591674","14810108465723274608"],["3144864878947046495","8017205375453447667","11618457262776790640","9848720507540638290"],["8767523785348792204","5598778600569347151","18358333157443238091","7059169177643110736"],["6613542684918552882","12782018457752684409","15781838747618175306","15601220492502607326"],["11456419350200144067","15181358887973993757","8956386547615247379","12519927715702197076"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["6404227150509659246","6865858366518597862","3594142497052161180","6064718653855654238"],["2907541704852337053","4163184259686490566","9021094640179049754","510198523029977261"],["4325287321280491404","15358020807713263434","12772560514846521549","17039285883258864939"],["906015714947661516","15997609838364759858","17461279104191901335","1117249148857652290"],["6374507147784107975","142198635973593940","14923513570515546898","14952662737350203929"],["14422326124966223770","9996320231103457855","13485417786600544933","17599912866747697998"],["17447013741629975941","2928655195082903392","6387898365533627226","13355431103908947959"],["15703128211613435257","7319053453541326236","18156078990120691604","4860138901798228844"],["4448434620183954738","11071727131573809349","15698167548648504663","2908411863622373480"],["4471054990304102709","15552542638034786920","6289154047913712015","757676514373196155"],["346159656158314079","11164819434226880768","13237107428596059871","1766058211734492066"],["6891099605181615387","9772213745067423968","1989947359146607500","15176160710921412032"],["13654828084786470823","13365303798311908960","14313934855989008736","215513907755849193"],["4235527945630190733","14779577343699140773","1765929743557036226","9515889475278539258"],["15442292942958759240","18397885982945291846","313330931707860627","6163362073727341901"],["1935464522453563685","928177719475653274","12831384741009644234","11206485324026792571"],["18256340808865553880","4200261866268616986","2222254195723066725","10463813059253495996"],["13572227330181043956","6092623002295078591","4829551674333368239","4073493262111743321"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["10232389737513553364","4714217932089851787","5726171760129291772","5159182574422374232"],["1598204385729179011","18019562284358012647","7669617190912513257","12271178325404421121"],["8490678000290574238","10168888568563758506","315758891334220414","1255266631171306983"],["12049636040954561067","4008973153088757586","12100160179296584143","4458580594614587192"],["16277930836432195060","4995058457853866864","15105649327854393926","7410961029884104069"],["5416374855383315847","8883758702385672543","10731293733594820787","12328204781543785404"],["15726372602684288632","16985856800417763144","3788663212246959435","2518849570151298298"],["15148936276150114652","6323063827910197239","16237524210339044767","17830202574713567972"],["9037688318965726360","6263282604491710259","18427934691728529074","8534891923512868156"],["3184771230870317568","16056361842542111890","8910881131573313820","11284211774806890725"],["5888270000265775209","8906857586449917390","15607729840580685437","15191390864982573057"],["5736686190441338430","10879098970951771832","14906759077585655581","12796464264921130381"],["505974897004497862","8708074410907094363","17368253264839716208","1012703053564534046"],["3052916935182476781","14815190552116787193","16365863777227752174","10092576110132666333"],["4774131764022080356","18065517031388918313","17211350687996591998","4223573692068681373"],["17583566877458762825","1555282204926497381","8257908802377156680","3606273031852838090"],["4861646964739341654","16305188198552134191","9968181303840145699","16213847495521612154"],["1549469353783065951","7189012296574114131","11961480880934683781","8719484788711332339"],["8347557174667491875","14639421517199848165","12089877978472413413","7613184640890046495"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["4489154403754327652","1568737301790480897","7385568334234411897","16819942360432895557"],["17618847603778762127","18138578266891043363","14339531837665087391","16581831914274905224"],["1523123513490341476","12072996398746883218","8927027453119007218","17603636807304286498"],["16599313126401649139","1783935541255532642","15915069599658991649","10323417500255388883"],["4284003804386737868","9446181106194225151","10820179594668663205","991181871473346563"],["918060219567349380","5000745412290508587","7689605893870756481","15320566214653944279"],["9326240436549937302","10598549281208517973","13640265051664170316","6005289032400659083"],["11717052538825457897","7695630323090211063","4784538500297793379","18134068869960578944"],["17930260485883133426","11735275680072472326","1542233132118963387","13926238545617381020"],["4231184803326132613","8502871067777248606","13884759902868168040","11324636251488902038"],["14097564280554543521","1696538718725696860","16626725033319863588","10056132244463927242"],["2363531803501691391","7446038812142759383","12168729506451864340","10516832344779706809"],["12258384481675504422","7087444385670058710","5614730835077267796","17065191295180740072"],["14295833058785260906","3773559408524038590","12055186245049942429","1706315671210271054"],["14074940235935440689","11615547638103798063","15129556526492663497","8037278379519729369"],["1074967009252111605","7977212076197986272","6797740014560813852","15147875043302248371"],["15881691451991882586","2835755880053458426","5419923467264884193","4343248952329619411"],["11253428785033717569","4227158973041569440","2691287919757515700","15960244455292365222"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["11609583292908157521","7125914785053510360","7438251413095406608","16801783687028092470"],["1165712511167097073","4350565563379994538","16356790806901647829","16453422936981306732"],["10344042304717405635","16239471015447858253","4910250673960980457","8798237423551038468"],["8641936409969290813","1203565401900698890","12373278304034967721","8996698885129680052"],["11541586837336407329","5881526954745591742","12521565747013563244","18384397735201609566"],["6101742479377562974","13542327924498852960","17681938011721003878","16577037659078122251"],["13047431112097755197","17330872162301823511","18197717947991997317","11918948906278375693"],["10449072716289882131","3084203255478729809","4348561870258777811","580959980415607467"],["18379928447100889038","11011475418925819212","9801511854519449349","10928172179597390374"],["12748453840538671451","10748606969704607818","17773395709163079840","4179354825490932255"],["10941942976244739795","9255940620540455659","1977573969258819652","8786663611611659017"],["5015279435934105821","14604288862173856198","4441926368542551549","7408356525155955087"],["17497107884081598927","18360699545660634274","11745310615195149120","12169033816752231428"],["8896770559580599727","9306531284731314796","8509038851995472077","15466150157458411285"],["8282415904394285953","6304693910249475647","855426712303302909","732571142888136769"],["2473892335782060992","2841240534595958593","16211107949107842421","13830914405494452440"],["4228022637372650736","341725962158541930","6264109493952819459","4411875945531224794"],["11456419350200144067","15181358887973993757","8956386547615247379","12519927715702197076"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["1184886039404775518","3880307697655958495","4847757040833113857","297057212089567881"],["1600924165856469711","4478735965173527605","13732600462643372801","1901775381277148363"],["604726524035247082","3857547225390029600","3716323503606495418","3572785341257205272"],["14490676626575661800","11506129888854116404","14205527652111482962","6728146633979269124"],["6614360426133276690","12584610662018900291","11446138330828916978","3424325687213321827"],["16789948767118281905","13045182332346906892","3422794672582335785","10320348066670673717"],["7002001332564695624","934694469242452466","7813722722805703221","3894977715685978407"],["12263437673778724550","1898814241793731159","4177564880422498491","16525193446871238214"],["14812711596741363291","6207693635195387709","15590236832383596506","15017594394988398876"],["8727282086116724710","12053662080033344625","7947721401540927230","6835575351709915597"],["10831753241602882630","1399260681048512942","2841270557624663242","1651297898375242012"],["1025887886698796913","11743232886902805518","8158236134935015481","6869950525294628671"],["16076051848703301316","15380033294781413320","8994714542660288948","10609797685852977848"],["5294174299536089538","2086634435556024855","12313563500876135335","9329435323794330900"],["694341547925990959","3820830533207003457","3621243553457073343","8849382073792053448"],["11796773362066167103","12131869951475635890","1128991493321852172","1384330240035086690"],["2980697359751702147","10631712166584897101","17046641178692520228","15696899171386929489"],["565122533971490017","4235103274748865773","13159161612572156854","16237410742108422002"],["8347557174667491875","14639421517199848165","12089877978472413413","7613184640890046495"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["13312039465751442885","3851423716866195491","8868102146743999811","7448955941328989211"],["17559416294250479596","7803144189867883607","3479547781216329520","8328571703728583100"],["16514855261801302985","8496064997302134081","7765766534228268674","10430140536237085282"],["16533045583134799038","7593017160281693724","15453606886811957705","7819208627511804977"],["1634365292836833277","13484282433811725442","17253225989914758130","10950454876143783303"],["12544274380424128068","1813836487345797084","9404764569123800016","4798060526821742930"],["9936331896918656466","11561238578500126803","11163243252072858403","2122346846700778589"],["16778634300815209977","5925983080582210038","18396660759727931556","9208259199396782302"],["3610456880923478269","1357096526791072751","11716811476746237797","11122850626911503543"],["15046005174679785770","3044955405581740784","10552118473903588936","10289246127119527896"],["8485093986196296134","5580607975846760047","13368113442702175617","4180969495267121196"],["16340458407366796686","12073007810791223499","11591771710110673246","17993151689258733266"],["7490284951650020547","4326617816813466630","7146770803666489321","14167489361859398477"],["6473762292771198423","190657123277736165","1718918773054807823","14349806398957383273"],["15959586580149894650","7988833379795685811","11164186085239906609","8141994625172623049"],["3695386438571720081","3317110980338398","14565869014047029194","2861682365321626606"],["17087153182849626466","12648122813784223938","13416876185464455786","15082891524507781878"],["11253428785033717569","4227158973041569440","2691287919757515700","15960244455292365222"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["9708216679789128639","5493110194347579859","7365821613602043693","8052001220272996551"],["11602357687738811908","15236916180842218635","13036705582926817341","4917870354406929562"],["16936819541472233407","14675764793597779412","16817776661568996582","4319474569021227007"],["10182476686511626604","2511007537245624843","6145527427390778181","7120403728679366158"],["14506700304295404708","8065685888324907136","4530908099962544814","3546118026486675198"],["17913227882467335529","9548675133244641549","1028013018341050849","10128486509169322859"],["10787412661797195812","5927811209317343190","13219693694986926665","14651421572796063476"],["561118458184972804","16295649259920245702","9538717027394250224","12802608226464693227"],["18285294701169435948","14158750194657742385","8268128134856285347","15554416045879944530"],["8687334235734310664","3365695914518065506","9588501046257216747","2778040720848412935"],["11516610984736744360","5981576844723768368","8931960044493770988","7794131266269841519"],["9160968216458384624","5329578361043898638","9085187305878649609","2926223075770793709"],["13601560453143011380","345132180656018234","10219935779997224332","3456171261421405549"],["4650637962008725618","10196996960001620055","6843577700105158294","7196660927150917077"],["13613268283688056912","9654116634899718724","13261683743435998395","8906934087258640111"],["10328250170249807115","16719693258890059986","16559464588174459546","2245218790670235368"],["14072188326812241047","11789987125760390028","14210059615020870687","2533934908790154307"],["762254802277811909","11361379650952294341","18423126383407357566","6159456941787920072"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["9356132827385016982","15322647805161361006","7414499966780532438","12943463062771801216"],["10021330206757411046","9628392825553510374","3372722701506106451","9734997888988852895"],["6619880202293646767","8992389830861859341","467959243885539384","12096295109067594351"],["13955046285714618684","8679229232109317370","10318370551796508259","6683174352168586246"],["1379999171398886840","16654198658415430595","16352592974912223849","7422105338950696809"],["14468227580728654059","5836088387738065133","13394890392877545489","14011390427091532044"],["15895120031885555922","11558695573005601645","8393452322987367882","16595596741862785249"],["669522298539156533","11222189874867797172","12273970390450346063","3947868636472601616"],["15840012372359789508","10293104105789504240","4376527364649982045","17944177184154558986"],["10624002232718244792","15806851284954155794","2549056907342671603","10146603256003945088"],["14809190487416264827","14174340077496426285","14078094996761821228","1177351573305337200"],["9177878771815213630","5698056402814712755","6721524475681699776","12619722111680442223"],["17470801200701849382","20094122728030298","7254441216949925835","6916682537678970469"],["4060756591270516035","9931618725811019675","2855001604036146469","10112217882788905583"],["13745267650997381356","17195773245457387948","14021354106476935021","5934470425540274503"],["683248669388526129","1557042541848875771","1491291905503793151","8076115263208276381"],["11450588949272771417","11300556961476727955","9638263734461534336","602743203000169118"],["16864342202106395729","13092953743114516773","5785668935358111656","16693285804382929832"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["14185720296811278194","10088996538370757431","9685233024754422060","1270710948336104720"],["12335345524223510068","5879684558849978596","10940517329705623996","372425306008897160"],["18162351720714901461","15602123311724745660","2160988080898638290","6962813549323663618"],["7089495726395773193","3357000377071424669","1743999100104318566","9532493206894388770"],["9894964111265611485","7082487708752572474","7519011354285917882","17322771050017170917"],["12293100407958380890","2405157110971791659","7725350437145244543","16155685236212349579"],["1995219764345326830","3281777036376616131","14745644461028136766","8299918234959873396"],["2653004859813477297","15032488233800273481","5042667988568717537","15514025369065766462"],["651246579957778675","8729194461284978068","10592412458869119581","4657579964411853062"],["14062883912017831600","6142685076954832449","1945460564381036191","14857174966671837241"],["12426899450520945490","1799066419873337824","11854662028041887369","13286451321643474495"],["8651358257511519571","5730371376255066586","493483506845452927","11909657539915740536"],["4239325417395871186","2274635554208104165","6673640295103122427","5237706830504956750"],["9260856321354108321","16140922549867625879","7276476278799950421","711226053982958181"],["12231106153395628870","13048826001954943558","1411581415643289325","14940647433076586058"],["14502727104402749302","12395431719165497114","5319630655676427782","4687087306307563937"],["15881691451991882586","2835755880053458426","5419923467264884193","4343248952329619411"],["11253428785033717569","4227158973041569440","2691287919757515700","15960244455292365222"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["11920647514509335593","15908047081634720938","17932640744074815980","16966159574865260464"],["45018617390168360","4642636402802424274","17056922280608895690","10068091226727034373"],["12784669183567967179","7650626626547720177","16221542804653628046","17987118400515081270"],["1346644566210897643","3840781109753412206","9440714390690781449","4917638695228275333"],["13876211591037491157","7492036757728282996","12372984185937651189","1044695049116251022"],["3730474243850405301","7487051797706087291","1143181079701797221","4579063173525712348"],["2340095188765790350","14534484327035019776","9692792940353537878","6395502578896974219"],["13122474566680516833","3108004481996652886","7885431132307608034","5423866818336205340"],["8441141351142565600","13629827897026297484","16003131807160685128","8136780483689796257"],["12097638809878454486","6090262999031661128","10753850424612860874","16166191741115642702"],["415179829296299028","3372408213631533852","2854902480433409930","4464431048968057191"],["9566075010070275161","12091047176693138780","1388832849869372852","1134751836076754390"],["136749572430321868","17175069295496605176","15278448104508291037","10475823225789475373"],["6149215037687200336","3641345630191629558","12578139792337334313","8832475329865813029"],["5246051748628563634","3584721168049941919","18994707154457655","10777955550772967282"],["1935464522453563685","928177719475653274","12831384741009644234","11206485324026792571"],["18256340808865553880","4200261866268616986","2222254195723066725","10463813059253495996"],["13572227330181043956","6092623002295078591","4829551674333368239","4073493262111743321"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["11963956979247640289","1040028668310770541","15854083814749809310","639174646278917097"],["10037094385361923289","5237691489485373827","13223300911986814349","193852214257859698"],["8225106710350126716","1486045453733418587","2598488112779045579","13174311448834658057"],["3803649551600897021","1446538495332551014","11610181780611010518","1501537569423593850"],["8499600948051110828","15848521653042296456","10286601532906417128","4579655470507940732"],["408872068194527328","513388001384420598","10660866157078803231","4372822970201116110"],["10969489766439341739","488863568685430582","3459464434864342811","6702100449416096627"],["2162724866036685760","1061429987572221894","11398349847181297161","16478213975545430599"],["9020692663720538347","425600977760188993","10264558768406909100","1982662384248712122"],["1008399217454691442","7427425644228303319","955535487578241172","368216919880876518"],["11768217768200890394","920584228700301246","12464936667731871284","12239224083008216529"],["547713917400481110","9938516147326810808","642426140549773223","6204537365519353090"],["9684320582116214985","9458224349447088945","4738974892518923211","1418402376339160387"],["14451863388020459981","12793871673378570279","11473456874249303402","213916757678507836"],["15815847593008557871","4010344863797439685","7000844218412884349","7137814789780722072"],["57523330705760790","17915579863683584342","6786040604898764793","2724704569608010077"],["11450588949272771417","11300556961476727955","9638263734461534336","602743203000169118"],["16864342202106395729","13092953743114516773","5785668935358111656","16693285804382929832"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["11892246919220599679","4299137997398939011","18433896366875545052","1224518373686862491"],["7236498393478531482","4620856457477596131","759214494975976453","9961724040801046631"],["13096281070175279190","1153845939545369541","442560598087422368","12331586732584707175"],["7332296146122072926","10132049201390586793","7492445176264579332","11113652881439621667"],["10098164950283587984","6185669110156846989","8754687222975485834","17236764743001901351"],["11030346572799379224","2267314275255863966","3460766052530414650","3776340257185886623"],["6925871857471752073","8601096643251057327","14659983644202883633","14824948091310672307"],["6729397172975579447","12583501615455128688","9006696251947214842","7355692760295683780"],["1399106280378948105","8796887687740786986","15030266736238685319","11608147014789364172"],["7805524803604090627","9972678545241572504","14075091039484309982","2453012885821464002"],["16607118482864271976","6611583842450679539","7423220359746269435","191678241704434896"],["2311908926019262987","14251980386167421202","5895411681883783952","14255040763158809078"],["15497935158744195463","564260932572569101","1807959803012248298","9487154640410837222"],["4061206690844920284","14601925846406243099","13042030359308890998","16189539883292425033"],["5667914407824864170","16495756837223656919","8794575327910413355","8297396216178119526"],["3832984694127686458","17679157445705118601","1379432604043177216","9418963247879850614"],["10494145765791441388","2751035731465120565","8148716976135517970","13406622013179257504"],["13572227330181043956","6092623002295078591","4829551674333368239","4073493262111743321"],["1697580610963313328","15721994080286139469","11153231305888598212","2208993757774044540"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["1666031162938480139","6950681151772482606","1328060804811693442","16640676909194968139"],["12593781537751058306","4964629460459477800","812184193258757936","5290578978792538168"],["2215285085249007487","1897447190741826049","9799691038650939453","12548312107996445581"],["14653403763583193935","9488977790062208591","13253955439100246069","12859021018170966257"],["12792154928243811460","11107117729421914023","12873523401141956559","11831406422927168032"],["12751873455211548362","14620820776853037692","12932037192669942820","2570214901931671177"],["10179018957170184586","13005400822732678879","16485850178572111574","17603235936325795615"],["2454734076553068896","16272810240035071866","16461060256031271657","9278391468428460192"],["1668992757092939950","2202697577544786284","7335294758987067475","15523788015253509536"],["5474104534864630176","11417659053679058632","821155898618913522","10948154347993972120"],["9750251394648061048","17515821186260067275","5920540637961336115","16260537109905007496"],["13053270148987997108","14378204454382767627","3378426093909840141","7995637152340018726"],["8921232114006212233","1210509336754664455","4296499104312611888","16304488152053143054"],["9617156710658486335","10226321120557863127","9276814445278174936","15365673040060161101"],["16616579839096542895","16277935599671854845","16944468327848853280","7161378157187274778"],["9894768535155028462","15931265506055546040","14730485363271668832","1257883364967002909"],["14072188326812241047","11789987125760390028","14210059615020870687","2533934908790154307"],["762254802277811909","11361379650952294341","18423126383407357566","6159456941787920072"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["7444663724882068083","15431242657803499172","210939396887537644","5644592360177195672"],["7186317665851459844","5952951507573156700","7505176263206149423","3110411613672690046"],["8334663587241082311","6437574080173089532","8882392541337580593","9282228598722459541"],["8569282041190946334","18185622208868188555","9381417237074890936","17575216345031070735"],["16770211577159258998","806501377061719184","1340902825433816020","6947210758462156741"],["13657257343572696492","14834846452669553393","18111328633407691369","15357831180554647899"],["2940794831310674305","604528921259078061","972712360335529884","4720292806609813107"],["15123225950175536297","12929624674494440543","9160373193460322540","7993076418293248443"],["15478450094714809505","5666620363262700384","15209592437630670614","8386945253966921634"],["13534632692379433818","4720580923189917624","722530592223794917","3129143024637734073"],["18011814543018483415","2716790915719239993","15603502639064986536","4637597236700757800"],["14224640570196360123","4510055514534551019","17843162450209856774","7123031055083143475"],["6284492062826824085","10327295380092664410","13860582622806638518","528988173020314577"],["5156811298365107936","2466495107826352622","14001272997202350705","7995743041146547514"],["2008312629781362291","2079912506263368218","7779479485078638963","18307266359127520469"],["8767523785348792204","5598778600569347151","18358333157443238091","7059169177643110736"],["6613542684918552882","12782018457752684409","15781838747618175306","15601220492502607326"],["11456419350200144067","15181358887973993757","8956386547615247379","12519927715702197076"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["10380724387357265713","1477085203964353348","18393566106708314368","16637260704425229346"],["10798422281577597740","14702205282536405388","7353101504337405989","8491716563363194831"],["8887156655346692376","14852699149351010125","10530747833621915133","11398544482054696349"],["306663101914031933","4954748960552115212","16260911542058733270","3504881883730150906"],["1769719626540499039","406501441670132483","6383477231708001713","11564430867604868954"],["6211190137943801200","6849805948968291706","843615328320620606","3026247079458206218"],["16134436608696972692","18213225854116291683","1187909094937599587","4682165838970749657"],["16858491308009436656","17720986179262343035","17081830121962408336","16236900616286089829"],["13873893346347990234","12283865272734012987","2187554582978582158","1463768757058585467"],["89646901228386996","11064796548429582747","7411046324421941356","1983907315497267329"],["15773529743692572080","4671202840242899690","18181295322564828610","4156771100346777046"],["3026199758418145543","5236841952851536686","8305574571145819501","15754417338008707355"],["14562839907975851864","8600660922278899069","5810425971776963311","18299872330380384446"],["13687597970192177656","18318095702388406169","5913852960944617216","12386967300875836013"],["4773629394093283136","17418217821396394570","3977182803741397825","14328831922761562025"],["18343245059956056401","3120255742488526779","17418586948603159156","15599545353330108040"],["12977729802668480281","15789287165315125033","1297870227457331409","8321730014392144495"],["16864342202106395729","13092953743114516773","5785668935358111656","16693285804382929832"],["1679651491561819221","10352537644036211154","7756863938582977913","2890729071912806918"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["10830105832003143295","12607992423282485967","2686519534500046453","10999819423990432109"],["17278169962238360341","16196840702584149455","2634981400851232829","7072430035751756013"],["15573751173740156004","18339054897037854734","14738764610347891696","13530552902918673143"],["2833905909388367616","2186055126261228102","12005994454558029743","11918313491626511801"],["6948348772435322111","288884671636194350","16962661787615288775","15841345648655422595"],["14299259947308734593","16812090175402255865","14270964846245840595","10864288523984116519"],["15079232850663328552","3470080590492563221","14816012674145966028","5803024129917525729"],["13929775746592884358","6664790417081296703","14378201092341586050","13108539499902369202"],["1151491764738981779","8995973009324114385","13084545325490659462","8312490651778930416"],["7545089673256244786","6667326930936716040","8430114081110678272","17350578778058861973"],["14647589844184389410","10909596225479661775","7845056435473436611","7020514212977755809"],["1465229578523117788","6922904109162742316","3378521618364186766","8750105668641219256"],["16495947206545032070","14864821969259112516","14907600001219171222","10039340824081409631"],["12362229481133512972","17434745477533998491","8331541093652737323","6050875240087966791"],["13666636357358216877","1359529384897902","5188152332179793077","14857356906262324150"],["17995563791333696894","15734989728451787458","8671168472189208932","5039785980038493696"],["12385945800242325426","1961282769854904772","16388184815376158948","5605988979056145192"],["565122533971490017","4235103274748865773","13159161612572156854","16237410742108422002"],["8347557174667491875","14639421517199848165","12089877978472413413","7613184640890046495"],["12557775224107389338","9903631488850626053","4106388436504039649","5069098459049177676"]],[["9525321721998292070","1810348822944910699","1392391425601050878","2475538256900167631"],["5346359224490728401","16859207478707573890","12250748383863559339","9869713186665879286"],["11365928956263584311","1717086917624228699","13123364711246520261","17880036555987766898"],["14277226864815508171","6356818624205550772","16563426543687406052","9017720401823527355"],["7936541029967704222","11870840391474540541","4639249839028304237","5635372285892687428"],["8575640772491192407","17758235299657110078","7029255893917759141","5650294181289716594"],["18203255825070751001","8757119681926716744","17064022366094421341","8759524971754088282"],["4237091395409236771","11978750430828735442","10601398916427461037","1465839904642994963"],["8485905989951871367","7183114184275383920","230785376425526284","5072679633141937540"],["9633230408642806119","15225223272297508743","13573079312669429979","17811546085214539353"],["16982506581989922044","8953191874249042313","7963473549663635762","12056171906411095665"],["7897838231053252468","4080497614084340923","9575293043075511599","11374967960510943949"],["3845169372957577887","13939963229357277363","15303031575542544623","14757734268645135311"],["8896770559580599727","9306531284731314796","8509038851995472077","15466150157458411285"],["8282415904394285953","6304693910249475647","855426712303302909","732571142888136769"],["2473892335782060992","2841240534595958593","16211107949107842421","13830914405494452440"],["4228022637372650736","341725962158541930","6264109493952819459","4411875945531224794"],["11456419350200144067","15181358887973993757","8956386547615247379","12519927715702197076"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]],[["15569727297806103222","14131728576014829818","12190670997543200525","18424549945134900793"],["1333761618940078939","15977999175960269143","6897910540232770100","10910515022194649431"],["15756149981045907191","16619195066597699411","14291952191765580226","3667620511876912181"],["15838423177258884045","8407245426171391794","8730095162480880018","15077208058686604297"],["12858464245901487555","11397187189554741769","2619948687907873318","1578289964350645577"],["7253386262440873948","2190029056631397116","10933267312534672512","827790901291102257"],["16895726703841949437","6499103850900282248","14581649753788136901","4609511908637265438"],["6048099854700180362","11024053915688849286","10500860452473785574","7448248706548785493"],["14019031383391478647","4467850602880890062","5443337926293801364","10727321112486022614"],["12120805187004417245","7490335413009262698","15831636554870988737","17586345925813624952"],["7673783413441301244","12142349169171570253","5149515025061741717","8685731502300226829"],["7251338592781137977","4230148281561496689","13509912902291021564","14292116518846241681"],["15827805990135022948","3170098251305859078","4969469502546980273","5891904704553695412"],["6473762292771198423","190657123277736165","1718918773054807823","14349806398957383273"],["15959586580149894650","7988833379795685811","11164186085239906609","8141994625172623049"],["3695386438571720081","3317110980338398","14565869014047029194","2861682365321626606"],["17087153182849626466","12648122813784223938","13416876185464455786","15082891524507781878"],["11253428785033717569","4227158973041569440","2691287919757515700","15960244455292365222"],["13497241391513463306","2699547992805143132","11691017802479879456","2238771190517908616"],["9717526291009150869","2459273438761520227","2462423158064762219","12894988626606382665"]]],"s0_siblings3":[[["6159208519362828141","85654010638526978","2035701275648738352","6155658725245691701"],["930778089096580926","4077009676429827763","10471805677002275364","6059882210201073388"],["7749880640648585872","1601326629275863918","15371334863797204289","9021863146426228119"],["11456843063475740348","16210571414336929005","2998117740157524537","6970371328915946251"],["17061563814002148703","2827184244709410070","14798763445409932429","16111765476783029596"],["2035249506789045478","16177738121391525882","17703557853424454515","15300626209987014959"],["7434787241859480577","14640837079944940560","15326263514660817285","13836046122429671700"],["4133475914497143784","8461347595909295573","7178544327743314467","6594204330332590962"],["7376592132339893","8416064507814190282","11072588999368855142","1673366581163841980"],["1721324353100189923","1364264914202250950","8319440487062962146","1814018447498680016"],["12649904944593175751","6364450660046410931","14242348587927558075","4528272087871731729"],["10964860363775744447","7513760671135901155","6827799312360146990","1312260030890489613"],["17930638782161760638","10772770647452284861","3793543062027869114","265024063451755124"],["10555967392986316574","15650073798456123848","427208850004661618","5774719837899428423"],["15629068583089618081","4241162206612214708","11237231022973983465","3609913556645006926"],["6035374553793482184","15248034313057759268","3164588961320705239","9605632062788128967"],["14556820687776864960","13658003036109995204","9020639288110338468","5611981923756760608"],["5284784121366302361","15487186193545817751","12861249455041483745","2642835056234132564"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["1380744679321736662","4760712541425253957","14152911198277040813","6764769981377667384"],["9367263207737732802","17696254880311409866","15957213737916746090","10027067261810184071"],["10228845369875871664","17527273960810304523","13103662637405526752","13436756537510572584"],["10297046517155405017","8333191784841137836","12617666784470940397","2471945996849687588"],["816169304004192201","14460901941410514380","6634892380204194149","10214513521390268089"],["11435737784769855100","15566777369625191650","13340325786304137917","16564453349269077328"],["14802699208199927554","1816148333638047327","4589934161245559692","5233192734031301166"],["5761005741859945098","12400011866507020518","2639059363689836792","2086844181879357305"],["9282977523532816233","18155138672762192983","8471317172771256920","2814085433694957356"],["14731556434430616949","10749835555474082267","16272011257309210246","4265064508362716342"],["16212467615422276659","528775187552664424","8717581857973472117","14925411169607346041"],["4834772184761033717","3235666441027705731","9009866349697036719","8923353031928875767"],["6193274071130362464","12551668189846738496","11441205586328937327","4081857879890763455"],["354861484920430090","11155609319000496254","11955370791941962257","12914660363149078121"],["15390559887446506061","7962694891107082848","9585676597946455382","7416193562122546524"],["11606396562620504135","4785846088460917102","9852504000240285333","2554724271214204659"],["12796717748240953120","14936934042309833123","9513434273007052138","2808559990781079787"],["11986307363022165416","633159435900744386","17273102409911961425","13539855052057717683"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["10350168341319611584","10241586771638960377","10664712721877112101","9066691371105651170"],["14948277364374647202","8460104513763383936","17661064170652448657","4643357082239276445"],["6581214240609013258","600852323688581846","15973100756339360148","14324802018241373795"],["11572092038261178059","16975563908960890604","7134380760106928263","8416720950079062081"],["10856759893889665731","9604694546306806247","558299381751639292","17031265131649257217"],["3782822115173692078","5738470675333457778","9150304360776010377","9521117029864996661"],["9202954995031646530","11816829403650661286","1048995733958368084","10224846836789279634"],["18085888842522360090","3723447301739982342","18357406016090685195","18415276668706284676"],["18359972097823372584","8049996178737687316","16225410752793736136","10322216202605714613"],["15387765106230972879","2874781967062353633","5421456809484255553","923634022060494744"],["18061058139868937343","6528529767913058058","2479574300592073117","1808192527539153458"],["13243867053851452509","2502740962543706705","3578908635759475433","17652149157177062630"],["8698758526198475425","6784333210028913950","12276997079994293512","11407936767834829886"],["2447309041412926687","17157536308329028573","2391785123316851519","15991553221218730206"],["4581279446930170873","5683759691821438712","6397745053883649023","1576478477958251282"],["18432734709320407898","9860676067411051785","3214998903373452724","4189105769019662295"],["833017082531678758","5128410821311343054","17022671664101588358","1589177245145929105"],["10285246344629620347","5988684505243411347","12582676071812232053","12214116088785292741"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["6709842068961384010","2844977551584229892","16029902147095213064","6769075545083318772"],["11948255802675699357","17388230972775575023","18259842028839263000","4076965886454630648"],["13322239764208563784","9669670225438416690","17265522402382799621","2290230189193213930"],["14618016973224532390","7129539955532287157","5217967538334423254","11533088497082177877"],["12338784756442595630","4955163776965612305","1201595255194208401","12862074760548262128"],["611768369005675520","5604108932706961264","15874835021918192327","7416313184636249828"],["15889485394788772053","5780175284680310857","1320037633332168177","15133905871426631258"],["12810670192540607215","9261721114941407018","13581218133587992894","15587751757936410527"],["11468575302371851107","17227100549935181868","11671793160723780217","6403969101387626415"],["6317871994203008329","11273499560052395055","121198748339555866","2719909692345459212"],["16205332540821080080","798660514099445283","8305299018216533502","9720336830872469209"],["15911954861534019570","4376047024305407806","9543745370772934200","7845684921055777209"],["3829590507168564481","17034981450854027188","9906611231519516623","10195418904181448543"],["6579417326393271343","16268427096264998425","17899449994415989210","2861219231495915822"],["17767480910084999103","14038103175790747536","7626579219058930395","13999165934482194372"],["7890149761914073699","1741548829190491861","12447929754569566301","2083124440723730157"],["2638990305093594399","623080285418089522","2423898297158060429","5986352302352209950"],["10328841535110747863","17722308994730568825","393299049349289921","7948422816610504595"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["6724504725878101877","12221887473854213278","16891379129781104514","13472690826986406019"],["12988827116023612498","9732886512628034716","8412218155117498712","7854962207841376820"],["3118273066121908122","16581902869138415493","1662752043336036213","15575147336986073940"],["9674503894916148981","2369475616434632156","10334895489361416512","18001181348032402588"],["7692044638655939523","8121617229135531851","11668844990970788624","7523343491584990334"],["6521915457648605089","8088353338821634852","14250520255116578556","13129056535469625609"],["15790582834207711831","1491531094983091777","17681173966468960434","17873493320452220701"],["17154787763785063110","2225862973209124680","5789567967928168268","11456263941867224690"],["16721660976196840170","7898256020250287793","14773009113176766003","4765534257940175809"],["12481293052275392273","15025328334964647345","5182373113864368188","4899821824654271108"],["4282558594753341030","1041514403009666358","9526818290898984975","1738152473700836799"],["14000438016222707504","10237782861847317992","6659404760722287165","3100416420612414600"],["8679397823529569815","15124633947444122224","7418725137745964827","14634478495668441412"],["15856334015041634981","12886795839679833223","2633956711120478377","9703860396248373401"],["8258671686859154592","17166531078833242923","9695865302680698480","2488288098873672698"],["11931434568755518655","6013510402710176063","5553148791945328075","9197183767171892195"],["12796717748240953120","14936934042309833123","9513434273007052138","2808559990781079787"],["11986307363022165416","633159435900744386","17273102409911961425","13539855052057717683"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["13669909966472372015","7158747373388054162","4232192779624142179","6600592073572530625"],["16397182191680853915","10754991189123726583","9087809739352698465","1166623262175022461"],["8825094807827556665","12058309712652913620","61821330742104271","5524546303890784795"],["4222462696393285439","15975441981275170552","12013898947455838551","12875767608535105425"],["11659906249809810973","13398672387277648643","16618459727391588469","4118184223476736042"],["11112054025102643110","2342466474056345620","11929875347249068291","587056486165288486"],["13988039339421379582","3525053176370431532","12633488636171236534","6849107225364305410"],["16485529993971016325","3550590261925905714","2739963430658386847","16342439431894273367"],["6880526337045272072","15351501563394220391","4716759107292968873","7095977891947273308"],["15470817097494273314","13163999702192413491","2153047559640332233","13372720153816820521"],["11371750618541819993","15206190656013231833","820945193170351730","14103972167035093692"],["9769455263263164842","6969403209984474380","5517821211901694921","14061503943016416909"],["3187869637802360067","14827383612538082359","1419056269961452154","12307462880462296838"],["2214215648360352794","4558704869385290094","11400888188293830325","6613051093755867669"],["2144138491751133182","3771633665995630026","9222618916997864047","227053920301994972"],["773143806176897592","15502443944890225083","1272345469777786416","1451496917540258001"],["8007026400190228383","13324883983793082363","13131811358466402905","17419637269342684315"],["15151486080312827965","213295895520127998","4192772403351914447","315135091764345139"],["18273896145036408472","4654589937925835656","12267928223915091163","2980205353624999326"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["2944455182616814364","7661213483299315644","704481757621837015","189139390376088902"],["13578720583932981648","10403839940931703638","13645555811741563746","9235247296874783830"],["382920663829980182","7620535106364811315","28519139937933999","6186791803339705977"],["6198100640896879333","4512622259859687393","14712525897769400357","11069269645745066671"],["12560000501089890591","8310520523023181075","12483655588446578520","17060680492254843926"],["16871986890111231381","2177506684512206781","11906677708801219496","11229490442742611856"],["3250316645379724744","13591568311842767751","17764497370912156377","13235284723260641940"],["14550080549788242885","10010501638182164112","13346285633734523666","6543965348433778413"],["6891356568814217977","9998708730967419509","961512385759213546","2510542121014503824"],["9202131339967204509","12777142405983018805","4101852636408063556","9668028308102668308"],["1152044268234608230","717768661143847931","7052737639085653820","10110589307391876298"],["15832872518972369867","9461542443185094935","2730794152916614939","6019927841940706747"],["7504315593085259944","2896993472293859118","17740986538417863424","16992901974213841425"],["17780458910226542216","13956705542947978099","4855268888392285388","1343414757058071148"],["3599398307465099422","8855302786924296466","12983127943533753882","6186531300631704679"],["2850718694171365550","8788309301963456662","8615833282210552076","4508244918128419645"],["5959505867358919429","13914274457865611080","615944506881110773","3955872303472505156"],["10285246344629620347","5988684505243411347","12582676071812232053","12214116088785292741"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["13967322257731751080","7685150265864936530","11379955598945492764","1404925082298043358"],["1794428478294905773","3297406960460681514","14417024727335109451","7851566182507231560"],["5398330114773956151","11036047031658543379","5966590558519880281","17512644419708555895"],["15445773234977998716","16030810894778437391","8026473756774936138","7648753696374976521"],["5803899459862878719","7808749192654490146","8178940548460786778","13775907788005491581"],["15397667033530931140","5215671130174056245","6926615203418934959","11642221697716734766"],["9083645763239925264","6021432585697602350","14949748001646499237","5581073885889668538"],["15025191240166355967","9702314280359229556","11251189526839761176","8667942666009726509"],["8457056413873804124","18300097496577733654","8681686936414962929","2232268656992523911"],["3830408907388637444","5717488587941465204","5514791265359219467","10644461133625466232"],["16369203048596755629","1978506376059550700","5393853886694891553","14953586807897504547"],["6125247726292286718","3482329237659829153","6134520138626429212","10740265018645065522"],["15636280054805076468","11690833647891925078","2591231669255953907","213376553145410692"],["9721889405498365127","9036550465552069441","13712004220101623320","17836949708550146577"],["10386435801801297614","9674653816345133570","4140949071741487469","5950984290048739450"],["7890149761914073699","1741548829190491861","12447929754569566301","2083124440723730157"],["2638990305093594399","623080285418089522","2423898297158060429","5986352302352209950"],["10328841535110747863","17722308994730568825","393299049349289921","7948422816610504595"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["6542864006687909374","10955839372637035489","13793367656744935066","15923764576363661892"],["15352641535069827765","7584503993389686919","1067541050477437852","1386143412966215290"],["17103902420117354744","6450110702272757390","15013551619538050014","2251580832231134854"],["11313806655153358455","6655978921578076744","13414905317481734339","10319133922726652476"],["722771347526626693","14707758857838694278","9108741966103003490","16728764784815085695"],["14416987535663493579","10686425106377705680","10234748488087649946","1819891831784967204"],["1511416748524440991","5760064945127513075","16972318957645947206","10592389264660656809"],["4947062941877445644","17478006648360936251","225438037077274788","491123399081964572"],["9115678156410624894","12025314316344184442","7270491169528322744","8679554844081986268"],["4868664352107383187","13443071641937496612","10316038051893302906","14890466446958900849"],["10497511740244169509","15973042706387030441","16410805617013782267","5909514419999388082"],["17631059272928158562","14056001767066423255","14341647314787678380","1554697227590603045"],["4937487416465467074","8602736713263622175","17403831221097907903","15731865031771623043"],["16835173571033227786","12960471290425788135","611002160304988615","9778535215939201657"],["9591050803360589704","4114638927149356542","7078824155458617218","15499426904863796044"],["773143806176897592","15502443944890225083","1272345469777786416","1451496917540258001"],["8007026400190228383","13324883983793082363","13131811358466402905","17419637269342684315"],["15151486080312827965","213295895520127998","4192772403351914447","315135091764345139"],["18273896145036408472","4654589937925835656","12267928223915091163","2980205353624999326"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["17794389066354259753","16968167554003896755","17142798474524312533","17358330915636040767"],["13643115191220981822","13549123669422849154","13573204700870154992","3509644560728164453"],["17312031302545280151","7315529019386084586","4401614879866062625","14323165232688299498"],["15423053750189274580","7815028103979759879","5107213477808380536","18378911319904790141"],["1052334650278419595","893845263325794009","1778425928326921261","16632344941312459771"],["9437704950321326102","12353030620537396740","18218400116964236603","10414422050223028625"],["11573721289711008542","11966594013047993196","8825999194965418912","2675544129945227957"],["6226712326837641864","2402644522996623803","10297635252262389318","17777104632135050911"],["15348707761400870340","2120577679504114896","11626645754966106471","16237962261285207318"],["10893585091695718749","14198773647178916825","8670045478692231978","1871868330570440042"],["3403773244187419753","12886019934634995358","1506576610808456980","9883233778599026859"],["13686394444185113796","4378296912628352595","2825896409641726401","13742804314294305069"],["19459466550414012","7456672653960261989","1387759516764002418","6283976395049685658"],["13552844314016294863","3210104192472182896","1203086529461330973","5299437952580429238"],["15629068583089618081","4241162206612214708","11237231022973983465","3609913556645006926"],["6035374553793482184","15248034313057759268","3164588961320705239","9605632062788128967"],["14556820687776864960","13658003036109995204","9020639288110338468","5611981923756760608"],["5284784121366302361","15487186193545817751","12861249455041483745","2642835056234132564"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["11430970042686237958","4336996753567317186","12126356232379963692","3960246384779958384"],["8720050460256516963","17944579624244300728","6125475607292028067","14493818620010441354"],["11334420187660406792","734384543086686502","13812340230558491252","3341559909145711847"],["15231976312633852299","16872099891097420754","7038823240043377557","571828371908582750"],["11863154723907224743","3629203388900356106","5812100028503613799","15392116789562108941"],["17523544932906960481","11050653822630341390","17600864620500516158","9555187101928282574"],["11841580820700857954","5864721704387007540","11541432566663645325","8857229306932361520"],["12217765254628111163","16856319043339958794","3401604130663295411","15916703894983853167"],["16554581665871888698","1819725061892957399","12271785676476694147","9135984031992500743"],["4280361425876559700","6960391600153170696","1699877824735757522","4170594191852241199"],["2150149252298961815","7587595696861391345","8235739408433458845","10382639549537010295"],["15559519647661989234","3670624975494994924","1619094376149687475","4497738218378867234"],["12624856283348522991","10316282184904936405","9727758535948945876","15076989992850999608"],["17945774724091558276","13687369196317953946","4198760276502569921","9998210427001392397"],["18304529274717346993","6708982106068386977","11257217159884659350","14291994675872612514"],["5018926874598942220","8786256648003253422","17634542599566711504","11945251431069890332"],["2248176847416381971","18405305816367313007","5018162457835625726","1833954791530188206"],["11986307363022165416","633159435900744386","17273102409911961425","13539855052057717683"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["7368134335789776349","9465036488204563453","13024921428162714514","2432253956973989013"],["10212364716302088137","12344527478789348913","6028540187317148787","15603618579258215056"],["98501940483433640","14419588983614266433","5773209789627138347","6101763967913429948"],["12353168233853263810","9730898518752010966","11761746615619252712","17997432816181244892"],["248741289229432410","5087955234485287811","14868050582246348350","1414690172487904583"],["7855061724619824170","13977735338184374800","9637431735779932939","16259138768182621634"],["8068311618129393030","7237299900952268665","7000514573911670051","5630881667723010582"],["18025987234771323225","3328277661888165086","3996851614014634508","2523091433401980519"],["15144353077977913011","10520906937871887510","6874511673270678927","4411494845098739495"],["5867918678565115625","18271506389867331814","17925969705469542565","16033461499517675491"],["16921048751926212158","11185654062750308887","420684730985599489","3970307421640589435"],["10060015893331791151","7067154311075938945","6381832612170878449","17051202223532451289"],["15420244902350594914","8981437996547148075","17592479341618503016","5556303822103208015"],["3999215388604480506","10450191832551637440","4680750238894602013","7970715172514055831"],["7640627990653020150","2389785088495256254","8886179184341922507","8413514365410803875"],["14427750637096475585","5073282885032496611","12330342056521251482","14241359786624839991"],["1359395974332723290","17467473826428726917","12431100338244530898","11277478310614548160"],["8223573433807244447","12735324451071854035","9377239529275394213","13519087763325892004"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["1534980092340316879","5155415674068044566","2292370812184350890","18193433992785570237"],["9332004104421430569","8531678864567691733","9654277690587003403","15084610379671258297"],["5449753915128787099","5191523405383486597","7174518277860660536","13651960973875624868"],["10486890178438319121","7743146725344340110","17890025264815971174","5790405693840671519"],["1761316949009167354","170515466430075001","9916245072117608023","15284805626963739542"],["2682059405600337278","16975819804190622611","15783740283591790541","3714545511495629529"],["3325450582700261965","15909450787667832208","6161911910016189829","2225205282735456823"],["17717548724402600057","9797828337277444474","7370518363666580011","17703915777166289270"],["14627501836966920998","14589697313729399830","3220908054357370174","15462782513555585953"],["6242701577062567599","5860235292444920509","14094079740462606038","9945639847334764848"],["9012561681664718383","18100684465849415977","18051214797829658997","10802299201142872550"],["9284652274587442844","7633762724717416307","9228756705033945548","7259021317251836027"],["11966272911160031907","4198277317164668130","16355917226355803239","6973461530089926236"],["8581403973300169093","4711277499972529889","5502924080020632196","15466243538295220224"],["8870244202114760804","4952746457583883551","18427790948750802210","13617574495573290836"],["1096882476572083049","15308735334530195786","6359651177267432609","11747057670898013278"],["1930171067034455957","15085997348903541855","16432645207365244613","663805718216798216"],["17031259242310795868","10209044547461620566","6138797035224097457","3983358702866185129"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["14995373427419956962","8733959063575369023","4725142198929117280","9086933932343767551"],["17223449193161963445","12512304412628968517","16277206924307976139","3585473756083341965"],["4708478495892070528","13188426052143523750","17145800804430405394","5993900061809292390"],["653161059675829299","8519733989731297669","658275507483796150","17609440771709711637"],["3309707679575272773","18227006604172164286","8220512554457008388","16608871814896523586"],["335203942079785470","10328768955262423768","11211744012203584700","12898482712843340714"],["1746071989489766638","11793370224639365373","1036490186153011474","17372276616921188758"],["8310068018377229418","4796572365456672591","12720747897008956511","7780956998486793470"],["16161452411453829998","9420044164619878224","1436680398871666289","5882013361766743414"],["8940092121646721512","2242145716308255950","14893525594701492666","1625494630078062813"],["736595219640432241","2690593357661177290","17154776536084561964","3791184482894525626"],["4251936468557005451","13520695578176417409","11389275168195882825","13114232839816158892"],["16998523798972278369","1852200021122550553","16220939199375056314","8913776010876955753"],["904470473697513908","9316860260007972190","4727760484465631862","5964088767089208068"],["16790618419459124892","12342745052237556859","16842526963962982480","2084702365657568895"],["577350928586490310","452667554649897382","7721991627483211819","12735958864411496972"],["18400663313592013390","1483379156798212565","3749288321733908184","9039172183422049088"],["4103754577477405769","10860280201840812700","2877952291054613833","2922463119550905676"],["18273896145036408472","4654589937925835656","12267928223915091163","2980205353624999326"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["435747940094135346","6368781480275570624","14700432540029984305","11165597890310505367"],["7852574530255959879","1966747425285606673","17218747392156273332","7832575278826618238"],["4334254435863947026","76032763717549247","4816588671077322565","1175336794962773089"],["10059380123821965700","360770257666059797","13034164749731174821","10689151879999507646"],["12936206429987719957","4419559372440332875","8976627504191177306","8244285448173833537"],["16621537770571180734","12894906379439767054","10634764181164698472","10393438219629705561"],["3284552157069050506","17851139716561752826","15595421335573020555","17887941278987930778"],["11886482418743399533","12555712724420670124","3091554569627219228","6251872242443883919"],["2667198325292874506","8011560114883755897","13467827033274639402","1518855545010904059"],["10137991004381911612","12626612370642885147","8723818317507096257","14773991695801657435"],["48405435370762215","11033126141473499396","8260987671534040730","4868684435310269748"],["14824334480944162628","14940791675061699607","14668499760216526544","2079408679617452429"],["14148334364256314468","7218651503500974532","5735538347161818509","11093179319274527210"],["2252785780587489758","4904920174739508186","2819392260709633131","4366678959197189846"],["5097508756517627097","1951635207907469549","16826713600730413269","9178790855655046727"],["18432734709320407898","9860676067411051785","3214998903373452724","4189105769019662295"],["833017082531678758","5128410821311343054","17022671664101588358","1589177245145929105"],["10285246344629620347","5988684505243411347","12582676071812232053","12214116088785292741"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["14891385510351200294","7757777542982807804","2380020539631524287","12042457105682368322"],["7378994174106250181","1060556115794497133","7711599373968049065","17722461495225822361"],["2810485860801347688","17066558461634251770","6996507244538787484","4548764098058611948"],["2442260128659674939","18199250458128136452","788754760142194249","17319158214348345267"],["6954176099795422176","16891193994581321345","14148250212078604716","5141938054555093281"],["16633241275776432179","5398527459879708796","9732051285392478410","4911360585126656832"],["2539926910582233139","7889978642298257683","14932950053443578340","5691158299825533116"],["5763631909156726119","1598258892829957101","2932485743025099957","17103632698087686887"],["13768128215487882958","17906153895241340710","15414404734980500274","13968603783095055390"],["6642760310540723331","17449147462632148240","1244452426048617221","6535533503107289195"],["10830504925449342693","12174792218350566657","15272439519640584922","15893174904502930071"],["15774198194147347685","11933465600493110865","15747077524912217084","6576880320831892785"],["10126568522090369168","9794183548522280200","11527094153089344045","6536874558307052813"],["3191340781002041837","10590483926519087093","17852313058194470916","14599356466093668302"],["639552934018805082","15936431173293382467","16531408987720769921","15766723769171937974"],["6374642525938018437","9031866128265826934","17778553821696460635","5465115530331179590"],["13327061730558602132","11185279801890066868","15176299195207911699","17407186922080553357"],["17031259242310795868","10209044547461620566","6138797035224097457","3983358702866185129"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["16684811676825347253","4249467378852176740","10307993912421500342","4090629684445965233"],["5920061188542031415","12393427099768164460","5402716036661776417","9438850803320974403"],["447177823768381391","14572677766641491985","7708179281448287647","8995577223563680353"],["9539955076266221715","13044145928112318194","15783120000116554905","3494174811138961174"],["2608958783334615996","9790137446742725436","2127779993300020274","2551944380796356987"],["8715407134335855833","10016196557510898990","1220453031838269855","7235584416180782740"],["5477336532337820932","12295402597356785211","6981752029182558516","18297811149498016236"],["9135068323140746396","2104541680382144033","15108907447187399906","4910513681220306703"],["7371912139438089317","10757311397197841699","16878151430434365869","2334432292231036566"],["17521633847397077428","12679579447225698895","14365421172330951708","948880238129988424"],["3602753559878269448","10277071075337355025","982428415515777369","5507094468183871367"],["7662835329014186350","6273494080834328089","8950875254953521813","1778250399926859966"],["6355216444212474777","775377647497021846","17835336173430351685","5429617263670322700"],["17214917101648206061","11458135227034029608","12137823959539011518","4108977004545982330"],["18252478126600670741","15813242929063744424","6989095565431009685","14554439122119846944"],["14427750637096475585","5073282885032496611","12330342056521251482","14241359786624839991"],["1359395974332723290","17467473826428726917","12431100338244530898","11277478310614548160"],["8223573433807244447","12735324451071854035","9377239529275394213","13519087763325892004"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["13770425927452134446","6266207608774475765","10111601719366035395","13862616168527606940"],["4696633007912583864","5013985998666855761","8902827619779815376","18068197893575336753"],["9392630410406564464","10169448767855021971","12342248346242181844","5421061833229735522"],["6330062126440508523","10450820736607866820","899498756956632519","11667174243240857343"],["15376300376032337503","4778349668187923780","12320519135917135605","13918825472311434937"],["14518697579655340965","3672027342844593272","9296549925455782680","14971197362136159464"],["14246100827150057043","438045119375193535","6192976582511673275","11251422012885196835"],["4527547836680414096","15620320959612824242","11961567686048903633","1195708286534017773"],["12733676673650857310","15019332020815708764","10488013358735553114","13718762679803541134"],["3885016331492981955","706045197160825050","13460444761455048017","8281754065364857169"],["5962570888070012175","7555940509993256574","17062078697946173776","4562026035106201346"],["2038212508573604771","4357701729105889001","7821236748458751675","8486437043405217509"],["9510799377876643976","17679212240896512142","210417337282936470","7783106861429589008"],["17729892408546638217","7975088030195449719","5810887358152588533","1725589960171994498"],["5401366349979541556","14444885083612303067","12271850054242842016","15575898515407815272"],["10511906010105574525","925235674220621323","15327044305946988209","15360768473146047171"],["5959505867358919429","13914274457865611080","615944506881110773","3955872303472505156"],["10285246344629620347","5988684505243411347","12582676071812232053","12214116088785292741"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["266081419921002698","3334924393479169287","148553997323772883","2052854102130318844"],["1171301652603656116","16943484316250542067","4203808115649959374","10178820751168705531"],["17898810591321680167","2761910254716825366","5538730518136174166","7032930670530989432"],["9262709301269673170","13007012415785525919","7083907324599749353","13170220327326708068"],["13954767235278079196","1043864452580291333","3578748763272443962","9372891647247889108"],["13415471868674358413","16667944408729404643","17405399581145365553","2593036092971945348"],["16600291673431361854","3165417704552853593","1639560252440253190","779042898851103570"],["12156489018092348270","4034272273322867145","4691022707366167902","12371068307448179766"],["1540570376235112149","7563897447940790014","2361476775576638880","2277035251754817700"],["5755703259897280117","11443853825847014191","17470235301170682296","8254563599914803374"],["10953305896320256107","2351283639930362206","2826345658206708356","252554532789981068"],["8520256431357288830","15802330091846928013","12051613248165152514","14075809537129071883"],["9396147263338358933","18052991806801523438","926195702111582472","11641706731681384093"],["11923525308190255004","13181697293570640680","11652401474145047068","8644687387980634902"],["7569566806796714710","14110355862928007266","7891918249842212164","12039217349690533794"],["12074182523656958776","17629641603297225830","8300871169057847195","16726234279113475946"],["4666982782759574938","11098922338841470868","14712535453118724196","16094184562115921067"],["10328841535110747863","17722308994730568825","393299049349289921","7948422816610504595"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["10920829460832162644","7699668244363301503","6672312677170487011","7482167675032079188"],["7968033639145339003","13793455233753990578","6662064095252519066","13156917208411497682"],["9658691077644261539","11044671658318377030","5037714604634700873","5243728889455463259"],["4512459535205684937","1187977556972359391","8346962538285348699","6944006145818639725"],["10327979563055111668","3211178716980900737","13280082680386598702","15866926153140842522"],["10566144315838819711","6619019828475895712","3978873396099376486","11971209640256543622"],["4961961591322513265","13379260992322824089","11598365379722693523","15280904034904032635"],["1570572770557954369","18092824483140917318","8448265897513788640","15403453446831819604"],["8962923246036269932","14184623066633400131","7655654663076700074","10484271323750911702"],["9274960656523056056","16824354507225065390","12181834529308356827","16185740877652848556"],["8499055486416863909","6335963201546609139","16188371562361026398","126907164614074429"],["3537213585575545036","4962418225902400339","2502858735272434887","14510065253549472034"],["2903887693074435618","14344170329842987394","18114094679466085955","12253037272694832343"],["14065383309185267316","12492709092597480465","12029529659909379741","1690355468011450273"],["639552934018805082","15936431173293382467","16531408987720769921","15766723769171937974"],["6374642525938018437","9031866128265826934","17778553821696460635","5465115530331179590"],["13327061730558602132","11185279801890066868","15176299195207911699","17407186922080553357"],["17031259242310795868","10209044547461620566","6138797035224097457","3983358702866185129"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["397834534988167560","17498473712570064806","17132761523972137888","14689845930411423045"],["4096818574901326021","3596398706904737728","15350824976929407630","7209198845034781654"],["7862394203576131535","9457112082060938705","6436663686717310435","1425174259453608542"],["7031616415587264871","14396888301600029369","8054560730414715065","288211973462481146"],["16363127070494094768","16920415662374863197","3093387797174495271","12517225114374203655"],["688405823509905275","7068025082258746859","17659344409903094856","7240395651695882402"],["6292310757704330206","17829291792294980084","16862561061427887808","7539564089925019720"],["5954196449000440437","6599160562201902625","10242147633223709337","11758996275690695893"],["12814853525071401300","16337077639650242642","12275690427712294134","16295297487111028255"],["8760325707609879160","6301694554570190199","4829708661701790032","9067218022272553328"],["7469050969836982272","7806298774556480058","14083224206166107031","7521096216545382822"],["665883949897080841","4923732889469111528","3169713997104787905","149387919423648305"],["9548853712945149615","5405570035974537621","2350936385205305004","16439506617746829705"],["9290568312033959770","6915630365666973620","16517185102506512590","2422908832787717969"],["16790618419459124892","12342745052237556859","16842526963962982480","2084702365657568895"],["577350928586490310","452667554649897382","7721991627483211819","12735958864411496972"],["18400663313592013390","1483379156798212565","3749288321733908184","9039172183422049088"],["4103754577477405769","10860280201840812700","2877952291054613833","2922463119550905676"],["18273896145036408472","4654589937925835656","12267928223915091163","2980205353624999326"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["18377206485338691471","10281897206897487494","170360664235588419","13020643854859514785"],["18044399155406844949","17469815566891775417","17174991822791024722","14418482960550561852"],["7329598496262285596","7781462266123281844","14755713942773227784","6229871156296838122"],["16750070801975579240","12292336272043724619","5076630060846180070","2701295098346930029"],["3122473091536898822","8318474264157756394","5442631626086008344","6902831013411865867"],["622833146532950568","11100832746623513885","17479765053298135457","14105387201010982666"],["17816097214204608728","9494468689931435787","10682475804462463844","14921180701638731386"],["9941325404678734444","10564155731544969395","14690736743948031242","6982981714672798139"],["5723702629179010296","3580181932038816199","1813520044914599817","5259988014302230210"],["15828201241740927227","17384052657612066910","13884219315444117125","9193037057775701036"],["8460156179042265629","5789064329833216192","1064848638359323318","5321140315585371095"],["12274563983703022795","5418334487077131477","6158149294693389028","3843709164201542068"],["12094923953707650691","15644263845956176725","2655436569499584418","16114488887275396975"],["9751368101165118218","8773940485169148173","2268257580961667230","1532886534032699715"],["14991683077835208633","16986793466468006179","7092322856458477597","12416673435482454930"],["5018926874598942220","8786256648003253422","17634542599566711504","11945251431069890332"],["2248176847416381971","18405305816367313007","5018162457835625726","1833954791530188206"],["11986307363022165416","633159435900744386","17273102409911961425","13539855052057717683"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["16688889558807354751","6164531241670241039","15722021886432981882","1512833452253946236"],["3885200748372921693","9904916318359357137","3129333424184009046","14914130250091957045"],["6362686697777082357","11633664049945518745","17381849035521858859","6119172775071990196"],["5030313146120921044","8021068855631032683","10599357985083445894","15445375026237455729"],["4071091846391799346","7375999583123265059","5271371001023340792","9405831639950456140"],["13388047296509830842","11609520145085976396","7360048258100007122","11907282617460730853"],["4633223266308646147","9377468617632408637","9384365364720280829","16197532834765701640"],["14817897985870657695","5821868560845419196","18400988313193104797","12209846968237287778"],["2129011547455413221","6358796101748754971","11633724696662374709","7643039071524488784"],["1316324098494410074","2423099067269118740","18003018641616584578","10512713434742628663"],["9424846059957961203","16187123184236401469","9101844145933309410","18198728851171209488"],["13472429646076071362","277589588023065767","909147273890619926","2527807527927019802"],["11856330934558398439","18376067854312158155","4320352101152459300","12591084110216857379"],["12725125842102133004","2783601886445534801","5418002303579604953","9138807486443787279"],["7326220100005646974","14026484732295884121","7653321624652868226","16883878871267028113"],["1482237537202490040","5701144076616474935","14625649830663971088","13587065963889392403"],["8270099677644188730","16141342228098838406","11295271929738010479","14185344545477624943"],["4103754577477405769","10860280201840812700","2877952291054613833","2922463119550905676"],["18273896145036408472","4654589937925835656","12267928223915091163","2980205353624999326"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["1608365822878306426","12741348515621470960","6780988828574747115","9176195821060492331"],["15661809218149458566","7063557348711915931","18309722514826243212","8716846210660699949"],["10651896233501770343","15379802308534706067","14815201212460327404","515876957745701879"],["12704080856367094624","11723084227503184815","2192700890485071897","13831933840180736479"],["7195082619722641485","854422238381801481","3804182275483435228","12299139737589569056"],["2682069509655551683","7148975946996578226","14704812397373966554","10774893213870807859"],["5944491288026688742","8440449008546003990","2533890516166739831","17890688458233387707"],["31023523177521568","10558156424553668687","9820080952532580458","4208263085456253380"],["13335194362483631647","7940233554336389791","18057928046025565199","14133191944700768317"],["3534573497600742482","17166402340520406644","15896827251923452086","17980349576378220358"],["3352079534135625562","3351879177533542167","4635392406765461070","9796404380927195522"],["15718814740994903175","10091614523015087532","14177614771787005433","6901648538973945823"],["17661710398307505386","6896541371247490419","8097434457527582952","10122843787189139742"],["2002649068320004118","6028535843571279525","13455407648039746086","1617821367249320827"],["12691502699944997840","9249506815012371234","42735587904049047","15351077504090332281"],["12521194105297987920","16028241953794471249","3719390727258864580","518446486226107546"],["1930171067034455957","15085997348903541855","16432645207365244613","663805718216798216"],["17031259242310795868","10209044547461620566","6138797035224097457","3983358702866185129"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["17420806969875268695","12476688684763001189","487083482928003006","4201712902937393711"],["2185463498309422780","426316235533730553","3307049893339744592","15489175403882737615"],["8841312577722296929","7839187934416731230","12444393874080075855","5823781188015815158"],["1133182113792261276","14038625505125443791","13645858033554397877","1648920545892685062"],["8247926570572705446","11167430442582320892","9776451958659396645","6945444313926737630"],["6118405504734877656","6964150976895832196","13937858222818743112","14275581596591383508"],["7620806268463535457","8392762702196939918","13878963966459527640","6592626599955480740"],["10810780202267944550","8107044451332581489","18066956863582913313","12363480299451201984"],["5049446189598365444","13498535497737434194","1905587917092162683","16377144997236324050"],["17233371063022434655","421150138120453464","15308946218428902784","9424814450133547954"],["11968890887133995210","12969878013170329692","18324200841977350169","1087622854438685408"],["3979296826416125395","3683279420467584670","16921443122032358605","17138059199144681385"],["9424694478649024077","5361932489244934017","442929560639742159","4248835298657719981"],["7397791780770400416","2368379469239470069","16970465668179475134","7319851611256204942"],["4581279446930170873","5683759691821438712","6397745053883649023","1576478477958251282"],["18432734709320407898","9860676067411051785","3214998903373452724","4189105769019662295"],["833017082531678758","5128410821311343054","17022671664101588358","1589177245145929105"],["10285246344629620347","5988684505243411347","12582676071812232053","12214116088785292741"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["9273704682190976050","5579699850699988321","17426978672285298954","14981475579099848212"],["6146424510525740193","10808982391887811954","16841247036945538774","5680478484622484856"],["5227911442291903390","13802115609162939399","4083981494809670582","5705866659821590337"],["7477123505141711954","11280357098172573944","15784465841210600730","10026777502238735244"],["6631263449224988269","18260776755709341106","3668958250418032599","14192749681984079540"],["10611817643720544139","12221114460802470759","12955446630817500463","4791547733498420413"],["848004751087437422","1895936438276644766","16204045158896905571","14854489008988126896"],["16128064305752784597","2450803514279066937","8260503963298617556","11533519584246652970"],["3572896441229599811","2308281711834067265","9516184009619293655","9612156629657301454"],["15091489829803987779","6142637547660581316","174189234386194396","9263160487334647464"],["15355882212847621261","4179531975814831038","2966919803967216440","5017662036304380739"],["10854667437171313725","10265153189690269214","16892107808256551216","12461416874417488264"],["615651682183731900","11138192372573281085","4906402443002047550","549851969171044942"],["12193049957505474903","15144739729382754348","12361450256019993798","14085190361348949729"],["12691502699944997840","9249506815012371234","42735587904049047","15351077504090332281"],["12521194105297987920","16028241953794471249","3719390727258864580","518446486226107546"],["1930171067034455957","15085997348903541855","16432645207365244613","663805718216798216"],["17031259242310795868","10209044547461620566","6138797035224097457","3983358702866185129"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["8065649239614535920","17631894252986223642","12146774751505324235","8719867154409766642"],["9101047599438347675","13387494808593671546","4718320562344674719","1481651999525379238"],["7259148172757006280","3221685598113453725","7378823157395648723","14057844956248327660"],["5516985321789433849","10362795537732516668","10080335083000095390","10282735638602490495"],["17792296618168096796","9721627214280525191","4924175135669490986","5150104676261525806"],["16986178828531260084","12158811207690561704","8013756943862823014","16109576992076735338"],["12951213143742038151","2329967404518591739","13338269121625667793","7940671547652292914"],["14774232135732701353","18317389513228593053","2416628790807870865","15317933583634320980"],["14790385745251018520","16636172329080524953","203880838593233043","16728412871183740267"],["635765253725150894","13891066177866553525","8147497911807141613","2921049118166719440"],["6583748010223396952","5528586096867022412","6486152367045065418","522236327744462261"],["13202450153307723113","1833114789534368875","1495813843829939377","10142065347563500374"],["1624068627766826922","2706900371229148607","11814483892368535535","4513698530855577439"],["6403322095951123150","16431905200831192738","10024420554706353799","15209387395699142062"],["2144138491751133182","3771633665995630026","9222618916997864047","227053920301994972"],["773143806176897592","15502443944890225083","1272345469777786416","1451496917540258001"],["8007026400190228383","13324883983793082363","13131811358466402905","17419637269342684315"],["15151486080312827965","213295895520127998","4192772403351914447","315135091764345139"],["18273896145036408472","4654589937925835656","12267928223915091163","2980205353624999326"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["554579648603278938","471672972319314648","14528499417574665510","17991440051303432796"],["15523875521361305031","5808311156917466122","4085308240857251036","212443692342454447"],["8472027213592098770","14836032437949820676","10963451755760242841","17802179759569363616"],["3631244384366820666","7419779015043949198","8025504629106467660","13055972270851969421"],["11824408474333281461","13838902371108411503","16486487165042661590","4108536596074616486"],["7870372960921701370","15709349425428366455","17526504948293303101","10322469611235782838"],["11682654080350547863","6720796047203894438","15381376100464488465","7285959711742150904"],["4936489395061297862","823431681195428869","8514033196172619664","10258948670430769703"],["2941879423716906805","12520797594767818699","2574169366878440458","7677551516425285560"],["15489030167114431136","17161477733590133655","14765441316269472467","7756621772655847784"],["2462020902495582593","7763567290189163783","6698293269376318485","1427377378973672130"],["12558594439814517357","6697037184442444482","914253735923717618","17414575673066013972"],["6720363928767954702","4819849105520892790","509422892930820558","95368399328221436"],["8674075094788130439","4574113831119620116","13537053115268114104","2794687202140841825"],["12966955175069731749","3323814249300295504","12937854880460829006","3042322957983133905"],["864623223558688051","16936882380751832739","6383913236424386415","11673856621295279158"],["8038759102990724569","6549978712143419250","5219963468229281621","16552639010174796646"],["8223573433807244447","12735324451071854035","9377239529275394213","13519087763325892004"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["4664506906771828002","4500471133716963924","1376467073910123978","4841448633462135028"],["3895054474498929431","743473454603726633","16540757907988482641","16229539576684127729"],["5256953857696128494","686318387712220205","4672504744658951619","3556252324907598627"],["12272730461323730458","521075299471725036","13951886497486401359","5248866000940661905"],["12714079671694031761","927120454963543193","7567515649264106516","8789564320601314632"],["2223457790863896821","2468815917937589450","14555409299353281448","294119048066291140"],["1194480500704590787","8598172746585724088","1771764160502438492","8846576408567977386"],["202802400997537544","9491862201168606009","2907603664181970600","11647131955817515041"],["18146995257334264359","6476685237602961790","12448905845048047877","6198177898610376456"],["4939252571810494150","15629374939827785276","16696419239556362499","11549209649272002756"],["2449881135840627865","14029717536416073582","7779393179001969346","2224486778857111551"],["6868786357149708594","9048531435056341257","9469848296194721529","8995911276062831000"],["8791846836990221169","8459350753689497137","9736900772247866214","1992095083464078911"],["3898112093445165496","11169098766862611814","4037203956178792317","2636177816127239447"],["11186435646259451676","12377534244008618429","2851810009937761439","6585120781335737038"],["2850718694171365550","8788309301963456662","8615833282210552076","4508244918128419645"],["5959505867358919429","13914274457865611080","615944506881110773","3955872303472505156"],["10285246344629620347","5988684505243411347","12582676071812232053","12214116088785292741"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["17278455650878897540","15350340784879758958","15041527781556976446","6399708351259428968"],["11414397852492024975","11352666880870504461","10963479855483216108","16119887913111525167"],["8300841963036285585","1955389037700500712","8380427179176635162","329908120810711373"],["7919604355016132572","13606115147177162359","12305654104218716495","7631187957363055342"],["4630199906763343969","17214276876666126134","7354269392016564391","4623605644977880918"],["206425578315611444","9049485690592415683","3769040331232345307","2047750110175018479"],["18240067995155746063","13099922270140117629","7163869578476832244","12237766974445769427"],["4130795263874305074","2020445314093236721","2895759882825000910","9303660343190037817"],["15337184560830638071","15529263717130177099","8877110998587619817","3615998812559671365"],["16620052719009641163","12889170625594832432","4781433749584572428","4129588826207798951"],["15603885387739468303","4778668514965251836","16505133514828881249","14419188849893827977"],["5958156015328830766","13737247593578390756","8057812491527265186","5492937503953626270"],["15106567194697493347","6900995722498914658","5677282421170000171","17750340800481402577"],["12338343222847836539","12178014641921383728","13461221080692076667","289517712208399570"],["7326220100005646974","14026484732295884121","7653321624652868226","16883878871267028113"],["1482237537202490040","5701144076616474935","14625649830663971088","13587065963889392403"],["8270099677644188730","16141342228098838406","11295271929738010479","14185344545477624943"],["4103754577477405769","10860280201840812700","2877952291054613833","2922463119550905676"],["18273896145036408472","4654589937925835656","12267928223915091163","2980205353624999326"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["5206997014020861503","7201054981351763314","16636416405737884048","12361541598608866421"],["16911344053925407181","3535158256479700152","3946416095360530982","65467181945288670"],["4411061112180569263","10034411656389482420","16793151263260397867","3759075625624521464"],["6626188765882744680","4620366706501490068","10993858139778048976","1074129149909822116"],["1219138775123511012","3730951432101261392","6610074812255188904","14248026205032724920"],["10390039096010812303","14636382040107161970","10673414491155490017","17570268697395906969"],["3208253234103210706","2712631063780835436","4918518219213022183","15912682562210869507"],["583155447179643965","14948792658945915071","13281138635467029680","1745688481301321254"],["5211538332531123482","5029691090002101081","11630637930159033283","9878680973462020265"],["12338702881381056445","468048415614009168","12614770744324729873","1864672370696056762"],["2846092566928437864","10731309019874458933","16248481883573342259","9883155433009733251"],["1779090285011807578","16575325627445342441","11493435619795621729","10637270279553183170"],["14211377193055251172","13423925770275313350","5052005974188648147","17152924877385345336"],["6907188461764869946","17647873101523111802","8313608810936705748","1098025019798869485"],["7640627990653020150","2389785088495256254","8886179184341922507","8413514365410803875"],["14427750637096475585","5073282885032496611","12330342056521251482","14241359786624839991"],["1359395974332723290","17467473826428726917","12431100338244530898","11277478310614548160"],["8223573433807244447","12735324451071854035","9377239529275394213","13519087763325892004"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["7405319916952539585","5787555034763361174","11363522303014522280","3469908090195497501"],["11316633477851365351","11271765024898889826","17801091863526917173","3084919990380743416"],["7464032020464171910","7686728147142401701","6761362097196314990","5909796865511540737"],["10509929837520096029","5410554568611836430","11229603410021777884","14417106043771981190"],["16112087899208919559","6744177324686968788","16434268921185556067","8186201014236440408"],["16089596232631422053","7602023760574932407","3942723992150085746","16580561815196474495"],["409120439618184644","15869440230961832497","4135407219550776790","6785570584672163246"],["6392517582920694693","11597839501551906594","16331610832113335275","8442281344522860469"],["3301157263091134321","15229973512820987995","6306683189398413621","6053258076636399878"],["14498672593022806981","15351479541914827319","2681390283187115158","7247328102249327277"],["1502848793501033992","9970062160592436401","8574953157307473034","13794741711302563492"],["15668933589168564048","4018874144870735714","18350001535264218009","17827460378009892556"],["5201177752287027652","5626146777534605543","6146646321476643282","11896193253900167726"],["4080470584886992250","3530506537580506089","4477355752694277703","3437971329811504042"],["15455914299051441192","7136936650120675350","13513895212175319682","17236278382842222010"],["1271769017335026562","17464558245043839450","10652169361117694624","17933582535684792390"],["4666982782759574938","11098922338841470868","14712535453118724196","16094184562115921067"],["10328841535110747863","17722308994730568825","393299049349289921","7948422816610504595"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["11046724213658634636","11757535268067595428","13882695498358286473","15007367613332821748"],["5982160373042978398","17456454923707908947","1779398875361164599","606978019141040348"],["13451686105245656931","4276913081825675872","10691049418474762256","1192097394865369763"],["3267350797562643407","10168936002547812753","3097017008315562514","1538642719209616462"],["17216549278294057076","4994068265656133417","1998011075989590004","14564623085533957951"],["6657834133082766573","1197960692672366306","16869593710936420917","11491355708817835722"],["8763476937010272409","6990429298970449400","4711152331763001042","16050226453724174943"],["3091339866556662677","3380885041006600028","12220697795544821096","15749988685851346268"],["15244253194531982463","1174533825532393827","6417631844532330995","15780146711468093596"],["6781577331015412350","14967068180025307843","17125565745864126566","1948253091669118260"],["522437941739442294","1555167605128414312","17492925765857879134","11456035558535218361"],["14776261610850229945","12757358946193890411","5479034058088545274","8753675365554805292"],["1830823864817596748","9566337494248077783","7434163930582530859","12186447263131317474"],["1484362712049608656","9021143867082576858","11599518181510214290","16299591547165565544"],["14274473401439829095","13472495620657141524","7123141793775863467","4468647443411483913"],["11846742995734868103","6042862746396813564","12940251902918814671","14666973174530898292"],["15459605043085290031","16454440874580942739","1657398441760436382","3955265482047547006"],["5284784121366302361","15487186193545817751","12861249455041483745","2642835056234132564"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["17799387256645059614","10685682009039023830","18031829282675256485","2709869084541101056"],["13937328227433680475","4931991201034457162","1543850933798041512","8417219939529011854"],["1023784047093680465","17512685374585459296","7017912485664970000","8165561834964620629"],["16457121832135117862","12278092394263962550","14972919455249492880","12520210818581475874"],["17989702238728711220","11160431458422732922","935450277114742113","2978095267077164952"],["14399937412494952294","2574224169700590551","3169174293100703901","13643939891527268794"],["6339368012139659599","3058878891644893912","14769635170567359610","14756266654976245045"],["10324108598131301555","230421821517347319","5688889095253449995","1831067975938392525"],["8918639268651196790","760398110534802396","14268285005903170301","10060887841219473649"],["18265595310158871283","12503167699668326801","15656979406390506792","8823179351615119074"],["16764933123002174823","8735799803221322545","7975644042657764951","11628995287316273830"],["1310859080298281414","7409225356473745036","1789894527142284524","11050090508474390312"],["9257651264929052253","1472287237994534508","10824990231932319819","7376176422365457874"],["11181939629365406913","5213462122896343122","13972351790275804087","4988604075140301893"],["1366105239840163393","11437263373545446237","9252317540657715929","410103116481774403"],["7253894842342192777","10437234099992381443","16701137802274037705","5535481946232961765"],["8038759102990724569","6549978712143419250","5219963468229281621","16552639010174796646"],["8223573433807244447","12735324451071854035","9377239529275394213","13519087763325892004"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["3523621698927136056","3014855289211098591","9826789431285532780","1442887553456151783"],["5003877577420059796","14750088750375984512","13068216951527217090","11720348402865031707"],["16502366040794196044","5565716595331795262","1101593313758906477","13135132170467178938"],["15882069504520644792","16623064671089968321","14290695441695042073","6825216107150125130"],["8129583946466799335","9681576503166149172","3670951149176268039","16379946188902332161"],["16478450632213966758","7652667473907331400","22837669822382827","15459824350994520863"],["10366795354455060222","5022168151072870298","3807459229336349149","17093440402496291328"],["12884072262346578561","16900153993609979114","11851988270959465515","1133680709063315602"],["18146673651363759384","2657052564281210668","16064779001026366820","17615427467720319655"],["8168689153871224405","9632304102810272261","4692759756329302944","4557820716021273972"],["6758377752112801861","11577102337406932202","12715814943524180579","277914083092564858"],["2354029886177034736","5732959745214156965","15949592640608312287","17632382326619696006"],["10430676331228246674","8719290933733348553","9554649046017758363","2473684033727464552"],["10686628096924183198","11850362642356867368","16423536004525770310","14119502858805279469"],["9124421456250096014","10365196647434837275","4614493492349090281","17245228366238778"],["12521194105297987920","16028241953794471249","3719390727258864580","518446486226107546"],["1930171067034455957","15085997348903541855","16432645207365244613","663805718216798216"],["17031259242310795868","10209044547461620566","6138797035224097457","3983358702866185129"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["7493430772488154919","14561248976533756546","13982974757012471780","5661433724569386556"],["13118977328101944899","801543789811799941","16780197937358216397","14852376965502137787"],["14594581456388900953","14307921165502250749","733456189471552105","994976453636199264"],["2660228999282623129","18191424379160628342","509339675659154349","5005161457633489620"],["15978220142396659844","739166035695788710","17100291281455570774","3871258590182575878"],["3215896485180508034","15382298137952430473","6455850852546014583","14648825415718744728"],["16073313122051256542","11671210618011959030","7408071056231607781","12374267129446084798"],["9823441244163661326","14424418391378964365","7207256584972985349","11599886525097264494"],["9946473309263601394","4058837245933704792","5942411257465783176","8551157455385375613"],["10985026754901778318","5813117543271434636","15376753449297598112","12972445952171158234"],["10672296935592123535","2618195896583240867","11671284360315785971","15289992633319252969"],["8879299454874632349","2305312909887311585","13925065389213295197","14356699516504146733"],["4800508902239968578","15876540818905556746","2968054645260396422","14177511582277012919"],["6519359307648517049","2503047569949509654","9585109758109551388","6558782259329993566"],["9374039368067042498","4069870926705807585","17475891656938455625","3448597867986869330"],["3653176997009613377","17967822244882704082","15272817280236552426","12308367363052024853"],["15459605043085290031","16454440874580942739","1657398441760436382","3955265482047547006"],["5284784121366302361","15487186193545817751","12861249455041483745","2642835056234132564"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["12988313743711786726","15333547983461671978","6143253205199513984","1438731123529364423"],["5035073027471442193","8188581609997031040","10761739584856495346","6181062630325583558"],["6319558572460124180","14941232905995578354","9419950444431844450","8916841166160241241"],["1448858894722661366","1617377343326214753","9612456863275566007","16663129716982855400"],["14448347991155383941","9053102973419519392","11154987611898779080","12296166422116772951"],["15305721922984513494","4567180861137390568","18226799660161927763","16814155859900226596"],["18111029087823138506","1731930899144795509","9502441877581279254","15479535441798222503"],["840709449837842095","17478767045013458293","17274976987407622759","1948818579940758130"],["13358179021477923238","17406155885986939359","17977556369307114246","12467230194548312709"],["6705194890454111609","5312690904772589474","9333548903828031416","13973068156053609687"],["16519590330822206023","2736170941648678626","3212353923001484891","1783397329403064875"],["10834276470965899780","9812307869211693940","15848944188718922008","711136934248507638"],["8949902551874498777","3733978829576970546","16233588921489998659","17129350670796419793"],["3833178003174927503","8623327081522160934","10191381440772539350","5143615624615290793"],["5771965654246097422","14077405003172123667","1531744028155168297","6521305264971489287"],["16240240530991426720","8878244958090947306","15041005579610432073","699026748026005941"],["13327061730558602132","11185279801890066868","15176299195207911699","17407186922080553357"],["17031259242310795868","10209044547461620566","6138797035224097457","3983358702866185129"],["7913072803641343737","7418082571160734421","12111806642508340673","13174242972814246803"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["11561364895461295094","2145055895731361723","4321616939240224851","10694224406750909833"],["11684822104311565515","12184879005780486416","13873309597332172972","12073243108498742067"],["13686913416849397761","16207762429474603763","11350872994055277437","8762070650455324971"],["10849741216106092397","3615763517194473919","12564588157283605092","5174152918718665858"],["17859431396001492311","579403747651950533","14473952667571958716","12295338922283354818"],["9448285308286619257","10755355581583277065","17371586619776811711","2460171839303333908"],["9454580499758708275","4917720324926665201","2089531519819324402","15235881493599705267"],["3448039206478856936","13076462270598787485","9585415352154249104","12384760040493804298"],["13455906397234956548","9061093517750372859","14270943307045150103","3201615861935943323"],["5755703259897280117","11443853825847014191","17470235301170682296","8254563599914803374"],["10953305896320256107","2351283639930362206","2826345658206708356","252554532789981068"],["8520256431357288830","15802330091846928013","12051613248165152514","14075809537129071883"],["9396147263338358933","18052991806801523438","926195702111582472","11641706731681384093"],["11923525308190255004","13181697293570640680","11652401474145047068","8644687387980634902"],["7569566806796714710","14110355862928007266","7891918249842212164","12039217349690533794"],["12074182523656958776","17629641603297225830","8300871169057847195","16726234279113475946"],["4666982782759574938","11098922338841470868","14712535453118724196","16094184562115921067"],["10328841535110747863","17722308994730568825","393299049349289921","7948422816610504595"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["5265544169461247473","1263243477320079094","10560053482382482875","3270953696858586229"],["17209031947013331970","3189620123892460780","9097519053647086398","12946783447474920672"],["17440786678858925790","9864268380070327022","6932756555261972422","10568741070259695328"],["1340617552392044484","1962850260264783460","3306151392360841218","15925408239955917519"],["1788577000744632029","6862417963518312905","12262178711046159760","17929135020563424872"],["667766966525336503","11334405508553379412","8724605060238433200","12537040305895812623"],["5969808261850611860","7587529998994786995","1647513446695220897","7793064528502234605"],["18182261732509722801","2182462154378569652","16060742864253200066","3682524676339860199"],["898220081031431601","15804970881912586831","16327762516644130277","11001596144035902753"],["7138555675725322185","5242719487800314239","13977358732845239875","5773039785360667400"],["5884298734466490225","16899737140093306792","14161968908876399796","188700380626587898"],["694134756389636684","2931741334584463607","16633434412839378441","13524544731104915100"],["8634566812827298436","8708017278288080611","9581574750385330561","13506391170318585485"],["4955052817290604049","6793742362604917929","14742379952914521090","7089977503998048516"],["5097508756517627097","1951635207907469549","16826713600730413269","9178790855655046727"],["18432734709320407898","9860676067411051785","3214998903373452724","4189105769019662295"],["833017082531678758","5128410821311343054","17022671664101588358","1589177245145929105"],["10285246344629620347","5988684505243411347","12582676071812232053","12214116088785292741"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["10698325300041541711","2603097329174982435","14843799759542408144","11659017172537431129"],["11805684143099912756","16301913945246871615","8916943952765925394","16478044660063737218"],["9292494257484924233","7576030691383282398","11986784302734315998","1650935850030010122"],["3539521995936335436","14229529993281223021","3340147010909606357","6382198190189212819"],["7786646046978120255","15053430512436801801","8968593587005781964","8708488995596728107"],["14930726947238642394","2552797883868194417","6916382439936806060","14704144293643895936"],["5712488921243919425","11113756357049173748","5110283376960592606","7435536842064240453"],["6813057217952900431","8874435264746613703","12448750117259515802","6859191627496202893"],["9018182129562828704","11929170617143553767","14042346318806306227","3337228746498677071"],["3297437423550658924","7576878227289417551","1175550181561695476","656893084404013539"],["5141526711757373669","14514705065129262039","1104257002765892003","2208325425733197408"],["13541344803687718680","16204922968522351451","2132821138008369025","12039215424697897519"],["8388145626861900016","3524049157068619536","12997308785960691596","2331087356892582532"],["704376518308742981","1984574131907959332","8738781193515243857","15249773763237390522"],["1540355584641150889","4010066489574393130","2449131028863226670","15515282732141438868"],["2263315128228736620","13850579769296842603","14494153920756019250","17012643138697640457"],["14556820687776864960","13658003036109995204","9020639288110338468","5611981923756760608"],["5284784121366302361","15487186193545817751","12861249455041483745","2642835056234132564"],["2544661808463117521","683964126377499901","4042017889268280789","3832110783575263946"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["11665768066046276522","7478706598947573187","5046002161648643011","6542697618519448667"],["8667871982878878098","8063217877824884733","9551407809968367845","11629635900307728146"],["18207671423042933996","2007496305150757455","13012995058077846912","8126088190982806286"],["2067621783014366829","10105869203292496513","5416938664899735890","6286110784626264723"],["453491188889129392","13160098316976370881","7445832917636323173","6167053735388986445"],["14698854257978820727","15127006856254647514","11464660254890798786","3763952384069426445"],["4290408166890804847","10920287944132879758","13608783919859095713","6196748183863193382"],["3359657204946824928","3433183072832464621","12511749515761926923","7301683116332131298"],["9076978181159067431","7486029246946217258","12367696539916252785","3615149891927342821"],["3984962327378904334","14661658276989386259","10372782378332535934","13406626535481192740"],["4933260229898777271","11992836283191396602","18257263057979069070","18163453213469829436"],["7316951322473261757","419201816060828032","3730021856534252577","10193372037995386681"],["4783593045117384694","9361701899676758926","3818367296302582545","10629606479641262066"],["3562520625934246667","1866842233839639295","10773630648735837018","11407403396953830616"],["14188296614541006509","10932667455429302652","10543068376576426554","15311541649800735814"],["1832980040762130679","2760973350063919922","14474061809239478723","13924714309359923956"],["18400663313592013390","1483379156798212565","3749288321733908184","9039172183422049088"],["4103754577477405769","10860280201840812700","2877952291054613833","2922463119550905676"],["18273896145036408472","4654589937925835656","12267928223915091163","2980205353624999326"],["6426949034769906230","14721508827433393137","9624964880468320417","11794113262303710646"]],[["1291859258189674649","8734250866060477859","16504571957806361581","16535453847859724106"],["15754936964531151674","6469304042230112298","200956154177118873","14753198936723913252"],["1155570381610263067","8636655745444179958","8757044662719350840","2743767089321353215"],["12586748082679749667","1562093906889364784","13956418439350220741","1279498285967156759"],["7867780161884468709","16421937443859232996","11861433660148412970","3747273953641423721"],["13378306844932814864","10034944833666046982","8549452240883224126","15626434400291427257"],["10560831384361487753","11125071397871231134","17498178895293999521","14348286574694808703"],["5105148717850527001","3224315480666799307","16708755428063000116","15820019951726813140"],["17641209251542443906","9101204531303954601","1445232066797890020","2173776475010848464"],["18408467553976407446","15027843049108123706","9366816538356398381","11073157050081873839"],["1639796799578265387","10367404698143800112","14878658074092393627","12362274704746200645"],["3824779804422812620","14774719028259099526","732271581756770631","558105774579504433"],["5255543485111330405","2678932664105805027","17975870602037711012","3088965255404650563"],["3898112093445165496","11169098766862611814","4037203956178792317","2636177816127239447"],["11186435646259451676","12377534244008618429","2851810009937761439","6585120781335737038"],["2850718694171365550","8788309301963456662","8615833282210552076","4508244918128419645"],["5959505867358919429","13914274457865611080","615944506881110773","3955872303472505156"],["10285246344629620347","5988684505243411347","12582676071812232053","12214116088785292741"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]],[["17281284645976758601","8229774283921573115","13008368226911194643","6452398344886347077"],["3989764400558817648","16667527789487260921","1668048866862166886","3653204361152104248"],["4812284837984291277","9450352838001292562","17748754605337957489","1162866118634325701"],["102681989728334890","15452335139151395906","7840281659536475118","14986699173372497163"],["1805443962026740919","1053096816667013539","1521143207893438993","15843399706785794232"],["14499879655549612655","4598192902641228830","14249033883007771511","7513696699449945908"],["5584003218095860648","3827438944360698065","3127449329949145997","5139385446696417897"],["5228023268449620944","3739818348964412476","16759906951912624483","12995507210746045194"],["13850332434201151002","570343220074020184","15674742486024956186","3822859602423024890"],["12572038266890553635","3944366791735913804","1849609623490501053","7015027749061305077"],["11946703944931502489","8905408466257038540","1916517975711866323","7182102291863592892"],["13604599975223382024","5419666703552680201","10633955919506265978","14807495155050344536"],["7310851901781408032","6837918672583311835","4119032045092430791","6586963140922679908"],["6907188461764869946","17647873101523111802","8313608810936705748","1098025019798869485"],["7640627990653020150","2389785088495256254","8886179184341922507","8413514365410803875"],["14427750637096475585","5073282885032496611","12330342056521251482","14241359786624839991"],["1359395974332723290","17467473826428726917","12431100338244530898","11277478310614548160"],["8223573433807244447","12735324451071854035","9377239529275394213","13519087763325892004"],["6549865116666919","15305663941295235430","100996591782156948","10459493240978054580"],["2828828591418015398","7386214155307213839","9719927239278259740","16174986156349806789"]]],"s0_siblings4":[[["3086416024938855640","17983638388432218442","7611505035355320914","15598627564467828323"],["17086529544403985750","8066184789405973929","10882506017364802303","15302939993956062012"],["16993066994717103411","7257905346669613016","6922502601017680449","2577138478644683026"],["4251403814484594186","16267530286144339023","11731753156520137399","523142018939289921"],["3907773226875857500","753691831557581416","1163133924233881163","11469386337374318182"],["9493326572093492974","9666651669370333703","12717502615773779530","15683865288140166053"],["17742691748549072270","10615250364188039860","11203272760182076556","12443876279358438509"],["5711808139696818084","3866436591964929472","6826814456262198832","5565341123236442694"],["12446805945777033167","3371523846921740180","11625388259662443983","16795945877685411897"],["1530005179351750046","6610079568708946117","16143027124021031967","1138361654538346054"],["8255873694727142463","4096353371485348184","8674900657340211743","5442145748348267720"],["4541552111736733857","1736989976113498937","834662832747478565","6679349711824969280"],["6216648295037857481","15066234435329289171","12152881036873194120","4414286936775079963"],["5118654601162487786","305530727279208450","17991900122491617042","12382495451537822524"],["1393052576403432927","15215927892688608319","14861999829334191619","15286885308669673907"],["13215479970646003837","6221008330688409496","1613733362034323176","1347156538496144508"],["15195041032653314118","7513562273807951004","12047908261677169294","8091567177415967890"],["5068786625236029017","15289127438837532854","14223211585692662497","12811429401319135324"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["2395741163116009636","4314866082354958747","93584243151309695","11867395407577160863"],["6693472839690004786","14219540160408391591","399048140190733998","1725914001312255951"],["5163361939843032436","3544118050280663905","11861859139155878363","10949608149706521471"],["11703329147980674407","6402197660153561809","2791299140867857605","1582895539682620701"],["15426256465982403398","8748480057347688613","4036178370929685910","3364421877262363584"],["6327686017757025607","13317868172985680278","11292645198893912238","10647651248799107761"],["10486037824866201674","2895687124907046320","3864414027253178811","8080690516144138531"],["318591351017952508","9200110525828581937","896605925660649755","6294345937275982128"],["14982422035420620245","10999024143485031597","7257357813957138083","2467568809528957886"],["15218169931320055396","8463330511849943340","5970298602673718078","8798881620540598151"],["16710008822580498476","15127937290863758205","3671873018406473037","10349108310148461858"],["9407968260371709577","7336113751777001968","11968168368900298443","7514399267399172645"],["13973506584383244416","9017237216389985776","8636891143330120651","6547619235024499457"],["9742786612204092119","280963906968578130","4584846000276554849","12238066532480302318"],["11837762596119983359","1588802419944186838","15197802287713418522","15761908231118741838"],["3560338270718324172","10586596666957106806","9510113154952822958","18204040074461445488"],["7565992325686494570","17386582284416078329","10985997139943035494","1971125848412464844"],["4464858834676530350","10844955577102022581","1371405186315015658","14126636170758142330"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["12181901989126804197","10228765175963827427","379546148621435018","11137263630256025233"],["18362737564635586184","7496576090559124644","530469876465591797","6039369513386253512"],["3393795615516841549","65043574323523152","18303158532384353053","12222514276200271790"],["1486442379895699577","589517164228364027","9458138278380637860","13017694590694092699"],["917439819018112987","2668913150253212124","17905920835681583926","1626345930154733353"],["6787811093624312365","4024703080786498505","6872082587481277409","8489975226708129"],["9367361267486792710","4658302976181397050","16401290023004100629","250998388856826273"],["5907358254482208672","436117683955696100","2266091935168382899","8798596276569615767"],["17343416416482999170","4082783918568213364","2654057820738760385","2944858416920314299"],["10595899964269240119","12202408029897314639","8434150658074919128","15215939237577753191"],["1998808705404972821","11261296588213294833","3867939800825468222","2255794727481630993"],["12443802013319109948","8287735544908633111","18045906983052652857","9032372835725872383"],["7799653528269550990","17716965258780483278","17800601305787413272","10325215037319858909"],["3431626553585308419","5978724407340091835","16522659063022498444","12117157363349152922"],["14101422798636036325","4237076395079013375","3077372428671953253","9980602429739292993"],["10066143185155480590","7742104644883150076","14462504184570536003","12626514638667089546"],["16571231985245352198","14109443030337185960","4709727087030380014","2278219445369027430"],["13485224721477825346","5566495058857237868","13744064945589260255","11610526570205945738"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["15386398825863959866","7602332694481690049","10866382434922703489","7889841714733404404"],["4092203542729619278","11215601102256977998","6962279658199986869","5052288819410853981"],["18313935116532431106","9508453381561570203","13916718388134749122","17053976444083440155"],["6471406898055716877","18295639154647328318","17927110355835019951","8188342275031616086"],["2487708536394330576","5240131924166087765","5306676891986138888","1760173295654291841"],["13625980501107471204","14222683779673061465","797747267769660000","14784166269920553519"],["9808338668549444071","18260152425326581566","16066695097787861608","5530699969087654962"],["9091481825818179489","13110412351374507357","9049886554754668607","5078266701955842465"],["4696392198484030444","14440945307376411268","11682650322464604080","3629093723815862110"],["16660718984721921461","15697747230460497668","10741349052882079067","2362888840743374594"],["1073596453837271313","13812487786910602112","15029827499665627766","10374868971022223627"],["9983518657132262833","2762895787644050941","2708095107850592307","17815051004370669011"],["11750925097157652562","11271398920977532301","9208191009350400763","8739092102789006945"],["16346369385003230516","7156724095628982599","18159843941173976758","2571564604680483802"],["5465386598622912371","3778178099843319091","18420649089155737786","15507907151447576541"],["7113520378875804607","13088770476217550566","3350045257472502999","8504653981060192218"],["13084137933618793081","17224664571368307059","10521039977719189672","1847001117403930798"],["16810857808229342470","321539240359608222","7102570708077417084","14600444159211409123"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["14750029614384159036","11652758260288157274","17171039414568595108","10092273177380871042"],["9810755996710953773","5526564485205210918","1858107602302001547","6925801131935053723"],["7396136376195386016","12080980447024277902","3479384657917781169","9784626825414087224"],["8193540615331899240","12468382190562581499","18015359280688177616","8851603970746028385"],["4035205125272218438","1921557379577006109","8835764701174669445","3543835985956316511"],["3678464692157790107","5244824408646672695","14620002329763889741","6964006467565257459"],["15284738762462588160","15563586834454127697","16163532143849761394","11363075541032263430"],["7650766695656073379","9253491209040569367","5366233322486226265","5110237235907031351"],["12500233904784287578","17060030081642572879","8703931423614681320","11340100934455902229"],["14052484424031314637","7238566850109960261","16198689177567011927","2387935721237791127"],["7291569614514051906","12834084512426085503","11503848222922324989","11711167396914863180"],["5167605430956530735","12497590414329158779","173771211468335220","12768131380407970246"],["14664114805025901224","16545563601859151869","8189865924008008005","8472173743422226897"],["1589459030397546763","2714538129750908402","10284555576058105354","3970580481725070425"],["13982527650798681673","4676227297324724009","8837955607943369954","18437920811108213279"],["10982858964221260099","5321726695393308727","17474542369378584041","9729677671942023429"],["7565992325686494570","17386582284416078329","10985997139943035494","1971125848412464844"],["4464858834676530350","10844955577102022581","1371405186315015658","14126636170758142330"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["5233637525369338619","12054267598711183023","8850283085240402176","12025150750310443989"],["12393272927375694649","9509446565451322300","2506150097695821950","9149486581026437578"],["10821059555311639195","7269605303339686682","18116131130720141561","2289591698487595867"],["1734588478254664436","18289116105417095613","2271245100960146765","13369061464282097057"],["16511294780466006498","6383033631691172606","9484662400825052796","12966519228346463385"],["10088265771974533967","8946885589252090484","5082107672756956147","14017037050102158171"],["11983195153372976119","17264170566109553228","1402159582399900529","15608153552474719034"],["8041147005628030332","14754797731123684311","5801110845676185121","17766092602478868552"],["8128182611076929474","14807753941588964495","14672768168008088269","11429490783193231392"],["5085482826136378234","5559274772024896796","197205121215580498","15384924760535124381"],["10056627241693549334","14862146690731631138","3417935171819045950","8102492471645564306"],["12579179792827994964","6943537742370687542","2776492523612921869","8502469755387514956"],["7939275714759157970","9887495947280464304","6628593729518189497","7930617712569609071"],["5374388698977411467","18232828256869738592","12123918157274503599","9079375791817165115"],["13778778303669677481","7599821221044085838","13424115769654519935","15019799884107751792"],["6241659972543049209","13928055122239023052","5394281268527573575","8658517797596097995"],["14651741307436763450","989063875752990607","4897391909785814202","10480619043591040558"],["8936963811542702603","9032685120281956357","16582830818846758813","9481322433334075708"],["14683199385779297679","14519593360061363563","15026066244422502101","1905413217641393340"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["14715425570263142349","7358528787073934991","1569325014448932032","7385056718040376237"],["14475684256112735007","5830909836044595987","6751029142129756461","1603002637201492676"],["11267847936103553110","6053459566640698926","3756778137357766551","6618090068578056550"],["16437441615841276833","14166484868963908883","12060764367931799409","14183180451857607421"],["6730267703599721418","8018936593955534016","17016923896437197845","14338909896494282680"],["12933695915703244481","1756688317620516849","14453584770829287089","14294310677963819214"],["15289247996406499511","16328835141437604525","15443401143848081753","11798591067846071656"],["7432768745724100771","7889291266992749887","9972344653537374359","3607607697258426333"],["9931114806311778162","8915560925731620042","307533407697762920","15454908334911385352"],["6470853050291202857","587474195495332512","10802636345447327814","6885433437907583885"],["3700487958331006236","10014213511168650089","14896454072971426152","2300449916595490441"],["16644415611433706948","18236117579588190606","4691050320396638183","13344326948253376823"],["16751927912729724179","13475793589294532552","937066570443057826","1585472841302739778"],["15085163622647890843","2746017532975308260","10976133575064537876","10013501121888670728"],["7076605502630242153","6475531009617268663","9374969026087942354","11575849803024407178"],["15100694150870091925","10332466193444240459","5405058012374389578","11177740564800478523"],["2840643739815066388","13249687844314229792","11715727990971403338","17105589584820875506"],["13485224721477825346","5566495058857237868","13744064945589260255","11610526570205945738"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["5944560167168915447","9715972824378017606","2276395995489458874","8157529958561257355"],["5821434895801020007","9231069516654971429","9291378294558842237","14773159359192493391"],["15526867966404597322","10525192902288740321","11834918421267920045","11309205321233596200"],["649489775845361657","2302350854284930089","6627901703547000841","7168566614495639705"],["600069882704730807","8172277688659920233","2437340283933814510","3042707975367197080"],["12516636971481565697","2585284299264342417","12432912235376387421","2997256355641445185"],["17619897901150378526","7647376958235693819","11126024902207098314","10003937837628793421"],["10268100491414913637","11715810205715947844","14957493435866787555","7273677029272227943"],["16306272079777694956","10336606971577920632","12659274317158979750","16178852045446368188"],["6246411752446027507","8402835606470272","2138914524446893656","12061609747244007740"],["11629386550469486934","13820755991988772455","4253617264148992340","2422276369729974342"],["18246181967333351118","5610561983215318663","2659464697143447353","2527097563377183752"],["11570992269197725982","4714336800417336137","2357196557322398828","6078973186834830839"],["8210448200150209953","11674747496801033808","15452718276626793095","16672792433178408306"],["11502737733430172477","1037642073871852771","2794850449749375961","13248649886321322713"],["7113520378875804607","13088770476217550566","3350045257472502999","8504653981060192218"],["13084137933618793081","17224664571368307059","10521039977719189672","1847001117403930798"],["16810857808229342470","321539240359608222","7102570708077417084","14600444159211409123"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["13905286370066185169","9349570889916238562","11666566988799519917","13759712178083770515"],["8540031865293647764","176456216144762927","10166168635819394275","13640237645063654330"],["4253901881019067524","17447343033014361705","850377900297824668","6920944136873483302"],["11872311719532164204","2834980162490057750","5275769964168757055","3939319752121777358"],["15538953481761727273","13821850604521827365","11383153978725986149","16579176602709746791"],["17972333245378397830","6409116371410594104","1246761701168960808","12108272356270992174"],["12882002999766510240","14221019134269725872","7112729226208877629","9749829501674875426"],["7910590781253748299","5314504033536527265","17872034669934897680","17549652431668383032"],["8591115453521644397","9055009678888322185","13466023464071234688","91972658826414813"],["3403487474178722919","5901103354900058527","7738873156177050566","11842649329464695409"],["2130218516987008636","7907822762914535200","1753998585617986816","7653634439896973601"],["1275877225949727007","8241366772578270315","18329358600049040533","62358616420077822"],["8399268717329226585","5739908857643789392","557165850875508218","4117547188866987945"],["13447438276475586219","14203087916316229221","11645401604310021777","10236752415634648580"],["13068112302507583078","6961965132616032153","13414799001819304158","16529566482700772082"],["6241659972543049209","13928055122239023052","5394281268527573575","8658517797596097995"],["14651741307436763450","989063875752990607","4897391909785814202","10480619043591040558"],["8936963811542702603","9032685120281956357","16582830818846758813","9481322433334075708"],["14683199385779297679","14519593360061363563","15026066244422502101","1905413217641393340"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["5430217452844455574","5313889945643714639","15282223539011544215","16036610485577484628"],["7180076605524195000","15546711947359009384","10616135593045668044","7879126563321157693"],["181006886828319483","13806180662704529786","13830208729833230457","13798902991455478387"],["17252819779793576559","17712438277423501118","17421452803413698203","13970167948482588250"],["16331105987979120971","16654972266369087375","9024823777326630745","10751542790889205961"],["14315377034159455982","8780238211627229174","6096006085439496005","16739866191307947772"],["18112974719554806319","9890125307813730786","6703989445544934181","2722979160284133590"],["12810472100438127287","14125964302106084788","276458041696675590","10760845324026582954"],["10239683785058690020","1013159047959909818","18068809216973036218","3168934734860575051"],["1143319501185785451","10879758951297567750","14715090645287821520","2923535937024128220"],["14556702598019805983","16380634715612605359","4230917001715245510","5042980053461439111"],["5880294049299143306","7665833377687268595","11477533177762920009","13351288636684640480"],["17528541719580996647","8882088072006635895","7151346525477885478","1041974837003410216"],["4287448007636281154","5579383768325675810","5544716672279326061","13690874384306940938"],["1393052576403432927","15215927892688608319","14861999829334191619","15286885308669673907"],["13215479970646003837","6221008330688409496","1613733362034323176","1347156538496144508"],["15195041032653314118","7513562273807951004","12047908261677169294","8091567177415967890"],["5068786625236029017","15289127438837532854","14223211585692662497","12811429401319135324"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["10263506679342527786","11484564546053653766","8425647352603565385","7202288449385084548"],["2861605380459228455","16785916797936634056","13469509945058488939","3537615943511444535"],["15812891425864193699","8430925591054022216","5365140394248829341","17625987156244135077"],["15419291886568958691","2801933479909480490","474424120923146083","16122322714408740638"],["718392862508635370","16744543345065180262","16445674615432466644","8772008880262460282"],["12738081515540115017","9797241702780284178","4194281532474988384","6701606993451231925"],["3513493168066614936","721674941022944318","9192876425607117800","14214579673960735907"],["7712940513212499459","16153119551963043953","15083415062138374764","17905177591899963501"],["5234364655738382097","8630002541277620568","14896082289532726386","12905687896925138636"],["9309080033515496524","13475779950242908444","7232245698649052323","11720056521809220879"],["5746266367622519762","10382653548228951249","7656886765990480064","300935424745523217"],["7771434933238805794","1067128652327360930","3748739776231467840","7610569926172999328"],["9914592076084376920","15108338309939466643","2201773899021895755","15654058119033328898"],["5698679685810448179","9638453480393434365","486213228751441495","13621023555224369249"],["8976351625403782390","5324760231209623702","5883798445886981397","3259920203645247216"],["9114566554583678929","8564664226210671201","12106166982453020246","11861617669809896495"],["10145334307170524901","12098081411082298695","1058081443018840905","14819097152371538537"],["4464858834676530350","10844955577102022581","1371405186315015658","14126636170758142330"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["17446906573975167293","1956154147633322926","16824341681105813198","7293373173220580970"],["11918601670712308189","16263957451048194470","8362537322188611729","17556218842040317092"],["3677269580654845491","2660960620948245584","7573392423664956819","12939341200523017173"],["7816296426751696654","2989593542893430160","5386311794585116792","6468687809517869501"],["10591942238930343702","5600460293634386849","6890642786174384956","2025171550159441794"],["4485130717954324227","16326540766911964813","11065668827234803230","3491257400247379451"],["15092753183691781828","15778743260567779370","6868612176777968228","14264038206451528302"],["17835971470856662533","10714427382302810269","17773826080111949940","6941410163677920442"],["16673955492493235776","10145502420522616404","1550812245578727558","12911500526685976368"],["8647087039438722391","2251153868050331440","18078359531275239471","15168608944134481854"],["12745875912335300625","8521896512247407381","12031702194982638162","6606201163480847393"],["2047556695904602057","11554233418073443529","4571607276548494800","3679238511921009491"],["7551547662354629379","2565647873441296456","3343060683701214715","14360873595673059542"],["13467056184962771207","6161925543496197803","13309643974274664373","7843881026009590423"],["17482229877417735749","15787561107972248051","3660458023062547472","18250163126495031416"],["12210996178770106001","17591315377510400908","12421685067477854264","7837806040829927843"],["13365060206678260961","8855194455441784180","15052072558117942962","16343253545481755416"],["9777896688847815302","4508694649936256288","8880253856576817042","17499943260689214577"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["17120727601303633018","4123650944640305586","7900517689368771125","16595566507972560089"],["7337672097894883563","11329734309025806166","8733505714294245253","10235391524174942297"],["433213106302380105","9274414850601498767","2216858683059703977","4397381267891132060"],["6163614005402073208","18252281720432579291","13721871595597556664","7431930698706531499"],["13867326205144587920","8355525702741999991","3921100765253299167","1335664807568770395"],["12337793843734505309","16711429824346314409","13979096592733836888","16229261904534934804"],["3663633272629163807","12443200086717174542","4381497224760064162","16366048510182226845"],["17357088820458697211","13551600579325620848","8824260910474289676","12871304606080243664"],["1938618977341627389","14531484106832817856","16945217887715390946","2760291969479115535"],["9702654893175510415","15343437140637342783","8414003750567966002","8393961398913740184"],["6390597348442183299","5257643566452902698","16886022751061923642","11905569570224832951"],["11747988578184322351","2772266201468467848","11578483124171457911","14225348045627774357"],["9741788088533734961","17776812717220491027","16023494756897733223","3098607870660785407"],["13999671407705682953","9853665421121628594","5327075239545014384","12252421550251786107"],["7695395376679969430","16295165964486178107","10819939628720864447","10409133546194710479"],["2133174744486200252","5222710816390075860","9180320186757952057","3926196750031410458"],["16047926896318425503","5052805647052680479","24646368437433245","13631559351872201323"],["2762594688453283553","14017820404068788229","8245705192524330348","6867745698421755422"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["14581909802930411881","1398056152555325259","4286890055343674474","16839335211301367564"],["7683688821124937425","4477794794753996620","8783266893334940682","7611510773418699670"],["4377104156710916546","9313229471753277712","8362921566188003454","12384669760512248632"],["15375672177360869934","16472240059660016048","9837014975827635159","1463781959486496314"],["2066900080876406856","11165630821132264519","15466495872986557633","2939491980735449242"],["12794876171434816737","1982381899937429009","13591022053957162841","12128097122670184875"],["2715792157305799199","1434546776780294437","5347861766503247506","12479635451549847082"],["15019295611623405449","10834478276705446324","16150569660749341057","1259621777170832752"],["18133006268673690138","15415184694559610931","10943536037416657822","10870227013995736395"],["11143338883899366840","10495685546013265002","13372827676233048095","18204453439018364564"],["17660734985262788116","9909336412599768719","11106183972020511509","8419118917847692883"],["13877939403976715757","2563027908560651111","7102070279309518438","14453116543960020451"],["556931316976878891","10636852128569980928","2314240976923534968","1268562517254468733"],["998024174188445202","1202660654909462658","4107383718396505261","5519626912052599286"],["5892644731044559773","7855103782826539378","9784805185312070676","11344473133900204929"],["12702343333019370931","10496803170154735113","10099874159230199488","9866940220318391577"],["290047901786024727","4212919364127598067","17906476394370023039","13360410898432658489"],["16002353297611116221","5333114493089171825","14450347820573585954","161573887810059188"],["14683199385779297679","14519593360061363563","15026066244422502101","1905413217641393340"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["16425236626708790043","15947060815976187231","10238183615049679790","8949712125407050424"],["13738652878411515295","16173864392260703723","4336982326791317588","17966921849719550149"],["2295413371014804514","9182100624508737783","7154414398281798362","7593647657862406496"],["2609772799746994990","17531990708687153656","5571838018684597872","17810186260197951511"],["10843328088694151649","2089075070165671378","7049796409820801296","8255522113612122351"],["16584349438039653522","14660046415657480122","10668531665846968010","8049554673745471717"],["16277129340528557333","10320253169695952179","3393633266114734510","14165306245521146626"],["2470567344091620877","3426327295302994362","17873988643511378130","10235190076194567990"],["10659187721277949587","168000590007021033","9551586262055507930","10151404314629447604"],["15853157043042608226","13693340802425874086","5996033077443744732","4387351769778967630"],["9949684171416211880","14484847302958443551","2025296173514672474","2673477041014355613"],["9432708792576576812","14196859904682193985","2922426560428558060","12559864047484678487"],["494961290222774327","7071510054508617633","15791474027476472273","17559531478986498262"],["10785477212200872039","2787664885647207557","11157743673330066034","14080037310274461976"],["5861842964277342058","17495315136224861770","14368743695993932214","8819118991897533505"],["10066143185155480590","7742104644883150076","14462504184570536003","12626514638667089546"],["16571231985245352198","14109443030337185960","4709727087030380014","2278219445369027430"],["13485224721477825346","5566495058857237868","13744064945589260255","11610526570205945738"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["7736396207797889482","15061874761019225265","3134376971900022879","6233041529832556956"],["25987605370003982","10287401348727491896","15177521213972250723","12095939221914443902"],["2981029668003017070","15817088467924817487","17458704891590132257","9716744677832000305"],["15900902491319674842","6977029737052568083","1144388290792890633","11791898384834272230"],["14115838706174007558","10035665855764763155","6950428415818364688","481846928227742151"],["4767136685251024168","6507510757869370022","5754654117594448305","14821306903459928797"],["10190383108154597667","5149536490685592012","1917798452265572291","8924699533631567827"],["9351249071987391180","7908339340281104501","4960708402521732161","7323120450552453312"],["4262938634862486404","2541222663628602169","15709740583753292871","2678991043497922081"],["6880101350608164266","3705398352713941893","16949182211576571235","5191724640802915175"],["4621046336128761210","7792584929981257637","581462230209770387","16177963438398143679"],["7497789237496505148","10660998278604608416","540251429832509514","15638560979275364842"],["12888653365113324284","13935208472293221987","297524084363043735","7103518760889094200"],["16727019626367950463","13156940441221565886","10722662619460729253","4141001808708257594"],["4270003533255998181","12042439087460402988","17592479645408578523","3259213571856882973"],["13506804075208754545","11548769510999042514","6264071278355449211","8954420535153412600"],["6055329046838637848","2745203294458694770","13080146116051806758","13495722690643229610"],["2762594688453283553","14017820404068788229","8245705192524330348","6867745698421755422"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["5802414231863668763","16049374197698706046","7149571090984394474","17979770101386766917"],["3696411435619393837","4321736536548542114","6913164934928517997","13109641083032080259"],["6527570224846300220","9034202551636824106","17364441364445917241","7801616860374789046"],["9953323139888179034","6868908761650794907","42553598964392240","12069146690920593167"],["7191448172100885168","3331013178598149453","15964251117336171751","10900066954409569095"],["5365846691261164531","15318469342010201099","2446710531699136425","12468294129738269475"],["11755356483958587780","12345199024349480219","10056672460691326685","7398811608273505637"],["8112492834013940532","10233117902655466915","15826386052934309323","16071808002263123729"],["17031074338232291304","3653247459504949755","17455724316873817400","5591926498300160293"],["3778165034243006182","16077099221734385228","9622490892373848304","1300992837372734269"],["14040023209470764117","508115278834606036","5357626704895864368","16174457582873187672"],["6732414990570932334","8607619404104700584","12750595279689770724","6553737921402761851"],["14034010880625050824","5669573904049706592","3633647767337226214","14885940237231520007"],["17440885223524377937","10955832036616302106","3098037482190386427","13892585720105201349"],["14727045348668120423","7451004700999905276","11755074716261451358","4357604580890008541"],["12210996178770106001","17591315377510400908","12421685067477854264","7837806040829927843"],["13365060206678260961","8855194455441784180","15052072558117942962","16343253545481755416"],["9777896688847815302","4508694649936256288","8880253856576817042","17499943260689214577"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["2348192639903037268","8387355134164144032","16735257186300779494","8507426149542931825"],["6728538225163114012","10136742088588424215","8572096016829851355","18181745551998061495"],["11410114281729507771","1081856426001568290","8273360784915906049","349376680202309565"],["10636806214609339331","17317759478257961024","4939985699858435818","12901231186132103719"],["16508134081395802601","10338991673405161932","9787749355546586591","4278181729686915835"],["6547954935701475628","7861658275205855514","4199280422144706685","4253301291817573547"],["13206201343264945939","10119212475610899739","14431133613743013071","15585410800426305681"],["3044339343265135416","16100140296989003064","5682343064530008259","7769452012024008327"],["4737752567623806610","1296874508235867176","7897577716570999597","6678042745122815205"],["16122833626997895875","5367590658155923016","4117224141616550905","10554947697104703095"],["11656915873370747287","10211741685470272180","905057846667348088","10268075366740872361"],["12558176256297281462","11770870428501837004","6516025087399041699","11508886678905825881"],["13295066028514515961","17040974687612855731","9642186768354610627","3073430191730456307"],["7557380511688640823","12066092472242679084","10947696414851309525","5513492197959516475"],["17576467102270238397","9283558568704435362","7622122236259102863","14067945064271779435"],["1908861412615977538","220437603763694368","14718862155833483080","16662324345992558592"],["2840643739815066388","13249687844314229792","11715727990971403338","17105589584820875506"],["13485224721477825346","5566495058857237868","13744064945589260255","11610526570205945738"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["9249433362289495855","7158679440466131317","7459608892747235122","7782869635587676169"],["5536525813101001626","5697817821914371455","11262166452419296331","9203537584386905211"],["16334417017319279020","2747025182400074866","2316774716346931347","5987438895477875226"],["9454139661187030015","241123615947360065","3725469898218072646","4239259469681929407"],["15799392445836370033","14191771221154174796","1215069741163381761","18238401296742048468"],["13027384461094683900","12058378671674928933","15835676103420531196","15124439740526571766"],["14704628250033294849","7156366082333794975","17697156712947411000","9371209494207480862"],["14050714963573146142","12080433630275281719","17234400216613654227","814602942023731739"],["6044559408966984961","2801678595587521737","14393795770769143766","14887357454910149492"],["4010073060662811773","8957997046316842326","2754950649116816430","12837779049575251084"],["15376170462203916746","8353379036425507722","11447331507209675039","17007143461948752929"],["3625750920280000616","6811996824693246663","17027825172420629946","11592209843083464"],["580612733623675302","14351552334755619142","9645125706314757715","6662570126885561882"],["17696823549958497131","5670075638263895420","9432512697763035375","5075996249191227917"],["18022725101117005400","16471206411783575804","4097782836798066628","6568679885167901969"],["11885645703162569951","7117905488741586263","1708599584416159290","2412397105082327549"],["18264262665100350451","6700497417837533556","8748798172684256997","10497058772512095753"],["16810857808229342470","321539240359608222","7102570708077417084","14600444159211409123"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["11442911108579589589","14678423983996852942","4423997916470854733","12869052045717317076"],["14513326572659395485","6841223854305641389","6402863015349750775","14736279290843058121"],["16151433513402086874","14092192941401474037","15836113978763857092","8051034865254281282"],["5370831996525429491","5333346781769976761","1253248837446409552","2555424608667668366"],["7628666504969982586","7738526065844359636","15409154369102542976","12797638439459919922"],["5810805096489032423","12216711433589711760","11934003120662779751","13098495028397158135"],["297326624703671162","16054235452583054328","17819978340109368919","2780923685701608951"],["12522800877511015359","777537167855743627","18262301762407180477","5551020987391301764"],["15527625112445334063","12892411014153595571","9401611049571845939","2362598778196562446"],["16934978718337284132","9528178426412372295","11540266923823196069","7072183222987844510"],["7526035477029114602","8523997743856639573","8993917112437126144","16466853539204450870"],["11414845813289462285","144116714490266802","10155830131138266139","6506817889095335686"],["11163948536850678566","12068593352550200302","4119146160098455658","10912042058306644757"],["8262724051086992008","12578337799986957523","8776025393185694520","17318861529873703405"],["4270003533255998181","12042439087460402988","17592479645408578523","3259213571856882973"],["13506804075208754545","11548769510999042514","6264071278355449211","8954420535153412600"],["6055329046838637848","2745203294458694770","13080146116051806758","13495722690643229610"],["2762594688453283553","14017820404068788229","8245705192524330348","6867745698421755422"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["205651209537986597","14317641790167755560","18370353542859352506","9571203034438297906"],["7415213033701191085","10086780725564857948","15399551575070255359","5504943344784371476"],["5111510630703601091","10250526059759213558","17404632402056010573","1721222997481434623"],["769411927475094564","6113745969634013983","6243848327548580421","10002702191882518309"],["8762637281088638625","2574699700533731317","453263199976595536","15555375518651227181"],["813449157065141471","17845309758872259365","11017451003068797281","10771769974122822846"],["3732737767013040121","9143867165257333361","17405697098106799268","4472121067937982507"],["2499615138693139213","8282190845566037446","15457922570939672097","1416571318888252691"],["733719710106590359","12254969511118831713","13110774746126113088","9801763346860839318"],["7987638307426598465","3551255309962209014","17039832154721375622","945086938911722377"],["14978591207845457892","7170180912372056658","6474779841702547350","6876617426467927350"],["9595801303512049356","13914782165475218470","6189020145692009111","9869493929283271543"],["6788795326302640610","3276498670972475164","987113660507972635","4415244159344549242"],["15884022945037501620","21871919343561228","8415477775582002468","2011344872701781386"],["5892644731044559773","7855103782826539378","9784805185312070676","11344473133900204929"],["12702343333019370931","10496803170154735113","10099874159230199488","9866940220318391577"],["290047901786024727","4212919364127598067","17906476394370023039","13360410898432658489"],["16002353297611116221","5333114493089171825","14450347820573585954","161573887810059188"],["14683199385779297679","14519593360061363563","15026066244422502101","1905413217641393340"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["6450023180128201568","8566419818283254749","4051463896335565376","5549566619092962854"],["2963443326387123540","12126196511316900046","10653737370429143342","10722499277799806205"],["15536171480195068068","12319672727892462492","17674779473283198364","12842597225583220687"],["7647751109900666016","4748897676069106548","5000668876025734134","16609039462918582339"],["15592998767784917313","17361281663031590839","11945911969307199167","7256363847663107511"],["10337763704515044459","17081079485403953841","10643226455327975676","5824441759476638687"],["2498668863005178327","9827024015751762555","12362791972781363515","13233120527787755099"],["16510588690023359045","18142051342154865128","14193848788406462856","6384764663248327328"],["18270306352460376637","8214226145682051233","2092428395841731365","10378509100448601347"],["13083353875342301876","12032965649347615620","5648957873821924775","2759088496122328461"],["296030940209703897","9093684320885179651","17497969879377048969","11797458138330237133"],["9860838961681961775","4252945074054813058","13836051387554519033","1945051428324361164"],["3599489107787757791","6838382074591056541","9579100769806334063","4555003400626982919"],["9807933915534865098","15125298725083297346","6604617236668726039","14362919070092000590"],["2947560896556025884","13854154429399127490","16891552892702199062","12752942592658088467"],["9114566554583678929","8564664226210671201","12106166982453020246","11861617669809896495"],["10145334307170524901","12098081411082298695","1058081443018840905","14819097152371538537"],["4464858834676530350","10844955577102022581","1371405186315015658","14126636170758142330"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["445954468532891018","752801016642644723","7983554470941316103","11001253468947946794"],["10863486921722577811","1033575246832376313","4265336728839567954","15612847957067859097"],["3161103618965049241","9104029481285885698","522418170826437597","7565721173924477687"],["7462739466916278091","8081261866828053972","17103786945955321766","2249265504244960587"],["1134345037275337027","7434097137423434712","8228920705876097547","11652394890772889161"],["16832271272814427470","6885721206542599672","17417831607265683682","11147266400510927079"],["9054682837264763501","3090716122245196039","1816305252658500325","10487974608538607040"],["7008481803049610518","17049206420327840005","490881104541451999","11898021629487235960"],["1184268362167943038","18215971180065351462","2946026746967489665","98404318733232561"],["14335790153883566031","9587334000536360168","14223405863379392347","2939612860436265655"],["8811195482627275619","9078800135763810286","3902054927590658140","6879923467628883734"],["15177698493298865985","90128263430261287","586856783255961527","12373145868628365285"],["11593015948440055048","14638108142734813258","10300869845449420135","10848406440078694598"],["780141550794961677","2383055733821345238","9594886994922728139","14711138777568232588"],["9857904180212218346","10919723822267787638","18151559793981907457","18046854422236651621"],["1967173842949544116","14162784756781116801","7148565269447190811","165009053336892864"],["9208238620683718120","5472586440023757699","718527269180855803","18320175464415215805"],["16002353297611116221","5333114493089171825","14450347820573585954","161573887810059188"],["14683199385779297679","14519593360061363563","15026066244422502101","1905413217641393340"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["8177242162379786461","6332642359483099215","15661677908436735380","17901145492913816004"],["2842442185736115810","14820563630455463808","15306817596579394967","4373288169395803469"],["5452586223737074657","1841583273884454944","6146021169642520539","9519398059016224418"],["5727065137445382479","13347931986959040131","14360136717966411017","12242356140867064672"],["2519579735459413064","12427714971662151072","5037539898197883948","5542207326512522590"],["8173576851725844779","2268435594430433991","4169480872515974005","1513481352181512830"],["16115256442129941690","7719043665624946363","8814986701735351530","16444574283043578362"],["745866151855589374","10976941371739727072","16347943649583783404","6288274232757802669"],["9625443190335180409","12432327268094728589","141970503386374644","10925183632422243589"],["12115339289421329308","15527467842428718205","18168482315868254900","4088137550852461872"],["9984363045546201318","7560496417442413238","8158037002808981679","8395501422698727932"],["15100445003952359035","7529110509926947270","17006665650726628716","1228507038996757497"],["16950192846326078209","4943030095203090775","3643265739999193243","8795161315658451772"],["155873846628409682","1299543123682358106","15111738510618856225","14746902590420111189"],["17726233760317702811","2455247700620569875","11454305707362157583","12398259927766057581"],["15203075056832538677","6247641169383711112","127230689901144109","5491561685405377831"],["16047926896318425503","5052805647052680479","24646368437433245","13631559351872201323"],["2762594688453283553","14017820404068788229","8245705192524330348","6867745698421755422"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["10286998340301158568","9499512796882863786","12581297868222862112","1943366675867682341"],["789586183516989911","13311132969337570466","13159634653243921913","14999191575260008168"],["18025951929337510039","2018746725886524769","17048972989464125055","12655594104021798125"],["9447469672765354359","7740837357917892004","15030160139455526768","837075269436803157"],["2419542242387405888","17185771181316439649","17106912382382029222","8462891849200595502"],["13641858697166532453","14322880085112982533","17351244285001489047","8009481914447971518"],["2805681185358884188","4056227456616372487","15760535951153260751","4034649624388096203"],["1566308580758830375","18174988696634021077","11907738625198551443","8428082177444850466"],["7287479489357654720","983687378814066497","4051881353134095091","7178642023008269861"],["6300172253771761246","5809117864315459590","47528560713677980","10166035031289119862"],["9245954879231363639","15336401362771483286","9131108459158206270","4990915440437299242"],["4728424066560102301","10260331376702013004","15544744549047352980","10996989237690516863"],["14110995967735526432","5037570102297632175","17055929196823106299","11397831597890966403"],["12440856334437235134","15178391067289282797","14688127644073461616","10825399063687761106"],["14101422798636036325","4237076395079013375","3077372428671953253","9980602429739292993"],["10066143185155480590","7742104644883150076","14462504184570536003","12626514638667089546"],["16571231985245352198","14109443030337185960","4709727087030380014","2278219445369027430"],["13485224721477825346","5566495058857237868","13744064945589260255","11610526570205945738"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["11392310838578365461","10197425403268457753","8512319884529377403","8104653094451427395"],["12336384640908689166","5673410584234525180","17442698779047109121","16643200776967994880"],["556532158834877277","4506156472190543477","11047594125167300094","489439914269174101"],["17516353773946642848","2827923275797645805","4773296722611071507","6726619768650562209"],["9029389084503709451","1176960712586268838","2127845073130835271","12458937309245372101"],["650738007927582740","5193886783730678715","14588559707469500246","8437308967548290146"],["5450907633253118098","2114330166339271637","13485007910361606598","7519796369396791942"],["16340055722677635981","15150379523331101831","4513814123064114522","10429987947726330976"],["8043591656338370809","4879128260847603132","12558493418357130473","16144776620257703401"],["303973806732130460","14158183671357542451","10138661934451111653","10621633286401391725"],["6928751824403415492","14792570396146471543","262322265418478419","17350023550049944346"],["15123480398290463489","12152396133812814232","5824350813537408222","10575688604609874448"],["16456411676683448702","9098133910939019263","8511789397523034704","9067459100564857730"],["14211217232104583017","3964489010084455617","14354106066150638538","16980835936280169141"],["17726233760317702811","2455247700620569875","11454305707362157583","12398259927766057581"],["15203075056832538677","6247641169383711112","127230689901144109","5491561685405377831"],["16047926896318425503","5052805647052680479","24646368437433245","13631559351872201323"],["2762594688453283553","14017820404068788229","8245705192524330348","6867745698421755422"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["5828651104930090227","3301916704504446629","4885197940413246852","3087823672303337791"],["12810065889521221360","612923345331587159","16082196596738216562","3793021407744466528"],["11372116607431099867","3251168595623515733","12979326137302149554","13697070218052279741"],["3774760171087749850","133708364278051181","12065015815202063616","15494836504679398047"],["5725754343805238499","14040708813878009413","8540042334495746829","3855785870242377636"],["12093353942457596400","9654636548628668702","16717296177885023236","14220677770074105132"],["3227283512435337892","3616385871931526042","15311459069054284970","11286188480376351510"],["7665304844129834604","15439312226704664109","9596792634647317732","8228043437128614994"],["18211208765204751025","17694229240399961903","14049016832847122201","13591530497563740855"],["5335100086886482366","13921699519642343982","7273795243465082635","10377658016127173324"],["11361423558814806754","4648459662261663204","5334222566510786152","15900835582582837087"],["3834969282003993663","15902706367964329931","18051400874927627584","12763919515001447743"],["13063377508603186538","2645384700060319095","13156108831409588546","4781162261804131480"],["13355363053227357929","5599672983176153574","7576981748678636738","17934989851922367484"],["13778778303669677481","7599821221044085838","13424115769654519935","15019799884107751792"],["6241659972543049209","13928055122239023052","5394281268527573575","8658517797596097995"],["14651741307436763450","989063875752990607","4897391909785814202","10480619043591040558"],["8936963811542702603","9032685120281956357","16582830818846758813","9481322433334075708"],["14683199385779297679","14519593360061363563","15026066244422502101","1905413217641393340"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["10289313375071561276","11784135328030756380","1142391905420970088","8827189003794753405"],["968524119733974447","14615885490428619644","11233137018339426927","4128178806978692229"],["3131116974696061487","6459043528392625200","7132649897696394944","14227324789862382512"],["6967471936322901949","2092229565569525493","265733348290588318","1595782457803132539"],["11244760651143778783","17856963330602355837","11217613336238906240","9975803722509918441"],["5088365810589444828","14166439684918672266","2073607042307247270","11020017890830589857"],["10480746351428621384","14814720108683545057","14473076653538456791","8054086118688881084"],["11239727187976769261","15745993947949605887","14171960967805168321","2355598315833508809"],["13576279402941855788","15716955080852945538","6841166951578078159","12314254263173364426"],["4157236828609565905","13630631562861591428","14305400783882541864","13667477105921515462"],["6913146798257181599","5017829816968537950","4182914392873983362","6980776915341556060"],["274851307577340503","8433520433885399917","6614810987597300907","1658542186442960849"],["3422361226833889802","5766521365180138992","4012010443025622371","16667859658382323471"],["17208975446933346338","4993779952472229665","2414153534724516244","8696986175281059446"],["10398779470873613859","17893908924241528352","7982087631564786979","6791769098960299530"],["7412553504594164183","4732363874659076977","11028887254429033492","15339110428066084755"],["7554448335467251907","4282861275331609043","12591306285435070538","12322920871603575664"],["9777896688847815302","4508694649936256288","8880253856576817042","17499943260689214577"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["3045601975477146184","3346838033044608942","7398172845276394095","5984702920909201329"],["16810540689391517973","9941107280871942653","5704541321262780501","11781844407133363851"],["5464389844510286592","2670847796191871246","15566685689815901811","2736263681705327886"],["7030266578459404801","11071350909358474958","14713749535645810000","3703844906158195769"],["17696183105572742834","6806450107781945108","398396256793606369","17173330219703504495"],["1172237758769162118","5231922512966008466","8097356182077419071","1256082032559657604"],["7823815392746558448","1570386722795498764","10076472572787744672","950369247547060824"],["10799999705131507489","11160295330618503282","3507379902341411395","362766003102914415"],["4417163566112478053","8016238692267879527","4600779118409813710","198621876744703200"],["14635101059556414063","8900401001191935622","560546068742196643","1917150416706556720"],["1496208876690208622","17010577800148333573","7226275435213780611","9485082714503882876"],["4802852413357638405","9915825233971501196","15753167233865280309","5626064575553228406"],["1006328075909329889","13920970865555903895","17667459324673728181","1957654617007087186"],["15379839173061841014","5125450736360804502","16527631968803417374","2093863836820895302"],["16454433009813781799","16000794823478988482","16166854597149543792","13720238010691277838"],["15100694150870091925","10332466193444240459","5405058012374389578","11177740564800478523"],["2840643739815066388","13249687844314229792","11715727990971403338","17105589584820875506"],["13485224721477825346","5566495058857237868","13744064945589260255","11610526570205945738"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["15023629585646000359","12165946980279411120","12548981652674442328","14903655583465476314"],["6777331902232857318","6146242122779880173","2160391199758036000","16367624245914180447"],["10055025572421219977","1868477282822818055","5347078143038827630","4300483875743610644"],["14654708412380410933","17741740753061932606","14912485723767313403","10188702458977943806"],["16895355634799155077","1398743904004771145","13859973230564454591","12183534183003289501"],["5251835603994388217","3275264732899347851","11605738026234543313","3635752852241533994"],["1948021167182596859","13413021663662836778","1344871453592692870","13651586742921782456"],["2791803445552030845","785311064863668793","6710164812488172057","16881427422590267117"],["2620366886960518821","13781579829753756099","16134048089081806816","17444032008084775215"],["6477331637757468486","12071561902834443229","16605496174895056555","17113797263624406471"],["8561753271093182838","11904431740722009077","13801618531723581178","18121385973906628833"],["5829942974267655998","15504583565622411754","10919989800042998252","15936550099707674307"],["12435403105725488150","15040024262266831544","2338524423715772130","7930277871194077730"],["15126833346164835885","18122021041015392793","866572058568751360","7995888741854224471"],["9857904180212218346","10919723822267787638","18151559793981907457","18046854422236651621"],["1967173842949544116","14162784756781116801","7148565269447190811","165009053336892864"],["9208238620683718120","5472586440023757699","718527269180855803","18320175464415215805"],["16002353297611116221","5333114493089171825","14450347820573585954","161573887810059188"],["14683199385779297679","14519593360061363563","15026066244422502101","1905413217641393340"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["15914335561495606441","11348841168004598925","10806623829475074835","13385409297983718143"],["16493528661039312010","12738671701690847436","10453726802480413918","271338559645818320"],["11703127515636373610","3935699684352732472","13732524160532217075","5132055500782789620"],["16409149528823545149","6088487799460305072","17519516999017220958","16789081489334413451"],["1715083153352911876","17344421294200492719","11623737641326631930","2831998089769448340"],["1889599446627955434","1237447655043136465","12624064729018776297","17016755262034954643"],["13157317752441909383","6498217727157810871","15223254837791011492","5312388692524700566"],["3206687612524626307","16651625794415908702","12184369965896803528","6139645327701630679"],["7353619621515204429","3485815622565555917","14808496148239179065","6381183852876500747"],["12548135410559986356","6119007441952925893","3670371612720152862","13340207558703721629"],["6013831008021913204","8245583696792303684","3890868741049565875","591585011770430530"],["14970130450868161972","7372934409814691449","3464742601774985","6706181968848727720"],["10059529175147296040","11169632656708703881","17164910450115102267","14231287199023461613"],["407061843558853952","6219028804006212832","8421577759471023874","716151879509602848"],["17482229877417735749","15787561107972248051","3660458023062547472","18250163126495031416"],["12210996178770106001","17591315377510400908","12421685067477854264","7837806040829927843"],["13365060206678260961","8855194455441784180","15052072558117942962","16343253545481755416"],["9777896688847815302","4508694649936256288","8880253856576817042","17499943260689214577"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["6789047963536939673","8618231125901939550","7140067441611356766","13545032004233449096"],["1185420471179483708","13341223353369548573","10472516865324285119","5665108369199095447"],["1599814930452763577","5627017523217964035","10779367550570975012","7164470523703702250"],["13322891899559832536","15628397895341284190","13224003409763719876","8145850424873878222"],["15976234535090407919","2504437313283730906","14547731282913029716","10667844280850769908"],["9829774861499846581","16842184692575531280","8331471062267216442","3175499887746976178"],["6761665202728009610","10537680419090450595","16112580490201454563","12477768273882221832"],["16117394079113706989","10440647519184872418","3161281661555349543","3361066056673188665"],["10514625622768676329","14587659146855765547","307870498037973327","10954705345614492443"],["16929198277454196902","17695486711038709867","12100954237545747274","17823711935085213334"],["18244167698031847791","15779123863085196267","6649839756515905244","7418012829690460063"],["6540939336339425806","5571013887400614595","17662042567206487146","16904908056896771940"],["14158785243530698219","10971216629780478193","11125901229643589173","9253452824020386806"],["11101520714702712106","8735386298226637878","7727415596515129808","16582134766377312709"],["7299375455482217949","1161434759973379535","12338689908579270080","7109987624179629627"],["10950170751953124132","6146060456817189770","16774213568901990910","2885115896158627441"],["18264262665100350451","6700497417837533556","8748798172684256997","10497058772512095753"],["16810857808229342470","321539240359608222","7102570708077417084","14600444159211409123"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["16851649569958574220","15387152780957016824","634254762505257263","6480979170878993817"],["17380056816504874584","9067462640233080451","53063271648602390","11859990374922661096"],["7215273707409868056","10088466040461621063","13829330490661356210","18381949420150126697"],["2599106934502618597","8533660561174145751","15989764275209256460","3310590209027487880"],["7048215199182889564","7347657321507827383","10758511233397046286","11637805344202991625"],["1638230068924431702","11372916002286556092","2374325330591472624","3393232246407047906"],["4573502347299032058","12273927486250025005","2534095172564611305","8657077939950564231"],["5651402087480869388","13097542273636930781","11040758397475533948","4353250372948633272"],["11152195912420012771","6092458604086821654","16175636479780322365","6414958253165391876"],["7239822556298127566","7416304617489529627","11618099699470216458","13161352511552500630"],["17444896620318625292","12213739275107179449","5910669704929957094","7662967083440623671"],["3096854628274719738","14231323811147469299","6713088674183280989","11739164838151570368"],["17271814387874260080","10081043265304165024","16644384636393226707","18195563566683967866"],["15096639746916296550","13659832749317625926","5740849760717690762","12969854093433668373"],["16522942205139862012","15777387050513171377","18106230633466273782","13185363385322490551"],["14954998162400230814","13036462150304797012","8317008554289076679","16753320855356028249"],["8403445547075290856","2892082857985607150","15921148977611986421","662543962896004552"],["5068786625236029017","15289127438837532854","14223211585692662497","12811429401319135324"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["18358843916573335321","14660012714349439429","12403536258143770144","16335306004432925586"],["5923253915943974865","12625833412756175543","15422497340851799468","1145947996783193639"],["16405990934163811270","17471492424638936466","9549075934156104451","3804334961857085342"],["7435477845889576784","13040468255785138688","1788065704686023899","12190673374649480807"],["4169376924914261531","2812451870994098297","731652276890519436","18302190132981638020"],["268896422249466074","8255323861840319505","8690087146539069894","15651539710553133670"],["9379207053584135947","15393194611476709557","5805924948885970845","4022749088195283013"],["18395632713091839173","9300455029220018584","9438298029945892462","12062279594303417286"],["14958726318457487093","1402392583823827939","12538477704889280263","2945434288929487790"],["18223501615233951714","14404490550185310134","7503606723347747555","11312383280885607167"],["12852955450202003885","8867638540380547155","16415702979707373320","4050224245233347481"],["3652410265867523087","1671510350944858763","9718859810615559422","17446076112880919060"],["16144585494861994366","7417295240118592661","5813211247106919929","6925407466513373526"],["11279840580153039403","491874205131440063","13077561687566583520","8733054918019782017"],["16857419384325325925","3535565560652905329","18443239365879383246","16349860936112877830"],["1576768789536092627","11479185285370127532","8625987256863173483","15525759490383603433"],["7554448335467251907","4282861275331609043","12591306285435070538","12322920871603575664"],["9777896688847815302","4508694649936256288","8880253856576817042","17499943260689214577"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["18138991426631541172","4091098872193661345","8168902784719052238","3294942977060829858"],["1637584312272653482","10927761366339383269","1755156587717714145","9477995185264394160"],["3555189264417908721","11790628817441857565","4468580900726589929","7095784215876403621"],["13007675579383951591","11756107217055611887","15053257402691928381","4658706813712184381"],["17653695098626658065","3845512919975095877","8815582357713495381","15813795444155163936"],["5518092156349006280","13731571468794047542","15642162001620897389","7159906965671050329"],["9581839508668832102","12228821640509200887","8954633383542197860","2132850175730608913"],["14512877031320556113","14691379488150426869","17542652241973654502","229030839611530751"],["15335392451666983759","5917235077167291834","8469553857694491074","2351338697450686240"],["14513748953461016140","16011479936250173103","2049047378165440725","11691424348441515086"],["14276833511997127487","7995658231888167812","2452873820045339739","4950067193701253762"],["5627852194369483311","3826411781970598733","8774929869060832500","16383947219646092539"],["6312766750183952463","1333829731813926081","14436249081032847107","2672498929284301855"],["12251721980872975617","10848750163961610941","13737973247408069294","10495422384400324113"],["5748275212001677909","12923492572428067130","221718793705129597","4059137279281112808"],["15203075056832538677","6247641169383711112","127230689901144109","5491561685405377831"],["16047926896318425503","5052805647052680479","24646368437433245","13631559351872201323"],["2762594688453283553","14017820404068788229","8245705192524330348","6867745698421755422"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["12775258930370793606","7059239884656840199","12845463180684702271","16932875791918348532"],["4437037593141251081","1953348993006612214","11485876351905573905","5349396046934431265"],["9380909621783542734","14733923321379140439","11927005527833644812","10707926557412572611"],["7694764509351832380","6572185425606482884","4665208512371050649","5187609607937409726"],["3719045733121274060","16274218135438257234","16779751434222104934","7625893539477983219"],["9280540309409773009","11005320064515632407","17508125767619724628","8737534816499387354"],["13575585348402366840","5617822461073575300","12887362504252001803","13338318967033290891"],["15621173767449694827","11572531013740024161","7945196655393049845","13391789178360356920"],["11290713197756311802","12340596299400675705","8501374181795165086","4595338042493103968"],["6466805786892581284","1530819911834731180","16472287186261332634","2769341206730219694"],["17250185379838692729","12931272760330802971","16571372182686889484","15123056196072249990"],["4006522446351754021","10984048512895848425","16707641753744072042","16197505947545053031"],["7210342743126189098","748625468311009159","17012716526699231121","12278893833897662198"],["3928856126825224558","18365769244153842616","9973693448621958761","6148110214927480696"],["16333584789046651902","2509190349804012290","3160837835969868375","10796322320830484420"],["8460560447582625369","15477131111187461759","2901737170500486971","6780773373271447222"],["8403445547075290856","2892082857985607150","15921148977611986421","662543962896004552"],["5068786625236029017","15289127438837532854","14223211585692662497","12811429401319135324"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["5673376953898173804","8452567427924717698","14481986260823330376","4005586085410366808"],["11640927816982516959","11005633992532164280","1071847739803216115","5849618518487158207"],["245185607924607464","410806016440899554","2591128578655979406","15007856093055660210"],["10662878605973633048","17848862735127505019","1546003688286090797","11174890622964941993"],["12021947637886555078","7907733819765788259","11969027511000128952","5423616656079988743"],["16504467443181560908","14114826738695310707","9826082352646131798","2679951343629326356"],["16841826951825262283","675724759116445495","5575291529966562878","18275964548926652901"],["10631349869751950141","2107883539472459562","6182417254081625453","1872169967877858980"],["5179270381198402186","4210277973197934965","13746042971252799294","6899716560134702572"],["1188016854985547389","18298301189271537024","4078936193868191692","4447149987873842693"],["221030222375863930","11115048199086073237","5927581853141986435","10419513700102018673"],["14768309427461503757","7647998016693973695","6625955209229747281","2174514691108831316"],["5905381434371557605","16767376864733289708","10503998191637003820","15402028150619444754"],["6865586114003470519","10711208036797342716","18133322033503312822","4525567270978485086"],["3970714678005224354","2711117166674781998","2733682219269237212","4707975460896473148"],["4120848826270830074","8418054466038793153","13487326854913955972","18445353368195075065"],["6055329046838637848","2745203294458694770","13080146116051806758","13495722690643229610"],["2762594688453283553","14017820404068788229","8245705192524330348","6867745698421755422"],["7743901214612590773","18042340450859117583","11783871748807681405","4770538211884298000"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["1064692771108608940","12212061721125974312","10515456698972364767","13461543953655708462"],["6848446803253892222","5335511456205591956","14975582174062577151","10334167101179702909"],["11361008744061301627","10396495887078101461","12111498621795279515","7318315088993766749"],["10273676961282679688","6778951179996821278","3853621472247181238","11025622537840707399"],["10979910113246785921","12565049193907873163","17275615684553549587","10682100694062397111"],["15151268146485275390","6497815398515574263","1392977022374624232","14670497820126805354"],["5996742754304896234","4151194434672243914","14285680285715128887","11157371337460711848"],["5341451360098436870","1611231938154872973","2735344319433656724","1762324507777191776"],["4522378027851703695","8237916833729227420","14713706383072760584","3509441307560278763"],["4010073060662811773","8957997046316842326","2754950649116816430","12837779049575251084"],["15376170462203916746","8353379036425507722","11447331507209675039","17007143461948752929"],["3625750920280000616","6811996824693246663","17027825172420629946","11592209843083464"],["580612733623675302","14351552334755619142","9645125706314757715","6662570126885561882"],["17696823549958497131","5670075638263895420","9432512697763035375","5075996249191227917"],["18022725101117005400","16471206411783575804","4097782836798066628","6568679885167901969"],["11885645703162569951","7117905488741586263","1708599584416159290","2412397105082327549"],["18264262665100350451","6700497417837533556","8748798172684256997","10497058772512095753"],["16810857808229342470","321539240359608222","7102570708077417084","14600444159211409123"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["16392217544135126169","2841485280847144304","7343091215132219722","14535989666821022500"],["398283797262553630","17034652527193576109","6188559279556583893","16391261365648820591"],["13516013998452004606","4616791942054150632","3905481575575320441","13827477906848144116"],["7619369444948731456","9142627130743448856","18244751214586747540","3469581514145473846"],["6078519541891715951","9314981282154010076","14417856297815617154","11340619369995159654"],["7455440102137060162","6021790430168211715","564470063753184965","8680153074541746634"],["11646277631288262734","15509306933554497815","3116724406284473665","5545630852973439781"],["5787079789381646911","10683881051090231318","1795772589792621602","6903306387717446010"],["10446433624344789130","5489407502726923252","2276439615402541915","14868424662977290123"],["18309088956951209015","858103170475248988","3409739053220054942","4301040845203667831"],["9986606645452661694","10059190524408873851","8502114243994377803","5705986797966276042"],["11394807968149499772","4299278064189210537","4689757577224366405","16658575707377542000"],["5280938529419063617","2542448446579497365","17644237459036941834","17193931226328825690"],["813152407732076938","4483045451852558085","368402257495952561","9214627854967118644"],["5861842964277342058","17495315136224861770","14368743695993932214","8819118991897533505"],["10066143185155480590","7742104644883150076","14462504184570536003","12626514638667089546"],["16571231985245352198","14109443030337185960","4709727087030380014","2278219445369027430"],["13485224721477825346","5566495058857237868","13744064945589260255","11610526570205945738"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["5049583244557357967","11215790998247201362","10933788415129729052","13570566415242716879"],["16660670979150498489","6865695286782279176","13745622218309296130","9999759579152401954"],["12462996337438067094","10177886624991152237","14682618746867191077","16566124212180515633"],["9760103499608842158","5180442765234153869","16140386549045199632","5841975589925403929"],["10224120076572919892","17859450810427853906","2259231640003127746","11643515073584692552"],["7823591462495261217","8454764243647690017","5765255732957041572","4069411471039048467"],["6204028998615547950","15388323239378634672","5971667918558781800","4124347537035693527"],["11556211564942092967","12361015462735464928","3889368896413674098","5560301108431924382"],["1657880617992003704","17533293042935193558","14758390209751872708","3290983035489265885"],["568498339201502497","2685325809058523367","12897501923646095604","4792888562345456030"],["18316949320871569093","12637905603162808893","16622364919441422657","1273152234687622983"],["5130063115101402354","16341968405350345521","10668968701071338901","4950942554825977861"],["2137018881960582296","14654571331653901650","6508734075791871144","4699584454447249632"],["9761634454840437137","15086757125424054533","13185912990826710198","12525382851269244057"],["5394802198378822981","12136702856831843582","17674146391588192664","7156330325013781531"],["12939366314770948259","3554270190891257738","6484575008246553573","16485051431854255449"],["15195041032653314118","7513562273807951004","12047908261677169294","8091567177415967890"],["5068786625236029017","15289127438837532854","14223211585692662497","12811429401319135324"],["17544232940602744995","1298313435793359814","7876196287804098458","13158284059964638636"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["6507609429038383673","14934098165236379770","14376137490201250138","3906411845814055473"],["2927134413816859838","17808729334232697547","7148990227876825083","3077480642563859575"],["12538277656371596466","9601456008204417786","7864182153257060391","17331837719079832805"],["8224020929145981191","10131623285873576572","1734458595263473577","14346462502147056251"],["17297529051293327018","6787874629154283980","14713905695148496772","7917799580179451430"],["7261099130265581013","5415251167095303241","5696163757298099359","14150942000534258881"],["17404639922969323740","10811205361076352501","8211665814677013690","12999449657548759954"],["2831793891444815927","65106124015408333","14894569009067804078","15885107953954995487"],["10975248639381937075","12862916330586603686","9341993737488756496","3212160978121010927"],["11051130228767748919","89053294426724854","1631717366875368352","8901216100419582655"],["7484040484497642502","15965240298072468177","13554413494034005721","18283436421268496543"],["11550975194501884711","2829328658301032970","5939373730907189835","7927557500965654119"],["16187532522924640515","5656745571612994920","9763567968830246992","14940677361872344951"],["5615254426377487327","16620017006884743148","15238236448532048416","4985494355164645056"],["8613896993550975552","10330454072991318851","12435348819498658320","6909583296137578111"],["14436700913656310659","11851399829697414519","16993222190209547870","9806510610548725141"],["290047901786024727","4212919364127598067","17906476394370023039","13360410898432658489"],["16002353297611116221","5333114493089171825","14450347820573585954","161573887810059188"],["14683199385779297679","14519593360061363563","15026066244422502101","1905413217641393340"],["11230365011109988564","17335508442024503596","8442669583455275980","13948118649885769761"]],[["4328158929922546533","17540762395080562674","6882118963759506688","796262424946444158"],["7494888713785775837","11809104300321951786","16275205992809707881","10847053504694099109"],["6297501055816995889","14007822588967141908","5851937414248278547","12286298522028680141"],["971712846195730814","4962591676716377805","16403218842284131655","11142692605191312264"],["10816318401629555304","12464332945766693127","17230706643159004360","3993606844673502202"],["13568946380298018511","16778715623974232151","7729210293084498201","8910761015125739397"],["7980885964199884688","11002034784530041317","13510327930103595897","18439571571560183764"],["9519072565065465914","11060731697775448262","10263392333273119889","2881930284396534796"],["6861676692900583337","6776615226126716768","16913180389775166390","17376448945078619809"],["12873706932410548890","5096575948508666515","12699605727547834051","14503771087366845353"],["4279254384406813013","14012133609087873346","9494913406730330046","16327828166407143090"],["13945592836842766813","15370782474022394317","12027359479428687356","5811962147992427706"],["1001104819493562658","8140186066708942273","5977679213720426564","3604838485423820007"],["15379839173061841014","5125450736360804502","16527631968803417374","2093863836820895302"],["16454433009813781799","16000794823478988482","16166854597149543792","13720238010691277838"],["15100694150870091925","10332466193444240459","5405058012374389578","11177740564800478523"],["2840643739815066388","13249687844314229792","11715727990971403338","17105589584820875506"],["13485224721477825346","5566495058857237868","13744064945589260255","11610526570205945738"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]],[["13113103499784535295","14299719791727154074","5009804847337392639","11612965353969657319"],["13006350851576370358","11412076431339620011","15234753588529115410","16687945736550045582"],["12632565965807914517","8003239899573697857","7576975313935696325","17266455474305079880"],["557037742766544643","6422252082414290642","6043199581831165016","8517811474704377095"],["2849690019771181430","12228297403681638044","16765654551564085461","18038973737676372545"],["629255725036611616","1967941975462096175","4547372376027150321","14216222861836318520"],["9020800816868286224","7743627672745076097","10067521891360596189","6462602834312212648"],["14017646721892506522","11231708161512997628","13886779356046998618","17672582534810041531"],["7652283286321253902","4132301435917866527","3537448380465439648","3664102991154900309"],["12722190220601265208","10552457048499201519","17867365795105987679","7300340473248722356"],["7357783376430881186","5194511324964175983","8312233113302692259","3262962767949600973"],["8313010620100206148","16133387362218280749","7954615606837600805","4050673163569093008"],["22444979735916801","4077823805108660881","5225773547195330336","11364045685751566889"],["407061843558853952","6219028804006212832","8421577759471023874","716151879509602848"],["17482229877417735749","15787561107972248051","3660458023062547472","18250163126495031416"],["12210996178770106001","17591315377510400908","12421685067477854264","7837806040829927843"],["13365060206678260961","8855194455441784180","15052072558117942962","16343253545481755416"],["9777896688847815302","4508694649936256288","8880253856576817042","17499943260689214577"],["12330091211771404202","5443066969841986350","13379424506069830684","18265899894808555193"],["5651295987796995172","18118929120124826788","17745271810445364577","12330248311746708053"]]],"s0_siblingsC":[[["2809939800944007015","7795230011822374826","9847194719975868379","800247662537192585"],["4108247108028741179","2765759407755262599","4961008592610367191","13548841825765267612"],["14026173967077253487","17332395734580591280","9466615718056611354","2377898710433616786"],["13394970919091588365","10118519067496553449","11342602828621662911","15591845085649745529"],["2246681979708066127","8248568690378114796","2469526649500805434","4310381045373445443"],["7533551584171757465","110043455683922210","12701829660507194474","8167765911571357186"],["9237212738336431229","14383554376803383843","4740842019150856662","10311280294458162055"],["6187154895207470527","15026585817873801950","6316445051747307422","8536120194371819351"],["9715041308562316324","12953556032894879346","6082996004055310132","7327868196339286071"],["10631926909860355515","10639577531813612930","7220679097140576297","4084660476058083621"],["2925969790713766862","1364312583951391296","1891310215120981739","6690252353854910301"],["732838932827897573","12352711921010411184","6715710057687957375","13919231981298357031"],["17534701013421274296","17181898759969872565","4864631974738381863","14896877868486340258"],["5037865957699569856","9249779193849347198","4991432228457653332","2775954233172420657"],["1570861705861335033","7250155633413299880","2751012162859181260","12465010399940768622"],["8280812836316470731","525459528857064349","1224234600473223565","11407072143640540358"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["3434135275869432421","13876642500372749448","12424078560953745177","14038982494743154757"],["13183717989881528551","5846111063637217704","6960879090231674482","10517952278343688973"],["3599296247363214510","17717688651575830530","12284544740341627515","13377346118363979368"],["2015000242512601089","15394941488010408450","242050444420593892","1182064158919468104"],["1571278047049387854","13514579784667195784","11986919859506082087","18180827846342370693"],["7592888525907232804","7655595502846403353","7494373417124826121","9530607531351523831"],["9815499916861401111","9381117539793339580","11920890630117460713","10077338908323256248"],["9378919214415385373","16780141583978656993","6401524436241161482","12614541886441271044"],["15066697951531361167","15391637171224608507","7244333365540066314","13537108949985547180"],["1828211063616197797","8324449861710605775","12141024766019627552","3080215192974718162"],["13075760295826685596","5075293931676198284","2338007899347911397","12224242388441604161"],["14323050427950377180","16433909342335974888","5731882963896426482","16287403088177221047"],["5134725990254210094","16533927263672883945","12352221862132297144","14126132099768639067"],["10425023106948491534","18059424443565676313","861048320453331784","9025578293050816261"],["2621458800350074889","5402288709920949641","18429361494662853401","10216419506251613701"],["277638638648574701","9583542301685115269","12371050104027221794","11061520894606344142"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["7563382748956029360","9413763262078821774","2576272634065318404","17469454810632817039"],["10375855500040151490","16861868086901630032","1917118380058216310","7115579977682938945"],["798717307889303098","11642263919277352048","14348754019195917340","2556521690403681529"],["16450638215360559721","1675638515957300289","7703886275534174950","11123396690689289421"],["4021501639834274873","15392728082513230573","10739258556495332141","3947051061229590679"],["3297133044938525048","6131658448532340657","1284939436227072747","9032652696694404946"],["6683124593595337739","11944869926564573545","6924320450139249353","16258668265200397170"],["11824510017135245116","12841832068848677285","11384660935031601260","4555477718631441721"],["261451686161055846","1195153950676965871","13088491613343979449","4722721906926289658"],["16855302001461405836","16022778927472210375","2551136043938320033","5404575730701239308"],["10975752730756571193","5963335642494027168","18223155762122777931","12359734003369392424"],["1147711457459642895","13089228725561924645","9143067144871328005","15578836411209416455"],["16591250803140384019","1855407441357865258","13595815273447677622","16173614530166334478"],["7789636084622083285","8574832038157876849","10844693058793200454","12824185995250924440"],["10711371731927521202","9664183635952067958","10208998599696435940","5952422119534306131"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["7898444439094259514","16050356243522845830","383779632149351587","4416623411610390828"],["14158050589490446002","12663417540287561545","15252416627400714869","7259513074159351110"],["7347195488053810975","3981623010815449638","5482709976890061081","6333026142362419946"],["6920049911528080358","12989385323042244746","1332357657677343242","9573537003001378494"],["8002815737017405731","7935081456202000000","17647937769758056901","16534837374839993319"],["13521167212826743344","5103464265898170345","5522405095429657517","15367807949678816461"],["13150553793596935387","6870633093155936004","9852201802910653179","7388037678077188657"],["14929504215318905707","5797674591950442647","15345194323418596396","7575163619269608053"],["2669510727173773343","851890126464959860","103061682635895522","3976468073914584764"],["18050725905815684984","5992899854636965827","13791547628603868290","2889010603602860000"],["1186348453687227783","5211424541146996431","10235777514310408243","9612314225874797504"],["13016591817004382378","13835251873279335660","17267021277257179493","13114154573058005705"],["9708442470210304428","534904359182713614","4269760023467075743","5376397370386204832"],["665724166779394472","3769806167893131367","10219696118613114050","9558794711591598638"],["14657465395149917743","8595275927125344028","13396825682857237851","6949152477309874846"],["71480934665987796","14923658959496530109","2716278954273736787","7178433557381053809"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["17648784567164058402","17905036977715806290","15301638607146922692","12796448723053720066"],["7736864748537902577","13666609263884039136","14947690634811763465","334140217322950103"],["13580000200762576595","148981926507891669","5689371611241135969","9716142125072291835"],["10096814960575584799","5536316589511418751","18397555588852142646","7290633215810856720"],["13592675462664848407","12418687590934859404","17781000779622256684","15852643609223531103"],["18047442791862307128","4180431364688905002","1794785930458532786","11486734290470006347"],["16783494620219250015","12542770567900917281","6982164979425716449","13690509359539335869"],["2798482639031579594","313249059996976247","4541087609140425469","1678445901706356201"],["9441947719562942311","7069609584678291477","2614127448908709352","3610805294752640263"],["10788373225617528535","12338144503913492311","9602652542540984481","18420535876642838147"],["4437489402943352249","7984385736161087985","14084751199694245312","14634556495632598457"],["9295332622212470657","15026783649321731245","13191756431062568637","1753304401770819560"],["4054494154305900720","11464115333924839388","15472434629593091793","12503589060082770980"],["4379923318604354700","17763530938800918795","18029428466963542915","6633373422562586070"],["13975107105567499765","4776493725633016430","6066579632369672869","8852984207099157985"],["6775248609466444160","12442777071342522240","13361447808815528497","18247472270039453264"],["12042332712449914194","12590899279251214832","15949885778634330140","10616767785164514972"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["10419846433541698782","15704786096865617108","10858209118042753173","8889297486409062700"],["2925205135286340303","556115785173637490","2919607907570819944","15449803410691380853"],["17674206327766667403","14640938223155540983","14194705530080450807","8889511958000750600"],["4051694286992974438","15330132732891784702","15495304034249901368","13009283831055307959"],["6769116997917026349","15095039114814989835","13120279378385691084","7807595846680349302"],["5728928436084447357","7852973081045817699","13744784767229891539","2319615946777152508"],["11261858534000900988","12964034371447655997","11803214728353093643","1502277125832472177"],["7010952359698947672","7780683616236785634","7244368569051533725","56776522121198751"],["5507235649575497881","10751023590886064523","1586550221858613812","9894441745795703381"],["8546802639714406144","771571427527500721","7066102149346987703","16284289053328295936"],["2557004421174364411","8824739545393710188","11554883156722514618","585928630484463880"],["4870266434253299672","7324004982040825744","11114503911591686364","9748182659184965046"],["1562957821701899267","17861493352361859670","3604919831118532287","13848897045955676690"],["6888839663080880489","3974325598169991013","11822560430606264605","5448984585106636653"],["17700137526180119133","8342976164666078544","2375412647472110483","12748203749331802388"],["17719176309367561434","17716647259827084141","430204323040556277","3287298893748439492"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["7392604215772709161","1696933760273159827","16669744476281586623","6563082735624659091"],["13240342030319407178","11351742246505088181","13948538842935805799","10828170738743944135"],["16618280469169926270","3915429457219892583","8423627589108682679","14860030996465167072"],["13054523008652842097","11884638581234786512","11139332721770950491","13572424709328204623"],["17253512362803608049","2929888249576315987","5606233702193018979","7832915998138202465"],["1076271352070410780","12077602414104448090","2716223937426451868","6254781855407363989"],["3137492542151581301","3679742985930784","10841201296808416126","16371302634604309373"],["8547390428760969439","1395572241721497880","1237964047722890733","12691621166570315933"],["13755118074705257511","11939817048807614136","4921204383282870875","17891086519440589637"],["758074300198229039","13538428918069934514","10292644836416669178","14427214440890451622"],["6918191281521352254","11468991382443211467","11349807689374683474","17348850888709385560"],["15648643882352690671","16536570352983967459","14933491426313588770","17885458933181770417"],["2917980691185964719","11828089854681385448","7528139352523294679","2778684007704767762"],["93218644729037954","11403600283620399464","1845701722048426818","6281429710858865745"],["2806276808923271401","2479768728203880925","5750215989928701609","16877156445805399367"],["2295625485825794318","8607687931973758502","9866631591926537178","5962316801069057777"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13153312997991388033","9271409763399323139","15629242007704852937","4180361391051235554"],["2286994724954144530","5029583228415072848","12372108679526386598","54512642120538019"],["17078426318298703866","8425300789095526970","15394706678963135936","17941251341365820084"],["12411251804796508017","1299679443576712638","17384305144247325223","1335949050836554279"],["3670486498463851070","1899899625592486746","17846147743519469790","16831534547819345954"],["10545276983752575867","4850070556364285318","18351258743893251610","10982834578452517717"],["9916031411369432127","8691895036372071716","11080887536643567295","4995944610947413575"],["11953214171060415538","17212571988084989291","6782901057276171056","13974557031694957403"],["5381290825123024222","1665525808460142014","15810182727217510594","17731596828580434113"],["2740100533169163889","2372733659143841195","11234430685060384404","5502408700609391895"],["10799149086044641831","11727613697237396464","6242442681537194436","12947606592346564218"],["8334172048735317736","7629354807198743402","4993183400491301190","17182233209048348641"],["14299230603199950722","12405899149204567397","5432015381493448366","4268017714690867516"],["3521872841605428972","9047840043272709150","3201299558376722894","15539753583346570860"],["15504457575091738281","15676410867711816187","16072986184677012431","13901222333501322658"],["71480934665987796","14923658959496530109","2716278954273736787","7178433557381053809"],["6654728617837124648","11367031813739192321","11480251220786041087","1144504069580885568"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13453479660765322384","13700856550451401774","16037070048310348978","10318017467790722937"],["13752435783542553618","7793946344477018277","14261009426422611481","2523749024341623383"],["5976058752070319249","11016605976658457495","3883656319930162338","8268450104844914448"],["14457234363785525866","11156377904920698074","16492862797577678492","4638117897491726850"],["2319619717939519516","12302879312791378727","15648868673066636713","14727071480257055073"],["3262542527210299976","17376728562939341744","7568807785280093977","35284432679325221"],["4036797365386958260","4573056552115266776","2437340733333141553","7960780074217278774"],["12269585638193844740","17563768766261111762","15528595618393290562","71670905985450414"],["17087806348482941045","7399977393908923538","6229692565953761749","8000991170534510942"],["14389561726561548738","7504081743600179696","17657039875493623420","3893520808051772240"],["12009252225239578458","3198644658816952073","1208562681771368689","17685692094961677059"],["2720547455980437294","9531454542772890727","23678079638746221","10755557110949339848"],["3505274959565384995","7728543411235503711","9975043363076277823","9125025059091118571"],["8579410763139529667","18223716509189692247","6808004366359393951","1684199986765080413"],["5675817374869387355","9505369945203610894","582615405410151361","5041710785154183282"],["17719176309367561434","17716647259827084141","430204323040556277","3287298893748439492"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["13738851072425744435","16993117843951047089","14181997029646847148","8389781785694815559"],["13616877230608310313","115270322253686487","12643582785560176223","7366383722241413564"],["15102384815902507132","8905775341661584674","2673445083155694331","7814350341406243380"],["17776550850662215883","12114090793372896535","12654440175646612062","18395987063220648396"],["11504885219645668296","1527748803621621800","10288844518516992519","7007159859761762794"],["9436911224415256168","1140905954223635433","1534322065279672035","5388079332261392184"],["17222829368458358163","397287786392301847","284101552903855960","18314639301385606707"],["18225016155855982496","17390206532831741687","8146513244209698924","15545844692385393831"],["2164240020970879459","5187210298583044847","10948083481735333121","6590786912467485339"],["17444229229241194107","493035702868691311","1501413103963400603","374054070997961504"],["5525547226078060668","1824290475324802157","198771668099109521","865854679158741801"],["9544905418342616698","10791167074505210373","13928996758089851859","13973984695748214731"],["17158276843872225620","9625757119091099085","14542030826891036013","12509623511381767303"],["6299542262050410318","13616454144780327979","17996381811886727018","14983183766975772947"],["1570861705861335033","7250155633413299880","2751012162859181260","12465010399940768622"],["8280812836316470731","525459528857064349","1224234600473223565","11407072143640540358"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["11283039243503914584","1950672775247704780","17837485018184212699","8508762841488783889"],["554697419643626742","14780190248931466527","12530300747521449260","2714259455402346409"],["2914740975322621714","16259157286045848768","3386088304477822324","8412126176419354726"],["5560439885226212139","6469067623093874435","16404500633641072486","5669833077913348213"],["11858392601622073534","5147811681998572988","9807287585680766690","4487824549379214694"],["2100009086351959043","3611292239989639417","10373643933465244175","4398669541769323074"],["15393036138993924219","15365010228680541273","9095941951546795058","6006611731869319157"],["5239176372963940068","15127977488560654917","16332362670132275207","7567785594409817542"],["579982922014621206","2068768600251525648","1226704223024598886","2371676778737607953"],["15041382919172417419","18410357403391104742","9076218801550117694","11180698858567691591"],["6734748589064630634","472218140810215634","17218838657803492275","15016049839926177669"],["15900029021196328518","9079718998311865925","1313628436623458519","4359335100524077365"],["15784827574488966137","18025451883875757965","13618470195280759099","319792243405700220"],["5801253494728165831","16701752490700033270","17066386154809759635","11575796863756069410"],["14019962359667843573","6616760102606498110","12307073898498970612","6154910495703848867"],["7244760491117602573","1937002853230329580","12409734825103355521","13785445564269065019"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["6108431092894139695","5842627469156052301","5886142397348997083","13083781772735255295"],["18120642645314660189","13288026086947508493","4832302542158067677","16661356339455797758"],["7541440478240184983","6369280381112137224","12906173072890389458","17893907291643083220"],["9885916434692566768","17296300084285454844","1487689551222062053","17143002925915416482"],["12585529264781246063","13597824165956384895","10666842492194452630","2999523153837083464"],["7264996683499475802","1842549727484821235","10254249169370760328","11695656963077714396"],["16955142377149381756","5050822915378568368","11611856233397502772","10785926380454766711"],["4401900332451171078","10456334085421887332","18233312035600623591","16248287752214919670"],["2669361827119008870","15384628727277781355","462301798455676220","5289969307682753079"],["1778694858514915483","13841130925358479835","4616877512081987869","5416584500132167715"],["11799111696134623569","15581007270282725907","11464769156337982144","12698735836951166597"],["6167525455160729908","2870895846906739293","14205004569361994383","12622523090871820117"],["6397998434390781378","9729155815219369059","5283493899461877162","4309150099878771699"],["6490062029361073661","11759700933930108436","7609617228210988490","6599172255588158234"],["12738407627128784525","14415966097692821700","383092442929893039","9656137787659711906"],["1752821537224067282","12863968065974140385","14431030335751594862","12001583380482328221"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["1249207982394805373","15968879202946952826","9786032670304087333","4336135057663033040"],["12463599625818551580","9130910507289696463","6305169401811813004","12454378521884352348"],["17128327107937610349","10435001324718440567","12943610340598707328","13775141784695060524"],["17157394020192510660","10785672995656456852","18110876240865563983","10953437389397530046"],["8642131043517897403","13897812046020834865","8391178906052443266","15351678423964548767"],["7291363592374025803","17257903793611721939","11890850913202868794","12406543223122859299"],["10790188762477464428","14400172977273592497","4265649871074712928","1706278602698226120"],["442159664694388058","4752152770360328961","10052784453414993745","9365552730063992744"],["2191448737753644312","4243753281902942581","7198070887583190251","10348643805251942369"],["2476439576023989549","15160053002430636771","11410200097244059272","4874366552776159401"],["223826481237506224","3177902585242135525","4889500929424677335","371479734016868816"],["308940980073886925","3513121397930931307","5944173749350311963","9939741462615369981"],["16851808108967926105","1222908873676933002","5425319075384197279","16271863159162905090"],["18157693709789237823","15183703201420946914","3224949799579042300","6612589693105661670"],["8012788336744037940","10473019609825172224","15283840956305007116","1731319719417331402"],["11477233345027020212","14832645080858559662","2867355695204893483","166496565302566572"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["14611023034844010261","2857112703302993533","3001380048377514128","18098922743722130570"],["7822592974431568731","13154129930700263481","16757468854191945302","17805545681668283330"],["7367940142450862588","3342958246987188019","6664824796604919526","6333828917748389434"],["9738739628148014711","5262071590527305574","126620112385946658","10691900896475817490"],["12348748784769087397","16595187392731679521","14654844676496043725","348204612243234548"],["12353106082582681706","1715008018386169662","9053583610394235458","13256284663287930196"],["9764286275844959045","14616933074679665922","7707539446638322807","1445838044470599152"],["13500131088837655149","8634542124270577737","13506799411325099037","10844068428139440367"],["12010106220909569701","3809119312580313144","4505715441603442784","17884537464626108927"],["9062424984240466038","10867271601853613703","9098883717707765050","13034876333788890729"],["247335423172071919","8829910557682131853","15237280778290380487","16756212790473821694"],["660597714599715814","7212848623943431634","2385452579708678675","16475126700906314547"],["489696336480252788","10103079772586498293","1322758140378775297","7740933768625416512"],["1407337365760144843","2286768676374289713","4440889715311480630","16593383170953035220"],["9395844085047905814","1897404399097945971","3412362229994687986","12307778403955881364"],["4121356699988936961","9856259977427066074","15334706139409237421","4096871072301176216"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["5940504792336770113","13346676487723218177","17185768882314689371","12560396988391469473"],["6876659164263905755","10495181798193599473","6070225221290165065","9617029631449874314"],["5155721496137444919","5855434261602875343","12674884272863303371","4364322697380474528"],["12069781454191459250","9501905296423681631","13751164808431983990","13254042529548373554"],["2431054910929338595","11282587096041775037","16167070538946839630","5255697554535175701"],["14463252643772139988","15418455044933022653","230677956832399539","13824255022296756744"],["10863232680722158954","17314942098528975428","1540789925850190177","8137196380920207316"],["325122029284424273","470351799366704790","10952870838671504074","9473057090217982078"],["10559461245739791955","16248986076925655106","4236217558054672995","6309703095677056412"],["7344652394106477063","15502922122740263525","14302565726523879329","1268981839171102926"],["18146441648624691662","13343149421421403798","2685096842225756218","15465435376971403910"],["3775508304969868182","14376323639438042613","12366442858220349497","17488963884531671757"],["11617356312294844312","5613413935230824739","15872086081876468908","3144146065018289032"],["831982752576192877","7299261717422180962","15135455333884063555","92989484296268599"],["14229634131244634078","8499387728773253050","6742680990084762073","13105445553539953717"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["11122696904255040598","11005356842966347629","17537890366883010162","17784496444481171069"],["7601907850002244699","17150668586860129937","8721894324062298163","6366973303974521781"],["9341627233619311138","2398695166061581883","7616038315953667592","5533526935691223090"],["12369715430718327198","8145251113825061672","3023932329980705129","4712194611432755953"],["518472284555260015","3875625985359741475","3257426965632366735","5797621343088681267"],["1384660348256144391","8562140780642767140","13889479558769804381","6826501012358532569"],["13838368515272953493","16810552448213708793","16914108171505755460","6428236961972814188"],["4963654557297852802","14495219747985974093","10559738206162674143","2578284519689778274"],["10511379559165124882","11170201765195205313","15880413621665757353","16820946625064581128"],["15959566739762507543","13413620343134373796","10060864213527554366","6633621308164485826"],["2465104226245342909","12775014110297218629","10027824283443088416","15505898583974742057"],["870804304856585380","2880076381693952606","5476984897046799805","3431107870078702737"],["16892310695672127436","9999653558309635894","11210250325876658832","3715305727979934776"],["10695702612905447895","9839752650258649725","16503725483984964085","15794698353152364035"],["13200301601356612061","9666154204728554675","3257310850058939336","12169237744108254773"],["4200266276446124860","7590776884214412270","17989643570963819261","10701083148865526682"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["10091495449514588325","6204389201775824702","12598978222953586130","4948672863829157087"],["165103167836261235","7120195942648874540","16465027719469904488","15234450324674732570"],["5774497253322658427","13618143868449441942","6713126426549488663","16985306613897606683"],["15267370099200278587","9781707221286552806","9427045138141104022","16607884015263662132"],["10966285353789615139","11458155528810690912","1145700508639027862","5834274397441111011"],["17635388412743707900","16199358822329523198","11940966030639999245","14967473091692796751"],["4597121291039718550","16691704273614941668","17568571311558647653","8785621768371874495"],["8393842011757428807","739297971861780101","5403358068590741527","16996268090874946794"],["7849173372665690167","10777223946741147230","5719735620290346011","9174767307761477929"],["3587890457024338423","4687663509959313250","3197796871290149968","233360444465583398"],["12306612554122180819","617868416982775727","16220855415799404383","6158473992703083220"],["16283298481505985044","4923320677062506728","11818797756402989149","12765375560106256334"],["8137771946553442761","17456680574927278334","4322812652882260970","16998567280351527367"],["840828684883378857","7074175864527658410","12720674677546428654","3001297120665500809"],["4017457918523130055","8386664708080628570","4762382856846087138","16067088302796290927"],["1752821537224067282","12863968065974140385","14431030335751594862","12001583380482328221"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["481015325427832489","5117232533334895395","5940146646415361796","1731614912354463831"],["5283418650621945115","1726140405296022014","13771434216356934719","9563142877664481077"],["4156890423247508948","6827347629146152453","8801201047047935225","17385749625993277289"],["2115549049216306767","6929792324035881464","8073844430869258898","6881675750310851415"],["9350895292736469287","341469820535775562","8933567955279766784","8483858524076223460"],["7670565777426070037","2597528964692464652","13872165118525323487","657852224874844792"],["12856737988906074181","15631868713560460871","2361250708100261483","2131942611457692140"],["4544724887301154637","9714222969707830773","5294305720962103250","13303535815499159407"],["11892421233207349539","700273205080446890","7578023543286260175","687634484857134714"],["9984683624889285485","18248324798562091686","4181880230046218139","11620291740199980968"],["14540514131848460248","125138943600145302","4211071800394980362","7096136384332048050"],["17738813301386674184","16988720162347019690","1390104038489691229","8852380193096686959"],["4556364824530023311","12003009127650377231","341017590922171436","10968706145254546372"],["8299971072893045760","2482912948236549925","14960897130531998052","4135797353724262520"],["4403802434878831881","5422227429683284445","9751218811148880421","14136944576102627412"],["7635239324268522224","3644193782740922068","3770420575850254882","8967097228445315688"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["15805548037962924342","8752209739958096461","16208777235812112576","14015553386683974982"],["10663636792140847907","6806161076253943263","8214630556733259398","6995040185739323525"],["12943695808717472922","14415487144934746496","17468630110890745566","4123712338959023623"],["9481132338508645461","11197685405978934527","8713087208079139844","1468033907757360778"],["4666130192674918025","2456425395412296809","12101949204371206197","17764860144495591418"],["3588509638223322817","14758907929851554420","13708870785120940169","4033164851361193882"],["9715859264297886400","13347404861960181424","14862542085812396327","13781055138198702703"],["4158353598712087094","2521166510347187367","5566570429395319757","11825387638995468229"],["16557325889146273968","18317387032299447876","3728780980311436465","17393624611930169388"],["11405287738110350597","6997352758860544326","4008270380341825231","7180036835184918916"],["13654420513612751558","636463146859221384","2020389737505319581","17765574100605701961"],["12595789801039478462","11901289053333467624","3168413682638573875","5441202032065059530"],["10937010999214740873","12689005042266922234","8481029949923102441","11736356249494077875"],["15441411147548547675","8158161385996003379","8230576474624409076","12047447596173777149"],["13909570486439425283","16721948597343436598","10389351594605360728","11587248071745754468"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["7007257698821416753","6349304849002560692","18137883505410264629","7228060349393155114"],["8281010304083830558","5257548781051810878","16361390504502422271","1359722077304874910"],["10321449798289081987","2965687874254707549","7698282964770260236","2284312894964489213"],["13614229327886227461","18082850598690140158","18121853928429333123","14478289777337980899"],["3637157804236668897","17983982383065972719","12593145743913601390","11800838173357106724"],["7082655995370985994","4003585936568132988","3833616322223025373","13730661321897719011"],["6223749170065536689","3923438301988365769","6964402232934295822","7961889040641300013"],["15991402443534303365","11917195903239555326","11150180997737687439","10298415907204261639"],["15097618266079959853","1808587993128319915","14810375697923558459","1829333043169450453"],["10500492838232009095","9844200656637048544","15326369147638364968","8424729058449216724"],["13594011003218127996","10568720811087877258","5786171327044590368","5969478537781149797"],["12261107220764145735","14694678738946770202","17654195193611943861","5312765827640167482"],["6693512899302561706","4425496546982926128","236567976919095707","9802848072747286103"],["9789065593506890079","17997143146147862111","7643228786210492271","731440827838482498"],["13200301601356612061","9666154204728554675","3257310850058939336","12169237744108254773"],["4200266276446124860","7590776884214412270","17989643570963819261","10701083148865526682"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["3215381176971422357","2193928996431404905","383242845503168723","15581367806987191027"],["4193556605530526789","10314093482154265297","18372091935519654473","3253731057085647682"],["678881684705107318","8974244297123863687","1373606756446216093","9590977672168050210"],["17661093520795398532","12644585461704774367","15768904136399629514","11473584246983022232"],["7220876448325191623","14770129930264791604","11632093925375069870","7489110265556976317"],["375383468905510798","17233501119325238222","14697345143059349749","2429140538419024660"],["1692511935254236785","7069346510245377218","18040163616766717145","3960070962469491805"],["672720120646816431","1965797440391572410","5369454447778469074","6386662428039067924"],["4578209598432733788","5880923805777046669","8870566874624009124","4933769221478728946"],["5241722326711438948","3037372932711849000","4553631965596699757","7892824151479856946"],["11693498704644469810","12559858337602160899","1914372642779940626","13409351779840146191"],["11146432171318073485","10700917093824494489","18102611546979250413","15150267394731478876"],["6891530776159634826","5274465674550405917","4437651580301524090","4682450039339179456"],["11969642740587484155","3784834350341182837","12294157551388582155","3328257535383710249"],["9395844085047905814","1897404399097945971","3412362229994687986","12307778403955881364"],["4121356699988936961","9856259977427066074","15334706139409237421","4096871072301176216"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["11752742132879425239","5703993983733223783","15137946721226746470","5846348207303621061"],["8326723142272382616","15022158781335120742","9713697237129727705","16232333662565854901"],["6754340822014640060","7264884424971305206","7178805274101947331","3452991355250468362"],["13998211835887693729","11795537724422218099","2044574555082071420","1180781150421725842"],["1953961633029866553","15246759167102441029","12457046753503413748","16949592462870865768"],["15551549552200925682","13032956695007540470","15533407231130893316","13500801013270778500"],["16600217221941312815","5374960170802162875","11950574904679298418","11507473995751801867"],["14725903355728653189","11139288398141675581","6333951269593757174","9521223892979457384"],["1945331567305613850","7485090155955951712","8780039993806899910","4225001331125252418"],["4881845911745538552","8450045852809740215","17296293648392608363","11867992566069877764"],["121843170419175735","12344058335821532250","7495867541783438465","18279354656515308626"],["10933449404643050497","13349707114102099486","10735831163363129785","3986769169456788468"],["18186410983642341218","3578436352444600173","6430098614036514898","17063808284100942286"],["11093831702822309598","15027673351273713394","3297694392241677728","10146427632791238296"],["9948440898891712476","9087250942125863141","171961924272540121","6670816061416208105"],["7244760491117602573","1937002853230329580","12409734825103355521","13785445564269065019"],["11810760943865078160","423790009127496873","9548095276337501378","11220555347129620851"],["12496902591582118747","3418368678926551639","1710296968617357693","11907718185780992382"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["8555737723388186257","4451748456848630712","13322450693790124597","11425051754766424447"],["729965320122834330","3061650499665918541","16895008080683729513","9693821195263447315"],["6517987609269290807","1456337129962485376","4716274412912791198","12840693158125457569"],["14413950480926954812","3152257362992004442","5665278107880527647","13134277202900752690"],["11045251312207277916","5997694689221336822","950950377004439955","2482708920542114199"],["1748368122601802866","9192700657858084024","11721248903468661227","12892968067187528078"],["3888484001938954774","2777167564971423060","16791356399301810092","6090494877997065415"],["11409938537078353594","5981563737211019755","11950897178949903896","4791620019769752142"],["2084961704054201191","17693421711402546211","6053441462153135891","9184283573886739118"],["9617401330767585910","12041446315335943703","14066210860438835967","10958505175408000295"],["12519781571395642780","11441296360340178993","5193280019674995627","2236017296987743491"],["2282267593837186852","6411892246233987454","11370265920047949527","4867237742808229846"],["8895953177598619427","18153201670415595579","16366907005269320500","8581038274177168985"],["5664032825362675854","328326676606554374","11426795539119701937","975548821094841986"],["15061623612188989427","12303888631045213480","12020358322015490093","4591718479463015269"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["8712456536526615399","11702183821341696151","12964653757010841337","13140675094244630576"],["12895682728023510265","12733865175219615066","9290071391674276843","17236969447605251559"],["15106655120353066758","11648671013792320126","13160367104751173996","10854354108768940794"],["18151740542958650541","10489087374529457854","18323567871767548681","16512146580826915170"],["10041863892760532445","5125709024152290137","8201945458199224640","18065309937474538506"],["2628931485417693872","13752270970356774886","6055145926354882130","17197156066380315506"],["14115716946761875284","5927730515452582195","2864381523387930787","6785618498046846270"],["5488280840044835779","8711295108774793304","11276251162495316854","17281710123946544377"],["5075874242312492279","11708102805404669621","11797489101419884393","14510253465794032316"],["15970063093399419692","663989974127259806","2350452757563959536","5693804757304109985"],["14494759928824287708","2917962990614436380","7585008378611360924","6785321712329158072"],["6119709571990051667","17802591317053289155","1005990479200763958","8870512318149825879"],["17961804717669203166","13047967114074887978","15631433961090541397","18082488280724200856"],["14105412162112092110","10479663333474028745","8272804786077259152","5438679345137240335"],["15042036128794929323","595727036637743946","4648248218180999082","6424853813719801220"],["8447565201928322726","13112698416159375992","438510426692110218","1695316806484809376"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["9969235403688901537","13874512758985190692","12239859183477548138","15688978276865565941"],["15776786502524180307","149885925509119924","5445047008852327671","17750918917255867114"],["14324251033397456162","6891797174659639169","18327325972539348643","6749722724216249795"],["2136248806203858152","1946005256743025418","8728401066172316278","18124010632646170877"],["2919612280415194418","4384302954562838276","18422810189440498041","10411280767087311496"],["4918803075318718589","15783086957910424658","6339664050430086411","5156596686645581802"],["4552171540871531490","9020264143269634247","4772749441521967931","9680133836706807015"],["9672317538658588397","13143781930212070779","2274637922911960554","3580816071730281427"],["7331976060838188328","9989988896580416871","13484579920817980573","12967641923679928238"],["7841047591298337320","16187440728172132648","899887676844648571","11262347661847885044"],["665585431542425450","13440409491909756805","3001139445780804377","9968010779412450293"],["11973941462471244862","3778822635828910916","4917786907691282087","17771579933465328381"],["3767803218819882550","3689178479366515886","11086298630495608368","14985846435800590168"],["12352260326043764687","15781656058049293012","13579060438829718064","16160214561585503273"],["10711371731927521202","9664183635952067958","10208998599696435940","5952422119534306131"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["6297589236808058070","2092813377654663622","15420109936882064583","263778289268600897"],["5373967468703671822","3823125754858550168","16448626799130846599","448339238672004243"],["17302779185397674009","12038085913596655886","8782832601823338696","4805660759192978782"],["5714619673527506771","10102628378650385531","9576871789891035599","4529181432669291662"],["11971848234925787081","6663720886771328787","6966100778945905517","15188468441518873853"],["102755053826079526","9695040300809188162","5731745012397721169","6155610639157758951"],["7086599533246821805","7460976291954711897","10522306181711438270","15859014465595286668"],["12321297270515694662","5805488221039618009","5222380171813315731","12682811865935867504"],["5551836151069248911","7847280559299989622","6485665497828352912","9218522709603120639"],["12079099902063437151","15139033087601818780","11535115773560243655","7416500129323686678"],["7233562986463283657","15348043058130325579","5866957154919111894","16026457803644148803"],["16603831533135430346","11745126621971778791","6421991567302016795","12167564469574961173"],["1702603880134601080","10161950593793689693","8810775411585353813","3337093308281420088"],["16495383404312821196","14875716807224221053","991969568640826508","5742275465775702715"],["15042036128794929323","595727036637743946","4648248218180999082","6424853813719801220"],["8447565201928322726","13112698416159375992","438510426692110218","1695316806484809376"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["1512416603529977375","1976597373319282858","13986476048573879468","5218849076482298323"],["4478767352343214231","7663127720151596137","2317399213354913279","9273725182608281821"],["14021328862489316444","11286375867321477997","13947662289015991605","13484325179283215979"],["14383104210217153670","13412384342995064605","14019918735692539216","12723002270549248653"],["565458827671908642","13936382428946675904","16014265977645921002","8408019007695839963"],["15476343143949729396","3254975439218159096","11961887797016830271","2856103060452994240"],["8170728080611356557","996973830847614693","2551594816419383425","1845686400379035055"],["6545907622508813492","14906700238007872630","7860222445708125494","16771992613850823881"],["17278786504832120382","9038772615853669206","3546455170096543678","15142769731056163820"],["11710557024622966069","389727410665969482","4764763924118249758","1682746434449701329"],["16708688645369068319","15817316780543410124","14950545451307365889","7494661055867715052"],["2130915099888582367","5382528745727799301","1629520723304245304","15430617937180125113"],["6426884673016711644","15955945294541249653","10932219372843633000","4816911979048092758"],["12858117957920608522","3127184417367944393","13865249684548841","8401943724287608362"],["17700137526180119133","8342976164666078544","2375412647472110483","12748203749331802388"],["17719176309367561434","17716647259827084141","430204323040556277","3287298893748439492"],["11133734605276148491","3600566539382085571","6942595963546635565","3173101673422262356"],["7612781926296753401","7276781114826103982","9858793575556581459","5127921139767710406"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["12013397654503552357","4047826066983697854","15402508500440179557","7799849518025495244"],["12246270292587565700","8911452909017035996","8644078099719918185","8558916220811929968"],["9899560932715454799","5718893130909233318","16486031570066793624","17725697898573611986"],["3691527012315777070","17705816163015595007","15354342405980161154","14240330484009829508"],["16205600611765655224","8781686548730279690","9694009111215925280","3828854673458446077"],["13264395674757956139","10371895766614243443","3235912202909961055","7428437123835973640"],["9428603641973684783","16582825338049641647","10309278469796157718","1956280653327338011"],["17146508384405548395","1948819800495214308","1960772516416844339","17797158475044897029"],["5117282244824836327","176950243308914651","1855603892567457017","8318163649921979826"],["9479651306782078995","1116542150132431026","10061456982675117582","10423445177156591280"],["15483303711599877765","3914625238670893566","18365024385121018930","8353354380891546509"],["2171392313840258752","16092735699173467869","17478707032566971340","919378505535048726"],["18189591606993146652","12715464002438469784","1219996033182220431","10177519332306825771"],["3137274713457012187","17661266442519519618","16607200224281330349","12338231383180419112"],["17740529841465646276","15784861764509695198","1041819893859184343","1643675341094512976"],["17924116705995692306","13937694832258603484","11001603289363490194","10240339462418253035"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["10280554055469095944","13509560447215649647","8298171609168460672","4530232011093821458"],["1781168335924699204","14728022491961347646","2256182035116012215","8681607644548488872"],["16133827516251104996","2125736449698382855","15023365449222954149","16582586175820890765"],["881486229302263759","13578898347970244154","13127239043072868388","310891308190400107"],["12087067811851145993","11344261953414476672","332744776209536256","12626322745835520921"],["8220229302200131096","982704349588354831","10233693035414323230","4651460837837919362"],["11413752914118598565","1406330859967889469","2538261145313807063","14162885785640951516"],["10797519950778089230","14455049396926742138","1210639997559791951","12893438381919335678"],["14594134865248291006","4835118406709810764","7540531431149359053","11166026391498435154"],["8683766761628393839","7909695507985301271","7857777323593675500","4012928176583647088"],["16001814437455997168","18105644114441950750","3820078748225966417","12213921206851337701"],["7943160405228609740","6706226372922040679","7121480797322768361","8564309386810819777"],["5943990465377838986","1075550333913809736","7389599008450575326","17676967755849141783"],["15848832367796542619","2862690262038340837","8677367111271386800","1347707884457248499"],["6595841642477281636","12299002353628461706","3999284933147074647","842762483325550889"],["2295625485825794318","8607687931973758502","9866631591926537178","5962316801069057777"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["4704615969819535031","13439307677310773060","12791940987967847977","18091049638290414549"],["4545032538831868964","6871525437154323103","15981950205603232517","16660299037635036536"],["13286641594106613010","7541460844034588615","4922923200928646908","15449072523326455456"],["6764815691458468047","11630619574276370707","9827372564161483665","6874994484827791885"],["4266046619030409413","13721111488762993013","590517928360941052","4364252423650427665"],["8847144279983503070","17440048022401644236","7375269435288585379","15234264816539741128"],["9525633804002372715","8321768245464820718","7686141391712391591","7090451116430590099"],["11935960787326294649","4045973293508419408","15879614999725701135","231287020834260175"],["1765380719179827260","1296707974352378117","9635599233150780773","13119332648113180768"],["16104962065856928923","14762934950485107062","13215713424460304036","11797621510018152307"],["11818824261806552845","9972691974749990457","8467487919141780877","18018901719117303964"],["12205068064084096582","926134990663070590","14155590487433010224","15175707167299228861"],["4848267890740457071","4490432969631738918","13066154742523386290","10300140028302271859"],["18357219158907511956","14056652433716505309","2308884527086784324","16954001945687914790"],["15061623612188989427","12303888631045213480","12020358322015490093","4591718479463015269"],["5192459301796264320","3664836360200821710","15574297626629116855","14054171132242713213"],["3189574643500155758","6320272708295723804","7615905309184345403","12649362711914527135"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["27774683155750956","17322904139861848194","11170867511333180198","15656535077294310451"],["7521125742100639560","2288515521069211233","6636009076048567905","11654239537838789372"],["10586358237910977096","14207527593810640626","16676885031252282916","8101563890297610073"],["13965426662791193026","653387863223263765","10277680220712671228","11936518054664061332"],["14481894322371187918","6957901588260154956","10596395413538627955","12898116455499095979"],["14200247263135328953","13717338399948959433","18050247350504672373","5265466420280602751"],["13068182088939169424","15767030079196812177","1040841209918674387","8388589737727624375"],["8139536984511605771","11329834119499153451","16072938402928027340","3562845237552045821"],["1520992988400713061","8849844350097066118","9931653200925171455","11400303895942575149"],["696426690902865235","13178611045498483735","8762370682691161913","4019460139931536593"],["12197575988969030934","14922121278623684935","3913528781354545","9316270462649861747"],["17585481331585064745","5381961513425931212","1838177894673588513","18306757505899300222"],["12613078227795242408","14402885194763388724","7642894279246934860","5412840891270528814"],["5815165770425607944","11657862528816656211","13470586765628277552","11085955552673522951"],["12738407627128784525","14415966097692821700","383092442929893039","9656137787659711906"],["1752821537224067282","12863968065974140385","14431030335751594862","12001583380482328221"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["13273975561680123241","18016669200467375115","7225073420678634231","8105168529693961931"],["16064074414150205643","9827413806239646030","11643310652367020416","7679005333492194353"],["14478628723990533464","5509548867411927021","12029841943771169218","17533339828001752489"],["15015854317654391184","580716027905164791","3791940703361109869","2578207518573911617"],["16131081461015437743","5807513794296511197","12203441072528905705","4132030943763220206"],["2141037793885428835","17997560723457873359","3550831794571632455","3042154802372836720"],["1366829408588088120","14386440760691697770","15866397769121933586","15295114710600224167"],["6121859323668605497","8407712956614447502","19275025891634678","12384203240194253872"],["9955975394796406946","1433084146895080842","16191803431475767812","3447927599376008100"],["17748772015248649268","15383276231764760821","16838876076915275260","8859157060472865116"],["14106355793601302033","1991729126848739701","3338332712734926948","1452161063606955665"],["8151122078840037218","1839421870554506819","1246422028158642437","2885850214632768205"],["15426823730652420151","2423351529468196609","15573525980088525007","16500469094732212882"],["8275847122328723869","465310823335299775","1198266859440291806","18062549307117148721"],["7794448169163567745","4915952800689168680","4841011479410791223","4010371936168655297"],["11866708173456013239","2780833642891994544","713924719285448435","17842510456506299779"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["5012667402001699681","2207867396758055025","8041830374864086104","9083739386402534721"],["13410795645839320427","11755963518278806418","14506066989964218277","5608032135400982986"],["1816407352556933527","11516876948194455258","15684969131424665505","13215083621132960712"],["7820389307541953071","11881167074563213510","9281259477374069506","3978256833914903949"],["11196867759530464661","6653469366833184184","2137280519230093621","8653315180908800705"],["5782792729325653384","843433205054169399","15908253893376788307","7078510813288031987"],["8524489866713020891","3045347951976368442","14946815280342352027","3229661779975701596"],["5619743583498731307","7122729624411363823","1058046814763739739","3971600231892961375"],["16970322758481458472","6065650938605147298","6184298130816867149","2535341581489029354"],["2899480264453773061","195785606154139207","6657557562656858535","11171750075009912940"],["525488498177982830","6107019478772063804","6188544361034116254","3601149541640344189"],["1559065984828234129","1943033251553147290","4246889790366485108","7655333867970867788"],["8018861884019244729","9811820776923925907","12084430844734446056","6784072837946497772"],["9087462759115444885","14790309654838096006","14321783691473378772","9325762205698657124"],["8213826642880230310","5380257643276080836","12312253082579889005","14220840311348412999"],["6055050752109810422","2788675667959777030","5974438939114923057","5513565242794582938"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["1132527698366094780","6441468974514955592","412156240895314897","3034117217712454609"],["10778151111170424650","11682841948206924705","16734176954054530232","10306928846352227365"],["7515007391527561048","1737919059432502773","12862057622667109174","10779513492961348176"],["6256678570238324124","12965234844509169983","6242425440488846237","8304595188107827347"],["1191877579846445697","16651200664920576152","11426753237700864341","15538048266231772412"],["16564984106019082670","7115645898928463730","2242664309790713237","7804054667045294655"],["11078835098758776071","3988166268692557984","9529273608073221810","123141024698635230"],["10413893780905051027","983140272356875220","5210908820030852210","15527532620062334601"],["11238242680593510829","12975322518301255797","14714023654952048769","5075129616702921626"],["13845886312170165501","17908847428403165103","18358307925020492523","4394942814996292545"],["18224977664795616217","11636401758921556792","15537261582112113293","15130123860590919552"],["8632930740294122534","1083412506467617025","11368141123735615401","3568593500494929282"],["13876899063176707811","1830339712787786534","8236887326470485670","8254538799480726136"],["6725788998800925038","15245475285825864864","13220173483521043186","7799072038566956613"],["10690422282318651577","149345473868599645","3800852117902814100","16999480973903374730"],["3038917912068403135","13310620530998927504","2673730055619194553","13721321182010067542"],["16472841805945610450","6817351459310024111","14781361792550834912","9455571104738143899"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["4766763669876634755","16426958109631845242","6240044661421585108","15932933748563322921"],["10853136862580891317","15555450120345256311","4881746972374015510","12305498041018480255"],["6717078442773705223","9267210928559284360","16456773962055071128","133128646785572394"],["5670183556521223916","14893396813662169308","5775963245801289678","7034545150286000098"],["6746635024622276279","10035958356247862608","18330377730831365915","2287251134845189533"],["11077419809209613850","16063309481564527094","4019056882843122162","18033138743024810164"],["1580025819173888775","9872073643919328185","11832238818976238765","16608960741166771217"],["8961706157940866726","4611608513583445906","5978479128099943045","8650837553719132594"],["3222724108482779494","11065380143774352833","10662000912657214849","7670369504260422468"],["17430748142722175558","13225395140979501873","6814580565741852716","12335223499385636035"],["10792011070381172562","15624634152071275119","5413166848930290789","16487665496940285767"],["17908783418354879406","14868524655787958575","17418195230833949215","4400157987947450776"],["16034354397799271656","17740617588813620579","11202744804159441900","6699698821914706676"],["17178960652909660862","102426368209761494","4096172792241084896","4065362095143652147"],["13807359242727882102","4816648594013379520","10069905745827705382","5099096122554035634"],["8447565201928322726","13112698416159375992","438510426692110218","1695316806484809376"],["3612351815309785259","13077993209359142611","3716265540867909248","8827316568226411144"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["1119032103576743041","8477816121520614354","3857106252740177888","7133677754006550382"],["8056076535460497412","4794802026904844907","6553929257008413251","11359343803682037224"],["12561758795586881724","6224292313750305466","17608894259528057849","10696789189003396911"],["13719025269399003931","16464158210922806380","5156901391425999465","3148853102162518883"],["6867581534339503995","15545500833282426402","3595942182239091535","15375285578797852148"],["18049580033853915996","14621370117571555221","5327373501289320801","7856004527216416837"],["11039817727812716418","9370848077474646920","5575968206496567128","6055797791834199281"],["9300800854125174903","8428406277763576650","11595126727077195926","18293693031964048722"],["42838217593138210","5475935404092564341","3758231225257337634","806480601609749954"],["2813806538362404400","2830268043252092327","997554313033653878","8488427235316148240"],["11259693442187412183","1278244346588713546","10900025292550005088","1874867358317065318"],["3375460899155731700","14912041494457584355","7811497823116969692","1750462475581963720"],["4288407976098386314","10824994051975631165","17024270377218916858","17679088401927457289"],["5212969627063838264","12487245020785104927","14995711356615357414","4274310505135844688"],["16757546928331904371","3444523653431191017","15490011556744613788","1546052053539445393"],["10509066551531909793","18051754802660513565","4613257967670994689","14727975837904249345"],["6513118285517740068","14307611246913447851","4783726141583042876","1145256693497742158"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["12769720605249114705","3026304502124230115","11491229922073957380","15613490399365642088"],["5256306985284817090","12252388195096513601","16623668219480164072","16367114690467574647"],["13547367469104730025","10175410783903723664","6978803229664120037","2362760244412054289"],["6583151921926023784","17273241177109776107","17545474101264845119","6759184839649019199"],["512802848033981281","10177841001265194411","4202293831230723446","4984934646203455282"],["7011928510331146451","15042299968235370158","12802995258909725811","4114978580382235310"],["8500390369882480109","8616844566729002957","139899413821578190","17018483672244469446"],["6499832745852476857","16058868271728970388","11882922951164390350","1896779168343564819"],["14006793379419585144","9176942108690151453","5152196828690568844","536170592940244835"],["10125223324370591686","12368377878023716097","5440940711921076155","16378496536153532900"],["5407185188782119240","15630943382350279789","10775247602593990141","15165575195708974937"],["6028733180728993953","17127022619109976983","3965115198878257932","10329269083048627602"],["9889143169437141443","16806080800339878520","7979767011817616717","10006073363052971625"],["2873049711665875866","6630911227292821362","11469788645814698960","7065643484272636974"],["14279287621884984917","7251464831647525676","1575487492063749912","6276845344428371156"],["869108967374166059","9944089751214829993","8737861381474453395","9573125049396863405"],["15536736741695574747","12378559489924772791","4278625989061821885","8580590026135958262"],["13380477054186894662","1909464367388451583","6438829265982896201","17392163765491424329"],["11992552184303905894","14735604455940324086","449195797548832656","16402367570328161207"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["11011100621020420172","8554953052066904085","2978805769581702585","11305702743940184846"],["16472665478231329936","8681404811942381209","1085544068477252111","2309495333501514661"],["18079845668603622747","7668515931619527403","8840485439565132312","15261948820162849754"],["16609839984657952086","9709462364153995078","12249168617053608826","12355025938640057028"],["17990790726359706864","3431138118121967938","5229154010002030181","6664115174193048907"],["770086134533749574","2361252666025157509","17482070047596107493","7113684954893993582"],["15332844624727518167","17832732409543376758","13742675529789584335","16950611224914557877"],["13038852433312875851","14885371799735369798","3514869033342639439","1763638132180342106"],["15272042530828567489","8877866903647790006","1441955825048961339","3141370052957476005"],["11405287738110350597","6997352758860544326","4008270380341825231","7180036835184918916"],["13654420513612751558","636463146859221384","2020389737505319581","17765574100605701961"],["12595789801039478462","11901289053333467624","3168413682638573875","5441202032065059530"],["10937010999214740873","12689005042266922234","8481029949923102441","11736356249494077875"],["15441411147548547675","8158161385996003379","8230576474624409076","12047447596173777149"],["13909570486439425283","16721948597343436598","10389351594605360728","11587248071745754468"],["2425009601485004888","14534433567794633031","17427744662858618212","7113167283149375142"],["8318842865799073028","14082969225483359101","5175812391529116396","10927044961460915993"],["14588434175806234392","5128087342262061250","4735926112010607033","4382631742974095741"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["16777262876427615511","13427774073282506671","11183713892788062232","5155329139827398487"],["9697372998966339255","10052235274759733919","8133087071229717441","8632514134032453868"],["11294385141929949255","5532034383840671525","2080527016006256301","11699579089726249312"],["18230754820399774723","2967318025120688727","17359827932950934918","6135441469261280127"],["13644474703218526324","152906380016445620","14311898822696870023","93738181036299977"],["6175662445032601888","7866991199109723452","9359708148888193967","14211973462263058912"],["9961880543469413862","6707137243510534560","16341639806946987061","3407842029746243212"],["8498042105652514160","1644502477273089198","4423820542287170421","1653199080776184994"],["308452726489511809","8269184077814244038","7424526995203308254","906285616968902793"],["11493276083904780581","7516602168578595520","12677972983436413561","15129725133295839921"],["13353013971311128262","7870716756100625163","13474325216732187797","3741756936905852580"],["11142512025799694375","1698650760483338455","14209964195143119846","8623039616873683322"],["9949601133212348479","2450165425646979226","11946759600906593684","9279665097225095355"],["11207974022270202604","9161989558583895299","6605638310806213826","6419623511627585034"],["14229634131244634078","8499387728773253050","6742680990084762073","13105445553539953717"],["8378067583867435412","9377466585688485460","7282715276199189411","515231955751580769"],["2729205461605992889","16219713291564008448","17115305642511965388","13402149947382963862"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["17839726872095441539","5106925649195602687","18159768663126066496","5430438355638603011"],["13828974605550857023","4632934207713645629","6544727064673654208","124720581735300033"],["17065210093201884944","16352034905874503105","16122258327514573523","3462438260716086770"],["5865279793493946323","4342848312218514343","7930819307403457933","4601190685600802889"],["9162267635637953944","12173912944493268654","5095320941405898898","2882816099204391684"],["14888323904471359381","14705704473471464090","9368354064263197085","10007022068820153543"],["16581201857672216171","15978863440307970317","15629792271751873188","7847462097631752004"],["5619686742807752841","11089817238735854211","2812816699193707574","10266162575168447784"],["1952684438513751841","2576403533298599779","17632127963255509149","11308903053095364729"],["12948363799591688956","1649192246710899196","8102060392317356312","1998946286108191985"],["13147430274672673246","6381349540736249620","12365862351325149803","17576594630268660251"],["4645813727498769944","13291637684394666278","13661968075229072823","16685133510308550368"],["2524345590036180643","7210525362740895650","1917430157802944392","3420718587012449339"],["8926440727413754812","14819650308918481253","5811631523221757428","4907804367015246466"],["16410319377928217665","5613839697873235113","2487526580781448370","1225935547748344874"],["3811231592098720608","8448373105265692416","490653320868421865","12125837652211539100"],["14899597429842123237","6541369329117756207","5927550925372645588","4201978074176489472"],["7426911405480186863","14751444167803870397","14934241483642103741","9675977151070088912"],["7037605840932149624","6870973228570503063","5571667052138277024","18318283145786545001"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["9160284257109265315","1677909062380099378","15683883266951630485","17256718468424098651"],["7370811447303915986","3702777456063986934","14777552496559013057","11158883504724151637"],["16975442498854781565","282377307195494428","16633255237976940239","15843232443207983632"],["1460825674874905163","8930173145549479811","3675711281316453445","13718083843764987038"],["14434995095550236131","4744236960181578573","2449720133940922895","11913457425126316262"],["4991484012519658299","8472838733048862970","5857142575323775014","10542700151585499958"],["7476802409746224768","1980724131598635581","8376010363094801251","10310987555250983341"],["13538844496973580239","5888916917700031075","5069638416929827028","13874923447247830114"],["2354823418689110840","6394278722466853474","16606157728261284853","8155811913580390615"],["6074201584766726379","13800735792257873772","8360734293261238831","4591315299409483055"],["16902460828999739237","4736405041027601939","8496419648278661586","6203840022396388055"],["9679323931559792127","12515008995384378129","2416350685441793053","5314902040631014084"],["8467659744537997887","12889901740555857047","7320161710939986857","10003144513824176424"],["13300364744000111854","10077841917041013644","12912639979234144816","17552612679448460832"],["6273897594145983808","3048017189743975810","3447251849551019225","8151067508856838492"],["7409897989497262539","5513655188825416941","334574282341114652","6439610649480079541"],["2075098552386145266","4950001333702248266","2816023884248274401","10854927329143211948"],["7945834617530480195","2146965996952794029","18380942258287262725","6805279213701591510"],["8533883464122604441","8140409484062884954","12837832344461492384","4566419173530959048"],["5301830701051946625","6392916111489209471","2603268406796185325","12676036667414278208"]],[["2064932338406286282","14549009367448940558","9191349953592123540","4977966025330966897"],["15238156373947786031","5052209968340507469","16868413157308488759","1263730611376033444"],["5984668942036673813","18409774855867261318","10615232686427962131","11380928872686372749"],["8649608670452093092","9790039205001362418","2167861851313837479","10386872025906222574"],["13131298147427121900","10176529064025804204","4535189836478858078","15721608613957913732"],["5235258042182630469","2097849283013591694","633100048427126150","13116127498096645701"],["4558214604155467896","12113442455530400182","6272766515031423126","15496485184247555302"],["16474761536863140802","6987287117909267114","16575731973939051928","17076489454518976641"],["11176890623118377869","15195155657226210879","3319541758837183402","12407169990173415054"],["11438595012324059440","4459240572716096752","12996967588009058916","1713504886117997934"],["13313331117760659807","1482088466633097530","7270872535304434682","2521427661880154480"],["1073399039130949502","11394386020692475196","10024272614590269725","7216944582152647488"],["5592745627303002940","1632189291847485949","10761087487437527000","8110040262657876009"],["15848832367796542619","2862690262038340837","8677367111271386800","1347707884457248499"],["6595841642477281636","12299002353628461706","3999284933147074647","842762483325550889"],["2295625485825794318","8607687931973758502","9866631591926537178","5962316801069057777"],["1855230760503929939","13852760829496433290","2482199333725726242","3865066269430884955"],["13008882517996115509","10852318585632237757","11637848593880998367","12708942648040558009"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]],[["18033878395145279393","4365613320334696582","6512482004865391891","7023475808253016557"],["12794083539188755415","4188203652690036122","8174118877050174345","7305115307063270027"],["2001990598124004456","11972433670502068323","14449426006674651284","1320448385075732367"],["1520641466961611286","15168329062820277013","11884915159813521017","11513800642415299282"],["5667351384528463724","12751477363529852550","11431219445953498","18259700020653809052"],["3193046122469776824","16074903612909234454","1273700201076830095","12082404034536542586"],["2908138798326977495","721858846473036310","6835781103073976916","3387739036853112594"],["9579398696917722716","9225124522680312566","11819787535845449706","8217961835329100768"],["15490229097199603471","9298947041477631056","6486082420460389910","3642254572362973965"],["15421284753078237812","15197182293879261502","7626502539293522771","10770695301316099982"],["6489638297935172654","891278199563461674","9591508876745858108","17317564376607741535"],["14127949264265936113","14935752966446785040","1076632075689712481","10470859369450996032"],["5910579182476044767","3068674850186475642","4112330044033191628","843296950214129727"],["5815165770425607944","11657862528816656211","13470586765628277552","11085955552673522951"],["12738407627128784525","14415966097692821700","383092442929893039","9656137787659711906"],["1752821537224067282","12863968065974140385","14431030335751594862","12001583380482328221"],["12382402589869099747","18163968216378795197","14642053385314676059","14061628593119605213"],["1431835653293231648","10153830181178666505","1281967777336096219","13183448983204447753"],["2243308801138385403","11344616445615866577","14295473641768695402","3033822921409189050"],["6229453797819857013","11630162351206312247","14164734074476729255","11901550106735033787"]]],"finalPol":[["3187003517296553989","17683890798281804414","14364391066290738241"],["1819773895241312781","15175184791711973900","2163951791684002974"],["14986869240770728774","18420866253624777145","13007469031443226995"],["9653025015334528714","5921405052630609871","16705992550048051314"],["13573490826656786763","15204729446014342173","12486515123827516650"],["16560449191764215956","8172034604390068579","373181676356336625"],["16252301843798833143","2041500988717358041","16841014117408810155"],["2576781443884032319","14978885081637252586","17671199455376159468"],["2688785197516282770","5419218744708046227","296279691954568997"],["15237755642385295103","17679459957384466499","7417198644892979682"],["14834331530676849175","13308226762127910713","12791675848369569107"],["14642752502357147033","12350121037869267783","1194206630922099724"],["13791760261214464221","276281558442738826","13472039562506429613"],["7865084493754282796","2711052611475006373","595711232670136784"],["13972809475063741292","6448794628311243687","9154137472724011066"],["8006648567661656947","6084495943065436216","13941497557426951510"],["4287844552533670005","13488154825597622833","2480581758178436565"],["17357611246002744005","5884588454807633795","351308678911737639"],["15012363104939931184","12844088808808972905","8506029986823352792"],["12266192963191340206","1005461199671984315","2849963427394194444"],["4195473201544952183","9586990092278693701","16067085878502041733"],["11301448915644476093","2328580348036341095","10745113692142858074"],["5511357408494764397","18057655828623574985","17968152124533789592"],["9445118001666584621","17179276620791000547","16985893442538962829"],["4818804032357202562","13759882778224276877","4249212194266489065"],["3490914226494373604","16596871169971673643","10594597058642564397"],["18253093582133959262","3416398735330580122","5159141524361519579"],["13300165719017226105","2019931696212658004","15964728135646736696"],["15935317333600673566","10694467900106939502","14766252460689512436"],["15074982414821832236","9298890489805629388","1025622331933479360"],["15599837584207821246","14267409628230133324","12090925089575463768"],["10119899598673189652","11402695750237787731","2492756892624381578"],["10152404267263327174","16182327495726674242","9838017294294017443"],["5729645319610322504","4906718867478328612","8951024490309129031"],["10213597974299015366","11550019127897988448","15538454234606248029"],["1400849515644989225","13797269607654569931","15420870227025783682"],["6463306527909069730","3416641466638575556","872368186421825937"],["12576996126275733292","6648197822710363969","8796565452089363442"],["15278496980604762489","10976570604684929010","10794073034297014702"],["4899744552296443576","11211706230864103984","780873106071664451"],["9912645778596632125","10376083476251664881","14662065805555605588"],["1892874995762132177","739351958707905866","5645025265277050932"],["6622835119604452867","9039571366835313322","11596764505505135901"],["8700850612411206996","2505364327086277496","7053082817267738749"],["17973752513758552677","14971055206413785529","667275000931116019"],["15873452462431051210","8418594611207399056","12755040542003880193"],["18273903755425457248","13569654766109896211","15965303702798992945"],["6806522395405856885","18366424705561219428","4438981598738337323"],["8504423932395144184","8386507854059078540","6153282728040418379"],["15332269981066252347","17174813194663570605","7634920293757780877"],["9652654996643886301","6454313485291611340","4228550376313987804"],["16259844320182656030","4295504348710965415","2495277608871250759"],["18002030380158939463","5972068352690713311","14785971637821147029"],["9040993186289474273","499789440190033927","15893614295747955071"],["9548760751213808696","8653122841216239830","9680864310395536918"],["2362572121949352305","11115558320702839623","9852251707793059174"],["14673277804029435124","17885183907894992742","6004462574220103530"],["15811087844840399733","6577517416604023515","15290266889325132276"],["5542931671748593646","9701021271412422440","5666951674791921922"],["448252503263737945","5945960402664074978","14810915785039106761"],["5183546175973977972","6165527719329203516","3377529331515372712"],["6825270429836350719","9763877744685565406","7863443889856368259"],["681209422008228064","10719796525436201347","2447311399895927304"],["14007902400451131628","12842207227884520641","10331583421645445796"]],"publics":["3248031945","331273298","79787424","1099671034","2194033476","2653407403","1680480301","4104403397","718160376","3583552966","4217387084","1804925119","3777111175","2160135270","145091898","2918779245","1874","345","9","3248031945","331273298","79787424","1099671034","2194033476","2653407403","1680480301","4104403397","2896105163","527721197","143020767","3303227687","2265204133","3023238715","2226728960","592092304","926997818","2291304450","3097553221","2761796246","2573282801","2985864328","1403923277","3237549865","1875"]} \ No newline at end of file diff --git a/test/vectors/src/merkle-tree/l1-info-tree/proof-vectors.json b/test/vectors/src/merkle-tree/l1-info-tree/proof-vectors.json new file mode 100644 index 00000000..b390a540 --- /dev/null +++ b/test/vectors/src/merkle-tree/l1-info-tree/proof-vectors.json @@ -0,0 +1,158 @@ +[ + { + "leaves": ["0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5","0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f","0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d","0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242"], + "index": 0, + "proof": [ + "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f", + "0xb48c8301099f75206bc93b1512c7b3855b60b4f8cbaedf8679a184d1d450a4f1", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", + "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", + "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", + "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", + "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "root": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + }, + { + "leaves": ["0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5","0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f","0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d","0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242"], + "index": 1, + "proof": [ + "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5", + "0xb48c8301099f75206bc93b1512c7b3855b60b4f8cbaedf8679a184d1d450a4f1", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", + "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", + "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", + "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", + "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "root": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + }, + { + "leaves": ["0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5","0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f","0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d","0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242"], + "index": 2, + "proof": [ + "0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242", + "0x653142d4a4d6f7985a3f33cad31e011dbee8909846b34c38c7b235ca08828521", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", + "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", + "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", + "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", + "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "root": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + }, + { + "leaves": ["0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5","0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f","0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d","0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242"], + "index": 3, + "proof": [ + "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d", + "0x653142d4a4d6f7985a3f33cad31e011dbee8909846b34c38c7b235ca08828521", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", + "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", + "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", + "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", + "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "root": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + } + ] \ No newline at end of file diff --git a/test/vectors/src/merkle-tree/l1-info-tree/root-vectors.json b/test/vectors/src/merkle-tree/l1-info-tree/root-vectors.json new file mode 100644 index 00000000..6d29f5fe --- /dev/null +++ b/test/vectors/src/merkle-tree/l1-info-tree/root-vectors.json @@ -0,0 +1,35 @@ +[ + { + "previousLeafValues": [], + "currentRoot": "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", + "newLeafValue": "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5", + "newRoot": "0xbf7ddbb59aa018a4c74e061f5172973ff09e4cb7f58405af117fc521f1ca46aa" + }, + { + "previousLeafValues": [ + "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5" + ], + "currentRoot": "0xbf7ddbb59aa018a4c74e061f5172973ff09e4cb7f58405af117fc521f1ca46aa", + "newLeafValue": "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f", + "newRoot": "0xa7042a3ce14f384bbff63f1cee6ee5579193c2d7002e0034854963322cda6128" + }, + { + "previousLeafValues": [ + "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5", + "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f" + ], + "currentRoot": "0xa7042a3ce14f384bbff63f1cee6ee5579193c2d7002e0034854963322cda6128", + "newLeafValue": "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d", + "newRoot": "0x88e652896cb1de5962a0173a222059f51e6b943a2ba6dfc9acbff051ceb1abb5" + }, + { + "previousLeafValues": [ + "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5", + "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f", + "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d" + ], + "currentRoot": "0x88e652896cb1de5962a0173a222059f51e6b943a2ba6dfc9acbff051ceb1abb5", + "newLeafValue": "0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242", + "newRoot": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + } +] \ No newline at end of file diff --git a/test/vectors/src/merkle-tree/smt-hash-bytecode.json b/test/vectors/src/merkle-tree/smt-hash-bytecode.json new file mode 100644 index 00000000..cadb27fc --- /dev/null +++ b/test/vectors/src/merkle-tree/smt-hash-bytecode.json @@ -0,0 +1,46 @@ +[ + { + "bytecode": "dead", + "expectedHash": "0x2549d1fb0dc984e3098f235473637bd9e40aab1692c87e0afaf58720d2fbb8cd" + }, + { + "bytecode": "123456789abcde123456789abcde123456789abcde123456789abcde123456789abcde123456789abcde123456789abcde123456789abcdeff", + "expectedHash": "0xb26e257fb87ad0976c69af4af03c9ee20449d18b0be000aa749b5b342a445308" + }, + { + "bytecode": "8231e0e8e502600b14bb0a2c9689f7d93d10e9f5451f18f0a9b6f123", + "expectedHash": "0x31cd3428959051f652c12f729473d52c0956368643ff086514f983595c034067" + }, + { + "bytecode": "ce0e8e502600b14bb0a2c9689f7d93d10e9f5451f18f030ec3bb6c5001", + "expectedHash": "0xa29092cb3f80b471d45d2e1bcca7fdcdb1083370e5952b56166cf03e73f24d31" + }, + { + "bytecode": "34665289b71a2cb8bf4c289ae6d17d845457c48bfc18623ca39e141b2e40c5d3", + "expectedHash": "0x26aa5d09e2046f5ab7e311b32c6e34fa52a6dc8257a34b494af84fe1471c589c" + }, + { + "bytecode": "3211bcce6a7d8132020223eef1a03385ba6bd4966b295c2e2211a8d6d9e389fe6bf08f21497774456be2e47fdb6740aa571338c71c38c0a6d7f703007569e64031633ec7c8ef2ba25ad6a248403deb697457fae8a4a7f4525d73a3d4cd93334a894efbb20d0a6391df0aae46bc32005834ed084aeb08887e08eb67cde004fea6f8036b061fa8cb7246af2458a4cef79c648b13ef8ac50d9a8863be1c58a7a9a5940006022611ca35508b993656cf3fd0175579c6983414701134cc0becc51364289d4775b71b67f269a16fe653a00ab75885924777feaa990cce9c561802581b9092e9be2a0d03fd86361e427b94d8600a7edc67c263b35a0be6837e750175b50314c7d4642534b3233c963e397f63e6d7187b114eef1346412de83993cb79bc80e9a921fa59ccccda30e57025ccaa0830e1eb1ea5c87ca6fc887aedabdab1bb4cf6022440960b0e03f5de85137d48392873851d13f8035b67e6a5f5c5bac7598fe2f91673f3875b40faad43357862b76e9c6062b3342f199bec165e3093b8c25e21ac626d718e8aaa0d8aacc034a2da4a6ff3de36891ddd30b22abedf0f72b493e9f16aaa65fddeff83612b1d07989e1d6d1ba7600123645c5920f55678cf518d8f58d73d6227e710bcf6dfcfe309c5d67e4f51fbb18aa3922c07c35e5fefa66c0c57553d5ab9e323591031ecfb0b84", + "expectedHash": "0x41d68cbcc953afc92898502cb7d4464f9674ee5d7484a221670f4d20df59e8d9" + }, + { + "bytecode": "e7190c27f2adfb643bdbaa686b8372df9e8132d079640d43f218bfe3b8fafacfe0d7855d77cc195e05d855d2d828e627be305b34f4de52894d3672515f2e1dcfd4e6909a5406d5dbdff31e38d2400299dc6a5f2509052c76393d57a786afc51c18d63c9bd2edd70b8d82f867c5269556a636d1c8c7fb45884adf264c9ae64731dfac21efb29dcddb5bef66149f7af55f0263dc16f7cd8f58f3eb1f1b5246a76ae64ccf7731df0e17963efa4b786d3365a2f2adfd87767d3bdfa104c443c2c0eb79d408cf0469b592f2863988bee8b42e9955255c3d632edf1a3de2a305f573112575f4958192f1b433089fd928dc8f38263f43be6d7cb83acbe4ac2bc0d44f219edbfcafaa29fabda4c8b41add2525fa38982649fc22ef1221273441e65ce62ea200ed951a1619ee6c053793096788c09406b2f9bd09d579dc1fef5f44ba91460f93aaf278bf3f4d25536c1ecf3af64f83a7a04ec049e54ffa007721cfc1a336089824bff3a23f39421234ba1a5f6113eae0bbfbf6a9295d5d473838a6dae3e34620bf365ff588a1ebce6c5bf9c46038a5f323d23ba7ec5d9afc48127612eec3620fff7472dc342f4e56d5e36fd910a66ec8d95ead3f06eb47f612063ea4d64b90bcf5f199684e99f98732029478d99505ca73b86e0cf4b51c63d9cdb24fb4f54908e4cb98aec0af7587b2a4b9477061f2", + "expectedHash": "0xcab4081cbdc6f8b378ac8a4b82ea15913dcc9de2305b1c8af52446dec891f0ff" + }, + { + "bytecode": "8246af280f1863b4eabf37a548ce764a296fd81be5b23c4fc04ee3540c81a765c795c8beedc4a6a1d67a53fcc9525bc2e2d31369fc64e0f547a4de44bd312af1288604fd183dbb52bbdd445ce870c24b829007162a438eb22fbfb08939f4b314f86f264d17126cfd1cd50028eec5aabd9bb1f5c759938b02f0d9d1cbccc4655735b65cf80cad3ce3fab37fac5833652d68d633a3d12ce024e9d16d1fa8a0c5ba8072286e855594471255dffe96a87568501813bac166a92f356ab38032097e5a68406bc22faee6db58f5ae36f24e877ea72a5dc6978c4a5c7f671e635ec4430da1fd2e9e9587b2a8b64b841108f3f5c7af3be9fef9e940478b021352055320d55bb2bf292a1e796154c5e530284a16dda5aeb29baca584f76487cf20f5bb409cfb6247a6918ebf8df1c854551a2184cd06df5706b2fb4d92a70cece8eb4bcee91934f09c0310efcbff2dbc9aa5b6ea818d96f471f9025cb46e4acd98a4ecc6dd2d647282f05a2c586ffe4b94ac12f36bd65cf6f3903d0228f92df340afb425acc5df8433407de697a44a7780506896799c5dca139ed9498880c5b17739859c30b4caa7945984d3d7d4c8450ad1c0f37c50f280fce45f791ffe12b199eab24eca47223efcdc86d764b57fb3afcdc4b01b6f35a3773f0331912bda3ba36d705a8ea506c99d573255233f13eba6d88280d4bf26d24419fc9b93139b74880d407cb796c2d6d1385b6a456dd7ab5755a8465972ae1d2e34d50a302bb1617cd75251f83af0f2be482d29b78b9b4320accf1c45407bc1b2c6dbbd26a8d8811ca95bd88e59bed19a163ab88a5d9b3e286eb3b4cf7ea388d32d613e0f16331570b93fe79ebc221e8fa8eb22e08b205237435e5395198bef4d264953b3fbd72c761603f1b343e62363369dd3f1c382487655fdeb6aba314f500466fea3293ef6feef458bfaec77f6f1f3ce3525b7fe2df433b07330d179eb427739782c95c8767ab113444208a30a4e78e6e18869972a412ef28f3925bcb857e0716e66814dc31abc37bf20219eb9c60f35ef4e1f10b73889c9094867d813a158d0acb38239da0e3f6d1d8865fe49099dfdb6cb7c55160ddb81d0d0a431eec0ecc19f878cf92f2a9a58d951e5b4a8e3b8e87756577b157aec0b3911fa38814fc752c9377b98bc4477172ba2a9823f33a00d50fde16b148c9815f70e7057e181c757ecded9b0e31d35d2c7707dde7d855e6cf2b5f5496229", + "expectedHash": "0xa0cd4752397ce4e1e50cabbe0ab6f47c8953cf1804b0f53c84fd97179367f7ed" + }, + { + "bytecode": "24bccf22f7178476bc30c4cb690bb1df362e258bb07a0e862910568907815b5e276b7e3df3e94d45865f37ba13af512f42afe02a5bffc775e85f3483bf26a60779985d3713030544c9881a54e81549fdf0efa37529b3fc4416fead3efbaa921b88d182ca2cae3f0552a22533e1be3663708e4ef91ad82a54aa3b3f3bb6a24a2a296f320086b6e9a10dec3e5f67b8cc358ca5086d8f3a84fb0ca90167964a9cea26aa31fab862d86263221f67e52ee5fc4a29a0b6e04472f718e76b6a19f6493d540da2513a5547f9649a4f77dc99e0bb0b1e680da69fa2dd9ec2b3b11e375bc993d300adfcd7fc4fe875aa4d29780015fb77c7bd135aa49e62917043147a3188ece587f88da06fe698793d1e3b1d7cedd93b12664f53defeebccdb816f91fad2fff1214c97e61d1ac6178f278273d656a209a4eb1f532fc34ce808932ade305c27a21bed0bfe4595364f6e6462732f75fc8566bb8d1d6fec34228f510cbb1f72293c5d3cd9cb38b1f77db7d67fef1032f392b156c3a1c8368307bcc1843b1a7661630417289c61d44457ad6455c84d73db4517e771ea8a2041113e9910c9dc64bfbac9e7f6563014c65dce227f4f11b8071385dab30bc5c4e3553c4919a1f14302b491106844ce5b7b5874d879fed8e87ff3edf3ae04f2b77ad4a18051317cac773c3800bdfacf59a027a876e471b8c35d348a6690d6241d47119fb0c44448f03e2030c6999a48f3010e6d85503564d3af954671d0921fcd64d37b937a40d9070ca1b9e41f4cfc1e29b9946fc103418beab9fad91201cf00c13a5900ea2aa4d174fc7bbbbef1cd34b8b4f5853ebed9457fed88645775c8b3f466a474746338bd2a37263e518a538db50e74c9f4ce996e3e6ccd5153d3f2637f51aeb27018f0faf9ee01766c14ba860a689502459878e7383a9e314921237dcd968ea03083c8e66856789dd5e9a8d0b1dcdca37c9262391bf5943f5fcd8fc24637e23b91ccefe485dc19c4ea645a14c5f586be606488eea01307c886b7c8f976071c58c2e8f5c4e494a4f437d5696271fdd7ff0d85da03f0d151e5061676887641a2d178cac44af38e0588bfacfb71c797761d72fdd2a25ee1a181548f95d410cdbab2968fee3b35aee8cdb9fefc344f8cc554384c2aaf25b8277ab965d2fc27651361c7a23608277a2fb22230a15cfe69860d219603dd37f3d819f5877aa732ea67d36f6457614246f8ff11a3ef18d640578f2f95887a4dcc1152e02e51aff0b1a807c6973bb47eb315d922a8fbb00eb926b4c46827f9c48190fbb94d4795e3dfbe1b878e15b5d8dddace7f82451de45cf564a85beadf1768ee25bba3e1f7f41ea85f07534e67e2", + "expectedHash": "0x1e8f01efcb58de6363e4b781cbe9c328439154260c97d5bc810b564297719d81" + }, + { + "bytecode": "ab8ffd3224ad21c4009f6e67a9047209f338f88f4f29bcffcb769695d0963b859c591f85b570858c2eb16262a3c07ca323ed0ae762c6772e4f3494036c82a71f1b5569be153d1b069ceecd5fd88f2055cda4d9a651b70c7f736a4fb5a8eb383db80530e608ce01fe52956ba5ebe2801ae60309c4d84021839544933559178ca84b9cbb53cff9a831d6098d75ed580352f70577479c266443686923596280a36e8b811b858f69d79966d2548ab2d830fd10010b968889abbecb865af6d9f6ae6e95353900c2c260a72f3ae32660c14491ba7a97f9896f63f7f29d021212a4c18148a386ef60b6b16d834645e2fe6c9279fabc0056168aab2c023ea3443bc4ea62185f03730121e2df8cd015cadae0b1dd95f723f738af08c9f8d7d47f35d64e580ad7d6525a5b9648543fd752d5c27e3c5eefde55a3d867d98107da151399d6b8718cf662e07562025447b37ebf3854edee2fb74c51273d775ad4a4ece04ec840ffb3af5e184927ee644ce5a3c872ca354bef7187797062206e8b1d97b599401aca9b401d72e2611ccfdd73c594a7c4aa8cabd3d431212ccc1512efd0cca758d9650b53fc3cda49c74f6a048b947a3f48e92c2702a2f1d585817820a9ecefe3fc90332a718851c96a761d61395d84bf7866862ea57c8d49a4e417afdae540b8f607eac7bc4450a3ec30e28c8889bd50a036c03e633735b793dd6030880661e0a1756937ff9556a52de804ef5fc381b29b73f8bfbd13a8b2155ad919bca8ee1f5ce6d10a608154e6f79faca4d5eda068bf71bf31f944ca5c98baca4a5d7a141d9001dcb18037e30667eed18e39a1eb2ad0124c0dc6b4d3afe421baea72d2c15a658c5651c150b67e79c599839ca00af436833f65db98635959157f70446ddf578ec1a71c485f0bfbb071b23226a1ca34da34cf66c09d969dd01adc65efdf9222d075e7873053e029850bab855cdc4f15180a5571d7579c8bc5f470fa4b2a9ed154c505a513e5f0867cd302d8b6e649237079b7ee0640fe2b5ac8de694da87221a7177dc316c2ea47c1edb6a7699f3651a99f43ce2a885146d006bcb82864508223213d930e963b1305b7255807bc5f93498d832f5ed224c385253aed3b8354c511c3dafea13d3cd5e00523f00a7bf05c2a65fa23c0ac915d7098254ddc821a6f3df7b4d8aa79b4da56b4617382ed11dc8b0561fb037a10c5f9917a68ea5d1d8e7b0fec11628b8ce493b8ff7426cd6c43edc58e80b98b381be0399a51a146041f52db2eb1c4fde3cca60ede53050c9bd72e67ca41155b1ac1508ab4055b4053064af44b8e31c162d447935ef5d821ea108536733d949363e28980d78b0476a6092968f7", + "expectedHash": "0x962f4e833fdddfd0158516a4d4ab0c1936eadeb6f8b4adacc995d73e72afcda4" + }, + { + "bytecode": "60806040523480156200001157600080fd5b5060405162002103380380620021038339810160408190526200003491620002e1565b6200003f3362000125565b60005b620000506001602062000329565b811015620000eb57602181602081106200006e576200006e62000343565b01546021826020811062000086576200008662000343565b0154604080516020810193909352820152606001604051602081830303815290604052805190602001206021826001620000c1919062000359565b60208110620000d457620000d462000343565b015580620000e28162000374565b91505062000042565b50604680546001600160a01b0319166001600160a01b0383161790556200011162000175565b6043556200011e62000250565b50620003b5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6041546000908190815b602081101562000248578160011660011415620001e05760018160208110620001ac57620001ac62000343565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925062000224565b8260218260208110620001f757620001f762000343565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b6200023160028362000392565b9150806200023f8162000374565b9150506200017f565b509092915050565b60458054906000620002628362000374565b909155505060435460425460408051602081019390935282015260600160408051808303601f19018152828252805160209182012060455460009081526044835283902055604354604254908452908301527f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce3910160405180910390a1565b600060208284031215620002f457600080fd5b81516001600160a01b03811681146200030c57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156200033e576200033e62000313565b500390565b634e487b7160e01b600052603260045260246000fd5b600082198211156200036f576200036f62000313565b500190565b60006000198214156200038b576200038b62000313565b5060010190565b600082620003b057634e487b7160e01b600052601260045260246000fd5b500490565b611d3e80620003c56000396000f3fe60806040526004361061010e5760003560e01c806355f6bc57116100a55780638da5cb5b11610074578063a71d644411610059578063a71d6444146102fb578063ed6be5c91461032b578063f2fde38b1461035557600080fd5b80638da5cb5b146102b0578063a5392cf6146102db57600080fd5b806355f6bc57146101f95780635ec6a8df14610219578063715018a61461026b5780637d8f04691461028057600080fd5b8063319cf735116100e1578063319cf7351461017d5780633381fe90146101935780633ae05047146101c05780633ed691ef146101d557600080fd5b806301fd904414610113578063029f27931461013c5780630e21fbd7146101525780632dfdf0b514610167575b600080fd5b34801561011f57600080fd5b5061012960425481565b6040519081526020015b60405180910390f35b34801561014857600080fd5b5061012960455481565b61016561016036600461170e565b610375565b005b34801561017357600080fd5b5061012960415481565b34801561018957600080fd5b5061012960435481565b34801561019f57600080fd5b506101296101ae36600461175f565b60446020526000908152604090205481565b3480156101cc57600080fd5b50610129610574565b3480156101e157600080fd5b50604554600090815260446020526040902054610129565b34801561020557600080fd5b5061016561021436600461175f565b610641565b34801561022557600080fd5b506046546102469073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610133565b34801561027757600080fd5b506101656106f8565b34801561028c57600080fd5b506102a061029b36600461186d565b610785565b6040519015158152602001610133565b3480156102bc57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610246565b3480156102e757600080fd5b506101656102f6366004611915565b610931565b34801561030757600080fd5b506102a061031636600461175f565b60476020526000908152604090205460ff1681565b34801561033757600080fd5b50610340600081565b60405163ffffffff9091168152602001610133565b34801561036157600080fd5b506101656103703660046119d2565b610e4d565b73ffffffffffffffffffffffffffffffffffffffff841661042957823414610424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4272696467653a3a6465706f7369743a20414d4f554e545f444f45535f4e4f5460448201527f5f4d415443485f4d53475f56414c55450000000000000000000000000000000060648201526084015b60405180910390fd5b61044b565b61044b73ffffffffffffffffffffffffffffffffffffffff8516333086610f7a565b63ffffffff82166104de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4272696467653a3a6465706f7369743a2044455354494e4154494f4e5f43414e60448201527f545f42455f4d41494e4e45540000000000000000000000000000000000000000606482015260840161041b565b6041546040805173ffffffffffffffffffffffffffffffffffffffff87811682526020820187905263ffffffff8681168385015290851660608301529092166080830152517f0a37f8bae6de7e960aeedce45875d5a75681918316c4bd81f4691152910f8e329181900360a00190a161055b848460008585611056565b610563610574565b60435561056e61125e565b50505050565b6041546000908190815b60208110156106395781600116600114156105d957600181602081106105a6576105a66119ef565b0154604080516020810192909252810184905260600160405160208183030381529060405280519060200120925061061a565b82602182602081106105ed576105ed6119ef565b01546040805160208101939093528201526060016040516020818303038152906040528051906020012092505b610625600283611a4d565b91508061063181611a88565b91505061057e565b509092915050565b60465473ffffffffffffffffffffffffffffffffffffffff1633146106e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4272696467653a3a757064617465526f6c6c757045786974526f6f743a204f4e60448201527f4c595f524f4c4c55500000000000000000000000000000000000000000000000606482015260840161041b565b60428190556106f561125e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610779576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161041b565b610783600061130b565b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088811b821660208401527fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c811b82166024860152603885018c90529189901b909216605884015286901b16605c8201526000908190607001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120905067ffffffffffffffff841660005b60208110156109205781600116600114156108b357868181518110610873576108736119ef565b602002602001015183604051602001610896929190918252602082015260400190565b604051602081830303815290604052805190602001209250610901565b828782815181106108c6576108c66119ef565b60200260200101516040516020016108e8929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b61090c600283611a4d565b91508061091881611a88565b91505061084c565b505090911498975050505050505050565b67ffffffffffffffff841660009081526047602052604090205460ff16156109db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4272696467653a3a77697468647261773a20414c52454144595f434c41494d4560448201527f445f574954484452415700000000000000000000000000000000000000000000606482015260840161041b565b63ffffffff871615610a6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4272696467653a3a77697468647261773a2044455354494e4154494f4e5f4e4560448201527f54574f524b5f4e4f545f4d41494e4e4554000000000000000000000000000000606482015260840161041b565b63ffffffff881615610b03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4272696467653a3a77697468647261773a204f524947494e5f4e4554574f524b60448201527f5f4e4f545f4d41494e4e45540000000000000000000000000000000000000000606482015260840161041b565b6000838152604460209081526040918290205482519182018590529181018390526060016040516020818303038152906040528051906020012014610bca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4272696467653a3a77697468647261773a20474c4f42414c5f455849545f524f60448201527f4f545f444f45535f4e4f545f4d41544348000000000000000000000000000000606482015260840161041b565b610bda8a8a8a8a8a8a8a88610785565b610c40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4272696467653a3a77697468647261773a20534d545f494e56414c4944000000604482015260640161041b565b67ffffffffffffffff8416600090815260476020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905573ffffffffffffffffffffffffffffffffffffffff8a16610dad576040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff8816908b90604051610cd49190611aed565b60006040518083038185875af1925050503d8060008114610d11576040519150601f19603f3d011682016040523d82523d6000602084013e610d16565b606091505b5050905080610da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4272696467653a3a77697468647261773a204554485f5452414e534645525f4660448201527f41494c4544000000000000000000000000000000000000000000000000000000606482015260840161041b565b50610dce565b610dce73ffffffffffffffffffffffffffffffffffffffff8b16878b611380565b6040805167ffffffffffffffff8616815263ffffffff8a16602082015273ffffffffffffffffffffffffffffffffffffffff8c811682840152606082018c90528816608082015290517f8932892d010aea7e4fdefb3764910523c321e06bb52577dc2439501196bf72559181900360a00190a150505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161041b565b73ffffffffffffffffffffffffffffffffffffffff8116610f71576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161041b565b6106f58161130b565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261056e9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526113db565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085811b821660208401527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606089811b82166024860152603885018990529186901b909216605884015283901b16605c8201526000906070016040516020818303038152906040528051906020012090506001602060026110fd9190611c2b565b6111079190611c37565b60415410611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4465706f736974436f6e74726163743a5f6465706f7369743a204d45524b4c4560448201527f5f545245455f46554c4c00000000000000000000000000000000000000000000606482015260840161041b565b6001604160008282546111aa9190611c4e565b909155505060415460005b602081101561124b5781600116600114156111e95782600182602081106111de576111de6119ef565b015550611257915050565b600181602081106111fc576111fc6119ef565b015460408051602081019290925281018490526060016040516020818303038152906040528051906020012092506002826112379190611a4d565b91508061124381611a88565b9150506111b5565b50611254611c66565b50505b5050505050565b6045805490600061126e83611a88565b9091555050604354604254604080516020810193909352820152606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152828252805160209182012060455460009081526044835283902055604354604254908452908301527f61014378f82a0d809aefaf87a8ac9505b89c321808287a6e7810f29304c1fce3910160405180910390a1565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113d69084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401610fd4565b505050565b600061143d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114e79092919063ffffffff16565b8051909150156113d6578080602001905181019061145b9190611c95565b6113d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161041b565b60606114f68484600085611500565b90505b9392505050565b606082471015611592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161041b565b843b6115fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161041b565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516116239190611aed565b60006040518083038185875af1925050503d8060008114611660576040519150601f19603f3d011682016040523d82523d6000602084013e611665565b606091505b5091509150611675828286611680565b979650505050505050565b6060831561168f5750816114f9565b82511561169f5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041b9190611cb7565b73ffffffffffffffffffffffffffffffffffffffff811681146106f557600080fd5b803563ffffffff8116811461170957600080fd5b919050565b6000806000806080858703121561172457600080fd5b843561172f816116d3565b935060208501359250611744604086016116f5565b91506060850135611754816116d3565b939692955090935050565b60006020828403121561177157600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126117b857600080fd5b8135602067ffffffffffffffff808311156117d5576117d5611778565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110848211171561181857611818611778565b60405293845285810183019383810192508785111561183657600080fd5b83870191505b848210156116755781358352918301919083019061183c565b803567ffffffffffffffff8116811461170957600080fd5b600080600080600080600080610100898b03121561188a57600080fd5b8835611895816116d3565b9750602089013596506118aa60408a016116f5565b95506118b860608a016116f5565b945060808901356118c8816116d3565b935060a089013567ffffffffffffffff8111156118e457600080fd5b6118f08b828c016117a7565b9350506118ff60c08a01611855565b915060e089013590509295985092959890939650565b6000806000806000806000806000806101408b8d03121561193557600080fd5b8a35611940816116d3565b995060208b0135985061195560408c016116f5565b975061196360608c016116f5565b965060808b0135611973816116d3565b955060a08b013567ffffffffffffffff81111561198f57600080fd5b61199b8d828e016117a7565b9550506119aa60c08c01611855565b935060e08b013592506101008b013591506101208b013590509295989b9194979a5092959850565b6000602082840312156119e457600080fd5b81356114f9816116d3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082611a83577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611aba57611aba611a1e565b5060010190565b60005b83811015611adc578181015183820152602001611ac4565b8381111561056e5750506000910152565b60008251611aff818460208701611ac1565b9190910192915050565b600181815b80851115611b6257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611b4857611b48611a1e565b80851615611b5557918102915b93841c9390800290611b0e565b509250929050565b600082611b7957506001611c25565b81611b8657506000611c25565b8160018114611b9c5760028114611ba657611bc2565b6001915050611c25565b60ff841115611bb757611bb7611a1e565b50506001821b611c25565b5060208310610133831016604e8410600b8410161715611be5575081810a611c25565b611bef8383611b09565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611c2157611c21611a1e565b0290505b92915050565b60006114f98383611b6a565b600082821015611c4957611c49611a1e565b500390565b60008219821115611c6157611c61611a1e565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600060208284031215611ca757600080fd5b815180151581146114f957600080fd5b6020815260008251806020840152611cd6816040850160208701611ac1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea264697066735822122086e50005a89e4c2272c1cba11ff802c1213e2b08c8a20c742826166345c5ee3264736f6c63430008090033", + "expectedHash": "0x83c54e65ccd57395ecb7be6ed8d10ea5505844d1a3e514486affcd8fc8d11a54" + } +] \ No newline at end of file diff --git a/test/vectors/src/merkle-tree/smt-key-contract-code.json b/test/vectors/src/merkle-tree/smt-key-contract-code.json new file mode 100644 index 00000000..4630e2f8 --- /dev/null +++ b/test/vectors/src/merkle-tree/smt-key-contract-code.json @@ -0,0 +1,17 @@ +[ + { + "leafType": 2, + "ethAddr": "0x0000000000000000000000000000000000000000", + "expectedKey": "72618736525103033809705966741823173469010530487114812728907809351129229387686" + }, + { + "leafType": 2, + "ethAddr": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "expectedKey": "100339618010685329502920959863456851722741867804653471565599858216996781583185" + }, + { + "leafType": 2, + "ethAddr": "0xEEF9f339514298C6A857EfCfC1A762aF84438dEE", + "expectedKey": "37702541001567369137011480863022602456875150323680555331519352316148423991760" + } +] \ No newline at end of file diff --git a/test/vectors/src/merkle-tree/smt-key-contract-length.json b/test/vectors/src/merkle-tree/smt-key-contract-length.json new file mode 100644 index 00000000..4fd72832 --- /dev/null +++ b/test/vectors/src/merkle-tree/smt-key-contract-length.json @@ -0,0 +1,17 @@ +[ + { + "leafType": 4, + "ethAddr": "0x0000000000000000000000000000000000000000", + "expectedKey": "41007279171909826356801898715236946089777777871690100429699594563988270638848" + }, + { + "leafType": 4, + "ethAddr": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "expectedKey": "34646114882128150922895390038184820825657559006046553149154512997547296886401" + }, + { + "leafType": 4, + "ethAddr": "0xEEF9f339514298C6A857EfCfC1A762aF84438dEE", + "expectedKey": "22692912702510785895734212421419794952797782834275353854560810371481244756741" + } +] \ No newline at end of file diff --git a/test/vectors/src/merkle-tree/smt-key-contract-storage.json b/test/vectors/src/merkle-tree/smt-key-contract-storage.json new file mode 100644 index 00000000..c743dba0 --- /dev/null +++ b/test/vectors/src/merkle-tree/smt-key-contract-storage.json @@ -0,0 +1,38 @@ +[ + { + "leafType": 3, + "ethAddr": "0x0000000000000000000000000000000000000000", + "storagePosition": "0", + "expectedKey": "12534214928306848758475099215268104288950840610411881349004256209866079801855" + }, + { + "leafType": 3, + "ethAddr": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "storagePosition": "115792089237316195423570985008687907853269984665640564039457584007913129639935", + "expectedKey": "33137250487625679402353497751179166536828572303855484396343252601253270796565" + }, + { + "leafType": 3, + "ethAddr": "0x0000000000000000000000000000000000000000", + "storagePosition": "0", + "expectedKey": "12534214928306848758475099215268104288950840610411881349004256209866079801855" + }, + { + "leafType": 3, + "ethAddr": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "storagePosition": "115792089237316195423570985008687907853269984665640564039457584007913129639935", + "expectedKey": "33137250487625679402353497751179166536828572303855484396343252601253270796565" + }, + { + "leafType": 3, + "ethAddr": "0xEEF9f339514298C6A857EfCfC1A762aF84438dEE", + "storagePosition": "7264", + "expectedKey": "83856652265636757733606490452162031059172593606140564507822531867780274877175" + }, + { + "leafType": 3, + "ethAddr": "0xEEF9f339514298C6A857EfCfC1A762aF84438dEE", + "storagePosition": "7264", + "expectedKey": "83856652265636757733606490452162031059172593606140564507822531867780274877175" + } +] \ No newline at end of file diff --git a/test/vectors/src/merkle-tree/smt-key-eth-balance.json b/test/vectors/src/merkle-tree/smt-key-eth-balance.json new file mode 100644 index 00000000..8c236b71 --- /dev/null +++ b/test/vectors/src/merkle-tree/smt-key-eth-balance.json @@ -0,0 +1,42 @@ +[ + { + "leafType": 0, + "ethAddr": "0x0000000000000000000000000000000000000000", + "expectedKey": "26833593870529421166492422877314944811724038685477806060577465163426988022737" + }, + { + "leafType": 0, + "ethAddr": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "expectedKey": "40127382331240911157907914324528741813743915534659976972051985426947551260673" + }, + { + "leafType": 0, + "ethAddr": "0x0000000000000000000000000000000000000000", + "expectedKey": "26833593870529421166492422877314944811724038685477806060577465163426988022737" + }, + { + "leafType": 0, + "ethAddr": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "expectedKey": "40127382331240911157907914324528741813743915534659976972051985426947551260673" + }, + { + "leafType": 0, + "ethAddr": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "expectedKey": "45511135140510043104127159862914553230179041101689561753801876001524381766893" + }, + { + "leafType": 0, + "ethAddr": "0x4d5Cf5032B2a844602278b01199ED191A86c93ff", + "expectedKey": "43741542307756197806968621038083986403476477276779293271513030919451674021857" + }, + { + "leafType": 0, + "ethAddr": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "expectedKey": "45511135140510043104127159862914553230179041101689561753801876001524381766893" + }, + { + "leafType": 0, + "ethAddr": "0x4d5Cf5032B2a844602278b01199ED191A86c93ff", + "expectedKey": "43741542307756197806968621038083986403476477276779293271513030919451674021857" + } +] \ No newline at end of file diff --git a/test/vectors/src/merkle-tree/smt-key-eth-nonce.json b/test/vectors/src/merkle-tree/smt-key-eth-nonce.json new file mode 100644 index 00000000..4deb93a5 --- /dev/null +++ b/test/vectors/src/merkle-tree/smt-key-eth-nonce.json @@ -0,0 +1,42 @@ +[ + { + "leafType": 1, + "ethAddr": "0x0000000000000000000000000000000000000000", + "expectedKey": "28358077366816831193326378002625509892290580640052650926129802772493521696670" + }, + { + "leafType": 1, + "ethAddr": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "expectedKey": "46601686036392058419641250406383581470536953255400137235565480209972996937304" + }, + { + "leafType": 1, + "ethAddr": "0x0000000000000000000000000000000000000000", + "expectedKey": "28358077366816831193326378002625509892290580640052650926129802772493521696670" + }, + { + "leafType": 1, + "ethAddr": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", + "expectedKey": "46601686036392058419641250406383581470536953255400137235565480209972996937304" + }, + { + "leafType": 1, + "ethAddr": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "expectedKey": "98790850219450538256104290071020195215871038788594574188656606927809546484197" + }, + { + "leafType": 1, + "ethAddr": "0x4d5Cf5032B2a844602278b01199ED191A86c93ff", + "expectedKey": "45555081975440947041848992181135418706314820385341877748019327868663035195938" + }, + { + "leafType": 1, + "ethAddr": "0x617b3a3528F9cDd6630fd3301B9c8911F7Bf063D", + "expectedKey": "98790850219450538256104290071020195215871038788594574188656606927809546484197" + }, + { + "leafType": 1, + "ethAddr": "0x4d5Cf5032B2a844602278b01199ED191A86c93ff", + "expectedKey": "45555081975440947041848992181135418706314820385341877748019327868663035195938" + } +] \ No newline at end of file diff --git a/tools/aggsender_find_imported_bridge/aggsender_find_imported_bridge.go b/tools/aggsender_find_imported_bridge/aggsender_find_imported_bridge.go new file mode 100644 index 00000000..4ceabb80 --- /dev/null +++ b/tools/aggsender_find_imported_bridge/aggsender_find_imported_bridge.go @@ -0,0 +1,121 @@ +package main + +import ( + "encoding/json" + "fmt" + "math/big" + "os" + + "github.com/agglayer/aggkit/agglayer" + "github.com/agglayer/aggkit/aggsender/rpcclient" + "github.com/agglayer/aggkit/aggsender/types" + "github.com/agglayer/aggkit/bridgesync" + "github.com/agglayer/aggkit/log" +) + +const ( + errLevelUnexpected = 1 + errLevelWrongParams = 2 + errLevelComms = 3 + errLevelNotFound = 4 + errLevelFoundButNotSettled = 5 + + base10 = 10 + minimumNumArgs = 3 +) + +func unmarshalGlobalIndex(globalIndex string) (*agglayer.GlobalIndex, error) { + var globalIndexParsed agglayer.GlobalIndex + // First try if it's already decomposed + err := json.Unmarshal([]byte(globalIndex), &globalIndexParsed) + if err != nil { + bigInt := new(big.Int) + _, ok := bigInt.SetString(globalIndex, base10) + if !ok { + return nil, fmt.Errorf("invalid global index: %v", globalIndex) + } + mainnetFlag, rollupIndex, leafIndex, err := bridgesync.DecodeGlobalIndex(bigInt) + if err != nil { + return nil, fmt.Errorf("invalid global index, fail to decode: %v", globalIndex) + } + globalIndexParsed.MainnetFlag = mainnetFlag + globalIndexParsed.RollupIndex = rollupIndex + globalIndexParsed.LeafIndex = leafIndex + } + return &globalIndexParsed, nil +} + +// This function find out the certificate for a deposit +// It use the aggsender RPC +func certContainsGlobalIndex(cert *types.CertificateInfo, globalIndex *agglayer.GlobalIndex) (bool, error) { + if cert == nil { + return false, nil + } + var certSigned agglayer.SignedCertificate + err := json.Unmarshal([]byte(cert.SignedCertificate), &certSigned) + if err != nil { + log.Debugf("cert: %v", cert.SignedCertificate) + return false, fmt.Errorf("error Unmarshal cert. Err: %w", err) + } + for _, importedBridge := range certSigned.ImportedBridgeExits { + if *importedBridge.GlobalIndex == *globalIndex { + return true, nil + } + } + return false, nil +} + +func main() { + if len(os.Args) != minimumNumArgs { + fmt.Printf("Wrong number of arguments\n") + fmt.Printf(" Usage: %v \n", os.Args[0]) + os.Exit(errLevelWrongParams) + } + aggsenderRPC := os.Args[1] + globalIndex := os.Args[2] + decodedGlobalIndex, err := unmarshalGlobalIndex(globalIndex) + if err != nil { + log.Errorf("Error unmarshalGlobalIndex: %v", err) + os.Exit(errLevelWrongParams) + } + log.Debugf("decodedGlobalIndex: %v", decodedGlobalIndex) + aggsenderClient := rpcclient.NewClient(aggsenderRPC) + // Get latest certificate + cert, err := aggsenderClient.GetCertificateHeaderPerHeight(nil) + if err != nil { + log.Errorf("Error: %v", err) + os.Exit(errLevelComms) + } + + currentHeight := cert.Height + for cert != nil { + found, err := certContainsGlobalIndex(cert, decodedGlobalIndex) + if err != nil { + log.Errorf("Error: %v", err) + os.Exit(errLevelUnexpected) + } + if found { + log.Infof("Found certificate for global index: %v", globalIndex) + if cert.Status.IsSettled() { + log.Infof("Certificate is settled: %s status:%s", cert.ID(), cert.Status.String()) + os.Exit(0) + } + log.Errorf("Certificate is not settled") + os.Exit(errLevelFoundButNotSettled) + } else { + log.Debugf("Certificate not found for global index: %v", globalIndex) + } + // We have check the oldest cert + if currentHeight == 0 { + log.Errorf("Checked all certs and it's not found") + os.Exit(errLevelNotFound) + } + log.Infof("Checking previous certificate, height: %v", currentHeight) + cert, err = aggsenderClient.GetCertificateHeaderPerHeight(¤tHeight) + if err != nil { + log.Errorf("Error: %v", err) + os.Exit(errLevelComms) + } + currentHeight-- + } +} diff --git a/translator/config.go b/translator/config.go new file mode 100644 index 00000000..f4a37039 --- /dev/null +++ b/translator/config.go @@ -0,0 +1,11 @@ +package translator + +type ConfigRuleFullMatch struct { + ContextName string `mapstructure:"ContextName"` + Old string `mapstructure:"Old"` + New string `mapstructure:"New"` +} + +type Config struct { + FullMatchRules []ConfigRuleFullMatch `mapstructure:"FullMatchRules"` +} diff --git a/translator/translator.go b/translator/translator.go new file mode 100644 index 00000000..ae6e595b --- /dev/null +++ b/translator/translator.go @@ -0,0 +1,5 @@ +package translator + +type Translator interface { + Translate(contextName string, data string) string +} diff --git a/translator/translator_impl.go b/translator/translator_impl.go new file mode 100644 index 00000000..68a3f845 --- /dev/null +++ b/translator/translator_impl.go @@ -0,0 +1,71 @@ +package translator + +import "github.com/agglayer/aggkit/log" + +type TranslatorFullMatchRule struct { + // If null match any context + ContextName *string + // If null match any data + FullMatchString string + NewString string +} + +func (t *TranslatorFullMatchRule) Match(contextName string, data string) bool { + if t.ContextName != nil && *t.ContextName != contextName { + return false + } + return t.FullMatchString == data +} + +func (t *TranslatorFullMatchRule) Translate(contextName string, data string) string { + return t.NewString +} + +func NewTranslatorFullMatchRule( + contextName *string, fullMatchString string, newString string, +) *TranslatorFullMatchRule { + return &TranslatorFullMatchRule{ + ContextName: contextName, + FullMatchString: fullMatchString, + NewString: newString, + } +} + +type TranslatorImpl struct { + logger *log.Logger + FullMatchRules []TranslatorFullMatchRule +} + +func NewTranslatorImpl(logger *log.Logger) *TranslatorImpl { + return &TranslatorImpl{ + logger: logger, + FullMatchRules: []TranslatorFullMatchRule{}, + } +} + +func (t *TranslatorImpl) Translate(contextName string, data string) string { + for _, rule := range t.FullMatchRules { + if rule.Match(contextName, data) { + translated := rule.Translate(contextName, data) + t.logger.Debugf("Translated (ctxName=%s) %s to %s", contextName, data, translated) + return translated + } + } + return data +} + +func (t *TranslatorImpl) AddRule(rule TranslatorFullMatchRule) { + t.FullMatchRules = append(t.FullMatchRules, rule) +} + +func (t *TranslatorImpl) AddConfigRules(cfg Config) { + for _, v := range cfg.FullMatchRules { + var contextName *string + if v.ContextName != "" { + name := v.ContextName + contextName = &name + } + rule := NewTranslatorFullMatchRule(contextName, v.Old, v.New) + t.AddRule(*rule) + } +} diff --git a/tree/appendonlytree.go b/tree/appendonlytree.go new file mode 100644 index 00000000..9cfdd07c --- /dev/null +++ b/tree/appendonlytree.go @@ -0,0 +1,131 @@ +package tree + +import ( + "database/sql" + "errors" + "fmt" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" +) + +var ( + ErrInvalidIndex = errors.New("invalid index") +) + +// AppendOnlyTree is a tree where leaves are added sequentially (by index) +type AppendOnlyTree struct { + *Tree + lastLeftCache [types.DefaultHeight]common.Hash + lastIndex int64 +} + +// NewAppendOnlyTree creates a AppendOnlyTree +func NewAppendOnlyTree(db *sql.DB, dbPrefix string) *AppendOnlyTree { + t := newTree(db, dbPrefix) + return &AppendOnlyTree{ + Tree: t, + // -1 is used to indicate no leafs, 0 means the first leaf is added (at index 0) and so on. + // In order to differentiate the "cache not initialised" we need any value smaller than -1 + lastIndex: -2, + } +} + +func (t *AppendOnlyTree) AddLeaf(tx db.Txer, blockNum, blockPosition uint64, leaf types.Leaf) error { + if int64(leaf.Index) != t.lastIndex+1 { + // rebuild cache + if err := t.initCache(tx); err != nil { + return err + } + if int64(leaf.Index) != t.lastIndex+1 { + log.Errorf( + "mismatched index. Expected: %d, actual: %d", + t.lastIndex+1, leaf.Index, + ) + return ErrInvalidIndex + } + } + // Calculate new tree nodes + currentChildHash := leaf.Hash + newNodes := []types.TreeNode{} + for h := uint8(0); h < types.DefaultHeight; h++ { + var parent types.TreeNode + if leaf.Index&(1< 0 { + // Add child to the right + parent = newTreeNode(t.lastLeftCache[h], currentChildHash) + } else { + // Add child to the left + parent = newTreeNode(currentChildHash, t.zeroHashes[h]) + // Update cache + t.lastLeftCache[h] = currentChildHash + } + currentChildHash = parent.Hash + newNodes = append(newNodes, parent) + } + + // store root + if err := t.storeRoot(tx, types.Root{ + Hash: currentChildHash, + Index: leaf.Index, + BlockNum: blockNum, + BlockPosition: blockPosition, + }); err != nil { + return err + } + + // store nodes + if err := t.storeNodes(tx, newNodes); err != nil { + return err + } + t.lastIndex++ + tx.AddRollbackCallback(func() { + log.Debugf("decreasing index due to rollback") + t.lastIndex-- + }) + return nil +} + +func (t *AppendOnlyTree) initCache(tx db.Txer) error { + siblings := [types.DefaultHeight]common.Hash{} + lastRoot, err := t.getLastRootWithTx(tx) + if err != nil { + if errors.Is(err, db.ErrNotFound) { + t.lastIndex = -1 + t.lastLeftCache = siblings + return nil + } + return err + } + t.lastIndex = int64(lastRoot.Index) + currentNodeHash := lastRoot.Hash + index := t.lastIndex + // It starts in height-1 because 0 is the level of the leafs + for h := int(types.DefaultHeight - 1); h >= 0; h-- { + currentNode, err := t.getRHTNode(tx, currentNodeHash) + if err != nil { + return fmt.Errorf( + "error getting node %s from the RHT at height %d with root %s: %w", + currentNodeHash.Hex(), h, lastRoot.Hash.Hex(), err, + ) + } + if currentNode == nil { + return db.ErrNotFound + } + siblings[h] = currentNode.Left + if index&(1< 0 { + currentNodeHash = currentNode.Right + } else { + currentNodeHash = currentNode.Left + } + } + + // Reverse the siblings to go from leafs to root + for i, j := 0, len(siblings)-1; i == j; i, j = i+1, j-1 { + siblings[i], siblings[j] = siblings[j], siblings[i] + } + + t.lastLeftCache = siblings + return nil +} diff --git a/tree/migrations/migrations.go b/tree/migrations/migrations.go new file mode 100644 index 00000000..7bed50f6 --- /dev/null +++ b/tree/migrations/migrations.go @@ -0,0 +1,22 @@ +package migrations + +import ( + _ "embed" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/db/types" +) + +//go:embed tree0001.sql +var mig001 string + +var Migrations = []types.Migration{ + { + ID: "tree001", + SQL: mig001, + }, +} + +func RunMigrations(dbPath string) error { + return db.RunMigrations(dbPath, Migrations) +} diff --git a/tree/migrations/tree0001.sql b/tree/migrations/tree0001.sql new file mode 100644 index 00000000..f70d048e --- /dev/null +++ b/tree/migrations/tree0001.sql @@ -0,0 +1,17 @@ +-- +migrate Down +DROP TABLE IF EXISTS /*dbprefix*/root; +DROP TABLE IF EXISTS /*dbprefix*/rht; + +-- +migrate Up +CREATE TABLE /*dbprefix*/root ( + hash VARCHAR PRIMARY KEY, + position INTEGER NOT NULL, + block_num BIGINT NOT NULL, + block_position BIGINT NOT NULL +); + +CREATE TABLE /*dbprefix*/rht ( + hash VARCHAR PRIMARY KEY, + left VARCHAR NOT NULL, + right VARCHAR NOT NULL +); diff --git a/tree/testvectors/claim-vectors.json b/tree/testvectors/claim-vectors.json new file mode 100644 index 00000000..4778e9e4 --- /dev/null +++ b/tree/testvectors/claim-vectors.json @@ -0,0 +1,306 @@ +[ + { + "leafs": [ + { + "originNetwork": 0, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x", + "leafValue": "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5" + }, + { + "originNetwork": 1, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 0, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345670", + "leafValue": "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f" + }, + { + "originNetwork": 0, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345678", + "leafValue": "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d" + }, + { + "originNetwork": 10, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x01", + "destinationNetwork": 4, + "destinationAddress": "0x0000000000000000000000000000000000000000", + "metadata": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb922661234e51aad88F6F4ce6aB8827279cffFb92266", + "leafValue": "0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242" + } + ], + "index": 0, + "proof": [ + "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f", + "0xb48c8301099f75206bc93b1512c7b3855b60b4f8cbaedf8679a184d1d450a4f1", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", + "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", + "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", + "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", + "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "root": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + }, + { + "leafs": [ + { + "originNetwork": 0, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x", + "leafValue": "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5" + }, + { + "originNetwork": 1, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 0, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345670", + "leafValue": "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f" + }, + { + "originNetwork": 0, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345678", + "leafValue": "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d" + }, + { + "originNetwork": 10, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x01", + "destinationNetwork": 4, + "destinationAddress": "0x0000000000000000000000000000000000000000", + "metadata": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb922661234e51aad88F6F4ce6aB8827279cffFb92266", + "leafValue": "0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242" + } + ], + "index": 1, + "proof": [ + "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5", + "0xb48c8301099f75206bc93b1512c7b3855b60b4f8cbaedf8679a184d1d450a4f1", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", + "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", + "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", + "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", + "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "root": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + }, + { + "leafs": [ + { + "originNetwork": 0, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x", + "leafValue": "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5" + }, + { + "originNetwork": 1, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 0, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345670", + "leafValue": "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f" + }, + { + "originNetwork": 0, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345678", + "leafValue": "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d" + }, + { + "originNetwork": 10, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x01", + "destinationNetwork": 4, + "destinationAddress": "0x0000000000000000000000000000000000000000", + "metadata": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb922661234e51aad88F6F4ce6aB8827279cffFb92266", + "leafValue": "0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242" + } + ], + "index": 2, + "proof": [ + "0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242", + "0x653142d4a4d6f7985a3f33cad31e011dbee8909846b34c38c7b235ca08828521", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", + "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", + "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", + "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", + "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "root": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + }, + { + "leafs": [ + { + "originNetwork": 0, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x", + "leafValue": "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5" + }, + { + "originNetwork": 1, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 0, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345670", + "leafValue": "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f" + }, + { + "originNetwork": 0, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345678", + "leafValue": "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d" + }, + { + "originNetwork": 10, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x01", + "destinationNetwork": 4, + "destinationAddress": "0x0000000000000000000000000000000000000000", + "metadata": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb922661234e51aad88F6F4ce6aB8827279cffFb92266", + "leafValue": "0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242" + } + ], + "index": 3, + "proof": [ + "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d", + "0x653142d4a4d6f7985a3f33cad31e011dbee8909846b34c38c7b235ca08828521", + "0xb4c11951957c6f8f642c4af61cd6b24640fec6dc7fc607ee8206a99e92410d30", + "0x21ddb9a356815c3fac1026b6dec5df3124afbadb485c9ba5a3e3398a04b7ba85", + "0xe58769b32a1beaf1ea27375a44095a0d1fb664ce2dd358e7fcbfb78c26a19344", + "0x0eb01ebfc9ed27500cd4dfc979272d1f0913cc9f66540d7e8005811109e1cf2d", + "0x887c22bd8750d34016ac3c66b5ff102dacdd73f6b014e710b51e8022af9a1968", + "0xffd70157e48063fc33c97a050f7f640233bf646cc98d9524c6b92bcf3ab56f83", + "0x9867cc5f7f196b93bae1e27e6320742445d290f2263827498b54fec539f756af", + "0xcefad4e508c098b9a7e1d8feb19955fb02ba9675585078710969d3440f5054e0", + "0xf9dc3e7fe016e050eff260334f18a5d4fe391d82092319f5964f2e2eb7c1c3a5", + "0xf8b13a49e282f609c317a833fb8d976d11517c571d1221a265d25af778ecf892", + "0x3490c6ceeb450aecdc82e28293031d10c7d73bf85e57bf041a97360aa2c5d99c", + "0xc1df82d9c4b87413eae2ef048f94b4d3554cea73d92b0f7af96e0271c691e2bb", + "0x5c67add7c6caf302256adedf7ab114da0acfe870d449a3a489f781d659e8becc", + "0xda7bce9f4e8618b6bd2f4132ce798cdc7a60e7e1460a7299e3c6342a579626d2", + "0x2733e50f526ec2fa19a22b31e8ed50f23cd1fdf94c9154ed3a7609a2f1ff981f", + "0xe1d3b5c807b281e4683cc6d6315cf95b9ade8641defcb32372f1c126e398ef7a", + "0x5a2dce0a8a7f68bb74560f8f71837c2c2ebbcbf7fffb42ae1896f13f7c7479a0", + "0xb46a28b6f55540f89444f63de0378e3d121be09e06cc9ded1c20e65876d36aa0", + "0xc65e9645644786b620e2dd2ad648ddfcbf4a7e5b1a3a4ecfe7f64667a3f0b7e2", + "0xf4418588ed35a2458cffeb39b93d26f18d2ab13bdce6aee58e7b99359ec2dfd9", + "0x5a9c16dc00d6ef18b7933a6f8dc65ccb55667138776f7dea101070dc8796e377", + "0x4df84f40ae0c8229d0d6069e5c8f39a7c299677a09d367fc7b05e3bc380ee652", + "0xcdc72595f74c7b1043d0e1ffbab734648c838dfb0527d971b602bc216c9619ef", + "0x0abf5ac974a1ed57f4050aa510dd9c74f508277b39d7973bb2dfccc5eeb0618d", + "0xb8cd74046ff337f0a7bf2c8e03e10f642c1886798d71806ab1e888d9e5ee87d0", + "0x838c5655cb21c6cb83313b5a631175dff4963772cce9108188b34ac87c81c41e", + "0x662ee4dd2dd7b2bc707961b1e646c4047669dcb6584f0d8d770daf5d7e7deb2e", + "0x388ab20e2573d171a88108e79d820e98f26c0b84aa8b2f4aa4968dbb818ea322", + "0x93237c50ba75ee485f4c22adf2f741400bdf8d6a9cc7df7ecae576221665d735", + "0x8448818bb4ae4562849e949e17ac16e0be16688e156b5cf15e098c627c0056a9" + ], + "root": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + } +] \ No newline at end of file diff --git a/tree/testvectors/leaf-vectors.json b/tree/testvectors/leaf-vectors.json new file mode 100644 index 00000000..a0be0895 --- /dev/null +++ b/tree/testvectors/leaf-vectors.json @@ -0,0 +1,38 @@ +[ + { + "originNetwork": 0, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x", + "leafValue": "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5" + }, + { + "originNetwork": 1, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 0, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345670", + "leafValue": "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f" + }, + { + "originNetwork": 0, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "metadata": "0x12345678", + "leafValue": "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d" + }, + { + "originNetwork": 10, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x01", + "destinationNetwork": 4, + "destinationAddress": "0x0000000000000000000000000000000000000000", + "metadata": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb922661234e51aad88F6F4ce6aB8827279cffFb92266", + "leafValue": "0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242" + } +] \ No newline at end of file diff --git a/tree/testvectors/root-vectors.json b/tree/testvectors/root-vectors.json new file mode 100644 index 00000000..b1c6929c --- /dev/null +++ b/tree/testvectors/root-vectors.json @@ -0,0 +1,67 @@ +[ + { + "previousLeafsValues": [], + "currentRoot": "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", + "newLeaf": { + "originNetwork": 0, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "currentLeafValue": "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5", + "metadata": "0x" + }, + "newRoot": "0xbf7ddbb59aa018a4c74e061f5172973ff09e4cb7f58405af117fc521f1ca46aa" + }, + { + "previousLeafsValues": [ + "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5" + ], + "currentRoot": "0xbf7ddbb59aa018a4c74e061f5172973ff09e4cb7f58405af117fc521f1ca46aa", + "newLeaf": { + "originNetwork": 1, + "tokenAddress": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 0, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "currentLeafValue": "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f", + "metadata": "0x12345670" + }, + "newRoot": "0xa7042a3ce14f384bbff63f1cee6ee5579193c2d7002e0034854963322cda6128" + }, + { + "previousLeafsValues": [ + "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5", + "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f" + ], + "currentRoot": "0xa7042a3ce14f384bbff63f1cee6ee5579193c2d7002e0034854963322cda6128", + "newLeaf": { + "originNetwork": 0, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x8ac7230489e80000", + "destinationNetwork": 1, + "destinationAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "currentLeafValue": "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d", + "metadata": "0x12345678" + }, + "newRoot": "0x88e652896cb1de5962a0173a222059f51e6b943a2ba6dfc9acbff051ceb1abb5" + }, + { + "previousLeafsValues": [ + "0xa4bfa0908dc7b06d98da4309f859023d6947561bc19bc00d77f763dea1a0b9f5", + "0x315fee1aa202bf4a6bd0fde560c89be90b6e6e2aaf92dc5e8d118209abc3410f", + "0xb598ce65aa15c08dda126a2985ba54f0559eaac562bb43ba430c7344261fbc5d" + ], + "currentRoot": "0x88e652896cb1de5962a0173a222059f51e6b943a2ba6dfc9acbff051ceb1abb5", + "newLeaf": { + "originNetwork": 10, + "tokenAddress": "0x0000000000000000000000000000000000000000", + "amount": "0x01", + "destinationNetwork": 4, + "destinationAddress": "0x0000000000000000000000000000000000000000", + "currentLeafValue": "0xe6585bdf74b6a46b9ede8b1b877e1232fb79ee93106c4db8ffd49cf1685bf242", + "metadata": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb922661234e51aad88F6F4ce6aB8827279cffFb92266" + }, + "newRoot": "0x42d3339fe8eb57770953423f20a029e778a707e8d58aaf110b40d5eb4dd25721" + } +] \ No newline at end of file diff --git a/tree/testvectors/types.go b/tree/testvectors/types.go new file mode 100644 index 00000000..27bc1abb --- /dev/null +++ b/tree/testvectors/types.go @@ -0,0 +1,59 @@ +package testvectors + +import ( + "encoding/binary" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/iden3/go-iden3-crypto/keccak256" +) + +// DepositVectorRaw represents the deposit vector +type DepositVectorRaw struct { + OriginNetwork uint32 `json:"originNetwork"` + TokenAddress string `json:"tokenAddress"` + Amount string `json:"amount"` + DestinationNetwork uint32 `json:"destinationNetwork"` + DestinationAddress string `json:"destinationAddress"` + ExpectedHash string `json:"leafValue"` + CurrentHash string `json:"currentLeafValue"` + Metadata string `json:"metadata"` +} + +func (d *DepositVectorRaw) Hash() common.Hash { + origNet := make([]byte, 4) //nolint:mnd + binary.BigEndian.PutUint32(origNet, d.OriginNetwork) + destNet := make([]byte, 4) //nolint:mnd + binary.BigEndian.PutUint32(destNet, d.DestinationNetwork) + + metaHash := keccak256.Hash(common.FromHex(d.Metadata)) + var buf [32]byte + amount, _ := big.NewInt(0).SetString(d.Amount, 0) + origAddrBytes := common.HexToAddress(d.TokenAddress) + destAddrBytes := common.HexToAddress(d.DestinationAddress) + return common.BytesToHash(keccak256.Hash( + []byte{0}, // LeafType + origNet, + origAddrBytes[:], + destNet, + destAddrBytes[:], + amount.FillBytes(buf[:]), + metaHash, + )) +} + +// MTClaimVectorRaw represents the merkle proof +type MTClaimVectorRaw struct { + Deposits []DepositVectorRaw `json:"leafs"` + Index uint32 `json:"index"` + MerkleProof []string `json:"proof"` + ExpectedRoot string `json:"root"` +} + +// MTRootVectorRaw represents the root of Merkle Tree +type MTRootVectorRaw struct { + ExistingLeaves []string `json:"previousLeafsValues"` + CurrentRoot string `json:"currentRoot"` + NewLeaf DepositVectorRaw `json:"newLeaf"` + NewRoot string `json:"newRoot"` +} diff --git a/tree/tree.go b/tree/tree.go new file mode 100644 index 00000000..3844ec2e --- /dev/null +++ b/tree/tree.go @@ -0,0 +1,273 @@ +package tree + +import ( + "context" + "database/sql" + "errors" + "fmt" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/russross/meddler" + "golang.org/x/crypto/sha3" +) + +var ( + EmptyProof = types.Proof{} +) + +type Tree struct { + db *sql.DB + zeroHashes []common.Hash + rhtTable string + rootTable string +} + +func newTreeNode(left, right common.Hash) types.TreeNode { + var hash common.Hash + hasher := sha3.NewLegacyKeccak256() + hasher.Write(left[:]) + hasher.Write(right[:]) + copy(hash[:], hasher.Sum(nil)) + return types.TreeNode{ + Hash: hash, + Left: left, + Right: right, + } +} + +func newTree(db *sql.DB, tablePrefix string) *Tree { + t := &Tree{ + db: db, + zeroHashes: generateZeroHashes(types.DefaultHeight), + rhtTable: tablePrefix + "rht", + rootTable: tablePrefix + "root", + } + + return t +} + +func (t *Tree) getSiblings(tx db.Querier, index uint32, root common.Hash) ( + siblings types.Proof, + hasUsedZeroHashes bool, + err error, +) { + currentNodeHash := root + // It starts in height-1 because 0 is the level of the leafs + for h := int(types.DefaultHeight - 1); h >= 0; h-- { + var currentNode *types.TreeNode + currentNode, err = t.getRHTNode(tx, currentNodeHash) + if err != nil { + if errors.Is(err, db.ErrNotFound) { + hasUsedZeroHashes = true + siblings[h] = t.zeroHashes[h] + err = nil + continue + } else { + err = fmt.Errorf( + "height: %d, currentNode: %s, error: %w", + h, currentNodeHash.Hex(), err, + ) + return + } + } + /* + * Root (level h=3 => height=4) + * / \ + * O5 O6 (level h=2) + * / \ / \ + * O1 O2 O3 O4 (level h=1) + * /\ /\ /\ /\ + * 0 1 2 3 4 5 6 7 Leafs (level h=0) + * Example 1: + * Choose index = 3 => 011 binary + * Assuming we are in level 1 => h=1; 1< 011&010=010 which is higher than 0 so we need the left sibling (O1) + * Example 2: + * Choose index = 4 => 100 binary + * Assuming we are in level 1 => h=1; 1< 100&010=000 which is not higher than 0 so we need the right sibling (O4) + * Example 3: + * Choose index = 4 => 100 binary + * Assuming we are in level 2 => h=2; 1< 100&100=100 which is higher than 0 so we need the left sibling (O5) + */ + if index&(1< 0 { + siblings[h] = currentNode.Left + currentNodeHash = currentNode.Right + } else { + siblings[h] = currentNode.Right + currentNodeHash = currentNode.Left + } + } + + return +} + +// GetProof returns the merkle proof for a given index and root. +func (t *Tree) GetProof(ctx context.Context, index uint32, root common.Hash) (types.Proof, error) { + siblings, isErrNotFound, err := t.getSiblings(t.db, index, root) + if err != nil { + return types.Proof{}, err + } + if isErrNotFound { + // TODO: Validate it. It returns a proof of a tree with missing leafs + log.Warnf("getSiblings returned proof with zero hashes for index %d and root %s", index, root.String()) + } + return siblings, nil +} + +func (t *Tree) getRHTNode(tx db.Querier, nodeHash common.Hash) (*types.TreeNode, error) { + node := &types.TreeNode{} + err := meddler.QueryRow( + tx, node, + fmt.Sprintf(`SELECT * FROM %s WHERE hash = $1`, t.rhtTable), + nodeHash.String(), + ) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return node, db.ErrNotFound + } + return node, err + } + return node, err +} + +func generateZeroHashes(height uint8) []common.Hash { + var zeroHashes = []common.Hash{ + {}, + } + // This generates a leaf = HashZero in position 0. In the rest of the positions that are + // equivalent to the ascending levels, we set the hashes of the nodes. + // So all nodes from level i=5 will have the same value and same children nodes. + for i := 1; i <= int(height); i++ { + hasher := sha3.NewLegacyKeccak256() + hasher.Write(zeroHashes[i-1][:]) + hasher.Write(zeroHashes[i-1][:]) + thisHeightHash := common.Hash{} + copy(thisHeightHash[:], hasher.Sum(nil)) + zeroHashes = append(zeroHashes, thisHeightHash) + } + return zeroHashes +} + +func (t *Tree) storeNodes(tx db.Txer, nodes []types.TreeNode) error { + for i := 0; i < len(nodes); i++ { + if err := meddler.Insert(tx, t.rhtTable, &nodes[i]); err != nil { + if sqliteErr, ok := db.SQLiteErr(err); ok { + if sqliteErr.ExtendedCode == db.UniqueConstrain { + // ignore repeated entries. This is likely to happen due to not + // cleaning RHT when reorg + continue + } + } + return err + } + } + return nil +} + +func (t *Tree) storeRoot(tx db.Txer, root types.Root) error { + return meddler.Insert(tx, t.rootTable, &root) +} + +// GetLastRoot returns the last processed root +func (t *Tree) GetLastRoot(tx db.Querier) (types.Root, error) { + if tx == nil { + tx = t.db + } + return t.getLastRootWithTx(tx) +} + +func (t *Tree) getLastRootWithTx(tx db.Querier) (types.Root, error) { + var root types.Root + err := meddler.QueryRow( + tx, &root, + fmt.Sprintf(`SELECT * FROM %s ORDER BY block_num DESC, block_position DESC LIMIT 1;`, t.rootTable), + ) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + return root, db.ErrNotFound + } + return root, err + } + return root, nil +} + +// GetRootByIndex returns the root associated to the index +func (t *Tree) GetRootByIndex(ctx context.Context, index uint32) (types.Root, error) { + var root types.Root + if err := meddler.QueryRow( + t.db, &root, + fmt.Sprintf(`SELECT * FROM %s WHERE position = $1;`, t.rootTable), + index, + ); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return root, db.ErrNotFound + } + return root, err + } + return root, nil +} + +// GetRootByHash returns the root associated to the hash +func (t *Tree) GetRootByHash(ctx context.Context, hash common.Hash) (*types.Root, error) { + var root types.Root + if err := meddler.QueryRow( + t.db, &root, + fmt.Sprintf(`SELECT * FROM %s WHERE hash = $1;`, t.rootTable), + hash.Hex(), + ); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return nil, db.ErrNotFound + } + return nil, err + } + + return &root, nil +} + +func (t *Tree) GetLeaf(tx db.Querier, index uint32, root common.Hash) (common.Hash, error) { + currentNodeHash := root + for h := int(types.DefaultHeight - 1); h >= 0; h-- { + currentNode, err := t.getRHTNode(tx, currentNodeHash) + if err != nil { + return common.Hash{}, err + } + if index&(1< 0 { + currentNodeHash = currentNode.Right + } else { + currentNodeHash = currentNode.Left + } + } + + return currentNodeHash, nil +} + +// Reorg deletes all the data relevant from firstReorgedBlock (includded) and onwards +func (t *Tree) Reorg(tx db.Txer, firstReorgedBlock uint64) error { + _, err := tx.Exec( + fmt.Sprintf(`DELETE FROM %s WHERE block_num >= $1`, t.rootTable), + firstReorgedBlock, + ) + return err +} + +// CalculateRoot calculates the Merkle Root based on the leaf and proof of inclusion +func CalculateRoot(leafHash common.Hash, proof [types.DefaultHeight]common.Hash, index uint32) common.Hash { + node := leafHash + + // Compute the Merkle root + for height := uint8(0); height < types.DefaultHeight; height++ { + if (index>>height)&1 == 1 { + node = crypto.Keccak256Hash(proof[height].Bytes(), node.Bytes()) + } else { + node = crypto.Keccak256Hash(node.Bytes(), proof[height].Bytes()) + } + } + + return node +} diff --git a/tree/tree_test.go b/tree/tree_test.go new file mode 100644 index 00000000..bca78654 --- /dev/null +++ b/tree/tree_test.go @@ -0,0 +1,210 @@ +package tree_test + +import ( + "context" + "database/sql" + "encoding/json" + "fmt" + "os" + "path" + "testing" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/log" + "github.com/agglayer/aggkit/tree" + "github.com/agglayer/aggkit/tree/migrations" + "github.com/agglayer/aggkit/tree/testvectors" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestCheckExpectedRoot(t *testing.T) { + createTreeDB := func() *sql.DB { + dbPath := path.Join(t.TempDir(), "treeTestCheckExpectedRoot.sqlite") + log.Debug("DB created at: ", dbPath) + require.NoError(t, migrations.RunMigrations(dbPath)) + treeDB, err := db.NewSQLiteDB(dbPath) + require.NoError(t, err) + + return treeDB + } + + addLeaves := func(merkletree *tree.AppendOnlyTree, + treeDB *sql.DB, + numOfLeavesToAdd, from int) { + tx, err := db.NewTx(context.Background(), treeDB) + require.NoError(t, err) + + for i := from; i < from+numOfLeavesToAdd; i++ { + require.NoError(t, merkletree.AddLeaf(tx, uint64(i), 0, types.Leaf{ + Index: uint32(i), + Hash: common.HexToHash(fmt.Sprintf("%x", i)), + })) + } + + require.NoError(t, tx.Commit()) + } + + t.Run("Check when no reorg", func(t *testing.T) { + numOfLeavesToAdd := 10 + indexToCheck := uint32(numOfLeavesToAdd - 1) + + treeDB := createTreeDB() + merkleTree := tree.NewAppendOnlyTree(treeDB, "") + + addLeaves(merkleTree, treeDB, numOfLeavesToAdd, 0) + + expectedRoot, err := merkleTree.GetLastRoot(nil) + require.NoError(t, err) + + addLeaves(merkleTree, treeDB, numOfLeavesToAdd, numOfLeavesToAdd) + + root2, err := merkleTree.GetRootByIndex(context.Background(), indexToCheck) + require.NoError(t, err) + require.Equal(t, expectedRoot.Hash, root2.Hash) + require.Equal(t, expectedRoot.Index, root2.Index) + }) + + t.Run("Check after rebuild tree when reorg", func(t *testing.T) { + numOfLeavesToAdd := 10 + indexToCheck := uint32(numOfLeavesToAdd - 1) + treeDB := createTreeDB() + merkleTree := tree.NewAppendOnlyTree(treeDB, "") + + addLeaves(merkleTree, treeDB, numOfLeavesToAdd, 0) + + expectedRoot, err := merkleTree.GetLastRoot(nil) + require.NoError(t, err) + + addLeaves(merkleTree, treeDB, numOfLeavesToAdd, numOfLeavesToAdd) + + // reorg tree + tx, err := db.NewTx(context.Background(), treeDB) + require.NoError(t, err) + require.NoError(t, merkleTree.Reorg(tx, uint64(indexToCheck+1))) + require.NoError(t, tx.Commit()) + + // rebuild cache on adding new leaf + tx, err = db.NewTx(context.Background(), treeDB) + require.NoError(t, err) + require.NoError(t, merkleTree.AddLeaf(tx, uint64(indexToCheck+1), 0, types.Leaf{ + Index: indexToCheck + 1, + Hash: common.HexToHash(fmt.Sprintf("%x", indexToCheck+1)), + })) + require.NoError(t, tx.Commit()) + + root2, err := merkleTree.GetRootByIndex(context.Background(), indexToCheck) + require.NoError(t, err) + require.Equal(t, expectedRoot.Hash, root2.Hash) + require.Equal(t, expectedRoot.Index, root2.Index) + }) +} + +func TestMTAddLeaf(t *testing.T) { + data, err := os.ReadFile("testvectors/root-vectors.json") + require.NoError(t, err) + + var mtTestVectors []testvectors.MTRootVectorRaw + err = json.Unmarshal(data, &mtTestVectors) + require.NoError(t, err) + ctx := context.Background() + + for ti, testVector := range mtTestVectors { + t.Run(fmt.Sprintf("Test vector %d", ti), func(t *testing.T) { + dbPath := path.Join(t.TempDir(), "treeTestMTAddLeaf.sqlite") + log.Debug("DB created at: ", dbPath) + err := migrations.RunMigrations(dbPath) + require.NoError(t, err) + treeDB, err := db.NewSQLiteDB(dbPath) + require.NoError(t, err) + _, err = treeDB.Exec(`select * from root`) + require.NoError(t, err) + merkletree := tree.NewAppendOnlyTree(treeDB, "") + + // Add exisiting leaves + tx, err := db.NewTx(ctx, treeDB) + require.NoError(t, err) + for i, leaf := range testVector.ExistingLeaves { + err = merkletree.AddLeaf(tx, uint64(i), 0, types.Leaf{ + Index: uint32(i), + Hash: common.HexToHash(leaf), + }) + require.NoError(t, err) + } + require.NoError(t, tx.Commit()) + if len(testVector.ExistingLeaves) > 0 { + root, err := merkletree.GetLastRoot(nil) + require.NoError(t, err) + require.Equal(t, common.HexToHash(testVector.CurrentRoot), root.Hash) + } + + // Add new bridge + tx, err = db.NewTx(ctx, treeDB) + require.NoError(t, err) + err = merkletree.AddLeaf(tx, uint64(len(testVector.ExistingLeaves)), 0, types.Leaf{ + Index: uint32(len(testVector.ExistingLeaves)), + Hash: common.HexToHash(testVector.NewLeaf.CurrentHash), + }) + require.NoError(t, err) + require.NoError(t, tx.Commit()) + + root, err := merkletree.GetLastRoot(nil) + require.NoError(t, err) + require.Equal(t, common.HexToHash(testVector.NewRoot), root.Hash) + }) + } +} + +func TestMTGetProof(t *testing.T) { + data, err := os.ReadFile("testvectors/claim-vectors.json") + require.NoError(t, err) + + var mtTestVectors []testvectors.MTClaimVectorRaw + err = json.Unmarshal(data, &mtTestVectors) + require.NoError(t, err) + ctx := context.Background() + + for ti, testVector := range mtTestVectors { + t.Run(fmt.Sprintf("Test vector %d", ti), func(t *testing.T) { + dbPath := path.Join(t.TempDir(), "treeTestMTGetProof.sqlite") + err := migrations.RunMigrations(dbPath) + require.NoError(t, err) + treeDB, err := db.NewSQLiteDB(dbPath) + require.NoError(t, err) + tre := tree.NewAppendOnlyTree(treeDB, "") + + tx, err := db.NewTx(ctx, treeDB) + require.NoError(t, err) + for li, leaf := range testVector.Deposits { + err = tre.AddLeaf(tx, uint64(li), 0, types.Leaf{ + Index: uint32(li), + Hash: leaf.Hash(), + }) + require.NoError(t, err) + } + require.NoError(t, tx.Commit()) + + root, err := tre.GetLastRoot(nil) + require.NoError(t, err) + expectedRoot := common.HexToHash(testVector.ExpectedRoot) + require.Equal(t, expectedRoot, root.Hash) + + proof, err := tre.GetProof(ctx, testVector.Index, expectedRoot) + require.NoError(t, err) + for i, sibling := range testVector.MerkleProof { + require.Equal(t, common.HexToHash(sibling), proof[i]) + } + }) + } +} + +func createTreeDBForTest(t *testing.T) *sql.DB { + t.Helper() + dbPath := path.Join(t.TempDir(), "tree_createTreeDBForTest.sqlite") + err := migrations.RunMigrations(dbPath) + require.NoError(t, err) + treeDB, err := db.NewSQLiteDB(dbPath) + require.NoError(t, err) + return treeDB +} diff --git a/tree/types/types.go b/tree/types/types.go new file mode 100644 index 00000000..bb117342 --- /dev/null +++ b/tree/types/types.go @@ -0,0 +1,27 @@ +package types + +import "github.com/ethereum/go-ethereum/common" + +const ( + DefaultHeight uint8 = 32 +) + +type Leaf struct { + Index uint32 + Hash common.Hash +} + +type Root struct { + Hash common.Hash `meddler:"hash,hash"` + Index uint32 `meddler:"position"` + BlockNum uint64 `meddler:"block_num"` + BlockPosition uint64 `meddler:"block_position"` +} + +type TreeNode struct { + Hash common.Hash `meddler:"hash,hash"` + Left common.Hash `meddler:"left,hash"` + Right common.Hash `meddler:"right,hash"` +} + +type Proof [DefaultHeight]common.Hash diff --git a/tree/updatabletree.go b/tree/updatabletree.go new file mode 100644 index 00000000..222cc9a1 --- /dev/null +++ b/tree/updatabletree.go @@ -0,0 +1,68 @@ +package tree + +import ( + "database/sql" + "errors" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" +) + +// UpdatableTree is a tree that have updatable leaves, and doesn't need to have sequential inserts +type UpdatableTree struct { + *Tree +} + +// NewUpdatableTree returns an UpdatableTree +func NewUpdatableTree(db *sql.DB, dbPrefix string) *UpdatableTree { + t := newTree(db, dbPrefix) + ut := &UpdatableTree{ + Tree: t, + } + return ut +} + +func (t *UpdatableTree) UpsertLeaf(tx db.Txer, blockNum, blockPosition uint64, leaf types.Leaf) (common.Hash, error) { + var rootHash common.Hash + root, err := t.getLastRootWithTx(tx) + if err != nil { + if errors.Is(err, db.ErrNotFound) { + rootHash = t.zeroHashes[types.DefaultHeight] + } else { + return common.Hash{}, err + } + } else { + rootHash = root.Hash + } + siblings, _, err := t.getSiblings(tx, leaf.Index, rootHash) + if err != nil { + return common.Hash{}, err + } + currentChildHash := leaf.Hash + newNodes := []types.TreeNode{} + for h := uint8(0); h < types.DefaultHeight; h++ { + var parent types.TreeNode + if leaf.Index&(1< 0 { + // Add child to the right + parent = newTreeNode(siblings[h], currentChildHash) + } else { + // Add child to the left + parent = newTreeNode(currentChildHash, siblings[h]) + } + currentChildHash = parent.Hash + newNodes = append(newNodes, parent) + } + if err := t.storeRoot(tx, types.Root{ + Hash: currentChildHash, + Index: leaf.Index, + BlockNum: blockNum, + BlockPosition: blockPosition, + }); err != nil { + return common.Hash{}, err + } + if err := t.storeNodes(tx, newNodes); err != nil { + return common.Hash{}, err + } + return currentChildHash, nil +} diff --git a/tree/updatabletree_test.go b/tree/updatabletree_test.go new file mode 100644 index 00000000..6696c942 --- /dev/null +++ b/tree/updatabletree_test.go @@ -0,0 +1,49 @@ +package tree_test + +import ( + "context" + "testing" + + "github.com/agglayer/aggkit/db" + "github.com/agglayer/aggkit/tree" + "github.com/agglayer/aggkit/tree/types" + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" +) + +func TestUpdatableTreeExploratory(t *testing.T) { + treeDB := createTreeDBForTest(t) + sut := tree.NewUpdatableTree(treeDB, "") + blockNum := uint64(1) + blockPosition := uint64(1) + leaf1 := types.Leaf{ + Index: 10, + Hash: common.HexToHash("0x123456"), + } + leaf2 := types.Leaf{ + Index: 1, + Hash: common.HexToHash("0x123478"), + } + ctx := context.TODO() + + tx, err := db.NewTx(ctx, treeDB) + require.NoError(t, err) + _, err = sut.UpsertLeaf(tx, blockNum, blockPosition, leaf1) + require.NoError(t, err) + + root2, err := sut.UpsertLeaf(tx, blockNum, blockPosition, leaf2) + require.NoError(t, err) + leaf1get, err := sut.GetLeaf(tx, leaf1.Index, root2) + require.NoError(t, err) + require.Equal(t, leaf1.Hash, leaf1get) + // If a leaf dont exist return 'not found' error + _, err = sut.GetLeaf(tx, 99, root2) + require.ErrorIs(t, err, db.ErrNotFound) + leaf99 := types.Leaf{ + Index: 99, + Hash: common.Hash{}, // 0x00000 + } + + _, err = sut.UpsertLeaf(tx, blockNum, blockPosition, leaf99) + require.Error(t, err, "insert 0x000 doesnt change root and return UNIQUE constraint failed: root.hash") +} diff --git a/version.go b/version.go new file mode 100644 index 00000000..e52f56eb --- /dev/null +++ b/version.go @@ -0,0 +1,54 @@ +package aggkit + +import ( + "fmt" + "io" + "runtime" +) + +// Populated during build, don't touch! +var ( + Version = "v0.1.0" + GitRev = "undefined" + GitBranch = "undefined" + BuildDate = "Fri, 17 Jun 1988 01:58:00 +0200" +) + +// PrintVersion prints version info into the provided io.Writer. +func PrintVersion(w io.Writer) { + data := GetVersion() + fmt.Fprintf(w, "%s", data.String()) +} + +type FullVersion struct { + Version string + GitRev string + GitBranch string + BuildDate string + GoVersion string + OS string + Arch string +} + +func GetVersion() FullVersion { + return FullVersion{ + Version: Version, + GitRev: GitRev, + GitBranch: GitBranch, + BuildDate: BuildDate, + GoVersion: runtime.Version(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, + } +} + +func (f FullVersion) String() string { + return fmt.Sprintf("Version: %s\n"+ + "Git revision: %s\n"+ + "Git branch: %s\n"+ + "Go version: %s\n"+ + "Built: %s\n"+ + "OS/Arch: %s/%s\n", + f.Version, f.GitRev, f.GitBranch, + f.GoVersion, f.BuildDate, f.OS, f.Arch) +} diff --git a/version.mk b/version.mk new file mode 100644 index 00000000..73db3b01 --- /dev/null +++ b/version.mk @@ -0,0 +1,4 @@ +VERSION := $(shell git describe --tags --always) +GITREV := $(shell git rev-parse --short HEAD) +GITBRANCH := $(shell git rev-parse --abbrev-ref HEAD) +DATE := $(shell LANG=US date +"%a, %d %b %Y %X %z") diff --git a/version_test.go b/version_test.go new file mode 100644 index 00000000..efbf1448 --- /dev/null +++ b/version_test.go @@ -0,0 +1,39 @@ +package aggkit + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGetVersion(t *testing.T) { + data := GetVersion() + require.NotEmpty(t, data.Version) + require.NotEmpty(t, data.GitRev) + require.NotEmpty(t, data.GitBranch) + require.NotEmpty(t, data.BuildDate) + require.NotEmpty(t, data.GoVersion) + require.NotEmpty(t, data.OS) + require.NotEmpty(t, data.Arch) +} + +func TestString(t *testing.T) { + data := FullVersion{ + Version: "v0.1.0", + GitRev: "undefined", + GitBranch: "undefined", + BuildDate: "Fri, 17 Jun 1988 01:58:00 +0200", + GoVersion: "go1.16.3", + OS: "linux", + Arch: "amd64", + } + fmt.Printf("%s", data.String()) + require.Equal(t, `Version: v0.1.0 +Git revision: undefined +Git branch: undefined +Go version: go1.16.3 +Built: Fri, 17 Jun 1988 01:58:00 +0200 +OS/Arch: linux/amd64 +`, data.String()) +}